From b90373a1399a40da7c9d2ac9780ea806e927cafb Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Thu, 31 Oct 2019 21:54:15 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=83=20Halloween=20Update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + MinetestChatBridgeBot/.classpath | 19 + MinetestChatBridgeBot/.project | 23 + .../org.eclipse.buildship.core.prefs | 13 + .../bin/main/appguru/Main.class | Bin 0 -> 5329 bytes .../bin/main/bridge/FileBridge$1.class | Bin 0 -> 1442 bytes .../bin/main/bridge/FileBridge.class | Bin 0 -> 4244 bytes .../bin/main/bridge/ProcessBridge.class | Bin 0 -> 643 bytes .../bin/main/bridge/SocketBridge.class | Bin 0 -> 4595 bytes MinetestChatBridgeBot/bin/main/chat/Bot.class | Bin 0 -> 25759 bytes .../bin/main/commands/Command.class | Bin 0 -> 600 bytes .../bin/main/commands/StatusCommand.class | Bin 0 -> 5339 bytes .../bin/main/misc/GarbageCollector.class | Bin 0 -> 648 bytes .../bin/main/misc/Utils.class | Bin 0 -> 1645 bytes MinetestChatBridgeBot/build.gradle | 37 + MinetestChatBridgeBot/gradle.properties | 1 + MinetestChatBridgeBot/settings.gradle | 1 + .../src/main/java/appguru/Main.java | 29 +- .../src/main/java/bridge/FileBridge.java | 34 +- .../src/main/java/bridge/ProcessBridge.java | 18 + .../src/main/java/bridge/SocketBridge.java | 112 +++ .../src/main/java/chat/Bot.java | 82 +-- .../src/main/java/commands/Command.java | 2 +- .../src/main/java/commands/StatusCommand.java | 7 +- .../src/main/java/misc/GarbageCollector.java | 0 .../src/main/java/misc/Utils.java | 0 MinetestChatBridgeIRCBot/.classpath | 19 + MinetestChatBridgeIRCBot/.project | 23 + .../org.eclipse.buildship.core.prefs | 13 + .../bin/main/appguru/Main$1.class | Bin 0 -> 8106 bytes .../bin/main/appguru/Main$2.class | Bin 0 -> 1478 bytes .../bin/main/appguru/Main$3.class | Bin 0 -> 1004 bytes .../bin/main/appguru/Main$4.class | Bin 0 -> 1857 bytes .../bin/main/appguru/Main.class | Bin 0 -> 11684 bytes .../bin/main/bridge/FileBridge$1.class | Bin 0 -> 1442 bytes .../bin/main/bridge/FileBridge.class | Bin 0 -> 4244 bytes .../bin/main/bridge/IRCFileBridge.class | Bin 0 -> 715 bytes .../bin/main/bridge/IRCSocketBridge.class | Bin 0 -> 704 bytes .../bin/main/bridge/ProcessBridge.class | Bin 0 -> 643 bytes .../bin/main/bridge/SocketBridge.class | Bin 0 -> 4595 bytes .../bin/main/commands/Command.class | Bin 0 -> 225 bytes .../bin/main/commands/InfoCommand.class | Bin 0 -> 1490 bytes .../bin/main/handlers/NumericHandler.class | Bin 0 -> 317 bytes .../handlers/NumericResponseHandler.class | Bin 0 -> 1573 bytes .../NumericTimeoutResponseHandler.class | Bin 0 -> 1707 bytes .../bin/main/handlers/ResponseHandler.class | Bin 0 -> 425 bytes .../handlers/TimeoutResponseHandler.class | Bin 0 -> 1422 bytes .../main/handlers/TopicResponseHandler.class | Bin 0 -> 6871 bytes .../bin/main/handlers/TryAgainHandler.class | Bin 0 -> 1594 bytes .../bin/main/irc/Command.class | Bin 0 -> 329 bytes .../bin/main/irc/Default.class | Bin 0 -> 365 bytes .../bin/main/irc/HandledResponse.class | Bin 0 -> 1056 bytes .../bin/main/irc/IRCBot.class | Bin 0 -> 9202 bytes .../main/irc/InvalidMessageException.class | Bin 0 -> 363 bytes .../bin/main/irc/PongCommand.class | Bin 0 -> 1442 bytes .../bin/main/misc/GarbageCollector.class | Bin 0 -> 647 bytes .../bin/main/numeric/Numeric.class | Bin 0 -> 7128 bytes .../bin/main/numeric/NumericLookup.class | Bin 0 -> 5969 bytes MinetestChatBridgeIRCBot/build.gradle | 25 + MinetestChatBridgeIRCBot/gradle.properties | 1 + MinetestChatBridgeIRCBot/settings.gradle | 1 + .../src/main/java}/appguru/Main.java | 89 +-- .../src/main/java/bridge/FileBridge.java | 1 + .../src/main/java/bridge/IRCFileBridge.java | 25 + .../src/main/java/bridge/IRCSocketBridge.java | 23 + .../src/main/java/bridge/ProcessBridge.java | 1 + .../src/main/java/bridge/SocketBridge.java | 1 + .../src/main/java}/commands/Command.java | 0 .../src/main/java}/commands/InfoCommand.java | 0 .../main/java}/handlers/NumericHandler.java | 0 .../handlers/NumericResponseHandler.java | 0 .../NumericTimeoutResponseHandler.java | 0 .../main/java}/handlers/ResponseHandler.java | 0 .../handlers/TimeoutResponseHandler.java | 0 .../java}/handlers/TopicResponseHandler.java | 0 .../main/java}/handlers/TryAgainHandler.java | 0 .../src/main/java}/irc/Command.java | 0 .../src/main/java}/irc/Default.java | 0 .../src/main/java}/irc/HandledResponse.java | 0 .../src/main/java}/irc/IRCBot.java | 61 +- .../java}/irc/InvalidMessageException.java | 0 .../src/main/java}/irc/PongCommand.java | 0 .../src/main/java}/misc/GarbageCollector.java | 0 .../src/main/java}/numeric/Numeric.java | 0 .../src/main/java}/numeric/NumericLookup.java | 0 Readme.md | 52 +- chatcommands.lua | 73 ++ closest_color.lua | 1 + colorize_message.lua | 52 +- conf.lua | 92 ++- config_help.md | 92 ++- default_config.json | 4 +- discord.lua | 67 +- init.lua | 47 +- irc.lua | 94 +-- main.lua | 159 +++-- message.lua | 227 ++++++ minetest-chat-bridge-bot/.attach_pid29291 | 0 minetest-chat-bridge-bot/.attach_pid31402 | 0 minetest-chat-bridge-bot/.attach_pid31496 | 0 minetest-chat-bridge-bot/.attach_pid32551 | 0 .../.gradle/4.10/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/4.10/fileContent/fileContent.lock | Bin 17 -> 0 bytes .../.gradle/4.10/fileHashes/fileHashes.bin | Bin 21597 -> 0 bytes .../.gradle/4.10/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../.gradle/4.10/gc.properties | 0 .../4.10/javaCompile/classAnalysis.bin | Bin 1153361 -> 0 bytes .../.gradle/4.10/javaCompile/javaCompile.lock | Bin 17 -> 0 bytes .../.gradle/4.10/javaCompile/taskHistory.bin | Bin 20176 -> 0 bytes .../.gradle/4.10/taskHistory/taskHistory.bin | Bin 39242 -> 0 bytes .../.gradle/4.10/taskHistory/taskHistory.lock | Bin 17 -> 0 bytes .../buildOutputCleanup.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/cache.properties | 2 - .../buildOutputCleanup/outputFiles.bin | Bin 18821 -> 0 bytes .../.gradle/vcs-1/gc.properties | 0 minetest-chat-bridge-bot/.idea/compiler.xml | 9 - minetest-chat-bridge-bot/.idea/encodings.xml | 4 - minetest-chat-bridge-bot/.idea/gradle.xml | 18 - minetest-chat-bridge-bot/.idea/misc.xml | 14 - minetest-chat-bridge-bot/.idea/modules.xml | 8 - minetest-chat-bridge-bot/.idea/uiDesigner.xml | 124 ---- minetest-chat-bridge-bot/.idea/vcs.xml | 6 - minetest-chat-bridge-bot/.idea/workspace.xml | 675 ------------------ minetest-chat-bridge-bot/build.gradle | 19 - .../build/classes/java/main/Main.class | Bin 2160 -> 0 bytes .../build/classes/java/main/bots/Bot.class | Bin 192 -> 0 bytes .../java/main/bots/MonteCarloBot.class | Bin 2636 -> 0 bytes .../classes/java/main/bots/RandomBot.class | Bin 942 -> 0 bytes .../build/classes/java/main/chat/Bot.class | Bin 8538 -> 0 bytes .../java/main/commands/ChallengeCommand.class | Bin 3296 -> 0 bytes .../classes/java/main/commands/Command.class | Bin 523 -> 0 bytes .../java/main/commands/GetConfCommand.class | Bin 1912 -> 0 bytes .../java/main/commands/HelpCommand.class | Bin 3530 -> 0 bytes .../java/main/commands/PlayCommand.class | Bin 3800 -> 0 bytes .../java/main/commands/SetConfCommand.class | Bin 2459 -> 0 bytes .../java/main/commands/ShowCommand.class | Bin 2612 -> 0 bytes .../java/main/commands/TrainCommand.class | Bin 2886 -> 0 bytes .../build/classes/java/main/game/Board.class | Bin 7781 -> 0 bytes .../classes/java/main/game/BotGame.class | Bin 1778 -> 0 bytes .../classes/java/main/game/ChatGame.class | Bin 11165 -> 0 bytes .../build/classes/java/main/game/Game.class | Bin 6705 -> 0 bytes .../java/main/game/SimulationGame.class | Bin 4000 -> 0 bytes .../classes/java/main/images/GifBuilder.class | Bin 4951 -> 0 bytes .../build/classes/java/main/moves/Move.class | Bin 228 -> 0 bytes .../classes/java/main/moves/MoveMove.class | Bin 1468 -> 0 bytes .../classes/java/main/moves/PlaceMove.class | Bin 1409 -> 0 bytes .../classes/java/main/moves/RemoveMove.class | Bin 1276 -> 0 bytes .../nine-mens-morris-bot-1.0-SNAPSHOT.jar | Bin 41852 -> 0 bytes .../build/tmp/jar/MANIFEST.MF | 2 - minetest-chat-bridge-bot/cachefile.gif | Bin 7989 -> 0 bytes .../gradle/wrapper/gradle-wrapper.jar | Bin 56172 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 - minetest-chat-bridge-bot/gradlew | 172 ----- minetest-chat-bridge-bot/gradlew.bat | 84 --- .../out/production/classes/appguru/Main.class | Bin 4912 -> 0 bytes .../classes/bridge/ProcessBridge$1.class | Bin 1278 -> 0 bytes .../classes/bridge/ProcessBridge.class | Bin 4287 -> 0 bytes .../out/production/classes/chat/Bot.class | Bin 25857 -> 0 bytes .../production/classes/commands/Command.class | Bin 601 -> 0 bytes .../classes/commands/StatusCommand.class | Bin 5350 -> 0 bytes .../classes/misc/GarbageCollector.class | Bin 648 -> 0 bytes .../out/production/classes/misc/Utils.class | Bin 1556 -> 0 bytes minetest-chat-bridge-bot/res/info.png | Bin 3092 -> 0 bytes minetest-chat-bridge-bot/res/input.txt | 0 minetest-chat-bridge-bot/res/output.txt | 12 - minetest-chat-bridge-bot/settings.gradle | 2 - .../.idea/compiler.xml | 23 - .../.idea/description.html | 1 - .../.idea/encodings.xml | 6 - minetest-chat-bridge-irc-bot/.idea/misc.xml | 12 - .../.idea/modules.xml | 8 - .../.idea/uiDesigner.xml | 124 ---- minetest-chat-bridge-irc-bot/.idea/vcs.xml | 6 - .../.idea/workspace.xml | 607 ---------------- .../minetest-chat-bridge-irc-bot.iml | 12 - .../appguru/Main$1.class | Bin 2893 -> 0 bytes .../appguru/Main$2.class | Bin 1676 -> 0 bytes .../appguru/Main$3.class | Bin 1254 -> 0 bytes .../appguru/Main$4.class | Bin 1857 -> 0 bytes .../appguru/Main$5.class | Bin 639 -> 0 bytes .../appguru/Main.class | Bin 11770 -> 0 bytes .../bridge/ProcessBridge$1.class | Bin 1197 -> 0 bytes .../bridge/ProcessBridge.class | Bin 4673 -> 0 bytes .../commands/Command.class | Bin 225 -> 0 bytes .../commands/InfoCommand.class | Bin 1762 -> 0 bytes .../handlers/NumericHandler.class | Bin 317 -> 0 bytes .../handlers/NumericResponseHandler.class | Bin 1573 -> 0 bytes .../NumericTimeoutResponseHandler.class | Bin 1707 -> 0 bytes .../handlers/ResponseHandler.class | Bin 425 -> 0 bytes .../handlers/TimeoutResponseHandler.class | Bin 1422 -> 0 bytes .../handlers/TopicResponseHandler$1.class | Bin 977 -> 0 bytes .../handlers/TopicResponseHandler.class | Bin 1388 -> 0 bytes .../handlers/TryAgainHandler.class | Bin 1598 -> 0 bytes .../irc/Command.class | Bin 329 -> 0 bytes .../irc/Default.class | Bin 365 -> 0 bytes .../irc/HandledResponse.class | Bin 1028 -> 0 bytes .../irc/IRCBot$1.class | Bin 683 -> 0 bytes .../irc/IRCBot.class | Bin 8093 -> 0 bytes .../irc/InvalidMessageException.class | Bin 363 -> 0 bytes .../irc/PongCommand.class | Bin 1788 -> 0 bytes .../misc/GarbageCollector.class | Bin 647 -> 0 bytes .../numeric/Numeric.class | Bin 7041 -> 0 bytes .../numeric/NumericLookup.class | Bin 5959 -> 0 bytes minetest-chat-bridge-irc-bot/res/input.txt | 0 minetest-chat-bridge-irc-bot/res/output.txt | 13 - .../src/bridge/ProcessBridge.java | 127 ---- mod.conf | 5 +- process_bridges.lua | 106 +++ test.lua | 11 +- text_styles.lua | 568 +++++++++++++++ trie.lua | 1 + unicode.lua | 27 +- 212 files changed, 1961 insertions(+), 2478 deletions(-) create mode 100644 .gitignore create mode 100644 MinetestChatBridgeBot/.classpath create mode 100644 MinetestChatBridgeBot/.project create mode 100644 MinetestChatBridgeBot/.settings/org.eclipse.buildship.core.prefs create mode 100644 MinetestChatBridgeBot/bin/main/appguru/Main.class create mode 100644 MinetestChatBridgeBot/bin/main/bridge/FileBridge$1.class create mode 100644 MinetestChatBridgeBot/bin/main/bridge/FileBridge.class create mode 100644 MinetestChatBridgeBot/bin/main/bridge/ProcessBridge.class create mode 100644 MinetestChatBridgeBot/bin/main/bridge/SocketBridge.class create mode 100644 MinetestChatBridgeBot/bin/main/chat/Bot.class create mode 100644 MinetestChatBridgeBot/bin/main/commands/Command.class create mode 100644 MinetestChatBridgeBot/bin/main/commands/StatusCommand.class create mode 100644 MinetestChatBridgeBot/bin/main/misc/GarbageCollector.class create mode 100644 MinetestChatBridgeBot/bin/main/misc/Utils.class create mode 100644 MinetestChatBridgeBot/build.gradle create mode 100644 MinetestChatBridgeBot/gradle.properties create mode 100644 MinetestChatBridgeBot/settings.gradle rename {minetest-chat-bridge-bot => MinetestChatBridgeBot}/src/main/java/appguru/Main.java (79%) rename minetest-chat-bridge-bot/src/main/java/bridge/ProcessBridge.java => MinetestChatBridgeBot/src/main/java/bridge/FileBridge.java (77%) create mode 100644 MinetestChatBridgeBot/src/main/java/bridge/ProcessBridge.java create mode 100644 MinetestChatBridgeBot/src/main/java/bridge/SocketBridge.java rename {minetest-chat-bridge-bot => MinetestChatBridgeBot}/src/main/java/chat/Bot.java (87%) rename {minetest-chat-bridge-bot => MinetestChatBridgeBot}/src/main/java/commands/Command.java (83%) rename {minetest-chat-bridge-bot => MinetestChatBridgeBot}/src/main/java/commands/StatusCommand.java (93%) rename {minetest-chat-bridge-bot => MinetestChatBridgeBot}/src/main/java/misc/GarbageCollector.java (100%) rename {minetest-chat-bridge-bot => MinetestChatBridgeBot}/src/main/java/misc/Utils.java (100%) create mode 100644 MinetestChatBridgeIRCBot/.classpath create mode 100644 MinetestChatBridgeIRCBot/.project create mode 100644 MinetestChatBridgeIRCBot/.settings/org.eclipse.buildship.core.prefs create mode 100644 MinetestChatBridgeIRCBot/bin/main/appguru/Main$1.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/appguru/Main$2.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/appguru/Main$3.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/appguru/Main$4.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/appguru/Main.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/bridge/FileBridge$1.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/bridge/FileBridge.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/bridge/IRCFileBridge.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/bridge/IRCSocketBridge.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/bridge/ProcessBridge.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/bridge/SocketBridge.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/commands/Command.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/commands/InfoCommand.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/handlers/NumericHandler.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/handlers/NumericResponseHandler.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/handlers/NumericTimeoutResponseHandler.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/handlers/ResponseHandler.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/handlers/TimeoutResponseHandler.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/handlers/TopicResponseHandler.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/handlers/TryAgainHandler.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/irc/Command.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/irc/Default.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/irc/HandledResponse.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/irc/IRCBot.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/irc/InvalidMessageException.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/irc/PongCommand.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/misc/GarbageCollector.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/numeric/Numeric.class create mode 100644 MinetestChatBridgeIRCBot/bin/main/numeric/NumericLookup.class create mode 100644 MinetestChatBridgeIRCBot/build.gradle create mode 100644 MinetestChatBridgeIRCBot/gradle.properties create mode 100644 MinetestChatBridgeIRCBot/settings.gradle rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/appguru/Main.java (81%) create mode 120000 MinetestChatBridgeIRCBot/src/main/java/bridge/FileBridge.java create mode 100644 MinetestChatBridgeIRCBot/src/main/java/bridge/IRCFileBridge.java create mode 100644 MinetestChatBridgeIRCBot/src/main/java/bridge/IRCSocketBridge.java create mode 120000 MinetestChatBridgeIRCBot/src/main/java/bridge/ProcessBridge.java create mode 120000 MinetestChatBridgeIRCBot/src/main/java/bridge/SocketBridge.java rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/commands/Command.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/commands/InfoCommand.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/handlers/NumericHandler.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/handlers/NumericResponseHandler.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/handlers/NumericTimeoutResponseHandler.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/handlers/ResponseHandler.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/handlers/TimeoutResponseHandler.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/handlers/TopicResponseHandler.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/handlers/TryAgainHandler.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/irc/Command.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/irc/Default.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/irc/HandledResponse.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/irc/IRCBot.java (79%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/irc/InvalidMessageException.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/irc/PongCommand.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/misc/GarbageCollector.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/numeric/Numeric.java (100%) rename {minetest-chat-bridge-irc-bot/src => MinetestChatBridgeIRCBot/src/main/java}/numeric/NumericLookup.java (100%) create mode 100644 chatcommands.lua create mode 120000 closest_color.lua create mode 100644 message.lua delete mode 100644 minetest-chat-bridge-bot/.attach_pid29291 delete mode 100644 minetest-chat-bridge-bot/.attach_pid31402 delete mode 100644 minetest-chat-bridge-bot/.attach_pid31496 delete mode 100644 minetest-chat-bridge-bot/.attach_pid32551 delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/fileChanges/last-build.bin delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/fileContent/fileContent.lock delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/fileHashes/fileHashes.bin delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/fileHashes/fileHashes.lock delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/gc.properties delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/javaCompile/classAnalysis.bin delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/javaCompile/javaCompile.lock delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/javaCompile/taskHistory.bin delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/taskHistory/taskHistory.bin delete mode 100644 minetest-chat-bridge-bot/.gradle/4.10/taskHistory/taskHistory.lock delete mode 100644 minetest-chat-bridge-bot/.gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 minetest-chat-bridge-bot/.gradle/buildOutputCleanup/cache.properties delete mode 100644 minetest-chat-bridge-bot/.gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 minetest-chat-bridge-bot/.gradle/vcs-1/gc.properties delete mode 100644 minetest-chat-bridge-bot/.idea/compiler.xml delete mode 100644 minetest-chat-bridge-bot/.idea/encodings.xml delete mode 100644 minetest-chat-bridge-bot/.idea/gradle.xml delete mode 100644 minetest-chat-bridge-bot/.idea/misc.xml delete mode 100644 minetest-chat-bridge-bot/.idea/modules.xml delete mode 100644 minetest-chat-bridge-bot/.idea/uiDesigner.xml delete mode 100644 minetest-chat-bridge-bot/.idea/vcs.xml delete mode 100644 minetest-chat-bridge-bot/.idea/workspace.xml delete mode 100644 minetest-chat-bridge-bot/build.gradle delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/Main.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/bots/Bot.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/bots/MonteCarloBot.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/bots/RandomBot.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/chat/Bot.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/ChallengeCommand.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/Command.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/GetConfCommand.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/HelpCommand.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/PlayCommand.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/SetConfCommand.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/ShowCommand.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/commands/TrainCommand.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/game/Board.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/game/BotGame.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/game/ChatGame.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/game/Game.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/game/SimulationGame.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/images/GifBuilder.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/moves/Move.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/moves/MoveMove.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/moves/PlaceMove.class delete mode 100644 minetest-chat-bridge-bot/build/classes/java/main/moves/RemoveMove.class delete mode 100644 minetest-chat-bridge-bot/build/libs/nine-mens-morris-bot-1.0-SNAPSHOT.jar delete mode 100644 minetest-chat-bridge-bot/build/tmp/jar/MANIFEST.MF delete mode 100644 minetest-chat-bridge-bot/cachefile.gif delete mode 100644 minetest-chat-bridge-bot/gradle/wrapper/gradle-wrapper.jar delete mode 100644 minetest-chat-bridge-bot/gradle/wrapper/gradle-wrapper.properties delete mode 100755 minetest-chat-bridge-bot/gradlew delete mode 100644 minetest-chat-bridge-bot/gradlew.bat delete mode 100644 minetest-chat-bridge-bot/out/production/classes/appguru/Main.class delete mode 100644 minetest-chat-bridge-bot/out/production/classes/bridge/ProcessBridge$1.class delete mode 100644 minetest-chat-bridge-bot/out/production/classes/bridge/ProcessBridge.class delete mode 100644 minetest-chat-bridge-bot/out/production/classes/chat/Bot.class delete mode 100644 minetest-chat-bridge-bot/out/production/classes/commands/Command.class delete mode 100644 minetest-chat-bridge-bot/out/production/classes/commands/StatusCommand.class delete mode 100644 minetest-chat-bridge-bot/out/production/classes/misc/GarbageCollector.class delete mode 100644 minetest-chat-bridge-bot/out/production/classes/misc/Utils.class delete mode 100644 minetest-chat-bridge-bot/res/info.png delete mode 100644 minetest-chat-bridge-bot/res/input.txt delete mode 100644 minetest-chat-bridge-bot/res/output.txt delete mode 100644 minetest-chat-bridge-bot/settings.gradle delete mode 100644 minetest-chat-bridge-irc-bot/.idea/compiler.xml delete mode 100644 minetest-chat-bridge-irc-bot/.idea/description.html delete mode 100644 minetest-chat-bridge-irc-bot/.idea/encodings.xml delete mode 100644 minetest-chat-bridge-irc-bot/.idea/misc.xml delete mode 100644 minetest-chat-bridge-irc-bot/.idea/modules.xml delete mode 100644 minetest-chat-bridge-irc-bot/.idea/uiDesigner.xml delete mode 100644 minetest-chat-bridge-irc-bot/.idea/vcs.xml delete mode 100644 minetest-chat-bridge-irc-bot/.idea/workspace.xml delete mode 100644 minetest-chat-bridge-irc-bot/minetest-chat-bridge-irc-bot.iml delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$1.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$2.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$3.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$4.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$5.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/bridge/ProcessBridge$1.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/bridge/ProcessBridge.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/commands/Command.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/commands/InfoCommand.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericHandler.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericResponseHandler.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericTimeoutResponseHandler.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/ResponseHandler.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TimeoutResponseHandler.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TopicResponseHandler$1.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TopicResponseHandler.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TryAgainHandler.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/Command.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/Default.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/HandledResponse.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/IRCBot$1.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/IRCBot.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/InvalidMessageException.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/PongCommand.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/misc/GarbageCollector.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/numeric/Numeric.class delete mode 100644 minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/numeric/NumericLookup.class delete mode 100644 minetest-chat-bridge-irc-bot/res/input.txt delete mode 100644 minetest-chat-bridge-irc-bot/res/output.txt delete mode 100644 minetest-chat-bridge-irc-bot/src/bridge/ProcessBridge.java create mode 100644 process_bridges.lua create mode 100644 text_styles.lua create mode 120000 trie.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f12e409 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/MinetestChatBridgeBot/.gradle/ +/MinetestChatBridgeBot/build/ +/MinetestChatBridgeIRCBot/.gradle/ +/MinetestChatBridgeIRCBot/build/ \ No newline at end of file diff --git a/MinetestChatBridgeBot/.classpath b/MinetestChatBridgeBot/.classpath new file mode 100644 index 0000000..9f9cc9f --- /dev/null +++ b/MinetestChatBridgeBot/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/MinetestChatBridgeBot/.project b/MinetestChatBridgeBot/.project new file mode 100644 index 0000000..e04c6b6 --- /dev/null +++ b/MinetestChatBridgeBot/.project @@ -0,0 +1,23 @@ + + + MinetestChatBridgeBot + Project MinetestChatBridgeBot created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/MinetestChatBridgeBot/.settings/org.eclipse.buildship.core.prefs b/MinetestChatBridgeBot/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..7a23d11 --- /dev/null +++ b/MinetestChatBridgeBot/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(5.6.1)) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home= +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/MinetestChatBridgeBot/bin/main/appguru/Main.class b/MinetestChatBridgeBot/bin/main/appguru/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..3250d08940b5ed4b2a826ff40ffe75f33a91a40d GIT binary patch literal 5329 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 Ykf@;%eo-gtMSvp`@Xr$s;zE@F57I}A@Bjb+ literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeBot/bin/main/bridge/FileBridge$1.class b/MinetestChatBridgeBot/bin/main/bridge/FileBridge$1.class new file mode 100644 index 0000000000000000000000000000000000000000..5fe5e20a19392c29ccb2cc1c8be6f0843314f48a GIT binary patch literal 1442 zcmZux?NZxD6g`U#0wF#^X_|f{g@(2U8VoJ@G)-D46jK{$>^LQ9N`<``1tED>Qkvu; z@~eM3eE@zZlR&1K=>zmh`V>jeN(v+e&q%s^@7;UvIeXUsy!`8L02fg=&?fNChH@HB znO|^RIUAcJQwFjE{detqcHXtUX1=qc2)CSIWRjaoM|Kq$o^d=Uyee=qcT9Y= zCXk);8?p-m-4@!>VIqSb3kG@xGC7^lS8_bL9PMmKRkb%$Y37m7~|GGph#? zc=u?Vktq(6QIXe9jQTgIo4jY?6y6tT4_ql*oFlh1TI<4xIBnn~0n2W+nvsg~W!v#A zoWaMev2vrTJH#wFetuOsURVi9#7@D)FwPqIMBvOJNkuP|N=2o=bt{sHyEyruF2dp3zfRbfCJWb zD$j8dD_Vc6EOK}vaqN~JZUNVIxI%=7;iN-4{B;vGt%aL!kWgGX5CAD=+o7aw4E;En zP_l<)zpS9|N8AchQ>WT6@f~@n?MP!+IR& z^zq%n9AF&%d|R} zaqA9_FpN1gahHddfgXMW-F)W>ViG2%IQUmMOSpOdL0-lsW?x}`0o#~?qNp^;p_r;D z1!kjO;?!^Y`{2HR!vGo5X?gJ1Z~veY_kS|-yqfBLtHq)$ literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeBot/bin/main/bridge/FileBridge.class b/MinetestChatBridgeBot/bin/main/bridge/FileBridge.class new file mode 100644 index 0000000000000000000000000000000000000000..23b2d793fb3c62a65a45ea47928630fea536d74f GIT binary patch literal 4244 zcmbVQ`&Sg_8GZ&9W_KM$7etA-jiCk>kZ59>h#_7g3bIH9Q8WgJ-2q0I+0E>%Xp%Oy zP3=AHNz^LN1(gm3 ziZOgcb-fb8OKapSrv;FR8EJ`zPGTWAh08yG{PuFr3MXE z463faPepZ+d{I~`mMf^9HncrAG-TLD(hFI|4GJRDdlHnl9!3pTit$z4z9#BJ^?hM1 z!y4I+(&fyyUk2GhBB1P)6E)Gl!sA|1{E;{i(U6A-5PH0IhA#c zQ4Nh~V&f7y+h!4a%~2z6rc!3sO|(O7G;0WBfr5%o(=xhpql1Rss}D-oBAw}kp6b(W zQ{Mf>fHNZ6m7R02z@7z;(>Pn|=ivq7u&u)_^?f1Y=uQ=PDA4pwW;kc(n&Y}@Y1j;^ zmhRo(I|mFsj&10pEh_F(u&gLI*W~t`nMxXV5O)(7?OknqH%G(Rf^AaFP4cuu!#&u^ zO}aCzq=KgT;_{GF6sm8xMNI6{up8~fvXf>k%!6pJtDmDn**%D>=)4v-UIH4rut|ZM z5rC&GK}5Gic`rLN({dNb^?gC~C}2x!uwO%;=#`BLCuHTIhJFEQSt6Cra-{-?HQa|I z?4E18$I%nVdu=_z?k%6O>>}8&r66h#4hC_QW)AOZ?>r(1+b@@c0;Hq{14C@3andB| z0(I>|rgHWnnv zNpThoB>eOhth%l@mVEZ4IF*^678|aoIB%WEwUjRKpYam;fPV z7#RU(hlKki4y*Wtg4HwAq21yK#Li_LBUu>qDn2>S;NHh_8@7s1T{F17^)Sw%JB+jV zj1=v&v&OS0;WqWWMDRJ*sCe{urJc5P&YB58?0iAP7u{hZZI)>p#FvDG-R)f@p@pw# z_$t1}FPDqX>;cmmd6QXsD2Q(;*c7J?$H+QSmmGF9JCbu80xOzKk6A6VU!!_9I%cF& z>jj42)NmU%Ex<)QtKwS5L?)j&e;h=lsKE^=ADYxOQA{n?di0Wb!Z8Tij3I?G8Pa>fxuZrJ@|aSS-9(@Oup(#zPepTt3DcF2ztN81zAu%gazd{7LS0mQ8i?oUxau~|uMut(!ITYZX2QNPHTkhX^ zB;$LD9HDqG=Z=Pjd|%|tS6~UB-bE>~upu^qNNf^I`zNuCe>MG$feEab!0HLycnND` zjh9dxYq*4UvCF8tg!LDwRDxT0y}@-@!5|i64UN_!!mo8D_o}dg`%%vUHsV&k(Ult_ zPZE3zQn!Smk@LJtK>wzl0Plkrar-2;^ha7Ju(ctN?Rm82(V@g8w%D^+H-WwJ#>l=r zdK>dNFwVj>Q6-N11*=r|{u^Eet+!i%ZZ!6KV&9$m|^1f9C58@&Ed6+gz@HV$qBTQR7 zSI6>r`y@{H#~Q8>P?*4b@_4^k_sSY^%X1H}I|+>wJT{FL#a&&9yBZ(B2kG@g5~u53 zRvv@0xI~!7l_hk3n2-^q|Emfgxs1oz_;{n+@{bEP&Jw%le0+R*0#C(ffbq1_MWlSb zYa9zV2WkQySejmh8W=~Q^mblbnL;Hbn;9cP$qAdLGY=BizvR94?fg zV5qF7%s2GX)C*(=yES24#FZzWB4=FueTVqtLKVI{n#cDeFHA%EnWcfVQ>{g4-b`CA zo@>ek&{Jz=!81NSwUqo87KeDQsKh!F>^$jo2U-Z;hj|Ejl=rK69e*o;`9T5}=%CIX z&VWwVu8W%8)V-I0-Nz2}(n23?9Kc;T$le^{?qT#0+V|mp9K`?udz5EW9XSlr%Mkqx z;|#I&808)(pr5A1_jo?IiVS@}fHx@pPqew+9imru$?tC1CBTcsOC?^zOZX9=V(!|H ziIQ7!886drDI*EGL(UT`v<`QZbv)irWNp*_s^=Nfb z<++BmI?uHb0xs2Ljf8XA7E-q=|Ka}#DwdS*BKblaj`B)pKV{G*_!)lAyMXYw4C;6I c1OA9VaV5e%n|JyB8Gm89Yw&kI%K*0j2URH_Hvj+t literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeBot/bin/main/bridge/ProcessBridge.class b/MinetestChatBridgeBot/bin/main/bridge/ProcessBridge.class new file mode 100644 index 0000000000000000000000000000000000000000..13c0ce8e7083c82654be642e5d42ca091348e95f GIT binary patch literal 643 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 W`n&pj`ZcU2hr_I|epR(I0EFyRCbEUub?7Y1dPz zc`!NBGE#gH2reEZ#|bK(@DV172$46_c#S^F2?pn;>)v}mm$!8+Rp^>)opv;ieY}w7 zuHyVt2WHgT0a}F~3iJkMUO{M6#VInw?!Ch53ndwF2u<5yfv}hkP%Kf!U=7NIM!Zka s%w?=+gA2<1f->{1to%b+`cqkj+OlVM*|YjvX+6O@Y|OUaoNc)E1+-vmxBvhE literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeBot/bin/main/commands/StatusCommand.class b/MinetestChatBridgeBot/bin/main/commands/StatusCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..2651dd75cd39e92e21228bcb928679dd544764f5 GIT binary patch literal 5339 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 4) { @@ -60,16 +65,22 @@ public class Main { OUT.println("INFO: Starting Minetest chat bridge"); String token=args[0]; String channelname=args[1]; - File in=new File(args[2]); - File out=new File(args[3]); - if (!in.isFile() || !out.isFile() || !in.canWrite() || !in.canRead() || !out.canWrite() || !out.canRead()) { - OUT.println("ERR: Input or output files do not exist or can't be read/written."); - OUT.close(); - System.exit(0); + + if (args[2].length() == 0) { + int socket_port=Integer.parseInt(args[3]); + PROCESS_BRIDGE=new SocketBridge("localhost", socket_port); + } else { + File in=new File(args[2]); + File out=new File(args[3]); + if (!in.isFile() || !out.isFile() || !in.canWrite() || !in.canRead() || !out.canWrite() || !out.canRead()) { + OUT.println("ERR: Input or output files do not exist or can't be read/written."); + System.exit(0); + } + PROCESS_BRIDGE=new FileBridge(in, out); } - ProcessBridge pb=new ProcessBridge(in, out); + try { - Bot i=new Bot(token, pb, channelname); + Bot i=new Bot(token, PROCESS_BRIDGE, channelname); i.registerInfo("status", "Status", "", Color.CYAN, null); i.registerCommand("status", new StatusCommand()); diff --git a/minetest-chat-bridge-bot/src/main/java/bridge/ProcessBridge.java b/MinetestChatBridgeBot/src/main/java/bridge/FileBridge.java similarity index 77% rename from minetest-chat-bridge-bot/src/main/java/bridge/ProcessBridge.java rename to MinetestChatBridgeBot/src/main/java/bridge/FileBridge.java index d24ad4d..42ea77e 100644 --- a/minetest-chat-bridge-bot/src/main/java/bridge/ProcessBridge.java +++ b/MinetestChatBridgeBot/src/main/java/bridge/FileBridge.java @@ -5,21 +5,18 @@ import appguru.Main; import java.io.*; import java.util.function.Consumer; -public class ProcessBridge { - public static long PING_WAIT=20000; //20s +public class FileBridge extends ProcessBridge { - public long last_ping; - public void ping() { - last_ping=System.currentTimeMillis(); - } public File out_file; public File in; public PrintWriter out; + private long last_ping_sent; - public ProcessBridge(File in, File out) throws IOException { + public FileBridge(File in, File out) throws IOException { this.out = new PrintWriter(new BufferedWriter(new FileWriter(out, true))); this.out_file=out; this.in=in; + this.last_ping_sent=System.currentTimeMillis(); } public void kill(String reason) { @@ -30,9 +27,11 @@ public class ProcessBridge { fw.write(""); fw.close(); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } Main.OUT.close(); + out.write("[KIL]"+reason); + out.close(); System.exit(0); } @@ -47,15 +46,18 @@ public class ProcessBridge { try { Thread.sleep(20); } catch (InterruptedException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } - Main.OUT.flush(); + if (System.currentTimeMillis()-last_ping_sent >= 1000) { + out.write("[PIN]"); + } + // Main.OUT.flush(); out.flush(); out.close(); try { out = new PrintWriter(new BufferedWriter(new FileWriter(out_file, true))); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } } @@ -71,19 +73,19 @@ public class ProcessBridge { try { Thread.sleep(20); } catch (InterruptedException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } BufferedReader r = null; try { r = new BufferedReader(new FileReader(in)); } catch (FileNotFoundException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } String line = null; try { line = r.readLine(); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } boolean one_line = line != null; while (line != null) { @@ -99,7 +101,7 @@ public class ProcessBridge { try { line = r.readLine(); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } if (System.currentTimeMillis()-last_ping > Main.PING_WAIT) { @@ -109,7 +111,7 @@ public class ProcessBridge { try { FileWriter fw = new FileWriter(in);fw.write("");fw.close(); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } } diff --git a/MinetestChatBridgeBot/src/main/java/bridge/ProcessBridge.java b/MinetestChatBridgeBot/src/main/java/bridge/ProcessBridge.java new file mode 100644 index 0000000..48e4a88 --- /dev/null +++ b/MinetestChatBridgeBot/src/main/java/bridge/ProcessBridge.java @@ -0,0 +1,18 @@ +package bridge; + +import java.util.function.Consumer; + +public abstract class ProcessBridge { + public long last_ping; + public void ping() { + last_ping=System.currentTimeMillis(); + } + + public abstract void kill(String reason); + + public abstract void write(String out); + + public abstract void serve(); + + public abstract void listen(Consumer line_consumer); +} \ No newline at end of file diff --git a/MinetestChatBridgeBot/src/main/java/bridge/SocketBridge.java b/MinetestChatBridgeBot/src/main/java/bridge/SocketBridge.java new file mode 100644 index 0000000..602d9b1 --- /dev/null +++ b/MinetestChatBridgeBot/src/main/java/bridge/SocketBridge.java @@ -0,0 +1,112 @@ +package bridge; + +import appguru.Main; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.function.Consumer; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author lars + */ +public class SocketBridge extends ProcessBridge { + private Socket socket; + private final BufferedWriter writer; + private BufferedReader reader; + + public SocketBridge(String host, int port) throws IOException { + socket = new Socket(); + socket.connect(new InetSocketAddress(host, port)); + writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); + } + + @Override + public void kill(String reason) { + Main.OUT.println("INFO: "+reason); + if (socket.isConnected()) { + try { + writer.write("[KIL]"+reason); + } catch (IOException ex) { + ex.printStackTrace(Main.OUT); + } + } + try { + writer.close(); + reader.close(); + socket.close(); + } catch (IOException ex) { + ex.printStackTrace(Main.OUT); + } finally { + Main.OUT.close(); + System.exit(1); + } + } + + @Override + public void write(String out) { + synchronized (writer) { + try { + writer.write(out+"\n"); + writer.flush(); + } catch (IOException ex) { + ex.printStackTrace(Main.OUT); + } + } + } + + @Override + public void serve() { + } + + @Override + public void listen(Consumer line_consumer) { + ping(); + new Thread(() -> { + while(true) { + try { + Thread.sleep(20); + } catch (InterruptedException e) { + e.printStackTrace(Main.OUT); + } + String line = null; + try { + line = reader.readLine(); + } catch (IOException e) { + e.printStackTrace(Main.OUT); + if (socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) { + kill("Socket connection lost"); + } + } + boolean one_line = line != null; + while (line != null) { + + if (line.startsWith("[PIN]")) { // A PING YAY + ping(); + } else if (line.startsWith("[KIL]")) { + kill("Minetest server shutting down; shutting down as well."); + } else { + line_consumer.accept(line); + } + + try { + line = reader.readLine(); + } catch (IOException e) { + e.printStackTrace(Main.OUT); + } + } + if (System.currentTimeMillis()-last_ping > Main.PING_WAIT) { + kill("No ping during the last "+(Main.PING_WAIT/1000)+"s; shutting down."); + } + } + }).start(); + } + +} diff --git a/minetest-chat-bridge-bot/src/main/java/chat/Bot.java b/MinetestChatBridgeBot/src/main/java/chat/Bot.java similarity index 87% rename from minetest-chat-bridge-bot/src/main/java/chat/Bot.java rename to MinetestChatBridgeBot/src/main/java/chat/Bot.java index bfda5f4..a5b0c6a 100644 --- a/minetest-chat-bridge-bot/src/main/java/chat/Bot.java +++ b/MinetestChatBridgeBot/src/main/java/chat/Bot.java @@ -5,44 +5,32 @@ import bridge.ProcessBridge; import com.google.common.collect.HashBiMap; import commands.Command; import misc.Utils; -import net.dv8tion.jda.core.*; -import net.dv8tion.jda.core.entities.*; -import net.dv8tion.jda.core.events.ReadyEvent; -import net.dv8tion.jda.core.events.channel.text.TextChannelCreateEvent; -import net.dv8tion.jda.core.events.channel.text.TextChannelDeleteEvent; -import net.dv8tion.jda.core.events.channel.text.update.*; -import net.dv8tion.jda.core.events.guild.GuildJoinEvent; -import net.dv8tion.jda.core.events.guild.member.*; -import net.dv8tion.jda.core.events.message.MessageReceivedEvent; -import net.dv8tion.jda.core.events.message.priv.PrivateMessageReceivedEvent; -import net.dv8tion.jda.core.events.message.priv.react.PrivateMessageReactionAddEvent; -import net.dv8tion.jda.core.events.role.RoleCreateEvent; -import net.dv8tion.jda.core.events.role.RoleDeleteEvent; -import net.dv8tion.jda.core.events.role.update.RoleUpdateColorEvent; -import net.dv8tion.jda.core.events.role.update.RoleUpdateNameEvent; -import net.dv8tion.jda.core.events.user.update.UserUpdateNameEvent; -import net.dv8tion.jda.core.hooks.ListenerAdapter; -import net.dv8tion.jda.core.utils.cache.MemberCacheView; +import net.dv8tion.jda.api.*; +import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.events.ReadyEvent; +import net.dv8tion.jda.api.events.channel.text.TextChannelCreateEvent; +import net.dv8tion.jda.api.events.channel.text.TextChannelDeleteEvent; +import net.dv8tion.jda.api.events.channel.text.update.*; +import net.dv8tion.jda.api.events.guild.GuildJoinEvent; +import net.dv8tion.jda.api.events.guild.member.*; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.role.RoleCreateEvent; +import net.dv8tion.jda.api.events.role.RoleDeleteEvent; +import net.dv8tion.jda.api.events.role.update.RoleUpdateColorEvent; +import net.dv8tion.jda.api.events.role.update.RoleUpdateNameEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; import javax.security.auth.login.LoginException; -import java.io.*; import java.time.Instant; import java.time.OffsetDateTime; -import java.time.temporal.TemporalAccessor; import java.util.*; import java.awt.Color; -import java.util.function.Consumer; -import java.util.function.Predicate; +import net.dv8tion.jda.api.events.guild.member.update.GuildMemberUpdateNicknameEvent; public class Bot extends ListenerAdapter { public static int DEFAULT_COLOR=Integer.parseInt("7289DA",16); // Discord color - public long last_ping; - public void ping() { - last_ping=System.currentTimeMillis(); - } - public String text_channel; public ProcessBridge bridge; public JDA jda; @@ -88,20 +76,27 @@ public class Bot extends ListenerAdapter { return this.jda.getGuildById(Main.GUILD_ID); } + @Override public void onTextChannelDelete(TextChannelDeleteEvent event) { if (event.getChannel().getIdLong() == global_channel) { System.err.println("Error ! Global channel was deleted !"); System.exit(1); } } + + @Override public void onTextChannelUpdatePermissions(TextChannelUpdatePermissionsEvent event) { if (event.getChannel().getIdLong() == global_channel && !event.getChannel().canTalk()) { System.err.println("Error ! Cannot talk in global channel !"); System.exit(1); } } + + @Override public void onTextChannelUpdateNSFW(TextChannelUpdateNSFWEvent event) {} + @Override public void onTextChannelUpdateParent(TextChannelUpdateParentEvent event) {} + @Override public void onTextChannelCreate(TextChannelCreateEvent event) {} @Override @@ -112,11 +107,15 @@ public class Bot extends ListenerAdapter { }*/ // IDEA: leave } + + public String escapeName(String name) { + return name.replace(" ", "_").replace(",", "_"); + } @Override public void onGuildMemberJoin(GuildMemberJoinEvent e) { Member m=e.getMember(); - String name=m.getEffectiveName().replace(" ", "_"); + String name=escapeName(m.getEffectiveName()); members.put(Utils.getFreeKey(name, members), m.getUser().getIdLong()); bridge.write("[JOI]"+name+" #"+ Utils.getColorString(m.getColorRaw())); } @@ -169,10 +168,10 @@ public class Bot extends ListenerAdapter { if (chosen == null) { List guilds=event.getJDA().getGuilds(); String guild_id=guilds.get(0).getId(); - OffsetDateTime min_join_time=guilds.get(0).getMember(event.getJDA().getSelfUser()).getJoinDate(); + OffsetDateTime min_join_time=guilds.get(0).getMember(event.getJDA().getSelfUser()).getTimeJoined(); for (int i=1; i < guilds.size(); i++) { Guild g=guilds.get(i); - OffsetDateTime join_time=guilds.get(i).getMember(event.getJDA().getSelfUser()).getJoinDate(); + OffsetDateTime join_time=guilds.get(i).getMember(event.getJDA().getSelfUser()).getTimeJoined(); if (join_time.isBefore(min_join_time)) { min_join_time=join_time; guild_id=g.getId(); @@ -182,16 +181,16 @@ public class Bot extends ListenerAdapter { Main.GUILD_ID=guild_id; } setGlobalChannel(getGuild().getTextChannelsByName(text_channel, true).get(0).getIdLong()); - event.getJDA().getPresence().setGame(net.dv8tion.jda.core.entities.Game.playing("Minetest")); + event.getJDA().getPresence().setActivity(Activity.playing("Minetest")); for (Member m:getGuild().getMemberCache()) { - String name=m.getEffectiveName().replace(" ", "_"); + String name=escapeName(m.getEffectiveName()); String finalname=Utils.getFreeKey(name, members); members.put(finalname, m.getUser().getIdLong()); int color=m.getColor() == null ? DEFAULT_COLOR:m.getColorRaw(); bridge.write("[LIS]"+finalname+" #"+ Utils.getColorString(color)); } for (Role r:getGuild().getRoles()) { - String name=r.getName().replace(" ", "_"); + String name=escapeName(r.getName()); String finalname=Utils.getFreeKey(name, roles); String output="[ROL]"+finalname+" #"+Utils.getColorString(r.getColorRaw()); for (Member m:getGuild().getMembersWithRoles(r)) { @@ -229,7 +228,7 @@ public class Bot extends ListenerAdapter { @Override public void onRoleCreate(RoleCreateEvent event) { - String name=event.getRole().getName().replace(" ", "_"); + String name=escapeName(event.getRole().getName()); String output="[ROL]"+Utils.getFreeKey(name, roles)+" #"+Utils.getColorString(event.getRole().getColorRaw()); bridge.write(output); } @@ -238,7 +237,7 @@ public class Bot extends ListenerAdapter { @Override public void onRoleUpdateName(RoleUpdateNameEvent event) { String oldname=roles.inverse().get(event.getRole().getIdLong()); - String name=Utils.getFreeKey(event.getNewName().replace(" ", "_"), roles); + String name=Utils.getFreeKey(escapeName(event.getNewName()), roles); roles.inverse().remove(event.getRole().getIdLong()); roles.put(name, event.getRole().getIdLong()); String output="[NAM]"+oldname+" "+name; @@ -270,21 +269,18 @@ public class Bot extends ListenerAdapter { } } - public void onGuildMemberNickChange(GuildMemberNickChangeEvent event) { - String newnick=(event.getNewNick() != null ? event.getNewNick():event.getUser().getName()).replace(" ", "_"); + @Override + public void onGuildMemberUpdateNickname(GuildMemberUpdateNicknameEvent event) { + String newnick=escapeName((event.getNewNickname() != null ? event.getNewNickname():event.getUser().getName())); if (members.containsKey(newnick)) { - getGuild().getController().setNickname(event.getMember(), event.getPrevNick()).queue(); - event.getMember().getUser().openPrivateChannel().queue(pc -> pc.sendMessage("Your nickname could not be changed to `"+event.getNewNick()+"` as there already is another guild member with a similar nickname.").queue()); + getGuild().modifyNickname(event.getMember(), event.getOldNickname()).queue(); + event.getMember().getUser().openPrivateChannel().queue(pc -> pc.sendMessage("Your nickname could not be changed to `"+event.getNewNickname()+"` as there already is another guild member with a similar nickname.").queue()); } else { members.inverse().remove(event.getMember().getUser().getIdLong()); members.put(newnick, event.getMember().getUser().getIdLong()); } } - public String getIdentifier(Member m) { - return null; // TODO replace spaces by underscores, check for duplicates, if yes use actual username or even discriminator - } - public static String getName(Member m) { return m.getEffectiveName()+(m.getNickname() == null ? "":" aka "+m.getUser().getName())+" #"+m.getUser().getDiscriminator(); } diff --git a/minetest-chat-bridge-bot/src/main/java/commands/Command.java b/MinetestChatBridgeBot/src/main/java/commands/Command.java similarity index 83% rename from minetest-chat-bridge-bot/src/main/java/commands/Command.java rename to MinetestChatBridgeBot/src/main/java/commands/Command.java index 935fb2f..5718d0f 100644 --- a/minetest-chat-bridge-bot/src/main/java/commands/Command.java +++ b/MinetestChatBridgeBot/src/main/java/commands/Command.java @@ -1,7 +1,7 @@ package commands; import chat.Bot; -import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; public abstract class Command { diff --git a/minetest-chat-bridge-bot/src/main/java/commands/StatusCommand.java b/MinetestChatBridgeBot/src/main/java/commands/StatusCommand.java similarity index 93% rename from minetest-chat-bridge-bot/src/main/java/commands/StatusCommand.java rename to MinetestChatBridgeBot/src/main/java/commands/StatusCommand.java index 9e937f9..b9ffac7 100644 --- a/minetest-chat-bridge-bot/src/main/java/commands/StatusCommand.java +++ b/MinetestChatBridgeBot/src/main/java/commands/StatusCommand.java @@ -2,17 +2,20 @@ package commands; import appguru.Main; import chat.Bot; -import net.dv8tion.jda.core.EmbedBuilder; -import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import java.util.Locale; import java.util.concurrent.TimeUnit; public class StatusCommand extends Command { + + @Override public int getMinArgs() { return 0; } + @Override public int getMaxArgs() { return 0; } diff --git a/minetest-chat-bridge-bot/src/main/java/misc/GarbageCollector.java b/MinetestChatBridgeBot/src/main/java/misc/GarbageCollector.java similarity index 100% rename from minetest-chat-bridge-bot/src/main/java/misc/GarbageCollector.java rename to MinetestChatBridgeBot/src/main/java/misc/GarbageCollector.java diff --git a/minetest-chat-bridge-bot/src/main/java/misc/Utils.java b/MinetestChatBridgeBot/src/main/java/misc/Utils.java similarity index 100% rename from minetest-chat-bridge-bot/src/main/java/misc/Utils.java rename to MinetestChatBridgeBot/src/main/java/misc/Utils.java diff --git a/MinetestChatBridgeIRCBot/.classpath b/MinetestChatBridgeIRCBot/.classpath new file mode 100644 index 0000000..9f9cc9f --- /dev/null +++ b/MinetestChatBridgeIRCBot/.classpath @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/MinetestChatBridgeIRCBot/.project b/MinetestChatBridgeIRCBot/.project new file mode 100644 index 0000000..df93e45 --- /dev/null +++ b/MinetestChatBridgeIRCBot/.project @@ -0,0 +1,23 @@ + + + MinetestChatBridgeIRCBot + Project MinetestChatBridgeIRCBot created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/MinetestChatBridgeIRCBot/.settings/org.eclipse.buildship.core.prefs b/MinetestChatBridgeIRCBot/.settings/org.eclipse.buildship.core.prefs new file mode 100644 index 0000000..7a23d11 --- /dev/null +++ b/MinetestChatBridgeIRCBot/.settings/org.eclipse.buildship.core.prefs @@ -0,0 +1,13 @@ +arguments= +auto.sync=false +build.scans.enabled=false +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(5.6.1)) +connection.project.dir= +eclipse.preferences.version=1 +gradle.user.home= +java.home= +jvm.arguments= +offline.mode=false +override.workspace.settings=true +show.console.view=true +show.executions.view=true diff --git a/MinetestChatBridgeIRCBot/bin/main/appguru/Main$1.class b/MinetestChatBridgeIRCBot/bin/main/appguru/Main$1.class new file mode 100644 index 0000000000000000000000000000000000000000..5fb14c4edd9c900dcf0a7a310b7afcaba2f31059 GIT binary patch literal 8106 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 WskOeqK3PR7mnosSzN9;YYySd*xnzL= literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/appguru/Main$3.class b/MinetestChatBridgeIRCBot/bin/main/appguru/Main$3.class new file mode 100644 index 0000000000000000000000000000000000000000..8444d8d863b8eff49bb04e6a4300117cdf68d10e GIT binary patch literal 1004 zcmZuvZBG+H5Pr5jdTl+SmNyk&Rt0Q}r7FH8U^Li>kN_X3A!+pmY zktPa>Mt^`m$~fEhgF-*-&g|^WGc(W3??2yv0eFsQE>aBR;`q3e=%ltIf@prlg~KrA zt6on;?YOoT9jN-?!7yEd^JpTViCw#5_Gr*bXAOoAg>zzZ0!c+C<71;l9v;eGiR} z=>{=FVf+6Us03Gjlzw6;aCJlt??;q1!scRzz|S|B#Z`u}^_EIZ7S|bGt@8sZOrm8~ z2Y#1t?bUfp8SbknBA$p6zC+y@85?d?|J&~h`tJ&I2xAvF7-r9Bd7T7dTk0%sF)VH< z&3j5q9?&#+EG0Kx$=?QMGimWXDcU{BS9u0$`c?L>ipL_+8e&0}%|mkjxaO0+LG0z1x}UAAT0G!6Sr z&?RvSQxZ}XVa!F}^|&cx8mAdfb$rL+meN~_zNZ@*+CPGt5m;NqzKkoFCGLy)w#slZ zq~yOg=Y-d5GScD`xn8N&Dr%{)(kQA)GF+GOA?As73bV@{kKuB<`WA|L&%t3A(?x^VEc+4q ziL&UAgJg$Wa!IVRTQafQ(g8){{N%jWi6W)8nW|>cC4&#+oSiW1j74 zMm@kOyniX9E%eDvhx1S!d+>9Zg(SYgx`c1vfDihwX#3Q?BER2>c*XI6p^f6@u_0LR zFgzKNJ$CTiSREYE&HqO~r!=ab=J{?MJ(62Hf{8eEl0)#+4VK<{w$JAH%pjZQ^r*k5 zj+hiw!d>6dJl(d|P3lhC7V`u5B!qbtZBPB&;g57N&k|xtE{MF)v@2O1!**#h)w#E2 zcV+n4rFbT7VK|dMBA}R>a>cT^Q!q5wqNw4vKdvXBf z(g0UqVQz?z)OKWm#nE~ix1R^P=m2;3b-7R%8{m_F=!STZjiw%D$yA<+MFQ_bG+v<@ zJip*SPUER9?jgQbhtRUI_-o|blc_GnO>L^}=uA{?$5LBrTbhZfFZYjlmB527BF>he zuv=JSw^3$y@RZi;>@L;XGJay&fP(u(2(UMzKuFto7SOT>116Cc$1kvOo;Y5oHnhna kMF(Z@urIC`bWh;y-^EJCR{#J2 literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/appguru/Main.class b/MinetestChatBridgeIRCBot/bin/main/appguru/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..c97d34168d4ff39c5b19c53fb09afeb4e3920667 GIT binary patch literal 11684 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 literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/bridge/FileBridge.class b/MinetestChatBridgeIRCBot/bin/main/bridge/FileBridge.class new file mode 100644 index 0000000000000000000000000000000000000000..23b2d793fb3c62a65a45ea47928630fea536d74f GIT binary patch literal 4244 zcmbVQ`&Sg_8GZ&9W_KM$7etA-jiCk>kZ59>h#_7g3bIH9Q8WgJ-2q0I+0E>%Xp%Oy zP3=AHNz^LN1(gm3 ziZOgcb-fb8OKapSrv;FR8EJ`zPGTWAh08yG{PuFr3MXE z463faPepZ+d{I~`mMf^9HncrAG-TLD(hFI|4GJRDdlHnl9!3pTit$z4z9#BJ^?hM1 z!y4I+(&fyyUk2GhBB1P)6E)Gl!sA|1{E;{i(U6A-5PH0IhA#c zQ4Nh~V&f7y+h!4a%~2z6rc!3sO|(O7G;0WBfr5%o(=xhpql1Rss}D-oBAw}kp6b(W zQ{Mf>fHNZ6m7R02z@7z;(>Pn|=ivq7u&u)_^?f1Y=uQ=PDA4pwW;kc(n&Y}@Y1j;^ zmhRo(I|mFsj&10pEh_F(u&gLI*W~t`nMxXV5O)(7?OknqH%G(Rf^AaFP4cuu!#&u^ zO}aCzq=KgT;_{GF6sm8xMNI6{up8~fvXf>k%!6pJtDmDn**%D>=)4v-UIH4rut|ZM z5rC&GK}5Gic`rLN({dNb^?gC~C}2x!uwO%;=#`BLCuHTIhJFEQSt6Cra-{-?HQa|I z?4E18$I%nVdu=_z?k%6O>>}8&r66h#4hC_QW)AOZ?>r(1+b@@c0;Hq{14C@3andB| z0(I>|rgHWnnv zNpThoB>eOhth%l@mVEZ4IF*^678|aoIB%WEwUjRKpYam;fPV z7#RU(hlKki4y*Wtg4HwAq21yK#Li_LBUu>qDn2>S;NHh_8@7s1T{F17^)Sw%JB+jV zj1=v&v&OS0;WqWWMDRJ*sCe{urJc5P&YB58?0iAP7u{hZZI)>p#FvDG-R)f@p@pw# z_$t1}FPDqX>;cmmd6QXsD2Q(;*c7J?$H+QSmmGF9JCbu80xOzKk6A6VU!!_9I%cF& z>jj42)NmU%Ex<)QtKwS5L?)j&e;h=lsKE^=ADYxOQA{n?di0Wb!Z8Tij3I?G8Pa>fxuZrJ@|aSS-9(@Oup(#zPepTt3DcF2ztN81zAu%gazd{7LS0mQ8i?oUxau~|uMut(!ITYZX2QNPHTkhX^ zB;$LD9HDqG=Z=Pjd|%|tS6~UB-bE>~upu^qNNf^I`zNuCe>MG$feEab!0HLycnND` zjh9dxYq*4UvCF8tg!LDwRDxT0y}@-@!5|i64UN_!!mo8D_o}dg`%%vUHsV&k(Ult_ zPZE3zQn!Smk@LJtK>wzl0Plkrar-2;^ha7Ju(ctN?Rm82(V@g8w%D^+H-WwJ#>l=r zdK>dNFwVj>Q6-N11*=r|{u^Eet+!i%ZZ!6KV&9$m|^1f9C58@&Ed6+gz@HV$qBTQR7 zSI6>r`y@{H#~Q8>P?*4b@_4^k_sSY^%X1H}I|+>wJT{FL#a&&9yBZ(B2kG@g5~u53 zRvv@0xI~!7l_hk3n2-^q|Emfgxs1oz_;{n+@{bEP&Jw%le0+R*0#C(ffbq1_MWlSb zYa9zV2WkQySejmh8W=~Q^mblbnL;Hbn;9cP$qAdLGY=BizvR94?fg zV5qF7%s2GX)C*(=yES24#FZzWB4=FueTVqtLKVI{n#cDeFHA%EnWcfVQ>{g4-b`CA zo@>ek&{Jz=!81NSwUqo87KeDQsKh!F>^$jo2U-Z;hj|Ejl=rK69e*o;`9T5}=%CIX z&VWwVu8W%8)V-I0-Nz2}(n23?9Kc;T$le^{?qT#0+V|mp9K`?udz5EW9XSlr%Mkqx z;|#I&808)(pr5A1_jo?IiVS@}fHx@pPqew+9imru$?tC1CBTcsOC?^zOZX9=V(!|H ziIQ7!886drDI*EGL(UT`v<`QZbv)irWNp*_s^=Nfb z<++BmI?uHb0xs2Ljf8XA7E-q=|Ka}#DwdS*BKblaj`B)pKV{G*_!)lAyMXYw4C;6I c1OA9VaV5e%n|JyB8Gm89Yw&kI%K*0j2URH_Hvj+t literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/bridge/IRCFileBridge.class b/MinetestChatBridgeIRCBot/bin/main/bridge/IRCFileBridge.class new file mode 100644 index 0000000000000000000000000000000000000000..c8843cc5bd0d141b20f376a511968371a300ea8e GIT binary patch literal 715 zcmZuu+foxj5IvoQEG#RKKmuO5V=m}E`Vh-16H&Knh2m0qr6$Q#7+rQ!dr|x>eGtnB zK7fz1>`5XqRlfA}=|0_ky65)yuNwd_@XSJnu+oWCuPvN=Q+a)iP-GYJ#& zFIA|LSA_M7|51DvuF|f_H>OdwO|TEHx^j>x9mW>s2+M!@-qBr#kZb9lw2_75U%HVM@mt3frQ1<^Pzd^{TkgzbVijdW5!ZSaqARv^+ zD+D6!yQfK{!hWOLHd*K0l^W2K|hUB_k&QOgGYEwm~Xv*eRkeF@!q^U zV1}=vuDM}TCk-3x*tD?0H<&~nY@tM$jW5!qr@w?YcCcq*m#{QE%t*!8IFXkQo}$7s z<&`pOE1o%LK9VBVyi{?t)W52E(5X(Nt~6i4jH$nTZrWoLygh$AkYSH6&9B8M$7mKd zdmiTv!>ZNyuQC5^NWI6_W-742C5voC-TKxx}WPf6NGN8yRz@;->ET3aFySZ3%VeXR!YV#Vn4= literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/bridge/IRCSocketBridge.class b/MinetestChatBridgeIRCBot/bin/main/bridge/IRCSocketBridge.class new file mode 100644 index 0000000000000000000000000000000000000000..543be692665e73d05673095a2d5b6cc0c6925572 GIT binary patch literal 704 zcmZuu%Wl&^6g`ugxOH9HB#kLhpyind;3bP7BoYc(G9a2NTQqS-$xzo5jmJriNu7Cge`3t}kJaSQC2*z4YrXq}X2Sb(Y3)3%q7Y;+?WOjbQ zP<<*hX`T_a6@TQPc$o5R8V-$?*|Zn6M-1N1VIt;6sw{W0L^>r*sxW$YI$>}IY9c%= z!1r+pRfg4AX5wveFcx}`k5j==k5$6c5!cf8Cx?!i$(&&$zBqZ0lxHe8mi=Emn$4A_ z8H=dgmubq-yxR(M19UY+`|JG_ZimCrTvl{ap0qcHpLW& zk`gGPY`9y)>X*(TSCPPrc>WI^82&`G%|A o@3^(_19#61>Xd>2l&V2CO_B{tqu`i$YE(m~G-BuyzJiB;0p-DrG5`Po literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/bridge/ProcessBridge.class b/MinetestChatBridgeIRCBot/bin/main/bridge/ProcessBridge.class new file mode 100644 index 0000000000000000000000000000000000000000..13c0ce8e7083c82654be642e5d42ca091348e95f GIT binary patch literal 643 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 literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/handlers/NumericResponseHandler.class b/MinetestChatBridgeIRCBot/bin/main/handlers/NumericResponseHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..5cc5208a3f61ed3b7eea1b532413add8d4933a33 GIT binary patch literal 1573 zcmb7EYfsZ)6n@^Vv~DXK0s|)qqC>Ya8D2nfI2|(tmU;;@e6}lfD{Sr3bte7{{{bc> zenq2r`QQ)mH~2gJV2pZtLAEh4rfK`W=Y7sO&$+!{e|`P};3f(Jd<>ISS>LRwW;64! zRaZ?-Sy!74LvO09u3P}eFt8;*moqh4uVfyTw^YSq5IjAGnAB~;Q_V8)OPa1(Ifn7X zv8dz*16MFM)gb%`i4Y(%_!G&E02sm|`oJ?pBu!U|VOcew$mN>KFen*{T-%UM&E9)L z&Z=rnhN&aYx}vhFxvUwUB_z#MGHdIFWy8u!hoP1%Q`0M+q-ANf%mcY`GCD=i|Xafy(R^Q96)v}fjm zNFXI3N$0xTqX)ez8OC<2Az}t;n~$?&m`)r`S5oRy&4w_GIRP1lQMVHgN5JK1iWtIG zhWnkR>bB$ha@ym>>if$Er9^D+HHMI4)ax{8x?Fc!`bhIpYAm@zEgfm|W49s2+ca9H zLTY?NHsv~D2HG$V7Y3%$yUZ}sIV~?52NN^jrbBjnbchS+>@I1zq z@6rFp!9?gAb~MA_5FzXUJ-~>I#%T=Fj`SR>lpU(_Fr7t7<|CAC`#Wh0^e?9OG0N{C z?_c0wBc6`(`#3i+_X=Texws4AEvELOJoohF0w3l3c7K0My+i*@`XesK`aa-5!*yaxjBtaHcHBiQ&?RnXsEAu6 x#lDW$g}0-NsHNK)2kKBtm@02I)bpkP~En%k$^I1n1(Yi5KgQnH~3k!w)7}MXjjn+ zMW8Edm^veE>h`*}S<(f1vQ}OzZD_V3W&bej6pgAtB3qAmB)YUf#PM(oh*g13@1B22 z;C>=&*!k4T+Tw!cq_d`%>VC@U?6&q&OVu2sl*$@aC!KVyz0|k%nP8CioKY|}r)CrP zvtzlO^Fov~vyjR;wqX|1^G(B?^w2*woFZSs=UU*!!H6#Apu<2G54DP)R1Q-CThBX8HgM(>5Wp+pH1N}mq9{(|Oa%P`-G^CFaTe!Th$Y=DI7NX_BDo^X z2UQH=JQew(W@j8(p)1M7c3i+n1Q!K*WqllaaTTK&qvexKE+-IgSQJqtFdjjY`a@Nf zwXB_5Ma2XrB_3B27)|_7MDo9aj6&dwif)`>2AdY)s=)#l=*U~;GF#Ks%5D!Grh&y8 zcC-R}s4GCTEDK_(S~WY*Yf444wK8qG12%4Du!{`-76keZw&$zLev3{A?$B?8*9#Tlh{Qq1@2MPg3Mn7-n1MiM0r-H^v1Vl849-l?ODriZN@ZkNK$4|4xLk$gBWpXtPQzl39Zu(R1?QI* zC8xS&<^bI*0`mtnRP{i?#Ky?L$iNJY1O^61U?8(HumSn(KpqnV2av@HW^n-k*!G0t literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/handlers/TimeoutResponseHandler.class b/MinetestChatBridgeIRCBot/bin/main/handlers/TimeoutResponseHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..5228ffbfa3f4e106aa21c5ada749e99d878563ab GIT binary patch literal 1422 zcmb7E+fEZv6kVq+Q(6Yva;Yt#h@wu*rQQ&=*at}r;GmHbd^FQCmce$WnNCgk51);n zfJV^x;G++IlQFI{Ewy0Ln5O5P*=JwYUVF`a|M}%BfF%^d2nbB=8um`rbQ`%Xt7bY) zZ_{kl9lK$!w(Mbq1mb(fYa>@R>`LxwY0oTsVJHHrPUxu^fskceo`6^v2z#x(0?M+q z7I>?zXSTVmI6Gz(K@6#gA|?>jGTTukFcQY_iK4~*hG*7PjABe6QEs}fX?qgyhE=Uv z4L@={0)cZX!swT$w2BD&1!B5on@^gxlId<4rK%|~tUG0+x^1|Yd~O><-mc6ut#^9r zO-Ei}wB_>L@^(pA+fCr5rdw_~x3;g&WNbkhSPM*3{&ccYt-ly@AC1dBrw$0}SLek<3mVBK4le0LHlvBgA!xYm8xW{t}p=CCPgR zViM=M%abf1=*;0U{YBaWnC3Hu!Lz_++5^XSzx+2SJ}8Zqmz1QE{fMN=CH3Yl2C_$( z`GBhj+1a`IbST|-gt-Ie3Hhj!Yz|0qP4hD{&eMdCL?T;d%YfEFreOg&)|a;HxZ&g0 za1*!u)-~LwP4=i^5qFrek4Tq@OTk@QTYXCZdu{(k+^0{TcM8N0OiD_Z`4qr|UoM4O AIsgCw literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/handlers/TopicResponseHandler.class b/MinetestChatBridgeIRCBot/bin/main/handlers/TopicResponseHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..ddccc9eeb1d4bb24a76c8e2e7d462a307ecb2be5 GIT binary patch literal 6871 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 Zs`3B05dZC5PHH^a7#Qoslc2G#e*?xz5#s;= literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/handlers/TryAgainHandler.class b/MinetestChatBridgeIRCBot/bin/main/handlers/TryAgainHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..c4996521a76e74ddd1d6fd213f72c9c1831ccd17 GIT binary patch literal 1594 zcmb7E+int36kUfR(~eWAEv;IswO)Z%@P4CGYqb`|OQfmM7jsHSItnv53`YOJU+~R0 zU)5+$H1Pxc1V6^O&KWADqDB%J&c3d__B!+J$LFsA&Z1x-BCvB+x+_)NZ)6w!7qb=V zxC^1dKvZD7?R9Fl*9`93jk@PH>{gI~QTA#zW(W)xAIoPlTa|7lTMB%~t>gq^(~j!| zd4b{N@9xx+Ky=Pqv9}NqKSM7~^q}8@fo=38ucwy!ATVHI3t|HCqT|}Pnzd!yUzE#L zTebAcvbrRFN1a>7Xt3%u1V)Q(?46SlR-flCh64%oBo&TC7=6zPRypP`=c8oN@ypr5 z-MPzNko$dv(9#T?YWAkA|2?4SG=f}8*9+-eS!YurDmfKb22G!1z5cJJ(|dI!m?d7)ZX$snJsDNQcEVLkTGynU`V5Lylmn2)#qiq z9yp$BA&U{Js!pi}r9hUSEc&u+_u)8B8aTlug=5pEES$n=0=iKs7CBSbWvU8iEu7PV zcVORZ zbLW(l)=1|qc~M`#DW^Bop?bRrAPndf5*M~1PxbGTm}lR9O)3kwE~Z)1gUmbX>Lxb5 zZZc{^lnlAzn}7qUJI{YT{6}^0w~wa+&k;WR(+QZLV5KKNBL0qs2)6Tgn@;Xm?+;jr zW01CyFabkI@WfPISTz`?FDyGryHMYDshBnl=n_`wY?Tn$ft@V6iwO~oYFyu0)ZjTY zHMn~XdtTw-WcmZ*Um)(Q=O-Lk!=X1YFT{4m)-d@V$KJljnYX(A7{;m7s2*Tc&pgPQ z35*fo1R)+~w>0~xVHUzJzlO=+JT7Q-8RVF&xXEA|7c~(XID ftsylk{z@x;23Hv|PhT&39vYa6DgLkV9Kpg*{WX6y literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/irc/Command.class b/MinetestChatBridgeIRCBot/bin/main/irc/Command.class new file mode 100644 index 0000000000000000000000000000000000000000..094f07ef3d5b0e70f5bdf87a2fa737322f191ae6 GIT binary patch literal 329 zcmX^0Z`VEs1_pBmZgvJHMh5Q8qGWyN{M_8cycBi@7Dfhvti-ZJ{hY+SbbbG%tkmQZ zMh5oOiqz!Nl2k?p2Mr&Pde0zdr~DFYAF$HWlFS@^-^2na7pyb5q$o2l9a(`-W^swN zW*8#_XK-eEUSdgU5zx3QJjU5TOvf}1$!XShge}Eljvd$`T*3LJMaijdnK?k0@IZq= l59B2_Mg~R(W?&#OFfal`gq48}$Y%%gm>4*KEKV?s3jhXpU*G@$ literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/irc/Default.class b/MinetestChatBridgeIRCBot/bin/main/irc/Default.class new file mode 100644 index 0000000000000000000000000000000000000000..87c63a41d0639bb002318877aacf330cfb8faecf GIT binary patch literal 365 zcmX^0Z`VEs1_pBmZgvJHMh5Q8qGWxS)U?FXoDy~h7Dfhvti-ZJ{hY+SbbbG%tkmQZ zMh5oOiqz!Nl2k^9APpaode0zdr~DFYAB582lA_GKbf`#aNoJ0|Z(;#{1wNU@CDxi@ zj0~K?ndy0nC8b3`3wlVhzy_BKkeqLAN7xxy%&`MIjVn06v?w{%Ei(t`HXdj&>4Ch> i#>l|PzzhsX1_nl8sIfAz0r~7e9uorxki`jRaRC4yHf>M< literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/irc/HandledResponse.class b/MinetestChatBridgeIRCBot/bin/main/irc/HandledResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..dee62d46daf06e35d43023bbb2df0a421cf9b4cc GIT binary patch literal 1056 zcmZ`%T~8W86g|TN3+vVoL{!w;4_g7Pl(yOjh>;phi7PfNl8`>Fu%&C3#VlaTziRP8 z)261+{ZUQtj8rxa?!(TUnS0JXckccD=lczSx7d;4W0> zYbOP|j(xm`9?I2i%dxt<3{oOlCB6N2!weyyfMG^O1hXWX8-~OZ+Q^>XbuFivEhejB zik(vtKrjTEg9Q~b2O$oYRD?JPbMR0_7(u>!q(Z?2!<1$@W~tXYHQkDFYMTrZtz9?l zs^MB3i$etxX2@Lkv(+I#7lz$4X|s?>jxS6>0x20uhG~!Cey3};RBT|AA#Av=(XY49 z`wS^>S;wbmX1$v&dMf>QM5QvwBKh$rhNPD^e2wJTcjoqAs(676!?u^TZyTLX)|2W^ zW@MX>0X16D+da2#9$5T|qW_J~77wSQbgStY-JVM!>mF4uksIr5H@laiW=J%efxSiE zLV#B4o>-}IVx^t|({bK0iu6-MRXiZxB%v>a`B(V?R*OtYSD3y;RDhUYfO!EH0|LYa zSPlxXBL5_kG(c3Z`3IQSYk>jcdM!A>ihhaJZ=~zPWBMz!^2~3@>l1OxZ)iM+E;4k^ ztB_M0%U5_hA_ge{Ly{`?GS+xGG>Fged`RD+(m6dgz-sMKO5N0Q+}V+|bdB}RuXJ;3 n<5rE`SqM{8w}u)iis8AG2uocf{R`}Vo)52t=4&d5Yj6Jrd`8$A literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/irc/IRCBot.class b/MinetestChatBridgeIRCBot/bin/main/irc/IRCBot.class new file mode 100644 index 0000000000000000000000000000000000000000..71fc4fd1b5fdda7bae050c6c6c41dc3568906d72 GIT binary patch literal 9202 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 literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/irc/PongCommand.class b/MinetestChatBridgeIRCBot/bin/main/irc/PongCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..b79ddabf9955b353fce695e995505f89fdb0b861 GIT binary patch literal 1442 zcmah}+fvg|6kVrHo6?3`xmi?1MQyp&8=?d%PywqI7|Sr@12d*=rUcuhlb$-r*ZAf$ zFJ;gf$7esvai1hgYO6jZIhVE9S!?fo^8Lr>uK*VDQbvHG->^&RUCXRwty)bp%Q7T} zfg|m`mab}MCB0KT(o0-Mm?0*h9*iNpY?ubmFa(pSeFiCOmGvlsh$)Z}A>zDY>f6m) zQMdQBVpV5|=dF@f-PdeG%)Ld49~upY!TcXOR0df;)=N!Jk*i5(JNG)fZgDm5sB3bg zntr9#y{RL%z-_~<_yKvN!BwHJr(je}jW=zgJNXCQvdi8{=gWqg`TwC^crqj;h7pX( z7-i_Ya3Mr0xP%0yv0WeDx=Y;R3QF^+2@>5~j2 z$xiw1p*IxV#1t`CbS`kYln?0^S(S0St@iGTfQFu)x5`_9C9hc+4>57qM*TC=2BEJo*X^XIU zhc{}_a9y*t8U+sc0-cT{ffO|2F1IVAxY72D@S*=HH*GU8sdv`BdaNKPg;&u-Begg9%qqq)A7d;{RT?FV$*P7lvG)vQ$(Kj@GhUlrY ztDpQf literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/misc/GarbageCollector.class b/MinetestChatBridgeIRCBot/bin/main/misc/GarbageCollector.class new file mode 100644 index 0000000000000000000000000000000000000000..7b6c716a9ab94590ade6778371e3cdf97b67b809 GIT binary patch literal 647 zcmaKp&2G~`6ot!@BYk}Z=XH`c!ahCOQ1Q`v(WEJGm;b4Nuo%FSz;X6 z0?TLewe%wyPyE5DQF1I$d!l2VJr$_5cZULYCmAaj6*N3lQ4?4SbgYi@=}4J@97RfC zHAq4k4W-eAo(JvhRL=y~gMSu(OuWhC29~kvU`4=_X*$VG?jK4Wd$^1>a(jCx&-QxV zm!0Dv=ynGC$43In3;Z~7hO+t3Sk+*{XSKxdLCHPRL z^M$zmBsZaYu8Wm5|Nf1K1rOWcUifo>MUU&Ib*Oyaf_L@)N7Uby&n|88%pfk&dUM~y z0+qnxujH68i?Ox$Sh_&-9QEMA2VA|t=K1%pWmXLhuC9WD*&+}0YNWcPF7m9PUe;*+ djWsh@o*79V@3JgAava;pvaz!` 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 literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/bin/main/numeric/NumericLookup.class b/MinetestChatBridgeIRCBot/bin/main/numeric/NumericLookup.class new file mode 100644 index 0000000000000000000000000000000000000000..2346c2dcc92df7fa2bc7774645db7611940110be GIT binary patch literal 5969 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 X^cXTX;c=C3qO#nyRw{2w0;=~NtMgmg literal 0 HcmV?d00001 diff --git a/MinetestChatBridgeIRCBot/build.gradle b/MinetestChatBridgeIRCBot/build.gradle new file mode 100644 index 0000000..3957464 --- /dev/null +++ b/MinetestChatBridgeIRCBot/build.gradle @@ -0,0 +1,25 @@ +apply plugin: 'java' +apply plugin: 'jacoco' +apply plugin: 'application' + + +description = 'Minetest Chat Bridge IRC Bot' + +mainClassName = 'appguru.Main' + +repositories { + jcenter() +} + +dependencies { + testCompile 'junit:junit:4.12' +} + +jar { + manifest { + attributes( + 'Created-By': "Gradle ${gradle.gradleVersion}", + 'Main-Class': "appguru.Main" + ) + } +} \ No newline at end of file diff --git a/MinetestChatBridgeIRCBot/gradle.properties b/MinetestChatBridgeIRCBot/gradle.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/MinetestChatBridgeIRCBot/gradle.properties @@ -0,0 +1 @@ + diff --git a/MinetestChatBridgeIRCBot/settings.gradle b/MinetestChatBridgeIRCBot/settings.gradle new file mode 100644 index 0000000..bd9ebeb --- /dev/null +++ b/MinetestChatBridgeIRCBot/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'MinetestChatBridgeIRCBot' diff --git a/minetest-chat-bridge-irc-bot/src/appguru/Main.java b/MinetestChatBridgeIRCBot/src/main/java/appguru/Main.java similarity index 81% rename from minetest-chat-bridge-irc-bot/src/appguru/Main.java rename to MinetestChatBridgeIRCBot/src/main/java/appguru/Main.java index 7ae8d57..5092e69 100644 --- a/minetest-chat-bridge-irc-bot/src/appguru/Main.java +++ b/MinetestChatBridgeIRCBot/src/main/java/appguru/Main.java @@ -1,6 +1,8 @@ package appguru; +import bridge.FileBridge; import bridge.ProcessBridge; +import bridge.SocketBridge; import commands.Command; import commands.InfoCommand; import handlers.NumericTimeoutResponseHandler; @@ -24,11 +26,13 @@ public class Main { public static String IRC_PREFIX="?"; public static String PREFIX="!"; - public static long PING_WAIT=20000; //20s + public static long PING_WAIT=5000; //5s public static PrintStream OUT = System.out; - public static IRCBot chat_bridge; + public static IRCBot CHAT_BRIDGE; + + public static ProcessBridge PROCESS_BRIDGE; public static void main(String[] args) throws IOException { String project_url="https://github.com/appgurueu/adv_chat"; @@ -72,20 +76,23 @@ public class Main { String nickname=args[3]; String channelname=args[4]; - File in=new File(args[5]); - File out=new File(args[6]); - if (!in.isFile() || !out.isFile() || !in.canWrite() || !in.canRead() || !out.canWrite() || !out.canRead()) { - OUT.println("ERR: Input or output files do not exist or can't be read/written."); - System.exit(0); + if (args[5].length() == 0) { + int socket_port=Integer.parseInt(args[6]); + PROCESS_BRIDGE=new SocketBridge("localhost", socket_port); + } else { + File in=new File(args[5]); + File out=new File(args[6]); + if (!in.isFile() || !out.isFile() || !in.canWrite() || !in.canRead() || !out.canWrite() || !out.canRead()) { + OUT.println("ERR: Input or output files do not exist or can't be read/written."); + System.exit(0); + } + PROCESS_BRIDGE=new FileBridge(in, out); } - /* Open Process Bridge */ - ProcessBridge pb=new ProcessBridge(in, out); - /* Create IRC Bot */ - chat_bridge=new IRCBot(port, network, ssl.equals("true")); + CHAT_BRIDGE=new IRCBot(port, network, ssl.equals("true")); - chat_bridge.commands.put("PRIVMSG", (bot, tags, source, params) -> { + CHAT_BRIDGE.commands.put("PRIVMSG", (bot, tags, source, params) -> { if (source == null || params.size() < 2) { return; } @@ -130,13 +137,13 @@ public class Main { mentionstring+=",irc"; } } - pb.write((params.get(0).startsWith("#") ? "[CGM]":"[GMS]")+nick+" "+mentionstring+" "+msg_content); + PROCESS_BRIDGE.write((params.get(0).startsWith("#") ? "[CGM]":"[GMS]")+nick+" "+mentionstring+" "+msg_content); } else { String command="PRIVMSG "+nick+" :No message given. Use '@mentions message'."; try { - chat_bridge.send(command, new TryAgainHandler(command)); + CHAT_BRIDGE.send(command, new TryAgainHandler(command)); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } return; @@ -146,12 +153,12 @@ public class Main { if (commandname_and_params[0].length() == 0) { String reply="PRIVMSG "+nick+" :No commandname given !"; try { - chat_bridge.send(reply, new TryAgainHandler(command)); + CHAT_BRIDGE.send(reply, new TryAgainHandler(command)); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } else { - pb.write("[CMD]"+nick+" "+String.join(" ", commandname_and_params)+(commandname_and_params.length == 1 ? " ":"")); + PROCESS_BRIDGE.write("[CMD]"+nick+" "+String.join(" ", commandname_and_params)+(commandname_and_params.length == 1 ? " ":"")); } return; } else if (params.get(1).startsWith(Main.IRC_PREFIX)) { @@ -180,13 +187,13 @@ public class Main { return; } if (params.get(0).startsWith("#")) { - pb.write("[MSG]"+nick+" "+params.get(1)); + PROCESS_BRIDGE.write("[MSG]"+nick+" "+params.get(1)); } else { bot.sendTryAgain("PRIVMSG "+nick+" :I can only deliver your message if you use '@mentions'."); } }); - chat_bridge.commands.put("JOIN", (bot, tags, source, params) -> { + CHAT_BRIDGE.commands.put("JOIN", (bot, tags, source, params) -> { if (source == null || params.isEmpty()) { return; } @@ -200,42 +207,42 @@ public class Main { for (byte b=0; b < colorstring.length()-6; b++) { colorstring="0"+colorstring; } - pb.write("[JOI]"+nick+" #"+colorstring+" "+channelname); + PROCESS_BRIDGE.write("[JOI]"+nick+" #"+colorstring+" "+channelname); }); - chat_bridge.commands.put("NICK", (bot, tags, source, params) -> { + CHAT_BRIDGE.commands.put("NICK", (bot, tags, source, params) -> { if (source == null || params.isEmpty()) { return; } int indexOf=source.indexOf('!'); String nick=indexOf >= 0 ? source.substring(0, indexOf):source; - pb.write("[NCK]"+nick+" "+params.get(0)); + PROCESS_BRIDGE.write("[NCK]"+nick+" "+params.get(0)); }); - chat_bridge.commands.put("QUIT", (bot, tags, source, params) -> { + CHAT_BRIDGE.commands.put("QUIT", (bot, tags, source, params) -> { if (source == null || params.isEmpty()) { return; } int indexOf=source.indexOf('!'); String nick=indexOf >= 0 ? source.substring(0, indexOf):source; - pb.write("[EXT]"+nick+" "+(params.size() >= 2 ? params.get(1):"no reason")); + PROCESS_BRIDGE.write("[EXT]"+nick+" "+(params.size() >= 2 ? params.get(1):"no reason")); }); - chat_bridge.commands.put("PART", (bot, tags, source, params) -> { + CHAT_BRIDGE.commands.put("PART", (bot, tags, source, params) -> { if (source == null || params.isEmpty()) { return; } int indexOf=source.indexOf('!'); String nick=indexOf >= 0 ? source.substring(0, indexOf):source; - pb.write("[BYE]"+nick+" "+(params.size() >= 2 ? params.get(1):"no reason")); + PROCESS_BRIDGE.write("[BYE]"+nick+" "+(params.size() >= 2 ? params.get(1):"no reason")); }); // TODO Probably Ident & SASL negotiation ? //chat_bridge.send("CAP LS 302"); - chat_bridge.send("NICK "+nickname); - chat_bridge.send("USER Minetest null null :Minetest Chat Bridge"); // 0 * + CHAT_BRIDGE.send("NICK "+nickname); + CHAT_BRIDGE.send("USER Minetest null null :Minetest Chat Bridge"); // 0 * - chat_bridge.send("JOIN "+channelname, new NumericTimeoutResponseHandler(20000) { + CHAT_BRIDGE.send("JOIN "+channelname, new NumericTimeoutResponseHandler(20000) { @Override public HandledResponse handleNumeric(IRCBot bot, Numeric num, List params) { switch (num) { @@ -256,7 +263,7 @@ public class Main { for (byte b=0; b < colorstring.length()-6; b++) { colorstring="0"+colorstring; } - pb.write("[JOI]"+nick+" #"+colorstring+" "+channelname); + PROCESS_BRIDGE.write("[JOI]"+nick+" #"+colorstring+" "+channelname); } return HandledResponse.BREAK; case RPL_ENDOFNAMES: @@ -282,7 +289,7 @@ public class Main { }; } }; - chat_bridge.chatcommands.put("help", help_command); + CHAT_BRIDGE.chatcommands.put("help", help_command); InfoCommand about_command=new InfoCommand() { @Override @@ -292,7 +299,7 @@ public class Main { }; } }; - chat_bridge.chatcommands.put("about", about_command); + CHAT_BRIDGE.chatcommands.put("about", about_command); InfoCommand status_command=new InfoCommand() { @Override @@ -308,31 +315,31 @@ public class Main { }; } }; - chat_bridge.chatcommands.put("status", status_command); + CHAT_BRIDGE.chatcommands.put("status", status_command); OUT.println("INFO: Starting client"); Main.STARTED_AT=System.currentTimeMillis(); - chat_bridge.listen(); + CHAT_BRIDGE.listen(); OUT.println("INFO: Starting server"); - pb.serve(); + PROCESS_BRIDGE.serve(); OUT.println("INFO: Starting listener"); - pb.listen(line -> { + PROCESS_BRIDGE.listen(line -> { if (line.startsWith("[MSG]")) { try { String command="PRIVMSG #mtchatbridgetest :"+line.substring(5); - chat_bridge.send(command, new TryAgainHandler(command)); + CHAT_BRIDGE.send(command, new TryAgainHandler(command)); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } else if (line.startsWith("[PMS]")) { // GMS = PMS with comma separated list of targets String line_content=line.substring(5); String[] parts=line_content.split(" ", 2); String command="PRIVMSG "+parts[0]+" :"+parts[1]; try { - chat_bridge.send(command, new TryAgainHandler(command)); + CHAT_BRIDGE.send(command, new TryAgainHandler(command)); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } }); diff --git a/MinetestChatBridgeIRCBot/src/main/java/bridge/FileBridge.java b/MinetestChatBridgeIRCBot/src/main/java/bridge/FileBridge.java new file mode 120000 index 0000000..eb955df --- /dev/null +++ b/MinetestChatBridgeIRCBot/src/main/java/bridge/FileBridge.java @@ -0,0 +1 @@ +/home/lars/.minetest/mods/adv_chat/MinetestChatBridgeBot/src/main/java/bridge/FileBridge.java \ No newline at end of file diff --git a/MinetestChatBridgeIRCBot/src/main/java/bridge/IRCFileBridge.java b/MinetestChatBridgeIRCBot/src/main/java/bridge/IRCFileBridge.java new file mode 100644 index 0000000..98e330f --- /dev/null +++ b/MinetestChatBridgeIRCBot/src/main/java/bridge/IRCFileBridge.java @@ -0,0 +1,25 @@ +package bridge; + +import appguru.Main; +import java.io.File; +import java.io.IOException; + +/** + * + * @author lars + */ +public class IRCFileBridge extends FileBridge { + + public IRCFileBridge(File in, File out) throws IOException { + super(in, out); + } + + @Override + public void kill(String reason) { + super.kill(reason); + + Main.CHAT_BRIDGE.shutdown(reason); + + System.exit(0); + } +} diff --git a/MinetestChatBridgeIRCBot/src/main/java/bridge/IRCSocketBridge.java b/MinetestChatBridgeIRCBot/src/main/java/bridge/IRCSocketBridge.java new file mode 100644 index 0000000..bf4c144 --- /dev/null +++ b/MinetestChatBridgeIRCBot/src/main/java/bridge/IRCSocketBridge.java @@ -0,0 +1,23 @@ +package bridge; + +import appguru.Main; +import java.io.IOException; + +/** + * + * @author lars + */ +public class IRCSocketBridge extends SocketBridge { + public IRCSocketBridge(String host, int port) throws IOException { + super(host, port); + } + + @Override + public void kill(String reason) { + super.kill(reason); + + Main.CHAT_BRIDGE.shutdown(reason); + + System.exit(0); + } +} diff --git a/MinetestChatBridgeIRCBot/src/main/java/bridge/ProcessBridge.java b/MinetestChatBridgeIRCBot/src/main/java/bridge/ProcessBridge.java new file mode 120000 index 0000000..4eee6a0 --- /dev/null +++ b/MinetestChatBridgeIRCBot/src/main/java/bridge/ProcessBridge.java @@ -0,0 +1 @@ +/home/lars/.minetest/mods/adv_chat/MinetestChatBridgeBot/src/main/java/bridge/ProcessBridge.java \ No newline at end of file diff --git a/MinetestChatBridgeIRCBot/src/main/java/bridge/SocketBridge.java b/MinetestChatBridgeIRCBot/src/main/java/bridge/SocketBridge.java new file mode 120000 index 0000000..a463d43 --- /dev/null +++ b/MinetestChatBridgeIRCBot/src/main/java/bridge/SocketBridge.java @@ -0,0 +1 @@ +/home/lars/.minetest/mods/adv_chat/MinetestChatBridgeBot/src/main/java/bridge/SocketBridge.java \ No newline at end of file diff --git a/minetest-chat-bridge-irc-bot/src/commands/Command.java b/MinetestChatBridgeIRCBot/src/main/java/commands/Command.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/commands/Command.java rename to MinetestChatBridgeIRCBot/src/main/java/commands/Command.java diff --git a/minetest-chat-bridge-irc-bot/src/commands/InfoCommand.java b/MinetestChatBridgeIRCBot/src/main/java/commands/InfoCommand.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/commands/InfoCommand.java rename to MinetestChatBridgeIRCBot/src/main/java/commands/InfoCommand.java diff --git a/minetest-chat-bridge-irc-bot/src/handlers/NumericHandler.java b/MinetestChatBridgeIRCBot/src/main/java/handlers/NumericHandler.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/handlers/NumericHandler.java rename to MinetestChatBridgeIRCBot/src/main/java/handlers/NumericHandler.java diff --git a/minetest-chat-bridge-irc-bot/src/handlers/NumericResponseHandler.java b/MinetestChatBridgeIRCBot/src/main/java/handlers/NumericResponseHandler.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/handlers/NumericResponseHandler.java rename to MinetestChatBridgeIRCBot/src/main/java/handlers/NumericResponseHandler.java diff --git a/minetest-chat-bridge-irc-bot/src/handlers/NumericTimeoutResponseHandler.java b/MinetestChatBridgeIRCBot/src/main/java/handlers/NumericTimeoutResponseHandler.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/handlers/NumericTimeoutResponseHandler.java rename to MinetestChatBridgeIRCBot/src/main/java/handlers/NumericTimeoutResponseHandler.java diff --git a/minetest-chat-bridge-irc-bot/src/handlers/ResponseHandler.java b/MinetestChatBridgeIRCBot/src/main/java/handlers/ResponseHandler.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/handlers/ResponseHandler.java rename to MinetestChatBridgeIRCBot/src/main/java/handlers/ResponseHandler.java diff --git a/minetest-chat-bridge-irc-bot/src/handlers/TimeoutResponseHandler.java b/MinetestChatBridgeIRCBot/src/main/java/handlers/TimeoutResponseHandler.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/handlers/TimeoutResponseHandler.java rename to MinetestChatBridgeIRCBot/src/main/java/handlers/TimeoutResponseHandler.java diff --git a/minetest-chat-bridge-irc-bot/src/handlers/TopicResponseHandler.java b/MinetestChatBridgeIRCBot/src/main/java/handlers/TopicResponseHandler.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/handlers/TopicResponseHandler.java rename to MinetestChatBridgeIRCBot/src/main/java/handlers/TopicResponseHandler.java diff --git a/minetest-chat-bridge-irc-bot/src/handlers/TryAgainHandler.java b/MinetestChatBridgeIRCBot/src/main/java/handlers/TryAgainHandler.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/handlers/TryAgainHandler.java rename to MinetestChatBridgeIRCBot/src/main/java/handlers/TryAgainHandler.java diff --git a/minetest-chat-bridge-irc-bot/src/irc/Command.java b/MinetestChatBridgeIRCBot/src/main/java/irc/Command.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/irc/Command.java rename to MinetestChatBridgeIRCBot/src/main/java/irc/Command.java diff --git a/minetest-chat-bridge-irc-bot/src/irc/Default.java b/MinetestChatBridgeIRCBot/src/main/java/irc/Default.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/irc/Default.java rename to MinetestChatBridgeIRCBot/src/main/java/irc/Default.java diff --git a/minetest-chat-bridge-irc-bot/src/irc/HandledResponse.java b/MinetestChatBridgeIRCBot/src/main/java/irc/HandledResponse.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/irc/HandledResponse.java rename to MinetestChatBridgeIRCBot/src/main/java/irc/HandledResponse.java diff --git a/minetest-chat-bridge-irc-bot/src/irc/IRCBot.java b/MinetestChatBridgeIRCBot/src/main/java/irc/IRCBot.java similarity index 79% rename from minetest-chat-bridge-irc-bot/src/irc/IRCBot.java rename to MinetestChatBridgeIRCBot/src/main/java/irc/IRCBot.java index 4df0825..0e7073b 100644 --- a/minetest-chat-bridge-irc-bot/src/irc/IRCBot.java +++ b/MinetestChatBridgeIRCBot/src/main/java/irc/IRCBot.java @@ -10,6 +10,8 @@ import java.net.Socket; import java.util.*; import static irc.HandledResponse.*; +import java.io.BufferedReader; +import java.io.InputStreamReader; public class IRCBot { public Map chatcommands; @@ -39,7 +41,7 @@ public class IRCBot { try { socket.close(); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); } } })); @@ -158,6 +160,16 @@ public class IRCBot { } public void listen() { Thread listenerThread = new Thread(() -> { + BufferedReader reader=null; + try { + reader=new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); + } catch (IOException e) { + e.printStackTrace(Main.OUT); + if (socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) { + Main.PROCESS_BRIDGE.kill("Socket connection lost"); + } + System.exit(1); + } while (true) { try { Thread.sleep(20); @@ -165,34 +177,29 @@ public class IRCBot { return; } try { - String message = ""; - int c = socket.getInputStream().read(); - while (c >= 0) { - if (c == '\n' && message.charAt(message.length() - 1) == '\r') { - // message completed ! - message = message.substring(0, message.length() - 1); - try { - processMessage(message); - } catch (InvalidMessageException e) { - e.printStackTrace(); - } - message = ""; - } else { - message += (char) c; + String message; + while ((message = reader.readLine()) != null) { + try { + processMessage(message); + } catch (InvalidMessageException e) { + e.printStackTrace(Main.OUT); } - c = socket.getInputStream().read(); } } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); + if (socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) { + Main.PROCESS_BRIDGE.kill("Socket connection lost"); + } } } }); listenerThread.start(); } public void send(String message) throws IOException { - for (int i = 0; i < message.length(); i++) { - socket.getOutputStream().write(message.charAt(i)); + if (socket.isClosed() || socket.isOutputShutdown()) { + Main.PROCESS_BRIDGE.kill("Socket connection lost"); } + socket.getOutputStream().write(message.getBytes("UTF-8")); socket.getOutputStream().write('\r'); socket.getOutputStream().write('\n'); } @@ -204,7 +211,21 @@ public class IRCBot { try { send(command, new TryAgainHandler(command)); } catch (IOException e) { - e.printStackTrace(); + e.printStackTrace(Main.OUT); + } + } + public void shutdown(String reason) { + try { + this.send("QUIT :" + reason); + } catch (IOException e) { + e.printStackTrace(Main.OUT); + } + if (!this.socket.isClosed()) { + try { + this.socket.close(); + } catch (IOException e) { + e.printStackTrace(Main.OUT); + } } } } diff --git a/minetest-chat-bridge-irc-bot/src/irc/InvalidMessageException.java b/MinetestChatBridgeIRCBot/src/main/java/irc/InvalidMessageException.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/irc/InvalidMessageException.java rename to MinetestChatBridgeIRCBot/src/main/java/irc/InvalidMessageException.java diff --git a/minetest-chat-bridge-irc-bot/src/irc/PongCommand.java b/MinetestChatBridgeIRCBot/src/main/java/irc/PongCommand.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/irc/PongCommand.java rename to MinetestChatBridgeIRCBot/src/main/java/irc/PongCommand.java diff --git a/minetest-chat-bridge-irc-bot/src/misc/GarbageCollector.java b/MinetestChatBridgeIRCBot/src/main/java/misc/GarbageCollector.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/misc/GarbageCollector.java rename to MinetestChatBridgeIRCBot/src/main/java/misc/GarbageCollector.java diff --git a/minetest-chat-bridge-irc-bot/src/numeric/Numeric.java b/MinetestChatBridgeIRCBot/src/main/java/numeric/Numeric.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/numeric/Numeric.java rename to MinetestChatBridgeIRCBot/src/main/java/numeric/Numeric.java diff --git a/minetest-chat-bridge-irc-bot/src/numeric/NumericLookup.java b/MinetestChatBridgeIRCBot/src/main/java/numeric/NumericLookup.java similarity index 100% rename from minetest-chat-bridge-irc-bot/src/numeric/NumericLookup.java rename to MinetestChatBridgeIRCBot/src/main/java/numeric/NumericLookup.java diff --git a/Readme.md b/Readme.md index 1859871..5dd1db0 100644 --- a/Readme.md +++ b/Readme.md @@ -1,9 +1,9 @@ -# Advanced Chat(`adv_chat`) +# Advanced Chat (`adv_chat`) + > One Mod to rule them all, One Mod to find them, > One Mod to bring them all, and in the darkness bind them \- adapted quote from "Lord of the Rings" -With "all" other chat mods are meant. Adds roles, colors, unicode, hud notifications, and chat bridges (IRC & discord). @@ -15,26 +15,56 @@ Depends on [`modlib`](https://github.com/appgurueu/modlib). Modlib has been upda Code licensed under the GPLv3 (GNU Public License Version 3). Written by Lars Mueller alias LMD or appguru(eu). -## Terminology +## Links -Chatter : Participant in chat, be it a Minetest player, IRC user, or Discord member -Role : "Group" of chatters -Targets/Mentions : Roles or chatters mentioned using `@` +* [GitHub](https://github.com/appgurueu/voxelizer) - sources, issue tracking, contributing +* [Discord](https://discord.gg/ysP74by) - discussion, chatting +* [Minetest Forum](https://forum.minetest.net/viewtopic.php?f=9&t=22845) - (more organized) discussion +* [ContentDB](https://content.minetest.net/packages/LMD/voxelizer/) - releases (downloading from GitHub is recommended) + +## Setup + +In order to properly use `adv_chat`, you'll have to meet the following prerequisites: + +* `modlib` Minetest mod installed and enabled as hard dependency and additionally also `cmdlib` (recommended) +* `adv_chat` needs to be installed, enabled and added to the trusted mods in settings/`minetest.conf` +* [LuaSocket](https://luarocks.org/modules/luasocket/luasocket) should be installed (`sudo luarocks install luasocket` on Ubuntu) +* Complete [Java](https://www.java.com/de/) 8 or ideally newer installation under your system path (accessible from terminal via `java`) + +Then just install it like any other mod and enjoy your greatly improved chat experience! + +## Terminology + +Chatter: Participant in chat, be it a Minetest player, IRC user, or Discord member +Role: "Group" of chatters +Targets/Mentions: Roles or chatters mentioned using `@` ## Features -* Discord & IRC chat bridges +* Discord & IRC chat bridges, login & commands +* Blocking * Colorization +* Style preservation * Unicode * Mentions * HUD channels/notifications * Scheduled messages for offline players +## Changes + +### 🎃 Halloween Update + +* Proper formatting support +* More configuration options +* Remote login for chatcommand execution +* Many under-the-hood changes cleaning up stuff & fixing bugs (improving the code & architecture) +* See `config_help.md` and the sources for all details + ## API ### HUD notifications -See the `hud_channels.lua` for how it works and `test.lua` for a score change demo running with random values. +See `hud_channels.lua` for how it works and `test.lua` for a score change demo running with random values. ### Votes @@ -58,14 +88,14 @@ See the code and `config_help.md`. Feel free to contact me. ### Unicode support -This mod adds unicode support. Simply use the unicode codepoint in hexadecimal format prefixed by `U+`. To get a "slight smile" (🙂), you'd use `U+1F643`. Note that not all fonts fully support Unicode. +This mod adds unicode support. Simply use the unicode codepoint in hexadecimal format prefixed by `U+`. To get a "slight smile" (🙂), you'd use `U+1F642`. Note that not all fonts fully support Unicode. Use the `/chat say` command to open a text entry field to paste text. ### Real-time chat Use `@` at the beginning to message players or roles before your message. There are 3 special mentions : `minetest`, `irc` and `discord`. -Can be separated by comma **&** whitespace. Examples : +Can be separated by comma **&** whitespace. Examples: * `@singleplayer hi, singleplayer !` - message `hi, singleplayer !` is sent to singleplayer * `lol(or whitespaces) @singleplayer hi` - message is just sent in global chat @@ -103,7 +133,7 @@ Summarized, the Discord Chat Bridge works quite similar to the IRC one, with som Making Minetest & IRC chat compatible with Discord required the introduction of restrictions to simplify and reduce confusion. * No double nicknames on Discord. If there are double nicknames, one of them gets an appendix, which is not guaranteed to be the same each time. So better make sure this doesn't happen. -* Spaces (` `) in Discord nicknames are replaced by underscores (`_`) +* Spaces (` `) and commata (`,`) in Discord nicknames are replaced by underscores (`_`) ### Internal process bridge protocol diff --git a/chatcommands.lua b/chatcommands.lua new file mode 100644 index 0000000..07b4cc8 --- /dev/null +++ b/chatcommands.lua @@ -0,0 +1,73 @@ +minetest.original_get_player_privs = minetest.get_player_privs +function minetest.get_player_privs(playername) + if chatters[playername] then + return {chatter=true} + end + return minetest.original_get_player_privs(playername) +end + +if cmd_ext then + function call_chatcommand(chatter, call) + local last_space, next_space = 1, call:find(" ") + local command_trie, command_name = cmd_ext.chatcommands + local cmd, suggestion + local total_command_name = {} + repeat + next_space = next_space or call:len()+1 + command_name = call:sub(last_space, next_space-1) + table.insert(total_command_name, command_name) + local concat = table.concat(total_command_name, " ") + if bridges.command_blacklist[total_command_name] then + return false, "Command only available from Minetest." + end + total_command_name = {concat} + if command_name == "" and cmd and not cmd.params then break end + cmd, suggestion, _ = trie.search(command_trie, command_name) + if not cmd then + return false, "No such chatcommand."..((suggestion and " Did you mean \""..call:sub(0, last_space-1)..suggestion.."\" ?") or "") + elseif cmd.subcommands and not cmd.implicit_call then + command_trie = cmd.subcommands + last_space, next_space = next_space + 1, call:find(" ", next_space+1) + else + last_space = next_space + 1 + break + end + until next_space == call:len() + local params = call:sub(last_space) + if cmd.privs and cmd.privs.chatter then + return cmd.func(chatter, params) + end + return cmd.func((chatters[chatter] and chatters[chatter].login) or chatter, params) + end +else + function call_chatcommand(chatter, call) + local name, params = unpack(string_ext.split(call, " ", 2)) + if bridges.command_blacklist[name] then + return false, "Command only available from Minetest." + end + local command = minetest.registered_chatcommands[name] + if not command then + return false, "No such chatcommand." + end + local privs = minetest.get_player_privs(chatter) + local to_lose, to_gain = {}, {} + for priv, val in pairs(command.privs) do + if val ~= privs[val] then + table.insert((val and to_gain) or to_lose, priv) + end + end + if #to_lose ~= 0 or #to_gain ~= 0 then + if #to_lose == 0 then + return false, "Missing privileges : "..table.concat(to_gain, ", ") + end + if #to_gain == 0 then + return false, "Privileges to be lost : "..table.concat(to_lose, ", ") + end + return false, "Missing privileges : "..table.concat(to_gain, ", ")..", privileges to be lost : "..table.concat(to_lose, ", ") + end + if cmd.privs.chatter then + return cmd.func(chatter, params) + end + return command.func((chatters[chatter] and chatters[chatter].login) or chatter, params) + end +end \ No newline at end of file diff --git a/closest_color.lua b/closest_color.lua new file mode 120000 index 0000000..ebf0867 --- /dev/null +++ b/closest_color.lua @@ -0,0 +1 @@ +/home/lars/.minetest/mods/voxelizer/closest_color.lua \ No newline at end of file diff --git a/colorize_message.lua b/colorize_message.lua index aa5bdad..266279c 100644 --- a/colorize_message.lua +++ b/colorize_message.lua @@ -1,35 +1,39 @@ +-- Converts "#XXXXXX" color codes to colors function colorize_message(message) local rope={} - --IFNDEF bridge + --IFNDEF discord local otherrope={} --ENDIF - local last_index=1 - for i=1, string.len(message) do - local c=string.byte(message:sub(i,i)) - if c == hashtag then + local i=1 + while i <= message:len() do + local c=message:sub(i,i) + if c == string.char(0x1b) and message:sub(i+1, i+4) == "(c@#" and message:sub(i+11, i+11) == ")" then + table.insert(rope, message:sub(i, i+11)) + i=i+11 + goto continue + elseif c == "#" then for j=i+1, i+6 do - local c2=string.byte(string.upper(message:sub(j,j))) - if c2:len() == 0 or not string_ext.is_hexadecimal(c2) then - i=j + local c2=message:sub(j,j):upper() + if c2=="" or not ((c2 >= "0" and c2 <= "9") or (c2 >= "A" and c2 <= "F")) then goto nocolor end end - local colorstring=minetest.get_color_escape_sequence(string.sub(message, i, i+6)) - table.insert(rope, message:sub(last_index, i-1)) - --IFNDEF bridge - table.insert(otherrope, message:sub(last_index, i-1)) - --ENDIF - table.insert(rope, colorstring) - last_index=i+7 - ::nocolor:: + table.insert(rope, minetest.get_color_escape_sequence(message:sub(i, i+6))) + i=i+6 + goto continue end + ::nocolor:: + table.insert(rope, c) + --IFNDEF discord + table.insert(otherrope, c) + --ENDIF + ::continue:: + i=i+1 end - table.insert(rope, message:sub(last_index)) - --IFNDEF bridge - table.insert(otherrope, message:sub(last_index)) + return table.concat(rope) + --IFNDEF discord + , table.concat(otherrope) --ENDIF - return table.concat(rope, "") - --IFNDEF bridge - , table.concat(otherrope, "") - --ENDIF -end \ No newline at end of file +end + +load_schemes() \ No newline at end of file diff --git a/conf.lua b/conf.lua index 67933ce..f72a4b9 100644 --- a/conf.lua +++ b/conf.lua @@ -1,25 +1,36 @@ -local schemedef={mention_prefix={type="string"}, -mention_delim={type="string"}, -delim={type="string"}} +local schemedef={ + message_prefix={type="string"}, + mention_prefix={type="string"}, + mention_delim={type="string"}, + content_prefix={type="string"}, + message_suffix={type="string"}, +} local conf_spec={type="table", children={ - scheme={type="table", required_children={ + schemes={type="table", required_children={ minetest=schemedef }, possible_children={ - other=schemedef + irc=schemedef, + discord=schemedef }}, bridges={ type="table", possible_children={ - irc={type="table", children={ - port={type="number", range={0, 65535}}, - network={type="string"}, - nickname={type="string"}, - channelname={type="string"}, - ssl={type="boolean"}, - prefix={type="string"}, - minetest_prefix={type="string"} - }}, + irc={type="table", required_children={ + port={type="number", range={0, 65535}}, + network={type="string"}, + nickname={type="string"}, + channelname={type="string"}, + ssl={type="boolean"}, + prefix={type="string"}, + minetest_prefix={type="string"} + }, + possible_children={ + bridge={type="string", possible_values={"files", "sockets"}}, + convert_minetest_colors={type="string", possible_values={"disabled", "hex", "safer", "safest"}}, + handle_discord_markdown={type="boolean"}, + handle_minetest_markdown={type="boolean"} + }}, discord={type="table", required_children={ token={type="string"}, channelname={type="string"}, @@ -29,9 +40,15 @@ local conf_spec={type="table", children={ possible_children={ blacklist={type="table", keys={type="string"}}, whitelist={type="table", keys={type="string"}}, - guild_id={type="string"} + guild_id={type="string"}, + bridge={type="string", possible_values={"files", "sockets"}}, + convert_internal_markdown={type="boolean"}, + convert_minetest_markdown={type="boolean"}, + handle_irc_styles={type="string", possible_values={"escape_markdown", "convert", "disabled"}} } - } + }, + command_blacklist={type="table", keys={type="number"}, values={type="string"}}, + command_whitelist={type="table", keys={type="number"}, values={type="string"}} } } }} @@ -39,6 +56,30 @@ local conf_spec={type="table", children={ local config=conf.import("adv_chat", conf_spec) table_ext.add_all(getfenv(1), config) +function load_schemes() + for k, v in pairs(schemes.minetest) do + schemes.minetest[k] = colorize_message(v) + end + + for _,s in pairs({"irc", "discord"}) do + if not schemes[s] then + schemes[s] = {} + for k, v in pairs(schemes.minetest) do + schemes[s][k] = minetest.strip_colors(v) + end + end + end + + load_schemes = nil +end + +if not bridges.irc.style_conversion then + bridges.irc.style_conversion={} + if not bridges.irc.style_conversion.colors then + bridges.irc.style_conversion.colors="disabled" + end +end + if bridges.discord then local blacklist_empty=table_ext.is_empty(bridges.discord.blacklist or {}) @@ -58,4 +99,23 @@ if bridges.discord then end end +end + +if bridges.discord or bridges.irc then + + bridges.command_blacklist = table_ext.set(bridges.command_blacklist or {}) + bridges.command_whitelist = table_ext.set(bridges.command_whitelist or {}) + local blacklist_empty=table_ext.is_empty(bridges.command_blacklist) + local whitelist_empty=table_ext.is_empty(bridges.command_whitelist or {}) + if blacklist_empty then + if not whitelist_empty then + bridges.command_blacklist=setmetatable(bridges.command_blacklist, {__index=function(value) + if bridges.command_whitelist[value] then + return nil + end + return true + end}) + end + end + end \ No newline at end of file diff --git a/config_help.md b/config_help.md index 911a4f4..ad14386 100644 --- a/config_help.md +++ b/config_help.md @@ -11,14 +11,15 @@ Explaining document(this, Markdown) : `/adv_chat/config_help.m Readme : `/adv_chat/Readme.md` ## Default Configuration + Located under `/adv_chat/default_config.json` + ```json { - "scheme" : { - "minetest" : {"mention_prefix":"#FFFF00@", "mention_delim":"#FFFF00, ", "delim":"#FFFF00 : "}, + "schemes" : { + "minetest" : {"message_prefix": "", "mention_prefix": "#FFFF00@", "mention_delim": "#FFFF00, ", "content_prefix": "#FFFF00: #FFFFFF"}, "other" : null }, - "bridges" : { "discord" : null, "irc" : null @@ -27,13 +28,13 @@ Located under `/adv_chat/default_config.json` ``` ## Example Configuration + ```json { - "scheme" : { - "minetest" : {"mention_prefix":"#FFFF00@", "mention_delim":"#FFFF00, ", "delim":"#FFFF00 : "}, + "schemes" : { + "minetest" : {"message_prefix": "Somebody - namely ", "mention_prefix": "#FFFF00 - wrote to ", "mention_delim": "#FFFF00 and ", "content_prefix": "#FFFF00: #FFFFFF", "message_suffix": " :D"}, "other" : null }, - "bridges" : { "discord" : {"channelname":"allgemein", "prefix": "?", "minetest_prefix": "!","token":"S.U.Pxxs.E.R.T.9998OKEN", "blacklist":{"~~new_role~~":true}, "guild_id": 580416319703351296}, "irc" : {"channelname":"#mtchatbridgetest", "prefix": "?", "minetest_prefix": "!", "nickname": "MT_Chat_Bridge", "network": "irc.freenode.net", "port": 7000, "ssl": true} @@ -44,28 +45,40 @@ Located under `/adv_chat/default_config.json` ## Usage -### `scheme` +### `schemes` -Specifies the chat message format, `minetest` is for the one used on the Minetest chat, and `other` is for Discord/IRC. +Specifies the chat message format, `minetest` is for the one used on the Minetest chat, `irc` is IRC, and `discord` for Discord. + +* `message_prefix` - Prefix for the message * `mention_prefix` - Prefix for mentionpart. * `mention_delim` - Mention delimiter. -* `delim` - Message/sendername delimiter. -If you want to use color escape sequences, type `\x1B(c@#66FF00)`, and replace `#66FF00` with your color of choice in hex format. +* `content_prefix` - Message/sendername delimiter. +* `message_suffix` - Suffix for the message -Messages are formatted as `sendername + mention_prefix + {mentions, mention_delim} + delim + message` +If you want to use color escape sequences, type something like `#66FF00 colorized text here`, and replace `#66FF00` with your color of choice in hex format. + +Messages are formatted as `message_prefix + sendername + mention_prefix + {mentions, mention_delim} + delim + message + message_suffix` ### `bridges` + Configuration for IRC/Discord chat bridges. If `irc` or `discord` are set to `false` or `null`, the corresponding chat bridges aren't created. #### `discord` -Table with the following entries : -* `token` : Discord bot token, required -* `channelname` : Name of bridge channel, required as well -* `prefix`, `minetest_prefix` : Prefixes for Discord/Minetest commands, required -* `role_blacklist`/`role_whitelist` : Blacklist/whitelist of Discord roles. If both or none are set, Discord roles are ignored. -* `guild_id` : Guild ID, string. If swines add your bot to other servers, force it to use the server with the specified Guild ID. Optional. If unset, bot will use the guild it joined first. -Example : +Table with the following entries : + +* `token`: Discord bot token, required +* `channelname`: Name of bridge channel, required as well +* `prefix`, `minetest_prefix`: Prefixes for Discord/Minetest commands, required +* `role_blacklist`/`role_whitelist`: Blacklist/whitelist of Discord roles. If both or none are set, Discord roles are ignored. +* `guild_id`: Guild ID, string. If swines add your bot to other servers, force it to use the server with the specified Guild ID. Optional. If unset, bot will use the guild it joined first. +* `bridge`: Optional. Forces type of process bridge to use. Choices are `"file"` and `"socket"`. Sockets are recommended but require `luasocket`. +* `convert_internal_markdown`/`convert_minetest_markdown`: Optional boolean. Whether Markdown sent from Minetest/internal chat messages should be left untouched as if it was Discord Markdown +* `handle_irc_styles`: Optional string. How IRC styles should be converted to Discord Markdown. Possible values: `"disabled"`, `"escape_markdown"` and `"convert"` +* `strip_discord_markdown_in_minetest`: Optional boolean. Whether Discord Markdown should be stripped from Minetest chat. + +Example : + ```json { "discord": { @@ -80,22 +93,33 @@ Example : ``` #### `irc` -Table with fields (all required) : -* `network` : IRC network, for example `irc.freenode.net` -* `port` : Port, on [Freenode](https://freenode.net/kb/answer/chat) it would be `7000` if SSL is used, or else `6667`. Just google "connecting to network" for your IRC network of choice to get detailed information. -* `ssl` : Whether to use encryption (SSL) to communicate with the IRC network. Setting this to `true` is recommended. -* `nickname` : Bot nickname -* `channelname` : IRC channel name, for example `#minetest-server` -* `prefix`, `minetest_prefix` : Prefixes for IRC/Minetest commands, required -Example : +Table with fields. Required are: + +* `network`: IRC network, for example `irc.freenode.net` +* `port`: Port, on [Freenode](https://freenode.net/kb/answer/chat) it would be `7000` if SSL is used, or else `6667`. Just google "connecting to network" for your IRC network of choice to get detailed information. +* `ssl`: Whether to use encryption (SSL) to communicate with the IRC network. Setting this to `true` is recommended. +* `nickname`: Bot nickname +* `channelname`: IRC channel name, for example `#minetest-server` +* `prefix`, `minetest_prefix`: Prefixes for IRC bot/Minetest chatcommands, required + +Optional fields are: + +* `bridge`: Type of process bridge to use can be forced here. Choices are `"file"` and `"socket"`. Sockets are recommended but require `luasocket`. +* `convert_minetest_colors`: How colors from Minetest chat messages should be converted to IRC. Possible values are `"disabled"`, `"safest"`, `"safe"` and `"hex_safe"` and `"hex"` +* `handle_internal_markdown`: How Markdown sent from internal MT should be converted to IRC text styles. Possible values are `"disabled"`, `"strip"` and `"convert"` +* `handle_minetest_markdown`: How Markdown sent from Minetest should be converted to IRC text styles. Possible values are `"disabled"`, `"strip"` and `"convert"` +* `handle_discord_markdown`: How Markdown sent from Discord should be converted to IRC text styles. Possible values are `"disabled"`, `"strip"` and `"convert"` + +Example: + ```json { "irc": { "prefix": "?", "minetest_prefix": "!", - "channelname": "#minetest-server", - "nickname": "SERVERNAME_Chat", + "channelname": "#minetest-server", + "nickname": "SERVERNAME_Chat", "port": 7000, "ssl": true, "network": "irc.freenode.net" @@ -103,21 +127,29 @@ Example : } ``` +#### `chatcommand_whitelist`/`chatcommand_blacklist` + +Whitelist/blacklist of chatcommands which are not available from Discord or IRC. If both or none are set, all chatcommands are blacklisted. + ## Recommendations ### Consistency + It is recommended to **keep consistency**. To do so, channel & chat bot names could be similar across Discord and IRC. The same goes for prefixes. ### Prefixes + You should try to keep prefixes similar and memorable, while ensuring that there are no collisions. I recommend the combination of `?` for Discord/IRC commands and `!` for Minetest commands. Other neat combinations I have thought of are `+` and `-`, or `;` and `:`. Keep in mind that prefixes should be easy to type as well, and that others might have a different keyboard layout. ### Discord Avatar + Pixel-art Minetest skin heads always work well as avatars. For an example look you could look at my [Robby-Head](https://github.com/appgurueu/artwork/blob/master/robbyhead.png). There are tons of skins out there and it's fairly easy to extract the faces (but make sure you don't violate the licenses when using the images). A good starting point is [Addis Open MT-Skin Database](http://minetest.fensta.bplaced.net/). You can, however, of course also design it yourself. Just grab your favorite pixel-art program and draw a 8x8 head. You should also make sure to scale the small image up (to at least 256x256), because else Discord scales it up "for you" which makes it lose it's sharp edges. ### Security -Only two basic hints : Always enable SSL, and don't give your bot token to anyone. -And of course make sure your server isn't hacked. Messages are sent as plain text over the file bridges. \ No newline at end of file + +Only two basic hints : Always enable SSL, and don't give your bot token to anyone. +And of course make sure your server isn't hacked. Messages are sent as plain text over the sockets or file bridges. diff --git a/default_config.json b/default_config.json index 0d98eca..0837519 100644 --- a/default_config.json +++ b/default_config.json @@ -1,6 +1,6 @@ { - "scheme" : { - "minetest" : {"mention_prefix":"#FFFF00@", "mention_delim":"#FFFF00, ", "delim":"#FFFF00 : "}, + "schemes" : { + "minetest" : {"message_prefix": "", "mention_prefix": "#FFFF00@", "mention_delim": "#FFFF00, ", "content_prefix": "#FFFF00: #FFFFFF"}, "other" : null }, diff --git a/discord.lua b/discord.lua index 5353f14..d876ba9 100644 --- a/discord.lua +++ b/discord.lua @@ -17,20 +17,29 @@ function delete_discord_role(linecontent) end end -file_ext.process_bridge_build("discord") +local bridge +if bridges.discord.bridge == "files" then + bridge = build_file_bridge("discord") +else + bridge = build_bridge("discord") +end -file_ext.process_bridge_listen("discord", function(line) +discord_bridge = bridge + +bridge.listen(function(line) local linecontent=line:sub(6) if string_ext.starts_with(line, "[MSG]") then local parts=string_ext.split(linecontent, " ", 2) local src=parts[1].."[discord]" - send_to_all(src, src..scheme.other.delim..parts[2], minetest.get_color_escape_sequence(get_color(src))..src..scheme.minetest.delim..parts[2], "discord") + local adv_msg=message.new(chatters[src], nil, parts[2]) + adv_msg.sent_to="discord" + send_to_all(adv_msg) elseif string_ext.starts_with(line, "[GMS]") or string_ext.starts_with(line, "[CGM]") then -- GMS = group message or CGM = channel group message local parts=string_ext.split(linecontent, " ",3) local source=parts[1] local targets=string_ext.split_without_limit(parts[2], ",") local msg=parts[3] - local sent_to="nobody" + local sent_to if string_ext.starts_with(line, "[CGM]") then sent_to="discord" end @@ -38,39 +47,29 @@ file_ext.process_bridge_listen("discord", function(line) for _, target in ipairs(targets) do targetset[target]=true end - local invalid_targets, msg, mt_msg=build_message(source.."[discord]", targets, msg) - send_to_targets(source.."[discord]", table_ext.set(targets), msg, mt_msg, sent_to) - if (#invalid_targets) == 1 then - file_ext.process_bridge_write("discord", "[PMS]"..source.." The target "..invalid_targets[1].." is inexistant.") - elseif (#invalid_targets) > 1 then - file_ext.process_bridge_write("discord", "[PMS]"..source.." The targets "..table.concat(invalid_targets, ", ").." are inexistant.") + local adv_msg=message.new(chatters[source.."[discord]"], targets, msg) + adv_msg.sent_to=sent_to + message.mentionpart(adv_msg) --force check mentions + send_to_targets(adv_msg) + if (#adv_msg.invalid_mentions) == 1 then + discord_bridge.write("[PMS]#FFFFFF "..source.." The target "..adv_msg.invalid_mentions[1].." is inexistant.") + elseif (#adv_msg.invalid_mentions) > 1 then + discord_bridge.write("[PMS]#FFFFFF "..source.." The targets "..table.concat(adv_msg.invalid_mentions, ", ").." are inexistant.") end elseif string_ext.starts_with(line, "[CMD]") then - local parts=string_ext.split(linecontent, " ", 3) + local parts=string_ext.split(linecontent, " ", 2) local source=parts[1] - local commandname=parts[2] - local params=parts[3] - local command=minetest.registered_chatcommands[commandname] - if command then - if not table_ext.is_empty(command.privs) then - file_ext.process_bridge_write("discord", "[ERR]"..source.." Command requires privs.") - else - local success, retval = command.func(source.."[discord]", params or "") - if success then - file_ext.process_bridge_write("discord", "[SUC]"..source.." "..(retval or "No return value.")) - else - file_ext.process_bridge_write("discord", "[ERR]"..source.." "..(retval or "No return value.")) - end - end - else - file_ext.process_bridge_write("discord", "[ERR]"..source.."`"+commandname+"` : No such command.") - end + local call=parts[2] + local success, retval = call_chatcommand(source.."[discord]", call) + local prefix = "[PMS]#FFFFFF " + if success then prefix = "[SUC]" elseif success == false then prefix = "[ERR]" end + discord_bridge.write(prefix..source.." "..(retval or "No return value.")) elseif string_ext.starts_with(line, "[JOI]") or string_ext.starts_with(line, "[LIS]") then local parts=string_ext.split(linecontent, " ", 2) --nick & roles local chatter=parts[1].."[discord]" join(chatter, {color=parts[2], roles={}, discord=true}) if string_ext.starts_with(line, "[JOI]") then - send_to_all("", get_color(chatter)..chatter..minetest.get_color_escape_sequence("#FFFFFF").." joined.") + minetest.chat_send_all(get_color(chatter)..chatter..minetest.get_color_escape_sequence("#FFFFFF").." joined.") end elseif string_ext.starts_with(line, "[EXT]") then chatters[linecontent.."[discord]"]=nil @@ -134,24 +133,24 @@ end) -- Pinging mt_ext.register_globalstep(1, function() - file_ext.process_bridge_write("discord", "[PIN]") + bridge.write("[PIN]") end) -- Killing on_shutdown minetest.register_on_shutdown(function() - file_ext.process_bridge_write("discord", "[KIL]") + bridge.write("[KIL]") end) -file_ext.process_bridge_serve("discord") +bridge.serve() -- Start AFTER mods are loaded, so that the player sees chat messages minetest.register_on_mods_loaded(function() local java="java" - local classpath=minetest.get_modpath("adv_chat").."/minetest-chat-bridge-bot/out/production/classes:/home/lars/.gradle/caches/modules-2/files-2.1/net.dv8tion/JDA/3.7.1_388/f534ab5132d8df986e603a404120492d4cdf815e/JDA-3.7.1_388.jar:/home/lars/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/23.5-jre/e9ce4989adf6092a3dab6152860e93d989e8cf88/guava-23.5-jre.jar:/home/lars/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.2/25ea2e8b0c338a877313bd4672d3fe056ea78f0d/jsr305-3.0.2.jar:/home/lars/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.25/da76ca59f6a57ee3102f8f9bd9cee742973efa8a/slf4j-api-1.7.25.jar:/home/lars/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-collections4/4.1/a4cf4688fe1c7e3a63aa636cc96d013af537768e/commons-collections4-4.1.jar:/home/lars/.gradle/caches/modules-2/files-2.1/org.json/json/20160810/aca5eb39e2a12fddd6c472b240afe9ebea3a6733/json-20160810.jar:/home/lars/.gradle/caches/modules-2/files-2.1/net.sf.trove4j/trove4j/3.0.3/42ccaf4761f0dfdfa805c9e340d99a755907e2dd/trove4j-3.0.3.jar:/home/lars/.gradle/caches/modules-2/files-2.1/club.minnced/opus-java/1.0.2/c2e69f8d9aab5eab7476df8f5558e001657009bd/opus-java-1.0.2.jar:/home/lars/.gradle/caches/modules-2/files-2.1/com.neovisionaries/nv-websocket-client/2.4/da95dda351dba317468b08f8e5575216c05102/nv-websocket-client-2.4.jar:/home/lars/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/3.8.1/4d060ca3190df0eda4dc13415532a12e15ca5f11/okhttp-3.8.1.jar:/home/lars/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/2.0.0/518929596ee3249127502a8573b2e008e2d51ed3/checker-qual-2.0.0.jar:/home/lars/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.0.18/5f65affce1684999e2f4024983835efc3504012e/error_prone_annotations-2.0.18.jar:/home/lars/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/ed28ded51a8b1c6b112568def5f4b455e6809019/j2objc-annotations-1.1.jar:/home/lars/.gradle/caches/modules-2/files-2.1/org.codehaus.mojo/animal-sniffer-annotations/1.14/775b7e22fb10026eed3f86e8dc556dfafe35f2d5/animal-sniffer-annotations-1.14.jar:/home/lars/.gradle/caches/modules-2/files-2.1/club.minnced/opus-java-api/1.0.2/e6e5afd72b5305356ef6d3aa95e84790cd340828/opus-java-api-1.0.2.jar:/home/lars/.gradle/caches/modules-2/files-2.1/club.minnced/opus-java-natives/1.0.2/b62c0be7a49c9bf0933d003cc0418e90518db728/opus-java-natives-1.0.2.jar:/home/lars/.gradle/caches/modules-2/files-2.1/com.squareup.okio/okio/1.13.0/a9283170b7305c8d92d25aff02a6ab7e45d06cbe/okio-1.13.0.jar:/home/lars/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/4.4.0/cb208278274bf12ebdb56c61bd7407e6f774d65a/jna-4.4.0.jar" + local jarpath=minetest.get_modpath("adv_chat").."/MinetestChatBridgeBot/build/libs/MinetestChatBridgeBot-all.jar" local token=bridges.discord.token or "NTc4MjM0NjM5NTc2MDcyMjEx.XPgWKA.ilzmvz-I7XTIML6Emj1jBx4ejLw" local text_channel=bridges.discord.channelname local prefixes='"'..bridges.discord.minetest_prefix..'" "'..bridges.discord.prefix..'"' local guild_id=bridges.discord.guild_id.." " or "" - file_ext.process_bridge_start("discord", java..' -Dfile.encoding=UTF-8 -classpath "'..classpath..'" appguru.Main "'..token..'" "'..text_channel..'" "%s" "%s" "%s" '..prefixes.." "..guild_id.."&") + bridge.start(java..' -jar "'..jarpath..'" "'..token..'" "'..text_channel..'" "%s" "%s" "%s" '..prefixes.." "..guild_id.." &") end) \ No newline at end of file diff --git a/init.lua b/init.lua index bcf0a7f..3ac8c05 100644 --- a/init.lua +++ b/init.lua @@ -8,41 +8,38 @@ local bridge_ifndefs={ irc=adv_chat.bridges.irc } -if not bridge_ifndefs.bridge then - error("OOF") -end - extend_mod_string("adv_chat", string_ext.handle_ifndefs(file_ext.read(get_resource("adv_chat", "colorize_message.lua")), bridge_ifndefs)) -if bridge_ifndefs.bridge then - adv_chat.scheme.other=adv_chat.scheme.other or {} - for k, v in pairs(adv_chat.scheme.minetest) do - local mt_msg, msg=adv_chat.colorize_message(v) - adv_chat.scheme.minetest[k]=mt_msg - if not adv_chat.scheme.other[k] then - adv_chat.scheme.other[k]=msg - end - end -else - for k, v in pairs(adv_chat.scheme.minetest) do - local mt_msg=adv_chat.colorize_message(v) - adv_chat.scheme.minetest[k]=mt_msg - end -end - extend_mod_string("adv_chat", string_ext.handle_ifndefs(file_ext.read(get_resource("adv_chat", "main.lua")), bridge_ifndefs)) -- Basic API stuff extend_mod("adv_chat", "unicode") +extend_mod("adv_chat", "closest_color") +extend_mod("adv_chat", "trie") +extend_mod("adv_chat", "text_styles") +extend_mod("adv_chat", "message") extend_mod("adv_chat", "hud_channels") -- Chat bridges -if adv_chat.bridges.irc then - extend_mod("adv_chat", "irc") -end +if bridge_ifndefs.bridge then + extend_mod("adv_chat", "chatcommands") + extend_mod("adv_chat", "process_bridges") + + local env = minetest.request_insecure_environment() or error("Error: adv_chat needs to be added to the trusted mods for chat bridges to work. See the Readme for more info.") + adv_chat.set_os_execute(env.os.execute) + adv_chat.set_socket(env.require("socket")) -if adv_chat.bridges.discord then - extend_mod("adv_chat", "discord") + if adv_chat.bridges.irc then + extend_mod("adv_chat", "irc") + end + + if adv_chat.bridges.discord then + extend_mod("adv_chat", "discord") + end + + adv_chat.build_socket_bridge = nil + adv_chat.build_file_bridge = nil + adv_chat.build_bridge = nil end -- Tests - don't uncomment unless you actually want to test something diff --git a/irc.lua b/irc.lua index a4339ee..68abffc 100644 --- a/irc.lua +++ b/irc.lua @@ -1,102 +1,112 @@ register_role("irc",{color="#FFFF66"}) -file_ext.process_bridge_build("irc") +local bridge +if bridges.discord.bridge == "files" then + bridge = build_file_bridge("irc") +else + bridge = build_bridge("irc") +end -file_ext.process_bridge_listen("irc", function(line) +irc_bridge = bridge + +local color = function(chattername) return minetest.get_color_escape_sequence((chatters[chattername] and chatters[chattername].color) or "#FFFFFF") end + +bridge.listen(function(line) local linecontent=line:sub(6) if string_ext.starts_with(line, "[MSG]") then local parts=string_ext.split(linecontent, " ", 2) local src=parts[1].."[irc]" - send_to_all(src, src..scheme.other.delim..parts[2], minetest.get_color_escape_sequence(get_color(src))..src..scheme.minetest.delim..parts[2], "irc") + local adv_msg=message.new(chatters[src], nil, parts[2]) + adv_msg.sent_to="irc" + send_to_all(adv_msg) + --send_to_all(src, src..scheme.other.delim..parts[2], minetest.get_color_escape_sequence(get_color(src))..src..scheme.minetest.delim..parts[2], "irc") elseif string_ext.starts_with(line, "[PMS]") then local parts=string_ext.split(linecontent, " ", 1) local source=parts[1] local target=parts[2] local msg=parts[3] if string_ext.ends_with(target, "[discord]") then - file_ext.process_bridge_write("discord", "[PMS]"..source.." "..target.."@you : "..msg) + discord_bridge.write("[PMS]"..source.." "..target.."@you : "..msg) else if minetest.get_player_by_name(target_and_msg[1]) then minetest.chat_send_player(target_and_msg[2]) end end elseif string_ext.starts_with(line, "[CMD]") then - local parts=string_ext.split(linecontent, " ", 3) + local parts=string_ext.split(linecontent, " ", 2) local source=parts[1] - local commandname=parts[2] - local params=parts[3] - local command=minetest.registered_chatcommands[commandname] - if command then - if not table_ext.is_empty(command.privs) then - file_ext.process_bridge_write("irc", "[PMS]"..source.." ".."Error: Command requires privs.") - else - local success, retval = command.func(source, params) - local prefix="Unknown" - if success then prefix="Success" elseif success ~= nil then prefix="Error" end - file_ext.process_bridge_write("irc", "[PMS]"..source.." "..prefix.." : "..(retval or "No return value.")) - end - else - file_ext.process_bridge_write("irc", "[PMS]"..source.." ".."Error: No such command.") - end + local call=parts[2] + local success, retval = call_chatcommand(source.."[irc]", call) + local prefix="Unknown" + if success then prefix="Success" elseif success ~= nil then prefix="Error" end + irc_bridge.write("[PMS]"..source.." "..prefix.." : "..(retval or "No return value.")) elseif string_ext.starts_with(line, "[GMS]") or string_ext.starts_with(line, "[CGM]") then -- GMS = group message or CGM = channel group message local parts=string_ext.split(linecontent, " ",3) local source=parts[1] local targets=string_ext.split_without_limit(parts[2], ",") local msg=parts[3] - local sent_to="nobody" + local sent_to if string_ext.starts_with(line, "[CGM]") then sent_to="irc" end - targetset={} - for _, target in ipairs(targets) do - targetset[target]=true - end - local invalid_targets, msg, mt_msg=build_message(source.."[irc]", targets, msg) - send_to_targets(source.."[irc]", table_ext.set(targets), msg, mt_msg, sent_to) - if (#invalid_targets) == 1 then - file_ext.process_bridge_write("irc", "[PMS]"..source.." The target "..invalid_targets[1].." is inexistant.") - elseif (#invalid_targets) > 1 then - file_ext.process_bridge_write("irc", "[PMS]"..source.." The targets "..table.concat(invalid_targets, ", ").." are inexistant.") + --targetset={} + --for _, target in ipairs(targets) do + -- targetset[target]=true + --end + --local invalid_targets, msg, mt_msg=build_message(source.."[irc]", targets, msg) + --send_to_targets(source.."[irc]", table_ext.set(targets), msg, mt_msg, sent_to) + local adv_msg=message.new(chatters[source.."[discord]"], targets, msg) + adv_msg.sent_to=sent_to + message.mentionpart(adv_msg) --force check mentions + send_to_targets(adv_msg) + if (#adv_msg.invalid_mentions) == 1 then + irc_bridge.write("[PMS]"..source.." The target "..adv_msg.invalid_mentions[1].." is inexistant.") + elseif (#adv_msg.invalid_mentions) > 1 then + irc_bridge.write("[PMS]"..source.." The targets "..table.concat(adv_msg.invalid_mentions, ", ").." are inexistant.") end elseif string_ext.starts_with(line, "[JOI]") then local parts=string_ext.split(linecontent, " ", 3) --nick & color & channel join(parts[1].."[irc]", {color=parts[2], roles={}, irc=true}) - send_to_all("", parts[1].."[irc]".." joined.", minetest.get_color_escape_sequence(parts[2]).. - parts[1].."[irc]".. - minetest.get_color_escape_sequence("#FFFFFF").." joined.") + local chattername=parts[1].."[irc]" + minetest.chat_send_all(color(chattername).. + chattername..minetest.get_color_escape_sequence("#FFFFFF").." joined.", + minetest.get_color_escape_sequence(parts[2])..parts[1].."[irc]".. + minetest.get_color_escape_sequence("#FFFFFF").." joined.") --parts[3]) elseif string_ext.starts_with(line, "[EXT]") then local parts=string_ext.split(linecontent, " ", 2) --nick & reason local chattername=parts[1].."[irc]" - send_to_all("", chattername.." quitted ("..parts[2]..").", minetest.get_color_escape_sequence(get_color(chattername)).. - chattername..minetest.get_color_escape_sequence("#FFFFFF").." quitted ("..parts[2]..").") + minetest.chat_send_all(color(chattername).. + chattername..minetest.get_color_escape_sequence("#FFFFFF").." quitted ("..parts[2]..").", minetest.get_color_escape_sequence(get_color(chattername)).. + chattername..minetest.get_color_escape_sequence("#FFFFFF").." quitted ("..parts[2]..").") chatters[chattername]=nil elseif string_ext.starts_with(line, "[BYE]") then local parts=string_ext.split(linecontent, " ", 2) --nick & reason local chattername=parts[1].."[irc]" - send_to_all("", chattername.." left ("..parts[2]..").", minetest.get_color_escape_sequence(get_color(chattername)).. + minetest.chat_send_all(color(chattername)..chattername..minetest.get_color_escape_sequence("#FFFFFF").." left ("..parts[2]..").", minetest.get_color_escape_sequence(get_color(chattername)).. chattername..minetest.get_color_escape_sequence("#FFFFFF").." left ("..parts[2]..").") chatters[chattername]=nil elseif string_ext.starts_with(line, "[NCK]") then local parts=string_ext.split(linecontent, " ", 2) --nick & newnick irc_users[parts[1]]=nil irc_users[parts[2]]=true - minetest.chat_send_all(parts[1].."[irc] is now known as "..parts[2].."[irc]") + local chattername=parts[1].."[irc]" + minetest.chat_send_all(color(chattername)..chattername..minetest.get_color_escape_sequence("#FFFFFF").." is now known as "..parts[2].."[irc]") end end) -- Pinging mt_ext.register_globalstep(1, function() - file_ext.process_bridge_write("irc", "[PIN]") + bridge.write("[PIN]") end) -file_ext.process_bridge_serve("irc") +bridge.serve() --"/usr/lib/jvm/jdk-11.0.1/bin/java -classpath /home/lars/IdeaProjects/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot Main 7000 irc.freenode.net true MT_Chat_Bridge #mtchatbridgetest /home/lars/.minetest/worlds/world/bridges/irc/output.txt /home/lars/.minetest/worlds/world/bridges/irc/input.txt" -- Start AFTER mods are loaded, so that the player sees chat messages minetest.register_on_mods_loaded(function() local java="java" - local classpath=minetest.get_modpath("adv_chat").."/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot" + local classpath=minetest.get_modpath("adv_chat").."/MinetestChatBridgeIRCBot/build/classes/java/main" local port=bridges.irc.port local network=bridges.irc.network local ssl=tostring(bridges.irc.ssl) @@ -104,5 +114,5 @@ minetest.register_on_mods_loaded(function() local textchannel=bridges.irc.channelname local prefixes='"'..bridges.discord.minetest_prefix..'" "'..bridges.discord.prefix..'"' - file_ext.process_bridge_start("irc", java..' -Dfile.encoding=UTF-8 -classpath "'..classpath..'" appguru.Main '..port..' "'..network..'" '..ssl..' "'..nick..'" "'..textchannel..'" "%s" "%s" "%s" '..prefixes..' &') + bridge.start(java..' -Dfile.encoding=UTF-8 -classpath "'..classpath..'" appguru.Main '..port..' "'..network..'" '..ssl..' "'..nick..'" "'..textchannel..'" "%s" "%s" "%s" '..prefixes..' &') end) \ No newline at end of file diff --git a/main.lua b/main.lua index 5623dea..772e0af 100644 --- a/main.lua +++ b/main.lua @@ -1,8 +1,3 @@ ---- ---- Generated by EmmyLua(https://github.com/EmmyLua) ---- Created by lars. ---- - --- THIS FILE USES CUSTOM STUFF (IFNDEFS) IMPLEMENTED USING MODLIB - DON'T CHANGE THE WAY IT IS EXECUTED IN init.lua -- TODO (planned features) @@ -17,7 +12,6 @@ player_ext.set_property_default("adv_chat.blocked",{chatters={}, roles={}}) channels={} --channelname -> definition : {hud_pos, mode, autoremove, max_messages, max_lines, wrap_chars, smartwrap} roles={} -- Role -> players -> true chatters={} -- Chatter -> stuff ---blocked={} -- Receiver -> what he blocks : roles and playernames, true to_be_sent={} --Receiver -> { {sender, message, date, time} } scheme={minetest={mention_prefix=minetest.get_color_escape_sequence("#FFFF66").."@", mention_delim=minetest.get_color_escape_sequence("#FFFF66")..", ", delim=minetest.get_color_escape_sequence("#FFFF66").." : "..minetest.get_color_escape_sequence("#FFFFFF")}, @@ -55,36 +49,36 @@ function send_to_chatter(sendername, chattername, message) else --IFNDEF discord if chatters[chattername].discord then - file_ext.process_bridge_write("discord", "[PMS]"..get_color(chattername).." "..chattername.." "..message) + discord_bridge.write("[PMS]"..get_color(chattername).." "..chattername.." "..message) end --ENDIF --IFNDEF irc if chatters[chattername].irc then - file_ext.process_bridge_write("irc", "[PMS]"..chattername.." "..message) + irc_bridge.write("[PMS]"..chattername.." "..message) end --ENDIF end end -function send_to_targets(sendername, targets, message, mt_message, sent_to) +function send_to_targets(msg) + message.mentionpart(msg) --IFNDEF bridge - local discord_mentioned, irc_mentioned=targets.discord, targets.irc + local discord_mentioned, irc_mentioned=msg.targets.discord, msg.targets.irc --ENDIF - for target, _ in pairs(targets) do + for target, _ in pairs(msg.targets) do if not chatters[target] then if roles[target] then - table_ext.add_all(targets, roles[target].affected) + table_ext.add_all(msg.targets, roles[target].affected) end - targets[target]=nil + msg.targets[target]=nil end end - local mt_message=mt_message or message local discord_chatters={} local irc_chatters={} - for chatter, _ in pairs(targets) do + for chatter, _ in pairs(msg.targets) do if not is_blocked(chatter, sendername) then if chatters[chatter].minetest then - minetest.chat_send_player(chatter, mt_message) + minetest.chat_send_player(chatter, message.build(msg, "minetest")) else --IFNDEF discord if chatters[chatter].discord then @@ -101,25 +95,21 @@ function send_to_targets(sendername, targets, message, mt_message, sent_to) end --IFNDEF discord - if sent_to ~= "discord" then + if msg.sent_to ~= "discord" then if discord_mentioned then - file_ext.process_bridge_write("discord", "[MSG]"..get_color(sendername).." "..message) - else - if #discord_chatters > 0 then - file_ext.process_bridge_write("discord", "[PMS]"..get_color(sendername).." "..table.concat(discord_chatters, ",").." "..message) - end + discord_bridge.write("[MSG]"..(msg.chatter.color).." "..message.build(msg, "discord")) + elseif #discord_chatters > 0 then + discord_bridge.write("[PMS]"..(msg.chatter.color).." "..table.concat(discord_chatters, ",").." "..message.build(msg, "discord")) end end --ENDIF --IFNDEF irc - if sent_to ~= "irc" then + if msg.sent_to ~= "irc" then if irc_mentioned then - file_ext.process_bridge_write("irc", "[MSG]"..message) - else - if #irc_chatters > 0 then - file_ext.process_bridge_write("irc", "[PMS]"..table.concat(irc_chatters, ",").." "..message) - end + irc_bridge.write("[MSG]"..message.build(msg, "irc")) + elseif #irc_chatters > 0 then + irc_bridge.write("[PMS]"..table.concat(irc_chatters, ",").." "..message.build(msg, "irc")) end end --ENDIF @@ -129,6 +119,10 @@ function join(name, def) if not def.roles then def.roles={} end + if not def.name then + def.name=name + end + def.service = ((def.minetest and "minetest") or (def.irc and "irc")) or "discord" chatters[name]=def local to_be_received=to_be_sent[name] if to_be_received then @@ -172,7 +166,33 @@ end --IFNDEF bridge minetest.original_chat_send_all=minetest.chat_send_all minetest.chat_send_all=function(msg) - send_to_all("", minetest.strip_colors(msg), msg) + local adv_message=message.new(nil, nil, msg) + adv_message.internal=true + send_to_all(adv_message) +end + +minetest.original_chat_send_player=minetest.chat_send_player +minetest.chat_send_player=function(name, msg) + local chatter=chatters[name] + if not chatter then + return + end + if chatter.minetest then + return minetest.original_chat_send_player(name, msg) + end + local adv_message=message.new(nil, nil, msg) + adv_message.internal=true + local to_be_sent=message.build(adv_message, chatter.service) + --IFNDEF irc + if chatter.irc then + irc_bridge.write("[PMS]"..chatter.name.." "..to_be_sent) + end + --ENDIF + --IFNDEF discord + if chatter.discord then + discord_bridge.write("[PMS]#FFFFFF "..chatter.name.." "..to_be_sent) + end + --ENDIF end --ENDIF @@ -201,6 +221,7 @@ function remove_role(player, role, expected_value) end end +-- deprecated, minetest-only function get_color(chatter) if chatters[chatter] then return chatters[chatter].color or "#FFFFFF" @@ -208,22 +229,23 @@ function get_color(chatter) return "#FFFFFF" end -function send_to_all(sender, msg, mt_msg, sent_to) +function send_to_all(msg) --IFNDEF irc - if sent_to ~= "irc" then - file_ext.process_bridge_write("irc", "[MSG]"..msg) + if msg.sent_to ~= "irc" then + irc_bridge.write("[MSG]"..message.build(msg, "irc")) end --ENDIF --IFNDEF discord - if sent_to ~= "discord" then - file_ext.process_bridge_write("discord", "[MSG]"..get_color(sender).." "..msg) + if msg.sent_to ~= "discord" then + discord_bridge.write("[MSG]"..((msg.chatter and msg.chatter.color) or "#FFFFFF").." "..message.build(msg, "discord")) end --ENDIF - if sent_to ~= "minetest" then - local mt_msg=mt_msg or msg + if msg.sent_to ~= "minetest" then + local mt_msg for _,player in pairs(minetest.get_connected_players()) do local playername=player:get_player_name() - if not is_blocked(playername, sender) then + if not msg.chatter or not is_blocked(playername, msg.chatter) then + mt_msg=mt_msg or message.build(msg, "minetest") minetest.chat_send_player(playername, mt_msg) end end @@ -327,13 +349,14 @@ on_chat_message=function(sender, msg) for _, part in pairs(parts) do table.insert(mentions, string_ext.trim(part, " ")) end - local invalid_targets, msg, mt_msg=build_message(sender, mentions, msg_content) + local adv_msg=message.new(chatters[sender], mentions, msg_content) + message.mentionpart(adv_msg) table.insert(mentions, sender) - send_to_targets(sender, table_ext.set(mentions), msg, mt_msg, "nobody") - if (#invalid_targets) == 1 then - minetest.chat_send_player(sender, "The target "..invalid_targets[1].." is inexistant.") - elseif (#invalid_targets) > 1 then - minetest.chat_send_player(sender, "The targets "..table.concat(invalid_targets, ", ").." are inexistant.") + send_to_targets(adv_msg)--sender, table_ext.set(mentions), msg, mt_msg, "nobody") + if #adv_msg.invalid_mentions == 1 then + minetest.chat_send_player(sender, "The target "..adv_msg.invalid_mentions[1].." is inexistant.") + elseif #adv_msg.invalid_mentions > 1 then + minetest.chat_send_player(sender, "The targets "..table.concat(adv_msg.invalid_mentions, ", ").." are inexistant.") end else local sender_color=get_color(sender) @@ -341,16 +364,16 @@ on_chat_message=function(sender, msg) for _,player in pairs(minetest.get_connected_players()) do players[player:get_player_name()]=true end - local msg, mt_msg=parse_message(msg) - mt_msg=minetest.get_color_escape_sequence(sender_color)..sender..scheme.minetest.delim..msg - msg=sender..scheme.other.delim..msg - send_to_all(sender, msg, mt_msg) + local adv_msg=message.new(chatters[sender], mentions, msg_content) + send_to_all(adv_msg) end return true end minetest.register_on_chat_message(on_chat_message) -minetest.register_chatcommand("msg",{ +local prefix = (cmd_ext and "chat ") or "chat_" + +minetest.register_chatcommand(prefix.."msg",{ params = " ", description = "Send a message to a chatter as soon as they join", privs={}, @@ -380,7 +403,7 @@ button_exit[7,0;2,0.75;send;Send] no_prepend[] ]] -minetest.register_chatcommand("say", { +minetest.register_chatcommand(prefix.."say", { params="", description="Send chat message using entry field.", privs={discord_user=false, irc_user=false}, @@ -395,7 +418,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) -minetest.register_chatcommand("block", { +minetest.register_chatcommand(prefix.."block", { params = " | ", description = "Block messages from chatter or role", privs={}, @@ -419,7 +442,7 @@ minetest.register_chatcommand("block", { end }) -minetest.register_chatcommand("unblock", { +minetest.register_chatcommand(prefix.."unblock", { params = " | ", description = "Unblock messages from chatter or role", privs={}, @@ -441,4 +464,38 @@ minetest.register_chatcommand("unblock", { blocked[param]=nil return true, type..param.." was unblocked" end +}) + +minetest.register_chatcommand(prefix.."login", { + params = " ", + description = "Log in as (fake) player to execute chatcommands as them", + privs = {chatter=true}, + func = function(sendername, param) + param=string_ext.trim(param) + if param:len() == 0 then + return false, "No arguments given - missing name and password." + end + local name, password = unpack(string_ext.split(param, " ", 2)) + password = password or "" + local auth = minetest.get_auth_handler().get_auth(name) + if auth and minetest.check_password_entry(name, auth.password, password) then + chatters[sendername].login = name + return true, 'Logged in as "'..name..'"' + end + return false, "Wrong playername/password. : "..name..", "..password.."!="..auth.password + end +}) + +minetest.register_chatcommand(prefix.."logout", { + params = "", + description = "Log out from your (fake) player account", + privs = {chatter=true}, + func = function(sendername, param) + if not chatters[sendername].login then + return false, "Not logged in." + end + local login = chatters[sendername].login + chatters[sendername].login = nil + return true, 'Logged out from "'..login..'"' + end }) \ No newline at end of file diff --git a/message.lua b/message.lua new file mode 100644 index 0000000..b5ca9c3 --- /dev/null +++ b/message.lua @@ -0,0 +1,227 @@ +-- TODO handle and mentions like @ or @ (modification of Discord bot needed) + +message={} + +function message.new(chatter, mentions, content) + return {chatter=chatter, mentions=mentions, content=content} +end + +local function unicode(message) + message.unicode_content = message.unicode_content or parse_unicode(message.content) + return message.unicode_content +end + +local function colorized(message) + if not message.colorized_content then + message.colorized_content, message.uncolorized_content=colorize_message(unicode(message)) + end + return message.colorized_content +end + +local function uncolorized(message) + if not message.uncolorized_content then + message.colorized_content, message.uncolorized_content=colorize_message(unicode(message)) + end + message.uncolorized_content=minetest.strip_colors(message.uncolorized_content) + return message.uncolorized_content +end + +local to = { + minetest = { + from={ + internal=function(message) + return message.content + end, + minetest = colorized, + irc = function(message) + message.colorized_content = irc_to_minetest(colorized(message)) + return message.colorized_content + end, + discord = uncolorized + } + }, + + irc = { + from={ + internal=function(message) + return message.content + end, + minetest = function(message) + return colorized(message) + end, + irc = function(message) + return colorized(message) + end, + discord = function(message) + return minetest_to_irc(colorized(message)) + end + } + }, + + discord = { + from={ + internal=function(message) + return minetest.strip_colors(message.content) + end, + minetest = uncolorized, + irc = function(message) + return uncolorized(message) + end, + discord = uncolorized + } + } +} + +local builders = to + +builders.minetest.scheme = schemes.minetest +builders.irc.scheme = schemes.irc +builders.discord.scheme = schemes.discord + +function message.mentionpart(msg) + if not msg.mentionpart then + msg.invalid_mentions={} + msg.targets={} + msg.mentionpart={} + for _, mention in ipairs(msg.mentions or {}) do + if not msg.targets[mention] then + msg.targets[mention]=true + if roles[mention] then + table.insert(msg.mentionpart,roles[mention].color) + table.insert(msg.mentionpart, mention) + elseif chatters[mention] then + table.insert(msg.mentionpart, chatters[mention].color) + table.insert(msg.mentionpart, mention) + else + table.insert(msg.invalid_mentions,mention) + end + end + end + end +end + +local mentionpart_builders = { + irc=nil, + discord=function(msg) + if not msg.uncolorized_mentionpart then + msg.uncolorized_mentionpart={} + for i=2, #msg.mentionpart, 2 do + table.insert(msg.uncolorized_mentionpart,msg.mentionpart[i]) + end + end + return "uncolorized_mentionpart" + end, + minetest=function(msg) + if not msg.mt_mentionpart then + msg.mt_mentionpart={} + for index, item in ipairs(msg.mentionpart) do + table.insert(msg.mt_mentionpart, ((index % 2 == 0) and item) or minetest.get_color_escape_sequence(item)) + end + end + return "mt_mentionpart" + end +} + +local function wrap_builder(source, goal, wrapper) + local old_builder = builders[source].from[goal] + builders[source].from[goal] = function(msg) return wrapper(old_builder(msg)) end +end + +if bridges.discord then + if not bridges.discord.convert_internal_markdown then + wrap_builder("discord", "internal", escape_markdown) + end + if not bridges.discord.convert_minetest_markdown then + wrap_builder("discord", "minetest", escape_markdown) + end + if bridges.discord.handle_irc_styles == "escape_markdown" then + wrap_builder("discord", "irc", escape_markdown) + elseif bridges.discord.handle_irc_styles ~= "disabled" then + wrap_builder("discord", "irc", irc_to_markdown) + end +end + +if bridges.irc then + + if bridges.irc.handle_discord_markdown == "strip" then + wrap_builder("irc", "discord", strip_markdown) + elseif bridges.irc.handle_discord_markdown ~= "disabled" then + wrap_builder("irc", "discord", markdown_to_irc) + end + + if bridges.irc.handle_minetest_markdown == "strip" then + wrap_builder("irc", "minetest", strip_markdown) + elseif bridges.irc.handle_discord_markdown ~= "disabled" then + wrap_builder("irc", "minetest", markdown_to_irc) + end + + if bridges.irc.handle_internal_markdown == "strip" then + wrap_builder("irc", "internal", strip_markdown) + elseif bridges.irc.handle_discord_markdown ~= "disabled" then + wrap_builder("irc", "internal", markdown_to_irc) + end + + if bridges.irc.convert_minetest_colors=="disabled" then + mentionpart_builders.irc=mentionpart_builders.discord + else + local old_from_minetest = builders.irc.from.minetest + builders.irc.from.minetest=function(msg) return minetest_to_irc(old_from_minetest(msg)) end + local old_from_internal = builders.irc.from.internal + builders.irc.from.internal=function(msg) return minetest_to_irc(old_from_internal(msg)) end + mentionpart_builders.irc=function(msg) + if not msg.irc_mentionpart then + msg.irc_mentionpart={} + for index, item in ipairs(msg.mentionpart) do + if index % 2 == 0 then + table.insert(msg.irc_mentionpart, item) + elseif item ~= "#FFFFFF" then + table.insert(msg.irc_mentionpart, convert_color_to_irc(item:sub(2))) + end + table.insert(msg.irc_mentionpart, ((index % 2 == 0) and item) or (item ~= "#FFFFFF" and convert_color_to_irc(item:sub(2)))) + end + end + return "irc_mentionpart" + end + end +end + +function message.mentionpart_target(msg, target) + local builder=mentionpart_builders[target] + message.mentionpart(msg) + local name=builder(msg) + local text = name.."_text" + if not msg[text] then + msg[text]=table.concat(msg[name], builders[target].mention_delim) + end + return msg[text] +end + + +function message.build(msg, target) + local build=target.."_build" + if not msg[build] then + local builder = builders[target] + if msg.internal then + msg[build]=builder.from.internal(msg) + return msg[build] + end + local conversion = builder.from[msg.chatter.service] + local content = conversion(msg) + local source = (msg.chatter.name and msg.chatter.name) + if source and msg.chatter.color then + if target=="minetest" then + source=minetest.get_color_escape_sequence(msg.chatter.color)..source + elseif target=="irc" and bridges.irc.style_conversion.color~="disabled" then + local to_escape, color=convert_color_to_irc(msg.chatter.color:sub(2)) + if source:sub(1,1)==to_escape then + source=string.char(0x02)..string.char(0x02)..source + end + source=color..source + end + end + local mentions = (msg.mentions and next(msg.mentions) and builder.scheme.mention_prefix..message.mentionpart_target(msg, target)..builder.scheme.content_prefix) + if not mentions and source then source=source..builder.scheme.content_prefix end + msg[build]=builder.scheme.message_prefix..(source or "")..(mentions or "")..content..builder.scheme.message_suffix + end + return msg[build] +end \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.attach_pid29291 b/minetest-chat-bridge-bot/.attach_pid29291 deleted file mode 100644 index e69de29..0000000 diff --git a/minetest-chat-bridge-bot/.attach_pid31402 b/minetest-chat-bridge-bot/.attach_pid31402 deleted file mode 100644 index e69de29..0000000 diff --git a/minetest-chat-bridge-bot/.attach_pid31496 b/minetest-chat-bridge-bot/.attach_pid31496 deleted file mode 100644 index e69de29..0000000 diff --git a/minetest-chat-bridge-bot/.attach_pid32551 b/minetest-chat-bridge-bot/.attach_pid32551 deleted file mode 100644 index e69de29..0000000 diff --git a/minetest-chat-bridge-bot/.gradle/4.10/fileChanges/last-build.bin b/minetest-chat-bridge-bot/.gradle/4.10/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/minetest-chat-bridge-bot/.gradle/4.10/fileContent/fileContent.lock b/minetest-chat-bridge-bot/.gradle/4.10/fileContent/fileContent.lock deleted file mode 100644 index 6a1b1766a8ed38c2dc1dc2faa16f4907a1b667d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 ScmZQp>(O@NPke3100jUb#{#?n diff --git a/minetest-chat-bridge-bot/.gradle/4.10/fileHashes/fileHashes.bin b/minetest-chat-bridge-bot/.gradle/4.10/fileHashes/fileHashes.bin deleted file mode 100644 index 2425e23213d30ac4ea4ef9a27f3c8cf4eb3b1bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21597 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�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

4w%~%cTKrr7oyE`a?+yL~91bv`GmPL+-V)op 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 diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/bridge/ProcessBridge$1.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/bridge/ProcessBridge$1.class deleted file mode 100644 index 421308f6a92351bac2044ce82f418a04cbae29b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1197 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 YoIM#^dzv9(i0gXaociCbK8l|Hk$T6pG%$0;~D zW7#=1=T)~W|AC@ZR(LyDc>bCr9RJNYdg!?zEz|aBnq0!h$iT?J1ave512YTIi3}_Z3_zL{ UOgA#HF|Y$=7#TQ#BohNC0040}XaE2J diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/commands/InfoCommand.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/commands/InfoCommand.class deleted file mode 100644 index 74a0b3c51d7422b70131cb7923535cd7c4f768b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1762 zcma)7TTdHD6#m9ud+d!VV$efCI$I(o`5xRec(ksoB`xwRVRH z9xL@n^tms2=}TUSluG#lRewbIx}z-#I(`=ZAOi0X&3l!o-4! zB5qwGL6zeR69(>@n87`c`zAOZaD2(J$nlUN|Je0hwZxE}o8MtD8vdSS7`0tbetXc{ zmBF^y?ULk@?K`5oBLY`HCqhH*yCK6>+wprn;q8UhruUQIh#%?e)ouBq@{$@*%bYVQ;tU*UvW$kQ!W1>aOAqH=^q;)_Kr@dgc3$dxQc6}T=jhw zszCHNrP}xR!qGfx1=LG;jISB4?^A2KG6<{N!O==vxZcxPpnWWr@C}w3E=N_K=b?lZ zj4)hD>n=q-(^VYh#j4))>RJp6JMi z?>Rz!@2Y(|g-UpeX6RAMm<;!4epp1EPJu=fA4+eJp_-z$Pl?--VV|;)32}7|9PQJT zs;GP0fp8?p6HWM2hUqhAT z{I{KPlWr*!3>WC4%F#{}P3uSc+M=Cl>B3vEH+0Bgl-7JCEMSbzrPu%$q3<~wU|gY9 zgDbRaa3=e^UI&mD29TLkWchy}$A*!{&-(472ztLB$7Xk_5M7SFP`Q1KOwF*2TF%P7 zU(9D0d6}2EAxA`Ld7b)Ll&qNZ&}4ZVEkYe-y(O6{A-vs(=v}y_=U6ACx5*m z-xbucL|1n-+$mV3y+Qg3vKYrQKEWEvpJOu0d5f%;DJu&f6WJBoZ;(}y zaG#OoIB6-{gbRI|z^4&=HsQyKJuSOQ)>*QALYOJ~noN^)1I7svSKuge%y7(dd>;Sk t4aN!PVWz1f!&xv6{txnhQ({@nk-H25HfY!Lu!bhqqq0Cj8E(`6&c8ZpmQ(-$ diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericHandler.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericHandler.class deleted file mode 100644 index 4ea9661e12e56e6eba64487976eb7f5bacd773fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmb7AJC4FI5Pbt|0&Igs!4;svC4~_MtPn^MNTi`P!3svfL5{=WDE0sx3Sk^5DX3HOl&|P)ZAkLY7pvZIQ-*K4T0-I-!&hQsa=); diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericResponseHandler.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericResponseHandler.class deleted file mode 100644 index a4dc4d45e52255ef9219650e659a31516dbec301..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1573 zcmb7E+fEZv6kVsC&e(RK6)0Fi5C!Q?iWg8UR!a?mX1s(No}HGl9cX8o>D0u}@DDJW z_=-mH^56&f2mXi;#;AKP#nMuZX?kX#voB}uz1Kcpet!B4;2QD)_!0Bt1mXcCkhGSR z9~UtnKpG1{T*74mR|H&T5UR4aT~iE(sN{;x^u1PHG1T(9qslPwE2^fNS%!&NU#s{Q z1DDsg6^4+cY6=A@DaJ#&RHKt2NiWN_E!j}5y?e-+Rkg`5-4k+CX*P7NsdNBvurWN2 zNvcs!Z*1mQbu%OF$WP>SP1Y*uqG_mF#XV`6YAttE!yp<=IRrEghodVhb@2}g?w59yGO@-RvxcHW;gFPCUsJS-S+y-T zXj`tzMvfe~*hW0hFl#kSi7$B7F!O(VVGmPp_owyRC+Gmn+Q1dK(azy1a-3 zW8JB`g=4sLlmXqYT@>rnB}~)9nw`Xb}j|-ny@o1;0&E{wssOz q@Zl`UPR5qiv}-kqbEG>@IuX7f2(oeSclg7Yp%V{gDgFgpn)?l`G?Kai diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericTimeoutResponseHandler.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/NumericTimeoutResponseHandler.class deleted file mode 100644 index 465daf7c0fee01198326143e6d6dfac2c3c1a1e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1707 zcmb7E-A)rx5dIF`?$UOl2(*YOSmdXrmEsQ|wpI()0I5Hr1if^-tnEU(+ibTcK8A0A z(ZpNy0*x0wfN$Vqcx#M0`vWPZMad>-=gfR(=9@V)=iBcuUjZy)*^h1{{J4r)Yf1Vr zhiiUZ#|=LO+!Qb`V1a>8tD0(N7`W(qY>R#?`nJLl%&VI6s8KB{#->!PkfuMc%Ti@a zGE{5tDmk;P))}JtvZQTS6r-M`Gm4?gn`%|j8|H>mujyJ{S#``Q2ElYJ3~ZgD$2sR7 zVz?j8tA?Ch+gMrF%~W1Mmc0yDnt&}X7hN_iPnT}xw9rjOEvrM_VDKoq{9?|C9?64_|hf>W=ssrHEG?_|O zTxReTb(2ACE*(Qa)~i)2yCzlb+dDyn?%I?}bbG-TLevy>yJVw~-Q%7I6m| z0e3~*LsmpT1{kKCp8VG&GK?Jo+s`W9d27p1KU5U0WR|JrqOmpF%4NyOQtxrmwb%;7 zfHk}=<4DFQ*+PLK)L~ddEmNM?_1#9ziscHE(UZ3kJMlJf5qj3T>FEPF&=UYZtpVC) z;GqxTXU0B(eITg|BCUS<1HJGfh#r!{_MRtAkamPeAI^bs^z>nXd<~MW3n5y=7$V8? z{exl&^v@*@(8cc|?OEVMy!S1p6CwTpp1!#^=yk=VcMv{;+Yj;F^VbXf`#;}j;)&1j z4to#4?^_mf#M#tFZKokhCrlKEFpcwwlRS?RWO2!+yGob#3REfe7@fIa0X|l=Ovbu z76C0?K$4|4xLgHxr+-pbYI2FS9bulZ0=ytF9H>0EygdeP zs|mc!>Xuu{uWzkBbi9JTZ@f10HN&pvOP*`l)i%=dtXh84X#8D4x0+sI*7q00-91Tz z@na>cY8zh5Wi9XiE9lBuS^0TBE$^EZuTcDVYCZfE&ra8|I~;|xvNLKxpg_3nuyI;9 zZvuT4r(P%7wo&(+^#_q`t!Gr(tYlD5hf;cOIxV+CGqqv3Mx8nXT{=Fi0*Ok?bxqrQ zQMYO}+4S`3fjDTK48>BHF?-gd>@Gq(^a;##*~y?i42x`Jf5|f{ujsfvgYlA|{Ub|G z>3Hw?TaQ$>6vwbRGUwk@MfD*HkyxfNIr&N@Jd;uG*$&@EhW!SWDFRtWTvpR+?jyn`h4SVt`f|sJe1LkG zo10(AD4EDHqKDK~{A|*Qa6d|!Vcaq9#xa2lenxAEN}rvKvi^q# wxJ*pemc=w?=rO|e3Tsetm1t0()W6o&pQdI6v%FIweqcg5sgbqih=wrt3#_bJ)c^nh diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TopicResponseHandler$1.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TopicResponseHandler$1.class deleted file mode 100644 index e6029c2134b306537d65a7d808d2d8542a1b648b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 977 zcmaJoy9MIfbDJ%DBu6^9Gn`OqNly#jRc1IX>_KOLxMGwO!f{f0Cco z#291v0sbOC8Q;?_%$UWb=Xu`eJ@4)GoS(nHUjo?2^DJ)SRt7RwGGyHra#g~b5O)OJ z6|gR#C}2atri3jCC5Gjq`N4_oUeoFqy}^4PICfDRGQ-qyogw|wb{)@&UNI!LOC5$} z)$ekK`G(_h3O(gP+d6g0lWX|4<#w#V5qjjDH6zP@N99L4Yx;x0=7)~RD75{)V;el| z`(DUvme+N8uybx*SX5v2Y}XGR@2ttAp5K*lkA~5B7}fkRl5k(f13Z*5hj|%0D9d<+ z$8;c(U3M++tgQLw!0sJ7-0iAC;0H3Eh_I&uo(b3$uqR+2Wro$>aDcEpX{;g@m+PL# zgQ{zVArBdpaWDP!oZAt@%71InsYXA!eD#x47nVB^)$-e=dSN2g&Z`YeD^-&Guq*|+JddsMHOifh})B`$Prit724|rm{wlZ1^bry#aE-=J#lz>R1~5hII;{=N9Z3|?oB*2e d#egJk#7T?P8l(z@%dw|`ZQ?AImWiRH{{V$%(%S$4 diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TopicResponseHandler.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TopicResponseHandler.class deleted file mode 100644 index 58851fd40ead08b1200f7504028525ff3279a526..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1388 zcmb7EYflqF6g@+WOUqJ9d8jCYSg}-~peSgOM}fv-sis9@G|_C^4J?-3W_OG6FZl^c z)aVD}XMc^qz<8$HHps)oY3}UIoxA6rx%X^;{{HqIz#P);d~oDOg6P6{04m}Egm62E z2}}ksg+wQ&F{9v)+}xGZtb%(A?kkuRP&1~f+p87Ladbx@RJE-GqpX+TxK`CD2}H7c z+JTm+Xy#6$;M#_{lN7kHV3>xxDBz2YZwvTWt+FoAoi$87SKBY@_Lf$x&=bj8C9Sfp z*@oOVoPKxLV5Z^hu4a}iy6q&kWU9RGR4vodAA4SA>GA@IsN0gtS}beWr9>vbnzGzv z*7W>|#(B~sT62v`B5OEqa=aex!Ihing!L6Im-jx7MJLe&dQO4zu2s#}_DMK=GJ(Lr z-}if8ZQe0@B6i_)6&K|V3$9jryQx(hr3n;_9aD2_Hf#6dzixYGg7Yd6ELb(Wq^Awp zqswPie@Zr8pfjgC?xrp~>ZpidUPTx^DjwjWf~1NCJW{ZzVhPI%R#c?0$~v7CjEXfZ zt60afz|cRNE-=ds5uQWBMsU*CG3&k6LOqqI=H5-mj%ZAYi{ z`eT{#V|sX6+|x@g)zF^Gudh5I@n2ovAGqPz zrpY708_|jw=G#6NuX$VP8Kvh2 kJwbHL`g(kF5L*`XCQrudt6R(>nei`>6_c@Y#S!lK10JDBEdT%j diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TryAgainHandler.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/handlers/TryAgainHandler.class deleted file mode 100644 index ca878117da98368ed4350417ea5ff423acfd5516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1598 zcmb7E*-{fh6g^Esh77}E2na6Vf*2MP1r;@jBC{FyAp}cPmFd1qpL_e>bNl@)dNri#)oq;j5X*@d(~ zWX7^BZ&si;vDZAhDiEG`)=hz~tYw>btEDy5U6E@=YGPR@FN>?vwUk^_hP@4|B5)|X z!H`AMt)y1m&AEcK?BzhgkWt58u}Y>>^#no*6(b&aKeW6JYX2CYCbE{BPh}p=-*CM2 z-t+=Z)w7DJJF@(Dhpbic(xX0JkjeT3vr=~Kiph)wuhSc#Sxzc*Z{bzmEPIw?(-vBD zn5R*ni9ma;sJ1NeXxNhlUb?Fx9~QUbRNXv1B4z2y5`DVseEgII`gYfGv;4c37wUX@ zznMU+Z(p6}-r6%W@1P<<^n&Wd1pUYpsjstb#4Qs>^)e{#WIj1Zb97 zovuc|e@S$|p6NNiwu_eHV!VN6NyT&n2XNIu7rNQS$%|7OW({1!b%Fl<*r|@hG|U;e zfq8)*e_(b~!oW=oXjm|?h$REdSP~f8!3&7}n_B_ZTv8-)OA)=haRNyV^F>t_NsV0t zSZn9#V*!0<28dHJ)hMT$4C~IwHAGLV$X#U)yyv%k#g&SaJqovB78u}mCYx2$(8Nm8 zgzwMgayZUMr;~3ICr6c+yAXFQ9lt%4GL&1mc8tX#J|i?X{t4mtRJ0(@Zzs((`XH)5 zy_EWb16&VMQdR}50`y~`20Ko@Q2!mMh_C4OA&kISgWw~C!vt0N{6H&%0m+G2>oy{9 zFg!l?5#g`U9;x*++O`pW2mMN9AhM124=}bqpks@8Q5?Y#U)8Xm_@Ivxqc%?cL0WoQ zi$07n$uY)L7g?syamG7>qll=Of3B3oAWx_ZByo(FQx!_m_k>@LBu-Kn_I1NJMT8OV igR&^E(>1SQBxoC@tqq|k8uUnru~liui9O-(&in!|ihryC diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/Command.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/Command.class deleted file mode 100644 index 40c8fb4492e178b9ba5365745345c32e6edff731..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmX^0Z`VEs1_pBmZgvJvb_Om+2KLm7)a25VR7M5|4WG=SWPQ&dXQ%uUYoDydvPAvT zlFS@^-^2naHzzSKT|c;_C^Ih|S%FVxaf!8N7$XB`aAta5Vo7Nc(6}l*#@Rqj$21Ns z;-8e2np|RSN7zy<=GcK9!WEofT9lmXmYD-|36FDrZf;^;iXO;Ij11f$UqXc#83e%o lM6#ESk%5tc2^dHW42&#{49pBHKt3yw$Hc$}WU+%;901{NU*G@$ diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/Default.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/Default.class deleted file mode 100644 index c0e9826b3ac91beef63953e351676fff771b5b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365 zcmX^0Z`VEs1_pBmZgvJvb_Om+2KLm7)a25VR7Qp%4WG=SWPQ&dXQ%uUYoDydvPAuy z#JqI<;F6-uymY8YX-Q^|zHedyeg!_6#U<97VT=r%!I|lKi6x~)Knr?EvcLwH3&3vj zPs&P7F0r;F>F1rd{!WjiGdBsVh6K006yGpPyhe` diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/HandledResponse.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/HandledResponse.class deleted file mode 100644 index ed4cd37a0d6349cf617c2d879fecd1fa839e271d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1028 zcmZ`%Yi|-!5Iq-`-DSHilt*9UtF{)X7Ex+VAWgBs*mTnxmXZ)ZEwJJ?%hK@Z?^2pr zqtW!UKgu}wmRPE=o7~CFoS8Xi?)~-q+fM*Hcol?%w1!PQQLw1ssfIAN_>oaDuTe6? z5zkaaxy`DGar<0FoZA-)atzYpfnhMj4X4}4ytTZhYd6bw@2unX>^!C46-|>N@VZksda8;T+3@^%zoGLTKUwJkrAWQu-vNEb$FLiE6KCk)G_jZ8`4v7Jg2`) zDke-hNL6V8{f`c52%1jIv-*QBb@C^9LM=4hQSruD>ykHU7beo%rFCj%XV7ifZyc^M z_RqSvxK14l{4N)DY~v+Ebi%dhNMJ|DL#*nUM?^=IA2EK!5n-6S*%xO+x7Tnx9v_%Y zjWIp0pW2N+k=h>DzVBMSUVaSrcjdRc=J&GnhQjm^1AEJy20)gW2uoyyB|boSg=-?D zgdmo%42Bi*R>|^D8-jg-?+X4;QLjEk$#oH{`Z`G@qNYSIuhW-TzptXY$X2$>gPoYVCRG$PGc QmLtl(5swWdDdt1!4@EA`-2eap diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/IRCBot$1.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/IRCBot$1.class deleted file mode 100644 index fd399f481043962892e8c777080ec7eb7da0b702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 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 diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/PongCommand.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/irc/PongCommand.class deleted file mode 100644 index edbf4475cf45397285abd42c507458f5dc30e16e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1788 zcmaJ>%W@M(6g_Q?HL@&hW3WLEQNS3Gc_|?wJmfgo0)b%s2y&4HtM+(G9xTnMW?B^R zC0S;dH5*c}NM)Vh$v&0SJws(|CT#j~``&xbef3}eeE0*vEp*G6M12y=xU82eHm=U{ z;p;NK!Hro6d}rfk86|vgx8TtC23N5wo#{$P4KXMz}VbE)ZgMke8ngX`>%5z7GmiOxBx%0HO9;&AE zLcWxZk@EYE4LMA&eHru`T^0F3FRS4Av1)2of^Oy#OFwLMwjR84y`l2MfIx-aPzhAB z7z{(n9*IpKL1VaaIEq{ok0Fvp=Ic;KazMkGjG4!uZJI#a5JOJkXDjw)^SF% zwfn+zRdbcZmoj!5Bgasy9qTIT9?)@`^NFtC3#1xF4C2jaQk&y0k4Hw9Uw|AxtEMRB zu1RIv*X=Qrss44H*$R$f%EsLanpmme2e8Fvj;5TV^)OViisW#^Q~TjwJYB?(CETlE z4eK^q72L;z659IyP~e2|aJUC5c!Vj|`bZBRf=kjaFsYT&CKZ@6-b^p*0%*;o5K#YzT>opiCDu}(9b zb(o3-%9>g-B$|j9>}l{EW6nblg)4Hq9yzNuCKhNji&+^K8Y`nn?UXJdN>FD$3At#FtK`up+B{BaOgJf9eL9V*@#$azUy!+$oxztVm{Sd35$7z=^Xc0H z)0Jq|h-cwE-zH!!);Q;-B9?d^!v&gOG^b10>BS=)VWSs!>r%_3lR6n A%>V!Z diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/misc/GarbageCollector.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/misc/GarbageCollector.class deleted file mode 100644 index 845e698785a1c42214e83b655a1496274f4e8e0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647 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 diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/numeric/NumericLookup.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/numeric/NumericLookup.class deleted file mode 100644 index c75edc174889d21069b029181a0de777d4393b78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5959 zcmZvgd0-UP9mjvOM=q8u1Q10ffPx_$0Yo_h#L4a?88bVx?(8On!?=V13n3eljoL%$ zA>J*XZS7%tY43vAB5G@FwY9a?Xl?6NOV!@CO)u@?5r5y`OkQFze|&a6Z{GX8-@9fu z`{-NuJwQaOw0&jNOV^juKKe)*eUuKCQG{+NrW;G>rZT#jZUJt^osX4qosXANm_AWV zx1k!h3ezWX^(kC^8u$!wJ1_uz7Wf?SdEg7c7lAu~JAp3&Uk1Jcd=>Z_@O9uDz&C+I zz+vDn;0SOx@Gaomz)|2H;23Z(a363#@Ezd0zyrV_@F4I#;QPQsz{9`~fFA;n06zkL z3_J?_1o$cN81OhS1Uvye3H%Ir3ivtj3*eW))4(&pv%qt}^T4lw7l2;_$ARAfF9I(C zF9W{?eh2&>_yh1q;7`DxfmeXP0DlGk1`Gp#2mS&46ZjYKZ{StnHQ+zMe}Vr2{|8L_z)av| z;1pmMa4K*ba5^v>s08K!bAfrl8Nivqd|&}^7ElE&1ge2Wz+zwtuoS2PmI2Fw6~NiR zO5hyeTwoQj8dw9Y1!{qHzU1Bmf(5fFy7M zkOEvF4P<~8pcU8%v;mud&A=95D{vvu4qOCefo(tsupQ_Gb^tqpT|f@l4eSBBfW1IB zkOz9O1!hdxG~PzjXo_qNIkV2T-JKl;jVi~Acvtd)Y{>WS%@)*7<{dazLk_w|#TRG0 z`a7K+{<)iQpU+)zXD5eVF#gne{qdg)dir?~ ztH<~4XMExq#&@lT6+yT*CzEP&+_WD(mNN9T5$C*cGtp++4Gtf8i0NjMNhifMu@JBMH$m*Yh%nvrYBZ2#+Aw(^X$2to4+u&o=6!QWM~AKQ;agSKmY0T~g(}%p$Ll-pAJw|N8xO8Cxm7cyb9EujYVgTz-TCvyM^l zD1{!R@L?_q&{&kcmPnhNoeUa&J6yl~0%Z^OP?ZKSTKv@iUb# z6`!xXMtp(t<>F^4Um;$le3ke@<*UW3m9G(Bq;3#V=I;qIkRVm&7kp{<3&h z`77evl)oz8q5L)R?V}#JUA$BI-QqixKPA3%)Pq-u?^1q1Jg59h@!iU=65pfzYVj`R z*NE>`eyw=7^6SL&%C8sif#WTz;k~5YMBDkggx@Wt{7x$4H_jwl$?wy8noLP5r*?i@ zs(ZGdYca=Qy2zo0!eN zCsgup0CTkcG*>%F^RxjvLpwxgYJ)Ui8=?i;aXL#IrYdcO76zhJ9jK&5ff`yIsG}tT zhn5D~sV0!8Wr6*)JaCX!1P18rz#&>07^HIoLv(K7IIRi{)9SzotqDeHZLpGRgEh1+ zSV!xF4s8gwQ(Z7m=LPqZ9z00(!2yZ|4^ccgNJemo8iL2EF*r<3!4Wb;Q93_VNzI`e zvO;x~2svbj+Q|v!DH+;N7laN{Dl|ZD=n$ntgOmvkQA_AJwT6aiV`zlh!cp23uB6T3 z8rl-Bqpe|wE)2I*dpJ)Qh4)i7e2}(<2dE=_h_;6ZsWUu8JHp3lXLy))g-0k?6s6ro Pm9&Rf=2~8p0A2SsfVXeI diff --git a/minetest-chat-bridge-irc-bot/res/input.txt b/minetest-chat-bridge-irc-bot/res/input.txt deleted file mode 100644 index e69de29..0000000 diff --git a/minetest-chat-bridge-irc-bot/res/output.txt b/minetest-chat-bridge-irc-bot/res/output.txt deleted file mode 100644 index 6b5d26f..0000000 --- a/minetest-chat-bridge-irc-bot/res/output.txt +++ /dev/null @@ -1,13 +0,0 @@ -[JOI]LMD #800126 #mtchatbridgetest -[CGM]LMD LMD[irc],irc oofieduudles -[JOI]LMD #800126 #mtchatbridgetest -[JOI]LMD #800126 #mtchatbridgetest -[JOI]LMD #800126 #mtchatbridgetest -[CGM]LMD ,irc -[JOI]LMD #800126 #mtchatbridgetest -[CGM]LMD LMD[irc],irc ooof -[CGM]LMD ,irc -[JOI]LMD #800126 #mtchatbridgetest -[CGM]LMD ,irc -[JOI]LMD #800126 #mtchatbridgetest -[JOI]LMD #800126 #mtchatbridgetest diff --git a/minetest-chat-bridge-irc-bot/src/bridge/ProcessBridge.java b/minetest-chat-bridge-irc-bot/src/bridge/ProcessBridge.java deleted file mode 100644 index ed95524..0000000 --- a/minetest-chat-bridge-irc-bot/src/bridge/ProcessBridge.java +++ /dev/null @@ -1,127 +0,0 @@ -package bridge; - -import appguru.Main; - -import java.io.*; -import java.util.function.Consumer; - -public class ProcessBridge { - public long last_ping; - public void ping() { - last_ping=System.currentTimeMillis(); - } - public File out_file; - public File in; - public PrintWriter out; - - public ProcessBridge(File in, File out) throws IOException { - this.out = new PrintWriter(new BufferedWriter(new FileWriter(out, true))); - this.out_file=out; - this.in=in; - } - - public void kill(String reason) { - Main.OUT.println("INFO: "+reason); - FileWriter fw = null; - try { - fw = new FileWriter(in); - fw.write(""); - fw.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - try { - Main.chat_bridge.send("QUIT :" + reason); - } catch (IOException e) { - e.printStackTrace(); - } - if (!Main.chat_bridge.socket.isClosed()) { - try { - Main.chat_bridge.socket.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - System.exit(0); - } - - public void write(String out) { - this.out.println(out); - } - - public void serve() { - new Thread() { - public void run() { - while(true) { - try { - Thread.sleep(20); - } catch (InterruptedException e) { - e.printStackTrace(); - } - out.flush(); - out.close(); - try { - out = new PrintWriter(new BufferedWriter(new FileWriter(out_file, true))); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - }.start(); - } - - public void listen(Consumer line_consumer) { - ping(); - new Thread(() -> { - while(true) - - { - try { - Thread.sleep(20); - } catch (InterruptedException e) { - e.printStackTrace(); - } - BufferedReader r = null; - try { - r = new BufferedReader(new FileReader(in)); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - String line = null; - try { - line = r.readLine(); - } catch (IOException e) { - e.printStackTrace(); - } - boolean one_line = line != null; - while (line != null) { - if (line.startsWith("[PIN]")) { // A PING YAY - ping(); - } else if (line.startsWith("[KIL]")) { - kill("Minetest server shutting down; shutting down as well."); - } else { - line_consumer.accept(line); - } - - try { - line = r.readLine(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if (System.currentTimeMillis()-last_ping > Main.PING_WAIT) { - kill("No ping during the last "+(Main.PING_WAIT/1000)+"s; shutting down."); - } - if (one_line) { - try { - FileWriter fw = new FileWriter(in);fw.write("");fw.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - }).start(); - } -} diff --git a/mod.conf b/mod.conf index b790625..4ae8c2c 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,6 @@ name=adv_chat +title=Advanced Chat +author=Lars Mueller aka LMD or appguru(eu) description=A library for advanced chatting. -depends=modlib \ No newline at end of file +depends=modlib +optional_depends=cmdlib \ No newline at end of file diff --git a/process_bridges.lua b/process_bridges.lua new file mode 100644 index 0000000..b1a02de --- /dev/null +++ b/process_bridges.lua @@ -0,0 +1,106 @@ + + +local socket = require("socket") +function set_socket(sock) + socket=sock + build_bridge = (socket and build_socket_bridge) or build_file_bridge + set_socket=nil +end + +local os_execute = os.execute +function set_os_execute(os_exec) + os_execute = os_exec + set_os_execute = nil +end + +local ping_timeout = 5 + +function build_socket_bridge(name, logs) + local server = socket.tcp() + server:bind("*", 0) + server:settimeout(5) + local ip, port = server:getsockname() + local logs=logs or minetest.get_worldpath().."/bridges/"..name.."/logs.txt" + minetest.mkdir(minetest.get_worldpath().."/bridges/"..name) + file_ext.create_if_not_exists(logs, "") + minetest.register_on_shutdown(function() + server:close() + end) + + local self = { + info={name=name, server=server, ip=ip, port=port}, + serve=function() end + } + + function self.start(process) + os_execute(process:format("", tostring(port), logs)) + self.client = server:accept() + self.start=nil + end + + function self.write(line) + self.client:send(line.."\n") + end + + function self.listen(line_consumer) + local status, err_msg=server:listen() + if status ~= 1 then + minetest.request_shutdown("adv_chat: "..name..": socket error: "..err_msg) + end + minetest.register_globalstep(function() + local available = socket.select({self.client}, nil, 0) + if next(available) then + local line, error = self.client:receive("*l") + if not error then + if string_ext.starts_with(line, "[KIL]") then + minetest.request_shutdown("adv_chat: "..name..": process terminated: "..line:sub(6)) + else + line_consumer(line) + end + elseif error=="closed" then + minetest.request_shutdown("adv_chat: "..name..": socket closed") + end + end + end) + end + + return self +end + +function build_file_bridge(name, input, output, logs) + file_ext.process_bridge_build(name, input, output, logs) + local self = { + info={name=name, ref=file_ext.process_bridges[name]}, + serve=function() + return file_ext.process_bridge_serve(name) + end, + write=function(line) + return file_ext.process_bridge_write(name, line) + end, + listen=function(line_consumer) + function consumer(line) + if string_ext.starts_with(line, "[PIN]") then + self.last_ping = minetest.get_gametime() + elseif string_ext.starts_with(line, "[KIL]") then + minetest.request_shutdown("adv_chat: "..name..": process terminated: "..line:sub(6)) + else + return line_consumer(line) + end + end + return file_ext.process_bridge_listen(name, consumer) + end + } + self.start=function(process) + file_ext.process_bridge_start(name, process, os_execute) + self.last_ping = minetest.get_gametime() + minetest.register_globalstep(function() + if minetest.get_gametime()-self.last_ping > ping_timeout then + minetest.request_shutdown("adv_chat: "..name..": process crashed (no ping during last "..ping_timeout.."s)") + end + end) + self.start = nil + end + return self +end + +build_bridge = (socket and build_socket_bridge) or build_file_bridge \ No newline at end of file diff --git a/test.lua b/test.lua index b61d3b8..9ba88d6 100644 --- a/test.lua +++ b/test.lua @@ -1,4 +1,4 @@ --- Test for hud_channels.lua +-- Test for hud_channels.lua & text_styles.lua register_hud_channel("score", {mode="stack", hud_base_position={x=0.6, y=0.5}, autoremove_interval=4}) @@ -6,8 +6,15 @@ mt_ext.register_globalstep(1, function() if math.random() > 0.5 then local choice=math.random(1, 3) local text=({"-", "+", "~"})[choice]..tostring(math.random(1, 50)) - minetest.chat_send_all("adv_chat:hud_channels test - sending "..minetest.get_color_escape_sequence(({"#FF0000","#00FF00", "#9999FF"})[choice])..text) + --minetest.chat_send_all("adv_chat:hud_channels test - sending "..minetest.get_color_escape_sequence(({"#FF0000","#00FF00", "#9999FF"})[choice])..text) add_msg_to_hud(nil, "score", {number=(({0xFF0000, 0x00FF00, 0x9999FF})[choice]),text=text, hud_elem_type="text",scale={x=100,y=100}, alignment = {x=-1,y=0}}) end end) + +minetest.after(3, function() + minetest.chat_send_all(convert_colors("This is a \x033test. \x03This is another \x037one.")) + minetest.chat_send_all(irc_to_markdown(string.char(0x02).."bold "..string.char(0x02).." "..string.char(0x1D).."italics")) + minetest.chat_send_all(minetest.write_json(markdown_to_irc("**bold***italics*"))) + --minetest.chat_send_all(markdown_to_irc()) +end) \ No newline at end of file diff --git a/text_styles.lua b/text_styles.lua new file mode 100644 index 0000000..be4e19d --- /dev/null +++ b/text_styles.lua @@ -0,0 +1,568 @@ +-- TODO work on this +-- Support for : Colors | Styles +-- Minetest : Yes | No +-- IRC : Yes | Yes +-- Discord : No | Yes + +-- Assumptions : +-- 1. IRC users only use IRC formatting chars and don't rely on Markdown +-- 2. Minetest users only use Minetest color codes + Markdown +-- 3. Discord users only rely on Markdown +-- Note : Markdown means Discord Markdown + +-- Resulting conversions : +-- Minetest colors -> IRC colors +-- IRC colors -> Minetest colors +-- Discord styles -> IRC styles +-- IRC styles -> Discord styles + +-- Resources : +-- https://modern.ircdocs.horse/formatting.html +-- https://support.discordapp.com/hc/en-us/articles/210298617-Markdown-Text-101-Chat-Formatting-Bold-Italic-Underline- +-- https://github.com/minetest/minetest/blob/master/doc/lua_api.txt + +-- Notes: +-- While code ("`code`") to IRC is straightforward (monospace), monospace to code is undefined behavior (concat code blocks? no code blocks at all?) + +local function is_digit(char) + return char >= "0" and char <= "9" +end + +local md_escape={ + ["*"]=true, ["_"]=true, ["~"]=true, ["`"]=true, ["\\"]=true, ["|"]=true +} + +function escape_markdown(text) + local res={} + for i=1, text:len() do + local char=text:sub(i,i) + if md_escape[char] then + table.insert(res, "\\") + end + table.insert(res, char) + end + return table.concat(res) +end + +-- minetest characters: color starter +local minetest_color_starter=string.char(0x1b) + +-- irc characters +local irc_escape_code=string.char(0x02)..string.char(0x02) +local irc_disable=string.char(0x0F) +local irc_color_reverse=string.char(0x16) +local irc_color_starter=string.char(0x03) +local irc_hex_color_starter=string.char(0x04) +local irc_bold=string.char(0x02) +local irc_italics=string.char(0x1D) +local irc_underlined=string.char(0x1F) +local irc_strikethrough=string.char(0x1F) +local irc_monospace=string.char(0x11) + +-- Converts Discord-style Markdown to IRC format +local irc_style_to_md={ + [irc_bold]="**", -- Bold + [irc_italics]="*", -- Italics + [irc_underlined]="__", -- Underlined + [irc_strikethrough]="~~", -- Strikethrough +} + +local md_style_to_irc=table_ext.flip(irc_style_to_md) + +local irc_escape={ + [irc_bold]=true, [irc_italics]=true, [irc_underlined]=true, [irc_strikethrough]="~~", [irc_disable]=true, [irc_color_reverse]=true, [irc_monospace]=true +} + +local function skip_color_code(text, i) + for j=1,2 do + if is_digit(text:sub(i+1,i+1)) then + i=i+1 + end + end + if text:sub(i+1,i+1) == "," and is_digit(text:sub(i+1,i+1)) then + i=i+1 + if is_digit(text:sub(i+1,i+1)) then + i=i+1 + end + end + return i +end + +function escape_irc(text) + local res={} + local i=1 + while i <= text:len() do + local char=text:sub(i,i) + if char == irc_color_starter then + i=skip_color_code(text, i) + elseif char == irc_hex_color_starter then + i=i+6 + elseif not irc_escape[char] then + table.insert(res, char) + end + i=i+1 + end + return table.concat(res) +end + +md_style_to_irc["_"]=md_style_to_irc["*"] + +local markdown_trie = trie.new() +for tag, toggle in pairs(md_style_to_irc) do + trie.insert(markdown_trie, tag, {name=tag, reversed=tag, opening=toggle, closing=toggle, space_sensitive=true}) +end +trie.insert(markdown_trie, "||", {name="||", reversed="||", opening=irc_color_starter.."01,01", closing=irc_color_starter, escape_func=is_digit}) +trie.insert(markdown_trie, "***", {name="***", reversed="***", opening=irc_italics..irc_bold, closing=irc_italics..irc_bold, + space_sensitive=true, conversion={ + ["*"]={name="**", reversed=irc_italics.."**", opening=irc_italics..irc_bold, closing=irc_bold}, + ["**"]={name="*", reversed=irc_bold.."*", opening=irc_italics..irc_bold, closing=irc_italics} + } +}) +trie.insert(markdown_trie, "___", {reversed="___", opening=irc_underlined..irc_italics, closing=irc_underlined..irc_italics, + space_sensitive=true, conversion={ + ["_"]={name="__", reversed=irc_italics.."__", opening=irc_italics..irc_underlined, closing=irc_underlined}, + ["__"]={name="_", reversed=irc_underlined.."_", opening=irc_underlined..irc_italics, closing=irc_italics} + } +}) + +local markdown_code_tag="`" + +-- Strips Markdown for Minetest. Won't strip invalid Markdown (like 1*1=2) +function strip_markdown(markdown) + local i=1 + local res={} + local tags={} + while i <= markdown:len() do + local char = markdown:sub(i,i) + if char == markdown_code_tag then + local closing = markdown:find("[^\\]`", i+1) + if closing then + table.insert(res, markdown:sub(i+1, closing)) + i=closing+1 + goto continue + end + elseif char == "\\" and md_escape[markdown:sub(i+1,i+1)] then + table.insert(res, markdown:sub(i+1,i+1)) + i=i+1 + goto continue + elseif char == " " then + if res[#res] and res[#res].space_sensitive then + res[#res] = res[#res].reversed + table.remove(tags) + end + else + local tag, offset = trie.find_longest(markdown_trie, markdown, i) + if tag then + for index, tag_index in table_ext.rpairs(tags) do + local conversion = res[tag_index].conversion and res[tag_index].conversion[tag.name] + if res[tag_index].name == tag.name or conversion then + if tag.space_sensitive and markdown:sub(i-1,i-1) == " " then + table.insert(res, tag.reversed) + else + local index_2 = #tags + while index_2 > index do + local tag_index_2 = tags[index_2] + res[tag_index_2] = res[tag_index_2].reversed + table.remove(tags) + index_2 = index_2 - 1 + end + if conversion then + res[tag_index] = conversion + else + table.remove(tags) + res[tag_index] = "" + end + end + i=offset + goto continue + end + end + table.insert(res, tag) + table.insert(tags, #res) + i=offset + goto continue + end + end + table.insert(res, char) + ::continue:: + i=i+1 + end + for _, tag in pairs(tags) do + if res[tag].reversed then + res[tag]=res[tag].reversed + end + end + return table.concat(res) +end + +function markdown_to_irc(markdown) + local i=1 + local res={} + local tags={} + while i <= markdown:len() do + local char = markdown:sub(i,i) + if char == markdown_code_tag then + local closing = markdown:find("[^\\]`", i+1) + if closing then + table.insert(res, irc_monospace) + table.insert(res, markdown:sub(i+1, closing)) + table.insert(res, irc_monospace) + i=closing+1 + goto continue + end + elseif char == "\\" and md_escape[markdown:sub(i+1,i+1)] then + table.insert(res, markdown:sub(i+1,i+1)) + i=i+1 + goto continue + elseif char == " " then + if res[#res] and res[#res].space_sensitive then + res[#res] = res[#res].reversed + table.remove(tags) + end + else + local tag, offset = trie.find_longest(markdown_trie, markdown, i) + if tag then + for index, tag_index in table_ext.rpairs(tags) do + local conversion = res[tag_index].conversion and res[tag_index].conversion[tag.name] + if res[tag_index].name == tag.name or conversion then + if tag.space_sensitive and markdown:sub(i-1,i-1) == " " then + table.insert(res, tag.reversed) + else + local index_2 = #tags + while index_2 > index do + local tag_index_2 = tags[index_2] + res[tag_index_2] = res[tag_index_2].reversed + table.remove(tags) + index_2 = index_2 - 1 + end + if conversion then + res[tag_index] = conversion + else + table.remove(tags) + res[tag_index] = res[tag_index].opening + end + table.insert(res, tag.closing) + if tag.escape_func and tag.escape_func(markdown:sub(offset+1,offset+1)) then + table.insert(res, irc_escape_code) + end + end + i=offset + goto continue + end + end + table.insert(res, tag) + table.insert(tags, #res) + i=offset + goto continue + end + end + table.insert(res, char) + ::continue:: + i=i+1 + end + for _, tag in pairs(tags) do + if res[tag].reversed then + res[tag]=res[tag].reversed + end + end + return table.concat(res) +end + +-- Converts Markdown to IRC +function markdown_to_irc(markdown) + local i=1 + local res={} + local tags={} + while i <= markdown:len() do + local char = markdown:sub(i,i) + if char == markdown_code_tag then + local closing = markdown:find("[^\\]`", i+1) + if closing then + table.insert(res, irc_monospace) + table.insert(res, markdown:sub(i+1, closing)) + table.insert(res, irc_monospace) + i=closing+1 + goto continue + end + elseif char == "\\" and md_escape[markdown:sub(i+1,i+1)] then + table.insert(res, markdown:sub(i+1,i+1)) + i=i+1 + goto continue + elseif char == " " then + if res[#res] and res[#res].space_sensitive then + res[#res] = res[#res].reversed + table.remove(tags) + end + else + local tag, offset = trie.find_longest(markdown_trie, markdown, i) + if tag then + for index, tag_index in table_ext.rpairs(tags) do + local conversion = res[tag_index].conversion and res[tag_index].conversion[tag.name] + if res[tag_index].name == tag.name or conversion then + if tag.space_sensitive and markdown:sub(i-1,i-1) == " " then + table.insert(res, tag.reversed) + else + local index_2 = #tags + while index_2 > index do + local tag_index_2 = tags[index_2] + res[tag_index_2] = res[tag_index_2].reversed + table.remove(tags) + index_2 = index_2 - 1 + end + if conversion then + res[tag_index] = conversion + else + table.remove(tags) + res[tag_index] = res[tag_index].opening + end + table.insert(res, tag.closing) + if tag.escape_func and tag.escape_func(markdown:sub(offset+1,offset+1)) then + table.insert(res, irc_escape_code) + end + end + i=offset + goto continue + end + end + table.insert(res, tag) + table.insert(tags, #res) + i=offset + goto continue + end + end + table.insert(res, char) + ::continue:: + i=i+1 + end + for _, tag in pairs(tags) do + if res[tag].reversed then + res[tag]=res[tag].reversed + end + end + return table.concat(res) +end + +-- Converts IRC text modifiers to Discord markdown, escaping included +function irc_to_markdown(irc) + local res={} + local active={} + local i=1 + while i <= irc:len() do + local char=irc:sub(i,i) + local md=irc_style_to_md[char] + if md then + while irc:sub(i+1)==" " do + table.insert(res, " ") + i=i+1 + end + for index, open_md in table_ext.rpairs(active) do + if open_md == md then + table.remove(active, index) + local i=#res + while res[i] == " " do + i=i-1 + end + table.insert(res, i+1, md) + goto noinsert + end + end + table.insert(active, md) + table.insert(res, md) + ::noinsert:: + elseif char == irc_disable then + for _, md in table_ext.rpairs(active) do + table.insert(res, md) + end + active={} + elseif md_escape[char] then + table.insert(res, "\\") + elseif char == irc_color_starter then --color + if irc:sub(i+2, i+2) == "," then + if is_digit(irc:sub(i+1, i+1)) and irc:sub(i+1, i+1) == irc:sub(i+3, i+3) and not is_digit(irc:sub(i+4, i+4)) then + table.insert(active, "||") + table.insert(res, md) + end + elseif irc:sub(i+3, i+3) == "," then + local fg, bg = irc:sub(i+1, i+2), irc:sub(i+4, i+5) + if is_digit(irc:sub(i+1, i+1)) and is_digit(irc:sub(i+2, i+2)) and fg == bg and fg ~= "99" then + table.insert(active, "||") + table.insert(res, md) + end + else + for index, open_md in table_ext.rpairs(active) do + if open_md == "||" then + table.remove(active, index) + local j=#res + while res[j] == " " do + j=j-1 + end + table.insert(res, j+1, md) + end + end + end + i=skip_color_code(text, i) + else + table.insert(res, char) + end + i=i+1 + end + for _, thing in table_ext.rpairs(active) do + table.insert(res, thing) + end + return table.concat(res) +end + +-- Converts IRC colors to Minetest colors, background colors included +local user_defined_colors={'000000','0000FF','00FF00','FF0000', '654321','FF00FF','FFA500','FFFF00', +'90EE90','00FFFF','E0FFFF','ADD8E6','FF69B4','808080','D3D3D3'} +user_defined_colors[0]='FFFFFF' +local conversion_table={[16]='470000',[17]='472100',[18]='474700',[19]='324700',[20]='004700',[21]='00472c',[22]='004747',[23]='002747',[24]='000047',[25]='2e0047',[26]='470047',[27]='47002a',[28]='740000',[29]='743a00',[30]='747400',[31]='517400',[32]='007400',[33]='007449',[34]='007474',[35]='004074',[36]='000074',[37]='4b0074',[38]='740074',[39]='740045',[40]='b50000',[41]='b56300',[42]='b5b500',[43]='7db500',[44]='00b500',[45]='00b571',[46]='00b5b5',[47]='0063b5',[48]='0000b5',[49]='7500b5',[50]='b500b5',[51]='b5006b',[52]='ff0000',[53]='ff8c00',[54]='ffff00',[55]='b2ff00',[56]='00ff00',[57]='00ffa0',[58]='00ffff',[59]='008cff',[60]='0000ff',[61]='a500ff',[62]='ff00ff',[63]='ff0098',[64]='ff5959',[65]='ffb459',[66]='ffff71',[67]='cfff60',[68]='6fff6f',[69]='65ffc9',[70]='6dffff',[71]='59b4ff',[72]='5959ff',[73]='c459ff',[74]='ff66ff',[75]='ff59bc',[76]='ff9c9c',[77]='ffd39c',[78]='ffff9c',[79]='e2ff9c',[80]='9cff9c',[81]='9cffdb',[82]='9cffff',[83]='9cd3ff',[84]='9c9cff',[85]='dc9cff',[86]='ff9cff',[87]='ff94d3',[88]='000000',[89]='131313',[90]='282828',[91]='363636',[92]='4d4d4d',[93]='656565',[94]='818181',[95]='9f9f9f',[96]='bcbcbc',[97]='e2e2e2',[98]='ffffff'} +function hex_to_table(color) + return {tonumber(color:sub(1, 2), 16), tonumber(color:sub(3, 4), 16), tonumber(color:sub(5, 6), 16)} +end +function table_to_hex(color) + return string.format("%02X", color[1])..string.format("%02X", color[2])..string.format("%02X", color[3]) +end +table_ext.add_all(conversion_table, user_defined_colors) +local reversed = table_ext.flip(conversion_table) +for k, v in pairs(reversed) do + reversed[string.upper(k)]=v + reversed[string.lower(k)]=v +end +reversed.FFFFFF=0 +reversed.ffffff=0 + +function irc_to_minetest(irc) + local fg, background + local reversed = false + local rope={} + local i=1 + while i <= irc:len() do + local char = irc:sub(i,i) + if char == irc_color_starter then + local j=i+1 + if is_digit(irc:sub(j,j)) then + fg=irc:byte(j,j)-string.byte("0") + i=j + j=j+1 + if is_digit(irc:sub(j,j)) then + fg=fg*10+(irc:byte(j,j)-string.byte("0")) + i=j + j=j+1 + end + local bg + if irc:sub(j,j) == "," and is_digit(irc:sub(j+1,j+1)) then + local bg=irc:byte(j,j)-string.byte("0") + i=j + j=j+1 + if is_digit(irc:sub(j,j)) then + bg=bg*10+(irc:byte(j,j)-string.byte("0")) + i=j + end + end + if bg then + -- no proper implementation for background escape sequences yet - see the "Escape sequences" part of the Lua API + -- table.insert(rope, minetest.get_background_escape_sequence("#"..conversion_table[bg])) + background = bg + end + if reversed then + table.insert(rope, minetest.get_color_escape_sequence("#"..conversion_table[bg])) + else + table.insert(rope, minetest.get_color_escape_sequence("#"..conversion_table[fg])) + end + else + table.insert(rope, minetest.get_color_escape_sequence("#FFFFFF")) + end + elseif char == irc_disable then + table.insert(rope, minetest.get_color_escape_sequence("#FFFFFF")) + background = nil + elseif char == irc_color_reverse then + reversed = not reversed + if background then + table.insert(rope, minetest.get_color_escape_sequence("#"..conversion_table[background])) + -- no proper implementation for background escape sequences yet - see the "Escape sequences" part of the Lua API + -- table.insert(rope, minetest.get_background_escape_sequence("#"..conversion_table[fg])) + background, fg = fg, background + end + elseif not irc_style_to_md[char] and char ~= irc_monospace then + table.insert(rope, char) + end + i=i+1 + end + return table.concat(rope) +end + +local color_conv = bridges.irc.convert_minetest_colors + +if color_conv == "hex" then -- always use hex, no matter what + function convert_color_to_irc(color) + return nil, irc_hex_color_starter..color + end +elseif color_conv == "hex_safer" then + function convert_color_to_irc(color) + -- prefer simple colors + local rev = reversed[color] + if rev then + return ",", irc_color_starter..((rev < 10 and "0") or "")..tostring(rev) + end + return nil, irc_hex_color_starter..color + end +elseif color_conv == "disabled" then + function convert_color_to_irc(color) + return error("Color conversion to IRC is disabled. Check your config.") + end +else + local color_chooser + if color_conv == "safest" then + local closest_color_basic = closest_color_finder(table_ext.process(user_defined_colors, function(k, color) return hex_to_table(color) end)) + color_chooser = closest_color_basic + else + local closest_color_extended = closest_color_finder(table_ext.process(conversion_table, function(k, color) return hex_to_table(color) end)) + color_chooser = closest_color_extended + end + function convert_color_to_irc(color) + local rev = reversed[color] + if rev and rev <= 15 then + return function(c) return c=="," end, irc_color_starter..((rev < 10 and "0") or "")..tostring(reversed[color]) + end + local closest = reversed[table_to_hex(color_chooser(hex_to_table(color)))] + if not closest then error(table_to_hex(color_chooser(hex_to_table(color)))) end + return function(c) return c=="," end, irc_color_starter..((closest < 10 and "0") or "")..tostring(closest) + end +end + +local old_convert_color_to_irc = convert_color_to_irc +function convert_color_to_irc(color) + if color:lower() == "ffffff" then -- treat white as color reset, by default. TODO think of doing the same for close colors (can we?) + return function(c) return c >= "0" and c <= "9" end, irc_color_starter + end + return old_convert_color_to_irc(color) +end + +function minetest_to_irc(message) + local i=1 + local res={} + while i <= message:len() do + if message:sub(i,i) == minetest_color_starter and message:sub(i+1, i+4) == "(c@#" and message:sub(i+11, i+11) == ")" then + local color = message:sub(i+5, i+10) + for j=1, 6 do + local c = color:sub(j, j):lower() + if not (c >= "0" and c <= "9") and not (c >= "a" and c <= "f") then + goto continue + end + end + local needs_escape, color = convert_color_to_irc(color) + table.insert(res, color) + if needs_escape and needs_escape(message:sub(i+12, i+12)) then + table.insert(res, irc_escape_code) + end + i=i+11 + goto continue_loop + ::continue:: + end + table.insert(res, message:sub(i,i)) + ::continue_loop:: + i=i+1 + end + return table.concat(res) +end \ No newline at end of file diff --git a/trie.lua b/trie.lua new file mode 120000 index 0000000..243a921 --- /dev/null +++ b/trie.lua @@ -0,0 +1 @@ +/home/lars/.minetest/mods/cmdlib/trie.lua \ No newline at end of file diff --git a/unicode.lua b/unicode.lua index cfe949b..462d570 100644 --- a/unicode.lua +++ b/unicode.lua @@ -1,27 +1,30 @@ -unicode_patterns={"\\u","U%+"} +unicode_patterns={"\\u","U+"} function parse_utf8_codepoints(message, pattern) local last_index=0 - local begin,index=string.find(message,pattern) + local begin,index=string.find(message,pattern,0,true) local rope={} while index do local number="" - while index <= index+4 do - index=index+1 - local char=string.upper(string.sub(message, index,index)) - if char:len() == 0 or not string_ext.is_hexadecimal(string.byte(char)) then + local i=index + while i <= i+4 do + i=i+1 + local char=string.upper(string.sub(message,i,i)) + if char == "" or not ((char >= "0" and char <= "9") or (char >= "A" and char <= "F")) then break end number=number..char end number=tonumber(number, 16) - local utf_8_char=string_ext.utf8(number) - if utf_8_char then - table.insert(rope, message:sub(last_index, begin-1)) - table.insert(rope, utf_8_char) - last_index=index + if number then + local utf_8_char=string_ext.utf8(number) + if utf_8_char then + table.insert(rope, message:sub(last_index, begin-1)) + table.insert(rope, utf_8_char) + last_index=i + end end - begin,index=string.find(message,pattern, index) + begin,index=string.find(message,pattern,index,true) end table.insert(rope, message:sub(last_index)) return table.concat(rope, "")

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 C&7gJw diff --git a/minetest-chat-bridge-bot/.gradle/4.10/javaCompile/javaCompile.lock b/minetest-chat-bridge-bot/.gradle/4.10/javaCompile/javaCompile.lock deleted file mode 100644 index 8a5c3f9244d805d02a76ebcdac199312c5739835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZQ>au&&B>fG_40StJ)001g21dRXy diff --git a/minetest-chat-bridge-bot/.gradle/4.10/javaCompile/taskHistory.bin b/minetest-chat-bridge-bot/.gradle/4.10/javaCompile/taskHistory.bin deleted file mode 100644 index a85838dfd3f2414626902fe97b089ae4b0f4fc66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20176 zcmeI%&1)QG90%}itSv+#^&r%!1-->~=Xrmg8ETcJ5v+QU`f{nL&pa>5Y<73no!Jda zED^MYSX7XLA_%?orbrc~y(q1^+YT9R=EH|OxgE4! z(WJ;{^)(`>>&nOu<1)*;=)T!$#3B*lCm2nTm5GXDBc0%a#i_FnGZo7;43-E>9Aiw8 zM5wB)`A1pQ(*14ID_8LH)Sf$T_~jL}e`)v17aI&^@=i3D=W}frncTX_XI+~P=ECC^ zeTGE{i6e@raGJU}#fGt1$4W86Qp=^HmU)MTbXvt8+tsR&F;vz0?*I9oqeoBAUfNZ@ zJ4w%feEYc#=F9tYQPK9ih3a!t_cBBx6;Xk#R?=vZc&UYQjuA|K?32_c#yQ1lqL}kK z*6WqcQDq(MuJ`iB13SK-nz(fS@`1Pa1@m$8Scf=^iv}8IQ(wIbAOqlk9DJA33J)@ESGD0(qP$%A7Zn7dl=%>811=|Bs7+{VJ5LKiDMkw zB+*KU1S?0aT`Q}bj@7v)KHqoj$AsK=3$ZrnC`H-=+YuL3$ARMcILVzqSaari|$p%w}voIgkV)8IwC?}dO}vK!t92sI@|8vGq+wi)qCqpJ@e+y z4?gXj{dd{2Jp74pA`uCVhjc1 diff --git a/minetest-chat-bridge-bot/.gradle/4.10/taskHistory/taskHistory.bin b/minetest-chat-bridge-bot/.gradle/4.10/taskHistory/taskHistory.bin deleted file mode 100644 index 20366be5fb3f2bda6183723f50e5b54ff959ebed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39242 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 N%^oHNIz@+1{4dMsfOh}@ diff --git a/minetest-chat-bridge-bot/.gradle/4.10/taskHistory/taskHistory.lock b/minetest-chat-bridge-bot/.gradle/4.10/taskHistory/taskHistory.lock deleted file mode 100644 index 932977a1f6c1686566deb452eda72d111e78a567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZS9kbm6DYx4C!0|f8`04*>B_W%F@ diff --git a/minetest-chat-bridge-bot/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/minetest-chat-bridge-bot/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index f6edcf0de464588d1f014d7381e5fafb04cda777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZSX`6}Y&dnMe40Rm(IE{_AV diff --git a/minetest-chat-bridge-bot/.gradle/buildOutputCleanup/cache.properties b/minetest-chat-bridge-bot/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 5e6dd2c..0000000 --- a/minetest-chat-bridge-bot/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Fri Dec 14 15:02:12 CET 2018 -gradle.version=4.10 diff --git a/minetest-chat-bridge-bot/.gradle/buildOutputCleanup/outputFiles.bin b/minetest-chat-bridge-bot/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index 3c2db962f4379de6f46cc4b5c7a534d818267179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18821 zcmeI%L1n^ANT!b_ndU!yt@yaF@}=PK)-;-;WXA#voYV2k-gk>;L_I|BuJ#Hw@?T z-*OmxNAKQ{5dsJxfB*srAbOq(GAD&e0(sn5% z^B1)@9(AU(pHfBXKJ7oxo|yac?dnNcr%Ssv;~#Q88K0N=Rqf7GQ;uA2bWHkp?XIuC zeD&2gFJ+yC_C8ys|KZ!q^6n!L)9wuwbLXxsypVPB+5<~xuCEVRK1xq&58nw?>It_^ z)}PRRyMDK9ADo$$eqQ^7tx~nH`P?q+yw@I|jz@N0rR8~oQSFJx&u-ZwBYByBQ+q0( z9X@^EEzcA5YS&N0u*iSbx|1sc2q1s}0tg_000IagfB*srAb - - - - - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.idea/encodings.xml b/minetest-chat-bridge-bot/.idea/encodings.xml deleted file mode 100644 index 15a15b2..0000000 --- a/minetest-chat-bridge-bot/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.idea/gradle.xml b/minetest-chat-bridge-bot/.idea/gradle.xml deleted file mode 100644 index 3163861..0000000 --- a/minetest-chat-bridge-bot/.idea/gradle.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.idea/misc.xml b/minetest-chat-bridge-bot/.idea/misc.xml deleted file mode 100644 index 402f058..0000000 --- a/minetest-chat-bridge-bot/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.idea/modules.xml b/minetest-chat-bridge-bot/.idea/modules.xml deleted file mode 100644 index 3a53a06..0000000 --- a/minetest-chat-bridge-bot/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.idea/uiDesigner.xml b/minetest-chat-bridge-bot/.idea/uiDesigner.xml deleted file mode 100644 index e96534f..0000000 --- a/minetest-chat-bridge-bot/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.idea/vcs.xml b/minetest-chat-bridge-bot/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/minetest-chat-bridge-bot/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-bot/.idea/workspace.xml b/minetest-chat-bridge-bot/.idea/workspace.xml deleted file mode 100644 index 07e4dd1..0000000 --- a/minetest-chat-bridge-bot/.idea/workspace.xml +++ /dev/null @@ -1,675 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1560165492351 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/minetest-chat-bridge-irc-bot/minetest-chat-bridge-irc-bot.iml b/minetest-chat-bridge-irc-bot/minetest-chat-bridge-irc-bot.iml deleted file mode 100644 index d5c0743..0000000 --- a/minetest-chat-bridge-irc-bot/minetest-chat-bridge-irc-bot.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$1.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$1.class deleted file mode 100644 index 4e3ba358906496c7d1630b08c0e6128bd41c8af4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2893 zcmb7GTW}Lq82(Ok*<7}5XbB|+p-3ogxdc!uwg|KZY)e|ODR)pd$&xPJ?uOk>xu}SW z_bXmOQ5;@yh8OHe6r5pvV8$7ref7x)pPX@YPzQ(B|7^B4ZGtm)n*aQJ{>%9<-+y+$ zAHQ)Ez(e@Nk9zcQ(#y%V0Old?M<4nF*of^xY{Cvd9>W0V5&{N&*cm_oyExg+$sSJj zaU`T+%AdX6ER8vyJnlvIa)WnZS zqf$(jv`j2v8H$!^XYg{JY?5J4JZUKDj2zox=qcGWJMAaZsOB1}AxYC@wcyCRUeOe5 z1H*=<-cq0C{gmo8?_zLw>1m3rI<9DPe{Lix8-r3(wPV#&lDbPW6#ndNx~(C_q_lb{ z6r)R(OjD-EP+ZDpGdUv{>ys2Mx|%|EOGaiD1M6j|q`=cEcP<-BieYn8TrpCyo`J4T z-D;0(h5eW#Z!d(IvlKNJS4^wD+1Bp1eWV9uGplQ+OeZj^80(~yczGE-DP7eK+Uj8l z+PrBOn1an3@?qt;oGvK3lDb8k#W66rC<=yICBaa4vXUW<*h$*Gn+l9KY+8vze}J67e?9ig<^I@h(m> zR82=LLt_D@hB*nuL1jeNbJir{3IHU4)$T8CCPQEf(p0+{n5N^VV~6lpd_IAAgep&f zYAWO0p33 z9`B5yBH@mXM1moFkCAg_WE!1tQ%`eI3AQJX$SI4^>@l;dLh_|eMN;RMYc7))%@*Bh zMhBU=$z>Pe&&(w!r*_6Ejvum-kLDzm<}qA+j1xrjK7!|vWDXTBHJ_yy?098+rbRvF zPnETdH59;mc%MqPiZRrUNW*fMuB9Yvw_=em&9o%VqB9$d&vaZA*WzEV!Tr74dk(UO z#jJrG_Lea#tx@StS=Y16y(Fmm#|*`y#!f5CWQYVEPv^jvj%`%Gfh~hO2l@qkz-Qw; zLv(7u6m3)=mYp|Kp#WQ@l%*Rd1bj@Uaa|wI(G75}I3LHTFn)BArhaoga6m)5$L71zL8BJOLbXo+~P!PTbWaPM_5pIY8s~m%8c^=-CS8P=RRv`qw&Ug5`E3QMJslNna z48E%?yw~Bcz_$q01oIHv+!6Q9R*$RI8}^1hmoOG_hrMgsgox1QiwLefDnq9(BIdA- z7ZG*XO&1Yy*ku<{<*-XWLogz^^Qau$_FJVq3a06kWEf5a651nldUY_`g992YokpQi(8&o0WQFq46 zE>HB0VeZv2MCj+cN(sBc%h``wqQ4UV8&=|Xtif&U#UD6`KWV7{!Uf#H=lB~}a2MZT z9JermAE;(O()u&2AjxgUn45W+m-(5`Zp#7q@f{klf;fH<0Rz6hxiER5W(a0SVdl*pzsdaH2Du&Q{#;Q diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$2.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$2.class deleted file mode 100644 index 6aca64a806c6363b8a9c14b9a2c6c1fb4d8ceac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1676 zcmaJ?-EJF26#gc5?2YR-?lx(mg)&el&JV6hDJ>+Wl)7}cr&rLS?^do zvmv?UEx6+qpaLO9f(PKC5NFm#O^JmipE>)@nRCALv$KEweex%OyV#w5L!!mEHuS%*o&jM(h`1HyhU-d@<@8IAwTOA0)IDw z%LI(rg}!${i->v@=h8%*TwBGFCu_cCJ!2W%w1uFYHbXB^nhMd9rmyz0_&ksM_=3UN zmfF;nHhEmaTpsgyKw12^d=$4XgCUt$)nFjPJ)Oswm?O)FN*Qe;F&sJ8vl%>eP|f2J zHXYO)Y%!c~gk%zX##f=vF+45vM-50!2_ zPkyC5>X>uTpd?!=k`BINxbS8h8RnAMlz62P?yGSXsQsty$iaYW&Tx5YLVN6prIxJB zHFl~mp6qPa8qah18cl}9GH0TzVneLABn^}Zi15DRBhZc-?<&J^Wgre@RfV1~-}UdG!csvhHLrkaFGj&MTbnRDOh`?*jNnLXs1tYCVbaMO!R@&TJ&h1G9$(et7YDz zSHw^Yxz`uw-^z?DUScIKG#^HC-#=owT5e03lzz)M^|;G-q}UrszRp<|EjuSq7>ch4 z&JPdOfgHcKqfBeUGb%dHVux5Xl{$!N5`R3M@A%MY2J1ARfz-v3<;K|>oI>6>xO+U5 z6UX*dkEs`0s0n6iU((_hF4p;FGtv}#hTpxS*iLTNVVWM#E z52QLNH{I@}-RX8``V}%K$O7$7CQ%)$W)pSBs*am$cM2Kz9LcPkC+WPx`4e2Qn}r#7 zmSk?_SFjTl2>O|VOyM=L*@PG$1s@Y58hDS=v}6S(|300V#s|sC8z|D6rq944N(r)n mYqZ+W#6?=|ZyVp>G5NhoI;WEr^7K(6Zzb~MM1Gpc^?v}>a;l>M diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$3.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$3.class deleted file mode 100644 index 6870a1ae97bf23862cc5edd35857fce6fb694f41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1254 zcmaJ>?M@Rx6g@*fwv-CBe2FLyTA(dLRq%@%4K^Yq1rtgzjX%tEJG4u;JI(Gak)OVW zkD-aighU^}hce!6n^0}zCc86p@44sRduC>T{l54K;4!vFVPGMS7;YKhF)YS#J4K#l z11knH3=?O~cWs7L=~SGFye*u1zN}r#sTUZc&n(B%&l#pOgYN7xL%67F zlITj7BM zq&Fz9AwNjd*Tl0mB=Nf;wG6RQb&h2=X%KFm@=OlJ#LLQeO}S$QRgVT0tOr6+Pp=%) zRvrnlFLguJ3}h3?VU;0vAU(aSJe|NO;t7o5E_Ly*d<>E8s`53%i*0@)h4x*!=2~Wh z?;RF-RcUT2(!tb}f$x)knpnA39kqw}^L z0`J%CO*Objh5lxG6h&d%WlPI~fu{^h0}TzUjbY*cIB>e%F}ltynG8-K%|_@QLjnv} zXtqh~z!J}`egn&W$HOjCj&%{*o>OA!%V>qO4sI*nnn-@wg| dWgb^)OcBPQF?crVU-l4lxI^<8v83r;`UAj6Lj?c; diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$4.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$4.class deleted file mode 100644 index f407c4f236dca79311ff162e96f2f11b9bda7e9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1857 zcmah~ZF3V<6n<`->?X@vX=u@k*r1fAP?}N@B(0T_1e%f;?IzWLQn$%Xx@BL=zEtwj zug*B*fAAw;Fds1E4E_Lrl;gRZv<*^*%F+{RXlQX4tsr#xjG#VY=cS<_I<;moFt1|j@w~SG$(Ky{GK5yj*ILUL?pr^Z#PWGqhw3m-*uWY>M9=M z5ksuZJ%8Qtd=(e)sf_Pc{D8+Qwz0@?y|$lhIc{>MnQZDEZ(cCF6r#^rhE0%oN!@OW z4NAMA>Xyy46EQH72j6%9d};4)e&+SpZL2+f`#PXsYxG0bNJ*X6cvc9Js- zORc2E+xkw&=SfHKqSU1B@}yxW1CLzUDje*~c&fsMr@|Nc2Y4*wKm_?oczyO-TK&Ee zaGJ0C0i`U}4xua!pd5RB1{fw9j%87)Ub}ZU9<>vhO?;?+9>982pg^A z`JAd9Z}h9JQZGw}X^M%YVWtKvT6Jx+n$K;oRT<8Qs0O}arU~bPON;yXcGI=}TE_wJYweb#Pk<{36cZ-hQCI<()8SqMrW;eAl zH#FK}o8m>+E457#s8lG|s(Ha31(#^LES+NCe#f=y57P3m`@!Wq#5AlpyyP_da=v_@ zYFt0MYeTz~()e)=n}OZGL`s|cN5W)kIMP5(hNpbT*UiHjQCcqNhr&>2b50PxIg_c} zu$#V`ygV2bJDk)IZYR7dZ!e$T;%WNCZ-hR&!=O$Qm!_4`8om4{*dO8cMWT{WvJ_^B zSNjKW2`Q3(#vCq_hK$)P;*d%AyoZr4M)}=DM1F;6eY6YdLKpH&#CnKp^+*@WK%T&< zr=c#|#d}A(vA#~~;`IM?J&b3fiA09B&P+*>(0dOPFEJU?v;3C{eBg+$hbgUxk1|s1 z70%U16CYFD#CfeAor-F8De;L`m!~A{1*JOzQQ{>^9_$KYY#y`hDwf#-DlCnMByY1t zG}tx#%9cV1RtXR)a{z(hu3$cdQn59)AU(>YG?>{ah$Grdm diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$5.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main$5.class deleted file mode 100644 index c242b7c8726fe4aafbc59170066569ee5154b999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmZuuU2oGc6g_U!rVUw_jl#^MEhiw0t9!jNR~8WT>4UFti@UiA-hjn4#VuoG=*s*;FvB`!W^OIuYua zPZFwZ`dQ4A6RxDjtKwQz@c1>!udo$mrHaK!YDPQYGQGFpXPorBG)}Tyrn5j4^K5Ej zhYk-#UOdb4!o)2bx3O!Z4aN%o|Ky0?GH}hK>KUn3F1gnrg$^k+E1mCH pr@Thfp=rZ-VNyq+7Z}*6_BL^mqCqOarK-}!4T=^im=xi(egf>~i4p(+ diff --git a/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main.class b/minetest-chat-bridge-irc-bot/out/production/minetest-chat-bridge-irc-bot/appguru/Main.class deleted file mode 100644 index 88413b99cbe4a7d1c90a8ac729c2ffd984708223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11770 zcmdT~d3;pW^*`s$Ox~N9mxX}~Tl0YoTIa@vtd#$yQOcM zoXeKZc^)G6m{h>yWn_Y^DUxEM$&+}p&R&xy@)Qp-PdE4i>CEtu#?y74Y49wQrZMY0 z+oT!vnsnxPa55<8nbgbkg^gl^7sy^EI+vPM%w;++G zUM;h0bY5%HDrPyM#^7~2UuDu-W`k>Wt~2Q>Xpid+ZV)CLg_-rTuF2qLVYkKL4IXH% zRXSH2yhZ10Oxi5cZsx59zeNOTlVY2PEMcPEq&87Xhe-kMG&m@e+dY)W-MRF04oP>1 zw024nHn_(_`P?o0M?JWRZVweocOu7hjyskO4GoDh6Ec$Y&^Vs%ArJ47?p}kh)A@f) z+C#79(o6hSDX#a>c-drvUEFB!O$P7tP?6lr%?7{2gO%^}&?MPtvJ_t4BPxHl&hN>k z{rp}j-shnywtjE-&{Uo-WAFFihCx4FcD_JnP5y97<>PM^)qTX^0|pxqd06K= zbv~l=T})O@Bod5Og#+<;Fb-pFZduXPQoX8eMGF(JWAdz7(X?{Kn(DTyhT7Wds+O9D zdQjCgRkbxXRj;nu42s$vfn9;}a3IoE-kgYqB3(n>u?? zGfgbsa=r+1iX$BDl4VLh@Vhz`4q_RH@Kb~3fmj!|9iL@2r0I=CcLX~UZOK@e$%uDH zciZI7-e@erq(_2@-O<=ioDz=~frBWE!vbuxe-nNctPfsAyDRil3yu2o|Jz8atgDx-7j@?EG^W%v?A{ieU$ZJjn zI(F6tdX@TgI)e+Z-qR86O@yKm2%HxV^t5*d=7{#@RN_L5v#U=Z=7k~E$hFrr4DTjv zhjE8EJdy}TAfu}{5KG_?rword>k_7o#o5Krv=*D2WFi#CMfWZ_pScWz+E6^PMBR0J z6sJ2A0lCtG3<}u-_7{&PV;x{92mA$kKvS4Oqjtfah9aH8Jq_EjkKCrtM|D0nMux>> z`WKJsS1?_dMW3%D^?9E6AM1f(V!RUf&=CzsV`7X_$CY1?Vf7+VcHpN9R6X&okvq)m z!BvW_q*fW}{%FlM2gS1sI+C#%=-X06*sL=c4)wIfdjq2I@d!<#aQm8Wb>e5DO`-zrsIj*<9XV!aTr$|b z!tQ2x1z`T~MM|+@ep?Jxp`E z6N%oqzr4IFl;}>jF9NUSsh|~1mIpd_wMmeK(`1GuS^Jp9$N7ZCCsEMHsE_I5>ZT^Y zuQuA{+m4fcozY-CGC$!9?t#VoqA_1bK)UTg-|ko_0pIf_qKhp4C_M(1r+3c?&`gul zqasN|GSQn%#crI>ACsa_=Z{9H(@%+-1wprN*Y3jdjgy3i%t*);BGFjK5{^xA}3bTGvohkHPQA;CIoluc^8U z{qLc~*vT#Flb<>C%BFS*rrwaeDYN|vvc5*TpY~*Jq z-#Hfvn@?aj{>j*>3X6X#d^;tdjh#febgBF`c4D!_XqCv2YQ|g_ToHl5;wSlM79FKy z7C$AEdIGnP8zdE7;X~;QYz$MKo!3%6p#BA{~BBI(@efG)LnsCd!Q@m zL+}g(1V|t)>Iua=%GcNvRq1hye