mirror of
https://github.com/plexusorg/Module-Guilds.git
synced 2024-11-10 14:56:06 +00:00
add custom chat handling
This commit is contained in:
parent
2398d44074
commit
e50aee2a84
@ -5,9 +5,11 @@ import dev.plex.data.SQLGuildManager;
|
|||||||
import dev.plex.data.SQLManager;
|
import dev.plex.data.SQLManager;
|
||||||
import dev.plex.guild.Guild;
|
import dev.plex.guild.Guild;
|
||||||
import dev.plex.guild.GuildHolder;
|
import dev.plex.guild.GuildHolder;
|
||||||
|
import dev.plex.listener.impl.ChatListener;
|
||||||
import dev.plex.module.PlexModule;
|
import dev.plex.module.PlexModule;
|
||||||
import dev.plex.storage.StorageType;
|
import dev.plex.storage.StorageType;
|
||||||
import dev.plex.util.PlexLog;
|
import dev.plex.util.PlexLog;
|
||||||
|
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -18,7 +20,7 @@ import java.util.Arrays;
|
|||||||
public class Guilds extends PlexModule
|
public class Guilds extends PlexModule
|
||||||
{
|
{
|
||||||
private static Guilds module;
|
private static Guilds module;
|
||||||
private GuildHolder guildHolder = new GuildHolder();
|
private final GuildHolder guildHolder = new GuildHolder();
|
||||||
|
|
||||||
private SQLGuildManager sqlGuildManager;
|
private SQLGuildManager sqlGuildManager;
|
||||||
|
|
||||||
@ -31,7 +33,6 @@ public class Guilds extends PlexModule
|
|||||||
@Override
|
@Override
|
||||||
public void enable()
|
public void enable()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (getPlex().getStorageType() == StorageType.MONGODB)
|
if (getPlex().getStorageType() == StorageType.MONGODB)
|
||||||
{
|
{
|
||||||
getPlex().getMongoConnection().getDatastore().getMapper().map(Guild.class);
|
getPlex().getMongoConnection().getDatastore().getMapper().map(Guild.class);
|
||||||
|
@ -28,7 +28,7 @@ public class SQLGuildManager
|
|||||||
private static final String SELECT_GUILD = "SELECT * FROM `guilds`";
|
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_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 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` (`name`, `owner`, `createdAt`, `members`, `moderators`, `prefix`, `motd`, `home`, `tagEnabled`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
private static final String INSERT_GUILD = "INSERT INTO `guilds` (`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 DELETE_GUILD = "DELETE FROM `guilds` WHERE owner=?";
|
||||||
|
|
||||||
public CompletableFuture<Guild> insertGuild(Guild guild)
|
public CompletableFuture<Guild> insertGuild(Guild guild)
|
||||||
@ -41,12 +41,14 @@ public class SQLGuildManager
|
|||||||
statement.setString(1, guild.getName());
|
statement.setString(1, guild.getName());
|
||||||
statement.setString(2, guild.getOwner().toString());
|
statement.setString(2, guild.getOwner().toString());
|
||||||
statement.setLong(3, guild.getCreatedAt().toInstant().toEpochMilli());
|
statement.setLong(3, guild.getCreatedAt().toInstant().toEpochMilli());
|
||||||
statement.setString(4, GSON.toJson(guild.getMembers().stream().map(UUID::toString).collect(Collectors.toList())));
|
statement.setString(4, GSON.toJson(guild.getMembers()));
|
||||||
statement.setString(5, GSON.toJson(guild.getModerators().stream().map(UUID::toString).collect(Collectors.toList())));
|
statement.setString(5, GSON.toJson(guild.getModerators().stream().map(UUID::toString).collect(Collectors.toList())));
|
||||||
statement.setString(6, guild.getPrefix());
|
statement.setString(6, guild.getPrefix());
|
||||||
statement.setString(7, guild.getMotd());
|
statement.setString(7, guild.getMotd());
|
||||||
statement.setString(8, GSON.toJson(guild.getHome()));
|
statement.setString(8, GSON.toJson(guild.getRanks()));
|
||||||
statement.setBoolean(9, guild.isTagEnabled());
|
statement.setString(9, GSON.toJson(guild.getDefaultRank()));
|
||||||
|
statement.setString(10, GSON.toJson(guild.getHome()));
|
||||||
|
statement.setBoolean(11, guild.isTagEnabled());
|
||||||
statement.execute();
|
statement.execute();
|
||||||
return guild;
|
return guild;
|
||||||
} catch (SQLException e)
|
} catch (SQLException e)
|
||||||
|
@ -27,6 +27,8 @@ public class SQLManager
|
|||||||
"`home` VARCHAR(1000)," +
|
"`home` VARCHAR(1000)," +
|
||||||
"`members` LONGTEXT, " +
|
"`members` LONGTEXT, " +
|
||||||
"`moderators` LONGTEXT, " +
|
"`moderators` LONGTEXT, " +
|
||||||
|
"`ranks` LONGTEXT, " +
|
||||||
|
"`defaultRank` LONGTEXT, " +
|
||||||
"`tagEnabled` BOOLEAN" +
|
"`tagEnabled` BOOLEAN" +
|
||||||
");"
|
");"
|
||||||
).execute();
|
).execute();
|
||||||
|
@ -4,13 +4,12 @@ import com.google.common.collect.Lists;
|
|||||||
import dev.morphia.annotations.Entity;
|
import dev.morphia.annotations.Entity;
|
||||||
import dev.morphia.annotations.Transient;
|
import dev.morphia.annotations.Transient;
|
||||||
import dev.plex.Plex;
|
import dev.plex.Plex;
|
||||||
|
import dev.plex.guild.data.Member;
|
||||||
|
import dev.plex.guild.data.Rank;
|
||||||
import dev.plex.util.CustomLocation;
|
import dev.plex.util.CustomLocation;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -23,14 +22,15 @@ public class Guild
|
|||||||
private final String name;
|
private final String name;
|
||||||
private final UUID owner;
|
private final UUID owner;
|
||||||
private final ZonedDateTime createdAt;
|
private final ZonedDateTime createdAt;
|
||||||
@Transient
|
private transient final List<UUID> outgoingInvitations = Lists.newArrayList();
|
||||||
private final List<UUID> outgoingInvitations = Lists.newArrayList();
|
private final List<Member> members = Lists.newArrayList();
|
||||||
private final List<UUID> members = Lists.newArrayList();
|
|
||||||
private final List<UUID> moderators = Lists.newArrayList();
|
private final List<UUID> moderators = Lists.newArrayList();
|
||||||
|
private final List<Rank> ranks = Lists.newArrayList();
|
||||||
private String prefix;
|
private String prefix;
|
||||||
private String motd;
|
private String motd;
|
||||||
private CustomLocation home;
|
private CustomLocation home;
|
||||||
private boolean tagEnabled;
|
private boolean tagEnabled;
|
||||||
|
private Rank defaultRank = new Rank("default", null);
|
||||||
|
|
||||||
public static Guild create(Player player, String guildName)
|
public static Guild create(Player player, String guildName)
|
||||||
{
|
{
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
package dev.plex.guild;
|
package dev.plex.guild;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
import dev.plex.guild.data.Member;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class GuildHolder
|
public class GuildHolder
|
||||||
{
|
{
|
||||||
@ -23,7 +25,7 @@ public class GuildHolder
|
|||||||
|
|
||||||
public Optional<Guild> getGuild(UUID uuid)
|
public Optional<Guild> getGuild(UUID uuid)
|
||||||
{
|
{
|
||||||
return GUILDS.stream().filter(guild -> guild.getOwner().equals(uuid) || guild.getMembers().contains(uuid)).findFirst();
|
return GUILDS.stream().filter(guild -> guild.getOwner().equals(uuid) || guild.getMembers().stream().map(Member::uuid).toList().contains(uuid)).findFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
7
src/main/java/dev/plex/guild/data/Member.java
Normal file
7
src/main/java/dev/plex/guild/data/Member.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package dev.plex.guild.data;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public record Member(UUID uuid, Rank rank)
|
||||||
|
{
|
||||||
|
}
|
5
src/main/java/dev/plex/guild/data/Rank.java
Normal file
5
src/main/java/dev/plex/guild/data/Rank.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package dev.plex.guild.data;
|
||||||
|
|
||||||
|
public record Rank(String name, String prefix)
|
||||||
|
{
|
||||||
|
}
|
82
src/main/java/dev/plex/handler/ChatHandlerImpl.java
Normal file
82
src/main/java/dev/plex/handler/ChatHandlerImpl.java
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
package dev.plex.handler;
|
||||||
|
|
||||||
|
import dev.plex.Guilds;
|
||||||
|
import dev.plex.Plex;
|
||||||
|
import dev.plex.api.chat.IChatHandler;
|
||||||
|
import dev.plex.cache.PlayerCache;
|
||||||
|
import dev.plex.player.PlexPlayer;
|
||||||
|
import dev.plex.util.PlexUtils;
|
||||||
|
import dev.plex.util.minimessage.SafeMiniMessage;
|
||||||
|
import io.papermc.paper.chat.ChatRenderer;
|
||||||
|
import io.papermc.paper.event.player.AsyncChatEvent;
|
||||||
|
import net.kyori.adventure.audience.Audience;
|
||||||
|
import net.kyori.adventure.text.Component;
|
||||||
|
import net.kyori.adventure.text.TextReplacementConfig;
|
||||||
|
import net.kyori.adventure.text.event.ClickEvent;
|
||||||
|
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 org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
public class ChatHandlerImpl implements IChatHandler
|
||||||
|
{
|
||||||
|
private final static TextReplacementConfig URL_REPLACEMENT_CONFIG = TextReplacementConfig.builder().match("(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]").replacement((matchResult, builder) -> Component.empty().content(matchResult.group()).clickEvent(ClickEvent.openUrl(matchResult.group()))).build();
|
||||||
|
private final PlexChatRenderer renderer = new PlexChatRenderer();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doChat(AsyncChatEvent event)
|
||||||
|
{
|
||||||
|
PlexPlayer plexPlayer = PlayerCache.getPlexPlayerMap().get(event.getPlayer().getUniqueId());
|
||||||
|
Component prefix = Plex.get().getRankManager().getPrefix(plexPlayer);
|
||||||
|
|
||||||
|
if (prefix != null)
|
||||||
|
{
|
||||||
|
renderer.hasPrefix = true;
|
||||||
|
renderer.prefix = prefix;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
renderer.hasPrefix = false;
|
||||||
|
renderer.prefix = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.renderer(renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class PlexChatRenderer implements ChatRenderer
|
||||||
|
{
|
||||||
|
public boolean hasPrefix;
|
||||||
|
public Component prefix;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Component render(@NotNull Player source, @NotNull Component sourceDisplayName, @NotNull Component message, @NotNull Audience viewer)
|
||||||
|
{
|
||||||
|
String text = PlexUtils.getTextFromComponent(message);
|
||||||
|
|
||||||
|
AtomicBoolean guildPrefix = new AtomicBoolean(false);
|
||||||
|
AtomicReference<Component> component = new AtomicReference<>(Component.empty());
|
||||||
|
Guilds.get().getGuildHolder().getGuild(source.getUniqueId()).ifPresent(guild -> {
|
||||||
|
if (guild.getPrefix() != null)
|
||||||
|
{
|
||||||
|
component.set(component.get().append(MiniMessage.miniMessage().deserialize(guild.getPrefix())));
|
||||||
|
guildPrefix.set(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (hasPrefix)
|
||||||
|
{
|
||||||
|
if (guildPrefix.get())
|
||||||
|
{
|
||||||
|
component.set(component.get().append(Component.space()));
|
||||||
|
}
|
||||||
|
component.set(component.get().append(prefix));
|
||||||
|
}
|
||||||
|
|
||||||
|
return component.get().append(Component.space()).append(PlexUtils.mmDeserialize(Plex.get().config.getString("chat.name-color", "<white>") + MiniMessage.builder().tags(TagResolver.resolver(StandardTags.color(), StandardTags.rainbow(), StandardTags.decorations(), StandardTags.gradient(), StandardTags.transition())).build().serialize(sourceDisplayName))).append(Component.space()).append(Component.text("»").color(NamedTextColor.GRAY)).append(Component.space()).append(SafeMiniMessage.mmDeserializeWithoutEvents(text)).replaceText(URL_REPLACEMENT_CONFIG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user