From d944d19193c9d2826239fbc43e2a54a656f19b97 Mon Sep 17 00:00:00 2001 From: jbergner Date: Tue, 12 Aug 2025 19:40:12 +0200 Subject: [PATCH] RC-1.0 --- Dockerfile | 4 +- language.json | 104 ++++++++++++++++++++++++++++++++++++++++++++++++-- main.go | 48 +++++++++++++---------- 3 files changed, 129 insertions(+), 27 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0565a97..301fb0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,10 +15,10 @@ FROM alpine:3.22 RUN apk add --no-cache ca-certificates #RUN mkdir /data #RUN mkdir /dynamicsrc -#RUN mkdir /tempsrc +RUN mkdir /tempsrc COPY --from=builder /bin/autovoice /bin/autovoice #COPY ./static /data/static -# COPY ./static /tempsrc/static +COPY ./language.json /tempsrc/language.json #COPY ./dynamicsrc /dynamicsrc # Default listens on :8080 – siehe main.go diff --git a/language.json b/language.json index 8f82f34..57d75ca 100644 --- a/language.json +++ b/language.json @@ -6,15 +6,111 @@ "system.default.lobbyname": "➕ Erstelle privaten Raum", "system.default.category": "Private Räume", "system.log.initdb.01": "Datenbank-Fehler: %v", - "system.log.initdb.02": "Fehler beim Erstellen der Tabelle: %v" + "system.log.initdb.02": "Fehler beim Erstellen der Tabelle: %v", + "response.voicechannel.created": "✅ Voice-Channel **%s** erstellt.", + "response.voicechannel.created.notinvoice": " Du bist aktuell in keinem Voice-Channel; join bitte manuell in deinen neuen Raum.", + "response.voicechannel.created.move": " Ich verschiebe dich jetzt dort hinein.", + "response.setlobby.onlyadmins": "❌ Nur Administratoren dürfen das.", + "response.setlobby.pleaseentername": "Bitte gib einen Namen an.", + "response.setlobby.error.saving": "⚠️ Lobby-Name gesetzt, aber Speichern fehlgeschlagen. Schau die Logs.", + "response.setlobby.success": "✅ Lobby-Name aktualisiert auf: %s", + "response.setcategory.onlyadmins": "❌ Nur Administratoren dürfen das.", + "response.setcategory.error.name":"Bitte gib einen Namen an.", + "response.setcategory.error.saving": "⚠️ Kategorie-Name gesetzt, aber Speichern fehlgeschlagen. Schau die Logs.", + "response.setcategory.success": "✅ Kategorie-Name aktualisiert auf: %s", + "response.settimeout.onlyadmins": "❌ Nur Administratoren dürfen das.", + "response.settimeout.error.saving": "⚠️ Timeout gesetzt, aber Speichern fehlgeschlagen. Schau die Logs.", + "response.settimeout.success": "✅ Timeout auf %d Minuten gesetzt.", + "response.adduser.error.user": "Bitte gib ein gültiges Mitglied an.", + "response.adduser.error.notinvoice": "Du bist aktuell in keinem Voice-Channel. Betritt zuerst deinen privaten Channel.", + "response.adduser.error.notowner": "❌ Du bist nicht der Besitzer dieses Channels oder dir fehlen Rechte (Manage Channel).", + "response.adduser.error.setpermissions": "Konnte Berechtigung nicht setzen: %v", + "response.adduser.success": "✅ %s hat jetzt Zugriff auf deinen Voice-Channel." } }, { "language": "en", "messages": { - "hello": "Hallo, %s!", - "goodbye": "Tschüss, %s!" + "system.default.lobbyname": "➕ Create private room", + "system.default.category": "Private Rooms", + "system.log.initdb.01": "Database error: %v", + "system.log.initdb.02": "Error creating table: %v", + "response.voicechannel.created": "✅ Voice channel **%s** created.", + "response.voicechannel.created.notinvoice": " You are currently not in a voice channel; please manually join your new room.", + "response.voicechannel.created.move": " I will now move you there.", + "response.setlobby.onlyadmins": "❌ Only administrators are allowed to do this.", + "response.setlobby.pleaseentername": "Please enter a name.", + "response.setlobby.error.saving": "⚠️ Lobby name set, but saving failed. Check the logs.", + "response.setlobby.success": "✅ Lobby name updated to: %s", + "response.setcategory.onlyadmins": "❌ Only administrators are allowed to do this.", + "response.setcategory.error.name":"Please enter a name.", + "response.setcategory.error.saving": "⚠️ Category name set, but saving failed. Check the logs.", + "response.setcategory.success": "✅ Category name updated to: %s", + "response.settimeout.onlyadmins": "❌ Only administrators are allowed to do this.", + "response.settimeout.error.saving": "⚠️ Timeout set, but saving failed. Check the logs.", + "response.settimeout.success": "✅ Timeout set to %d minutes.", + "response.adduser.error.user": "Please enter a valid member.", + "response.adduser.error.notinvoice": "You are currently not in a voice channel. Please join your private channel first.", + "response.adduser.error.notowner": "❌ You are not the owner of this channel or you lack permissions (Manage Channel).", + "response.adduser.error.setpermissions": "Could not set permissions: %v", + "response.adduser.success": "✅ %s now has access to your voice channel." + } + }, + { + "language": "fr", + "messages": { + "system.default.lobbyname": "➕ Créer une salle privée", + "system.default.category": "Salles privées", + "system.log.initdb.01": "Erreur de base de données: %v", + "system.log.initdb.02": "Erreur lors de la création de la table: %v", + "response.voicechannel.created": "✅ Canal vocal **%s** créé.", + "response.voicechannel.created.notinvoice": " Vous n'êtes actuellement dans aucun canal vocal; veuillez rejoindre manuellement votre nouvelle salle.", + "response.voicechannel.created.move": " Je vais maintenant vous déplacer dans ce canal.", + "response.setlobby.onlyadmins": "❌ Seuls les administrateurs sont autorisés à faire cela.", + "response.setlobby.pleaseentername": "Veuillez entrer un nom.", + "response.setlobby.error.saving": "⚠️ Nom du salon défini, mais échec de l'enregistrement. Vérifiez les journaux.", + "response.setlobby.success": "✅ Nom du salon mis à jour en: %s", + "response.setcategory.onlyadmins": "❌ Seuls les administrateurs sont autorisés à faire cela.", + "response.setcategory.error.name":"Veuillez entrer un nom.", + "response.setcategory.error.saving": "⚠️ Nom de la catégorie défini, mais échec de l'enregistrement. Vérifiez les journaux.", + "response.setcategory.success": "✅ Nom de la catégorie mis à jour en: %s", + "response.settimeout.onlyadmins": "❌ Seuls les administrateurs sont autorisés à faire cela.", + "response.settimeout.error.saving": "⚠️ Délai d'attente défini, mais échec de l'enregistrement. Vérifiez les journaux.", + "response.settimeout.success": "✅ Délai d'attente défini sur %d minutes.", + "response.adduser.error.user": "Veuillez entrer un membre valide.", + "response.adduser.error.notinvoice": "Vous n'êtes actuellement dans aucun canal vocal. Veuillez rejoindre votre canal privé d'abord.", + "response.adduser.error.notowner": "❌ Vous n'êtes pas le propriétaire de ce canal ou vous n'avez pas les droits nécessaires (Gérer le canal).", + "response.adduser.error.setpermissions": "Impossible de définir les permissions: %v", + "response.adduser.success": "✅ %s a maintenant accès à votre canal vocal." + } + }, + { + "language": "es", + "messages": { + "system.default.lobbyname": "➕ Crear sala privada", + "system.default.category": "Salas privadas", + "system.log.initdb.01": "Error en la base de datos: %v", + "system.log.initdb.02": "Error al crear la tabla: %v", + "response.voicechannel.created": "✅ Canal de voz **%s** creado.", + "response.voicechannel.created.notinvoice": " Actualmente no estás en un canal de voz; por favor, únete manualmente a tu nueva sala.", + "response.voicechannel.created.move": " Ahora te moveré allí.", + "response.setlobby.onlyadmins": "❌ Solo los administradores pueden hacer esto.", + "response.setlobby.pleaseentername": "Por favor, ingresa un nombre.", + "response.setlobby.error.saving": "⚠️ Nombre de sala configurado, pero falló el guardado. Revisa los registros.", + "response.setlobby.success": "✅ Nombre de sala actualizado a: %s", + "response.setcategory.onlyadmins": "❌ Solo los administradores pueden hacer esto.", + "response.setcategory.error.name":"Por favor, ingresa un nombre.", + "response.setcategory.error.saving": "⚠️ Nombre de la categoría configurado, pero falló el guardado. Revisa los registros.", + "response.setcategory.success": "✅ Nombre de la categoría actualizado a: %s", + "response.settimeout.onlyadmins": "❌ Solo los administradores pueden hacer esto.", + "response.settimeout.error.saving": "⚠️ Tiempo de espera configurado, pero falló el guardado. Revisa los registros.", + "response.settimeout.success": "✅ Tiempo de espera configurado a %d minutos.", + "response.adduser.error.user": "Por favor, ingresa un miembro válido.", + "response.adduser.error.notinvoice": "Actualmente no estás en ningún canal de voz. Únete primero a tu canal privado.", + "response.adduser.error.notowner": "❌ No eres el propietario de este canal o te faltan permisos (Gestionar Canal).", + "response.adduser.error.setpermissions": "No se pudieron configurar los permisos: %v", + "response.adduser.success": "✅ %s ahora tiene acceso a tu canal de voz." } } ] -} \ No newline at end of file +} diff --git a/main.go b/main.go index 848b0ff..7c4eb3d 100644 --- a/main.go +++ b/main.go @@ -99,6 +99,7 @@ func setLanguage(guildID, language string) error { // Sprachabruf func getLanguage(guildID string) string { cfg := getCfg(guildID) + //fmt.Println("Debug: Language:", cfg.Language) return cfg.Language } @@ -720,11 +721,12 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{Content: "Konnte Voice-Channel nicht erstellen. Fehlen dem Bot Rechte (Manage Channels/Move Members)?", Flags: discordgo.MessageFlagsEphemeral}}) return } - msg := fmt.Sprintf("✅ Voice-Channel **%s** erstellt.", newChan.Name) + + msg := fmt.Sprintf(translations[getLanguage(guildID)]["response.voicechannel.created"], newChan.Name) if srcVC == "" { - msg += " Du bist aktuell in keinem Voice-Channel; join bitte manuell in deinen neuen Raum." + msg += translations[getLanguage(guildID)]["response.voicechannel.created.notinvoice"] } else { - msg += " Ich verschiebe dich jetzt dort hinein." + msg += translations[getLanguage(guildID)]["response.voicechannel.created.move"] } _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{Content: msg, Flags: discordgo.MessageFlagsEphemeral}}) @@ -734,7 +736,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "❌ Nur Administratoren dürfen das.", + Content: translations[getLanguage(guildID)]["response.setlobby.onlyadmins"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -753,7 +755,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "Bitte gib einen Namen an.", + Content: translations[getLanguage(guildID)]["response.setlobby.pleaseentername"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -767,7 +769,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "⚠️ Lobby-Name gesetzt, aber Speichern fehlgeschlagen. Schau die Logs.", + Content: translations[getLanguage(guildID)]["response.setlobby.error.saving"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -775,10 +777,11 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter } // Antwort <= 3s + msg := fmt.Sprintf(translations[getLanguage(guildID)]["response.setlobby.success"], name) _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "✅ Lobby-Name aktualisiert auf: " + name, + Content: msg, Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -789,7 +792,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "❌ Nur Administratoren dürfen das.", + Content: translations[getLanguage(guildID)]["response.setcategory.onlyadmins"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -808,7 +811,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "Bitte gib einen Namen an.", + Content: translations[getLanguage(guildID)]["response.setcategory.error.name"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -822,7 +825,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "⚠️ Kategorie-Name gesetzt, aber Speichern fehlgeschlagen. Schau die Logs.", + Content: translations[getLanguage(guildID)]["response.setcategory.error.saving"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -830,10 +833,11 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter } // Antwort <= 3s + msg := fmt.Sprintf(translations[getLanguage(guildID)]["response.setcategory.success"], name) _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "✅ Kategorie-Name aktualisiert auf: " + name, + Content: msg, Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -844,7 +848,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "❌ Nur Administratoren dürfen das.", + Content: translations[getLanguage(guildID)]["response.settimeout.onlyadmins"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -870,7 +874,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "⚠️ Timeout gesetzt, aber Speichern fehlgeschlagen. Schau die Logs.", + Content: translations[getLanguage(guildID)]["response.settimeout.error.saving"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -878,10 +882,11 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter } // Antwort <= 3s + msg := fmt.Sprintf(translations[getLanguage(guildID)]["response.settimeout.success"], minutes) _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: fmt.Sprintf("✅ Timeout auf %d Minuten gesetzt.", minutes), + Content: msg, Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -911,7 +916,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "Bitte gib ein gültiges Mitglied an.", + Content: translations[getLanguage(guildID)]["response.adduser.error.user"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -924,7 +929,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "Du bist aktuell in keinem Voice-Channel. Betritt zuerst deinen privaten Channel.", + Content: translations[getLanguage(guildID)]["response.adduser.error.notinvoice"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -938,7 +943,7 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: "❌ Du bist nicht der Besitzer dieses Channels oder dir fehlen Rechte (Manage Channel).", + Content: translations[getLanguage(guildID)]["response.adduser.error.notowner"], Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -960,20 +965,21 @@ func onInteractionCreate(_ string) func(s *discordgo.Session, i *discordgo.Inter allow, 0, ); err != nil { + msg := fmt.Sprintf(translations[getLanguage(guildID)]["response.adduser.error.setpermissions"], err) _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: fmt.Sprintf("Konnte Berechtigung nicht setzen: %v", err), + Content: msg, Flags: discordgo.MessageFlagsEphemeral, }, }) return } - + msg := fmt.Sprintf(translations[getLanguage(guildID)]["response.adduser.success"], target.Username) _ = s.InteractionRespond(i.Interaction, &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ - Content: fmt.Sprintf("✅ %s hat jetzt Zugriff auf deinen Voice-Channel.", target.Username), + Content: msg, Flags: discordgo.MessageFlagsEphemeral, }, }) @@ -1257,7 +1263,7 @@ func Enabled(k string, def bool) bool { func main() { initDB() - loadTranslationsFromFile(GetENV("TRANSLATIONS_FILE", "./language.json")) + translations, _ = loadTranslationsFromFile(GetENV("TRANSLATIONS_FILE", "/tempsrc/language.json")) token := GetENV("DISCORD_TOKEN", "") if token == "" { log.Fatal("Bitte setze DISCORD_TOKEN")