Skip to content

Commit

Permalink
More translations for welcome message, W.I.P. ProtocolLib message inj…
Browse files Browse the repository at this point in the history
…ection
  • Loading branch information
DoggySazHi committed Feb 17, 2024
1 parent 153a78a commit 49f7831
Show file tree
Hide file tree
Showing 5 changed files with 226 additions and 54 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

package net.gensokyoreimagined.motoori;

import org.jetbrains.annotations.Nullable;

public class KosuzuDatabaseModels {
public static class Language {
private final String code;
Expand All @@ -31,4 +33,36 @@ public Language(String code, String nativeName, String englishName) {
public String getNativeName() { return nativeName; }
public String getEnglishName() { return englishName; }
}

public static class Message {
private final String messageJson;
private final String textMessage;
private @Nullable String translatedTextLanguageCode;
private @Nullable String translatedTextMessage;
private final String languageCode;

public Message(String messageJson, String textMessage, @Nullable String translatedTextLanguageCode, @Nullable String translatedTextMessage, String languageCode) {
this.messageJson = messageJson;
this.textMessage = textMessage;
this.translatedTextLanguageCode = translatedTextLanguageCode;
this.translatedTextMessage = translatedTextMessage;
this.languageCode = languageCode;
}

public String getMessageJson() { return messageJson; }

public String getTextMessage() { return textMessage; }

public @Nullable String getTranslatedTextMessage() { return translatedTextMessage; }

public void loadTranslatedTextMessage(KosuzuTranslatesEverything translator) {
if (translatedTextLanguageCode != null && translatedTextMessage != null) {
return;
}

var translation = translator.translate(textMessage, languageCode);
translatedTextLanguageCode = translation.detectedSourceLanguage;
translatedTextMessage = translation.text;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ public Collection<Language> getLanguages() {

public @Nullable String getMessage(@NotNull UUID message) {
try (var connection = getConnection()) {
try (var statement = connection.prepareStatement("SELECT `text` FROM `message` WHERE `message_id` = ?")) {
try (var statement = connection.prepareStatement("SELECT `text` FROM `user_message` WHERE `message_id` = ?")) {
statement.setString(1, message.toString());
var result = statement.executeQuery();
if (result.next()) {
Expand All @@ -353,6 +353,14 @@ public Collection<Language> getLanguages() {
// First cache the message, if necessary
// Then add the JSON to the database separately (player-specific)

try (var statement = connection.prepareStatement("SELECT uuid FROM `user_message` WHERE `json` = ?")) {
statement.setString(1, json);
var data = statement.executeQuery();
if (data.next()) {
return UUID.fromString(data.getString("uuid"));
}
}

UUID messageUUID = null;

try (var statement = connection.prepareStatement("SELECT message_id FROM `message` WHERE `text` = ?")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import io.papermc.paper.event.player.AsyncChatEvent;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
Expand All @@ -40,10 +41,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import java.util.logging.Logger;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -80,37 +78,6 @@ public void onPacketSending(PacketEvent event) {
prepareRegexes(kosuzu.getConfig());
}

// To be deprecated, replaced by ProtocolLib
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerMessage(@NotNull AsyncChatEvent event) {
// problem with eager translation: can't adjust the message

event.message(
event
.message()
.hoverEvent(
Component
.text("Click to translate")
.color(NamedTextColor.GRAY)
)
.clickEvent(
ClickEvent.callback(
(player) -> translateCallback(event, player),
ClickCallback.Options.builder().uses(69420).build()
)
)
);
}

// Called by ProtocolLib
private void onPacketSending(PacketEvent event, boolean isSystem) {
var player = event.getPlayer();
var packet = event.getPacket();
var message = packet.getChatComponents().read(0);
var component = JSONComponentSerializer.json().deserialize(message.getJson()); // Adventure API from raw JSON
// logger.info("A CHAT EVENT TO " + player.getName() + ": " + getTextMessage(component, isSystem, player));
}

private void prepareRegexes(@NotNull FileConfiguration config) {
var regexes = config.getStringList("match.include");

Expand All @@ -125,6 +92,35 @@ private void prepareRegexes(@NotNull FileConfiguration config) {
logger.info("Prepared " + this.regexes.size() + " regexes");
}

// Called by ProtocolLib
private void onPacketSending(PacketEvent event, boolean isSystem) {
var player = event.getPlayer();
var packet = event.getPacket();
var message = packet.getChatComponents().read(0);
var json = message.getJson();
var component = JSONComponentSerializer.json().deserialize(json); // Adventure API from raw JSON
var text = getTextMessage(component, isSystem, player);

if (text != null) {
var uuid = database.addMessage(json, text, player.getUniqueId());

if (uuid != null) {
var newComponent = component.hoverEvent(
Component
.text("Click to translate")
.color(NamedTextColor.GRAY)
)
.clickEvent(
ClickEvent.runCommand("/kosuzu translate " + uuid)
);

var newJson = JSONComponentSerializer.json().serialize(newComponent);

packet.getChatComponents().write(0, WrappedChatComponent.fromJson(newJson));
}
}
}

/**
* Extracts the text message from a chat component
* Also determines if we should translate the message
Expand All @@ -136,8 +132,6 @@ private void prepareRegexes(@NotNull FileConfiguration config) {
private @Nullable String getTextMessage(Component component, boolean isSystem, Player player) {
var text = PlainTextComponentSerializer.plainText().serialize(component);

logger.info("TEXT: " + text);

if (!isSystem) {
return text;
}
Expand Down Expand Up @@ -171,27 +165,35 @@ public void onPlayerJoin(@NotNull PlayerJoinEvent event) {
var name = player.getName();


// TODO translate this message
if (database.isNewUser(uuid, name)) {
String welcome;

var country = geolocation.getCountryCode(player);

if (country == null) {
welcome = database.getTranslation("welcome.new", null);
} else {
if (Objects.equals(country, "CN")) country = "ZH"; // Special case for China
if (Objects.equals(country, "TW")) country = "ZH"; // Special case for Taiwan
if (Objects.equals(country, "HK")) country = "ZH"; // Special case for Hong Kong
if (Objects.equals(country, "JP")) country = "JA"; // Special case for Japan
if (Objects.equals(country, "GB")) country = "EN-GB"; // Special case for England
if (Objects.equals(country, "US")) country = "EN-US"; // Special case for United States

if (country != null) {
// Extra searching for languages
var languages = database.getLanguages();
var language = languages.stream().map(KosuzuDatabaseModels.Language::getCode).filter(code -> code.toUpperCase().contains(country.toUpperCase())).findFirst().orElse(null);
welcome = database.getTranslation("welcome.new", language);
String finalCountry = country;
country = languages.stream().map(KosuzuDatabaseModels.Language::getCode).filter(code -> code.toUpperCase().contains(finalCountry.toUpperCase())).findFirst().orElse(null);
}

try {
database.setUserDefaultLanguage(uuid, country);
} catch (Exception e) {
logger.warning("Failed to set default language for " + name + " (" + uuid + ") to " + country + ": " + e.getMessage());
}

player.sendMessage(
Kosuzu.HEADER
.append(Component.text("Welcome to the server, " + name + "!", NamedTextColor.GRAY))
.append(Component.text(database.getTranslation("welcome.first", country).replace("%username%", name), NamedTextColor.GRAY))
.append(Component.newline())
.append(Component.text("Your default language is " + database.getUserDefaultLanguage(uuid) + ".", NamedTextColor.GRAY))
.append(Component.text(database.getTranslation("welcome.second", country), NamedTextColor.GRAY))
.append(Component.newline())
.append(Component.text("Use /kosuzu default to change your settings.", NamedTextColor.GRAY))
.append(Component.text(database.getTranslation("welcome.third", country), NamedTextColor.GRAY))
);
}
}
Expand Down
5 changes: 2 additions & 3 deletions src/main/resources/dbinit.sql
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,11 @@ CREATE UNIQUE INDEX `message_translation_index` ON `message_translation` (`messa
CREATE TABLE IF NOT EXISTS `user_message`
(
`uuid` VARCHAR(36) NOT NULL, -- Surrogate key
`user_id` VARCHAR(36) NOT NULL, -- To which user this message belongs
`message_id` VARCHAR(36) NOT NULL, -- To which message this translation belongs
`json_msg` JSON NOT NULL, -- The JSON message from Minecraft
PRIMARY KEY (`uuid`),
FOREIGN KEY (`user_id`) REFERENCES `user` (`uuid`) ON DELETE CASCADE,
FOREIGN KEY (`message_id`) REFERENCES `message` (`message_id`) ON DELETE CASCADE
);

CREATE UNIQUE INDEX `user_message_index` ON `user_message` (`user_id`, `message_id`);
CREATE INDEX `user_message_index` ON `user_message` (`message_id`);
CREATE UNIQUE INDEX `user_message_json_index` ON `user_message` (`json_msg`);
131 changes: 130 additions & 1 deletion src/main/resources/translations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,38 @@ language:
UK: "Неправильний вибір мови"
ZH: "语言选择无效"
translate:
click:
BG: "Кликнете, за да преведете"
CS: "Klikněte pro překlad"
DA: "Klik for at oversætte"
DE: "Klicken Sie zum Übersetzen"
EL: "Κάντε κλικ για να μεταφράσετε"
EN-GB: "Click to translate"
EN-US: "Click to translate"
ES: "Haga clic para traducir"
ET: "Klõpsake tõlkimiseks"
FI: "Klikkaa kääntääksesi"
FR: "Cliquez pour traduire"
HU: "Kattintson a fordításhoz"
ID: "Klik untuk menerjemahkan"
IT: "Clicca per tradurre"
JA: "クリックして翻訳する"
KO: "번역하려면 클릭"
LT: "Spustelėkite norėdami išversti"
LV: "Noklikšķiniet, lai tulkotu"
NB: "Klikk for å oversette"
NL: "Klik om te vertalen"
PL: "Kliknij, aby przetłumaczyć"
PT-BR: "Clique para traduzir"
PT-PT: "Clique para traduzir"
RO: "Faceți clic pentru a traduce"
RU: "Нажмите, чтобы перевести"
SK: "Kliknutím preložíte"
SL: "Kliknite za prevod"
SV: "Klicka för att översätta"
TR: "Çevirmek için tıklayın"
UK: "Натисніть, щоб перекласти"
ZH: "点击翻译"
fail:
BG: "Не успя да преведе"
CS: "Nepodařilo se přeložit"
Expand Down Expand Up @@ -160,4 +192,101 @@ translate:
SV: "Misslyckades med översättningen"
TR: "Tercüme edilemedi"
UK: "Не вдалося перекласти"
ZH: "翻译失败"
ZH: "翻译失败"
welcome:
first:
BG: "Добре дошъл в сървъра, %username%!"
CS: "Vítej na serveru, %username%!"
DA: "Velkommen til serveren, %username%!"
DE: "Willkommen auf dem Server, %username%!"
EL: "Καλώς ήρθες στον διακομιστή, %username%!"
EN-GB: "Welcome to the server, %username%!"
EN-US: "Welcome to the server, %username%!"
ES: "¡Bienvenido al servidor, %username%!"
ET: "Tere tulemast serverisse, %username%!"
FI: "Tervetuloa palvelimelle, %username%!"
FR: "Bienvenue sur le serveur, %username% !"
HU: "Üdvözöllek a szerveren, %username%!"
ID: "Selamat datang di server, %username%!"
IT: "Benvenuto sul server, %username%!"
JA: "%username%、サーバーへようこそ!"
KO: "%username% 서버에 오신 것을 환영합니다!"
LT: "Sveiki atvykę į serverį, %username%!"
LV: "Laipni lūdzam uz servera, %username%!"
NB: "Velkommen til serveren, %username%!"
NL: "Welkom op de server, %username%!"
PL: "Witamy na serwerze, %username%!"
PT-BR: "Bem-vindo ao servidor, %username%!"
PT-PT: "Bem-vindo ao servidor, %username%!"
RO: "Bine ați venit pe server, %username%!"
RU: "Добро пожаловать на сервер, %username%!"
SK: "Vitaj na serveri, %username%!"
SL: "Dobrodošel na strežniku, %username%!"
SV: "Välkommen till servern, %username%!"
TR: "Sunucuya hoş geldin, %username%!"
UK: "Ласкаво просимо на сервер, %username%!"
ZH: "欢迎来到服务器,%username%!"
second:
BG: "Вашият език по подразбиране е български."
CS: "Výchozím jazykem je čeština."
DA: "Dit standardsprog er dansk."
DE: "Ihre Standardsprache ist Deutsch."
EL: "Η προεπιλεγμένη γλώσσα σας είναι τα ελληνικά."
EN-GB: "Your default language is English (British)."
EN-US: "Your default language is English (American)."
ES: "Tu idioma por defecto es el español."
ET: "Teie vaikimisi keel on eesti keel."
FI: "Oletuskielesi on suomi."
FR: "Votre langue par défaut est le français."
HU: "Az alapértelmezett nyelv a magyar."
ID: "Bahasa default Anda adalah bahasa Indonesia."
IT: "La lingua predefinita è l'italiano."
JA: "デフォルトの言語は日本語です。"
KO: "기본 언어는 한국어입니다."
LT: "Numatytoji kalba yra lietuvių."
LV: "Jūsu noklusējuma valoda ir latviešu valoda."
NB: "Standardspråket ditt er norsk (bokmål)."
NL: "Je standaardtaal is Nederlands."
PL: "Domyślnym językiem jest polski."
PT-BR: "Seu idioma padrão é o português (brasileiro)."
PT-PT: "A língua predefinida é o português (outro)."
RO: "Limba implicită este limba română."
RU: "Ваш язык по умолчанию - русский."
SK: "Váš predvolený jazyk je slovenčina."
SL: "Vaš privzeti jezik je slovenščina."
SV: "Ditt standardspråk är svenska."
TR: "Varsayılan diliniz Türkçe'dir."
UK: "Мова за замовчуванням - українська."
ZH: "您的默认语言是简体中文。"
third:
BG: "Използвайте \"/kosuzu default\", за да промените настройките си."
CS: "Pro změnu nastavení použijte příkaz \"/kosuzu default\"."
DA: "Brug \"/kosuzu default\" til at ændre dine indstillinger."
DE: "Verwenden Sie \"/kosuzu default\", um Ihre Einstellungen zu ändern."
EL: "Χρησιμοποιήστε το \"/kosuzu default\" για να αλλάξετε τις ρυθμίσεις σας."
EN-GB: "Use \"/kosuzu default\" to change your settings."
EN-US: "Use \"/kosuzu default\" to change your settings."
ES: "Utiliza \"/kosuzu default\" para cambiar la configuración."
ET: "Kasutage \"/kosuzu default\", et muuta oma seadeid."
FI: "Käytä \"/kosuzu default\" muuttaaksesi asetuksia."
FR: "Utilisez \"/kosuzu default\" pour modifier vos paramètres."
HU: "A \"/kosuzu default\" paranccsal megváltoztathatja a beállításokat."
ID: "Gunakan \"/kosuzu default\" untuk mengubah pengaturan Anda."
IT: "Utilizzare \"/kosuzu default\" per modificare le impostazioni."
JA: "設定を変更するには「/kosuzu default」を使う。"
KO: "\"/kosuzu default\"를 사용하여 설정을 변경합니다."
LT: "Norėdami pakeisti nustatymus, naudokite \"/kosuzu default\"."
LV: "Lai mainītu iestatījumus, izmantojiet \"/kosuzu default\"."
NB: "Bruk \"/kosuzu default\" for å endre innstillingene."
NL: "Gebruik \"/kosuzu default\" om je instellingen te wijzigen."
PL: "Użyj \"/kosuzu default\", aby zmienić ustawienia."
PT-BR: "Use \"/kosuzu default\" para alterar suas configurações."
PT-PT: "Utilize \"/kosuzu default\" para alterar as suas definições."
RO: "Utilizați \"/kosuzu default\" pentru a schimba setările."
RU: "Используйте \"/kosuzu default\", чтобы изменить настройки."
SK: "Na zmenu nastavení použite príkaz \"/kosuzu default\"."
SL: "Za spremembo nastavitev uporabite \"/kosuzu default\"."
SV: "Använd \"/kosuzu default\" för att ändra dina inställningar."
TR: "Ayarlarınızı değiştirmek için \"/kosuzu default\" kullanın."
UK: "Використовуйте \"/kosuzu default\" для зміни налаштувань."
ZH: "使用 \"/kosuzu default\" 更改设置。"

0 comments on commit 49f7831

Please sign in to comment.