refactor IRC which is VERY broken
currently theres ConcurrentModificationException at IRCPlugin line 190 (for loop). i guess we could fix this by cloning it?
This commit is contained in:
parent
40327e0818
commit
5ac244e3d2
10 changed files with 165 additions and 293 deletions
|
@ -56,5 +56,10 @@
|
||||||
<option name="name" value="maven" />
|
<option name="name" value="maven" />
|
||||||
<option name="url" value="https://repo.opencollab.dev/main/" />
|
<option name="url" value="https://repo.opencollab.dev/main/" />
|
||||||
</remote-repository>
|
</remote-repository>
|
||||||
|
<remote-repository>
|
||||||
|
<option name="id" value="maven" />
|
||||||
|
<option name="name" value="maven" />
|
||||||
|
<option name="url" value="https://jitpack.io" />
|
||||||
|
</remote-repository>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
|
@ -19,6 +19,10 @@ repositories {
|
||||||
|
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|
||||||
|
maven {
|
||||||
|
url = uri('https://jitpack.io')
|
||||||
|
}
|
||||||
|
|
||||||
maven {
|
maven {
|
||||||
url = uri('https://repo.opencollab.dev/main/')
|
url = uri('https://repo.opencollab.dev/main/')
|
||||||
}
|
}
|
||||||
|
@ -46,6 +50,8 @@ dependencies {
|
||||||
implementation 'com.google.code.gson:gson:2.10.1'
|
implementation 'com.google.code.gson:gson:2.10.1'
|
||||||
implementation 'com.google.guava:guava:31.1-jre'
|
implementation 'com.google.guava:guava:31.1-jre'
|
||||||
implementation 'org.jline:jline:3.23.0'
|
implementation 'org.jline:jline:3.23.0'
|
||||||
|
implementation 'ch.qos.logback:logback-classic:1.5.11'
|
||||||
|
implementation 'com.github.pircbotx:pircbotx:2.3.1'
|
||||||
implementation 'com.github.ricksbrown:cowsay:1.1.0'
|
implementation 'com.github.ricksbrown:cowsay:1.1.0'
|
||||||
implementation 'org.yaml:snakeyaml:2.0'
|
implementation 'org.yaml:snakeyaml:2.0'
|
||||||
implementation 'org.luaj:luaj-jse:3.0.1'
|
implementation 'org.luaj:luaj-jse:3.0.1'
|
||||||
|
|
|
@ -97,7 +97,7 @@ public class Configuration {
|
||||||
public EmbedColors embedColors = new EmbedColors();
|
public EmbedColors embedColors = new EmbedColors();
|
||||||
public String trustedRoleName = "Trusted";
|
public String trustedRoleName = "Trusted";
|
||||||
public String adminRoleName = "Admin";
|
public String adminRoleName = "Admin";
|
||||||
public String statusMessage = "Gay Sex";
|
public String statusMessage = "Oh hi!";
|
||||||
public String inviteLink = "https://discord.gg/xdgCkUyaA4";
|
public String inviteLink = "https://discord.gg/xdgCkUyaA4";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,11 +106,8 @@ public class Configuration {
|
||||||
public String prefix = "!";
|
public String prefix = "!";
|
||||||
public String host;
|
public String host;
|
||||||
public int port;
|
public int port;
|
||||||
public String nickname = "chomens-bot";
|
public String name = "chomens-bot";
|
||||||
public String username = "chomens-bot";
|
public String password = "";
|
||||||
public String realName = "chomens-bot";
|
|
||||||
public String hostName = "null";
|
|
||||||
public String serverName = "null";
|
|
||||||
public Map<String, String> servers = new HashMap<>();
|
public Map<String, String> servers = new HashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,128 +0,0 @@
|
||||||
package me.chayapak1.chomens_bot.irc;
|
|
||||||
|
|
||||||
import me.chayapak1.chomens_bot.data.IRCMessage;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
// https://gist.github.com/kaecy/286f8ad334aec3fcb588516feb727772#file-ircmessageloop-java
|
|
||||||
public abstract class IRCMessageLoop implements Runnable {
|
|
||||||
private Socket socket;
|
|
||||||
private OutputStream out;
|
|
||||||
|
|
||||||
public List<String> channelList;
|
|
||||||
|
|
||||||
protected boolean initialSetupStatus = false;
|
|
||||||
|
|
||||||
public IRCMessageLoop (String host, int port) {
|
|
||||||
channelList = new ArrayList<>();
|
|
||||||
try {
|
|
||||||
socket = new Socket(host, port);
|
|
||||||
out = socket.getOutputStream();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void send(String text) {
|
|
||||||
byte[] bytes = (text + "\r\n").getBytes();
|
|
||||||
|
|
||||||
try {
|
|
||||||
out.write(bytes);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void nick(String nickname) {
|
|
||||||
final String msg = "NICK " + nickname;
|
|
||||||
send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void user(String username, String hostname, String serverName, String realName) {
|
|
||||||
final String msg = "USER " + username + " " + hostname + " " + serverName + " :" + realName;
|
|
||||||
send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void join(String channel) {
|
|
||||||
if (!initialSetupStatus) {
|
|
||||||
channelList.add(channel);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
final String msg = "JOIN " + channel;
|
|
||||||
send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void part(String channel) {
|
|
||||||
final String msg = "PART " + channel;
|
|
||||||
send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void channelMessage (String channel, String message) {
|
|
||||||
final String msg = "PRIVMSG " + channel + " :" + message;
|
|
||||||
send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void pong (String server) {
|
|
||||||
final String msg = "PONG " + server;
|
|
||||||
send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void quit (String reason) {
|
|
||||||
final String msg = "QUIT :Quit: " + reason;
|
|
||||||
send(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void onMessage (IRCMessage message);
|
|
||||||
|
|
||||||
private void initialSetup() {
|
|
||||||
initialSetupStatus = true;
|
|
||||||
|
|
||||||
// now join the channels. you need to wait for message 001 before you join a channel.
|
|
||||||
for (String channel: channelList) {
|
|
||||||
join(channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void processMessage(String ircMessage) {
|
|
||||||
final IRCMessage message = MessageParser.message(ircMessage);
|
|
||||||
|
|
||||||
switch (message.command) {
|
|
||||||
case "privmsg" -> onMessage(message);
|
|
||||||
case "001" -> initialSetup();
|
|
||||||
case "ping" -> pong(message.content);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
final InputStream stream;
|
|
||||||
|
|
||||||
try {
|
|
||||||
stream = socket.getInputStream();
|
|
||||||
final MessageBuffer messageBuffer = new MessageBuffer();
|
|
||||||
final byte[] buffer = new byte[512];
|
|
||||||
|
|
||||||
int count;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
count = stream.read(buffer);
|
|
||||||
if (count == -1) break;
|
|
||||||
messageBuffer.append(Arrays.copyOfRange(buffer, 0, count));
|
|
||||||
while (messageBuffer.hasCompleteMessage()) {
|
|
||||||
String ircMessage = messageBuffer.getNextMessage();
|
|
||||||
|
|
||||||
processMessage(ircMessage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
quit("Internal Error: " + e);
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
package me.chayapak1.chomens_bot.irc;
|
|
||||||
|
|
||||||
public class MessageBuffer {
|
|
||||||
private String buffer;
|
|
||||||
|
|
||||||
public MessageBuffer() {
|
|
||||||
buffer = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public void append (byte[] bytes) {
|
|
||||||
buffer += new String(bytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasCompleteMessage() {
|
|
||||||
return buffer.contains("\r\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNextMessage() {
|
|
||||||
int index = buffer.indexOf("\r\n");
|
|
||||||
String message = "";
|
|
||||||
|
|
||||||
if (index > -1) {
|
|
||||||
message = buffer.substring(0, index);
|
|
||||||
buffer = buffer.substring(index + 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
package me.chayapak1.chomens_bot.irc;
|
|
||||||
|
|
||||||
import me.chayapak1.chomens_bot.data.IRCMessage;
|
|
||||||
|
|
||||||
// https://gist.github.com/kaecy/286f8ad334aec3fcb588516feb727772#file-messageparser-java
|
|
||||||
public class MessageParser {
|
|
||||||
public static IRCMessage message (String ircMessage) {
|
|
||||||
final IRCMessage message = new IRCMessage();
|
|
||||||
|
|
||||||
int spIndex;
|
|
||||||
|
|
||||||
if (ircMessage.startsWith(":")) {
|
|
||||||
spIndex = ircMessage.indexOf(' ');
|
|
||||||
if (spIndex > -1) {
|
|
||||||
message.origin = ircMessage.substring(1, spIndex);
|
|
||||||
ircMessage = ircMessage.substring(spIndex + 1);
|
|
||||||
|
|
||||||
int uIndex = message.origin.indexOf('!');
|
|
||||||
if (uIndex > -1) {
|
|
||||||
message.nickName = message.origin.substring(0, uIndex);
|
|
||||||
|
|
||||||
message.origin = message.origin.substring(uIndex + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
spIndex = ircMessage.indexOf(' ');
|
|
||||||
if (spIndex == -1) {
|
|
||||||
message.command = "null";
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
|
|
||||||
message.command = ircMessage.substring(0, spIndex).toLowerCase();
|
|
||||||
ircMessage = ircMessage.substring(spIndex + 1);
|
|
||||||
|
|
||||||
// parse privmsg params
|
|
||||||
if (message.command.equals("privmsg")) {
|
|
||||||
spIndex = ircMessage.indexOf(' ');
|
|
||||||
message.channel = ircMessage.substring(0, spIndex);
|
|
||||||
ircMessage = ircMessage.substring(spIndex + 1);
|
|
||||||
|
|
||||||
if (ircMessage.startsWith(":")) {
|
|
||||||
message.content = ircMessage.substring(1);
|
|
||||||
} else {
|
|
||||||
message.content = ircMessage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse quit/join
|
|
||||||
if (message.command.equals("quit") || message.command.equals("join")) {
|
|
||||||
if (ircMessage.startsWith(":")) {
|
|
||||||
message.content = ircMessage.substring(1);
|
|
||||||
} else {
|
|
||||||
message.content = ircMessage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse ping params
|
|
||||||
if (message.command.equals("ping")) {
|
|
||||||
spIndex = ircMessage.indexOf(' ');
|
|
||||||
if (spIndex > -1) {
|
|
||||||
message.content = ircMessage.substring(0, spIndex);
|
|
||||||
} else {
|
|
||||||
message.content = ircMessage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return message;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,41 +4,60 @@ import me.chayapak1.chomens_bot.Bot;
|
||||||
import me.chayapak1.chomens_bot.Configuration;
|
import me.chayapak1.chomens_bot.Configuration;
|
||||||
import me.chayapak1.chomens_bot.Main;
|
import me.chayapak1.chomens_bot.Main;
|
||||||
import me.chayapak1.chomens_bot.command.IRCCommandContext;
|
import me.chayapak1.chomens_bot.command.IRCCommandContext;
|
||||||
import me.chayapak1.chomens_bot.data.IRCMessage;
|
import me.chayapak1.chomens_bot.util.ColorUtilities;
|
||||||
import me.chayapak1.chomens_bot.data.chat.PlayerMessage;
|
|
||||||
import me.chayapak1.chomens_bot.irc.IRCMessageLoop;
|
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.event.HoverEvent;
|
import net.kyori.adventure.text.event.HoverEvent;
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import org.geysermc.mcprotocollib.network.event.session.ConnectedEvent;
|
import org.geysermc.mcprotocollib.network.event.session.ConnectedEvent;
|
||||||
|
import org.pircbotx.PircBotX;
|
||||||
|
import org.pircbotx.User;
|
||||||
|
import org.pircbotx.cap.SASLCapHandler;
|
||||||
|
import org.pircbotx.hooks.ListenerAdapter;
|
||||||
|
import org.pircbotx.hooks.events.MessageEvent;
|
||||||
|
|
||||||
|
import javax.net.ssl.SSLSocketFactory;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class IRCPlugin extends IRCMessageLoop {
|
public class IRCPlugin extends ListenerAdapter {
|
||||||
private final Configuration.IRC ircConfig;
|
private final Configuration.IRC ircConfig;
|
||||||
|
|
||||||
private final Map<String, String> servers;
|
private final Map<String, String> servers;
|
||||||
|
|
||||||
private final Map<String, List<String>> messageQueue = new HashMap<>();
|
public final Map<String, List<String>> messageQueue = new HashMap<>();
|
||||||
|
|
||||||
// private String lastMessage = "";
|
private PircBotX bot;
|
||||||
|
|
||||||
public IRCPlugin (Configuration config) {
|
public IRCPlugin (Configuration config) {
|
||||||
super(config.irc.host, config.irc.port);
|
|
||||||
|
|
||||||
this.ircConfig = config.irc;
|
this.ircConfig = config.irc;
|
||||||
|
|
||||||
this.servers = ircConfig.servers;
|
this.servers = ircConfig.servers;
|
||||||
|
|
||||||
if (!ircConfig.enabled) return;
|
if (!ircConfig.enabled) return;
|
||||||
|
|
||||||
nick(ircConfig.nickname);
|
final org.pircbotx.Configuration.Builder builder = new org.pircbotx.Configuration.Builder()
|
||||||
user(ircConfig.username, ircConfig.hostName, ircConfig.serverName, ircConfig.realName);
|
.setName(ircConfig.name)
|
||||||
|
.setLogin("bot@chomens-bot")
|
||||||
|
.addServer(ircConfig.host, ircConfig.port)
|
||||||
|
.setSocketFactory(SSLSocketFactory.getDefault())
|
||||||
|
.setAutoReconnect(true)
|
||||||
|
.addListener(this);
|
||||||
|
|
||||||
for (Map.Entry<String, String> entry : ircConfig.servers.entrySet()) join(entry.getValue());
|
if (!ircConfig.password.isEmpty()) builder.addCapHandler(new SASLCapHandler(ircConfig.name, ircConfig.password, true));
|
||||||
|
|
||||||
Main.executorService.submit(this);
|
for (Map.Entry<String, String> entry : ircConfig.servers.entrySet()) builder.addAutoJoinChannel(entry.getValue());
|
||||||
|
|
||||||
|
final org.pircbotx.Configuration configuration = builder.buildConfiguration();
|
||||||
|
|
||||||
|
bot = new PircBotX(configuration);
|
||||||
|
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
bot.startBot();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
for (Bot bot : Main.bots) {
|
for (Bot bot : Main.bots) {
|
||||||
bot.addListener(new Bot.Listener() {
|
bot.addListener(new Bot.Listener() {
|
||||||
|
@ -51,8 +70,8 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
public void loadedPlugins() {
|
public void loadedPlugins() {
|
||||||
bot.chat.addListener(new ChatPlugin.Listener() {
|
bot.chat.addListener(new ChatPlugin.Listener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean playerMessageReceived(PlayerMessage message) {
|
public boolean systemMessageReceived(Component component, String string, String ansi) {
|
||||||
IRCPlugin.this.playerMessageReceived(bot, message);
|
IRCPlugin.this.systemMessageReceived(bot, ansi);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -67,18 +86,19 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onMessage (IRCMessage message) {
|
public void onMessage(MessageEvent event) {
|
||||||
Bot serverBot = null;
|
Bot serverBot = null;
|
||||||
|
|
||||||
String channel = null;
|
String targetChannel = null;
|
||||||
|
|
||||||
for (Map.Entry<String, String> entry : servers.entrySet()) {
|
for (Map.Entry<String, String> entry : servers.entrySet()) {
|
||||||
if (entry.getValue().equals(message.channel)) {
|
if (entry.getValue().equals(event.getChannel().getName())) {
|
||||||
serverBot = Main.bots.stream()
|
serverBot = Main.bots.stream()
|
||||||
.filter(eachBot -> entry.getKey().equals(eachBot.host + ":" + eachBot.port))
|
.filter(eachBot -> entry.getKey().equals(eachBot.host + ":" + eachBot.port))
|
||||||
.toArray(Bot[]::new)[0];
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
|
||||||
channel = entry.getValue();
|
targetChannel = entry.getValue();
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -88,10 +108,17 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
|
|
||||||
final String commandPrefix = ircConfig.prefix;
|
final String commandPrefix = ircConfig.prefix;
|
||||||
|
|
||||||
if (message.content.startsWith(commandPrefix)) {
|
final User user = event.getUser();
|
||||||
final String noPrefix = message.content.substring(commandPrefix.length());
|
|
||||||
|
|
||||||
final IRCCommandContext context = new IRCCommandContext(serverBot, commandPrefix, message.nickName);
|
if (user == null) return;
|
||||||
|
|
||||||
|
final String name = user.getRealName();
|
||||||
|
final String message = event.getMessage();
|
||||||
|
|
||||||
|
if (message.startsWith(commandPrefix)) {
|
||||||
|
final String noPrefix = message.substring(commandPrefix.length());
|
||||||
|
|
||||||
|
final IRCCommandContext context = new IRCCommandContext(serverBot, commandPrefix, name);
|
||||||
|
|
||||||
final Component output = serverBot.commandHandler.executeCommand(noPrefix, context, null);
|
final Component output = serverBot.commandHandler.executeCommand(noPrefix, context, null);
|
||||||
|
|
||||||
|
@ -101,7 +128,7 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
}
|
}
|
||||||
|
|
||||||
final Component prefix = Component
|
final Component prefix = Component
|
||||||
.text(channel)
|
.text(targetChannel)
|
||||||
.hoverEvent(
|
.hoverEvent(
|
||||||
HoverEvent.showText(
|
HoverEvent.showText(
|
||||||
Component
|
Component
|
||||||
|
@ -116,12 +143,12 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
.color(NamedTextColor.BLUE);
|
.color(NamedTextColor.BLUE);
|
||||||
|
|
||||||
final Component username = Component
|
final Component username = Component
|
||||||
.text(message.nickName)
|
.text(name)
|
||||||
.hoverEvent(HoverEvent.showText(Component.text(message.origin).color(NamedTextColor.RED)))
|
.hoverEvent(HoverEvent.showText(Component.text(event.getUser().getHostname()).color(NamedTextColor.RED)))
|
||||||
.color(NamedTextColor.RED);
|
.color(NamedTextColor.RED);
|
||||||
|
|
||||||
final Component messageComponent = Component
|
final Component messageComponent = Component
|
||||||
.text(message.content)
|
.text(message)
|
||||||
.color(NamedTextColor.GRAY);
|
.color(NamedTextColor.GRAY);
|
||||||
|
|
||||||
final Component component = Component.translatable(
|
final Component component = Component.translatable(
|
||||||
|
@ -134,31 +161,17 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
serverBot.chat.tellraw(component);
|
serverBot.chat.tellraw(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void playerMessageReceived (Bot bot, PlayerMessage message) {
|
private void systemMessageReceived (Bot bot, String ansi) {
|
||||||
// best fix in 2023
|
sendMessage(
|
||||||
|
|
||||||
/*
|
|
||||||
final String stringifiedName = ComponentUtilities.stringify(message.displayName);
|
|
||||||
final String stringifiedContents = ComponentUtilities.stringify(message.contents);
|
|
||||||
|
|
||||||
final String toSend = String.format(
|
|
||||||
"<%s> %s",
|
|
||||||
stringifiedName,
|
|
||||||
stringifiedContents
|
|
||||||
);
|
|
||||||
|
|
||||||
if (lastMessage.equals(toSend)) return;
|
|
||||||
|
|
||||||
lastMessage = toSend;
|
|
||||||
|
|
||||||
addMessageToQueue(
|
|
||||||
bot,
|
bot,
|
||||||
toSend
|
ansi
|
||||||
);
|
);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// i only have listened to connected because the ratelimit
|
public void quit (String reason) {
|
||||||
|
bot.sendIRC().quitServer(reason);
|
||||||
|
}
|
||||||
|
|
||||||
private void connected (Bot bot) {
|
private void connected (Bot bot) {
|
||||||
sendMessage(
|
sendMessage(
|
||||||
bot,
|
bot,
|
||||||
|
@ -171,8 +184,9 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void queueTick () {
|
private void queueTick () {
|
||||||
if (!initialSetupStatus || messageQueue.isEmpty()) return;
|
if (!bot.isConnected() || messageQueue.isEmpty()) return;
|
||||||
|
|
||||||
|
try {
|
||||||
for (Map.Entry<String, List<String>> entry : messageQueue.entrySet()) {
|
for (Map.Entry<String, List<String>> entry : messageQueue.entrySet()) {
|
||||||
final List<String> logs = entry.getValue();
|
final List<String> logs = entry.getValue();
|
||||||
|
|
||||||
|
@ -182,7 +196,12 @@ public class IRCPlugin extends IRCMessageLoop {
|
||||||
|
|
||||||
logs.remove(0);
|
logs.remove(0);
|
||||||
|
|
||||||
channelMessage(entry.getKey(), firstLog);
|
final String withIRCColors = ColorUtilities.convertAnsiToIrc(firstLog);
|
||||||
|
|
||||||
|
bot.sendIRC().message(entry.getKey(), withIRCColors);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,12 @@ import net.kyori.adventure.text.format.NamedTextColor;
|
||||||
import net.kyori.adventure.text.format.TextColor;
|
import net.kyori.adventure.text.format.TextColor;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class ColorUtilities {
|
public class ColorUtilities {
|
||||||
|
private static final Map<Integer, String> ansiToIrcMap = new HashMap<>();
|
||||||
|
|
||||||
public static TextColor getColorByString (String _color) {
|
public static TextColor getColorByString (String _color) {
|
||||||
final String color = _color.toLowerCase();
|
final String color = _color.toLowerCase();
|
||||||
|
|
||||||
|
@ -87,6 +91,65 @@ public class ColorUtilities {
|
||||||
return closest.colorName;
|
return closest.colorName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Author: ChatGPT
|
||||||
|
static {
|
||||||
|
ansiToIrcMap.put(30, "01"); // Black -> IRC Black
|
||||||
|
ansiToIrcMap.put(31, "04"); // Red -> IRC Red
|
||||||
|
ansiToIrcMap.put(32, "09"); // Green -> IRC Green
|
||||||
|
ansiToIrcMap.put(33, "08"); // Yellow -> IRC Yellow
|
||||||
|
ansiToIrcMap.put(34, "02"); // Blue -> IRC Blue
|
||||||
|
ansiToIrcMap.put(35, "13"); // Magenta -> IRC Magenta (Purple)
|
||||||
|
ansiToIrcMap.put(36, "11"); // Cyan -> IRC Cyan
|
||||||
|
ansiToIrcMap.put(37, "00"); // White -> IRC White
|
||||||
|
ansiToIrcMap.put(39, "00"); // White -> IRC White
|
||||||
|
|
||||||
|
final Map<Integer, String> clone = new HashMap<>(ansiToIrcMap);
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, String> entry : clone.entrySet()) {
|
||||||
|
ansiToIrcMap.put(entry.getKey() + 10, ansiToIrcMap.get(entry.getKey()));
|
||||||
|
}
|
||||||
|
|
||||||
|
ansiToIrcMap.put(49, "01");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String convertAnsiToIrc(String input) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
boolean insideEscape = false;
|
||||||
|
StringBuilder ansiCode = new StringBuilder();
|
||||||
|
|
||||||
|
for (int i = 0; i < input.length(); i++) {
|
||||||
|
char c = input.charAt(i);
|
||||||
|
if (insideEscape) {
|
||||||
|
if (c == 'm') {
|
||||||
|
insideEscape = false;
|
||||||
|
// Parse the ANSI color code and map it to IRC color
|
||||||
|
String[] codes = ansiCode.toString().split(";");
|
||||||
|
for (String code : codes) {
|
||||||
|
try {
|
||||||
|
int ansiColorCode = Integer.parseInt(code);
|
||||||
|
if (ansiToIrcMap.containsKey(ansiColorCode)) {
|
||||||
|
result.append("\u0003").append(ansiToIrcMap.get(ansiColorCode));
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ansiCode.setLength(0); // Clear the buffer
|
||||||
|
} else {
|
||||||
|
ansiCode.append(c); // Collect the rest of the ANSI sequence
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (c == '\u001B' && i + 1 < input.length() && input.charAt(i + 1) == '[') {
|
||||||
|
insideEscape = true;
|
||||||
|
i++; // Skip the '[' character
|
||||||
|
} else {
|
||||||
|
result.append(c); // Append non-ANSI characters directly
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public static final class ChatColor {
|
public static final class ChatColor {
|
||||||
|
|
||||||
private final String colorName;
|
private final String colorName;
|
||||||
|
|
|
@ -39,13 +39,10 @@ irc:
|
||||||
prefix: '!'
|
prefix: '!'
|
||||||
host: 'irc.libera.chat'
|
host: 'irc.libera.chat'
|
||||||
port: 6665
|
port: 6665
|
||||||
nickname: 'chomens-bot'
|
name: 'chomens_bot'
|
||||||
username: 'chomens-bot'
|
password: ''
|
||||||
realName: 'chomens-bot'
|
|
||||||
hostName: 'null'
|
|
||||||
serverName: 'null'
|
|
||||||
servers:
|
servers:
|
||||||
localhost:25565: '#chomens-localhost' # channel name
|
localhost:25565: '#chomens/localhost' # channel name
|
||||||
|
|
||||||
music:
|
music:
|
||||||
urlRatelimit:
|
urlRatelimit:
|
||||||
|
|
12
src/main/resources/logback.xml
Normal file
12
src/main/resources/logback.xml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<pattern>%d{HH:mm:ss.SSS} %boldCyan(%-34.-34thread) %red(%10.10X{jda.shard}) %boldGreen(%-15.-15logger{0}) %highlight(%-6level) %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<root level="OFF">
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
Loading…
Reference in a new issue