3 Commits
Author SHA1 Message Date
oskar3123 d0cc86103a version 1.3.0
spigot version:
  now sends a bungeecord forward plugin message to display on all servers under the same proxy
both versions:
  message is now editable in the events
2018-11-21 14:32:06 +01:00
oskar3123 c57fb7223a version 1.2.0
added /staffchat toggle
added placeholderapi support (spigot version only)
small fixes for bungeecord version
2018-11-20 19:12:59 +01:00
oskar3123 9e8278d439 remove coverage shield 2018-07-30 13:33:59 +02:00
13 changed files with 302 additions and 23 deletions
-1
View File
@@ -2,7 +2,6 @@
[![All Release](https://img.shields.io/github/downloads/oskar3123/StaffChat/total.svg?style=flat)](https://github.com/oskar3123/StaffChat/releases/latest)
[![Latest Release](https://img.shields.io/github/release/oskar3123/StaffChat.svg?style=flat)](https://github.com/oskar3123/StaffChat/releases/latest)
[![Github commits (since latest release)](https://img.shields.io/github/commits-since/oskar3123/StaffChat/latest.svg?style=flat)](https://github.com/oskar3123/StaffChat/commits/master)
[![Coverage Status](https://coveralls.io/repos/github/oskar3123/StaffChat/badge.svg?branch=master)](https://coveralls.io/github/oskar3123/StaffChat?branch=master)
# [StaffChat](https://oskar3123.github.io/StaffChat)
+14 -3
View File
@@ -7,7 +7,7 @@
<groupId>me.oskar3123</groupId>
<artifactId>staffchat</artifactId>
<version>1.1.5-SNAPSHOT</version>
<version>1.3.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -22,27 +22,38 @@
<id>bungeecord-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
<repository>
<id>placeholderapi</id>
<url>http://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13-R0.1-SNAPSHOT</version>
<version>1.13.2-R0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.13-R0.1-SNAPSHOT</version>
<version>1.13.2-R0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.13-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.9.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.name}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@@ -19,6 +19,7 @@ public class BungeeMain extends Plugin
public final String seePerm = "staffchat.see";
public final String commandPerm = "staffchat.command";
public final String reloadPerm = "staffchat.reload";
public final BungeeChatListener chatListener = new BungeeChatListener(this);
private Configuration config;
public void onEnable()
@@ -40,7 +41,7 @@ public class BungeeMain extends Plugin
private void registerEvents()
{
getProxy().getPluginManager().registerListener(this, new BungeeChatListener(this));
getProxy().getPluginManager().registerListener(this, chatListener);
}
public boolean reloadConfig()
@@ -48,15 +49,42 @@ public class BungeeMain extends Plugin
try
{
config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "config.yml"));
loadDefaultValues();
return true;
}
catch (IOException e)
{
config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(getResourceAsStream("config.yml"));
loadDefaultValues();
return false;
}
}
private void loadDefaultValues()
{
String[] keys = new String[] {
"settings.character",
"settings.format",
"messages.prefix",
"messages.nopermission",
"messages.playeronly",
"messages.reloaded",
"messages.toggled",
"messages.onstring",
"messages.offstring",
};
Configuration def = ConfigurationProvider.getProvider(YamlConfiguration.class).load(getResourceAsStream("config.yml"));
for (String key : keys)
{
String v = config.getString(key);
if (v == null || v.isEmpty())
{
config.set(key, def.getString(key));
}
}
saveConfig();
}
public Configuration getConfig()
{
return config;
@@ -85,4 +113,17 @@ public class BungeeMain extends Plugin
}
}
public void saveConfig()
{
try
{
ConfigurationProvider.getProvider(YamlConfiguration.class).save(config, new File(getDataFolder(), "config.yml"));
}
catch (IOException e)
{
e.printStackTrace();
getLogger().severe("Failed to save config");
}
}
}
@@ -5,6 +5,7 @@ import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.config.Configuration;
@@ -46,13 +47,35 @@ public class BungeeStaffChatCommand extends Command
}
return;
}
else if (args[0].equalsIgnoreCase("toggle"))
{
if (sender.hasPermission(plugin.usePerm))
{
toggle(sender);
}
else
{
sender.sendMessage(noPerm);
}
return;
}
help(sender, getName());
}
private void playerOnly(CommandSender sender)
{
sender.sendMessage(txt(config.getString("messages.prefix") + config.getString("messages.playeronly")));
}
private void help(CommandSender sender, String label)
{
String prefix = config.getString("messages.prefix");
sender.sendMessage(txt(prefix + "Version " + plugin.getDescription().getVersion() + ", made by oskar3123"));
if (sender.hasPermission(plugin.usePerm))
{
sender.sendMessage(txt(prefix + "Message prefix: " + config.getString("settings.character")));
sender.sendMessage(txt(prefix + "/" + label + " toggle - Toggles auto staffchat"));
}
if (sender.hasPermission(plugin.reloadPerm))
{
sender.sendMessage(txt(prefix + "/" + label + " reload - Reloads the config file"));
@@ -66,6 +89,18 @@ public class BungeeStaffChatCommand extends Command
sender.sendMessage(txt(config.getString("messages.prefix") + config.getString("messages.reloaded")));
}
private void toggle(CommandSender sender)
{
if (!(sender instanceof ProxiedPlayer))
{
playerOnly(sender);
return;
}
boolean toggled = plugin.chatListener.togglePlayer(((ProxiedPlayer) sender).getUniqueId());
String state = toggled ? config.getString("messages.onstring") : config.getString("messages.offstring");
sender.sendMessage(txt(config.getString("messages.prefix") + String.format(config.getString("messages.toggled"), state)));
}
private String clr(String string)
{
return ChatColor.translateAlternateColorCodes('&', string);
@@ -7,10 +7,10 @@ import net.md_5.bungee.api.plugin.Event;
public class BungeeStaffChatEvent extends Event implements Cancellable
{
private final String message;
private final ProxiedPlayer player;
private boolean cancelled = false;
private String format;
private String message;
public BungeeStaffChatEvent(ProxiedPlayer player, String format, String message)
{
@@ -34,6 +34,11 @@ public class BungeeStaffChatEvent extends Event implements Cancellable
return message;
}
public void setMessage(String message)
{
this.message = message;
}
public ProxiedPlayer getPlayer()
{
return player;
@@ -12,10 +12,15 @@ import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.event.EventHandler;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class BungeeChatListener implements Listener
{
private BungeeMain plugin;
private Set<UUID> toggledPlayers = new HashSet<>();
public BungeeChatListener(BungeeMain plugin)
{
@@ -25,6 +30,10 @@ public class BungeeChatListener implements Listener
@EventHandler
public void chat(ChatEvent event)
{
if (event.getMessage().startsWith("/"))
{
return;
}
if (!(event.getSender() instanceof ProxiedPlayer))
{
return;
@@ -38,13 +47,14 @@ public class BungeeChatListener implements Listener
Configuration config = plugin.getConfig();
String character = config.getString("settings.character");
if (!event.getMessage().startsWith(character))
boolean isToggled = toggledPlayers.contains(player.getUniqueId());
if (!event.getMessage().startsWith(character) && !isToggled)
{
return;
}
String format = config.getString("settings.format");
String message = event.getMessage().substring(character.length()).trim();
String message = event.getMessage().substring(isToggled ? 0 : character.length()).trim();
BungeeStaffChatEvent chatEvent = new BungeeStaffChatEvent(player, format, message);
plugin.getProxy().getPluginManager().callEvent(chatEvent);
@@ -53,6 +63,7 @@ public class BungeeChatListener implements Listener
return;
}
format = chatEvent.getFormat();
message = chatEvent.getMessage();
format = format.replaceAll("\\{NAME\\}", StringUtils.sanitize(player.getName()));
format = format.replaceAll("\\{MESSAGE\\}", StringUtils.sanitize(message));
@@ -76,4 +87,15 @@ public class BungeeChatListener implements Listener
return TextComponent.fromLegacyText(clr(text));
}
public boolean togglePlayer(UUID player)
{
if (toggledPlayers.contains(player))
{
toggledPlayers.remove(player);
return false;
}
toggledPlayers.add(player);
return true;
}
}
@@ -1,8 +1,10 @@
package me.oskar3123.staffchat.spigot;
import me.clip.placeholderapi.PlaceholderAPI;
import me.oskar3123.staffchat.spigot.command.StaffChatCommand;
import me.oskar3123.staffchat.spigot.listener.ChatListener;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin
@@ -12,15 +14,26 @@ 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 void onEnable()
{
getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", chatListener);
new MetricsLite(this);
saveDefaultConfig();
registerCommands();
registerEvents();
}
@Override
public void saveDefaultConfig()
{
super.saveDefaultConfig();
getConfig().options().copyDefaults(true);
saveConfig();
}
private void registerCommands()
{
getCommand("staffchat").setExecutor(new StaffChatCommand(this));
@@ -28,7 +41,21 @@ public class Main extends JavaPlugin
private void registerEvents()
{
Bukkit.getPluginManager().registerEvents(new ChatListener(this), this);
Bukkit.getPluginManager().registerEvents(this.chatListener, this);
}
private boolean isPlaceholderApiEnabled()
{
return Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI");
}
public String replacePlaceholders(Player player, String string)
{
if (!isPlaceholderApiEnabled())
{
return string;
}
return PlaceholderAPI.setPlaceholders(player, string);
}
}
@@ -6,6 +6,7 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
public class StaffChatCommand implements CommandExecutor
{
@@ -45,14 +46,36 @@ public class StaffChatCommand implements CommandExecutor
}
return true;
}
else if (args[0].equalsIgnoreCase("toggle"))
{
if (sender.hasPermission(plugin.usePerm))
{
toggle(sender);
}
else
{
sender.sendMessage(noPerm);
}
return true;
}
help(sender, label);
return true;
}
private void playerOnly(CommandSender sender)
{
sender.sendMessage(clr(config.getString("messages.prefix") + config.getString("messages.playeronly")));
}
private void help(CommandSender sender, String label)
{
String prefix = clr(config.getString("messages.prefix"));
sender.sendMessage(prefix + "Version " + plugin.getDescription().getVersion() + ", made by oskar3123");
if (sender.hasPermission(plugin.usePerm))
{
sender.sendMessage(prefix + "Message prefix: " + config.getString("settings.character"));
sender.sendMessage(prefix + "/" + label + " toggle - Toggles auto staffchat");
}
if (sender.hasPermission(plugin.reloadPerm))
{
sender.sendMessage(prefix + "/" + label + " reload - Reloads the config file");
@@ -66,6 +89,18 @@ public class StaffChatCommand implements CommandExecutor
sender.sendMessage(clr(config.getString("messages.prefix") + config.getString("messages.reloaded")));
}
private void toggle(CommandSender sender)
{
if (!(sender instanceof Player))
{
playerOnly(sender);
return;
}
boolean toggled = plugin.chatListener.togglePlayer(((Player) sender).getUniqueId());
String state = toggled ? config.getString("messages.onstring") : config.getString("messages.offstring");
sender.sendMessage(clr(config.getString("messages.prefix") + String.format(config.getString("messages.toggled"), state)));
}
private String clr(String string)
{
return ChatColor.translateAlternateColorCodes('&', string);
@@ -10,9 +10,9 @@ public class StaffChatEvent extends Event implements Cancellable
private static HandlerList handlerList = new HandlerList();
private final Player player;
private final String message;
private boolean cancelled = false;
private String format;
private String message;
public StaffChatEvent(Player player, String format, String message)
{
@@ -46,6 +46,11 @@ public class StaffChatEvent extends Event implements Cancellable
return message;
}
public void setMessage(String message)
{
this.message = message;
}
@Override
public HandlerList getHandlers()
{
@@ -1,19 +1,30 @@
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 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.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.plugin.messaging.PluginMessageListener;
public class ChatListener implements Listener
import java.io.*;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class ChatListener implements Listener, PluginMessageListener
{
private Main plugin;
private Set<UUID> toggledPlayers = new HashSet<>();
public ChatListener(Main plugin)
{
@@ -30,13 +41,18 @@ public class ChatListener implements Listener
FileConfiguration config = plugin.getConfig();
String character = config.getString("settings.character");
if (!event.getMessage().startsWith(character))
boolean isToggled = toggledPlayers.contains(event.getPlayer().getUniqueId());
if (!event.getMessage().startsWith(character) && !isToggled)
{
return;
}
String format = config.getString("settings.format");
String message = event.getMessage().substring(character.length()).trim();
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.getPlayer(), format, message);
Bukkit.getServer().getPluginManager().callEvent(chatEvent);
@@ -45,18 +61,95 @@ public class ChatListener implements Listener
return;
}
format = chatEvent.getFormat();
message = chatEvent.getMessage();
format = plugin.replacePlaceholders(event.getPlayer(), format);
format = format.replaceAll("\\{NAME\\}", StringUtils.sanitize(event.getPlayer().getName()));
format = format.replaceAll("\\{MESSAGE\\}", StringUtils.sanitize(message));
format = ChatColor.translateAlternateColorCodes('&', format);
format = format.replaceAll("\\{MESSAGE\\}", StringUtils.sanitize(message));
final String finalMessage = format;
Bukkit.getOnlinePlayers().stream()
.filter(p -> p.hasPermission(plugin.seePerm))
.forEach(p -> p.sendMessage(finalMessage));
plugin.getLogger().info(ChatColor.stripColor(finalMessage));
if (plugin.getConfig().getBoolean("settings.sendmessagestoallservers"))
{
sendForwardPluginMessage(event.getPlayer(), finalMessage);
}
sendStaffChatMessage(finalMessage);
event.setCancelled(true);
}
@Override
public void onPluginMessageReceived(String channel, 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(final 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(Player player, final String finalMessage)
{
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(finalMessage);
}
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());
}
public boolean togglePlayer(UUID player)
{
if (toggledPlayers.contains(player))
{
toggledPlayers.remove(player);
return false;
}
toggledPlayers.add(player);
return true;
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
name: StaffChat
authors: [oskar3123]
main: me.oskar3123.staffchat.bungee.BungeeMain
version: 1.1.5
version: 1.3.0
+7 -1
View File
@@ -1,7 +1,13 @@
settings:
character: '@'
format: '&b{NAME}: {MESSAGE}'
replaceplaceholdersinmessage: true
sendmessagestoallservers: true
messages:
prefix: '&7StaffChat&8> &7'
nopermission: '&cYou don''t have permission to do that'
reloaded: 'Reloaded the config file'
playeronly: '&cPlayer only command'
reloaded: 'Reloaded the config file'
toggled: 'You toggled auto staffchat %s'
onstring: 'on'
offstring: 'off'
+3 -3
View File
@@ -1,13 +1,13 @@
name: StaffChat
authors: [oskar3123]
main: me.oskar3123.staffchat.spigot.Main
version: 1.1.5
api-version: 1.13
version: 1.3.0
softdepend: [PlaceholderAPI]
commands:
staffchat:
usage: /<command>
description: Used to reload the config file.
permissions:
staffchat.*:
description: Gives you permission to everything in the plugin.