From 80cf17d14a36e77042cdea5f149fe6e8398d371e Mon Sep 17 00:00:00 2001
From: hexlocation pc <hex@clatter.cc>
Date: Wed, 24 Jul 2024 12:19:32 +0200
Subject: [PATCH 01/10] Add discord bot support

---
 pom.xml                                       | 16 ++++
 .../java/rip/iwakura/civilcore/CivilCore.java | 12 +++
 .../java/rip/iwakura/civilcore/Court.java     | 64 ++++++++++++++++
 .../rip/iwakura/civilcore/PlayerHandler.java  |  2 +
 .../civilcore/commands/TeamCommand.java       |  2 +-
 .../iwakura/civilcore/discord/Discord.java    | 73 +++++++++++++++++++
 .../civilcore/discord/MessageReceive.java     | 22 ++++++
 .../iwakura/civilcore/types/CoreCommand.java  |  7 ++
 src/main/resources/plugin.yml                 |  4 +
 9 files changed, 201 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/rip/iwakura/civilcore/Court.java
 create mode 100644 src/main/java/rip/iwakura/civilcore/discord/Discord.java
 create mode 100644 src/main/java/rip/iwakura/civilcore/discord/MessageReceive.java
 create mode 100644 src/main/java/rip/iwakura/civilcore/types/CoreCommand.java

diff --git a/pom.xml b/pom.xml
index 8fd1e50..1447579 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,9 +24,25 @@
             <id>papermc</id>
             <url>https://repo.papermc.io/repository/maven-public/</url>
         </repository>
+        <repository>
+          <id>jitpack.io</id>
+          <url>https://jitpack.io</url>
+        </repository>
     </repositories>
 
     <dependencies>
+      <dependency>
+        <groupId>net.dv8tion</groupId>
+        <artifactId>JDA</artifactId>
+        <version>5.0.1</version>         
+        <scope>compile</scope>
+      </dependency>
+      <dependency>
+        <groupId>club.minnced</groupId>
+        <artifactId>discord-webhooks</artifactId>
+        <version>0.1.6</version>
+        <scope>compile</scope>
+      </dependency>
         <dependency>
           <groupId>org.postgresql</groupId>
           <artifactId>postgresql</artifactId>
diff --git a/src/main/java/rip/iwakura/civilcore/CivilCore.java b/src/main/java/rip/iwakura/civilcore/CivilCore.java
index efa312e..cf40b56 100644
--- a/src/main/java/rip/iwakura/civilcore/CivilCore.java
+++ b/src/main/java/rip/iwakura/civilcore/CivilCore.java
@@ -4,18 +4,28 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 
 import org.bukkit.Bukkit;
+import org.bukkit.WorldCreator;
 import org.bukkit.plugin.java.JavaPlugin;
 
 import net.md_5.bungee.api.ChatColor;
 import rip.iwakura.civilcore.commands.TeamCommand;
+import rip.iwakura.civilcore.discord.Discord;
 
 public class CivilCore extends JavaPlugin {
   public Database db = new Database();
+  public Discord bot;
 
   @Override
   public void onEnable() {
     this.saveDefaultConfig();
 
+    this.bot = new Discord(getConfig().getString("discord.token"), getConfig().getString("discord.channel"), this);
+    this.bot.initialize();
+    
+    if (Bukkit.getWorld("court") == null) {
+      new WorldCreator("court").createWorld();
+    }
+
     try {
 		  Class.forName("org.postgresql.Driver");
 	  } catch (ClassNotFoundException e) {
@@ -28,6 +38,8 @@ public class CivilCore extends JavaPlugin {
 		  e.printStackTrace();
 	  }
     getServer().getPluginManager().registerEvents(new PlayerHandler(this), this);
+    getServer().getPluginManager().registerEvents(new Court(), this);
     this.getCommand("team").setExecutor(new TeamCommand(this));
+    this.getCommand("court").setExecutor(new Court());
   }
 }
diff --git a/src/main/java/rip/iwakura/civilcore/Court.java b/src/main/java/rip/iwakura/civilcore/Court.java
new file mode 100644
index 0000000..30fd160
--- /dev/null
+++ b/src/main/java/rip/iwakura/civilcore/Court.java
@@ -0,0 +1,64 @@
+package rip.iwakura.civilcore;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.bukkit.event.block.BlockBurnEvent;
+import org.bukkit.event.block.BlockPlaceEvent;
+import org.bukkit.event.block.BlockSpreadEvent;
+
+public class Court implements Listener,CommandExecutor{
+  private World court_world = Bukkit.getWorld("court");
+
+  private Location court_location = new Location(court_world, 4.5, 70.0, 0.5, -90f, 1.0f);
+
+  @EventHandler
+  public void PlayerBreak(BlockBreakEvent e) {
+    if (e.getPlayer().isOp()) return;
+    if (e.getBlock().getWorld().getName().equals(court_world.getName())) e.setCancelled(true);
+  }
+  @EventHandler
+  public void PlayerPlace(BlockPlaceEvent e) {
+    if (e.getPlayer().isOp()) return;
+    if (e.getBlock().getWorld().getName().equals(court_world.getName())) e.setCancelled(true);
+  }
+  @EventHandler
+  public void PlayerBurn(BlockBurnEvent e) {
+    if (e.getBlock().getWorld().getName().equals(court_world.getName())) e.setCancelled(true);
+  }
+  @EventHandler
+  public void FireSpread(BlockSpreadEvent e) {
+    if (e.getBlock().getWorld().getName().equals(court_world.getName())) e.setCancelled(true);
+  }
+  @Override
+  public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+    if (!(sender instanceof Player)) {
+      sender.sendMessage("Non-player type.");
+      return true;
+    }
+
+    Player p = (Player) sender;
+
+    switch (args[0]) {
+      case "enter":
+        p.teleport(court_location);
+        break;
+      case "leave":
+        Location loc = p.getBedSpawnLocation();
+        if (loc == null) {
+          loc = Bukkit.getWorld("world").getSpawnLocation();
+        }
+        p.teleport(loc);
+        break;
+    }
+    return true;
+  }
+
+}
diff --git a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
index 15cc9ac..219cfc2 100644
--- a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
+++ b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
@@ -31,6 +31,8 @@ public class PlayerHandler implements Listener {
     String prefix = dbPlayer.team.prefix == null ? "" : ChatColor.translateAlternateColorCodes('&', dbPlayer.team.prefix) + " ";
 
     Bukkit.broadcastMessage(String.format("%s%s: %s", prefix, player_name, e.getMessage()));
+
+    civilCore.bot.sendMessage(e);
   }
   @EventHandler
   public void PlayerJoinEvent(PlayerJoinEvent e) {
diff --git a/src/main/java/rip/iwakura/civilcore/commands/TeamCommand.java b/src/main/java/rip/iwakura/civilcore/commands/TeamCommand.java
index 0e1a282..66040dd 100644
--- a/src/main/java/rip/iwakura/civilcore/commands/TeamCommand.java
+++ b/src/main/java/rip/iwakura/civilcore/commands/TeamCommand.java
@@ -22,7 +22,7 @@ public class TeamCommand implements CommandExecutor {
 
   @Override
   public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-    args = Utils.parser(args).toArray(new String[args.length]);
+    args = Utils.parser(args).toArray(new String[0]);
 
     if(args.length == 0) {
       sender.sendMessage(ChatColor.RED + "Usage: /team <create | destroy | add | remove | list> [options]");
diff --git a/src/main/java/rip/iwakura/civilcore/discord/Discord.java b/src/main/java/rip/iwakura/civilcore/discord/Discord.java
new file mode 100644
index 0000000..85c9fb2
--- /dev/null
+++ b/src/main/java/rip/iwakura/civilcore/discord/Discord.java
@@ -0,0 +1,73 @@
+package rip.iwakura.civilcore.discord;
+
+import java.util.EnumSet;
+
+import org.bukkit.Bukkit;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.checkerframework.common.reflection.qual.GetConstructor;
+
+import club.minnced.discord.webhook.WebhookClient;
+import club.minnced.discord.webhook.WebhookClientBuilder;
+import club.minnced.discord.webhook.send.WebhookMessage;
+import club.minnced.discord.webhook.send.WebhookMessageBuilder;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.JDABuilder;
+import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+import net.dv8tion.jda.api.requests.GatewayIntent;
+import rip.iwakura.civilcore.CivilCore;
+import net.dv8tion.jda.api.events.session.ReadyEvent;
+
+public class Discord extends ListenerAdapter {
+  private String token;
+  private CivilCore civilCore;
+
+  public String channelId;
+
+  private TextChannel channel;
+  private WebhookClient webhook;
+
+  public JDA bot;
+
+  private EnumSet<GatewayIntent> intents = EnumSet.of(GatewayIntent.GUILD_MESSAGES, GatewayIntent.MESSAGE_CONTENT, GatewayIntent.GUILD_WEBHOOKS);
+  
+  public Discord(String token, String channelId, CivilCore civilCore){
+    this.civilCore = civilCore;
+    this.channelId = channelId;
+    this.token = token;
+  }
+
+  public void initialize() {
+    this.bot = JDABuilder.createLight(token, intents)
+      .addEventListeners(new MessageReceive(civilCore))
+      .addEventListeners(this)
+      .build();
+  }
+
+  public void sendMessage(AsyncPlayerChatEvent e) {
+    String player_name = e.getPlayer().getName();
+    WebhookMessageBuilder builder = new WebhookMessageBuilder()
+      .setUsername(player_name)
+      .setAvatarUrl(String.format("https://mc-heads.net/avatar/%s", player_name))
+      .setContent(e.getMessage());
+    webhook.send(builder.build());
+    //channel.sendMessage(String.format("%s: %s", e.getPlayer().getName(), e.getMessage())).complete();
+  }
+
+  @Override
+  public void onReady(ReadyEvent e) {
+	  this.channel = bot.getTextChannelById(channelId);
+    String webhook_token = civilCore.getConfig().getString("discord.webhook.token");
+    Long webhook_id = Long.parseLong(civilCore.getConfig().getString("discord.webhook.id"));
+    if (webhook_token != null) {
+      this.webhook = new WebhookClientBuilder(webhook_id, webhook_token).build();
+    } else {
+      channel.createWebhook("CivilBot").queue((hook) -> {
+        civilCore.getConfig().set("discord.webhook.id", hook.getId());
+        civilCore.getConfig().set("discord.webhook.token", hook.getToken());
+        civilCore.saveConfig();
+        this.webhook = new WebhookClientBuilder(Long.parseLong(hook.getId()), hook.getToken()).build();
+      });
+    }
+  }
+}
diff --git a/src/main/java/rip/iwakura/civilcore/discord/MessageReceive.java b/src/main/java/rip/iwakura/civilcore/discord/MessageReceive.java
new file mode 100644
index 0000000..a2a5617
--- /dev/null
+++ b/src/main/java/rip/iwakura/civilcore/discord/MessageReceive.java
@@ -0,0 +1,22 @@
+package rip.iwakura.civilcore.discord;
+
+import org.bukkit.Bukkit;
+
+import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
+import net.dv8tion.jda.api.hooks.ListenerAdapter;
+import net.md_5.bungee.api.ChatColor;
+import rip.iwakura.civilcore.CivilCore;
+
+public class MessageReceive extends ListenerAdapter {
+  private CivilCore civilCore;
+
+  public MessageReceive (CivilCore civilCore) {
+    this.civilCore = civilCore;
+  }
+
+  @Override
+  public void onMessageReceived(MessageReceivedEvent e) {
+    if (e.getAuthor().isBot()) return;
+    if(e.getChannel().getId().equals(civilCore.bot.channelId)) Bukkit.broadcastMessage(String.format("%sDiscord%s %s: %s", ChatColor.BLUE, ChatColor.RESET, e.getAuthor().getName(), e.getMessage()));
+  }
+}
diff --git a/src/main/java/rip/iwakura/civilcore/types/CoreCommand.java b/src/main/java/rip/iwakura/civilcore/types/CoreCommand.java
new file mode 100644
index 0000000..9f24454
--- /dev/null
+++ b/src/main/java/rip/iwakura/civilcore/types/CoreCommand.java
@@ -0,0 +1,7 @@
+package rip.iwakura.civilcore.types;
+
+import org.bukkit.command.CommandSender;
+
+public interface CoreCommand {
+  public boolean run(CommandSender sender);
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 7152f6b..097916b 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -8,3 +8,7 @@ commands:
   team:
     description: Team Manager
     usage: /<command> <create|destroy|add|remove>
+    permission: "civil.teams"
+  court:
+    description: Court Manager 
+    usage: /<command> <enter|leave>

From 55fc458c024116ee4ee4de714637529408dc5d14 Mon Sep 17 00:00:00 2001
From: hexlocation pc <hex@clatter.cc>
Date: Wed, 24 Jul 2024 19:32:22 +0200
Subject: [PATCH 02/10] fix: court bug which kills yall & disable pvp

---
 src/main/java/rip/iwakura/civilcore/Court.java  | 17 +++++++++++++++++
 .../rip/iwakura/civilcore/discord/Discord.java  |  2 +-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/main/java/rip/iwakura/civilcore/Court.java b/src/main/java/rip/iwakura/civilcore/Court.java
index 30fd160..b2a7fc2 100644
--- a/src/main/java/rip/iwakura/civilcore/Court.java
+++ b/src/main/java/rip/iwakura/civilcore/Court.java
@@ -13,12 +13,29 @@ import org.bukkit.event.block.BlockBreakEvent;
 import org.bukkit.event.block.BlockBurnEvent;
 import org.bukkit.event.block.BlockPlaceEvent;
 import org.bukkit.event.block.BlockSpreadEvent;
+import org.bukkit.event.entity.EntityDamageEvent;
+import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
 
 public class Court implements Listener,CommandExecutor{
   private World court_world = Bukkit.getWorld("court");
 
   private Location court_location = new Location(court_world, 4.5, 70.0, 0.5, -90f, 1.0f);
 
+  @EventHandler
+  public void PlayerHurt(EntityDamageEvent e) {
+    if (!(e.getEntity() instanceof Player)) return;
+    Player p = (Player) e.getEntity();
+
+    if (!p.getLocation().getWorld().getName().equals("court")) return;
+
+    e.setCancelled(true);
+
+    if (e.getCause() == DamageCause.VOID) {
+      p.teleport(court_location);
+      return;
+    }
+  }
+
   @EventHandler
   public void PlayerBreak(BlockBreakEvent e) {
     if (e.getPlayer().isOp()) return;
diff --git a/src/main/java/rip/iwakura/civilcore/discord/Discord.java b/src/main/java/rip/iwakura/civilcore/discord/Discord.java
index 85c9fb2..49f1384 100644
--- a/src/main/java/rip/iwakura/civilcore/discord/Discord.java
+++ b/src/main/java/rip/iwakura/civilcore/discord/Discord.java
@@ -58,8 +58,8 @@ public class Discord extends ListenerAdapter {
   public void onReady(ReadyEvent e) {
 	  this.channel = bot.getTextChannelById(channelId);
     String webhook_token = civilCore.getConfig().getString("discord.webhook.token");
-    Long webhook_id = Long.parseLong(civilCore.getConfig().getString("discord.webhook.id"));
     if (webhook_token != null) {
+      Long webhook_id = Long.parseLong(civilCore.getConfig().getString("discord.webhook.id"));
       this.webhook = new WebhookClientBuilder(webhook_id, webhook_token).build();
     } else {
       channel.createWebhook("CivilBot").queue((hook) -> {

From fc27e415f4575ff51234ea53d4da7f69f8581b78 Mon Sep 17 00:00:00 2001
From: hexlocation pc <hex@clatter.cc>
Date: Wed, 24 Jul 2024 20:32:05 +0200
Subject: [PATCH 03/10] feat: add team chat func + handle water bucket in court

---
 .../java/rip/iwakura/civilcore/CivilCore.java |  5 ++
 .../java/rip/iwakura/civilcore/Court.java     |  8 ++++
 .../java/rip/iwakura/civilcore/Database.java  | 11 +++++
 .../rip/iwakura/civilcore/PlayerHandler.java  | 27 +++++++++--
 .../civilcore/commands/TeamChatCommand.java   | 48 +++++++++++++++++++
 src/main/resources/plugin.yml                 |  3 ++
 6 files changed, 99 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java

diff --git a/src/main/java/rip/iwakura/civilcore/CivilCore.java b/src/main/java/rip/iwakura/civilcore/CivilCore.java
index cf40b56..137e0e1 100644
--- a/src/main/java/rip/iwakura/civilcore/CivilCore.java
+++ b/src/main/java/rip/iwakura/civilcore/CivilCore.java
@@ -2,18 +2,22 @@ package rip.iwakura.civilcore;
 
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.HashMap;
 
 import org.bukkit.Bukkit;
 import org.bukkit.WorldCreator;
+import org.bukkit.entity.Player;
 import org.bukkit.plugin.java.JavaPlugin;
 
 import net.md_5.bungee.api.ChatColor;
+import rip.iwakura.civilcore.commands.TeamChatCommand;
 import rip.iwakura.civilcore.commands.TeamCommand;
 import rip.iwakura.civilcore.discord.Discord;
 
 public class CivilCore extends JavaPlugin {
   public Database db = new Database();
   public Discord bot;
+  public ArrayList<Player> teamChatRegister = new ArrayList<>();
 
   @Override
   public void onEnable() {
@@ -41,5 +45,6 @@ public class CivilCore extends JavaPlugin {
     getServer().getPluginManager().registerEvents(new Court(), this);
     this.getCommand("team").setExecutor(new TeamCommand(this));
     this.getCommand("court").setExecutor(new Court());
+    this.getCommand("tc").setExecutor(new TeamChatCommand(this));
   }
 }
diff --git a/src/main/java/rip/iwakura/civilcore/Court.java b/src/main/java/rip/iwakura/civilcore/Court.java
index b2a7fc2..b0e723a 100644
--- a/src/main/java/rip/iwakura/civilcore/Court.java
+++ b/src/main/java/rip/iwakura/civilcore/Court.java
@@ -15,12 +15,20 @@ import org.bukkit.event.block.BlockPlaceEvent;
 import org.bukkit.event.block.BlockSpreadEvent;
 import org.bukkit.event.entity.EntityDamageEvent;
 import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
+import org.bukkit.event.player.PlayerBucketEmptyEvent;
 
 public class Court implements Listener,CommandExecutor{
   private World court_world = Bukkit.getWorld("court");
 
   private Location court_location = new Location(court_world, 4.5, 70.0, 0.5, -90f, 1.0f);
 
+  @EventHandler
+  public void PlayerPlaceWater(PlayerBucketEmptyEvent e) {
+    Player p = (Player) e.getPlayer();
+    if (!p.getLocation().getWorld().getName().equals("court")) return;
+    e.setCancelled(true);
+  }
+
   @EventHandler
   public void PlayerHurt(EntityDamageEvent e) {
     if (!(e.getEntity() instanceof Player)) return;
diff --git a/src/main/java/rip/iwakura/civilcore/Database.java b/src/main/java/rip/iwakura/civilcore/Database.java
index 4fe2e86..044fc05 100644
--- a/src/main/java/rip/iwakura/civilcore/Database.java
+++ b/src/main/java/rip/iwakura/civilcore/Database.java
@@ -82,6 +82,17 @@ public class Database {
     rs.close();
   }
 
+  public List<DbPlayer> getPlayersInTeam(String team_name) {
+    List<DbPlayer> filtered = players.stream().filter(
+        s -> {
+          if (s.team.name == null) return false;
+          return s.team.name.equals(team_name);
+        })
+      .collect(Collectors.toList());
+    if(filtered.isEmpty()) return null;
+    return filtered;
+  }
+
   public void refreshPlayers() throws SQLException {
     players.clear();
     String sql = "SELECT players.NAME AS player_name, teams.NAME AS team_name, teams.TEAM_ID as t_team_id, teams.PREFIX AS team_prefix " +
diff --git a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
index 219cfc2..07eca75 100644
--- a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
+++ b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
@@ -1,6 +1,7 @@
 package rip.iwakura.civilcore;
 
 import java.sql.SQLException;
+import java.util.List;
 
 import org.bukkit.Bukkit;
 import org.bukkit.entity.Player;
@@ -26,14 +27,34 @@ public class PlayerHandler implements Listener {
 
     Player p = e.getPlayer();
     String player_name = p.getName();
+    boolean inTeamChat = civilCore.teamChatRegister.contains(p);
 
     DbPlayer dbPlayer = civilCore.db.getPlayerByName(player_name);
-    String prefix = dbPlayer.team.prefix == null ? "" : ChatColor.translateAlternateColorCodes('&', dbPlayer.team.prefix) + " ";
+    String prefix = (inTeamChat ? ChatColor.DARK_BLUE + "TC " + ChatColor.RESET : "") 
+      + (dbPlayer.team.prefix == null ?
+        "" : 
+        ChatColor.translateAlternateColorCodes('&', dbPlayer.team.prefix) + " ");
+    String message = String.format("%s%s: %s", prefix, player_name, e.getMessage()); 
 
-    Bukkit.broadcastMessage(String.format("%s%s: %s", prefix, player_name, e.getMessage()));
+    if (!inTeamChat) {
+      Bukkit.broadcastMessage(message);
+      civilCore.bot.sendMessage(e);
+    } else {
+      List<DbPlayer> players = civilCore.db.getPlayersInTeam(dbPlayer.team.name);
+
+      if (players == null) return;
+
+      for (DbPlayer team_dbp : players) {
+        Player team_p = Bukkit.getPlayer(team_dbp.name);
+
+        if (team_p == null) continue;
+
+        team_p.sendMessage(message);
+      }
+    }
 
-    civilCore.bot.sendMessage(e);
   }
+
   @EventHandler
   public void PlayerJoinEvent(PlayerJoinEvent e) {
     Player p = e.getPlayer();
diff --git a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
new file mode 100644
index 0000000..0a729e0
--- /dev/null
+++ b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
@@ -0,0 +1,48 @@
+package rip.iwakura.civilcore.commands;
+
+import java.sql.SQLException;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.player.PlayerEvent;
+
+import net.md_5.bungee.api.ChatColor;
+import rip.iwakura.civilcore.Utils;
+import rip.iwakura.civilcore.CivilCore;
+import rip.iwakura.civilcore.types.DbPlayer;
+import rip.iwakura.civilcore.types.Team;
+
+public class TeamChatCommand implements CommandExecutor {
+  private CivilCore civilCore = null;
+
+  public TeamChatCommand(CivilCore civilCore) {
+    this.civilCore = civilCore;
+  }
+
+  @Override
+  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+    args = Utils.parser(args).toArray(new String[0]);
+
+    if (!(sender instanceof Player)) return true;
+
+    Player p = (Player) sender;
+
+    if (civilCore.teamChatRegister.contains(p)) {
+      civilCore.teamChatRegister.remove(p);
+      p.sendMessage(ChatColor.RED + "Team chat has been disabled.");
+      return true;
+    }
+
+    if (civilCore.db.getPlayerByName(p.getName()).team.name == null) {
+      p.sendMessage(ChatColor.RED + "You aren't in a team :(");
+      return true;
+    }
+    civilCore.teamChatRegister.add(p);
+    p.sendMessage(ChatColor.GREEN + "Team chat has been enabled.");
+
+    return true;
+  }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 097916b..529c1fa 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -12,3 +12,6 @@ commands:
   court:
     description: Court Manager 
     usage: /<command> <enter|leave>
+  tc:
+    description: Team Chat 
+    usage: /<command>

From 08cfd82d093849041877d034e37ccbf25ec36ce9 Mon Sep 17 00:00:00 2001
From: grng <36968271+grngxd@users.noreply.github.com>
Date: Thu, 25 Jul 2024 00:35:52 +0100
Subject: [PATCH 04/10] code that i havnt tested, gn chat

---
 build.ps1                                     | 10 ++++++
 .../civilcore/commands/TeamChatCommand.java   | 34 +++++++++++++++++--
 2 files changed, 41 insertions(+), 3 deletions(-)
 create mode 100644 build.ps1

diff --git a/build.ps1 b/build.ps1
new file mode 100644
index 0000000..65f7076
--- /dev/null
+++ b/build.ps1
@@ -0,0 +1,10 @@
+# Check if the test_server directory exists, if not, create it
+if (-not (Test-Path -Path test_server)) {
+    New-Item -ItemType Directory -Path test_server
+}
+
+# mvn clean package dependency:copy -DskipTests -DoutputDirectory=test_server/plugins
+
+Set-Location -Path test_server
+java -jar server.jar -nogui
+Set-Location -Path ..
\ No newline at end of file
diff --git a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
index 0a729e0..c931b6a 100644
--- a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
+++ b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
@@ -30,9 +30,9 @@ public class TeamChatCommand implements CommandExecutor {
 
     Player p = (Player) sender;
 
-    if (civilCore.teamChatRegister.contains(p)) {
+    /*if (civilCore.teamChatRegister.contains(p)) {
       civilCore.teamChatRegister.remove(p);
-      p.sendMessage(ChatColor.RED + "Team chat has been disabled.");
+      p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "GLOBAL" + ChatColor.GREEN + " channel");
       return true;
     }
 
@@ -41,7 +41,35 @@ public class TeamChatCommand implements CommandExecutor {
       return true;
     }
     civilCore.teamChatRegister.add(p);
-    p.sendMessage(ChatColor.GREEN + "Team chat has been enabled.");
+    p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "TEAM" + ChatColor.GREEN + " channel");*/
+
+    // /c [msg] -> if team chat toggled: broadcast to global chat, if global chat toggled send to team
+    // /tc or /c -> switch between global chat & team chat
+
+    if (args.length == 0) {
+      if (civilCore.teamChatRegister.contains(p)) {
+        civilCore.teamChatRegister.remove(p);
+        p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "GLOBAL" + ChatColor.GREEN + " channel");
+        return true;
+      } else {
+        civilCore.teamChatRegister.add(p);
+        p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "TEAM" + ChatColor.GREEN + " channel");
+        return true;
+      }
+    }
+
+    String message = String.join(" ", args);
+    if (civilCore.teamChatRegister.contains(p)) {
+      civilCore.teamChatRegister.remove(p);
+      Bukkit.broadcastMessage(ChatColor.DARK_GREEN + "TEAM > " + ChatColor.GREEN + p.getName() + ": " + message);
+      civilCore.teamChatRegister.add(p);
+    } else {
+      civilCore.teamChatRegister.add(p);
+      Bukkit.broadcastMessage(p.getName() + ": " + message);
+      civilCore.teamChatRegister.remove(p);
+    }
+
+
 
     return true;
   }

From d10e195b35bd4a678aa9bcdfb9076a93e675a5f2 Mon Sep 17 00:00:00 2001
From: grng <36968271+grngxd@users.noreply.github.com>
Date: Thu, 25 Jul 2024 00:41:36 +0100
Subject: [PATCH 05/10] done (untested code)

---
 .../rip/iwakura/civilcore/PlayerHandler.java  |  4 +-
 .../civilcore/commands/TeamChatCommand.java   | 38 ++++---------------
 2 files changed, 10 insertions(+), 32 deletions(-)

diff --git a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
index 07eca75..f3e37bc 100644
--- a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
+++ b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
@@ -15,7 +15,7 @@ import rip.iwakura.civilcore.types.DbPlayer;
 
 public class PlayerHandler implements Listener {
 
-  private CivilCore civilCore = null;
+  private final CivilCore civilCore;
 
   public PlayerHandler(CivilCore civilCore) {
     this.civilCore = civilCore;
@@ -33,7 +33,7 @@ public class PlayerHandler implements Listener {
     String prefix = (inTeamChat ? ChatColor.DARK_BLUE + "TC " + ChatColor.RESET : "") 
       + (dbPlayer.team.prefix == null ?
         "" : 
-        ChatColor.translateAlternateColorCodes('&', dbPlayer.team.prefix) + " ");
+        ChatColor.translateAlternateColorCodes('&', "[" + dbPlayer.team.prefix + "]") + " ");
     String message = String.format("%s%s: %s", prefix, player_name, e.getMessage()); 
 
     if (!inTeamChat) {
diff --git a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
index c931b6a..5da2f3f 100644
--- a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
+++ b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
@@ -1,61 +1,39 @@
 package rip.iwakura.civilcore.commands;
 
-import java.sql.SQLException;
-
 import org.bukkit.Bukkit;
 import org.bukkit.command.Command;
 import org.bukkit.command.CommandExecutor;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
-import org.bukkit.event.player.PlayerEvent;
 
 import net.md_5.bungee.api.ChatColor;
+import org.jetbrains.annotations.NotNull;
 import rip.iwakura.civilcore.Utils;
 import rip.iwakura.civilcore.CivilCore;
-import rip.iwakura.civilcore.types.DbPlayer;
-import rip.iwakura.civilcore.types.Team;
+
+import java.util.Objects;
 
 public class TeamChatCommand implements CommandExecutor {
-  private CivilCore civilCore = null;
+  private final CivilCore civilCore;
 
   public TeamChatCommand(CivilCore civilCore) {
     this.civilCore = civilCore;
   }
 
   @Override
-  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-    args = Utils.parser(args).toArray(new String[0]);
-
-    if (!(sender instanceof Player)) return true;
-
-    Player p = (Player) sender;
-
-    /*if (civilCore.teamChatRegister.contains(p)) {
-      civilCore.teamChatRegister.remove(p);
-      p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "GLOBAL" + ChatColor.GREEN + " channel");
-      return true;
-    }
-
-    if (civilCore.db.getPlayerByName(p.getName()).team.name == null) {
-      p.sendMessage(ChatColor.RED + "You aren't in a team :(");
-      return true;
-    }
-    civilCore.teamChatRegister.add(p);
-    p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "TEAM" + ChatColor.GREEN + " channel");*/
-
-    // /c [msg] -> if team chat toggled: broadcast to global chat, if global chat toggled send to team
-    // /tc or /c -> switch between global chat & team chat
+  public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
+    args = Objects.requireNonNull(Utils.parser(args)).toArray(new String[0]);
 
+    if (!(sender instanceof Player p)) return true;
     if (args.length == 0) {
       if (civilCore.teamChatRegister.contains(p)) {
         civilCore.teamChatRegister.remove(p);
         p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "GLOBAL" + ChatColor.GREEN + " channel");
-        return true;
       } else {
         civilCore.teamChatRegister.add(p);
         p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "TEAM" + ChatColor.GREEN + " channel");
-        return true;
       }
+        return true;
     }
 
     String message = String.join(" ", args);

From ec97defd6ab8b884da95498f874f6d7e439e48d6 Mon Sep 17 00:00:00 2001
From: grng <36968271+grngxd@users.noreply.github.com>
Date: Thu, 25 Jul 2024 00:48:39 +0100
Subject: [PATCH 06/10] a

---
 .idea/.gitignore          |  3 +++
 .idea/compiler.xml        | 13 +++++++++++++
 .idea/discord.xml         |  7 +++++++
 .idea/encodings.xml       |  7 +++++++
 .idea/jarRepositories.xml | 35 +++++++++++++++++++++++++++++++++++
 .idea/misc.xml            | 12 ++++++++++++
 .idea/modules.xml         |  8 ++++++++
 .idea/vcs.xml             |  6 ++++++
 CivilCore.iml             | 13 +++++++++++++
 9 files changed, 104 insertions(+)
 create mode 100644 .idea/.gitignore
 create mode 100644 .idea/compiler.xml
 create mode 100644 .idea/discord.xml
 create mode 100644 .idea/encodings.xml
 create mode 100644 .idea/jarRepositories.xml
 create mode 100644 .idea/misc.xml
 create mode 100644 .idea/modules.xml
 create mode 100644 .idea/vcs.xml
 create mode 100644 CivilCore.iml

diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..22d1c4f
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="CivilCore" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/discord.xml b/.idea/discord.xml
new file mode 100644
index 0000000..d8e9561
--- /dev/null
+++ b/.idea/discord.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DiscordProjectSettings">
+    <option name="show" value="PROJECT_FILES" />
+    <option name="description" value="" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..aa00ffa
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..680f95b
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jitpack.io" />
+      <option name="name" value="jitpack.io" />
+      <option name="url" value="https://jitpack.io" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="spigot-repo" />
+      <option name="name" value="spigot-repo" />
+      <option name="url" value="https://hub.spigotmc.org/nexus/content/repositories/snapshots/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="papermc" />
+      <option name="name" value="papermc" />
+      <option name="url" value="https://repo.papermc.io/repository/maven-public/" />
+    </remote-repository>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..6546f14
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="corretto-21" project-jdk-type="JavaSDK" />
+</project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..787efec
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/CivilCore.iml" filepath="$PROJECT_DIR$/CivilCore.iml" />
+    </modules>
+  </component>
+</project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/CivilCore.iml b/CivilCore.iml
new file mode 100644
index 0000000..9cb719e
--- /dev/null
+++ b/CivilCore.iml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module version="4">
+  <component name="FacetManager">
+    <facet type="minecraft" name="Minecraft">
+      <configuration>
+        <autoDetectTypes>
+          <platformType>BUKKIT</platformType>
+        </autoDetectTypes>
+        <projectReimportVersion>1</projectReimportVersion>
+      </configuration>
+    </facet>
+  </component>
+</module>
\ No newline at end of file

From 160677ff824171c7e18d087d82707bdc0cb68c7d Mon Sep 17 00:00:00 2001
From: grng <36968271+grngxd@users.noreply.github.com>
Date: Thu, 25 Jul 2024 10:32:25 +0100
Subject: [PATCH 07/10] restyled team chat (buggy do not use)

---
 db.ps1                                                 | 2 ++
 docker-compose.yml                                     | 8 ++++++++
 pom.xml                                                | 2 +-
 src/main/java/rip/iwakura/civilcore/PlayerHandler.java | 6 +++---
 4 files changed, 14 insertions(+), 4 deletions(-)
 create mode 100644 db.ps1
 create mode 100644 docker-compose.yml

diff --git a/db.ps1 b/db.ps1
new file mode 100644
index 0000000..01fddb1
--- /dev/null
+++ b/db.ps1
@@ -0,0 +1,2 @@
+docker-compose up
+docker ps
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..5765784
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,8 @@
+version: '3'
+services:
+  civil_test_db:
+    environment:
+      - POSTGRES_PASSWORD=TEST123
+    image: postgres:16.3
+    ports:
+      - 5432:5432
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 1447579..ca26969 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
 
     <groupId>rip.iwakura</groupId>
     <artifactId>CivilCore</artifactId>
-    <version>0.1a</version>
+    <version>0.1b</version>
 
     <repositories>
         <repository>
diff --git a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
index f3e37bc..e2eebb2 100644
--- a/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
+++ b/src/main/java/rip/iwakura/civilcore/PlayerHandler.java
@@ -30,11 +30,11 @@ public class PlayerHandler implements Listener {
     boolean inTeamChat = civilCore.teamChatRegister.contains(p);
 
     DbPlayer dbPlayer = civilCore.db.getPlayerByName(player_name);
-    String prefix = (inTeamChat ? ChatColor.DARK_BLUE + "TC " + ChatColor.RESET : "") 
+    String prefix = (inTeamChat ? ChatColor.DARK_GREEN + "TEAM >" + ChatColor.RESET : "")
       + (dbPlayer.team.prefix == null ?
         "" : 
-        ChatColor.translateAlternateColorCodes('&', "[" + dbPlayer.team.prefix + "]") + " ");
-    String message = String.format("%s%s: %s", prefix, player_name, e.getMessage()); 
+        ChatColor.translateAlternateColorCodes('&', inTeamChat ? "" : "[" + dbPlayer.team.prefix + "]"));
+    String message = String.format("%s %s: %s", prefix, player_name, e.getMessage());
 
     if (!inTeamChat) {
       Bukkit.broadcastMessage(message);

From 6dec52a317d271922492fa8f79f90b08d07305ce Mon Sep 17 00:00:00 2001
From: grng <36968271+grngxd@users.noreply.github.com>
Date: Thu, 25 Jul 2024 11:16:52 +0100
Subject: [PATCH 08/10] /tc <message> doesnt work

---
 .../civilcore/commands/TeamChatCommand.java   | 52 +++++++++++++++++--
 1 file changed, 48 insertions(+), 4 deletions(-)

diff --git a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
index 5da2f3f..f1a5e66 100644
--- a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
+++ b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
@@ -10,7 +10,9 @@ import net.md_5.bungee.api.ChatColor;
 import org.jetbrains.annotations.NotNull;
 import rip.iwakura.civilcore.Utils;
 import rip.iwakura.civilcore.CivilCore;
+import rip.iwakura.civilcore.types.DbPlayer;
 
+import java.util.List;
 import java.util.Objects;
 
 public class TeamChatCommand implements CommandExecutor {
@@ -20,6 +22,14 @@ public class TeamChatCommand implements CommandExecutor {
     this.civilCore = civilCore;
   }
 
+  private String getPrefix(String name, boolean inTeamChat) {
+    DbPlayer dbPlayer = civilCore.db.getPlayerByName(name);
+    return (inTeamChat ? ChatColor.DARK_GREEN + "TEAM >" + ChatColor.RESET : "")
+            + (dbPlayer.team.prefix == null ?
+            "" :
+            ChatColor.translateAlternateColorCodes('&', inTeamChat ? "" : "[" + dbPlayer.team.prefix + "]"));
+  }
+
   @Override
   public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
     args = Objects.requireNonNull(Utils.parser(args)).toArray(new String[0]);
@@ -37,18 +47,52 @@ public class TeamChatCommand implements CommandExecutor {
     }
 
     String message = String.join(" ", args);
-    if (civilCore.teamChatRegister.contains(p)) {
+
+    String player_name = p.getName();
+    boolean inTeamChat = civilCore.teamChatRegister.contains(p);
+
+    DbPlayer dbPlayer = civilCore.db.getPlayerByName(player_name);
+    /*String prefix = (inTeamChat ? ChatColor.DARK_GREEN + "TEAM >" + ChatColor.RESET : "")
+            + (dbPlayer.team.prefix == null ?
+            "" :
+            ChatColor.translateAlternateColorCodes('&', inTeamChat ? "" : "[" + dbPlayer.team.prefix + "]"));*/
+
+    /*if (civilCore.teamChatRegister.contains(p)) {
       civilCore.teamChatRegister.remove(p);
-      Bukkit.broadcastMessage(ChatColor.DARK_GREEN + "TEAM > " + ChatColor.GREEN + p.getName() + ": " + message);
+      // Bukkit.broadcastMessage(ChatColor.DARK_GREEN + "TEAM > " + ChatColor.GREEN + p.getName() + ": " + message);
+      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
+      Bukkit.broadcastMessage(formatted);
       civilCore.teamChatRegister.add(p);
     } else {
       civilCore.teamChatRegister.add(p);
-      Bukkit.broadcastMessage(p.getName() + ": " + message);
+      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
+        Bukkit.broadcastMessage(formatted);
+      civilCore.teamChatRegister.remove(p);
+    }*/
+
+    String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
+
+    if (!inTeamChat) {
+      civilCore.teamChatRegister.remove(p);
+      Bukkit.broadcastMessage(formatted);
+      civilCore.teamChatRegister.add(p);
+    } else {
+      civilCore.teamChatRegister.add(p);
+      List<DbPlayer> players = civilCore.db.getPlayersInTeam(dbPlayer.team.name);
+
+      if (players == null) return true;
+
+      for (DbPlayer team_dbp : players) {
+        Player team_p = Bukkit.getPlayer(team_dbp.name);
+
+        if (team_p == null) continue;
+
+        team_p.sendMessage(message);
+      }
       civilCore.teamChatRegister.remove(p);
     }
 
 
-
     return true;
   }
 }

From 696e2b09aa30731ca927e7f4e0623d1134adb4c5 Mon Sep 17 00:00:00 2001
From: grng <36968271+grngxd@users.noreply.github.com>
Date: Thu, 25 Jul 2024 11:21:28 +0100
Subject: [PATCH 09/10] /tc <message> doesnt work

---
 .../java/rip/iwakura/civilcore/commands/TeamChatCommand.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
index f1a5e66..b5141b7 100644
--- a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
+++ b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
@@ -70,14 +70,14 @@ public class TeamChatCommand implements CommandExecutor {
       civilCore.teamChatRegister.remove(p);
     }*/
 
-    String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
-
     if (!inTeamChat) {
       civilCore.teamChatRegister.remove(p);
+      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
       Bukkit.broadcastMessage(formatted);
       civilCore.teamChatRegister.add(p);
     } else {
       civilCore.teamChatRegister.add(p);
+      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
       List<DbPlayer> players = civilCore.db.getPlayersInTeam(dbPlayer.team.name);
 
       if (players == null) return true;

From 01aeefaaa3d61e8362a30d7edd8e7557bb1cc270 Mon Sep 17 00:00:00 2001
From: grng <36968271+grngxd@users.noreply.github.com>
Date: Thu, 25 Jul 2024 13:32:04 +0100
Subject: [PATCH 10/10] add /tc <message>, fix scripts, increment version

---
 pom.xml                                       |  2 +-
 build.ps1 => run.ps1                          |  1 -
 .../civilcore/commands/TeamChatCommand.java   | 33 +++++------------
 .../iwakura/civilcore/discord/Discord.java    | 37 ++++++++++++++++++-
 4 files changed, 46 insertions(+), 27 deletions(-)
 rename build.ps1 => run.ps1 (80%)

diff --git a/pom.xml b/pom.xml
index ca26969..976bac2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,7 +13,7 @@
 
     <groupId>rip.iwakura</groupId>
     <artifactId>CivilCore</artifactId>
-    <version>0.1b</version>
+    <version>0.1c</version>
 
     <repositories>
         <repository>
diff --git a/build.ps1 b/run.ps1
similarity index 80%
rename from build.ps1
rename to run.ps1
index 65f7076..3260453 100644
--- a/build.ps1
+++ b/run.ps1
@@ -1,4 +1,3 @@
-# Check if the test_server directory exists, if not, create it
 if (-not (Test-Path -Path test_server)) {
     New-Item -ItemType Directory -Path test_server
 }
diff --git a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
index b5141b7..33b66e1 100644
--- a/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
+++ b/src/main/java/rip/iwakura/civilcore/commands/TeamChatCommand.java
@@ -43,7 +43,7 @@ public class TeamChatCommand implements CommandExecutor {
         civilCore.teamChatRegister.add(p);
         p.sendMessage(ChatColor.GREEN + "You are now in the " + ChatColor.GOLD + "TEAM" + ChatColor.GREEN + " channel");
       }
-        return true;
+      return true;
     }
 
     String message = String.join(" ", args);
@@ -52,32 +52,18 @@ public class TeamChatCommand implements CommandExecutor {
     boolean inTeamChat = civilCore.teamChatRegister.contains(p);
 
     DbPlayer dbPlayer = civilCore.db.getPlayerByName(player_name);
-    /*String prefix = (inTeamChat ? ChatColor.DARK_GREEN + "TEAM >" + ChatColor.RESET : "")
-            + (dbPlayer.team.prefix == null ?
-            "" :
-            ChatColor.translateAlternateColorCodes('&', inTeamChat ? "" : "[" + dbPlayer.team.prefix + "]"));*/
 
-    /*if (civilCore.teamChatRegister.contains(p)) {
+    if (inTeamChat) {
+      // Send message to global chat
       civilCore.teamChatRegister.remove(p);
-      // Bukkit.broadcastMessage(ChatColor.DARK_GREEN + "TEAM > " + ChatColor.GREEN + p.getName() + ": " + message);
-      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
+      String formatted = String.format("%s%s: %s", getPrefix(player_name, false) + " ", player_name, message);
       Bukkit.broadcastMessage(formatted);
+      civilCore.bot.sendMessage(p, message);
       civilCore.teamChatRegister.add(p);
     } else {
+      // Send message to team chat
       civilCore.teamChatRegister.add(p);
-      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
-        Bukkit.broadcastMessage(formatted);
-      civilCore.teamChatRegister.remove(p);
-    }*/
-
-    if (!inTeamChat) {
-      civilCore.teamChatRegister.remove(p);
-      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
-      Bukkit.broadcastMessage(formatted);
-      civilCore.teamChatRegister.add(p);
-    } else {
-      civilCore.teamChatRegister.add(p);
-      String formatted = String.format("%s%s: %s", getPrefix(player_name, inTeamChat) + " ", player_name, message);
+      String formatted = String.format("%s%s: %s", getPrefix(player_name, true) + " ", player_name, message);
       List<DbPlayer> players = civilCore.db.getPlayersInTeam(dbPlayer.team.name);
 
       if (players == null) return true;
@@ -87,12 +73,11 @@ public class TeamChatCommand implements CommandExecutor {
 
         if (team_p == null) continue;
 
-        team_p.sendMessage(message);
+        team_p.sendMessage(formatted);
       }
       civilCore.teamChatRegister.remove(p);
     }
 
-
     return true;
   }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/rip/iwakura/civilcore/discord/Discord.java b/src/main/java/rip/iwakura/civilcore/discord/Discord.java
index 49f1384..be440ee 100644
--- a/src/main/java/rip/iwakura/civilcore/discord/Discord.java
+++ b/src/main/java/rip/iwakura/civilcore/discord/Discord.java
@@ -3,6 +3,7 @@ package rip.iwakura.civilcore.discord;
 import java.util.EnumSet;
 
 import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
 import org.bukkit.event.player.AsyncPlayerChatEvent;
 import org.checkerframework.common.reflection.qual.GetConstructor;
 
@@ -17,6 +18,7 @@ import net.dv8tion.jda.api.hooks.ListenerAdapter;
 import net.dv8tion.jda.api.requests.GatewayIntent;
 import rip.iwakura.civilcore.CivilCore;
 import net.dv8tion.jda.api.events.session.ReadyEvent;
+import rip.iwakura.civilcore.types.DbPlayer;
 
 public class Discord extends ListenerAdapter {
   private String token;
@@ -45,15 +47,48 @@ public class Discord extends ListenerAdapter {
   }
 
   public void sendMessage(AsyncPlayerChatEvent e) {
+    DbPlayer dbPlayer = civilCore.db.getPlayerByName(e.getPlayer().getName());
+    String prefix = (dbPlayer.team.prefix == null ?
+            "" :
+            "[" + dbPlayer.team.prefix + "]");
+
     String player_name = e.getPlayer().getName();
     WebhookMessageBuilder builder = new WebhookMessageBuilder()
-      .setUsername(player_name)
+      .setUsername(prefix + " " + player_name)
       .setAvatarUrl(String.format("https://mc-heads.net/avatar/%s", player_name))
       .setContent(e.getMessage());
     webhook.send(builder.build());
     //channel.sendMessage(String.format("%s: %s", e.getPlayer().getName(), e.getMessage())).complete();
   }
 
+  public void sendMessage(Player p, String message) {
+    DbPlayer dbPlayer = civilCore.db.getPlayerByName(p.getName());
+    String prefix = (dbPlayer.team.prefix == null ?
+      "" :
+      "[" + dbPlayer.team.prefix + "]");
+
+    WebhookMessageBuilder builder = new WebhookMessageBuilder()
+      .setUsername(prefix + " " + p.getName())
+      .setAvatarUrl(String.format("https://mc-heads.net/avatar/%s", p.getName()))
+      .setContent(message);
+    webhook.send(builder.build());
+    //channel.sendMessage(String.format("%s: %s", p.getName(), message)).complete();
+  }
+
+  public void sendMessage(String message, String name) {
+    DbPlayer dbPlayer = civilCore.db.getPlayerByName(name);
+    String prefix = (dbPlayer.team.prefix == null ?
+            "" :
+            "[" + dbPlayer.team.prefix + "]");
+
+    WebhookMessageBuilder builder = new WebhookMessageBuilder()
+      .setUsername(prefix + " " + name)
+      .setAvatarUrl(String.format("https://mc-heads.net/avatar/%s", name))
+      .setContent(message);
+    webhook.send(builder.build());
+    //channel.sendMessage(String.format("%s: %s", name, message)).complete();
+  }
+
   @Override
   public void onReady(ReadyEvent e) {
 	  this.channel = bot.getTextChannelById(channelId);