From be5024290920c1899caf2dfdd957761d4043c0a0 Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Sat, 29 Jun 2019 23:02:11 +0100 Subject: [PATCH 1/8] Initial push for Chat Translation Plugin. --- runelite-client/pom.xml | 5 + .../ChatTranslationConfig.java | 32 ++++ .../ChatTranslationPlugin.java | 154 ++++++++++++++++++ .../plugins/chattranslation/Languages.java | 23 +++ .../plugins/chattranslation/Translator.java | 44 +++++ 5 files changed, 258 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 70c5c83000..98b1c9529c 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -284,6 +284,11 @@ asm-all 6.0_BETA + + org.json + json + 20180813 + diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java new file mode 100644 index 0000000000..bf0e7a532b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -0,0 +1,32 @@ +package net.runelite.client.plugins.chattranslation; + +import net.runelite.client.config.Config; +import net.runelite.client.config.ConfigGroup; +import net.runelite.client.config.ConfigItem; + +@ConfigGroup("chattranslation") +public interface ChatTranslationConfig extends Config +{ + + @ConfigItem( + keyName = "publicChat", + name = "Translate All Public Chat?", + description = "Would you like to Translate Public Chat?", + position = 0 + ) + default boolean publicChat() { return false; } + + @ConfigItem( + keyName = "targetLanguage", + name = "Target Language", + description = "Language to translate messages too.", + position = 2, + hidden = true, + unhide = "publicChat" + ) + default Languages targetLanguage() + { + return Languages.ENGLISH; + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java new file mode 100644 index 0000000000..da770088f9 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java @@ -0,0 +1,154 @@ +package net.runelite.client.plugins.chattranslation; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ObjectArrays; +import com.google.inject.Provides; +import net.runelite.api.*; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.PlayerMenuOptionClicked; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.config.ConfigManager; +import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.menus.MenuManager; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.PluginType; +import org.apache.commons.lang3.ArrayUtils; + +import javax.annotation.Nullable; +import javax.inject.Inject; +import javax.inject.Provider; + +@PluginDescriptor( + name = "Chat Translator", + description = "Translates messages from one Language to another.", + tags = {"translate", "language", "english", "spanish", "dutch", "french"}, + type = PluginType.UTILITY +) +public class ChatTranslationPlugin extends Plugin { + + public static final String TRANSLATE = "Translate"; + private static final ImmutableList AFTER_OPTIONS = ImmutableList.of("Message", "Add ignore", "Remove friend", "Kick"); + + @Inject + @Nullable + private Client client; + + @Inject + private Provider menuManager; + + @Inject + private ChatMessageManager chatMessageManager; + + @Inject + private ChatTranslationConfig config; + + @Provides + ChatTranslationConfig provideConfig(ConfigManager configManager) + { + return configManager.getConfig(ChatTranslationConfig.class); + } + + @Override + protected void startUp() throws Exception + { + if (client != null) + { + menuManager.get().addPlayerMenuItem(TRANSLATE); + } + } + + @Override + protected void shutDown() throws Exception + { + if (client != null) + { + menuManager.get().removePlayerMenuItem(TRANSLATE); + } + } + + @Subscribe + public void onPlayerMenuOptionClicked(PlayerMenuOptionClicked event) + { + if (event.getMenuOption().equals(TRANSLATE)) + { + //TODO: Translate selected message. + } + } + + @Subscribe + public void onMenuEntryAdded(MenuEntryAdded event) + { + int groupId = WidgetInfo.TO_GROUP(event.getActionParam1()); + String option = event.getOption(); + + if (groupId == WidgetInfo.CHATBOX.getGroupId()) + { + boolean after; + + if (!AFTER_OPTIONS.contains(option)) + { + return; + } + + final MenuEntry lookup = new MenuEntry(); + lookup.setOption(TRANSLATE); + lookup.setTarget(event.getTarget()); + lookup.setType(MenuAction.RUNELITE.getId()); + lookup.setParam0(event.getActionParam0()); + lookup.setParam1(event.getActionParam1()); + lookup.setIdentifier(event.getIdentifier()); + + insertMenuEntry(lookup, client.getMenuEntries()); + } + } + + @Subscribe + public void onChatMessage(ChatMessage chatMessage) + { + if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) + { + return; + } + switch (chatMessage.getType()) + { + case PUBLICCHAT: + case MODCHAT: + if (!config.publicChat()) + { + return; + } + break; + default: + return; + } + + String message = chatMessage.getMessage(); + + Translator translator = new Translator(); + + try { + //Automatically check language of message and translate to selected language. + String translation = translator.translate("auto", config.targetLanguage().toString(), message); + + final MessageNode messageNode = chatMessage.getMessageNode(); + messageNode.setRuneLiteFormatMessage(translation); + chatMessageManager.update(messageNode); + } catch (Exception e) { + e.printStackTrace(); + } + + client.refreshChat(); + } + + private void insertMenuEntry(MenuEntry newEntry, MenuEntry[] entries) + { + MenuEntry[] newMenu = ObjectArrays.concat(entries, newEntry); + int menuEntryCount = newMenu.length; + ArrayUtils.swap(newMenu, menuEntryCount - 1, menuEntryCount - 2); + client.setMenuEntries(newMenu); + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java new file mode 100644 index 0000000000..695c1a637d --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java @@ -0,0 +1,23 @@ +package net.runelite.client.plugins.chattranslation; + +public enum Languages { + + ENGLISH("en"), + DUTCH("nl"), + SPANISH("es"), + FRENCH("fr"); + + private final String shortName; + + Languages(String shortName) + { + this.shortName = shortName; + } + + @Override + public String toString() + { + return shortName; + } + +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java new file mode 100644 index 0000000000..220ba888e8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java @@ -0,0 +1,44 @@ +package net.runelite.client.plugins.chattranslation; + +import org.json.JSONArray; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; + +public class Translator { + + public String translate(String source, String target, String message) throws Exception + { + + String url = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=" + source + "&tl=" + target + "&dt=t&q=" + URLEncoder.encode(message, "UTF-8"); + + URL obj = new URL(url); + HttpURLConnection con = (HttpURLConnection) obj.openConnection(); + con.setRequestProperty("User-Agent", "Mozilla/5.0"); + + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuffer response = new StringBuffer(); + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + + return parseResult(response.toString()); + } + + private String parseResult(String inputJson) throws Exception + { + //TODO: find a way to do this using google.gson + JSONArray jsonArray = new JSONArray(inputJson); + JSONArray jsonArray2 = (JSONArray) jsonArray.get(0); + JSONArray jsonArray3 = (JSONArray) jsonArray2.get(0); + + return jsonArray3.get(0).toString(); + } + +} From 3c0e1bef47c2ab0f52d0e978497696915af1fbfa Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Sun, 30 Jun 2019 01:47:14 +0100 Subject: [PATCH 2/8] Need help adding the 'Translate' menu option for translating selected Players messages. Finished outgoing message translation however if the user has been limited by Google for the likes of using the Public Chat translation in over populated and spammy areas such as the GE they will not be able to send a message for upto 5 minutes while the Player Chat Translation config is enabled. Need to think more about ways to handle this though once the selective translation has been completed we can safely remove the 'All' public chat messages part of the plugin to prevent users from being Limited by Google. --- .../ChatTranslationConfig.java | 35 ++++++- .../ChatTranslationPlugin.java | 94 ++++++++++++++++--- 2 files changed, 111 insertions(+), 18 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java index bf0e7a532b..8a05db21b0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -10,23 +10,48 @@ public interface ChatTranslationConfig extends Config @ConfigItem( keyName = "publicChat", - name = "Translate All Public Chat?", + name = "Translate incoming Messages", description = "Would you like to Translate Public Chat?", - position = 0 + position = 0, + group = "Public Chat Translation" ) default boolean publicChat() { return false; } @ConfigItem( - keyName = "targetLanguage", + keyName = "publicTargetLanguage", name = "Target Language", description = "Language to translate messages too.", - position = 2, + position = 1, + group = "Public Chat Translation", hidden = true, unhide = "publicChat" ) - default Languages targetLanguage() + default Languages publicTargetLanguage() { return Languages.ENGLISH; } + @ConfigItem( + keyName = "playerChat", + name = "Translate outgoing Messages", + description = "Would you like to Translate your Messages?", + position = 2, + group = "Player Message Translation" + ) + default boolean playerChat() { return false; } + + @ConfigItem( + keyName = "playerTargetLanguage", + name = "Target Language", + description = "Language to translate messages too.", + position = 3, + group = "Player Message Translation", + hidden = true, + unhide = "playerChat" + ) + default Languages playerTargetLanguage() + { + return Languages.SPANISH; + } + } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java index da770088f9..fde7c98be7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java @@ -7,10 +7,14 @@ import net.runelite.api.*; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.PlayerMenuOptionClicked; +import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.callback.ClientThread; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; +import net.runelite.client.input.KeyListener; +import net.runelite.client.input.KeyManager; import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; @@ -20,6 +24,7 @@ import org.apache.commons.lang3.ArrayUtils; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Provider; +import java.awt.event.KeyEvent; @PluginDescriptor( name = "Chat Translator", @@ -27,21 +32,26 @@ import javax.inject.Provider; tags = {"translate", "language", "english", "spanish", "dutch", "french"}, type = PluginType.UTILITY ) -public class ChatTranslationPlugin extends Plugin { +public class ChatTranslationPlugin extends Plugin implements KeyListener { public static final String TRANSLATE = "Translate"; private static final ImmutableList AFTER_OPTIONS = ImmutableList.of("Message", "Add ignore", "Remove friend", "Kick"); @Inject - @Nullable private Client client; + @Inject + private ClientThread clientThread; + @Inject private Provider menuManager; @Inject private ChatMessageManager chatMessageManager; + @Inject + private KeyManager keyManager; + @Inject private ChatTranslationConfig config; @@ -58,6 +68,7 @@ public class ChatTranslationPlugin extends Plugin { { menuManager.get().addPlayerMenuItem(TRANSLATE); } + keyManager.registerKeyListener(this); } @Override @@ -67,6 +78,7 @@ public class ChatTranslationPlugin extends Plugin { { menuManager.get().removePlayerMenuItem(TRANSLATE); } + keyManager.unregisterKeyListener(this); } @Subscribe @@ -101,7 +113,10 @@ public class ChatTranslationPlugin extends Plugin { lookup.setParam1(event.getActionParam1()); lookup.setIdentifier(event.getIdentifier()); - insertMenuEntry(lookup, client.getMenuEntries()); + MenuEntry[] newMenu = ObjectArrays.concat(lookup, client.getMenuEntries()); + int menuEntryCount = newMenu.length; + ArrayUtils.swap(newMenu, menuEntryCount - 1, menuEntryCount - 2); + client.setMenuEntries(newMenu); } } @@ -131,11 +146,13 @@ public class ChatTranslationPlugin extends Plugin { try { //Automatically check language of message and translate to selected language. - String translation = translator.translate("auto", config.targetLanguage().toString(), message); - - final MessageNode messageNode = chatMessage.getMessageNode(); - messageNode.setRuneLiteFormatMessage(translation); - chatMessageManager.update(messageNode); + String translation = translator.translate("auto", config.publicTargetLanguage().toString(), message); + if (translation != null) + { + final MessageNode messageNode = chatMessage.getMessageNode(); + messageNode.setRuneLiteFormatMessage(translation); + chatMessageManager.update(messageNode); + } } catch (Exception e) { e.printStackTrace(); } @@ -143,12 +160,63 @@ public class ChatTranslationPlugin extends Plugin { client.refreshChat(); } - private void insertMenuEntry(MenuEntry newEntry, MenuEntry[] entries) + @Override + public void keyPressed(KeyEvent event) { + if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) { + return; + } + + if (!config.playerChat()) + { + return; + } + + Widget chatboxParent = client.getWidget(WidgetInfo.CHATBOX_PARENT); + + if (chatboxParent != null && chatboxParent.getOnKeyListener() != null) + { + if (event.getKeyCode() == 0xA) + { + event.consume(); + + Translator translator = new Translator(); + + String message = client.getVar(VarClientStr.CHATBOX_TYPED_TEXT); + + try { + //Automatically check language of message and translate to selected language. + String translation = translator.translate("auto", config.playerTargetLanguage().toString(), message); + + if (translation != null) + { + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, translation); + + clientThread.invoke(() -> { + client.runScript(96, 0, translation); + }); + + } + + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); + } catch (Exception e) { + e.printStackTrace(); + } + } + } else { + return; + } + } + + @Override + public void keyReleased(KeyEvent e) { - MenuEntry[] newMenu = ObjectArrays.concat(entries, newEntry); - int menuEntryCount = newMenu.length; - ArrayUtils.swap(newMenu, menuEntryCount - 1, menuEntryCount - 2); - client.setMenuEntries(newMenu); + // Nothing. + } + + @Override + public void keyTyped(KeyEvent e) + { + // Nothing. } } From 608471f30d7bad0160f58e2937025095ae7512df Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Sun, 30 Jun 2019 02:32:13 +0100 Subject: [PATCH 3/8] Clean-up for Travis. --- .../ChatTranslationConfig.java | 10 ++++-- .../ChatTranslationPlugin.java | 34 +++++++++++++------ .../plugins/chattranslation/Languages.java | 3 +- .../plugins/chattranslation/Translator.java | 6 ++-- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java index 8a05db21b0..d93356c2a5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -15,7 +15,10 @@ public interface ChatTranslationConfig extends Config position = 0, group = "Public Chat Translation" ) - default boolean publicChat() { return false; } + default boolean publicChat() + { + return false; + } @ConfigItem( keyName = "publicTargetLanguage", @@ -38,7 +41,10 @@ public interface ChatTranslationConfig extends Config position = 2, group = "Player Message Translation" ) - default boolean playerChat() { return false; } + default boolean playerChat() + { + return false; + } @ConfigItem( keyName = "playerTargetLanguage", diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java index fde7c98be7..743f89a096 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java @@ -21,7 +21,6 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; import org.apache.commons.lang3.ArrayUtils; -import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Provider; import java.awt.event.KeyEvent; @@ -32,7 +31,8 @@ import java.awt.event.KeyEvent; tags = {"translate", "language", "english", "spanish", "dutch", "french"}, type = PluginType.UTILITY ) -public class ChatTranslationPlugin extends Plugin implements KeyListener { +public class ChatTranslationPlugin extends Plugin implements KeyListener +{ public static final String TRANSLATE = "Translate"; private static final ImmutableList AFTER_OPTIONS = ImmutableList.of("Message", "Add ignore", "Remove friend", "Kick"); @@ -144,7 +144,8 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { Translator translator = new Translator(); - try { + try + { //Automatically check language of message and translate to selected language. String translation = translator.translate("auto", config.publicTargetLanguage().toString(), message); if (translation != null) @@ -153,7 +154,9 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { messageNode.setRuneLiteFormatMessage(translation); chatMessageManager.update(messageNode); } - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(); } @@ -161,8 +164,10 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { } @Override - public void keyPressed(KeyEvent event) { - if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) { + public void keyPressed(KeyEvent event) + { + if (client.getGameState() != GameState.LOADING && client.getGameState() != GameState.LOGGED_IN) + { return; } @@ -183,7 +188,8 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { String message = client.getVar(VarClientStr.CHATBOX_TYPED_TEXT); - try { + try + { //Automatically check language of message and translate to selected language. String translation = translator.translate("auto", config.playerTargetLanguage().toString(), message); @@ -191,18 +197,24 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { { client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, translation); - clientThread.invoke(() -> { + clientThread.invoke(() -> + { client.runScript(96, 0, translation); - }); + } + ); } client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); - } catch (Exception e) { + } + catch (Exception e) + { e.printStackTrace(); } } - } else { + } + else + { return; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java index 695c1a637d..3ec7b3ad81 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Languages.java @@ -1,6 +1,7 @@ package net.runelite.client.plugins.chattranslation; -public enum Languages { +public enum Languages +{ ENGLISH("en"), DUTCH("nl"), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java index 220ba888e8..df8f26ea29 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/Translator.java @@ -8,7 +8,8 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; -public class Translator { +public class Translator +{ public String translate(String source, String target, String message) throws Exception { @@ -23,7 +24,8 @@ public class Translator { String inputLine; StringBuffer response = new StringBuffer(); - while ((inputLine = in.readLine()) != null) { + while ((inputLine = in.readLine()) != null) + { response.append(inputLine); } in.close(); From 50b6c1119fc005cfa6ab6e8e2a88c1dc33692fd1 Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Sun, 30 Jun 2019 13:41:33 +0100 Subject: [PATCH 4/8] Hidden the Public Chat Translation until a better implementation is added to prevent users from being accidentally locked out by Google. --- .../client/plugins/chattranslation/ChatTranslationConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java index d93356c2a5..89201516ea 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -13,7 +13,8 @@ public interface ChatTranslationConfig extends Config name = "Translate incoming Messages", description = "Would you like to Translate Public Chat?", position = 0, - group = "Public Chat Translation" + group = "Public Chat Translation", + hidden = true ) default boolean publicChat() { From 08134881e8a39ad58f14617a1d6de741c8cff465 Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Sun, 30 Jun 2019 14:23:43 +0100 Subject: [PATCH 5/8] Hidden the Public Chat Translation until a better implementation is added to prevent users from being accidentally locked out by Google. --- .../client/plugins/chattranslation/ChatTranslationConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java index 89201516ea..c7fd268532 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -27,8 +27,8 @@ public interface ChatTranslationConfig extends Config description = "Language to translate messages too.", position = 1, group = "Public Chat Translation", - hidden = true, - unhide = "publicChat" + hidden = true +// unhide = "publicChat" ) default Languages publicTargetLanguage() { From c41709de1f5afdc8af00286f02cbe569ea337026 Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Sun, 30 Jun 2019 14:37:49 +0100 Subject: [PATCH 6/8] Added config options for adding the 'Translate' right-click menu option in the Chatbox. (More so to hide it while the Public Chat Translate part of the plugin is disabled/hidden.) --- .../ChatTranslationConfig.java | 20 +++++- .../ChatTranslationPlugin.java | 68 ++++++++++--------- 2 files changed, 52 insertions(+), 36 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java index c7fd268532..3bc0a31f9f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -21,11 +21,25 @@ public interface ChatTranslationConfig extends Config return false; } + @ConfigItem( + keyName = "translateOptionVisable", + name = "Show 'Translate' menu option", + description = "Adds 'Translate' to the right-click menu in the Chatbox.", + position = 1, + group = "Public Chat Translation", + hidden = true +// unhide = "publicChat" + ) + default boolean translateOptionVisable() + { + return true; + } + @ConfigItem( keyName = "publicTargetLanguage", name = "Target Language", description = "Language to translate messages too.", - position = 1, + position = 2, group = "Public Chat Translation", hidden = true // unhide = "publicChat" @@ -39,7 +53,7 @@ public interface ChatTranslationConfig extends Config keyName = "playerChat", name = "Translate outgoing Messages", description = "Would you like to Translate your Messages?", - position = 2, + position = 3, group = "Player Message Translation" ) default boolean playerChat() @@ -51,7 +65,7 @@ public interface ChatTranslationConfig extends Config keyName = "playerTargetLanguage", name = "Target Language", description = "Language to translate messages too.", - position = 3, + position = 4, group = "Player Message Translation", hidden = true, unhide = "playerChat" diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java index 743f89a096..85dc748859 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java @@ -34,7 +34,7 @@ import java.awt.event.KeyEvent; public class ChatTranslationPlugin extends Plugin implements KeyListener { - public static final String TRANSLATE = "Translate"; + private static final String TRANSLATE = "Translate"; private static final ImmutableList AFTER_OPTIONS = ImmutableList.of("Message", "Add ignore", "Remove friend", "Kick"); @Inject @@ -66,7 +66,10 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { if (client != null) { - menuManager.get().addPlayerMenuItem(TRANSLATE); + if (config.translateOptionVisable()) + { + menuManager.get().addPlayerMenuItem(TRANSLATE); + } } keyManager.registerKeyListener(this); } @@ -76,7 +79,10 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { if (client != null) { - menuManager.get().removePlayerMenuItem(TRANSLATE); + if (config.translateOptionVisable()) + { + menuManager.get().removePlayerMenuItem(TRANSLATE); + } } keyManager.unregisterKeyListener(this); } @@ -93,6 +99,11 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener @Subscribe public void onMenuEntryAdded(MenuEntryAdded event) { + if (!config.translateOptionVisable()) + { + return; + } + int groupId = WidgetInfo.TO_GROUP(event.getActionParam1()); String option = event.getOption(); @@ -180,42 +191,33 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener if (chatboxParent != null && chatboxParent.getOnKeyListener() != null) { - if (event.getKeyCode() == 0xA) + if (event.getKeyCode() == 0xA) + { + event.consume(); + + Translator translator = new Translator(); + String message = client.getVar(VarClientStr.CHATBOX_TYPED_TEXT); + + try { - event.consume(); - - Translator translator = new Translator(); - - String message = client.getVar(VarClientStr.CHATBOX_TYPED_TEXT); - - try + //Automatically check language of message and translate to selected language. + String translation = translator.translate("auto", config.playerTargetLanguage().toString(), message); + if (translation != null) { - //Automatically check language of message and translate to selected language. - String translation = translator.translate("auto", config.playerTargetLanguage().toString(), message); + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, translation); - if (translation != null) + clientThread.invoke(() -> { - client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, translation); - - clientThread.invoke(() -> - { - client.runScript(96, 0, translation); - } - ); - - } - - client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); - } - catch (Exception e) - { - e.printStackTrace(); + client.runScript(96, 0, translation); + }); } + client.setVar(VarClientStr.CHATBOX_TYPED_TEXT, ""); } - } - else - { - return; + catch (Exception e) + { + e.printStackTrace(); + } + } } } From 65e48ab2070e2f5941b943fcd62fcde2e7081b52 Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Sun, 30 Jun 2019 14:41:33 +0100 Subject: [PATCH 7/8] Update ChatTranslationConfig.java --- .../client/plugins/chattranslation/ChatTranslationConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java index 3bc0a31f9f..565aec82d8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -32,7 +32,7 @@ public interface ChatTranslationConfig extends Config ) default boolean translateOptionVisable() { - return true; + return false; } @ConfigItem( From b21d447aac52a671d26b1c70fa5194c795738fe3 Mon Sep 17 00:00:00 2001 From: Ian William O'Neill Date: Tue, 2 Jul 2019 05:26:29 +0100 Subject: [PATCH 8/8] Added 'Translate' menu option to right-click menu on players and chatbox, This will add player names to a list of player who should be translated to the set language. Thanks to Ganom and Oak. --- .../ChatTranslationConfig.java | 37 ++++--- .../ChatTranslationPlugin.java | 100 +++++++++++++----- 2 files changed, 97 insertions(+), 40 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java index 3bc0a31f9f..32e8481c7c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationConfig.java @@ -8,13 +8,26 @@ import net.runelite.client.config.ConfigItem; public interface ChatTranslationConfig extends Config { + @ConfigItem( + keyName = "translateOptionVisable", + name = "Show 'Translate' menu option", + description = "Adds 'Translate' to the right-click menu in the Chatbox.", + position = 0, + group = "Public Chat Translation" + ) + default boolean translateOptionVisable() + { + return true; + } + @ConfigItem( keyName = "publicChat", name = "Translate incoming Messages", description = "Would you like to Translate Public Chat?", - position = 0, + position = 1, group = "Public Chat Translation", - hidden = true + hidden = true, + unhide = "translateOptionVisable" ) default boolean publicChat() { @@ -22,17 +35,17 @@ public interface ChatTranslationConfig extends Config } @ConfigItem( - keyName = "translateOptionVisable", - name = "Show 'Translate' menu option", - description = "Adds 'Translate' to the right-click menu in the Chatbox.", - position = 1, + keyName = "playerNames", + name = "Translated Player list:", + description = "Players you add to this list will be Translated in Public chat.", + position = 2, group = "Public Chat Translation", - hidden = true -// unhide = "publicChat" + hidden = true, + unhide = "translateOptionVisable" ) - default boolean translateOptionVisable() + default String getPlayerNames() { - return true; + return ""; } @ConfigItem( @@ -41,8 +54,8 @@ public interface ChatTranslationConfig extends Config description = "Language to translate messages too.", position = 2, group = "Public Chat Translation", - hidden = true -// unhide = "publicChat" + hidden = true, + unhide = "publicChat" ) default Languages publicTargetLanguage() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java index 85dc748859..65668483e2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chattranslation/ChatTranslationPlugin.java @@ -5,6 +5,7 @@ import com.google.common.collect.ObjectArrays; import com.google.inject.Provides; import net.runelite.api.*; import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.PlayerMenuOptionClicked; import net.runelite.api.widgets.Widget; @@ -19,11 +20,13 @@ import net.runelite.client.menus.MenuManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginType; +import net.runelite.client.util.Text; import org.apache.commons.lang3.ArrayUtils; import javax.inject.Inject; import javax.inject.Provider; import java.awt.event.KeyEvent; +import java.util.ArrayList; @PluginDescriptor( name = "Chat Translator", @@ -35,14 +38,20 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener { private static final String TRANSLATE = "Translate"; + private static final ImmutableList AFTER_OPTIONS = ImmutableList.of("Message", "Add ignore", "Remove friend", "Kick"); + private ArrayList playerNames = new ArrayList<>(); + @Inject private Client client; @Inject private ClientThread clientThread; + @Inject + private ConfigManager configManager; + @Inject private Provider menuManager; @@ -72,6 +81,8 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener } } keyManager.registerKeyListener(this); + + playerNames.addAll(Text.fromCSV(config.getPlayerNames())); } @Override @@ -85,14 +96,25 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener } } keyManager.unregisterKeyListener(this); + + playerNames.clear(); } @Subscribe - public void onPlayerMenuOptionClicked(PlayerMenuOptionClicked event) + public void onConfigChanged(ConfigChanged event) { - if (event.getMenuOption().equals(TRANSLATE)) + if (event.getGroup().equals("chattranslation")) { - //TODO: Translate selected message. + if (event.getKey().equals("playerNames")) + { + for (String names : Text.fromCSV(config.getPlayerNames())) + { + if (!playerNames.contains(Text.toJagexName(names))) + { + playerNames.add(Text.toJagexName(names)); + } + } + } } } @@ -116,21 +138,37 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener return; } - final MenuEntry lookup = new MenuEntry(); - lookup.setOption(TRANSLATE); - lookup.setTarget(event.getTarget()); - lookup.setType(MenuAction.RUNELITE.getId()); - lookup.setParam0(event.getActionParam0()); - lookup.setParam1(event.getActionParam1()); - lookup.setIdentifier(event.getIdentifier()); + final MenuEntry menuEntry = new MenuEntry(); + menuEntry.setOption(TRANSLATE); + menuEntry.setTarget(event.getTarget()); + menuEntry.setType(MenuAction.RUNELITE.getId()); + menuEntry.setParam0(event.getActionParam0()); + menuEntry.setParam1(event.getActionParam1()); + menuEntry.setIdentifier(event.getIdentifier()); - MenuEntry[] newMenu = ObjectArrays.concat(lookup, client.getMenuEntries()); + MenuEntry[] newMenu = ObjectArrays.concat(menuEntry, client.getMenuEntries()); int menuEntryCount = newMenu.length; ArrayUtils.swap(newMenu, menuEntryCount - 1, menuEntryCount - 2); client.setMenuEntries(newMenu); } } + @Subscribe + public void onPlayerMenuOptionClicked(PlayerMenuOptionClicked event) + { + if (event.getMenuOption().equals(TRANSLATE)) + { + String name = Text.toJagexName(event.getMenuTarget()); + if (!playerNames.contains(name)) + { + playerNames.add(name); + } + + configManager.setConfiguration("chattranslation", "playerNames", Text.toCSV(playerNames)); + configManager.sendConfig(); + } + } + @Subscribe public void onChatMessage(ChatMessage chatMessage) { @@ -151,27 +189,33 @@ public class ChatTranslationPlugin extends Plugin implements KeyListener return; } - String message = chatMessage.getMessage(); - - Translator translator = new Translator(); - - try + for (String nameList : playerNames) { - //Automatically check language of message and translate to selected language. - String translation = translator.translate("auto", config.publicTargetLanguage().toString(), message); - if (translation != null) + if (nameList.contains(Text.toJagexName(chatMessage.getName()))) { - final MessageNode messageNode = chatMessage.getMessageNode(); - messageNode.setRuneLiteFormatMessage(translation); - chatMessageManager.update(messageNode); + String message = chatMessage.getMessage(); + + Translator translator = new Translator(); + + try + { + //Automatically check language of message and translate to selected language. + String translation = translator.translate("auto", config.publicTargetLanguage().toString(), message); + if (translation != null) + { + final MessageNode messageNode = chatMessage.getMessageNode(); + messageNode.setRuneLiteFormatMessage(translation); + chatMessageManager.update(messageNode); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + + client.refreshChat(); } } - catch (Exception e) - { - e.printStackTrace(); - } - - client.refreshChat(); } @Override