mirror of
https://github.com/TotalFreedomMC/TF-EssentialsX.git
synced 2025-02-12 12:23:59 +00:00
resolve?
This commit is contained in:
parent
318df64e54
commit
a717f6d8ff
11 changed files with 0 additions and 791 deletions
|
@ -1,11 +0,0 @@
|
|||
dependencies {
|
||||
compileOnly project(':EssentialsX')
|
||||
implementation 'org.igniterealtime.smack:smack:3.2.1'
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
dependencies {
|
||||
include (dependency('org.igniterealtime.smack:smack'))
|
||||
}
|
||||
relocate 'org.bstats.bukkit', 'com.earth2me.essentials.metrics'
|
||||
}
|
|
@ -1,22 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.User;
|
||||
import com.earth2me.essentials.commands.EssentialsCommand;
|
||||
import com.earth2me.essentials.commands.NotEnoughArgumentsException;
|
||||
import org.bukkit.Server;
|
||||
|
||||
public class Commandsetxmpp extends EssentialsCommand {
|
||||
public Commandsetxmpp() {
|
||||
super("setxmpp");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws NotEnoughArgumentsException {
|
||||
if (args.length == 0) {
|
||||
throw new NotEnoughArgumentsException();
|
||||
}
|
||||
|
||||
EssentialsXMPP.getInstance().setAddress(user.getBase(), args[0]);
|
||||
user.sendMessage("XMPP address set to " + args[0]);
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.CommandSource;
|
||||
import com.earth2me.essentials.Console;
|
||||
import com.earth2me.essentials.commands.EssentialsCommand;
|
||||
import com.earth2me.essentials.commands.NotEnoughArgumentsException;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Server;
|
||||
|
||||
public class Commandxmpp extends EssentialsCommand {
|
||||
public Commandxmpp() {
|
||||
super("xmpp");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws NotEnoughArgumentsException {
|
||||
if (args.length < 2) {
|
||||
throw new NotEnoughArgumentsException();
|
||||
}
|
||||
|
||||
final String address = EssentialsXMPP.getInstance().getAddress(args[0]);
|
||||
if (address == null) {
|
||||
sender.sendMessage(ChatColor.RED + "There are no players matching that name.");
|
||||
return;
|
||||
}
|
||||
|
||||
final String message = getFinalArg(args, 1);
|
||||
final String senderName = sender.isPlayer() ? ess.getUser(sender.getPlayer()).getDisplayName() : Console.DISPLAY_NAME;
|
||||
sender.sendMessage("[" + senderName + ">" + address + "] " + message);
|
||||
if (!EssentialsXMPP.getInstance().sendMessage(address, "[" + senderName + "] " + message)) {
|
||||
sender.sendMessage(ChatColor.RED + "Error sending message.");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,35 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.ChargeException;
|
||||
import com.earth2me.essentials.CommandSource;
|
||||
import com.earth2me.essentials.User;
|
||||
import com.earth2me.essentials.commands.EssentialsLoopCommand;
|
||||
import com.earth2me.essentials.commands.NotEnoughArgumentsException;
|
||||
import com.earth2me.essentials.commands.PlayerExemptException;
|
||||
import com.earth2me.essentials.commands.PlayerNotFoundException;
|
||||
import net.ess3.api.MaxMoneyException;
|
||||
import org.bukkit.Server;
|
||||
|
||||
public class Commandxmppspy extends EssentialsLoopCommand {
|
||||
public Commandxmppspy() {
|
||||
super("xmppspy");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws NotEnoughArgumentsException, PlayerExemptException, MaxMoneyException, ChargeException, PlayerNotFoundException {
|
||||
if (args.length == 0) {
|
||||
throw new NotEnoughArgumentsException();
|
||||
}
|
||||
|
||||
loopOnlinePlayers(server, sender, false, true, args[0], args);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void updatePlayer(final Server server, final CommandSource sender, final User user, final String[] args) {
|
||||
try {
|
||||
sender.sendMessage("XMPP Spy " + (EssentialsXMPP.getInstance().toggleSpy(user.getBase()) ? "enabled" : "disabled") + " for " + user.getDisplayName());
|
||||
} catch (final Exception ex) {
|
||||
sender.sendMessage("Error: " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,139 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.IEssentials;
|
||||
import com.earth2me.essentials.metrics.MetricsWrapper;
|
||||
import net.ess3.api.IUser;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static com.earth2me.essentials.I18n.tl;
|
||||
|
||||
public class EssentialsXMPP extends JavaPlugin implements IEssentialsXMPP {
|
||||
private static EssentialsXMPP instance = null;
|
||||
private transient UserManager users;
|
||||
private transient XMPPManager xmpp;
|
||||
private transient IEssentials ess;
|
||||
private transient MetricsWrapper metrics = null;
|
||||
|
||||
static IEssentialsXMPP getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
static void updatePresence() {
|
||||
instance.xmpp.updatePresence();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
instance = this;
|
||||
|
||||
final PluginManager pluginManager = getServer().getPluginManager();
|
||||
ess = (IEssentials) pluginManager.getPlugin("Essentials");
|
||||
if (!this.getDescription().getVersion().equals(ess.getDescription().getVersion())) {
|
||||
getLogger().log(Level.WARNING, tl("versionMismatchAll"));
|
||||
}
|
||||
if (!ess.isEnabled()) {
|
||||
this.setEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
final EssentialsXMPPPlayerListener playerListener = new EssentialsXMPPPlayerListener(ess);
|
||||
pluginManager.registerEvents(playerListener, this);
|
||||
|
||||
users = new UserManager(this.getDataFolder());
|
||||
xmpp = new XMPPManager(this);
|
||||
|
||||
ess.addReloadListener(users);
|
||||
ess.addReloadListener(xmpp);
|
||||
|
||||
if (metrics == null) {
|
||||
metrics = new MetricsWrapper(this, 3818, true);
|
||||
metrics.addCustomChart(new Metrics.SimplePie("config-valid", () -> xmpp.isConfigValid() ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
if (xmpp != null) {
|
||||
xmpp.disconnect();
|
||||
}
|
||||
instance = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final CommandSender sender, final Command command, final String commandLabel, final String[] args) {
|
||||
metrics.markCommand(command.getName(), true);
|
||||
return ess.onCommandEssentials(sender, command, commandLabel, args, EssentialsXMPP.class.getClassLoader(), "com.earth2me.essentials.xmpp.Command", "essentials.", null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAddress(final Player user, final String address) {
|
||||
final String username = user.getName().toLowerCase(Locale.ENGLISH);
|
||||
instance.users.setAddress(username, address);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAddress(final String name) {
|
||||
return instance.users.getAddress(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IUser getUserByAddress(final String address) {
|
||||
final String username = instance.users.getUserByAddress(address);
|
||||
return username == null ? null : ess.getUser(username);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean toggleSpy(final Player user) {
|
||||
final String username = user.getName().toLowerCase(Locale.ENGLISH);
|
||||
final boolean spy = !instance.users.isSpy(username);
|
||||
instance.users.setSpy(username, spy);
|
||||
return spy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAddress(final Player user) {
|
||||
return instance.users.getAddress(user.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean sendMessage(final Player user, final String message) {
|
||||
return instance.xmpp.sendMessage(instance.users.getAddress(user.getName()), message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean sendMessage(final String address, final String message) {
|
||||
return instance.xmpp.sendMessage(address, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getSpyUsers() {
|
||||
return instance.users.getSpyUsers();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void broadcastMessage(final IUser sender, final String message, final String xmppAddress) {
|
||||
ess.broadcastMessage(sender, message);
|
||||
try {
|
||||
for (final String address : getSpyUsers()) {
|
||||
if (!address.equalsIgnoreCase(xmppAddress)) {
|
||||
sendMessage(address, message);
|
||||
}
|
||||
}
|
||||
} catch (final Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public IEssentials getEss() {
|
||||
return ess;
|
||||
}
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.IEssentials;
|
||||
import com.earth2me.essentials.User;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
class EssentialsXMPPPlayerListener implements Listener {
|
||||
private final transient IEssentials ess;
|
||||
|
||||
EssentialsXMPPPlayerListener(final IEssentials ess) {
|
||||
super();
|
||||
this.ess = ess;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerJoin(final PlayerJoinEvent event) {
|
||||
final User user = ess.getUser(event.getPlayer());
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(ess, EssentialsXMPP::updatePresence);
|
||||
|
||||
sendMessageToSpyUsers("Player " + user.getDisplayName() + " joined the game");
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerChat(final AsyncPlayerChatEvent event) {
|
||||
final User user = ess.getUser(event.getPlayer());
|
||||
sendMessageToSpyUsers(String.format(event.getFormat(), user.getDisplayName(), event.getMessage()));
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerQuit(final PlayerQuitEvent event) {
|
||||
final User user = ess.getUser(event.getPlayer());
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(ess, EssentialsXMPP::updatePresence);
|
||||
|
||||
sendMessageToSpyUsers("Player " + user.getDisplayName() + " left the game");
|
||||
}
|
||||
|
||||
private void sendMessageToSpyUsers(final String message) {
|
||||
try {
|
||||
final List<String> users = EssentialsXMPP.getInstance().getSpyUsers();
|
||||
synchronized (users) {
|
||||
for (final String address : users) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(ess, () -> EssentialsXMPP.getInstance().sendMessage(address, message));
|
||||
}
|
||||
}
|
||||
} catch (final Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.IEssentials;
|
||||
import net.ess3.api.IUser;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IEssentialsXMPP extends Plugin {
|
||||
String getAddress(final Player user);
|
||||
|
||||
String getAddress(final String name);
|
||||
|
||||
List<String> getSpyUsers();
|
||||
|
||||
IUser getUserByAddress(final String address);
|
||||
|
||||
boolean sendMessage(final Player user, final String message);
|
||||
|
||||
boolean sendMessage(final String address, final String message);
|
||||
|
||||
void setAddress(final Player user, final String address);
|
||||
|
||||
boolean toggleSpy(final Player user);
|
||||
|
||||
void broadcastMessage(final IUser sender, final String message, final String xmppAddress);
|
||||
|
||||
IEssentials getEss();
|
||||
}
|
|
@ -1,80 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.EssentialsConf;
|
||||
import com.earth2me.essentials.IConf;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class UserManager implements IConf {
|
||||
private static final String ADDRESS = "address";
|
||||
private static final String SPY = "spy";
|
||||
private final transient EssentialsConf users;
|
||||
private final transient List<String> spyusers = Collections.synchronizedList(new ArrayList<>());
|
||||
|
||||
UserManager(final File folder) {
|
||||
users = new EssentialsConf(new File(folder, "users.yml"));
|
||||
reloadConfig();
|
||||
}
|
||||
|
||||
final boolean isSpy(final String username) {
|
||||
return users.getBoolean(username.toLowerCase(Locale.ENGLISH) + "." + SPY, false);
|
||||
}
|
||||
|
||||
void setSpy(final String username, final boolean spy) {
|
||||
setUser(username.toLowerCase(Locale.ENGLISH), getAddress(username), spy);
|
||||
}
|
||||
|
||||
final String getAddress(final String username) {
|
||||
return users.getString(username.toLowerCase(Locale.ENGLISH) + "." + ADDRESS, null);
|
||||
}
|
||||
|
||||
final String getUserByAddress(final String search) {
|
||||
final Set<String> usernames = users.getKeys(false);
|
||||
for (final String username : usernames) {
|
||||
final String address = users.getString(username + "." + ADDRESS, null);
|
||||
if (search.equalsIgnoreCase(address)) {
|
||||
return username;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
void setAddress(final String username, final String address) {
|
||||
setUser(username.toLowerCase(Locale.ENGLISH), address, isSpy(username));
|
||||
}
|
||||
|
||||
List<String> getSpyUsers() {
|
||||
return spyusers;
|
||||
}
|
||||
|
||||
private void setUser(final String username, final String address, final boolean spy) {
|
||||
final Map<String, Object> userdata = new HashMap<>();
|
||||
userdata.put(ADDRESS, address);
|
||||
userdata.put(SPY, spy);
|
||||
users.setProperty(username, userdata);
|
||||
users.save();
|
||||
reloadConfig();
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void reloadConfig() {
|
||||
users.load();
|
||||
spyusers.clear();
|
||||
final Set<String> keys = users.getKeys(false);
|
||||
for (final String key : keys) {
|
||||
if (isSpy(key)) {
|
||||
final String address = getAddress(key);
|
||||
if (address != null) {
|
||||
spyusers.add(address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,345 +0,0 @@
|
|||
package com.earth2me.essentials.xmpp;
|
||||
|
||||
import com.earth2me.essentials.Console;
|
||||
import com.earth2me.essentials.EssentialsConf;
|
||||
import com.earth2me.essentials.IConf;
|
||||
import com.earth2me.essentials.utils.FormatUtil;
|
||||
import net.ess3.api.IUser;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jivesoftware.smack.Chat;
|
||||
import org.jivesoftware.smack.ChatManager;
|
||||
import org.jivesoftware.smack.ChatManagerListener;
|
||||
import org.jivesoftware.smack.ConnectionConfiguration;
|
||||
import org.jivesoftware.smack.MessageListener;
|
||||
import org.jivesoftware.smack.Roster.SubscriptionMode;
|
||||
import org.jivesoftware.smack.XMPPConnection;
|
||||
import org.jivesoftware.smack.XMPPException;
|
||||
import org.jivesoftware.smack.packet.Message;
|
||||
import org.jivesoftware.smack.packet.Presence;
|
||||
import org.jivesoftware.smack.util.StringUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Handler;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.LogRecord;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.SimpleFormatter;
|
||||
|
||||
import static com.earth2me.essentials.I18n.tl;
|
||||
|
||||
public class XMPPManager extends Handler implements MessageListener, ChatManagerListener, IConf {
|
||||
private static final Logger logger = Logger.getLogger("EssentialsXMPP");
|
||||
private static final SimpleFormatter formatter = new SimpleFormatter();
|
||||
private final transient EssentialsConf config;
|
||||
private final transient Map<String, Chat> chats = Collections.synchronizedMap(new HashMap<>());
|
||||
private final transient Set<LogRecord> logrecords = Collections.synchronizedSet(new HashSet<>());
|
||||
private final transient IEssentialsXMPP parent;
|
||||
private transient XMPPConnection connection;
|
||||
private transient ChatManager chatManager;
|
||||
private transient List<String> logUsers;
|
||||
private transient Level logLevel;
|
||||
private transient boolean ignoreLagMessages = true;
|
||||
private transient Thread loggerThread;
|
||||
private transient boolean threadrunning = true;
|
||||
|
||||
XMPPManager(final IEssentialsXMPP parent) {
|
||||
super();
|
||||
this.parent = parent;
|
||||
config = new EssentialsConf(new File(parent.getDataFolder(), "config.yml"));
|
||||
config.setTemplateName("/config.yml", EssentialsXMPP.class);
|
||||
reloadConfig();
|
||||
}
|
||||
|
||||
boolean sendMessage(final String address, final String message) {
|
||||
if (address != null && !address.isEmpty()) {
|
||||
try {
|
||||
startChat(address);
|
||||
final Chat chat;
|
||||
synchronized (chats) {
|
||||
chat = chats.get(address);
|
||||
}
|
||||
if (chat != null) {
|
||||
if (!connection.isConnected()) {
|
||||
disconnect();
|
||||
connect();
|
||||
}
|
||||
chat.sendMessage(FormatUtil.stripFormat(message));
|
||||
return true;
|
||||
}
|
||||
} catch (final XMPPException ex) {
|
||||
disableChat(address);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processMessage(final Chat chat, final Message msg) {
|
||||
// Normally we should log the error message
|
||||
// But we would create a loop if the connection to a log-user fails.
|
||||
if (msg.getType() != Message.Type.error && msg.getBody().length() > 0) {
|
||||
final String message = msg.getBody();
|
||||
switch (message.charAt(0)) {
|
||||
case '@':
|
||||
sendPrivateMessage(chat, message);
|
||||
break;
|
||||
case '/':
|
||||
sendCommand(chat, message);
|
||||
break;
|
||||
default:
|
||||
final IUser sender = parent.getUserByAddress(StringUtils.parseBareAddress(chat.getParticipant()));
|
||||
parent.broadcastMessage(sender, "=" + sender.getBase().getDisplayName() + ": " + message, StringUtils.parseBareAddress(chat.getParticipant()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean connect() {
|
||||
final String server = config.getString("xmpp.server");
|
||||
if (server == null || server.equals("example.com")) {
|
||||
logger.log(Level.WARNING, tl("xmppNotConfigured"));
|
||||
return false;
|
||||
}
|
||||
final int port = config.getInt("xmpp.port", 5222);
|
||||
final String serviceName = config.getString("xmpp.servicename", server);
|
||||
final String xmppuser = config.getString("xmpp.user");
|
||||
final String password = config.getString("xmpp.password");
|
||||
final ConnectionConfiguration connConf = new ConnectionConfiguration(server, port, serviceName);
|
||||
final String stringBuilder = "Connecting to xmpp server " + server + ":" + port + " as user " + xmppuser + ".";
|
||||
logger.log(Level.INFO, stringBuilder);
|
||||
connConf.setSASLAuthenticationEnabled(config.getBoolean("xmpp.sasl-enabled", false));
|
||||
connConf.setSendPresence(true);
|
||||
connConf.setReconnectionAllowed(true);
|
||||
connConf.setDebuggerEnabled(config.getBoolean("debug", false));
|
||||
connection = new XMPPConnection(connConf);
|
||||
try {
|
||||
connection.connect();
|
||||
|
||||
connection.login(xmppuser, password, "Essentials-XMPP");
|
||||
connection.sendPacket(new Presence(Presence.Type.available, "No one online.", 2, Presence.Mode.available));
|
||||
|
||||
connection.getRoster().setSubscriptionMode(SubscriptionMode.accept_all);
|
||||
chatManager = connection.getChatManager();
|
||||
chatManager.addChatListener(this);
|
||||
return true;
|
||||
} catch (final XMPPException ex) {
|
||||
logger.log(Level.WARNING, "Failed to connect to server: " + server, ex);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
final void disconnect() {
|
||||
if (loggerThread != null) {
|
||||
loggerThread.interrupt();
|
||||
}
|
||||
if (chatManager != null) {
|
||||
chatManager.removeChatListener(this);
|
||||
chatManager = null;
|
||||
}
|
||||
if (connection != null) {
|
||||
connection.disconnect(new Presence(Presence.Type.unavailable));
|
||||
}
|
||||
}
|
||||
|
||||
final void updatePresence() {
|
||||
if (connection == null) {
|
||||
parent.getEss().getLogger().warning(tl("xmppNotConfigured"));
|
||||
return;
|
||||
}
|
||||
|
||||
final int usercount;
|
||||
final StringBuilder stringBuilder = new StringBuilder();
|
||||
|
||||
usercount = parent.getEss().getOnlinePlayers().size();
|
||||
|
||||
if (usercount == 0) {
|
||||
final String presenceMsg = "No one online.";
|
||||
connection.sendPacket(new Presence(Presence.Type.available, presenceMsg, 2, Presence.Mode.dnd));
|
||||
}
|
||||
if (usercount == 1) {
|
||||
final String presenceMsg = "1 player online.";
|
||||
connection.sendPacket(new Presence(Presence.Type.available, presenceMsg, 2, Presence.Mode.available));
|
||||
}
|
||||
if (usercount > 1) {
|
||||
stringBuilder.append(usercount).append(" players online.");
|
||||
connection.sendPacket(new Presence(Presence.Type.available, stringBuilder.toString(), 2, Presence.Mode.available));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void chatCreated(final Chat chat, final boolean createdLocally) {
|
||||
if (!createdLocally) {
|
||||
chat.addMessageListener(this);
|
||||
final Chat old = chats.put(StringUtils.parseBareAddress(chat.getParticipant()), chat);
|
||||
if (old != null) {
|
||||
old.removeMessageListener(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public final void reloadConfig() {
|
||||
logger.removeHandler(this);
|
||||
config.load();
|
||||
synchronized (chats) {
|
||||
disconnect();
|
||||
chats.clear();
|
||||
if (!connect()) {
|
||||
return;
|
||||
}
|
||||
startLoggerThread();
|
||||
}
|
||||
if (config.getBoolean("log-enabled", false)) {
|
||||
logger.addHandler(this);
|
||||
logUsers = config.getStringList("log-users");
|
||||
final String level = config.getString("log-level", "info");
|
||||
try {
|
||||
logLevel = Level.parse(level.toUpperCase(Locale.ENGLISH));
|
||||
} catch (final IllegalArgumentException e) {
|
||||
logLevel = Level.INFO;
|
||||
}
|
||||
ignoreLagMessages = config.getBoolean("ignore-lag-messages", true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void publish(final LogRecord logRecord) {
|
||||
try {
|
||||
if (ignoreLagMessages && logRecord.getMessage().equals("Can't keep up! Did the system time change, or is the server overloaded?")) {
|
||||
return;
|
||||
}
|
||||
if (logRecord.getLevel().intValue() >= logLevel.intValue()) {
|
||||
synchronized (logrecords) {
|
||||
logrecords.add(logRecord);
|
||||
}
|
||||
}
|
||||
} catch (final Exception ignored) {
|
||||
// Ignore all exceptions
|
||||
// Otherwise we create a loop.
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void flush() {
|
||||
// Ignore this
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws SecurityException {
|
||||
// Ignore this
|
||||
}
|
||||
|
||||
private void startLoggerThread() {
|
||||
loggerThread = new Thread(() -> {
|
||||
final Set<LogRecord> copy = new HashSet<>();
|
||||
final Set<String> failedUsers = new HashSet<>();
|
||||
while (threadrunning) {
|
||||
synchronized (logrecords) {
|
||||
if (!logrecords.isEmpty()) {
|
||||
copy.addAll(logrecords);
|
||||
logrecords.clear();
|
||||
}
|
||||
}
|
||||
if (!copy.isEmpty()) {
|
||||
for (final String user : logUsers) {
|
||||
try {
|
||||
XMPPManager.this.startChat(user);
|
||||
for (final LogRecord logRecord : copy) {
|
||||
final String message = formatter.format(logRecord);
|
||||
if (!XMPPManager.this.sendMessage(user, FormatUtil.stripLogColorFormat(message))) {
|
||||
failedUsers.add(user);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
} catch (final XMPPException ex) {
|
||||
failedUsers.add(user);
|
||||
logger.removeHandler(XMPPManager.this);
|
||||
logger.log(Level.SEVERE, "Failed to deliver log message! Disabling logging to XMPP.", ex);
|
||||
}
|
||||
}
|
||||
logUsers.removeAll(failedUsers);
|
||||
if (logUsers.isEmpty()) {
|
||||
logger.removeHandler(XMPPManager.this);
|
||||
threadrunning = false;
|
||||
}
|
||||
copy.clear();
|
||||
}
|
||||
try {
|
||||
Thread.sleep(2000);
|
||||
} catch (final InterruptedException ex) {
|
||||
threadrunning = false;
|
||||
}
|
||||
}
|
||||
logger.removeHandler(XMPPManager.this);
|
||||
});
|
||||
loggerThread.start();
|
||||
}
|
||||
|
||||
private void startChat(final String address) throws XMPPException {
|
||||
if (chatManager == null) {
|
||||
return;
|
||||
}
|
||||
synchronized (chats) {
|
||||
if (!chats.containsKey(address)) {
|
||||
final Chat chat = chatManager.createChat(address, this);
|
||||
if (chat == null) {
|
||||
throw new XMPPException("Could not start Chat with " + address);
|
||||
}
|
||||
chats.put(address, chat);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void sendPrivateMessage(final Chat chat, final String message) {
|
||||
final String[] parts = message.split(" ", 2);
|
||||
if (parts.length == 2) {
|
||||
final List<Player> matches = parent.getServer().matchPlayer(parts[0].substring(1));
|
||||
|
||||
if (matches.isEmpty()) {
|
||||
try {
|
||||
chat.sendMessage("User " + parts[0] + " not found");
|
||||
} catch (final XMPPException ex) {
|
||||
logger.log(Level.WARNING, "Failed to send xmpp message.", ex);
|
||||
}
|
||||
} else {
|
||||
final String from = "[" + parent.getUserByAddress(StringUtils.parseBareAddress(chat.getParticipant())) + ">";
|
||||
for (final Player p : matches) {
|
||||
p.sendMessage(from + p.getDisplayName() + "] " + message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void sendCommand(final Chat chat, final String message) {
|
||||
if (config.getStringList("op-users").contains(StringUtils.parseBareAddress(chat.getParticipant()))) {
|
||||
parent.getServer().getScheduler().runTask(parent, () -> {
|
||||
try {
|
||||
parent.getServer().dispatchCommand(Console.getInstance().getCommandSender(), message.substring(1));
|
||||
} catch (final Exception ex) {
|
||||
logger.log(Level.SEVERE, ex.getMessage(), ex);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void disableChat(final String address) {
|
||||
final Chat chat = chats.get(address);
|
||||
if (chat != null) {
|
||||
chat.removeMessageListener(this);
|
||||
chats.remove(address);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isConfigValid() {
|
||||
final String server = config.getString("xmpp.server");
|
||||
return server != null && !server.equals("example.com");
|
||||
}
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
xmpp:
|
||||
server: 'example.com'
|
||||
user: 'name@example.com'
|
||||
password: 'password'
|
||||
# servicename: 'example.com'
|
||||
# port: 5222
|
||||
# sasl-enabled: false
|
||||
|
||||
op-users:
|
||||
# - 'name@example.com'
|
||||
|
||||
debug: false
|
||||
log-enabled: false
|
||||
# Level is minimum level that should be send: info, warning, severe
|
||||
log-level: warning
|
||||
log-users:
|
||||
# - 'name@example.com'
|
|
@ -1,20 +0,0 @@
|
|||
# This determines the command prefix when there are conflicts (/name:home, /name:help, etc.)
|
||||
name: EssentialsXMPP
|
||||
main: com.earth2me.essentials.xmpp.EssentialsXMPP
|
||||
# Note to developers: This next line cannot change, or the automatic versioning system will break.
|
||||
version: ${full.version}
|
||||
website: http://ess.khhq.net/wiki/XMPP
|
||||
description: Provides XMPP communication.
|
||||
authors: [snowleo]
|
||||
depend: [Essentials]
|
||||
api-version: 1.13
|
||||
commands:
|
||||
setxmpp:
|
||||
description: Sets your XMPP address.
|
||||
usage: /<command> <address>
|
||||
xmpp:
|
||||
description: Sends a message to a player.
|
||||
usage: /<command> <player> <message>
|
||||
xmppspy:
|
||||
description: Toggles XMPP spy for all messages.
|
||||
usage: /<command> <player>
|
Loading…
Reference in a new issue