diff --git a/build.gradle.kts b/build.gradle.kts index d1c487706..5420b9d2c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,7 +13,7 @@ plugins { } group = "de.chojo" -version = "2.7.0" +version = "2.8.0" repositories { mavenLocal() diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 6795707cd..c09d1aa2e 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -647,6 +647,14 @@ class ApiClient { await this.axiosInstance.patch('/user/settings', settings); } + public async updateUserVoteGuild(voteGuild: string): Promise { + await this.axiosInstance.patch('/user/settings/voteguild', { voteGuild: Number(voteGuild) }); + } + + public async updateUserPublicProfile(publicProfile: boolean): Promise { + await this.axiosInstance.patch('/user/settings/publicprofile', { publicProfile }); + } + // User Purchases (Ko-fi) public async getUserPurchases(): Promise { const response = await this.axiosInstance.get('/user/purchases'); @@ -788,6 +796,55 @@ class ApiClient { return response.data; } + // User Profile + public async getUserProfileMe(): Promise { + const response = await this.axiosInstance.get('/guild/user/profile/me'); + return response.data; + } + + public async getUserProfile(userId: string): Promise { + const response = await this.axiosInstance.get(`/guild/user/profile/${userId}`); + return response.data; + } + + // Public Profile (unauthenticated) + public async getPublicProfile(guildId: string, userId: string): Promise { + const response = await this.axiosInstance.get('/public/profile', { + params: { guildId, userId } + }); + return response.data; + } + + // Guild Ranking + public async getGuildRankingGiven(page: number = 0, pageSize: number = 10, mode?: Types.ReputationMode): Promise { + const response = await this.axiosInstance.get('/guild/ranking/given', { + params: { page, pageSize, ...(mode !== undefined && { mode }) } + }); + return response.data; + } + + public async getGuildRankingReceived(page: number = 0, pageSize: number = 10, mode?: Types.ReputationMode): Promise { + const response = await this.axiosInstance.get('/guild/ranking/received', { + params: { page, pageSize, ...(mode !== undefined && { mode }) } + }); + return response.data; + } + + // User Ranking + public async getUserRankingGiven(page: number = 0, pageSize: number = 10, mode?: Types.ReputationMode, userId?: string): Promise { + const response = await this.axiosInstance.get('/guild/user/ranking/given', { + params: { page, pageSize, ...(mode !== undefined && { mode }), ...(userId !== undefined && { userId }) } + }); + return response.data; + } + + public async getUserRankingReceived(page: number = 0, pageSize: number = 10, mode?: Types.ReputationMode, userId?: string): Promise { + const response = await this.axiosInstance.get('/guild/user/ranking/received', { + params: { page, pageSize, ...(mode !== undefined && { mode }), ...(userId !== undefined && { userId }) } + }); + return response.data; + } + public async startScan(): Promise { await this.axiosInstance.post('/guild/scan/start'); } diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts index 8092d1a5a..7f62c0edc 100644 --- a/frontend/src/api/types.ts +++ b/frontend/src/api/types.ts @@ -576,8 +576,58 @@ export interface DashboardStatsPOJO { topUsers: RankingEntryPOJO[] } +export interface RankingPagePOJO { + pages: number; + page: number; + entries: RankingEntryPOJO[]; +} + +export interface RankingEntryStatPOJO { + rank: number; + value: number; + member: MemberPOJO; +} + +export interface ChannelStatsPOJO { + channelId: string; + count: number; +} + +export interface DetailedProfilePOJO { + topDonors: RankingEntryStatPOJO[]; + topReceivers: RankingEntryStatPOJO[]; + mostGivenChannels: ChannelStatsPOJO[]; + mostReceivedChannels: ChannelStatsPOJO[]; +} + +export interface AdminProfilePOJO { + rawReputation: number; + repOffset: number; + donated: number; +} + +export interface UserProfilePOJO { + member: MemberPOJO; + rank: number; + rankDonated: number; + reputation: number; + donated: number; + level: string | null; + currentProgress: number; + nextLevelReputation: number | null; + detailedProfile: DetailedProfilePOJO | null; + adminProfile: AdminProfilePOJO | null; +} + +export interface PublicProfilePOJO { + member: MemberPOJO; + rank: number; + reputation: number; +} + export interface UserSettingsPOJO { voteGuild: string; + publicProfile: boolean; } export interface SKUId { diff --git a/frontend/src/components/PremiumFeatureWarning.vue b/frontend/src/components/PremiumFeatureWarning.vue index 29b221beb..557a6a166 100644 --- a/frontend/src/components/PremiumFeatureWarning.vue +++ b/frontend/src/components/PremiumFeatureWarning.vue @@ -67,6 +67,7 @@ const displayMessage = computed(() => {
  • {{ sku.name }}
  • +

    {{ t('premiumFeature.perServer') }}

    {{ t('premiumFeature.tokenShopHint') }} @@ -93,6 +94,7 @@ const displayMessage = computed(() => {

    • {{ sku.name }}
    +

    {{ t('premiumFeature.perServer') }}

    {{ t('premiumFeature.tokenShopHint') }} diff --git a/frontend/src/components/SettingsHeader.vue b/frontend/src/components/SettingsHeader.vue index 722cd5bfa..eb6b62c2a 100644 --- a/frontend/src/components/SettingsHeader.vue +++ b/frontend/src/components/SettingsHeader.vue @@ -9,6 +9,8 @@ import {useI18n} from 'vue-i18n' import {onMounted, ref, watch} from 'vue' import {api} from '@/api' import {useSession} from '@/composables/useSession' +import SubHeader from '@/components/SubHeader.vue' +import SubHeaderTab from '@/components/SubHeaderTab.vue' const {t} = useI18n() const {userSession} = useSession() @@ -45,59 +47,35 @@ watch(userSession, checkProblems) diff --git a/frontend/src/components/SubHeader.vue b/frontend/src/components/SubHeader.vue new file mode 100644 index 000000000..72891e8f0 --- /dev/null +++ b/frontend/src/components/SubHeader.vue @@ -0,0 +1,14 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + diff --git a/frontend/src/components/SubHeaderTab.vue b/frontend/src/components/SubHeaderTab.vue new file mode 100644 index 000000000..97cb98c53 --- /dev/null +++ b/frontend/src/components/SubHeaderTab.vue @@ -0,0 +1,42 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + diff --git a/frontend/src/locales/cs.json b/frontend/src/locales/cs.json index abe6d3452..e5561bd26 100644 --- a/frontend/src/locales/cs.json +++ b/frontend/src/locales/cs.json @@ -216,8 +216,48 @@ "save": "Uložit" }, "dashboard": { + "profile": "Profil", + "profileView": { + "detailedProfile": "Podrobný profil", + "error": "Nepodařilo se načíst profil.", + "given": "Vzhledem k tomu, že", + "maxLevel": "Byla dosažena maximální úroveň", + "mostGivenChannels": "Nejčastěji sledované kanály", + "mostReceivedChannels": "Nejčastěji sledované kanály", + "progress": "Postup na další úroveň", + "rank": "Hodnocení: {rank}", + "rankGiven": "Pořadí (zadané)", + "rankReceived": "Pořadí (obdržených)", + "rawReputation": "Raw Reputation", + "received": "Přijato", + "repOffset": "Kompenzace reputace", + "shareProfile": "Sdílet", + "shareProfileCopied": "Odkaz byl zkopírován do schránky!", + "topDonors": "Největší dárci", + "topReceivers": "Nejlepší přijímače" + }, + "publicProfileView": { + "error": "Nepodařilo se načíst profil.", + "guildFooter": "Profil na {guild}", + "privateProfile": "Tento profil je soukromý.", + "rank": "Pořadí", + "reputation": "Pověst" + }, "rank": "Hodnost", + "ranking": "Žebříček", + "rankingView": { + "advancedRankings": "Pokročilé žebříčky", + "given": "Vzhledem k tomu, že", + "mode": "Režim", + "pageSize": "Velikost stránky", + "received": "Přijato" + }, "reputation": "Reputace", + "tabs": { + "overview": "Přehled", + "profile": "Profil", + "ranking": "Žebříček" + }, "title": "Přístrojová deska", "todayReputation": "Dnešní reputace", "topChannel": "Nejlepší kanál", @@ -676,6 +716,7 @@ "kofiHint": "nebo nás podpořte na", "kofiLink": "Ko-fi", "message": "{name} je vyhrazeno pro příznivce. Staňte se příznivcem a můžete jej používat.", + "perServer": "Funkce se odemykají pro jednotlivé servery.", "requiredTierPlural": "Je vyžadována jedna z následujících úrovní podpory:", "requiredTierSingular": "Požadovaná úroveň podpory:", "title": "Funkce pro příznivce", @@ -1034,6 +1075,7 @@ "noFeatures": "V současné době nejsou k dispozici žádné funkce.", "purchase": "Nákup", "purchaseSuccess": "Funkce byla úspěšně zakoupena!", + "requiredTiers": "Úrovně podpory", "subscribe": "Přihlásit se k odběru", "subscribeSuccess": "Předplatné aktivováno!", "subscriptionActiveNote": "Tato funkce je v současné době aktivována aktivním předplatným.", @@ -1075,6 +1117,10 @@ "success": "Váš e-mail byl úspěšně ověřen." } }, + "publicProfile": { + "description": "Umožnit ostatním uživatelům zobrazit váš profil reputace, i když s vámi nesdílejí stejný server.", + "label": "Veřejný profil" + }, "title": "Nastavení uživatele", "voteGuild": { "description": "Vyberte, která gilda by měla dostat žetony, když hlasujete pro bota. To bude mít vliv pouze na budoucí hlasování.", diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 1f176d6e3..cc8b88cb9 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -216,8 +216,48 @@ "save": "Speichern" }, "dashboard": { + "profile": "Profil", + "profileView": { + "detailedProfile": "Ausführliches Profil", + "error": "Das Profil konnte nicht geladen werden.", + "given": "Angesichts", + "maxLevel": "Maximale Stufe erreicht", + "mostGivenChannels": "Die meistgesendeten Kanäle", + "mostReceivedChannels": "Die meistgesehenen Sender", + "progress": "Weiter zum nächsten Level", + "rank": "Rang: {rank}", + "rankGiven": "Rang (vorgegeben)", + "rankReceived": "Rang (erhalten)", + "rawReputation": "Raw Reputation", + "received": "Erhalten", + "repOffset": "Reputationsausgleich", + "shareProfile": "Teilen", + "shareProfileCopied": "Link in die Zwischenablage kopiert!", + "topDonors": "Die größten Spender", + "topReceivers": "Die besten Receiver" + }, + "publicProfileView": { + "error": "Das Profil konnte nicht geladen werden.", + "guildFooter": "Profil auf {guild}", + "privateProfile": "Dieses Profil ist privat.", + "rank": "Rang", + "reputation": "Ruf" + }, "rank": "Rang", + "ranking": "Rangliste", + "rankingView": { + "advancedRankings": "Erweiterte Ranglisten", + "given": "Angesichts", + "mode": "Modus", + "pageSize": "Seitengröße", + "received": "Erhalten" + }, "reputation": "Reputation", + "tabs": { + "overview": "Übersicht", + "profile": "Profil", + "ranking": "Rangliste" + }, "title": "Dashboard", "todayReputation": "Heute", "topChannel": "Top-Kanal", @@ -676,6 +716,7 @@ "kofiHint": "oder unterstützt uns auf", "kofiLink": "Ko-fi", "message": "{name} ist für Unterstützer reserviert. Werde Unterstützer, um es zu nutzen.", + "perServer": "Die Funktionen werden auf Server-Basis freigeschaltet.", "requiredTierPlural": "Eine der folgenden Unterstützerstufen ist erforderlich:", "requiredTierSingular": "Erforderliche Unterstützerstufe:", "title": "Unterstützer-Feature", @@ -1034,6 +1075,7 @@ "noFeatures": "Im Moment gibt's keine Features.", "purchase": "Kauf", "purchaseSuccess": "Funktion erfolgreich gekauft!", + "requiredTiers": "Unterstützerstufen", "subscribe": "Abonnieren", "subscribeSuccess": "Abo aktiviert!", "subscriptionActiveNote": "Diese Funktion ist gerade durch ein aktives Abonnement aktiviert.", @@ -1075,6 +1117,10 @@ "success": "Deine E-Mail-Adresse wurde erfolgreich bestätigt." } }, + "publicProfile": { + "description": "Erlaube anderen Nutzern, dein Reputationsprofil einzusehen, auch wenn sie nicht denselben Server wie du nutzen.", + "label": "Öffentliches Profil" + }, "title": "Benutzereinstellungen", "voteGuild": { "description": "Entscheide dich, welcher Server Token bekommen soll, wenn du für den Bot stimmst. Das wirkt sich nur auf zukünftige Votes aus.", diff --git a/frontend/src/locales/el.json b/frontend/src/locales/el.json index 5c47e8cb8..51f3a8957 100644 --- a/frontend/src/locales/el.json +++ b/frontend/src/locales/el.json @@ -216,8 +216,48 @@ "save": "Αποθήκευση" }, "dashboard": { + "profile": "Προφίλ", + "profileView": { + "detailedProfile": "Λεπτομερές προφίλ", + "error": "Δεν κατέστη δυνατή η φόρτωση του προφίλ.", + "given": "Δεδομένου ότι", + "maxLevel": "Επιτεύχθηκε το ανώτατο επίπεδο", + "mostGivenChannels": "Τα πιο δημοφιλή κανάλια", + "mostReceivedChannels": "Τα κανάλια με τις περισσότερες προβολές", + "progress": "Προχώρησε στο επόμενο επίπεδο", + "rank": "Κατάταξη: {rank}", + "rankGiven": "Κατάταξη (Δεδομένη)", + "rankReceived": "Κατάταξη (Λάβει)", + "rawReputation": "Ακατέργαστη φήμη", + "received": "Λήφθηκε", + "repOffset": "Αντιστάθμιση φήμης", + "shareProfile": "Κοινή χρήση", + "shareProfileCopied": "Ο σύνδεσμος αντιγράφηκε στα πρόχειρα!", + "topDonors": "Κορυφαίοι δωρητές", + "topReceivers": "Οι κορυφαίοι δέκτες" + }, + "publicProfileView": { + "error": "Δεν κατέστη δυνατή η φόρτωση του προφίλ.", + "guildFooter": "Προφίλ στο {guild}", + "privateProfile": "Αυτό το προφίλ είναι ιδιωτικό.", + "rank": "Κατάταξη", + "reputation": "Φήμη" + }, "rank": "Κατάταξη", + "ranking": "Κατάταξη", + "rankingView": { + "advancedRankings": "Προηγμένες κατατάξεις", + "given": "Δεδομένου ότι", + "mode": "Λειτουργία", + "pageSize": "Μέγεθος σελίδας", + "received": "Λήφθηκε" + }, "reputation": "Φήμη", + "tabs": { + "overview": "Επισκόπηση", + "profile": "Προφίλ", + "ranking": "Κατάταξη" + }, "title": "Πίνακας ελέγχου", "todayReputation": "Η φήμη σήμερα", "topChannel": "Κορυφαίο κανάλι", @@ -676,6 +716,7 @@ "kofiHint": "ή υποστηρίξτε μας στο", "kofiLink": "Ko-fi", "message": "{name} είναι αποκλειστικά για υποστηρικτές. Γίνετε υποστηρικτής για να το χρησιμοποιήσετε.", + "perServer": "Οι λειτουργίες ενεργοποιούνται ανά διακομιστή.", "requiredTierPlural": "Απαιτείται μία από τις ακόλουθες κατηγορίες υποστηρικτών:", "requiredTierSingular": "Απαιτούμενο επίπεδο υποστηρικτή:", "title": "Χαρακτηριστικό υποστηρικτή", @@ -1034,6 +1075,7 @@ "noFeatures": "Δεν υπάρχουν διαθέσιμες λειτουργίες αυτή τη στιγμή.", "purchase": "Αγορά", "purchaseSuccess": "Η λειτουργία αγοράστηκε με επιτυχία!", + "requiredTiers": "Κατηγορίες υποστηρικτών", "subscribe": "Εγγραφή", "subscribeSuccess": "Η συνδρομή ενεργοποιήθηκε!", "subscriptionActiveNote": "Αυτή η λειτουργία είναι ενεργοποιημένη με ενεργή συνδρομή.", @@ -1075,6 +1117,10 @@ "success": "Η διεύθυνση email σας έχει επαληθευτεί με επιτυχία." } }, + "publicProfile": { + "description": "Να επιτρέπεται σε άλλους χρήστες να βλέπουν το προφίλ φήμης σου, όταν δεν βρίσκονται στον ίδιο διακομιστή με εσένα.", + "label": "Δημόσιο προφίλ" + }, "title": "Ρυθμίσεις χρήστη", "voteGuild": { "description": "Επιλέξτε ποια γκίλντα θα λάβει μάρκες όταν ψηφίζετε για το bot. Αυτό θα επηρεάσει μόνο μελλοντικές ψηφοφορίες.", diff --git a/frontend/src/locales/en-US.json b/frontend/src/locales/en-US.json index bf6fb5ecc..d0ef625d1 100644 --- a/frontend/src/locales/en-US.json +++ b/frontend/src/locales/en-US.json @@ -118,6 +118,10 @@ "description": "Choose which guild should receive tokens when you vote for the bot. This will only affect future votes.", "none": "No specific guild (Personal)" }, + "publicProfile": { + "label": "Public Profile", + "description": "Allow other users to view your reputation profile, when they do not share a server with you." + }, "mails": { "title": "Email Addresses", "description": "Manage the email addresses linked to your account. You can add a new address and verify it via the link sent to your inbox.", @@ -220,7 +224,47 @@ "topUsers": "Top Users", "rank": "Rank", "user": "User", - "reputation": "Reputation" + "reputation": "Reputation", + "ranking": "Ranking", + "profile": "Profile", + "rankingView": { + "received": "Received", + "given": "Given", + "mode": "Mode", + "pageSize": "Page Size", + "advancedRankings": "Advanced Rankings" + }, + "publicProfileView": { + "error": "Failed to load profile.", + "privateProfile": "This profile is private.", + "reputation": "Reputation", + "rank": "Rank", + "guildFooter": "Profile on {guild}" + }, + "profileView": { + "error": "Failed to load profile.", + "rank": "Rank: {rank}", + "received": "Received", + "given": "Given", + "rankReceived": "Rank (Received)", + "rankGiven": "Rank (Given)", + "progress": "Progress to next level", + "maxLevel": "Max level reached", + "topDonors": "Top Donors", + "topReceivers": "Top Receivers", + "mostGivenChannels": "Most Given Channels", + "mostReceivedChannels": "Most Received Channels", + "rawReputation": "Raw Reputation", + "repOffset": "Reputation Offset", + "detailedProfile": "Detailed Profile", + "shareProfile": "Share", + "shareProfileCopied": "Link copied to clipboard!" + }, + "tabs": { + "overview": "Overview", + "ranking": "Ranking", + "profile": "Profile" + } }, "presets": { "title": "Presets", @@ -353,7 +397,8 @@ "tokenShopHint": "You can also unlock this feature with tokens in the", "tokenShopLink": "Token Shop", "kofiHint": "or support us on", - "kofiLink": "Ko-fi" + "kofiLink": "Ko-fi", + "perServer": "Features are unlocked on a per server basis." }, "scan": { "description": "Scan your guild for reputation that was given before the bot was added or in channels that were not tracked. This will scan all messages in the configured reputation channels and categories.", diff --git a/frontend/src/locales/es-ES.json b/frontend/src/locales/es-ES.json index c2d579561..3faf38ed4 100644 --- a/frontend/src/locales/es-ES.json +++ b/frontend/src/locales/es-ES.json @@ -216,8 +216,48 @@ "save": "Guardar" }, "dashboard": { + "profile": "Perfil", + "profileView": { + "detailedProfile": "Perfil detallado", + "error": "No se ha podido cargar el perfil.", + "given": "Dado que", + "maxLevel": "Se ha alcanzado el nivel máximo", + "mostGivenChannels": "Los canales más vistos", + "mostReceivedChannels": "Canales más vistos", + "progress": "Pasa al siguiente nivel", + "rank": "Clasificación: {rank}", + "rankGiven": "Rango (asignado)", + "rankReceived": "Puesto (Recibido)", + "rawReputation": "Reputación sin filtrar", + "received": "Recibido", + "repOffset": "Compensación de reputación", + "shareProfile": "Compartir", + "shareProfileCopied": "¡Enlace copiado en el portapapeles!", + "topDonors": "Principales donantes", + "topReceivers": "Los mejores receptores" + }, + "publicProfileView": { + "error": "No se ha podido cargar el perfil.", + "guildFooter": "Perfil en {guild}", + "privateProfile": "Este perfil es privado.", + "rank": "Clasificación", + "reputation": "Reputación" + }, "rank": "Rango", + "ranking": "Clasificación", + "rankingView": { + "advancedRankings": "Clasificaciones avanzadas", + "given": "Dado que", + "mode": "Modo", + "pageSize": "Tamaño de la página", + "received": "Recibido" + }, "reputation": "Reputación", + "tabs": { + "overview": "Resumen", + "profile": "Perfil", + "ranking": "Clasificación" + }, "title": "Panel de control", "todayReputation": "La reputación actual", "topChannel": "Canal principal", @@ -676,6 +716,7 @@ "kofiHint": "o apóyanos en", "kofiLink": "Ko-fi", "message": "{name} está reservado para los seguidores. Hazte seguidor para poder utilizarlo.", + "perServer": "Las funciones se activan por servidor.", "requiredTierPlural": "Se requiere uno de los siguientes niveles de patrocinador:", "requiredTierSingular": "Nivel de patrocinador requerido:", "title": "Característica de los seguidores", @@ -1034,6 +1075,7 @@ "noFeatures": "No hay funciones disponibles en este momento.", "purchase": "Compra", "purchaseSuccess": "¡Función comprada correctamente!", + "requiredTiers": "Niveles de patrocinadores", "subscribe": "Suscríbete", "subscribeSuccess": "¡Suscripción habilitada!", "subscriptionActiveNote": "Esta función está habilitada actualmente mediante una suscripción activa.", @@ -1075,6 +1117,10 @@ "success": "Tu correo electrónico ha sido verificado correctamente." } }, + "publicProfile": { + "description": "Permite que otros usuarios vean tu perfil de reputación, aunque no compartan servidor contigo.", + "label": "Perfil público" + }, "title": "Configuración de usuario", "voteGuild": { "description": "Elige qué gremio debe recibir fichas cuando votes por el bot. Esto solo afectará a los votos futuros.", diff --git a/frontend/src/locales/fi.json b/frontend/src/locales/fi.json index 1e7fa674f..c54117af6 100644 --- a/frontend/src/locales/fi.json +++ b/frontend/src/locales/fi.json @@ -216,8 +216,48 @@ "save": "Tallenna" }, "dashboard": { + "profile": "Profiili", + "profileView": { + "detailedProfile": "Yksityiskohtainen profiili", + "error": "Profiilia ei voitu ladata.", + "given": "Ottaen huomioon", + "maxLevel": "Korkein taso saavutettu", + "mostGivenChannels": "Suosituimmat kanavat", + "mostReceivedChannels": "Katsotuimmat kanavat", + "progress": "Siirry seuraavalle tasolle", + "rank": "Sijoitus: {rank}", + "rankGiven": "Sijoitus (annettu)", + "rankReceived": "Sijoitus (saavutettu)", + "rawReputation": "Raw Reputation", + "received": "Vastaanotettu", + "repOffset": "Maineen kompensointi", + "shareProfile": "Jaa", + "shareProfileCopied": "Linkki on kopioitu leikepöydälle!", + "topDonors": "Suurimmat lahjoittajat", + "topReceivers": "Parhaat laitahyökkääjät" + }, + "publicProfileView": { + "error": "Profiilia ei voitu ladata.", + "guildFooter": "{guild}in profiili", + "privateProfile": "Tämä profiili on yksityinen.", + "rank": "Sijoitus", + "reputation": "Maine" + }, "rank": "Sijoitus", + "ranking": "Sijoitus", + "rankingView": { + "advancedRankings": "Edistyneet rankingit", + "given": "Ottaen huomioon", + "mode": "Tila", + "pageSize": "Sivun koko", + "received": "Vastaanotettu" + }, "reputation": "Maine", + "tabs": { + "overview": "Yleiskatsaus", + "profile": "Profiili", + "ranking": "Sijoitus" + }, "title": "Kojelauta", "todayReputation": "Tämän päivän maine", "topChannel": "Suosituin kanava", @@ -676,6 +716,7 @@ "kofiHint": "tai tue meitä osoitteessa", "kofiLink": "Ko-fi", "message": "{name} on varattu tukijoille. Ryhdy tukijaksi, jotta voit käyttää sitä.", + "perServer": "Ominaisuudet avataan palvelinkohtaisesti.", "requiredTierPlural": "Jokin seuraavista tukijatasoista vaaditaan:", "requiredTierSingular": "Vaadittu tukijataso:", "title": "Kannattaja-ominaisuus", @@ -1034,6 +1075,7 @@ "noFeatures": "Tällä hetkellä ei ole käytettävissä olevia ominaisuuksia.", "purchase": "Osta", "purchaseSuccess": "Ominaisuus ostettu onnistuneesti!", + "requiredTiers": "Tukijatasot", "subscribe": "Tilaa", "subscribeSuccess": "Tilaus on aktivoitu!", "subscriptionActiveNote": "Tämä ominaisuus on tällä hetkellä käytössä aktiivisen tilauksen ansiosta.", @@ -1075,6 +1117,10 @@ "success": "Sähköpostiosoitteesi on vahvistettu onnistuneesti." } }, + "publicProfile": { + "description": "Salli muiden käyttäjien tarkastella maineprofiiliasi, vaikka he eivät olisi samalla palvelimella kanssasi.", + "label": "Julkinen profiili" + }, "title": "Käyttäjäasetukset", "voteGuild": { "description": "Valitse, mikä kilta saa rahakkeita, kun äänestät botille. Tämä vaikuttaa vain tuleviin äänestyksiin.", diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json index 687f7127a..b8a6c1310 100644 --- a/frontend/src/locales/fr.json +++ b/frontend/src/locales/fr.json @@ -216,8 +216,48 @@ "save": "Enregistrer" }, "dashboard": { + "profile": "Profil", + "profileView": { + "detailedProfile": "Profil détaillé", + "error": "Échec du chargement du profil.", + "given": "Étant donné que", + "maxLevel": "Niveau maximum atteint", + "mostGivenChannels": "Les chaînes les plus regardées", + "mostReceivedChannels": "Chaînes les plus regardées", + "progress": "Passe au niveau suivant", + "rank": "Classement : {rank}", + "rankGiven": "Classement (attribué)", + "rankReceived": "Classement (Reçu)", + "rawReputation": "Raw Reputation", + "received": "Reçu", + "repOffset": "Compensation de réputation", + "shareProfile": "Partager", + "shareProfileCopied": "Le lien a été copié dans le presse-papiers !", + "topDonors": "Principaux donateurs", + "topReceivers": "Les meilleurs receveurs" + }, + "publicProfileView": { + "error": "Échec du chargement du profil.", + "guildFooter": "Profil sur {guild}", + "privateProfile": "Ce profil est privé.", + "rank": "Classement", + "reputation": "Réputation" + }, "rank": "Rang", + "ranking": "Classement", + "rankingView": { + "advancedRankings": "Classements avancés", + "given": "Étant donné que", + "mode": "Mode", + "pageSize": "Taille de la page", + "received": "Reçu" + }, "reputation": "Réputation", + "tabs": { + "overview": "Aperçu", + "profile": "Profil", + "ranking": "Classement" + }, "title": "Tableau de bord", "todayReputation": "La réputation d'aujourd'hui", "topChannel": "Chaîne principale", @@ -676,6 +716,7 @@ "kofiHint": "ou soutenez-nous sur", "kofiLink": "Ko-fi", "message": "{name} est réservé aux supporters. Deviens supporter pour pouvoir l'utiliser.", + "perServer": "Les fonctionnalités sont activées au niveau de chaque serveur.", "requiredTierPlural": "Il faut choisir un des niveaux de soutien suivants :", "requiredTierSingular": "Niveau de soutien requis :", "title": "Présentation d'un supporter", @@ -1034,6 +1075,7 @@ "noFeatures": "Aucune fonctionnalité pour le moment.", "purchase": "Acheter", "purchaseSuccess": "Fonctionnalité achetée, c'est bon !", + "requiredTiers": "Niveaux d'adhésion", "subscribe": "S'abonner", "subscribeSuccess": "Abonnement activé !", "subscriptionActiveNote": "Cette fonctionnalité est actuellement activée par un abonnement actif.", @@ -1075,6 +1117,10 @@ "success": "Ton e-mail a été validé avec succès." } }, + "publicProfile": { + "description": "Autorise les autres utilisateurs à consulter ton profil de réputation, même s'ils ne partagent pas le même serveur que toi.", + "label": "Profil public" + }, "title": "Paramètres utilisateur", "voteGuild": { "description": "Choisis la guilde qui devrait recevoir des jetons quand tu votes pour le bot. Ça ne changera rien que pour les votes à venir.", diff --git a/frontend/src/locales/it.json b/frontend/src/locales/it.json index 0248fec11..b8f7c0da2 100644 --- a/frontend/src/locales/it.json +++ b/frontend/src/locales/it.json @@ -216,8 +216,48 @@ "save": "Salva" }, "dashboard": { + "profile": "Profilo", + "profileView": { + "detailedProfile": "Profilo dettagliato", + "error": "Impossibile caricare il profilo.", + "given": "Dato che", + "maxLevel": "Livello massimo raggiunto", + "mostGivenChannels": "I canali più seguiti", + "mostReceivedChannels": "I canali più seguiti", + "progress": "Passa al livello successivo", + "rank": "Classifica: {rank}", + "rankGiven": "Grado (assegnato)", + "rankReceived": "Posizione (Ricevuto)", + "rawReputation": "Reputazione grezza", + "received": "Ricevuto", + "repOffset": "Compensazione della reputazione", + "shareProfile": "Condividi", + "shareProfileCopied": "Il link è stato copiato negli appunti!", + "topDonors": "I principali donatori", + "topReceivers": "I migliori ricevitori" + }, + "publicProfileView": { + "error": "Impossibile caricare il profilo.", + "guildFooter": "Profilo su {guild}", + "privateProfile": "Questo profilo è privato.", + "rank": "Posizione", + "reputation": "Reputazione" + }, "rank": "Classifica", + "ranking": "Classifica", + "rankingView": { + "advancedRankings": "Classifiche avanzate", + "given": "Dato che", + "mode": "Modalità", + "pageSize": "Dimensione pagina", + "received": "Ricevuto" + }, "reputation": "Reputazione", + "tabs": { + "overview": "Panoramica", + "profile": "Profilo", + "ranking": "Classifica" + }, "title": "Pannello di controllo", "todayReputation": "La reputazione di oggi", "topChannel": "Canale principale", @@ -676,6 +716,7 @@ "kofiHint": "oppure seguici su", "kofiLink": "Ko-fi", "message": "{name} è solo per chi ci supporta. Diventa un sostenitore per usarlo.", + "perServer": "Le funzionalità vengono sbloccate per ogni singolo server.", "requiredTierPlural": "Devi scegliere uno di questi livelli di sostegno:", "requiredTierSingular": "Livello di sostegno richiesto:", "title": "Caratteristiche dei sostenitori", @@ -1034,6 +1075,7 @@ "noFeatures": "Al momento non ci sono funzioni disponibili.", "purchase": "Acquisto", "purchaseSuccess": "Funzionalità comprata con successo!", + "requiredTiers": "Livelli di abbonamento", "subscribe": "Iscriviti", "subscribeSuccess": "Abbonamento attivato!", "subscriptionActiveNote": "Questa funzione è attualmente disponibile con un abbonamento attivo.", @@ -1075,6 +1117,10 @@ "success": "La tua email è stata verificata senza problemi." } }, + "publicProfile": { + "description": "Consenti agli altri utenti di visualizzare il tuo profilo di reputazione, anche se non condividono lo stesso server con te.", + "label": "Profilo pubblico" + }, "title": "Impostazioni utente", "voteGuild": { "description": "Scegli quale gilda dovrebbe ricevere i gettoni quando voti per il bot. Questo cambierà solo i voti futuri.", diff --git a/frontend/src/locales/ja.json b/frontend/src/locales/ja.json index 4c9134867..b7b96a8a1 100644 --- a/frontend/src/locales/ja.json +++ b/frontend/src/locales/ja.json @@ -216,8 +216,48 @@ "save": "保存" }, "dashboard": { + "profile": "プロフィール", + "profileView": { + "detailedProfile": "詳細プロフィール", + "error": "プロファイルの読み込みに失敗した。", + "given": "与えられた", + "maxLevel": "最大レベルに達した", + "mostGivenChannels": "最も多く贈られたチャンネル", + "mostReceivedChannels": "最も視聴されているチャンネル", + "progress": "次のレベルへ進む", + "rank": "ランク:{rank}", + "rankGiven": "ランク(指定)", + "rankReceived": "ランク(受領)", + "rawReputation": "生の評判", + "received": "受信した", + "repOffset": "評判のオフセット", + "shareProfile": "共有", + "shareProfileCopied": "リンクがクリップボードにコピーされた!", + "topDonors": "主な寄付者", + "topReceivers": "トップレシーバー" + }, + "publicProfileView": { + "error": "プロファイルの読み込みに失敗した。", + "guildFooter": "{guild}のプロフィール", + "privateProfile": "このプロフィールは非公開だ。", + "rank": "ランク", + "reputation": "評判" + }, "rank": "ランク", + "ranking": "ランキング", + "rankingView": { + "advancedRankings": "詳細ランキング", + "given": "与えられた", + "mode": "モード", + "pageSize": "ページサイズ", + "received": "受信した" + }, "reputation": "評判", + "tabs": { + "overview": "概要", + "profile": "プロフィール", + "ranking": "ランキング" + }, "title": "ダッシュボード", "todayReputation": "今日の評判", "topChannel": "トップチャンネル", @@ -676,6 +716,7 @@ "kofiHint": "または支援する", "kofiLink": "Ko-fi", "message": "{name} サポーター専用だ。利用するにはサポーターになれ。", + "perServer": "機能はサーバーごとに有効化される。", "requiredTierPlural": "以下のサポーター層のいずれかが必要だ:", "requiredTierSingular": "必要なサポーターのレベル:", "title": "サポーター特集", @@ -1034,6 +1075,7 @@ "noFeatures": "現在利用可能な機能はない。", "purchase": "購入", "purchaseSuccess": "機能の購入が成功した!", + "requiredTiers": "サポーターのランク", "subscribe": "購読する", "subscribeSuccess": "購読が有効になった!", "subscriptionActiveNote": "この機能は現在、有効なサブスクリプションによって利用可能になっている。", @@ -1075,6 +1117,10 @@ "success": "メールアドレスの確認が完了した。" } }, + "publicProfile": { + "description": "同じサーバーを利用していない他のユーザーが、あなたの評判プロファイルを閲覧できるようにする。", + "label": "公開プロフィール" + }, "title": "ユーザー設定", "voteGuild": { "description": "ボットに投票する際に、トークンを受け取るギルドを選択せよ。これは今後の投票にのみ影響する。", diff --git a/frontend/src/locales/ko.json b/frontend/src/locales/ko.json index 94522eea7..1a39895c7 100644 --- a/frontend/src/locales/ko.json +++ b/frontend/src/locales/ko.json @@ -216,8 +216,48 @@ "save": "저장" }, "dashboard": { + "profile": "프로필", + "profileView": { + "detailedProfile": "상세 프로필", + "error": "프로필을 불러오지 못했습니다.", + "given": "다음과 같이 주어졌을 때", + "maxLevel": "최대 레벨 달성", + "mostGivenChannels": "가장 많이 시청된 채널", + "mostReceivedChannels": "가장 많이 시청한 채널", + "progress": "다음 단계로 진행", + "rank": "순위: {rank}", + "rankGiven": "순위 (지정)", + "rankReceived": "순위 (수신)", + "rawReputation": "원시 평판", + "received": "수신됨", + "repOffset": "평판 상쇄", + "shareProfile": "공유하기", + "shareProfileCopied": "링크가 클립보드에 복사되었습니다!", + "topDonors": "주요 기부자", + "topReceivers": "최고의 리시버" + }, + "publicProfileView": { + "error": "프로필을 불러오지 못했습니다.", + "guildFooter": "{guild}의 프로필", + "privateProfile": "이 프로필은 비공개입니다.", + "rank": "순위", + "reputation": "평판" + }, "rank": "순위", + "ranking": "순위", + "rankingView": { + "advancedRankings": "고급 순위", + "given": "다음과 같이 주어졌을 때", + "mode": "모드", + "pageSize": "페이지 크기", + "received": "수신됨" + }, "reputation": "평판", + "tabs": { + "overview": "개요", + "profile": "프로필", + "ranking": "순위" + }, "title": "대시보드", "todayReputation": "오늘의 평판", "topChannel": "최상위 채널", @@ -676,6 +716,7 @@ "kofiHint": "또는 저희를 후원해 주세요", "kofiLink": "코피", "message": "{name} 이 기능은 후원자 전용입니다. 사용하려면 후원자가 되어 주세요.", + "perServer": "기능은 서버별로 활성화됩니다.", "requiredTierPlural": "다음 후원 등급 중 하나가 필요합니다:", "requiredTierSingular": "필수 후원 등급:", "title": "서포터 기능", @@ -1034,6 +1075,7 @@ "noFeatures": "현재 사용 가능한 기능이 없습니다.", "purchase": "구매", "purchaseSuccess": "기능 구매 성공!", + "requiredTiers": "후원 등급", "subscribe": "구독하기", "subscribeSuccess": "구독이 활성화되었습니다!", "subscriptionActiveNote": "이 기능은 현재 활성 구독으로 활성화되어 있습니다.", @@ -1075,6 +1117,10 @@ "success": "귀하의 이메일 주소가 성공적으로 확인되었습니다." } }, + "publicProfile": { + "description": "다른 사용자가 귀하와 같은 서버를 사용하지 않는 경우에도 귀하의 평판 프로필을 볼 수 있도록 허용합니다.", + "label": "공개 프로필" + }, "title": "사용자 설정", "voteGuild": { "description": "봇에 투표할 때 토큰을 받을 길드를 선택하세요. 이는 향후 투표에만 영향을 미칩니다.", diff --git a/frontend/src/locales/nl.json b/frontend/src/locales/nl.json index f4710c9f5..d3858c43b 100644 --- a/frontend/src/locales/nl.json +++ b/frontend/src/locales/nl.json @@ -216,8 +216,48 @@ "save": "Opslaan" }, "dashboard": { + "profile": "Profiel", + "profileView": { + "detailedProfile": "Uitgebreid profiel", + "error": "Het profiel kan niet worden geladen.", + "given": "Aangezien", + "maxLevel": "Maximale level bereikt", + "mostGivenChannels": "Meest gegeven kanalen", + "mostReceivedChannels": "Meest bekeken zenders", + "progress": "Ga naar het volgende niveau", + "rank": "Ranglijst: {rank}", + "rankGiven": "Rang (Toegekend)", + "rankReceived": "Rang (Ontvangen)", + "rawReputation": "Raw Reputation", + "received": "Ontvangen", + "repOffset": "Reputatiecorrectie", + "shareProfile": "Delen", + "shareProfileCopied": "De link is naar het klembord gekopieerd!", + "topDonors": "Grootste donateurs", + "topReceivers": "Topontvangers" + }, + "publicProfileView": { + "error": "Het profiel kan niet worden geladen.", + "guildFooter": "Profiel op {guild}", + "privateProfile": "Dit profiel is privé.", + "rank": "Rang", + "reputation": "Reputatie" + }, "rank": "Rang", + "ranking": "Ranglijst", + "rankingView": { + "advancedRankings": "Geavanceerde ranglijsten", + "given": "Aangezien", + "mode": "Modus", + "pageSize": "Paginagrootte", + "received": "Ontvangen" + }, "reputation": "Reputatie", + "tabs": { + "overview": "Overzicht", + "profile": "Profiel", + "ranking": "Ranglijst" + }, "title": "Dashboard", "todayReputation": "De reputatie van vandaag", "topChannel": "Topkanaal", @@ -676,6 +716,7 @@ "kofiHint": "of steun ons op", "kofiLink": "Ko-fi", "message": "{name} is alleen voor supporters. Word supporter om het te kunnen gebruiken.", + "perServer": "Functies worden per server vrijgegeven.", "requiredTierPlural": "Je moet een van de volgende supporterniveaus kiezen:", "requiredTierSingular": "Vereist ondersteuningsniveau:", "title": "Supporter-functie", @@ -1034,6 +1075,7 @@ "noFeatures": "Op dit moment zijn er geen functies beschikbaar.", "purchase": "Aankoop", "purchaseSuccess": "Functie succesvol gekocht!", + "requiredTiers": "Supportersniveaus", "subscribe": "Abonneren", "subscribeSuccess": "Abonnement is nu actief!", "subscriptionActiveNote": "Deze functie is nu beschikbaar als je een actief abonnement hebt.", @@ -1075,6 +1117,10 @@ "success": "Je e-mailadres is nu goed geverifieerd." } }, + "publicProfile": { + "description": "Laat andere gebruikers je reputatieprofiel bekijken, ook als ze niet op dezelfde server zitten als jij.", + "label": "Openbaar profiel" + }, "title": "Gebruikersinstellingen", "voteGuild": { "description": "Kies welke gilde tokens moet krijgen als je op de bot stemt. Dit geldt alleen voor toekomstige stemmen.", diff --git a/frontend/src/locales/no.json b/frontend/src/locales/no.json index 13c56f167..52fbb1f39 100644 --- a/frontend/src/locales/no.json +++ b/frontend/src/locales/no.json @@ -216,8 +216,48 @@ "save": "Lagre" }, "dashboard": { + "profile": "Profil", + "profileView": { + "detailedProfile": "Detaljert profil", + "error": "Det gikk ikke å laste inn profilen.", + "given": "Gitt", + "maxLevel": "Maksimalt nivå nådd", + "mostGivenChannels": "De mest populære kanalene", + "mostReceivedChannels": "De mest mottatte kanalene", + "progress": "Gå videre til neste nivå", + "rank": "Rangering: {rank}", + "rankGiven": "Rang (tildelt)", + "rankReceived": "Rangering (mottatt)", + "rawReputation": "Raw Reputation", + "received": "Mottatt", + "repOffset": "Omdømmeutjevning", + "shareProfile": "Del", + "shareProfileCopied": "Koblingen er kopiert til utklippstavlen!", + "topDonors": "De største giverne", + "topReceivers": "De beste mottakerne" + }, + "publicProfileView": { + "error": "Det gikk ikke å laste inn profilen.", + "guildFooter": "Profil på {guild}", + "privateProfile": "Denne profilen er privat.", + "rank": "Rangering", + "reputation": "Omdømme" + }, "rank": "Rangering", + "ranking": "Rangering", + "rankingView": { + "advancedRankings": "Avanserte rangeringer", + "given": "Gitt", + "mode": "Modus", + "pageSize": "Sidestørrelse", + "received": "Mottatt" + }, "reputation": "Omdømme", + "tabs": { + "overview": "Oversikt", + "profile": "Profil", + "ranking": "Rangering" + }, "title": "Dashbord", "todayReputation": "Dagens omdømme", "topChannel": "Toppkanal", @@ -676,6 +716,7 @@ "kofiHint": "eller støtt oss på", "kofiLink": "Ko-fi", "message": "{name} er forbeholdt støttespillere. Bli støttespiller for å kunne bruke den.", + "perServer": "Funksjonene aktiveres på hver enkelt server.", "requiredTierPlural": "En av følgende støttenivåer er påkrevd:", "requiredTierSingular": "Nødvendig støttenivå:", "title": "Supporterfunksjon", @@ -1034,6 +1075,7 @@ "noFeatures": "Ingen funksjoner tilgjengelig for øyeblikket.", "purchase": "Kjøp", "purchaseSuccess": "Funksjonen er kjøpt!", + "requiredTiers": "Støttenivåer", "subscribe": "Abonner", "subscribeSuccess": "Abonnement aktivert!", "subscriptionActiveNote": "Denne funksjonen er for øyeblikket aktivert av et aktivt abonnement.", @@ -1075,6 +1117,10 @@ "success": "E-postadressen din er bekreftet." } }, + "publicProfile": { + "description": "La andre brukere se omdømmeprofilen din, selv om de ikke deler server med deg.", + "label": "Offentlig profil" + }, "title": "Brukerinnstillinger", "voteGuild": { "description": "Velg hvilket guild som skal motta tokens når du stemmer på boten. Dette vil kun påvirke fremtidige stemmer.", diff --git a/frontend/src/locales/pl.json b/frontend/src/locales/pl.json index 2465a996b..c2b7c6e57 100644 --- a/frontend/src/locales/pl.json +++ b/frontend/src/locales/pl.json @@ -216,8 +216,48 @@ "save": "Zapisz" }, "dashboard": { + "profile": "Profil", + "profileView": { + "detailedProfile": "Szczegółowy profil", + "error": "Nie udało się załadować profilu.", + "given": "Biorąc pod uwagę", + "maxLevel": "Osiągnięto maksymalny poziom", + "mostGivenChannels": "Najczęściej wybierane kanały", + "mostReceivedChannels": "Najczęściej oglądane kanały", + "progress": "Przejdź do następnego poziomu", + "rank": "Ranking: {rank}", + "rankGiven": "Ranga (nadana)", + "rankReceived": "Ranking (Otrzymane)", + "rawReputation": "Raw Reputation", + "received": "Otrzymano", + "repOffset": "Korekta reputacji", + "shareProfile": "Udostępnij", + "shareProfileCopied": "Link skopiowano do schowka!", + "topDonors": "Najwięksi darczyńcy", + "topReceivers": "Najlepsi skrzydłowi" + }, + "publicProfileView": { + "error": "Nie udało się załadować profilu.", + "guildFooter": "Profil na stronie {guild}", + "privateProfile": "Ten profil jest prywatny.", + "rank": "Ranking", + "reputation": "Reputacja" + }, "rank": "Ranga", + "ranking": "Ranking", + "rankingView": { + "advancedRankings": "Zaawansowane rankingi", + "given": "Biorąc pod uwagę", + "mode": "Tryb", + "pageSize": "Rozmiar strony", + "received": "Otrzymano" + }, "reputation": "Reputacja", + "tabs": { + "overview": "Przegląd", + "profile": "Profil", + "ranking": "Ranking" + }, "title": "Pulpit nawigacyjny", "todayReputation": "Dzisiejsza reputacja", "topChannel": "Najpopularniejszy kanał", @@ -676,6 +716,7 @@ "kofiHint": "lub wesprzyj nas na", "kofiLink": "Ko-fi", "message": "{name} jest zarezerwowana dla kibiców. Zostań kibicem, aby z niej korzystać.", + "perServer": "Funkcje są odblokowywane osobno dla każdego serwera.", "requiredTierPlural": "Wymagany jest jeden z poniższych poziomów wsparcia:", "requiredTierSingular": "Wymagany poziom wsparcia:", "title": "Funkcja kibica", @@ -1034,6 +1075,7 @@ "noFeatures": "W tej chwili nie są dostępne żadne funkcje.", "purchase": "Zakup", "purchaseSuccess": "Funkcja została pomyślnie zakupiona!", + "requiredTiers": "Poziomy wsparcia", "subscribe": "Zapisz się", "subscribeSuccess": "Subskrypcja włączona!", "subscriptionActiveNote": "Ta funkcja jest obecnie dostępna dzięki aktywnej subskrypcji.", @@ -1075,6 +1117,10 @@ "success": "Twój adres e-mail został pomyślnie zweryfikowany." } }, + "publicProfile": { + "description": "Zezwól innym użytkownikom na przeglądanie twojego profilu reputacji, nawet jeśli nie korzystają z tego samego serwera co ty.", + "label": "Profil publiczny" + }, "title": "Ustawienia użytkownika", "voteGuild": { "description": "Wybierz gildię, która powinna otrzymać tokeny, gdy głosujesz na bota. Będzie to miało wpływ tylko na przyszłe głosy.", diff --git a/frontend/src/locales/pt-BR.json b/frontend/src/locales/pt-BR.json index 940d3a50d..fc4cad10c 100644 --- a/frontend/src/locales/pt-BR.json +++ b/frontend/src/locales/pt-BR.json @@ -216,8 +216,48 @@ "save": "Salvar" }, "dashboard": { + "profile": "Perfil", + "profileView": { + "detailedProfile": "Perfil detalhado", + "error": "Não foi possível carregar o perfil.", + "given": "Dado que", + "maxLevel": "Nível máximo alcançado", + "mostGivenChannels": "Canais mais indicados", + "mostReceivedChannels": "Canais mais assistidos", + "progress": "Passa para o próximo nível", + "rank": "Classificação: {rank}", + "rankGiven": "Classificação (atribuída)", + "rankReceived": "Classificação (Recebida)", + "rawReputation": "Reputação Bruta", + "received": "Recebido", + "repOffset": "Compensação de reputação", + "shareProfile": "Compartilhar", + "shareProfileCopied": "Link copiado para a área de transferência!", + "topDonors": "Principais doadores", + "topReceivers": "Principais recebedores" + }, + "publicProfileView": { + "error": "Não foi possível carregar o perfil.", + "guildFooter": "Perfil no {guild}", + "privateProfile": "Este perfil é privado.", + "rank": "Classificação", + "reputation": "Reputação" + }, "rank": "Classificação", + "ranking": "Ranking", + "rankingView": { + "advancedRankings": "Classificações avançadas", + "given": "Dado que", + "mode": "Modo", + "pageSize": "Tamanho da página", + "received": "Recebido" + }, "reputation": "Reputação", + "tabs": { + "overview": "Visão geral", + "profile": "Perfil", + "ranking": "Ranking" + }, "title": "Painel", "todayReputation": "Reputação atual", "topChannel": "Canal principal", @@ -676,6 +716,7 @@ "kofiHint": "ou apoie-nos em", "kofiLink": "Ko-fi", "message": "{name} é só para quem é apoiador. Torne-se um apoiador para usar.", + "perServer": "Os recursos são ativados por servidor.", "requiredTierPlural": "É preciso escolher um dos níveis de apoio a seguir:", "requiredTierSingular": "Nível de Apoiador necessário:", "title": "Recurso de Apoiador", @@ -1034,6 +1075,7 @@ "noFeatures": "Não tem recursos disponíveis no momento.", "purchase": "Compra", "purchaseSuccess": "Recurso comprado com sucesso!", + "requiredTiers": "Níveis de apoio", "subscribe": "Inscreva-se", "subscribeSuccess": "Assinatura ativada!", "subscriptionActiveNote": "Esse recurso está ativado agora por uma assinatura ativa.", @@ -1075,6 +1117,10 @@ "success": "Seu e-mail foi verificado com sucesso." } }, + "publicProfile": { + "description": "Permita que outros usuários vejam seu perfil de reputação, mesmo que não estejam no mesmo servidor que você.", + "label": "Perfil público" + }, "title": "Configurações do usuário", "voteGuild": { "description": "Escolha qual guilda deve receber tokens quando você votar no bot. Isso só vai afetar os votos futuros.", diff --git a/frontend/src/locales/ru.json b/frontend/src/locales/ru.json index 859b86175..ba2a8b061 100644 --- a/frontend/src/locales/ru.json +++ b/frontend/src/locales/ru.json @@ -216,8 +216,48 @@ "save": "Сохранить" }, "dashboard": { + "profile": "Профиль", + "profileView": { + "detailedProfile": "Подробная анкета", + "error": "Не удалось загрузить профиль.", + "given": "Учитывая", + "maxLevel": "Достигнут максимальный уровень", + "mostGivenChannels": "Самые популярные каналы", + "mostReceivedChannels": "Самые популярные каналы", + "progress": "Перейти на следующий уровень", + "rank": "Рейтинг: {rank}", + "rankGiven": "Ранг (Имя)", + "rankReceived": "Рейтинг (Получено)", + "rawReputation": "Raw Reputation", + "received": "Получено", + "repOffset": "Корректировка репутации", + "shareProfile": "Поделиться", + "shareProfileCopied": "Ссылка скопирована в буфер обмена!", + "topDonors": "Крупнейшие доноры", + "topReceivers": "Лучшие ресиверы" + }, + "publicProfileView": { + "error": "Не удалось загрузить профиль.", + "guildFooter": "Профиль на сайте {guild}", + "privateProfile": "Этот профиль закрыт.", + "rank": "Рейтинг", + "reputation": "Репутация" + }, "rank": "Ранг", + "ranking": "Рейтинг", + "rankingView": { + "advancedRankings": "Расширенный рейтинг", + "given": "Учитывая", + "mode": "Режим", + "pageSize": "Размер страницы", + "received": "Получено" + }, "reputation": "Репутация", + "tabs": { + "overview": "Обзор", + "profile": "Профиль", + "ranking": "Рейтинг" + }, "title": "Панель управления", "todayReputation": "Сегодняшняя репутация", "topChannel": "Лучший канал", @@ -676,6 +716,7 @@ "kofiHint": "или поддержите нас на", "kofiLink": "Ко-фи", "message": "{name} зарезервирован для тех, кто нас поддерживает. Стань одним из них, чтобы им пользоваться.", + "perServer": "Функции открываются для каждого сервера отдельно.", "requiredTierPlural": "Нужно выбрать один из следующих уровней поддержки:", "requiredTierSingular": "Нужный уровень поддержки:", "title": "Особенности для болельщиков", @@ -1034,6 +1075,7 @@ "noFeatures": "Сейчас нет никаких функций.", "purchase": "Покупка", "purchaseSuccess": "Функция куплена, все в порядке!", + "requiredTiers": "Уровни поддержки", "subscribe": "Подпишись", "subscribeSuccess": "Подписка включена!", "subscriptionActiveNote": "Эта функция сейчас включена благодаря активной подписке.", @@ -1075,6 +1117,10 @@ "success": "Твой адрес электронной почты подтвержден." } }, + "publicProfile": { + "description": "Разрешить другим пользователям просматривать твой профиль репутации, если они не находятся на одном сервере с тобой.", + "label": "Публичный профиль" + }, "title": "Настройки пользователя", "voteGuild": { "description": "Выбери, какая гильдия должна получать токены, когда голосуешь за бота. Это будет влиять только на будущие голоса.", diff --git a/frontend/src/locales/sv-SE.json b/frontend/src/locales/sv-SE.json index 2e8a00cea..6e8bc21d9 100644 --- a/frontend/src/locales/sv-SE.json +++ b/frontend/src/locales/sv-SE.json @@ -216,8 +216,48 @@ "save": "Spara" }, "dashboard": { + "profile": "Profil", + "profileView": { + "detailedProfile": "Detaljerad profil", + "error": "Det gick inte att ladda profilen.", + "given": "Med tanke på", + "maxLevel": "Högsta nivå uppnådd", + "mostGivenChannels": "De mest populära kanalerna", + "mostReceivedChannels": "De mest tittade kanalerna", + "progress": "Gå vidare till nästa nivå", + "rank": "Rankning: {rank}", + "rankGiven": "Rankning (angiven)", + "rankReceived": "Placering (mottagen)", + "rawReputation": "Raw Reputation", + "received": "Mottaget", + "repOffset": "Rykte-kompensation", + "shareProfile": "Dela", + "shareProfileCopied": "Länken har kopierats till urklipp!", + "topDonors": "De största donatorerna", + "topReceivers": "De bästa mottagarna" + }, + "publicProfileView": { + "error": "Det gick inte att ladda profilen.", + "guildFooter": "Profil på {guild}", + "privateProfile": "Den här profilen är privat.", + "rank": "Rankning", + "reputation": "Anseende" + }, "rank": "Rank", + "ranking": "Rankning", + "rankingView": { + "advancedRankings": "Avancerade rankningar", + "given": "Med tanke på", + "mode": "Läge", + "pageSize": "Sidstorlek", + "received": "Mottaget" + }, "reputation": "Rykte", + "tabs": { + "overview": "Översikt", + "profile": "Profil", + "ranking": "Rankning" + }, "title": "Instrumentpanel", "todayReputation": "Dagens rykte", "topChannel": "Top Channel", @@ -676,6 +716,7 @@ "kofiHint": "eller stöd oss på", "kofiLink": "Ko-fi", "message": "{name} är reserverad för supportrar. Bli supporter för att kunna använda den.", + "perServer": "Funktionerna aktiveras per server.", "requiredTierPlural": "En av följande supporternivåer krävs:", "requiredTierSingular": "Krävd supporternivå:", "title": "Supporterfunktion", @@ -1034,6 +1075,7 @@ "noFeatures": "Inga funktioner tillgängliga för tillfället.", "purchase": "Köp", "purchaseSuccess": "Funktionen har köpts!", + "requiredTiers": "Supporterkategorier", "subscribe": "Prenumerera", "subscribeSuccess": "Prenumeration aktiverad!", "subscriptionActiveNote": "Denna funktion är för närvarande aktiverad genom ett aktivt abonnemang.", @@ -1075,6 +1117,10 @@ "success": "Din e-postadress har verifierats." } }, + "publicProfile": { + "description": "Låt andra användare se ditt omdömesprofil, även om de inte delar server med dig.", + "label": "Offentlig profil" + }, "title": "Användarinställningar", "voteGuild": { "description": "Välj vilken guild som ska få tokens när du röstar på boten. Detta påverkar endast framtida röster.", diff --git a/frontend/src/locales/tr.json b/frontend/src/locales/tr.json index 33db1fe44..f85b77bba 100644 --- a/frontend/src/locales/tr.json +++ b/frontend/src/locales/tr.json @@ -216,8 +216,48 @@ "save": "Kaydet" }, "dashboard": { + "profile": "Profil", + "profileView": { + "detailedProfile": "Ayrıntılı Profil", + "error": "Profil yüklenemedi.", + "given": "Verildi", + "maxLevel": "Maksimum seviyeye ulaşıldı", + "mostGivenChannels": "En Çok İzlenen Kanallar", + "mostReceivedChannels": "En Çok İzlenen Kanallar", + "progress": "Bir sonraki seviyeye geç", + "rank": "Sıralama: {rank}", + "rankGiven": "Sıra (Verilen)", + "rankReceived": "Sıra (Alınan)", + "rawReputation": "Ham İtibar", + "received": "Alındı", + "repOffset": "İtibar Dengeleme", + "shareProfile": "Paylaş", + "shareProfileCopied": "Bağlantı panoya kopyalandı!", + "topDonors": "En Büyük Bağışçılar", + "topReceivers": "En İyi Alıcılar" + }, + "publicProfileView": { + "error": "Profil yüklenemedi.", + "guildFooter": "{guild}'daki profil", + "privateProfile": "Bu profil gizlidir.", + "rank": "Sıra", + "reputation": "İtibar" + }, "rank": "Sıra", + "ranking": "Sıralama", + "rankingView": { + "advancedRankings": "Gelişmiş Sıralamalar", + "given": "Verildi", + "mode": "Mod", + "pageSize": "Sayfa Boyutu", + "received": "Alındı" + }, "reputation": "İtibar", + "tabs": { + "overview": "Genel Bakış", + "profile": "Profil", + "ranking": "Sıralama" + }, "title": "Gösterge paneli", "todayReputation": "Bugünün İtibarı", "topChannel": "En Popüler Kanal", @@ -676,6 +716,7 @@ "kofiHint": "veya bizi destekleyin", "kofiLink": "Ko-fi", "message": "{name} destekçilere ayrılmıştır. Kullanmak için destekçi olun.", + "perServer": "Özellikler sunucu bazında etkinleştirilir.", "requiredTierPlural": "Aşağıdaki destekçi seviyelerinden biri gereklidir:", "requiredTierSingular": "Gerekli Destekçi Seviyesi:", "title": "Destekçi Özelliği", @@ -1034,6 +1075,7 @@ "noFeatures": "Şu anda kullanılabilir özellik yok.", "purchase": "Satın al", "purchaseSuccess": "Özellik başarıyla satın alındı!", + "requiredTiers": "Destekçi Seviyeleri", "subscribe": "Abone ol", "subscribeSuccess": "Abonelik etkinleştirildi!", "subscriptionActiveNote": "Bu özellik şu anda aktif bir abonelikle etkinleştirilmiştir.", @@ -1075,6 +1117,10 @@ "success": "E-postanız başarıyla doğrulandı." } }, + "publicProfile": { + "description": "Sizinle aynı sunucuyu paylaşmayan diğer kullanıcıların itibar profilinizi görüntülemelerine izin verin.", + "label": "Herkese Açık Profil" + }, "title": "Kullanıcı Ayarları", "voteGuild": { "description": "Bot için oy verirken hangi guildin token alacağını seçin. Bu sadece gelecekteki oyları etkileyecektir.", diff --git a/frontend/src/locales/uk.json b/frontend/src/locales/uk.json index 55dff6766..f5b008f0a 100644 --- a/frontend/src/locales/uk.json +++ b/frontend/src/locales/uk.json @@ -216,8 +216,48 @@ "save": "Зберегти" }, "dashboard": { + "profile": "Профіль", + "profileView": { + "detailedProfile": "Детальний профіль", + "error": "Не вдалося завантажити профіль.", + "given": "З огляду на", + "maxLevel": "Досягнуто максимального рівня", + "mostGivenChannels": "Найпопулярніші канали", + "mostReceivedChannels": "Найпопулярніші канали", + "progress": "Перейти на наступний рівень", + "rank": "Рейтинг: {rank}", + "rankGiven": "Ранг (зазначений)", + "rankReceived": "Рейтинг (Отримано)", + "rawReputation": "Raw Reputation", + "received": "Отримано", + "repOffset": "Корекція репутації", + "shareProfile": "Поділитися", + "shareProfileCopied": "Посилання скопійовано в буфер обміну!", + "topDonors": "Найбільші донори", + "topReceivers": "Кращі ресивери" + }, + "publicProfileView": { + "error": "Не вдалося завантажити профіль.", + "guildFooter": "Профіль на сайті {guild}", + "privateProfile": "Цей профіль є приватним.", + "rank": "Рейтинг", + "reputation": "Репутація" + }, "rank": "Ранг", + "ranking": "Рейтинг", + "rankingView": { + "advancedRankings": "Розширені рейтинги", + "given": "З огляду на", + "mode": "Режим", + "pageSize": "Розмір сторінки", + "received": "Отримано" + }, "reputation": "Репутація", + "tabs": { + "overview": "Огляд", + "profile": "Профіль", + "ranking": "Рейтинг" + }, "title": "Панель інструментів", "todayReputation": "Сьогоднішня репутація", "topChannel": "Топ-канал", @@ -676,6 +716,7 @@ "kofiHint": "або підтримайте нас на", "kofiLink": "Ко-фі", "message": "{name} зарезервовано для прихильників. Станьте прихильником, щоб ним користуватися.", + "perServer": "Функції активуються окремо для кожного сервера.", "requiredTierPlural": "Необхідний один із наступних рівнів підтримки:", "requiredTierSingular": "Необхідний рівень підтримки:", "title": "Функція підтримки", @@ -1034,6 +1075,7 @@ "noFeatures": "На даний момент функції недоступні.", "purchase": "Придбати", "purchaseSuccess": "Функція придбана успішно!", + "requiredTiers": "Рівні підтримки", "subscribe": "Підписатися", "subscribeSuccess": "Підписка активована!", "subscriptionActiveNote": "Ця функція наразі доступна за умови активної передплати.", @@ -1075,6 +1117,10 @@ "success": "Ваша електронна адреса була успішно підтверджена." } }, + "publicProfile": { + "description": "Дозволити іншим користувачам переглядати ваш профіль репутації, якщо вони не перебувають на тому самому сервері, що й ви.", + "label": "Публічний профіль" + }, "title": "Налаштування користувача", "voteGuild": { "description": "Виберіть, яка гільдія повинна отримувати жетони, коли ви голосуєте за бота. Це вплине тільки на майбутні голосування.", diff --git a/frontend/src/locales/zh-CN.json b/frontend/src/locales/zh-CN.json index 6fc16c7e5..41d1c0553 100644 --- a/frontend/src/locales/zh-CN.json +++ b/frontend/src/locales/zh-CN.json @@ -216,8 +216,48 @@ "save": "保存" }, "dashboard": { + "profile": "个人简介", + "profileView": { + "detailedProfile": "详细资料", + "error": "无法加载个人资料。", + "given": "鉴于", + "maxLevel": "已达到最高等级", + "mostGivenChannels": "最常被赠送的频道", + "mostReceivedChannels": "收看次数最多的频道", + "progress": "晋级下一关", + "rank": "排名:{rank}", + "rankGiven": "等级(已指定)", + "rankReceived": "排名(已收到)", + "rawReputation": "原始声誉", + "received": "已收到", + "repOffset": "声望抵消", + "shareProfile": "分享", + "shareProfileCopied": "链接已复制到剪贴板!", + "topDonors": "主要捐赠者", + "topReceivers": "顶尖接球手" + }, + "publicProfileView": { + "error": "无法加载个人资料。", + "guildFooter": "{guild} 个人资料", + "privateProfile": "该个人资料为私密状态。", + "rank": "排名", + "reputation": "声誉" + }, "rank": "等级", + "ranking": "排名", + "rankingView": { + "advancedRankings": "高级排名", + "given": "鉴于", + "mode": "模式", + "pageSize": "页面大小", + "received": "已收到" + }, "reputation": "声誉", + "tabs": { + "overview": "概述", + "profile": "个人简介", + "ranking": "排名" + }, "title": "仪表板", "todayReputation": "今日声誉", "topChannel": "顶级频道", @@ -676,6 +716,7 @@ "kofiHint": "或支持我们", "kofiLink": "柯菲", "message": "{name} 该功能仅限支持者使用。请成为支持者以启用此功能。", + "perServer": "功能的解锁以服务器为单位进行。", "requiredTierPlural": "需选择以下其中一个支持者等级:", "requiredTierSingular": "所需支持者等级:", "title": "支持者专访", @@ -1034,6 +1075,7 @@ "noFeatures": "目前没有可用功能。", "purchase": "购买", "purchaseSuccess": "功能购买成功!", + "requiredTiers": "支持者等级", "subscribe": "订阅", "subscribeSuccess": "订阅已启用!", "subscriptionActiveNote": "此功能目前通过有效订阅启用。", @@ -1075,6 +1117,10 @@ "success": "您的电子邮件已成功验证。" } }, + "publicProfile": { + "description": "允许其他用户查看您的声誉档案,即使他们与您不在同一服务器上。", + "label": "公开资料" + }, "title": "用户设置", "voteGuild": { "description": "投票给机器人时,请选择应获得代币的公会。此设置仅影响未来的投票。", diff --git a/frontend/src/main.ts b/frontend/src/main.ts index fa135ffa7..49430840c 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -70,7 +70,8 @@ import { faMagnifyingGlass, faGauge, faLock, - faClipboardList + faClipboardList, + faShareNodes } from '@fortawesome/free-solid-svg-icons' import {faGithub, faDiscord} from '@fortawesome/free-brands-svg-icons' @@ -136,7 +137,8 @@ library.add( faMagnifyingGlass, faGauge, faLock, - faClipboardList + faClipboardList, + faShareNodes ) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index a8bedb142..684503be5 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -19,7 +19,30 @@ const routes: RouteRecordRaw[] = [ { path: 'dashboard', name: 'GuildDashboard', - component: () => import('@/views/guild/DashboardView.vue') + component: () => import('@/views/guild/DashboardView.vue'), + redirect: '/guild/dashboard/overview', + children: [ + { + path: 'overview', + name: 'GuildDashboardOverview', + component: () => import('@/views/guild/OverviewView.vue') + }, + { + path: 'ranking', + name: 'GuildDashboardRanking', + component: () => import('@/views/guild/RankingView.vue') + }, + { + path: 'profile', + name: 'GuildDashboardProfile', + component: () => import('@/views/guild/ProfileView.vue') + }, + { + path: 'profile/:userId', + name: 'GuildDashboardUserProfile', + component: () => import('@/views/guild/ProfileView.vue') + } + ] }, { path: 'token-shop', @@ -28,6 +51,11 @@ const routes: RouteRecordRaw[] = [ } ] }, + { + path: '/public/profile/:guildId/:userId', + name: 'PublicProfile', + component: () => import('@/views/public/PublicProfileView.vue') + }, { path: '/settings', name: 'Settings', diff --git a/frontend/src/views/guild/DashboardView.vue b/frontend/src/views/guild/DashboardView.vue index 64d8aa769..ebcfc8458 100644 --- a/frontend/src/views/guild/DashboardView.vue +++ b/frontend/src/views/guild/DashboardView.vue @@ -4,60 +4,38 @@ * Copyright (C) RainbowDashLabs and Contributor */ diff --git a/frontend/src/views/guild/OverviewView.vue b/frontend/src/views/guild/OverviewView.vue new file mode 100644 index 000000000..054ca84e4 --- /dev/null +++ b/frontend/src/views/guild/OverviewView.vue @@ -0,0 +1,61 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + + + diff --git a/frontend/src/views/guild/ProfileView.vue b/frontend/src/views/guild/ProfileView.vue new file mode 100644 index 000000000..97ff881c9 --- /dev/null +++ b/frontend/src/views/guild/ProfileView.vue @@ -0,0 +1,22 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + + + diff --git a/frontend/src/views/guild/RankingView.vue b/frontend/src/views/guild/RankingView.vue new file mode 100644 index 000000000..48b6ddd6d --- /dev/null +++ b/frontend/src/views/guild/RankingView.vue @@ -0,0 +1,191 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + + + diff --git a/frontend/src/views/guild/components/ChannelList.vue b/frontend/src/views/guild/components/ChannelList.vue new file mode 100644 index 000000000..eeb9eaea2 --- /dev/null +++ b/frontend/src/views/guild/components/ChannelList.vue @@ -0,0 +1,47 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + + + diff --git a/frontend/src/views/guild/components/RankingList.vue b/frontend/src/views/guild/components/RankingList.vue new file mode 100644 index 000000000..a79446daf --- /dev/null +++ b/frontend/src/views/guild/components/RankingList.vue @@ -0,0 +1,64 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + + + diff --git a/frontend/src/views/guild/components/TopUsersTable.vue b/frontend/src/views/guild/components/TopUsersTable.vue index e04b5fba6..effaa1bf4 100644 --- a/frontend/src/views/guild/components/TopUsersTable.vue +++ b/frontend/src/views/guild/components/TopUsersTable.vue @@ -13,6 +13,10 @@ defineProps<{ entries: RankingEntryPOJO[] }>() +const emit = defineEmits<{ + (e: 'click-member', memberId: string): void +}>() + const {t} = useI18n() @@ -38,7 +42,8 @@ const {t} = useI18n() + class="hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors cursor-pointer" + @click="emit('click-member', entry.member.id)"> #{{ entry.rank }} diff --git a/frontend/src/views/guild/components/UserProfile.vue b/frontend/src/views/guild/components/UserProfile.vue new file mode 100644 index 000000000..70a2f0e5b --- /dev/null +++ b/frontend/src/views/guild/components/UserProfile.vue @@ -0,0 +1,287 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + + + diff --git a/frontend/src/views/public/PublicProfileView.vue b/frontend/src/views/public/PublicProfileView.vue new file mode 100644 index 000000000..a8cb38a4a --- /dev/null +++ b/frontend/src/views/public/PublicProfileView.vue @@ -0,0 +1,92 @@ +/* + * SPDX-License-Identifier: AGPL-3.0-only + * + * Copyright (C) RainbowDashLabs and Contributor + */ + + + + + diff --git a/frontend/src/views/user/UserSettingsView.vue b/frontend/src/views/user/UserSettingsView.vue index 58e74f2f2..b4b0e0b39 100644 --- a/frontend/src/views/user/UserSettingsView.vue +++ b/frontend/src/views/user/UserSettingsView.vue @@ -12,11 +12,13 @@ import ViewContainer from '@/components/ViewContainer.vue' import SettingsContainer from '../settings/components/SettingsContainer.vue' import LoginPanel from '../settings/components/LoginPanel.vue' import UserMailsSection from './components/UserMailsSection.vue' +import Toggle from '@/components/Toggle.vue' const { t } = useI18n() const { userSession } = useSession() const voteGuild = ref('0') +const publicProfile = ref(false) const loading = ref(true) const guilds = computed(() => { @@ -28,6 +30,7 @@ onMounted(async () => { try { const settings = await api.getUserSettings() voteGuild.value = settings.voteGuild + publicProfile.value = settings.publicProfile } catch (error) { console.error('Failed to fetch user settings:', error) } finally { @@ -37,11 +40,19 @@ onMounted(async () => { const updateVoteGuild = async () => { try { - await api.updateUserSettings({ voteGuild: voteGuild.value }) + await api.updateUserVoteGuild(voteGuild.value) } catch (error) { console.error('Failed to update vote guild:', error) } } + +const updatePublicProfile = async () => { + try { + await api.updateUserPublicProfile(publicProfile.value) + } catch (error) { + console.error('Failed to update public profile:', error) + } +}