custom chat format checker

to stop yfd impostering
This commit is contained in:
Chayapak 2023-09-22 18:15:57 +07:00
parent 375bde4895
commit 36afeba760
7 changed files with 87 additions and 16 deletions

View file

@ -78,6 +78,7 @@ public class Bot {
public WorldPlugin world; public WorldPlugin world;
public AuthPlugin auth; public AuthPlugin auth;
public ScreensharePlugin screenshare; public ScreensharePlugin screenshare;
public FormatCheckerPlugin formatChecker;
public Bot (Configuration.BotOption botOption, List<Bot> bots, Configuration config) { public Bot (Configuration.BotOption botOption, List<Bot> bots, Configuration config) {
this.host = botOption.host; this.host = botOption.host;
@ -127,6 +128,7 @@ public class Bot {
this.world = new WorldPlugin(this); this.world = new WorldPlugin(this);
this.auth = new AuthPlugin(this); this.auth = new AuthPlugin(this);
// this.screenshare = new ScreensharePlugin(this); // this.screenshare = new ScreensharePlugin(this);
this.formatChecker = new FormatCheckerPlugin(this);
for (Listener listener : listeners) listener.loadedPlugins(); for (Listener listener : listeners) listener.loadedPlugins();

View file

@ -27,14 +27,20 @@ public class Configuration {
public String ownerName = "chayapak"; // mabe mabe public String ownerName = "chayapak"; // mabe mabe
public ImposterFormatChecker imposterFormatChecker = new ImposterFormatChecker();
public OwnerAuthentication ownerAuthentication = new OwnerAuthentication(); public OwnerAuthentication ownerAuthentication = new OwnerAuthentication();
public List<String> trusted = new ArrayList<>(); public List<String> trusted = new ArrayList<>();
public SelfCare selfCare = new SelfCare(); public SelfCare selfCare = new SelfCare();
public Eval eval = new Eval();
public BotOption[] bots = new BotOption[]{}; public BotOption[] bots = new BotOption[]{};
public static class ImposterFormatChecker {
public boolean enabled = false;
public String key;
}
public static class OwnerAuthentication { public static class OwnerAuthentication {
public boolean enabled = false; public boolean enabled = false;
public String key = ""; public String key = "";
@ -137,10 +143,6 @@ public class Configuration {
public boolean username = true; public boolean username = true;
} }
public static class Eval {
public String address = "ws://localhost:3069";
}
public static class BotOption { public static class BotOption {
public String host; public String host;
public int port; public int port;

View file

@ -34,8 +34,8 @@ public class AuthPlugin extends PlayersPlugin.Listener {
bot.players.addListener(this); bot.players.addListener(this);
bot.chat.addListener(new ChatPlugin.Listener() { bot.chat.addListener(new ChatPlugin.Listener() {
@Override @Override
public void systemMessageReceived(Component component, boolean isCommandSuggestions, boolean isAuth, String string, String ansi) { public void systemMessageReceived(Component component, boolean isCommandSuggestions, boolean isAuth, boolean isImposterFormat, String string, String ansi) {
AuthPlugin.this.systemMessageReceived(component, isCommandSuggestions, isAuth); AuthPlugin.this.systemMessageReceived(component, isCommandSuggestions, isAuth, isImposterFormat);
} }
}); });
bot.executor.scheduleAtFixedRate(this::check, 0, 1, TimeUnit.SECONDS); bot.executor.scheduleAtFixedRate(this::check, 0, 1, TimeUnit.SECONDS);
@ -83,9 +83,9 @@ public class AuthPlugin extends PlayersPlugin.Listener {
started = false; started = false;
} }
private void systemMessageReceived (Component component, boolean isCommandSuggestions, boolean isAuth) { private void systemMessageReceived (Component component, boolean isCommandSuggestions, boolean isAuth, boolean isImposterFormat) {
try { try {
if (isCommandSuggestions || !isAuth) return; if (isCommandSuggestions || !isAuth || !isImposterFormat) return;
final List<Component> children = component.children(); final List<Component> children = component.children();

View file

@ -100,12 +100,14 @@ public class ChatPlugin extends Bot.Listener {
else if (id.equals(bot.auth.id)) isAuth = true; else if (id.equals(bot.auth.id)) isAuth = true;
} }
final boolean isImposterFormat = bot.formatChecker.isImposterFormat(component);
final String string = ComponentUtilities.stringify(component); final String string = ComponentUtilities.stringify(component);
final String ansi = ComponentUtilities.stringifyAnsi(component); final String ansi = ComponentUtilities.stringifyAnsi(component);
for (Listener listener : listeners) { for (Listener listener : listeners) {
if (!isCommandSuggestions && !isAuth) listener.systemMessageReceived(component, string, ansi); if (!isCommandSuggestions && !isAuth && !isImposterFormat) listener.systemMessageReceived(component, string, ansi);
listener.systemMessageReceived(component, isCommandSuggestions, isAuth, string, ansi); listener.systemMessageReceived(component, isCommandSuggestions, isAuth, isImposterFormat, string, ansi);
if (playerMessage != null) listener.playerMessageReceived(playerMessage); if (playerMessage != null) listener.playerMessageReceived(playerMessage);
} }
@ -365,6 +367,6 @@ public class ChatPlugin extends Bot.Listener {
public static class Listener { public static class Listener {
public void playerMessageReceived (PlayerMessage message) {} public void playerMessageReceived (PlayerMessage message) {}
public void systemMessageReceived (Component component, String string, String ansi) {} public void systemMessageReceived (Component component, String string, String ansi) {}
public void systemMessageReceived (Component component, boolean isCommandSuggestions, boolean isAuth, String string, String ansi) {} public void systemMessageReceived (Component component, boolean isCommandSuggestions, boolean isAuth, boolean isImposterFormat, String string, String ansi) {}
} }
} }

View file

@ -20,7 +20,7 @@ public class CommandSuggestionPlugin extends ChatPlugin.Listener {
} }
@Override @Override
public void systemMessageReceived(Component component, boolean isCommandSuggestions, boolean isAuth, String string, String ansi) { public void systemMessageReceived(Component component, boolean isCommandSuggestions, boolean isAuth, boolean isImposterFormat, String string, String ansi) {
if (!isCommandSuggestions) return; if (!isCommandSuggestions) return;
try { try {

View file

@ -0,0 +1,64 @@
package land.chipmunk.chayapak.chomens_bot.plugins;
import com.google.common.hash.Hashing;
import land.chipmunk.chayapak.chomens_bot.Bot;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TranslatableComponent;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class FormatCheckerPlugin extends ChatPlugin.Listener {
private final Bot bot;
public FormatCheckerPlugin (Bot bot) {
this.bot = bot;
bot.chat.addListener(this);
}
@Override
public void systemMessageReceived(Component component, boolean isCommandSuggestions, boolean isAuth, boolean isImposterFormat, String string, String ansi) {
if (!isImposterFormat) return;
bot.chat.tellraw(Component.text("fake chomens custom chat .,.,.,.,"));
}
public boolean isImposterFormat (Component component) {
if (!(component instanceof TranslatableComponent format)) return false;
final List<Component> args = format.args();
if (args.size() < 3 || !format.key().equals("[%s] %s %s")) return false;
final Component nameComponent = format.args().get(1);
if (!(nameComponent instanceof TextComponent)) return false;
final String name = ((TextComponent) nameComponent).content();
if (!name.equals(bot.config.ownerName)) return false;
final Component prefix = format.args().get(0);
if (!(prefix instanceof TranslatableComponent translatablePrefix)) return true;
final Component userHash = translatablePrefix.args().get(0);
if (userHash == null) return true;
if (!(userHash instanceof TextComponent userHashComponent)) return true;
final long time = System.currentTimeMillis() / 10_000;
final String key = bot.config.imposterFormatChecker.key;
final String hash = Hashing.sha256()
// very pro hash input
.hashString(key + key + time + time, StandardCharsets.UTF_8)
.toString()
.substring(0, 8);
return !hash.equals(userHashComponent.content());
}
}

View file

@ -51,6 +51,10 @@ colorPalette:
ownerName: 'chayapak' # currently this is only used in the console ownerName: 'chayapak' # currently this is only used in the console
imposterFormatChecker:
enabled: false
key: ''
ownerAuthentication: ownerAuthentication:
enabled: false enabled: false
key: '' key: ''
@ -106,9 +110,6 @@ selfCare:
prefix: '&8[&eChomeNS Bot&8]' prefix: '&8[&eChomeNS Bot&8]'
username: true # MIGHT cause problem(s) if set to false (not tested,.,.) username: true # MIGHT cause problem(s) if set to false (not tested,.,.)
eval:
address: 'ws://localhost:3069'
bots: bots:
# username - optional, if not specified it will just use a random username # username - optional, if not specified it will just use a random username
# creayun - defaults to false # creayun - defaults to false