package jesse.keeblarcraft.Commands; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.context.CommandContext; import jesse.keeblarcraft.ConfigMgr.ConfigManager; import jesse.keeblarcraft.JsonClassObjects.PlayerNote; import jesse.keeblarcraft.ChatStuff.ChatMsg; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; public class NoteCommands { /// Class Variables ConfigManager notesConfig = new ConfigManager(); String NOTES_GLOBAL_DIRECTORY = "notes"; // The overall "notes" dir inside cfg folder ///////////////////////////////////////////////////////////////////////////// /// @fn NoteCommands ///////////////////////////////////////////////////////////////////////////// public NoteCommands() {} //TODO: Rework note commands upon story mode release ///////////////////////////////////////////////////////////////////////////// /// @fn RegisterNoteCommands /// /// @brief Registers all the commands for this class ///////////////////////////////////////////////////////////////////////////// public void RegisterNoteCommands() { // Command: "/addnote note goes here" CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { dispatcher.register(CommandManager.literal("addnote") .then(CommandManager.argument("value", StringArgumentType.greedyString()) .executes(context -> AddNote(StringArgumentType.getString(context, "value"), context)))); }); // Command: "/delnote noteIdHere" // CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { // dispatcher.register(CommandManager.literal("delnote") // .then(CommandManager.argument("value", StringArgumentType.greedyString()) // .executes(context -> AddNote(StringArgumentType.getString(context, "value"), context)))); // }); // Command: "/purgenotes" CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { dispatcher.register(CommandManager.literal("purgenotes") .executes(context -> PurgeAllNotes(context))); }); // Command: "/modifynote noteIdHere new_note_string_here" // Alises: "/editnote" CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { final var mNote = dispatcher.register(CommandManager.literal("editnote") .then(CommandManager.argument("note_id", IntegerArgumentType.integer()) .then(CommandManager.argument("new_note", StringArgumentType.string()) .executes(context -> ModifyNote( IntegerArgumentType.getInteger(context, "note_id"), StringArgumentType.getString(context, "new_note"), context))))); dispatcher.register(CommandManager.literal("editnote").redirect(mNote)); }); // Command Root: "/delnote noteIdHere" // Aliases: "/rmnote", "/deletenote" CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { final var rootDeleteCmd = dispatcher.register(CommandManager.literal("delnote") .then(CommandManager.argument("value", IntegerArgumentType.integer()) .executes(context -> DeleteNote(IntegerArgumentType.getInteger(context, "value"), context)))); // Alias redirects dispatcher.register(CommandManager.literal("rmnote").redirect(rootDeleteCmd)); dispatcher.register(CommandManager.literal("deletenote").redirect(rootDeleteCmd)); }); // Command Root: "/notegui" CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { dispatcher.register(CommandManager.literal("notegui") .executes(context -> { OpenNoteGui(context); return 0; })); }); // Command Root: "/notelist" // Aliases: "/listnotes" CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { final var rootListNotes = dispatcher.register(CommandManager.literal("notelist") .executes(context -> { ListNotes(context); return 0; })); dispatcher.register(CommandManager.literal("listnotes").redirect(rootListNotes)); }); } ///////////////////////////////////////////////////////////////////////////// /// @fn AddNote /// /// @brief Adds a new note to the players notebook /// /// @arg[in] value is the new note to be added /// /// @arg[in] context is the context of the ServerCommandSource object /// the command was run with /// /// @return 0 if success, -1 if not ///////////////////////////////////////////////////////////////////////////// private Integer AddNote(String value, CommandContext context) { Integer ret = -1; if (context.getSource().isExecutedByPlayer()) { ServerPlayerEntity player = context.getSource().getPlayer(); // Note mgmt PlayerNote note = new PlayerNote(player.getUuidAsString()); note.AddNote(value, 1, 1, 1, 1); player.sendMessage(Text.of("New note logged to entry! View notes any time with /notegui")); ret = 0; } else { System.out.println("Only a player can execute this command!"); } return ret; } ///////////////////////////////////////////////////////////////////////////// /// @fn DeleteNote /// /// @brief Deletes a note by id /// /// @arg[in] value is the integer ID of the note to be deleted /// /// @arg[in] context is the context of the ServerCommandSource object /// the command was run with /// /// @return 0 if success, -1 if not ///////////////////////////////////////////////////////////////////////////// private int DeleteNote(int value, CommandContext context) { int ret = -1; if (context.getSource().isExecutedByPlayer()) { ServerPlayerEntity player = context.getSource().getPlayer(); PlayerNote note = new PlayerNote(player.getUuidAsString()); player.sendMessage(Text.of("Deleted note entry. View notes any time with /notegui")); ret = 0; note.DeleteNote(value); } else { System.out.println("Only a player can execute this command!"); } return ret; } ///////////////////////////////////////////////////////////////////////////// /// @fn ModifyNote /// /// @brief Modifies a single note by id value /// /// @arg[in] value is the integer ID of the note to be modified /// /// @arg[in] newNote is the new version of the edited note /// /// @arg[in] context is the context of the ServerCommandSource object /// the command was run with /// /// @return 0 if success, -1 if not ///////////////////////////////////////////////////////////////////////////// private int ModifyNote(Integer value, String newNote, CommandContext context) { int ret = -1; if (context.getSource().isExecutedByPlayer() && value > 0) { ServerPlayerEntity player = context.getSource().getPlayer(); PlayerNote note = new PlayerNote(player.getUuidAsString()); long time = context.getSource().getWorld().getTime(); // long day = ; ///TODO: Docs lack this for some reason? Add in future long epochTime = System.currentTimeMillis(); long storyChapter = -1; // Intentional garbage until story is fleshed out later (TODO) long storyPart = -1; // Intentional garbage until story is fleshed out later (TODO) note.ModifyNote(value, newNote, epochTime, storyChapter, storyPart); player.sendMessage(Text.of("Modified note entry. View notes any time with /notegui")); ret = 0; } return ret; } ///////////////////////////////////////////////////////////////////////////// /// @fn PurgeAllNotes /// /// @brief Removes all notes from a players note file /// /// @arg[in] context is the context of the ServerCommandSource object /// the command was run with /// /// @return 0 if success, -1 if not ///////////////////////////////////////////////////////////////////////////// private int PurgeAllNotes(CommandContext context) { int ret = -1; if (context.getSource().isExecutedByPlayer()) { ServerPlayerEntity player = context.getSource().getPlayer(); PlayerNote note = new PlayerNote(player.getUuidAsString()); note.PurgeAllNotes(); player.sendMessage(Text.of("Purged all notes. View notes any time with /notegui")); ret = 0; } else { System.out.println("Only a player can execute this command!"); } return ret; } ///////////////////////////////////////////////////////////////////////////// /// @fn ListNotes /// /// @brief Lists notes in pages in the players active chat /// /// @arg[in] context is the context of the ServerCommandSource object /// the command was run with /// /// @return 0 if success, -1 if not ///////////////////////////////////////////////////////////////////////////// private int ListNotes(CommandContext context) { int ret = -1; if (context.getSource().isExecutedByPlayer()) { ServerPlayerEntity player = context.getSource().getPlayer(); PlayerNote notes = new PlayerNote(player.getUuidAsString()); for (int i = 0; i <= notes.GetNotebookSize(); i++) { String individualNote = notes.GetNoteString(i); if (individualNote != "") { player.sendMessage(Text.of("Note " + i + ": " + individualNote)); } } ret = 0; } else { System.out.println("Only a player can execute this command!"); } return ret; } ///TODO: Blocked until GUI manager is available ///////////////////////////////////////////////////////////////////////////// /// @fn OpenNoteGui /// /// @brief Opens up the graphical display of the note manager /// /// @arg[in] context is the context of the ServerCommandSource object /// the command was run with /// /// @return 0 if success, -1 if not ///////////////////////////////////////////////////////////////////////////// private int OpenNoteGui(CommandContext context) { int ret = -1; if (context.getSource().isExecutedByPlayer()) { ServerPlayerEntity player = context.getSource().getPlayer(); ret = 0; } else { System.out.println("Only a player can execute this command!"); } return ret; } }