diff --git a/SpigotCore_Main/src/SpigotCore.properties b/SpigotCore_Main/src/SpigotCore.properties
index 28628df..acb3749 100644
--- a/SpigotCore_Main/src/SpigotCore.properties
+++ b/SpigotCore_Main/src/SpigotCore.properties
@@ -17,47 +17,83 @@
# along with this program. If not, see .
#
-SCHEM_SELECTOR_TITLE={0} auswählen: {1}
-SCHEM_SELECTOR_BACK=§eZurück
-SCHEM_SELECTOR_DIR=§9Ordner
-SCHEM_SELECTOR_RANK=§8Rang {0}
-SCHEM_SELECTOR_OWN=§7Eigene Schematics
-SCHEM_SELECTOR_PUB=§7Public Schematics
-SCHEM_SELECTOR_SEL_DIR=§7Ordner auswählen
-SCHEM_SELECTOR_NEW_DIR=§7Neuer Ordner
-SCHEM_SELECTOR_FILTER=§7Filter
-SCHEM_SELECTOR_SORTING=§7Sortierung
-SCHEM_SELECTOR_SORTING_CURRENT=§7Aktuell: §e{0}
+SCHEM_SELECTOR_TITLE={0} auswählen: {1}
+SCHEM_SELECTOR_BACK=§eZurück
+SCHEM_SELECTOR_DIR=§9Ordner
+SCHEM_SELECTOR_RANK=§8Rang {0}
+SCHEM_SELECTOR_OWN=§7Eigene Schematics
+SCHEM_SELECTOR_PUB=§7Public Schematics
+SCHEM_SELECTOR_SEL_DIR=§7Ordner auswählen
+SCHEM_SELECTOR_NEW_DIR=§7Neuer Ordner
+SCHEM_SELECTOR_FILTER=§7Filter
+SCHEM_SELECTOR_SORTING=§7Sortierung
+SCHEM_SELECTOR_SORTING_CURRENT=§7Aktuell: §e{0}
SCHEM_SELECTOR_SORTING_NAME=Name
SCHEM_SELECTOR_SORTING_TYPE=Schematic-Typ
SCHEM_SELECTOR_SORTING_UPDATE=Letztes Update
-SCHEM_SELECTOR_SORTING_DIRECTION=§7Richtung: §e{0}
+SCHEM_SELECTOR_SORTING_DIRECTION=§7Richtung: §e{0}
SCHEM_SELECTOR_SORTING_ASC=Aufsteigend
SCHEM_SELECTOR_SORTING_DSC=Absteigend
-SCHEM_SELECTOR_ITEM_NAME=§e{0}
-SCHEM_SELECTOR_ITEM_NAME_FILTER=§7{0}
-SCHEM_SELECTOR_ITEM_REPLACE=§e{0}§7
-SCHEM_SELECTOR_ITEM_LORE_TYPE=§7{0}
+SCHEM_SELECTOR_ITEM_NAME=§e{0}
+SCHEM_SELECTOR_ITEM_NAME_FILTER=§7{0}
+SCHEM_SELECTOR_ITEM_REPLACE=§e{0}§7
+SCHEM_SELECTOR_ITEM_LORE_TYPE=§7{0}
SCHEM_SELECTOR_CREATE_DIR_TITLE=Ordner erstellen
SCHEM_SELECTOR_FILTER_TITLE=Filter
SCHEM_SELECTOR_FILTER_ENTER_NAME=Name eingeben
-SCHEM_SELECTOR_FILTER_NAME=§7Nach Namen suchen...
-SCHEM_SELECTOR_FILTER_NAME_SEARCH=§7Suchbegriff: §e{0}
+SCHEM_SELECTOR_FILTER_NAME=§7Nach Namen suchen...
+SCHEM_SELECTOR_FILTER_NAME_SEARCH=§7Suchbegriff: §e{0}
SCHEM_SELECTOR_FILTER_ENTER_OWNER=Besitzer eingeben
-SCHEM_SELECTOR_FILTER_OWNER=§7Nach Besitzer suchen...
-SCHEM_SELECTOR_FILTER_OWNER_SEARCH=§7Besitzer: §e{0}
-SCHEM_SELECTOR_FILTER_SEL_TYPE=Typ wählen...
-SCHEM_SELECTOR_FILTER_TYPE=§7Nach Typ filtern...
-SCHEM_SELECTOR_FILTER_TYPE_SEARCH=§7Typ: §e{0}
-SCHEM_SELECTOR_FILTER_MAT=§7Nach Item filtern...
-SCHEM_SELECTOR_FILTER_MAT_SEARCH=§7Item: §e{0}
-SCHEM_SELECTOR_CANCEL=§eAbbrechen
-SCHEM_SELECTOR_GO=§eSuchen...
+SCHEM_SELECTOR_FILTER_OWNER=§7Nach Besitzer suchen...
+SCHEM_SELECTOR_FILTER_OWNER_SEARCH=§7Besitzer: §e{0}
+SCHEM_SELECTOR_FILTER_SEL_TYPE=Typ wählen...
+SCHEM_SELECTOR_FILTER_TYPE=§7Nach Typ filtern...
+SCHEM_SELECTOR_FILTER_TYPE_SEARCH=§7Typ: §e{0}
+SCHEM_SELECTOR_FILTER_MAT=§7Nach Item filtern...
+SCHEM_SELECTOR_FILTER_MAT_SEARCH=§7Item: §e{0}
+SCHEM_SELECTOR_CANCEL=§eAbbrechen
+SCHEM_SELECTOR_GO=§eSuchen...
SCHEM_SELECTOR_SCHEMATIC=Schematic
SCHEM_SELECTOR_DIRECTORY=Ordner
SCHEM_SELECTOR_SCHEMATIC_NODE=Schematic/Ordner
-MATERIAL_SELECTOR_TITLE=Material auswählen
\ No newline at end of file
+MATERIAL_SELECTOR_TITLE=Material auswählen
+
+BAN_TEAM={0} §e{1} §7wurde von §e{2} {3} §e§lgebannt§8. §7Grund§8: §f{4}
+BAN_PERMA=§7Du bist §epermanent §e§lgebannt§8. §7Grund§8: §e{0}
+BAN_UNTIL=§7Du bist §ebis zum {0} §e§lgebannt§8. §7Grund§8: §e{1}
+UNBAN_ERROR=§cDer Spieler ist nicht gebannt.
+UNBAN=§7Du hast §e{0} §e§lentbannt.
+
+MUTE_TEAM={0} §e{1} §7wurde von §e{2} {3} §e§lgemuted§8. §7Grund§8: §f{4}
+MUTE_PERMA=§7Du bist §epermanent §e§lgemuted§8. §7Grund§8: §e{0}
+MUTE_UNTIL=§7Du bist §ebis zum {0} §e§lgemuted§8. §7Grund§8: §e{1}
+UNMUTE_ERROR=§cDer Spieler ist nicht gemuted.
+UNMUTE=§7Du hast §e{0} §e§lentmuted.
+
+NOSCHEMRECEIVING_TEAM={0} §e{1} §7wurde von §e{2} {3} §7vom §e§lSchematicerhalten ausgeschlossen§8. §7Grund§8: §f{4}
+NOSCHEMRECEIVING_PERMA=§7Du bist §epermanent §7vom Erhalten von §e§lSchematics ausgeschlossen§8. §7Grund§8: §e{0}
+NOSCHEMRECEIVING_UNTIL=§7Du bist §ebis zum {0} §7vom Erhalten von §e§lSchematics ausgeschlossen§8. §7Grund§8: §e{1}
+UNNOSCHEMRECEIVING_ERROR=§cDer Spieler ist nicht vom Erhalten von Schematics ausgeschlossen.
+UNNOSCHEMRECEIVING=§e{0} §7darf nun wieder §e§lSchematics erhalten§8.
+
+NOSCHEMSHARING_TEAM={0} §e{1} §7wurde von §e{2} {3} §7vom §e§lSchematicverteilen ausgeschlossen§8. §7Grund§8: §f{4}
+NOSCHEMSHARING_PERMA=§7Du bist §epermanent §7vom §e§lVerteilen von Schematics§7 ausgeschlossen§8. §7Grund§8: §e{0}
+NOSCHEMSHARING_UNTIL=§7Du bist §ebis zum {0} §7vom §e§lVerteilen von Schematics§7 ausgeschlossen§8. §7Grund§8: §e{1}
+UNNOSCHEMSHARING_ERROR=§cDer Spieler ist nicht vom Verteilen von Schematics ausgeschlossen.
+UNNOSCHEMSHARING=§e{0} §7darf nun wieder §e§lSchematics verteilen§8.
+
+NOSCHEMSUBMITTING_TEAM={0} §e{1} §7wurde von §e{2} {3} §7vom §e§lSchematiceinsenden ausgeschlossen§8. §7Grund§8: §f{4}
+NOSCHEMSUBMITTING_PERMA=§7Du bist §epermanent §7vom §e§lEinsenden von Schematics§7 ausgeschlossen§8. §7Grund§8: §e{0}
+NOSCHEMSUBMITTING_UNTIL=§7Du bist §ebis zum {0} §7vom §e§lEinsenden von Schematics§7 ausgeschlossen§8. §7Grund§8: §e{1}
+UNNOSCHEMSUBMITTING_ERROR=§cDer Spieler ist nicht vom Einsenden von Schematics ausgeschlossen.
+UNNOSCHEMSUBMITTING=§e{0} §7darf nun wieder §e§lSchematis einsenden§8.
+
+NODEVSERVER_TEAM={0} §e{1} §7hat §e{2} §7mit Grund §f{4}§7 zu generft und hat daher §e§lDevserververbot §7erhalten§8, §e{3}
+NODEVSERVER_PERMA=§7Du bist §epermanent §7vom §e§lDevserver §7ausgeschlossen§8. §7Grund§8: §e{0}
+NODEVSERVER_UNTIL=§7Du bist §ebis zum {0} §7vom §e§lDevserver §7ausgeschlossen§8. §7Grund§8: §e{1}
+UNNODEVSERVER_ERROR=§cDer Spieler ist nicht vom Devserver ausgeschlossen.
+UNNODEVSERVER=§e{0} §7darf nun wieder dem §e§lDevserver beitreten§8.
\ No newline at end of file
diff --git a/SpigotCore_Main/src/de/steamwar/sql/Punishment.java b/SpigotCore_Main/src/de/steamwar/sql/Punishment.java
new file mode 100644
index 0000000..0e2bc5b
--- /dev/null
+++ b/SpigotCore_Main/src/de/steamwar/sql/Punishment.java
@@ -0,0 +1,130 @@
+/*
+ This file is a part of the SteamWar software.
+
+ Copyright (C) 2020 SteamWar.de-Serverteam
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+ */
+
+package de.steamwar.sql;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+public class Punishment {
+
+ private static final SQL.Statement getPunishment = new SQL.Statement("SELECT * FROM Punishments WHERE UserId = ? AND Type = ? ORDER BY PunishmentId DESC LIMIT 1");
+ private static final SQL.Statement getPunishments = new SQL.Statement("SELECT * FROM Punishments WHERE PunishmentId IN (SELECT MAX(PunishmentId) FROM Punishments WHERE UserId = ? GROUP BY Type)");
+
+ public static Punishment getPunishmentOfPlayer(int user, PunishmentType type) {
+ return getPunishment.select(rs -> {
+ if (rs.next())
+ return new Punishment(rs);
+ return null;
+ }, user, type.name());
+ }
+
+ public static Map getPunishmentsOfPlayer(int user) {
+ return getPunishments.select(rs -> {
+ Map punishments = new HashMap<>();
+ while (rs.next())
+ punishments.put(PunishmentType.valueOf(rs.getString("Type")), new Punishment(rs));
+ return punishments;
+ }, user);
+ }
+
+ private final Timestamp startTime;
+ private Timestamp endTime;
+ private final PunishmentType type;
+ private final int user;
+ private final int id;
+ private String reason;
+ private final int punisher;
+ private boolean perma;
+
+ private Punishment(ResultSet set) throws SQLException {
+ user = set.getInt("UserId");
+ reason = set.getString("Reason");
+ type = PunishmentType.valueOf(set.getString("Type"));
+ startTime = set.getTimestamp("StartTime");
+ endTime = set.getTimestamp("EndTime");
+ punisher = set.getInt("Punisher");
+ perma = set.getBoolean("Perma");
+ id = set.getInt("PunishmentId");
+ }
+
+ public Timestamp getStartTime() {
+ return startTime;
+ }
+
+ public Timestamp getEndTime() {
+ return endTime;
+ }
+
+ public PunishmentType getType() {
+ return type;
+ }
+
+ public int getUser() {
+ return user;
+ }
+
+ public String getReason() {
+ return reason;
+ }
+
+ public int getPunisher() {
+ return punisher;
+ }
+
+ public boolean isPerma() {
+ return perma;
+ }
+
+ public String getBantime(Timestamp endTime, boolean perma) {
+ if (perma) {
+ return "permanent";
+ } else {
+ return endTime.toLocalDateTime().format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"));
+ }
+ }
+
+ public boolean isCurrent() {
+ return isPerma() || getEndTime().after(new Date());
+ }
+
+ @AllArgsConstructor
+ @Getter
+ public enum PunishmentType {
+ Ban(false, "BAN_TEAM", "BAN_PERMA", "BAN_UNTIL", "UNBAN_ERROR", "UNBAN"),
+ Mute( false, "MUTE_TEAM", "MUTE_PERMA", "MUTE_UNTIL", "UNMUTE_ERROR", "UNMUTE"),
+ NoSchemReceiving(false, "NOSCHEMRECEIVING_TEAM", "NOSCHEMRECEIVING_PERMA", "NOSCHEMRECEIVING_UNTIL", "UNNOSCHEMRECEIVING_ERROR", "UNNOSCHEMRECEIVING"),
+ NoSchemSharing(false, "NOSCHEMSHARING_TEAM", "NOSCHEMSHARING_PERMA", "NOSCHEMSHARING_UNTIL", "UNNOSCHEMSHARING_ERROR", "UNNOSCHEMSHARING"),
+ NoSchemSubmitting(true, "NOSCHEMSUBMITTING_TEAM", "NOSCHEMSUBMITTING_PERMA", "NOSCHEMSUBMITTING_UNTIL", "UNNOSCHEMSUBMITTING_ERROR", "UNNOSCHEMSUBMITTING"),
+ NoDevServer(true, "NODEVSERVER_TEAM", "NODEVSERVER_PERMA", "NODEVSERVER_UNTIL", "UNNODEVSERVER_ERROR", "UNNODEVSERVER");
+
+ private final boolean needsAdmin;
+ private final String teamMessage;
+ private final String playerMessagePerma;
+ private final String playerMessageUntil;
+ private final String usageNotPunished;
+ private final String unpunishmentMessage;
+ }
+}