Merge pull request #13 from oskar3123/5-discordsrv-support-2

#5: DiscordSRV support 2
This commit is contained in:
Oskar Nordling 2022-03-22 01:55:13 +01:00 committed by GitHub
commit d7be18f0cb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 267 additions and 151 deletions

View File

@ -1,12 +1,17 @@
package me.oskar3123.staffchat.spigot;
import github.scarsz.discordsrv.DiscordSRV;
import java.util.Optional;
import me.clip.placeholderapi.PlaceholderAPI;
import me.oskar3123.staffchat.spigot.command.StaffChatCommand;
import me.oskar3123.staffchat.spigot.handler.StaffChatHandler;
import me.oskar3123.staffchat.spigot.listener.ChatListener;
import me.oskar3123.staffchat.spigot.listener.DiscordSrvListener;
import me.oskar3123.staffchat.spigot.listener.StaffChatPml;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
public class Main extends JavaPlugin {
@ -14,15 +19,20 @@ public class Main extends JavaPlugin {
public final String seePerm = "staffchat.see";
public final String commandPerm = "staffchat.command";
public final String reloadPerm = "staffchat.reload";
public final ChatListener chatListener = new ChatListener(this);
public final StaffChatHandler staffChatHandler = new StaffChatHandler(this);
public final ChatListener chatListener = new ChatListener(staffChatHandler);
public final StaffChatPml staffChatPml = new StaffChatPml(staffChatHandler);
public void onEnable() {
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", chatListener);
getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", staffChatPml);
new MetricsLite(this);
saveDefaultConfig();
registerCommands();
registerEvents();
if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) {
DiscordSRV.api.subscribe(new DiscordSrvListener(this));
}
}
@Override
@ -45,7 +55,7 @@ public class Main extends JavaPlugin {
return Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI");
}
public String replacePlaceholders(Player player, String string) {
public @NotNull String replacePlaceholders(Player player, String string) {
if (!isPlaceholderApiEnabled()) {
return string;
}

View File

@ -86,7 +86,7 @@ public class StaffChatCommand implements CommandExecutor {
playerOnly(sender);
return;
}
boolean toggled = plugin.chatListener.togglePlayer(((Player) sender).getUniqueId());
boolean toggled = plugin.staffChatHandler.togglePlayer(((Player) sender).getUniqueId());
String state =
toggled ? config.getString("messages.onstring") : config.getString("messages.offstring");
sender.sendMessage(

View File

@ -0,0 +1,167 @@
package me.oskar3123.staffchat.spigot.handler;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.util.DiscordUtil;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import me.oskar3123.staffchat.spigot.Main;
import me.oskar3123.staffchat.spigot.event.StaffChatEvent;
import me.oskar3123.staffchat.util.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.jetbrains.annotations.NotNull;
public class StaffChatHandler {
private final Main plugin;
private final Set<UUID> toggledPlayers = new HashSet<>();
public StaffChatHandler(Main plugin) {
this.plugin = plugin;
}
public void onChatEvent(@NotNull AsyncPlayerChatEvent event) {
if (!event.getPlayer().hasPermission(plugin.usePerm)) {
return;
}
FileConfiguration config = plugin.getConfig();
String character = Objects.requireNonNull(config.getString("settings.character", "@"));
boolean isToggled = toggledPlayers.contains(event.getPlayer().getUniqueId());
if (!event.getMessage().startsWith(character) && !isToggled) {
return;
}
String format = Objects.requireNonNull(config.getString("settings.format", ""));
String message = event.getMessage().substring(isToggled ? 0 : character.length()).trim();
if (config.getBoolean("settings.replaceplaceholdersinmessage")) {
message = plugin.replacePlaceholders(event.getPlayer(), message);
}
StaffChatEvent chatEvent =
new StaffChatEvent(event.isAsynchronous(), event.getPlayer(), format, message);
Bukkit.getServer().getPluginManager().callEvent(chatEvent);
if (chatEvent.isCancelled()) {
return;
}
format = chatEvent.getFormat();
message = chatEvent.getMessage();
format = plugin.replacePlaceholders(event.getPlayer(), format);
sendStaffChatMessage(format, event.getPlayer().getName(), message);
if (plugin.getConfig().getBoolean("discordsrv.enable")) {
sendDiscordMessage(event.getPlayer(), message);
}
event.setCancelled(true);
}
public void sendStaffChatMessage(String format, String name, String message) {
format = format.replaceAll("\\{NAME}", StringUtils.sanitize(name));
format = ChatColor.translateAlternateColorCodes('&', format);
format = format.replaceAll("\\{MESSAGE}", StringUtils.sanitize(message));
final String finalMessage = format;
if (plugin.getConfig().getBoolean("settings.sendmessagestoallservers")) {
// Find any player and send using that object
// (which player sends the plugin message is not important)
Bukkit.getOnlinePlayers().stream()
.findAny()
.ifPresent(player -> sendForwardPluginMessage(player, finalMessage));
}
sendStaffChatMessage(finalMessage);
}
public void onPluginMessageReceived(@NotNull String channel, byte[] message) {
if (!channel.equals("BungeeCord")) {
return;
}
ByteArrayDataInput in = ByteStreams.newDataInput(message);
String subChannel = in.readUTF();
if (!subChannel.equals("StaffChat")) {
return;
}
short len = in.readShort();
byte[] msgbytes = new byte[len];
in.readFully(msgbytes);
DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(msgbytes));
String actualMessage;
try {
actualMessage = msgin.readUTF();
} catch (IOException e) {
e.printStackTrace();
plugin.getLogger().severe("Failed to read plugin message from bungeecord");
return;
}
sendStaffChatMessage(actualMessage);
}
private void sendForwardPluginMessage(@NotNull Player player, @NotNull String message) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Forward");
out.writeUTF("ONLINE");
out.writeUTF("StaffChat");
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DataOutputStream dataStream = new DataOutputStream(byteStream);
try {
dataStream.writeUTF(message);
} catch (IOException e) {
e.printStackTrace();
plugin.getLogger().severe("Failed to send plugin message to bungeecord");
return;
}
byte[] data = byteStream.toByteArray();
out.writeShort(data.length);
out.write(data);
player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray());
}
private void sendStaffChatMessage(@NotNull String message) {
Bukkit.getOnlinePlayers().stream()
.filter(p -> p.hasPermission(plugin.seePerm))
.forEach(p -> p.sendMessage(message));
plugin.getLogger().info(ChatColor.stripColor(message));
}
private void sendDiscordMessage(Player player, String message) {
if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) {
String format =
plugin
.replacePlaceholders(
player,
plugin.getConfig().getString("discordsrv.minecraft-to-discord-format", ""))
.replaceAll("\\{NAME}", StringUtils.sanitize(player.getName()))
.replaceAll("\\{MESSAGE}", StringUtils.sanitize(message));
DiscordUtil.sendMessage(
DiscordSRV.getPlugin()
.getOptionalTextChannel(
plugin.getConfig().getString("discordsrv.channel", "staffchat")),
format);
}
}
public boolean togglePlayer(@NotNull UUID player) {
if (toggledPlayers.contains(player)) {
toggledPlayers.remove(player);
return false;
}
toggledPlayers.add(player);
return true;
}
}

View File

@ -1,161 +1,21 @@
package me.oskar3123.staffchat.spigot.listener;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.util.DiscordUtil;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import me.oskar3123.staffchat.spigot.Main;
import me.oskar3123.staffchat.spigot.event.StaffChatEvent;
import me.oskar3123.staffchat.util.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import me.oskar3123.staffchat.spigot.handler.StaffChatHandler;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.jetbrains.annotations.NotNull;
public class ChatListener implements Listener, PluginMessageListener {
public class ChatListener implements Listener {
private final Main plugin;
private final Set<UUID> toggledPlayers = new HashSet<>();
private final StaffChatHandler staffChatHandler;
public ChatListener(@NotNull Main plugin) {
this.plugin = plugin;
public ChatListener(@NotNull StaffChatHandler staffChatHandler) {
this.staffChatHandler = staffChatHandler;
}
@EventHandler
public void chat(@NotNull AsyncPlayerChatEvent event) {
if (!event.getPlayer().hasPermission(plugin.usePerm)) {
return;
}
FileConfiguration config = plugin.getConfig();
String character = Objects.requireNonNull(config.getString("settings.character", "@"));
boolean isToggled = toggledPlayers.contains(event.getPlayer().getUniqueId());
if (!event.getMessage().startsWith(character) && !isToggled) {
return;
}
String format = Objects.requireNonNull(config.getString("settings.format", ""));
String message = event.getMessage().substring(isToggled ? 0 : character.length()).trim();
if (config.getBoolean("settings.replaceplaceholdersinmessage")) {
message = plugin.replacePlaceholders(event.getPlayer(), message);
}
StaffChatEvent chatEvent =
new StaffChatEvent(event.isAsynchronous(), event.getPlayer(), format, message);
Bukkit.getServer().getPluginManager().callEvent(chatEvent);
if (chatEvent.isCancelled()) {
return;
}
format = chatEvent.getFormat();
message = chatEvent.getMessage();
format = plugin.replacePlaceholders(event.getPlayer(), format);
format = format.replaceAll("\\{NAME}", StringUtils.sanitize(event.getPlayer().getName()));
format = ChatColor.translateAlternateColorCodes('&', format);
format = format.replaceAll("\\{MESSAGE}", StringUtils.sanitize(message));
final String finalMessage = format;
if (plugin.getConfig().getBoolean("discordsrv.enable")) {
sendDiscordMessage(event.getPlayer(), message);
}
if (plugin.getConfig().getBoolean("settings.sendmessagestoallservers")) {
sendForwardPluginMessage(event.getPlayer(), finalMessage);
}
sendStaffChatMessage(finalMessage);
event.setCancelled(true);
}
@Override
public void onPluginMessageReceived(
@NotNull String channel, @NotNull Player player, byte[] message) {
if (!channel.equals("BungeeCord")) {
return;
}
ByteArrayDataInput in = ByteStreams.newDataInput(message);
String subChannel = in.readUTF();
if (!subChannel.equals("StaffChat")) {
return;
}
short len = in.readShort();
byte[] msgbytes = new byte[len];
in.readFully(msgbytes);
DataInputStream msgin = new DataInputStream(new ByteArrayInputStream(msgbytes));
String actualMessage;
try {
actualMessage = msgin.readUTF();
} catch (IOException e) {
e.printStackTrace();
plugin.getLogger().severe("Failed to read plugin message from bungeecord");
return;
}
sendStaffChatMessage(actualMessage);
}
private void sendStaffChatMessage(@NotNull String message) {
Bukkit.getOnlinePlayers().stream()
.filter(p -> p.hasPermission(plugin.seePerm))
.forEach(p -> p.sendMessage(message));
plugin.getLogger().info(ChatColor.stripColor(message));
}
private void sendForwardPluginMessage(@NotNull Player player, @NotNull String message) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Forward");
out.writeUTF("ONLINE");
out.writeUTF("StaffChat");
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
DataOutputStream dataStream = new DataOutputStream(byteStream);
try {
dataStream.writeUTF(message);
} catch (IOException e) {
e.printStackTrace();
plugin.getLogger().severe("Failed to send plugin message to bungeecord");
return;
}
byte[] data = byteStream.toByteArray();
out.writeShort(data.length);
out.write(data);
player.sendPluginMessage(plugin, "BungeeCord", out.toByteArray());
}
private void sendDiscordMessage(Player player, String message) {
if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) {
String format =
plugin
.replacePlaceholders(player, plugin.getConfig().getString("discordsrv.format", ""))
.replaceAll("\\{NAME}", StringUtils.sanitize(player.getName()))
.replaceAll("\\{MESSAGE}", StringUtils.sanitize(message));
DiscordUtil.sendMessage(
DiscordSRV.getPlugin()
.getOptionalTextChannel(
plugin.getConfig().getString("discordsrv.channel", "staffchat")),
format);
}
}
public boolean togglePlayer(@NotNull UUID player) {
if (toggledPlayers.contains(player)) {
toggledPlayers.remove(player);
return false;
}
toggledPlayers.add(player);
return true;
staffChatHandler.onChatEvent(event);
}
}

View File

@ -0,0 +1,57 @@
package me.oskar3123.staffchat.spigot.listener;
import github.scarsz.discordsrv.DiscordSRV;
import github.scarsz.discordsrv.api.ListenerPriority;
import github.scarsz.discordsrv.api.Subscribe;
import github.scarsz.discordsrv.api.events.DiscordGuildMessageReceivedEvent;
import github.scarsz.discordsrv.dependencies.jda.api.entities.Message;
import github.scarsz.discordsrv.dependencies.jda.api.entities.User;
import java.util.Optional;
import me.oskar3123.staffchat.spigot.Main;
import org.bukkit.Bukkit;
import org.bukkit.configuration.Configuration;
public class DiscordSrvListener {
private final Main plugin;
private final DiscordSRV discordSrv;
public DiscordSrvListener(Main plugin) {
this.plugin = plugin;
this.discordSrv = DiscordSRV.getPlugin();
}
@Subscribe(priority = ListenerPriority.MONITOR)
public void onDiscordGuildMessageReceivedEvent(DiscordGuildMessageReceivedEvent event) {
Configuration config = plugin.getConfig();
if (!isDiscordSrvEnabled(config)) {
return;
}
String channel = config.getString("discordsrv.channel", "staffchat");
Optional.ofNullable(discordSrv.getDestinationGameChannelNameForTextChannel(event.getChannel()))
.filter(gameChannel -> gameChannel.equals(channel))
.ifPresent(
gameChannel -> {
String name =
Optional.ofNullable(event.getAuthor()).map(User::getName).orElse("Discord User");
String message =
Optional.ofNullable(event.getMessage())
.map(Message::getContentDisplay)
.orElse("");
Bukkit.getScheduler()
.runTask(
plugin,
() ->
plugin.staffChatHandler.sendStaffChatMessage(
plugin
.getConfig()
.getString("discordsrv.discord-to-minecraft-format", ""),
name,
message));
});
}
private boolean isDiscordSrvEnabled(Configuration config) {
return config.getBoolean("discordsrv.enable", false);
}
}

View File

@ -0,0 +1,21 @@
package me.oskar3123.staffchat.spigot.listener;
import me.oskar3123.staffchat.spigot.handler.StaffChatHandler;
import org.bukkit.entity.Player;
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.jetbrains.annotations.NotNull;
public class StaffChatPml implements PluginMessageListener {
private final StaffChatHandler staffChatHandler;
public StaffChatPml(StaffChatHandler staffChatHandler) {
this.staffChatHandler = staffChatHandler;
}
@Override
public void onPluginMessageReceived(
@NotNull String channel, @NotNull Player player, byte[] message) {
staffChatHandler.onPluginMessageReceived(channel, message);
}
}

View File

@ -14,4 +14,5 @@ messages:
discordsrv:
enable: false
channel: 'staffchat'
format: '{NAME} » {MESSAGE}'
minecraft-to-discord-format: '{NAME} » {MESSAGE}'
discord-to-minecraft-format: '&b(Discord) {NAME}: {MESSAGE}'