Begin to actually try to get commands to work

This commit is contained in:
Chipmunk 2023-01-12 22:12:58 -05:00
parent 4f5d0f4c49
commit a67b45c4d6
9 changed files with 5640 additions and 8 deletions

View file

@ -16,7 +16,8 @@ import land.chipmunk.chipmunkbot.plugins.*;
public class ChipmunkBot extends Client {
@Getter public final ChatPlugin chat = new ChatPlugin(this);
@Getter public final PlayerListPlugin playerList = new PlayerListPlugin(this);
@Getter public final CommandManagerPlugin commandManager = new CommandManagerPlugin(this);
@Getter public final CommandManager commandManager = new CommandManager(this);
@Getter public final ChatCommandHandler chatCommandHandler = new ChatCommandHandler(this);
@Getter public final PositionManager position = new PositionManager(this);
@Getter public final CommandCore core = new CommandCore(this);

View file

@ -0,0 +1,105 @@
package land.chipmunk.chipmunkbot.chat;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.TranslatableComponent;
import net.kyori.adventure.text.SelectorComponent;
import net.kyori.adventure.text.KeybindComponent;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ComponentUtilities {
private static final Map<String, String> language = loadJsonStringMap("language.json");
private static final Map<String, String> keybinds = loadJsonStringMap("keybinds.json");
public static final Pattern ARG_PATTERN = Pattern.compile("%(?:(\\d+)\\$)?(s|%)");
private ComponentUtilities () {
}
private static Map<String, String> loadJsonStringMap (String name) {
Map<String, String> map = new HashMap<>();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream(name);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
JsonObject json = JsonParser.parseReader(reader).getAsJsonObject();
for (Map.Entry<String, JsonElement> entry : json.entrySet()) {
map.put(entry.getKey(), json.get(entry.getKey()).getAsString());
}
return map;
}
private static String getOrReturnKey (Map<String, String> map, String key) {
return map.containsKey(key) ? map.get(key) : key;
}
public static String stringify (Component message) {
StringBuilder builder = new StringBuilder();
builder.append(stringifyPartially(message));
for (Component child : message.children()) builder.append(stringify(child));
return builder.toString();
}
public static String stringifyPartially (Component message) {
if (message instanceof TextComponent) return stringifyPartially((TextComponent) message);
if (message instanceof TranslatableComponent) return stringifyPartially((TranslatableComponent) message);
if (message instanceof SelectorComponent) return stringifyPartially((SelectorComponent) message);
if (message instanceof KeybindComponent) return stringifyPartially((KeybindComponent) message);
return "";
}
public static String stringifyPartially (TextComponent message) {
return message.content();
}
public static String stringifyPartially (TranslatableComponent message) {
String format = getOrReturnKey(language, message.key());
// totallynotskidded from HBot
Matcher matcher = ARG_PATTERN.matcher(format);
StringBuffer sb = new StringBuffer();
int i = 0;
while (matcher.find()) {
if (matcher.group().equals("%%")) {
matcher.appendReplacement(sb, "%");
} else {
String idxStr = matcher.group(1);
int idx = idxStr == null ? i++ : Integer.parseInt(idxStr);
if (idx < message.args().size()) {
matcher.appendReplacement(sb, Matcher.quoteReplacement( stringify(message.args().get(idx)) ));
} else {
matcher.appendReplacement(sb, "");
}
}
}
matcher.appendTail(sb);
return sb.toString();
}
public static String stringifyPartially (SelectorComponent message) {
return message.pattern(); // * Client-side selector components are equivalent to text ones, and do NOT list entities.
}
public static String stringifyPartially (KeybindComponent message) {
String keybind = message.keybind();
Component component = keybinds.containsKey(keybind) ? Component.translatable(keybind) : Component.text(keybind); // TODO: Fix some keys like `key.keyboard.a`
return stringifyPartially(component);
}
}

View file

@ -0,0 +1,32 @@
package land.chipmunk.chipmunkbot.plugins;
import land.chipmunk.chipmunkbot.ChipmunkBot;
import land.chipmunk.chipmunkbot.command.CommandSource;
import land.chipmunk.chipmunkbot.plugins.ChatPlugin;
import land.chipmunk.chipmunkbot.data.chat.PlayerMessage;
import land.chipmunk.chipmunkbot.chat.ComponentUtilities;
import net.kyori.adventure.text.Component;
import com.mojang.brigadier.CommandDispatcher;
import lombok.Getter;
import lombok.Setter;
public class ChatCommandHandler extends ChatPlugin.Listener {
private ChipmunkBot client;
@Getter @Setter private String prefix = "'"; // TODO: Don't hardcode this
public ChatCommandHandler (ChipmunkBot client) {
this.client = client;
client.chat().addListener((ChatPlugin.Listener) this);
}
@Override
public void playerMessageReceived (PlayerMessage message) {
final Component contents = message.parameters().get("contents");
if (contents == null) return;
final String contentsString = ComponentUtilities.stringify(contents);
if (!contentsString.startsWith(prefix)) return;
final String commandString = contentsString.substring(prefix.length());
// System.out.println(ComponentUtilities.stringify(message.parameters().get("sender")) + " issued the command " + commandString);
}
}

View file

@ -71,7 +71,7 @@ public class ChatPlugin extends SessionAdapter {
listeners.add(listener);
}
public class Listener {
public static class Listener {
public void systemMessageReceived (Component component, boolean overlay) {}
public void playerMessageReceived (PlayerMessage message) {}
}

View file

@ -0,0 +1,19 @@
package land.chipmunk.chipmunkbot.plugins;
import land.chipmunk.chipmunkbot.ChipmunkBot;
import land.chipmunk.chipmunkbot.command.CommandSource;
import land.chipmunk.chipmunkbot.chat.ComponentUtilities;
import net.kyori.adventure.text.Component;
import com.mojang.brigadier.CommandDispatcher;
import lombok.Getter;
import lombok.Setter;
public class CommandManager {
private ChipmunkBot client;
@Getter @Setter private CommandDispatcher<CommandSource> dispatcher = new CommandDispatcher<>();
@Getter @Setter private String prefix = "'"; // TODO: Don't hardcode this
public CommandManager (ChipmunkBot client) {
this.client = client;
}
}

View file

@ -1,14 +1,18 @@
package land.chipmunk.chipmunkbot.plugins;
import com.mojang.brigadier.CommandDispatcher;
import land.chipmunk.chipmunkbot.Client;
import land.chipmunk.chipmunkbot.ChipmunkBot;
import land.chipmunk.chipmunkbot.command.CommandSource;
import land.chipmunk.chipmunkbot.chat.ComponentUtilities;
import net.kyori.adventure.text.Component;
import com.mojang.brigadier.CommandDispatcher;
import lombok.Getter;
import lombok.Setter;
public class CommandManagerPlugin {
private Client client;
private ChipmunkBot client;
@Getter @Setter private CommandDispatcher<CommandSource> dispatcher = new CommandDispatcher<>();
public CommandManagerPlugin (Client client) { this.client = client; }
public CommandManagerPlugin (ChipmunkBot client) {
this.client = client;
}
}

View file

@ -51,10 +51,10 @@ public class KaboomChatParser implements SystemChatParser {
Component contents = Component.empty();
if (isSeperatorAt(children, 1)) { // Missing/blank display name
if (children.size() >= 2) contents = children.get(1);
if (children.size() > 3) contents = children.get(3);
} else if (isSeperatorAt(children, 2)) {
displayName = children.get(1);
if (children.size() >= 3) contents = children.get(2);
if (children.size() > 4) contents = children.get(4);
} else {
return null;
}

View file

@ -0,0 +1,36 @@
{
"key.attack": "key.mouse.left",
"key.use": "key.mouse.right",
"key.forward": "key.keyboard.w",
"key.left": "key.keyboard.a",
"key.back": "key.keyboard.s",
"key.right": "key.keyboard.d",
"key.jump": "key.keyboard.space",
"key.sneak": "key.keyboard.left.shift",
"key.sprint": "key.keyboard.left.control",
"key.drop": "key.keyboard.q",
"key.inventory": "key.keyboard.e",
"key.chat": "key.keyboard.t",
"key.playerlist": "key.keyboard.tab",
"key.pickItem": "key.mouse.middle",
"key.command": "key.keyboard.slash",
"key.socialInteractions": "key.keyboard.p",
"key.screenshot": "key.keyboard.f2",
"key.togglePerspective": "key.keyboard.f5",
"key.smoothCamera": "key.keyboard.unknown",
"key.fullscreen": "key.keyboard.f11",
"key.spectatorOutlines": "key.keyboard.unknown",
"key.swapOffhand": "key.keyboard.f",
"key.saveToolbarActivator": "key.keyboard.c",
"key.loadToolbarActivator": "key.keyboard.x",
"key.advancements": "key.keyboard.l",
"key.hotbar.1": "key.keyboard.1",
"key.hotbar.2": "key.keyboard.2",
"key.hotbar.3": "key.keyboard.3",
"key.hotbar.4": "key.keyboard.4",
"key.hotbar.5": "key.keyboard.5",
"key.hotbar.6": "key.keyboard.6",
"key.hotbar.7": "key.keyboard.7",
"key.hotbar.8": "key.keyboard.8",
"key.hotbar.9": "key.keyboard.9"
}

File diff suppressed because it is too large Load diff