From f19ea5c876a81e40f8e48946e7b277c0c9ddb180 Mon Sep 17 00:00:00 2001 From: "Ansgar [Hiajen]" Date: Sat, 22 May 2021 12:48:12 +0200 Subject: [PATCH 1/4] [refactor] try to generate general structures --- src/main/java/net/saltymc/eaa/EaaMod.java | 27 ++++++ .../net/saltymc/eaa/commands/Command.java | 9 -- .../net/saltymc/eaa/commands/EaaCommand.java | 13 --- .../{commands => handler}/CommandHandler.java | 87 ++++++++----------- .../saltymc/eaa/handler/HandlerInterface.java | 8 ++ .../saltymc/eaa/handler/commands/Command.java | 14 +++ .../eaa/handler/commands/EaaCommand.java | 31 +++++++ .../net/saltymc/eaa/mixin/ExampleMixin.java | 20 +++-- .../net/saltymc/eaa/mixin/MixinInterface.java | 13 +++ .../net/saltymc/eaa/util/ResponseEntity.java | 29 +++++++ 10 files changed, 172 insertions(+), 79 deletions(-) delete mode 100644 src/main/java/net/saltymc/eaa/commands/Command.java delete mode 100644 src/main/java/net/saltymc/eaa/commands/EaaCommand.java rename src/main/java/net/saltymc/eaa/{commands => handler}/CommandHandler.java (50%) create mode 100644 src/main/java/net/saltymc/eaa/handler/HandlerInterface.java create mode 100644 src/main/java/net/saltymc/eaa/handler/commands/Command.java create mode 100644 src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java create mode 100644 src/main/java/net/saltymc/eaa/mixin/MixinInterface.java create mode 100644 src/main/java/net/saltymc/eaa/util/ResponseEntity.java diff --git a/src/main/java/net/saltymc/eaa/EaaMod.java b/src/main/java/net/saltymc/eaa/EaaMod.java index 832629c..e0ba7d2 100644 --- a/src/main/java/net/saltymc/eaa/EaaMod.java +++ b/src/main/java/net/saltymc/eaa/EaaMod.java @@ -1,8 +1,21 @@ package net.saltymc.eaa; import net.fabricmc.api.ModInitializer; +import net.saltymc.eaa.handler.CommandHandler; +import net.saltymc.eaa.handler.HandlerInterface; +import net.saltymc.eaa.util.ResponseEntity; + +import java.util.ArrayList; +import java.util.List; public class EaaMod implements ModInitializer { + + private final List handler; + + public EaaMod(){ + handler = new ArrayList<>(); + } + @Override public void onInitialize() { // This code runs as soon as Minecraft is in a mod-load-ready state. @@ -10,5 +23,19 @@ public class EaaMod implements ModInitializer { // Proceed with mild caution. System.out.println("EAA Mod initializing..."); + + //Init CommandHandler + handler.add(new CommandHandler()); + + } + + public ResponseEntity onEvent(Object object){ + for (HandlerInterface hi : handler) { + ResponseEntity handlerResponse = hi.handle(object); + if (handlerResponse.isWasHandled()) + return handlerResponse; // Events are exclusive yet + } + + return new ResponseEntity(false); } } diff --git a/src/main/java/net/saltymc/eaa/commands/Command.java b/src/main/java/net/saltymc/eaa/commands/Command.java deleted file mode 100644 index 77b1837..0000000 --- a/src/main/java/net/saltymc/eaa/commands/Command.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.saltymc.eaa.commands; - -import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; - -public interface Command { - - int run(FabricClientCommandSource cs, String[] args); - -} diff --git a/src/main/java/net/saltymc/eaa/commands/EaaCommand.java b/src/main/java/net/saltymc/eaa/commands/EaaCommand.java deleted file mode 100644 index 1193e52..0000000 --- a/src/main/java/net/saltymc/eaa/commands/EaaCommand.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.saltymc.eaa.commands; - -import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; -import net.minecraft.text.Text; - -public class EaaCommand implements Command{ - @Override - public int run(FabricClientCommandSource cs, String[] args) { - cs.sendFeedback(Text.of("command catched!")); - - return 0; - } -} \ No newline at end of file diff --git a/src/main/java/net/saltymc/eaa/commands/CommandHandler.java b/src/main/java/net/saltymc/eaa/handler/CommandHandler.java similarity index 50% rename from src/main/java/net/saltymc/eaa/commands/CommandHandler.java rename to src/main/java/net/saltymc/eaa/handler/CommandHandler.java index a9ef4e3..81679d3 100644 --- a/src/main/java/net/saltymc/eaa/commands/CommandHandler.java +++ b/src/main/java/net/saltymc/eaa/handler/CommandHandler.java @@ -1,39 +1,36 @@ -package net.saltymc.eaa.commands; +package net.saltymc.eaa.handler; import com.mojang.brigadier.exceptions.BuiltInExceptionProvider; import com.mojang.brigadier.exceptions.CommandExceptionType; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; import net.minecraft.client.MinecraftClient; -import net.minecraft.command.CommandException; -import net.minecraft.network.MessageType; -import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.text.Texts; import net.minecraft.text.TranslatableText; -import net.minecraft.util.Formatting; -import net.minecraft.util.Util; -import org.apache.logging.log4j.Level; +import net.saltymc.eaa.handler.commands.Command; +import net.saltymc.eaa.handler.commands.EaaCommand; +import net.saltymc.eaa.util.ResponseEntity; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.List; -import static net.fabricmc.fabric.api.client.command.v1.ClientCommandManager.DISPATCHER; +public class CommandHandler implements HandlerInterface { -public class CommandHandler { - - private static final char PREFIX = '/'; + private static final String PREFIX = "#"; private static final Logger LOGGER = LogManager.getLogger(); - private static HashMap commands; + private static List commands; //above line stolen from net.fabricmc.fabric.impl.command.client.ClientCommandInternals; - static { - if(CommandHandler.commands == null){ - CommandHandler.commands = new HashMap<>(); - } - CommandHandler.commands.put("p", new EaaCommand()); - //TODO implement + private static FabricClientCommandSource commandSource; + + + public CommandHandler(){ + commands = new ArrayList<>(); + + CommandHandler.commands.add(new EaaCommand()); } /** @@ -42,52 +39,31 @@ public class CommandHandler { * @param message the command message * @return true if the message should not be sent to the server, false otherwise */ - public static boolean executeCommand(String message) { + public boolean executeCommand(String message) { if (message.isEmpty()) { return false; // Nothing to process } - if (message.charAt(0) != PREFIX) { + if (!message.matches("^" + PREFIX + ".*")) { return false; // Incorrect prefix, won't execute anything. } FabricClientCommandSource commandSource = (FabricClientCommandSource) MinecraftClient.getInstance().getNetworkHandler().getCommandSource(); - //commandSource.getClient().getProfiler().push(message); + // Build args + String[] args = message.replaceFirst(PREFIX,"").split(" "); // split into args and remove prefix - try { - //DISPATCHER.execute(message.substring(1), commandSource); - String command = message.replaceFirst(""+PREFIX,"").split(" ")[0]; - String[] args = message.replaceFirst(""+PREFIX,"").split(" "); //TODO remove first item from array + LOGGER.debug("Valid Prefix received"); - System.out.println("command: $"+command+"$"); - - if(CommandHandler.commands.get(command) != null) { - CommandHandler.commands.get(command).run(commandSource, args); - }else{ - return false; + for (Command command : commands){ + if (command.run(commandSource, args)) { // Try execute command + LOGGER.debug("Executed following command: " + message); + return command.intercept(); // if executed return interception flag } - - return true; - /*} catch (CommandSyntaxException e) { - boolean ignored = isIgnoredException(e.getType()); - LOGGER.log(ignored ? Level.DEBUG : Level.WARN, "Syntax exception for client-sided command '{}'", message, e); - if (ignored) { - return false; - } - commandSource.sendError(getErrorMessage(e)); - return true;*/ - } catch (CommandException e) { - LOGGER.warn("Error while executing client-sided command '{}'", message, e); - commandSource.sendError(e.getTextMessage()); - return true; - } catch (RuntimeException e) { - LOGGER.warn("Error while executing client-sided command '{}'", message, e); - commandSource.sendError(Text.of(e.getMessage())); - return true; - } finally { - //commandSource.getClient().getProfiler().pop(); } + + return false; // Default dont intercept messages + } /** @@ -115,4 +91,11 @@ public class CommandHandler { } + @Override + public ResponseEntity handle(Object object) { + if (object instanceof String) + return new ResponseEntity(true, executeCommand((String) object)); // object matches handle event and return positive respondentsenity + + return new ResponseEntity(false); // object not matching return false + } } diff --git a/src/main/java/net/saltymc/eaa/handler/HandlerInterface.java b/src/main/java/net/saltymc/eaa/handler/HandlerInterface.java new file mode 100644 index 0000000..c82d2fc --- /dev/null +++ b/src/main/java/net/saltymc/eaa/handler/HandlerInterface.java @@ -0,0 +1,8 @@ +package net.saltymc.eaa.handler; + +import net.saltymc.eaa.util.ResponseEntity; + +public interface HandlerInterface { + + ResponseEntity handle(Object object); +} diff --git a/src/main/java/net/saltymc/eaa/handler/commands/Command.java b/src/main/java/net/saltymc/eaa/handler/commands/Command.java new file mode 100644 index 0000000..050d01e --- /dev/null +++ b/src/main/java/net/saltymc/eaa/handler/commands/Command.java @@ -0,0 +1,14 @@ +package net.saltymc.eaa.handler.commands; + +import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; + +public interface Command { + + boolean run(final FabricClientCommandSource cs, String[] args); + + /** + * should message get intercepted and not send to Server? + */ + boolean intercept(); + +} diff --git a/src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java b/src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java new file mode 100644 index 0000000..9c3e9eb --- /dev/null +++ b/src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java @@ -0,0 +1,31 @@ +package net.saltymc.eaa.handler.commands; + +import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; +import net.minecraft.text.Text; + +public class EaaCommand implements Command { + + private static final String COMMAND = "echo"; + private static final boolean INTERCEPT = true; + + @Override + public boolean run( final FabricClientCommandSource cs, String[] args) { + if (!args[0].equalsIgnoreCase(COMMAND)) { + return false; + } + + StringBuilder sb = new StringBuilder(); + for (String arg : args) + sb.append(arg); + + cs.sendFeedback(Text.of(sb.toString().replaceFirst(args[0], ""))); + + + return true; + } + + @Override + public boolean intercept() { + return INTERCEPT; + } +} \ No newline at end of file diff --git a/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java b/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java index d514018..d78e435 100644 --- a/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java +++ b/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java @@ -1,8 +1,9 @@ package net.saltymc.eaa.mixin; -import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.network.ClientPlayerEntity; -import net.saltymc.eaa.commands.CommandHandler; +import net.saltymc.eaa.EaaMod; +import net.saltymc.eaa.handler.CommandHandler; +import net.saltymc.eaa.util.ResponseEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,12 +18,21 @@ public class ExampleMixin { } */ @Mixin(ClientPlayerEntity.class) -public class ExampleMixin { //ClientPlayerEntityMixin +public class ExampleMixin extends MixinInterface { //ClientPlayerEntityMixin + + public ExampleMixin(final EaaMod eaaMod){ + super(eaaMod); + } + + @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) private void onSendChatMessage(String message, CallbackInfo info) { System.out.println("in onSendChatMessage"); - if (CommandHandler.executeCommand(message)) { + + ResponseEntity responseEntity = eaaMod.onEvent(message); + + if (responseEntity.isInterceptEvent()) info.cancel(); - } + } } \ No newline at end of file diff --git a/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java b/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java new file mode 100644 index 0000000..802d648 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java @@ -0,0 +1,13 @@ +package net.saltymc.eaa.mixin; + +import net.saltymc.eaa.EaaMod; + +public abstract class MixinInterface { + + protected final EaaMod eaaMod; + + MixinInterface(EaaMod eaaMod){ + this.eaaMod = eaaMod; + } + +} diff --git a/src/main/java/net/saltymc/eaa/util/ResponseEntity.java b/src/main/java/net/saltymc/eaa/util/ResponseEntity.java new file mode 100644 index 0000000..a55f0f1 --- /dev/null +++ b/src/main/java/net/saltymc/eaa/util/ResponseEntity.java @@ -0,0 +1,29 @@ +package net.saltymc.eaa.util; + +public class ResponseEntity { + + private boolean interceptEvent; + private final boolean wasHandled; + + public ResponseEntity(boolean wasHandled){ + this.wasHandled = wasHandled; + } + + public ResponseEntity(boolean wasHandled, boolean interceptEvent){ + this.wasHandled = wasHandled; + this.interceptEvent = interceptEvent; + } + + + public boolean isInterceptEvent() { + return interceptEvent; + } + + public void setInterceptEvent(boolean interceptEvent) { + this.interceptEvent = interceptEvent; + } + + public boolean isWasHandled() { + return wasHandled; + } +} From 6a85ecabc35d04951f399c68e123d5c76844a1c5 Mon Sep 17 00:00:00 2001 From: "Ansgar [Hiajen]" Date: Sat, 22 May 2021 15:09:10 +0200 Subject: [PATCH 2/4] [fix] stuff --- src/main/java/net/saltymc/eaa/EaaMod.java | 8 ++++++++ src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java | 10 +++++++--- .../java/net/saltymc/eaa/mixin/MixinInterface.java | 8 ++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/saltymc/eaa/EaaMod.java b/src/main/java/net/saltymc/eaa/EaaMod.java index e0ba7d2..68045a2 100644 --- a/src/main/java/net/saltymc/eaa/EaaMod.java +++ b/src/main/java/net/saltymc/eaa/EaaMod.java @@ -3,6 +3,8 @@ package net.saltymc.eaa; import net.fabricmc.api.ModInitializer; import net.saltymc.eaa.handler.CommandHandler; import net.saltymc.eaa.handler.HandlerInterface; +import net.saltymc.eaa.mixin.ExampleMixin; +import net.saltymc.eaa.mixin.MixinInterface; import net.saltymc.eaa.util.ResponseEntity; import java.util.ArrayList; @@ -11,9 +13,11 @@ import java.util.List; public class EaaMod implements ModInitializer { private final List handler; + private final List mixins; public EaaMod(){ handler = new ArrayList<>(); + mixins = new ArrayList<>(); } @Override @@ -24,6 +28,10 @@ public class EaaMod implements ModInitializer { System.out.println("EAA Mod initializing..."); + //init Mixin + mixins.add(new ExampleMixin().init(this)); + + //Init CommandHandler handler.add(new CommandHandler()); diff --git a/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java b/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java index d78e435..e68aea6 100644 --- a/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java +++ b/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java @@ -18,10 +18,14 @@ public class ExampleMixin { } */ @Mixin(ClientPlayerEntity.class) -public class ExampleMixin extends MixinInterface { //ClientPlayerEntityMixin +public class ExampleMixin implements MixinInterface { //ClientPlayerEntityMixin - public ExampleMixin(final EaaMod eaaMod){ - super(eaaMod); + private EaaMod eaaMod; + + public MixinInterface init(final EaaMod eaaMod){ + this.eaaMod = eaaMod; + + return this; } diff --git a/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java b/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java index 802d648..b9c6f14 100644 --- a/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java +++ b/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java @@ -2,12 +2,8 @@ package net.saltymc.eaa.mixin; import net.saltymc.eaa.EaaMod; -public abstract class MixinInterface { +public interface MixinInterface { - protected final EaaMod eaaMod; - - MixinInterface(EaaMod eaaMod){ - this.eaaMod = eaaMod; - } + MixinInterface init(final EaaMod eaaMod); } From 116c3142e3d98aaeff0aab668150fc16ae890536 Mon Sep 17 00:00:00 2001 From: "Ansgar [Hiajen]" Date: Sat, 22 May 2021 15:46:39 +0200 Subject: [PATCH 3/4] [fix] stuff working now --- src/main/java/net/saltymc/eaa/EaaMod.java | 23 +++++++++++-------- .../saltymc/eaa/handler/CommandHandler.java | 1 + .../eaa/handler/commands/EaaCommand.java | 11 +++++++++ .../net/saltymc/eaa/mixin/ExampleMixin.java | 17 ++++---------- .../net/saltymc/eaa/mixin/MixinInterface.java | 9 -------- 5 files changed, 30 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/net/saltymc/eaa/mixin/MixinInterface.java diff --git a/src/main/java/net/saltymc/eaa/EaaMod.java b/src/main/java/net/saltymc/eaa/EaaMod.java index 68045a2..722d304 100644 --- a/src/main/java/net/saltymc/eaa/EaaMod.java +++ b/src/main/java/net/saltymc/eaa/EaaMod.java @@ -3,8 +3,6 @@ package net.saltymc.eaa; import net.fabricmc.api.ModInitializer; import net.saltymc.eaa.handler.CommandHandler; import net.saltymc.eaa.handler.HandlerInterface; -import net.saltymc.eaa.mixin.ExampleMixin; -import net.saltymc.eaa.mixin.MixinInterface; import net.saltymc.eaa.util.ResponseEntity; import java.util.ArrayList; @@ -12,12 +10,20 @@ import java.util.List; public class EaaMod implements ModInitializer { + private static EaaMod instance; private final List handler; - private final List mixins; public EaaMod(){ handler = new ArrayList<>(); - mixins = new ArrayList<>(); + } + + public static EaaMod getInstance(){ + if (instance == null) { + instance = new EaaMod(); + instance.onInitialize(); + } + + return instance; } @Override @@ -28,10 +34,6 @@ public class EaaMod implements ModInitializer { System.out.println("EAA Mod initializing..."); - //init Mixin - mixins.add(new ExampleMixin().init(this)); - - //Init CommandHandler handler.add(new CommandHandler()); @@ -40,8 +42,9 @@ public class EaaMod implements ModInitializer { public ResponseEntity onEvent(Object object){ for (HandlerInterface hi : handler) { ResponseEntity handlerResponse = hi.handle(object); - if (handlerResponse.isWasHandled()) - return handlerResponse; // Events are exclusive yet + if (handlerResponse.isWasHandled()) { + return handlerResponse; // Events are exclusive yet + } } return new ResponseEntity(false); diff --git a/src/main/java/net/saltymc/eaa/handler/CommandHandler.java b/src/main/java/net/saltymc/eaa/handler/CommandHandler.java index 81679d3..89feb82 100644 --- a/src/main/java/net/saltymc/eaa/handler/CommandHandler.java +++ b/src/main/java/net/saltymc/eaa/handler/CommandHandler.java @@ -28,6 +28,7 @@ public class CommandHandler implements HandlerInterface { public CommandHandler(){ + LOGGER.info("init CommandHandler"); commands = new ArrayList<>(); CommandHandler.commands.add(new EaaCommand()); diff --git a/src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java b/src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java index 9c3e9eb..54b7db7 100644 --- a/src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java +++ b/src/main/java/net/saltymc/eaa/handler/commands/EaaCommand.java @@ -2,14 +2,25 @@ package net.saltymc.eaa.handler.commands; import net.fabricmc.fabric.api.client.command.v1.FabricClientCommandSource; import net.minecraft.text.Text; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; public class EaaCommand implements Command { private static final String COMMAND = "echo"; private static final boolean INTERCEPT = true; + private static final Logger LOGGER = LogManager.getLogger(); + + public EaaCommand(){ + LOGGER.info("Init EaaCommand"); + } @Override public boolean run( final FabricClientCommandSource cs, String[] args) { + System.out.println("on Command: " + args[0]); + if (!args[0].equalsIgnoreCase(COMMAND)) { return false; } diff --git a/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java b/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java index e68aea6..3236563 100644 --- a/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java +++ b/src/main/java/net/saltymc/eaa/mixin/ExampleMixin.java @@ -4,6 +4,8 @@ import net.minecraft.client.network.ClientPlayerEntity; import net.saltymc.eaa.EaaMod; import net.saltymc.eaa.handler.CommandHandler; import net.saltymc.eaa.util.ResponseEntity; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -18,22 +20,13 @@ public class ExampleMixin { } */ @Mixin(ClientPlayerEntity.class) -public class ExampleMixin implements MixinInterface { //ClientPlayerEntityMixin - - private EaaMod eaaMod; - - public MixinInterface init(final EaaMod eaaMod){ - this.eaaMod = eaaMod; - - return this; - } +public class ExampleMixin { //ClientPlayerEntityMixin + private static final Logger LOGGER = LogManager.getLogger(); @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) private void onSendChatMessage(String message, CallbackInfo info) { - System.out.println("in onSendChatMessage"); - - ResponseEntity responseEntity = eaaMod.onEvent(message); + ResponseEntity responseEntity = EaaMod.getInstance().onEvent(message); if (responseEntity.isInterceptEvent()) info.cancel(); diff --git a/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java b/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java deleted file mode 100644 index b9c6f14..0000000 --- a/src/main/java/net/saltymc/eaa/mixin/MixinInterface.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.saltymc.eaa.mixin; - -import net.saltymc.eaa.EaaMod; - -public interface MixinInterface { - - MixinInterface init(final EaaMod eaaMod); - -} From 33238a32640058518dfd78713b3726b2af7f3851 Mon Sep 17 00:00:00 2001 From: "Ansgar [Hiajen]" Date: Sun, 23 May 2021 00:06:06 +0200 Subject: [PATCH 4/4] add Database concept --- .../resources/datenbank/datenbank_shema.mwb | Bin 0 -> 9577 bytes .../resources/datenbank/datenbank_shema.png | Bin 0 -> 23069 bytes .../resources/datenbank/datenbank_shema.sql | 86 ++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 src/main/resources/datenbank/datenbank_shema.mwb create mode 100644 src/main/resources/datenbank/datenbank_shema.png create mode 100644 src/main/resources/datenbank/datenbank_shema.sql diff --git a/src/main/resources/datenbank/datenbank_shema.mwb b/src/main/resources/datenbank/datenbank_shema.mwb new file mode 100644 index 0000000000000000000000000000000000000000..8ee355f80a294a8afb60012a884ae103cccb1b00 GIT binary patch literal 9577 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/datenbank/datenbank_shema.png b/src/main/resources/datenbank/datenbank_shema.png new file mode 100644 index 0000000000000000000000000000000000000000..579c3647070cde3c5936e0d1f6cdb10e3cd8a79f GIT binary patch literal 23069 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/datenbank/datenbank_shema.sql b/src/main/resources/datenbank/datenbank_shema.sql new file mode 100644 index 0000000..2dae71c --- /dev/null +++ b/src/main/resources/datenbank/datenbank_shema.sql @@ -0,0 +1,86 @@ +-- MySQL Script generated by MySQL Workbench +-- Sun May 23 00:03:01 2021 +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +-- ----------------------------------------------------- +-- Schema mydb +-- ----------------------------------------------------- + +-- ----------------------------------------------------- +-- Schema mydb +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ; +USE `mydb` ; + +-- ----------------------------------------------------- +-- Table `mydb`.`Player` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `mydb`.`Player` ( + `id` INT NOT NULL, + `name` VARCHAR(45) NULL, + `UUID` VARCHAR(36) NOT NULL, + `tag` VARCHAR(45) NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `UUID_UNIQUE` (`UUID` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`Report` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `mydb`.`Report` ( + `Player_id` INT NOT NULL, + `id` INT NOT NULL, + `date` DATE NOT NULL, + `reason` VARCHAR(255) NULL, + `grade` INT NULL, + INDEX `fk_Report_Player_idx` (`Player_id` ASC), + PRIMARY KEY (`Player_id`, `id`), + CONSTRAINT `fk_Report_Player` + FOREIGN KEY (`Player_id`) + REFERENCES `mydb`.`Player` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`Map` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `mydb`.`Map` ( + `id` INT NOT NULL, + `name` VARCHAR(45) NOT NULL, + `Color` VARCHAR(45) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `name_UNIQUE` (`name` ASC)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `mydb`.`Server_Reports` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `mydb`.`Server_Reports` ( + `id` INT NOT NULL, + `date` DATE NOT NULL, + `appeals` VARCHAR(255) NOT NULL, + `grade` INT NULL, + `Server_Reportscol` VARCHAR(45) NULL, + `Player_id` INT NOT NULL, + PRIMARY KEY (`id`, `Player_id`), + INDEX `fk_Server_Reports_Player1_idx` (`Player_id` ASC), + CONSTRAINT `fk_Server_Reports_Player1` + FOREIGN KEY (`Player_id`) + REFERENCES `mydb`.`Player` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;