From 3d4d73a03ed32fe521e0c822dcd9b2e5f9c71937 Mon Sep 17 00:00:00 2001 From: Taah Date: Sun, 8 May 2022 16:34:03 -0700 Subject: [PATCH] - Finish Chat Command - Finish Warps System - Migrate Owner variable to Member object - Modify Chat Handler to add support for guild chat toggles --- src/main/java/dev/plex/Guilds.java | 15 ++++- .../java/dev/plex/command/GuildCommand.java | 8 ++- .../dev/plex/command/sub/ChatSubCommand.java | 55 +++++++++++++++++++ .../dev/plex/command/sub/InfoSubCommand.java | 10 ++-- .../plex/command/sub/PrefixSubCommand.java | 2 +- .../plex/command/sub/SetWarpSubCommand.java | 55 +++++++++++++++++++ .../plex/command/sub/WarpListSubCommand.java | 37 +++++++++++++ .../dev/plex/command/sub/WarpSubCommand.java | 42 ++++++++++++++ .../java/dev/plex/data/SQLGuildManager.java | 33 +++++++---- src/main/java/dev/plex/data/SQLManager.java | 4 +- src/main/java/dev/plex/guild/Guild.java | 23 ++++++-- src/main/java/dev/plex/guild/GuildHolder.java | 4 +- src/main/java/dev/plex/guild/data/Member.java | 15 ++++- .../java/dev/plex/guild/data/Permission.java | 6 ++ .../dev/plex/handler/ChatHandlerImpl.java | 28 ++++++++++ .../java/dev/plex/util/CustomLocation.java | 17 +++++- src/main/resources/data/config.yml | 2 + 17 files changed, 323 insertions(+), 33 deletions(-) create mode 100644 src/main/java/dev/plex/command/sub/ChatSubCommand.java create mode 100644 src/main/java/dev/plex/command/sub/SetWarpSubCommand.java create mode 100644 src/main/java/dev/plex/command/sub/WarpListSubCommand.java create mode 100644 src/main/java/dev/plex/command/sub/WarpSubCommand.java create mode 100644 src/main/java/dev/plex/guild/data/Permission.java create mode 100644 src/main/resources/data/config.yml diff --git a/src/main/java/dev/plex/Guilds.java b/src/main/java/dev/plex/Guilds.java index 2f9f187..760e320 100644 --- a/src/main/java/dev/plex/Guilds.java +++ b/src/main/java/dev/plex/Guilds.java @@ -1,6 +1,7 @@ package dev.plex; import dev.plex.command.GuildCommand; +import dev.plex.config.ModuleConfig; import dev.plex.data.SQLGuildManager; import dev.plex.data.SQLManager; import dev.plex.guild.Guild; @@ -25,10 +26,14 @@ public class Guilds extends PlexModule private SQLGuildManager sqlGuildManager; + private ModuleConfig config; + @Override public void load() { module = this; + config = new ModuleConfig(this, "data/config.yml", "config.yml"); + config.load(); } @Override @@ -54,12 +59,18 @@ public class Guilds extends PlexModule this.addDefaultMessage("guildsHelpCommand", "======Guild Menu======\n" + "/guild Returns this menu\n" + "/guild help"); - this.addDefaultMessage("guildCommandNotFound", "'{0}' is not a valid sub command!", "0 - The sub command"); + this.addDefaultMessage("guildCommandNotFound", "'{0}' is not a valid sub command!", "0 - The sub command"); this.addDefaultMessage("guildNotFound", "You're currently not a part of a guild!"); this.addDefaultMessage("alreadyInGuild", "You're currently in a guild. Please do /guild leave if you're a member, or if you're an owner with members, /guild promote then /guild leave, or just an owner, /guild disband."); this.addDefaultMessage("guildNotOwner", "You're not the owner of this guild!"); - this.addDefaultMessage("guildPrefixSet", "You have changed the guild prefix to '{0}'", "0 - The new prefix"); + this.addDefaultMessage("guildPrefixSet", "You have changed the guild prefix to '{0}'", "0 - The new prefix"); this.addDefaultMessage("guildPrefixCleared", "Your guild's prefix has been cleared."); + this.addDefaultMessage("guildWarpExists", "'{0}' is already an existing warp!", "0 - The warp name"); + this.addDefaultMessage("guildWarpNotFound", "'{0}' is not a valid warp!", "0 - The warp name"); + this.addDefaultMessage("guildWarpCreated", "You have created a warp called '{0}'", "0 - The warp name"); + this.addDefaultMessage("guildChatMessage", "[GUILD] {0} {1}", "0 - The player name", "1 - The message"); + this.addDefaultMessage("guildChatToggled", "Your chat has been toggled {0}", "0 - On / Off"); + this.addDefaultMessage("guildChatConsoleLog", "[GUILD - {0}:{1}] {2} {3}", "0 - The guild name", "1 - The guild unique identifier", "2 - The player name", "3 - The message"); } @Override diff --git a/src/main/java/dev/plex/command/GuildCommand.java b/src/main/java/dev/plex/command/GuildCommand.java index 91185a8..0e2e776 100644 --- a/src/main/java/dev/plex/command/GuildCommand.java +++ b/src/main/java/dev/plex/command/GuildCommand.java @@ -5,9 +5,7 @@ import com.google.common.collect.Lists; import dev.plex.command.annotation.CommandParameters; import dev.plex.command.annotation.CommandPermissions; import dev.plex.command.source.RequiredCommandSource; -import dev.plex.command.sub.CreateSubCommand; -import dev.plex.command.sub.InfoSubCommand; -import dev.plex.command.sub.PrefixSubCommand; +import dev.plex.command.sub.*; import dev.plex.rank.enums.Rank; import dev.plex.util.GuildUtil; import dev.plex.util.PlexLog; @@ -35,6 +33,10 @@ public class GuildCommand extends PlexCommand this.registerSubCommand(new CreateSubCommand()); this.registerSubCommand(new InfoSubCommand()); this.registerSubCommand(new PrefixSubCommand()); + this.registerSubCommand(new SetWarpSubCommand()); + this.registerSubCommand(new WarpSubCommand()); + this.registerSubCommand(new WarpListSubCommand()); + this.registerSubCommand(new ChatSubCommand()); } catch (Exception e) { GuildUtil.throwExceptionSync(e); diff --git a/src/main/java/dev/plex/command/sub/ChatSubCommand.java b/src/main/java/dev/plex/command/sub/ChatSubCommand.java new file mode 100644 index 0000000..9fec4be --- /dev/null +++ b/src/main/java/dev/plex/command/sub/ChatSubCommand.java @@ -0,0 +1,55 @@ +package dev.plex.command.sub; + +import dev.plex.Guilds; +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.command.source.RequiredCommandSource; +import dev.plex.guild.data.Member; +import dev.plex.rank.enums.Rank; +import dev.plex.util.PlexLog; +import net.kyori.adventure.text.Component; +import org.apache.commons.lang.BooleanUtils; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +@CommandParameters(name = "chat", usage = "/guild [message]") +@CommandPermissions(level = Rank.OP, source = RequiredCommandSource.IN_GAME, permission = "plex.guilds.chat") +public class ChatSubCommand extends PlexCommand +{ + public ChatSubCommand() + { + super(false); + } + + @Override + protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args) + { + assert player != null; + Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(guild -> + { + if (args.length == 0) + { + Member member = guild.getMember(player.getUniqueId()); + member.setChat(!member.isChat()); + send(player, messageComponent("guildChatToggled", BooleanUtils.toStringOnOff(member.isChat()))); + return; + } + guild.getMembers().stream().map(Member::getPlayer).filter(Objects::nonNull).forEach(player1 -> + { + send(player1, messageComponent("guildChatMessage", player.getName(), StringUtils.join(args, ", "))); + }); + if (Guilds.get().getConfig().isBoolean("guilds.log-chat-message")) + { + send(Bukkit.getConsoleSender(), messageComponent("guildChatConsoleLog", guild.getName(), guild.getGuildUuid(), player.getName(), StringUtils.join(args, ", "))); + } + }, () -> send(player, messageComponent("guildNotFound"))); + return null; + } +} diff --git a/src/main/java/dev/plex/command/sub/InfoSubCommand.java b/src/main/java/dev/plex/command/sub/InfoSubCommand.java index 761e6ff..d74cbc8 100644 --- a/src/main/java/dev/plex/command/sub/InfoSubCommand.java +++ b/src/main/java/dev/plex/command/sub/InfoSubCommand.java @@ -27,6 +27,7 @@ public class InfoSubCommand extends PlexCommand } private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss a"); + @Override protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] strings) { @@ -39,19 +40,16 @@ public class InfoSubCommand extends PlexCommand send(player, mmString("")); try { - send(player, mmString("Owner: " + DataUtils.getPlayer(guild.getOwner(), false).getName())); + send(player, mmString("Owner: " + DataUtils.getPlayer(guild.getOwner().getUuid(), false).getName())); } catch (NullPointerException e) { send(player, mmString("Owner: Unable to load cache...")); } - send(player, mmString("Members (" + guild.getMembers().size() + "): " + StringUtils.join(guild.getMembers().stream().map(member -> DataUtils.getPlayer(member.uuid(), false).getName()).toList(), ", "))); + send(player, mmString("Members (" + guild.getMembers().size() + "): " + StringUtils.join(guild.getMembers().stream().map(member -> DataUtils.getPlayer(member.getUuid(), false).getName()).toList(), ", "))); send(player, mmString("Moderators (" + guild.getModerators().size() + "): " + StringUtils.join(guild.getModerators().stream().map(uuid -> DataUtils.getPlayer(uuid, false).getName()).toList(), ", "))); send(player, mmString("Prefix: " + (guild.getPrefix() == null ? "N/A" : guild.getPrefix()))); send(player, mmString("Created At: " + formatter.format(guild.getCreatedAt()))); - }, () -> - { - send(player, messageComponent("guildNotFound")); - }); + }, () -> send(player, messageComponent("guildNotFound"))); }); return null; } diff --git a/src/main/java/dev/plex/command/sub/PrefixSubCommand.java b/src/main/java/dev/plex/command/sub/PrefixSubCommand.java index 4de51e7..4af7ae5 100644 --- a/src/main/java/dev/plex/command/sub/PrefixSubCommand.java +++ b/src/main/java/dev/plex/command/sub/PrefixSubCommand.java @@ -49,7 +49,7 @@ public class PrefixSubCommand extends PlexCommand } guild.setPrefix(StringUtils.join(args, " ")); send(player, messageComponent("guildPrefixSet", SafeMiniMessage.mmDeserializeWithoutEvents(guild.getPrefix()))); - }, () -> send(player, messageComponent("alreadyInGuild"))); + }, () -> send(player, messageComponent("guildNotFound"))); return null; } } diff --git a/src/main/java/dev/plex/command/sub/SetWarpSubCommand.java b/src/main/java/dev/plex/command/sub/SetWarpSubCommand.java new file mode 100644 index 0000000..748763f --- /dev/null +++ b/src/main/java/dev/plex/command/sub/SetWarpSubCommand.java @@ -0,0 +1,55 @@ +package dev.plex.command.sub; + +import dev.plex.Guilds; +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.command.source.RequiredCommandSource; +import dev.plex.rank.enums.Rank; +import dev.plex.util.CustomLocation; +import dev.plex.util.minimessage.SafeMiniMessage; +import net.kyori.adventure.text.Component; +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@CommandParameters(name = "setwarp", aliases = "makewarp,createwarp", usage = "/guild ") +@CommandPermissions(level = Rank.OP, source = RequiredCommandSource.IN_GAME, permission = "plex.guilds.setwarp") +public class SetWarpSubCommand extends PlexCommand +{ + public SetWarpSubCommand() + { + super(false); + } + @Override + protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args) + { + if (args.length == 0) + { + return usage(); + } + assert player != null; + Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(guild -> { + if (!guild.getOwner().equals(player.getUniqueId())) + { + send(player, messageComponent("guildNotOwner")); + return; + } + if (args[0].length() > 16) + { + send(player, mmString("The max length of a warp name is 16 characters!")); + return; + } + if (guild.getWarps().containsKey(args[0].toLowerCase())) + { + send(player, messageComponent("guildWarpExists", args[0])); + return; + } + guild.getWarps().put(args[0].toLowerCase(), CustomLocation.fromLocation(player.getLocation())); + send(player, messageComponent("guildWarpCreated", args[0])); + }, () -> send(player, messageComponent("guildNotFound"))); + return null; + } +} diff --git a/src/main/java/dev/plex/command/sub/WarpListSubCommand.java b/src/main/java/dev/plex/command/sub/WarpListSubCommand.java new file mode 100644 index 0000000..c3bc986 --- /dev/null +++ b/src/main/java/dev/plex/command/sub/WarpListSubCommand.java @@ -0,0 +1,37 @@ +package dev.plex.command.sub; + +import dev.plex.Guilds; +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.command.source.RequiredCommandSource; +import dev.plex.rank.enums.Rank; +import net.kyori.adventure.text.Component; +import org.apache.commons.lang.StringUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.StringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +@CommandParameters(name = "warps", aliases = "listwarps", usage = "/guild ") +@CommandPermissions(level = Rank.OP, source = RequiredCommandSource.IN_GAME, permission = "plex.guilds.warps") +public class WarpListSubCommand extends PlexCommand +{ + public WarpListSubCommand() + { + super(false); + } + @Override + protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args) + { + assert player != null; + Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(guild -> { + Set warps = guild.getWarps().keySet(); + send(player, mmString("Warps (" + warps.size() + "): " + StringUtils.join(warps, ", "))); + }, () -> send(player, messageComponent("guildNotFound"))); + return null; + } +} diff --git a/src/main/java/dev/plex/command/sub/WarpSubCommand.java b/src/main/java/dev/plex/command/sub/WarpSubCommand.java new file mode 100644 index 0000000..86956e5 --- /dev/null +++ b/src/main/java/dev/plex/command/sub/WarpSubCommand.java @@ -0,0 +1,42 @@ +package dev.plex.command.sub; + +import dev.plex.Guilds; +import dev.plex.command.PlexCommand; +import dev.plex.command.annotation.CommandParameters; +import dev.plex.command.annotation.CommandPermissions; +import dev.plex.command.source.RequiredCommandSource; +import dev.plex.rank.enums.Rank; +import dev.plex.util.CustomLocation; +import net.kyori.adventure.text.Component; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +@CommandParameters(name = "warp", aliases = "goto", usage = "/guild ") +@CommandPermissions(level = Rank.OP, source = RequiredCommandSource.IN_GAME, permission = "plex.guilds.warp") +public class WarpSubCommand extends PlexCommand +{ + public WarpSubCommand() + { + super(false); + } + @Override + protected Component execute(@NotNull CommandSender commandSender, @Nullable Player player, @NotNull String[] args) + { + if (args.length == 0) + { + return usage(); + } + assert player != null; + Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse(guild -> { + if (!guild.getWarps().containsKey(args[0].toLowerCase())) + { + send(player, messageComponent("guildWarpNotFound", args[0])); + return; + } + player.teleportAsync(guild.getWarps().get(args[0].toLowerCase()).toLocation()); + }, () -> send(player, messageComponent("guildNotFound"))); + return null; + } +} diff --git a/src/main/java/dev/plex/data/SQLGuildManager.java b/src/main/java/dev/plex/data/SQLGuildManager.java index dd97eeb..022c524 100644 --- a/src/main/java/dev/plex/data/SQLGuildManager.java +++ b/src/main/java/dev/plex/data/SQLGuildManager.java @@ -5,8 +5,10 @@ import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import dev.plex.Plex; import dev.plex.guild.Guild; +import dev.plex.guild.data.Member; import dev.plex.util.CustomLocation; import dev.plex.util.GuildUtil; +import dev.plex.util.PlexLog; import java.sql.Connection; import java.sql.PreparedStatement; @@ -17,6 +19,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -26,11 +29,9 @@ public class SQLGuildManager private static final Gson GSON = new Gson(); private static final String SELECT_GUILD = "SELECT * FROM `guilds`"; - private static final String SELECT_GUILD_OWNER = "SELECT * FROM `guilds` WHERE owner=?"; - private static final String SELECT_GUILD_MEMBER_MYSQL = "SELECT * FROM `guilds` WHERE json_search(members, ?, ?) IS NOT NULL LIMIT 1"; - private static final String INSERT_GUILD = "INSERT INTO `guilds` (`guildUuid`, `name`, `owner`, `createdAt`, `members`, `moderators`, `prefix`, `motd`, `ranks`, `defaultRank`, `home`, `tagEnabled`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - private static final String DELETE_GUILD = "DELETE FROM `guilds` WHERE owner=?"; - private static final String UPDATE_GUILD = "UPDATE `guilds` SET name=?, owner=?, members=?, moderators=?, prefix=?, motd=?, ranks=?, defaultRank=?, home=?, tagEnabled=? WHERE guildUuid=?"; + private static final String INSERT_GUILD = "INSERT INTO `guilds` (`guildUuid`, `name`, `owner`, `createdAt`, `members`, `moderators`, `prefix`, `motd`, `ranks`, `defaultRank`, `warps`, `home`, `tagEnabled`, `isPublic`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + private static final String DELETE_GUILD = "DELETE FROM `guilds` WHERE guildUuid=?"; + private static final String UPDATE_GUILD = "UPDATE `guilds` SET name=?, owner=?, members=?, moderators=?, prefix=?, motd=?, ranks=?, defaultRank=?, home=?, warps=?, tagEnabled=?, isPublic=? WHERE guildUuid=?"; public CompletableFuture insertGuild(Guild guild) { @@ -41,7 +42,7 @@ public class SQLGuildManager PreparedStatement statement = connection.prepareStatement(INSERT_GUILD); statement.setString(1, guild.getGuildUuid().toString()); statement.setString(2, guild.getName()); - statement.setString(3, guild.getOwner().toString()); + statement.setString(3, GSON.toJson(guild.getOwner())); statement.setLong(4, guild.getCreatedAt().toInstant().toEpochMilli()); statement.setString(5, GSON.toJson(guild.getMembers())); statement.setString(6, GSON.toJson(guild.getModerators().stream().map(UUID::toString).collect(Collectors.toList()))); @@ -49,8 +50,10 @@ public class SQLGuildManager statement.setString(8, guild.getMotd()); statement.setString(9, GSON.toJson(guild.getRanks())); statement.setString(10, GSON.toJson(guild.getDefaultRank())); - statement.setString(11, GSON.toJson(guild.getHome())); - statement.setBoolean(12, guild.isTagEnabled()); + statement.setString(11, GSON.toJson(guild.getWarps())); + statement.setString(12, GSON.toJson(guild.getHome())); + statement.setBoolean(13, guild.isTagEnabled()); + statement.setBoolean(14, guild.isPublic()); statement.execute(); return guild; } catch (SQLException e) @@ -69,7 +72,7 @@ public class SQLGuildManager { PreparedStatement statement = connection.prepareStatement(UPDATE_GUILD); statement.setString(1, guild.getName()); - statement.setString(2, guild.getOwner().toString()); + statement.setString(2, GSON.toJson(guild.getOwner())); statement.setString(3, GSON.toJson(guild.getMembers())); statement.setString(4, GSON.toJson(guild.getModerators().stream().map(UUID::toString).collect(Collectors.toList()))); statement.setString(5, guild.getPrefix()); @@ -77,8 +80,10 @@ public class SQLGuildManager statement.setString(7, GSON.toJson(guild.getRanks())); statement.setString(8, GSON.toJson(guild.getDefaultRank())); statement.setString(9, GSON.toJson(guild.getHome())); - statement.setBoolean(10, guild.isTagEnabled()); - statement.setString(11, guild.getGuildUuid().toString()); + statement.setString(10, GSON.toJson(guild.getWarps())); + statement.setBoolean(11, guild.isTagEnabled()); + statement.setBoolean(12, guild.isPublic()); + statement.setString(13, guild.getGuildUuid().toString()); statement.executeUpdate(); return guild; } catch (SQLException e) @@ -102,7 +107,7 @@ public class SQLGuildManager { Guild guild = new Guild(UUID.fromString(set.getString("guildUuid")), set.getString("name"), - UUID.fromString(set.getString("owner")), + GSON.fromJson(set.getString("owner"), Member.class), ZonedDateTime.ofInstant(Instant.ofEpochMilli(set.getLong("createdAt")), ZoneId.of(Plex.get().config.getString("server.timezone")).getRules().getOffset(Instant.now()))); guild.getMembers().addAll(new Gson().fromJson(set.getString("members"), new TypeToken>(){}.getType())); guild.getModerators().addAll(new Gson().fromJson(set.getString("moderators"), new TypeToken>(){}.getType())); @@ -110,6 +115,10 @@ public class SQLGuildManager guild.setMotd(set.getString("motd")); guild.setHome(GSON.fromJson(set.getString("home"), CustomLocation.class)); guild.setTagEnabled(set.getBoolean("tagEnabled")); + Map warps = GSON.fromJson(set.getString("warps"), new TypeToken>(){}.getType()); + PlexLog.debug("Loaded {0} warps for {1} guild", warps.size(), guild.getName()); + guild.getWarps().putAll(GSON.fromJson(set.getString("warps"), new TypeToken>(){}.getType())); + guild.setPublic(set.getBoolean("isPublic")); guilds.add(guild); } } catch (SQLException e) diff --git a/src/main/java/dev/plex/data/SQLManager.java b/src/main/java/dev/plex/data/SQLManager.java index f2d734b..005ae34 100644 --- a/src/main/java/dev/plex/data/SQLManager.java +++ b/src/main/java/dev/plex/data/SQLManager.java @@ -21,7 +21,7 @@ public class SQLManager "CREATE TABLE IF NOT EXISTS `guilds` (" + "`guildUuid` VARCHAR(46) NOT NULL, " + "`name` VARCHAR(2000) NOT NULL, " + - "`owner` VARCHAR(46) NOT NULL, " + + "`owner` LONGTEXT NOT NULL, " + "`createdAt` BIGINT NOT NULL, " + "`prefix` VARCHAR(2000), " + "`motd` VARCHAR(3000), " + @@ -30,7 +30,9 @@ public class SQLManager "`moderators` LONGTEXT, " + "`ranks` LONGTEXT, " + "`defaultRank` LONGTEXT, " + + "`warps` LONGTEXT, " + "`tagEnabled` BOOLEAN, " + + "`isPublic` BOOLEAN, " + "PRIMARY KEY (`guildUuid`)" + ");" ).execute(); diff --git a/src/main/java/dev/plex/guild/Guild.java b/src/main/java/dev/plex/guild/Guild.java index 6a3c87c..7e1f0c7 100644 --- a/src/main/java/dev/plex/guild/Guild.java +++ b/src/main/java/dev/plex/guild/Guild.java @@ -1,6 +1,7 @@ package dev.plex.guild; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import dev.morphia.annotations.Entity; import dev.morphia.annotations.Transient; import dev.plex.Plex; @@ -12,8 +13,7 @@ import org.bukkit.entity.Player; import java.time.ZoneId; import java.time.ZonedDateTime; -import java.util.List; -import java.util.UUID; +import java.util.*; @Data @Entity("guilds") @@ -21,20 +21,35 @@ public class Guild { private final UUID guildUuid; private final String name; - private final UUID owner; + private final Member owner; private final ZonedDateTime createdAt; private transient final List outgoingInvitations = Lists.newArrayList(); private final List members = Lists.newArrayList(); private final List moderators = Lists.newArrayList(); private final List ranks = Lists.newArrayList(); + private final Map warps = Maps.newHashMap(); private String prefix; private String motd; private CustomLocation home; private boolean tagEnabled; private Rank defaultRank = new Rank("default", null); + private boolean isPublic = false; + public static Guild create(Player player, String guildName) { - return new Guild(UUID.randomUUID(), guildName, player.getUniqueId(), ZonedDateTime.now(ZoneId.of(Plex.get().config.getString("server.timezone")))); + return new Guild(UUID.randomUUID(), guildName, new Member(player.getUniqueId()), ZonedDateTime.now(ZoneId.of(Plex.get().config.getString("server.timezone")))); + } + + public Member getMember(UUID uuid) + { + return owner.getUuid().equals(uuid) ? owner : members.stream().filter(member -> member.getUuid().equals(uuid)).findFirst().get(); + } + + public List getMembers() + { + List allMembers = Lists.newArrayList(members); + allMembers.add(owner); + return allMembers; } } diff --git a/src/main/java/dev/plex/guild/GuildHolder.java b/src/main/java/dev/plex/guild/GuildHolder.java index 1dbc957..b6b4397 100644 --- a/src/main/java/dev/plex/guild/GuildHolder.java +++ b/src/main/java/dev/plex/guild/GuildHolder.java @@ -19,12 +19,12 @@ public class GuildHolder public void deleteGuild(UUID owner) { - GUILDS.removeIf(guild -> guild.getOwner().equals(owner)); + GUILDS.removeIf(guild -> guild.getOwner().getUuid().equals(owner)); } public Optional getGuild(UUID uuid) { - return GUILDS.stream().filter(guild -> (guild.getOwner() != null && guild.getOwner().equals(uuid)) || guild.getMembers().stream().map(Member::uuid).toList().contains(uuid)).findFirst(); + return GUILDS.stream().filter(guild -> (guild.getOwner() != null && guild.getOwner().getUuid().equals(uuid)) || guild.getMembers().stream().map(Member::getUuid).toList().contains(uuid)).findFirst(); } public Collection getGuilds() diff --git a/src/main/java/dev/plex/guild/data/Member.java b/src/main/java/dev/plex/guild/data/Member.java index d9dc285..fa60f6c 100644 --- a/src/main/java/dev/plex/guild/data/Member.java +++ b/src/main/java/dev/plex/guild/data/Member.java @@ -1,7 +1,20 @@ package dev.plex.guild.data; +import lombok.Data; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + import java.util.UUID; -public record Member(UUID uuid, Rank rank) +@Data +public class Member { + private final UUID uuid; + private Rank rank; + private boolean chat, prefix; + + public Player getPlayer() + { + return Bukkit.getPlayer(this.uuid); + } } diff --git a/src/main/java/dev/plex/guild/data/Permission.java b/src/main/java/dev/plex/guild/data/Permission.java new file mode 100644 index 0000000..fede3e8 --- /dev/null +++ b/src/main/java/dev/plex/guild/data/Permission.java @@ -0,0 +1,6 @@ +package dev.plex.guild.data; + +public enum Permission +{ + SET_WARP, WARPS, DELETE_WARP, WARP +} diff --git a/src/main/java/dev/plex/handler/ChatHandlerImpl.java b/src/main/java/dev/plex/handler/ChatHandlerImpl.java index 2bb23bc..524702b 100644 --- a/src/main/java/dev/plex/handler/ChatHandlerImpl.java +++ b/src/main/java/dev/plex/handler/ChatHandlerImpl.java @@ -4,6 +4,7 @@ import dev.plex.Guilds; import dev.plex.Plex; import dev.plex.api.chat.IChatHandler; import dev.plex.cache.PlayerCache; +import dev.plex.guild.data.Member; import dev.plex.player.PlexPlayer; import dev.plex.util.PlexUtils; import dev.plex.util.minimessage.SafeMiniMessage; @@ -17,9 +18,13 @@ import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.util.Objects; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -32,6 +37,29 @@ public class ChatHandlerImpl implements IChatHandler public void doChat(AsyncChatEvent event) { event.renderer(renderer); + Player player = event.getPlayer(); + Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresent(guild -> + { + Member member = guild.getMember(player.getUniqueId()); + if (member == null) + { + return; + } + if (!member.isChat()) + { + return; + } + guild.getMembers().stream().map(Member::getPlayer).filter(Objects::nonNull).forEach(player1 -> + { + player1.sendMessage(PlexUtils.messageComponent("guildChatMessage", player.getName(), PlainTextComponentSerializer.plainText().serialize(event.message()))); + }); + if (Guilds.get().getConfig().isBoolean("guilds.log-chat-message")) + { + Bukkit.getConsoleSender().sendMessage(PlexUtils.messageComponent("guildChatConsoleLog", guild.getName(), guild.getGuildUuid(), player.getName(), PlainTextComponentSerializer.plainText().serialize(event.message()))); + } + event.setCancelled(true); + }); + } public static class PlexChatRenderer implements ChatRenderer diff --git a/src/main/java/dev/plex/util/CustomLocation.java b/src/main/java/dev/plex/util/CustomLocation.java index 62cd0ec..0932242 100644 --- a/src/main/java/dev/plex/util/CustomLocation.java +++ b/src/main/java/dev/plex/util/CustomLocation.java @@ -1,7 +1,22 @@ package dev.plex.util; import lombok.Data; +import org.bukkit.Bukkit; +import org.bukkit.Location; -public record CustomLocation(String worldName, double x, double y, double z, float yaw, float pitch) +@Data +public class CustomLocation { + private final String worldName; + private final double x, y, z; + private final float yaw, pitch; + public static CustomLocation fromLocation(Location location) + { + return new CustomLocation(location.getWorld().getName(), location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } + + public Location toLocation() + { + return new Location(Bukkit.getWorld(worldName), x, y, z, yaw, pitch); + } } diff --git a/src/main/resources/data/config.yml b/src/main/resources/data/config.yml new file mode 100644 index 0000000..7398b18 --- /dev/null +++ b/src/main/resources/data/config.yml @@ -0,0 +1,2 @@ +guilds: + log-chat-message: true \ No newline at end of file