PurpleIRC-spigot/src/main/java/com/cnaude/purpleirc/PurpleBot.java

3996 lines
163 KiB
Java

/*
* Copyright (C) 2014 cnaude
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.cnaude.purpleirc;
import com.cnaude.purpleirc.Events.VentureChatEvent;
import com.cnaude.purpleirc.IRCListeners.ActionListener;
import com.cnaude.purpleirc.IRCListeners.AwayListener;
import com.cnaude.purpleirc.IRCListeners.ConnectListener;
import com.cnaude.purpleirc.IRCListeners.DisconnectListener;
import com.cnaude.purpleirc.IRCListeners.JoinListener;
import com.cnaude.purpleirc.IRCListeners.KickListener;
import com.cnaude.purpleirc.IRCListeners.MessageListener;
import com.cnaude.purpleirc.IRCListeners.ModeListener;
import com.cnaude.purpleirc.IRCListeners.MotdListener;
import com.cnaude.purpleirc.IRCListeners.NickChangeListener;
import com.cnaude.purpleirc.IRCListeners.NoticeListener;
import com.cnaude.purpleirc.IRCListeners.PartListener;
import com.cnaude.purpleirc.IRCListeners.PrivateMessageListener;
import com.cnaude.purpleirc.IRCListeners.QuitListener;
import com.cnaude.purpleirc.IRCListeners.ServerResponseListener;
import com.cnaude.purpleirc.IRCListeners.TopicListener;
import com.cnaude.purpleirc.IRCListeners.WhoisListener;
import com.cnaude.purpleirc.IRCMessage.Type;
import static com.cnaude.purpleirc.IRCMessage.Type.CTCP;
import static com.cnaude.purpleirc.IRCMessage.Type.MESSAGE;
import static com.cnaude.purpleirc.IRCMessage.Type.NOTICE;
import com.cnaude.purpleirc.Utilities.CaseInsensitiveMap;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableSortedSet;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import com.nyancraft.reportrts.data.Ticket;
import com.titankingdoms.dev.titanchat.core.participant.Participant;
import github.scarsz.discordsrv.dependencies.jda.api.entities.Message.Attachment;
import java.awt.Color;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import me.botsko.prism.actionlibs.QueryParameters;
import me.botsko.prism.events.BlockStateChange;
import org.bukkit.Achievement;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.advancement.Advancement;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.pircbotx.Channel;
import org.pircbotx.Configuration;
import org.pircbotx.PircBotX;
import org.pircbotx.User;
import org.pircbotx.UtilSSLSocketFactory;
import org.pircbotx.cap.SASLCapHandler;
import org.pircbotx.cap.TLSCapHandler;
import org.pircbotx.exception.IrcException;
import org.pircbotx.hooks.ListenerAdapter;
/**
*
* @author Chris Naude
*/
public final class PurpleBot {
protected PircBotX bot;
protected boolean goodBot;
public final PurpleIRC plugin;
public final File file;
private YamlConfiguration config;
private boolean connected;
public boolean autoConnect;
public boolean ssl;
public boolean tls;
public boolean sasl;
public boolean trustAllCerts;
public boolean disableDiffieHellman;
public boolean sendRawMessageOnConnect;
public boolean showMOTD;
public boolean channelCmdNotifyEnabled;
public boolean relayPrivateChat;
public boolean logPrivateChat;
public boolean partInvalidChannels;
public boolean pingFixFull;
public int botServerPort;
public long chatDelay;
public String botServer;
public String bindAddress;
public String nick;
public String botNick;
public List<String> altNicks;
public int nickTimer;
public int nickIndex = 0;
public String botLogin;
public String botRealName;
public int ircMaxLineLength;
public String botServerPass;
public String charSet;
public String commandPrefix;
public String quitMessage;
public String botIdentPassword;
public String saslUsername;
public String saslPassword;
public List<String> rawMessages;
public String channelCmdNotifyMode;
public String partInvalidChannelsMsg;
private String connectMessage;
public ArrayList<String> botChannels;
public CaseInsensitiveMap<Collection<String>> channelNicks;
public CaseInsensitiveMap<Collection<String>> tabIgnoreNicks;
public CaseInsensitiveMap<Boolean> tabIgnoreDuplicates;
public CaseInsensitiveMap<Collection<String>> filters;
public CaseInsensitiveMap<Collection<String>> factionTagFilters;
public ArrayList<String> tailerFilters;
public CaseInsensitiveMap<String> channelPassword;
public CaseInsensitiveMap<String> channelTopic;
public CaseInsensitiveMap<Boolean> channelTopicChanserv;
public CaseInsensitiveMap<String> activeTopic;
public CaseInsensitiveMap<String> channelModes;
public CaseInsensitiveMap<String> joinMsg;
public CaseInsensitiveMap<Boolean> msgOnJoin;
public CaseInsensitiveMap<Boolean> channelTopicProtected;
public CaseInsensitiveMap<Boolean> channelAutoJoin;
public long channelAutoJoinDelay;
public CaseInsensitiveMap<Boolean> ignoreIRCChat;
public CaseInsensitiveMap<Boolean> hideJoinWhenVanished;
public CaseInsensitiveMap<Boolean> hideListWhenVanished;
public CaseInsensitiveMap<Boolean> hideQuitWhenVanished;
public CaseInsensitiveMap<Boolean> invalidCommandPrivate;
public CaseInsensitiveMap<Boolean> invalidCommandCTCP;
public CaseInsensitiveMap<Boolean> logIrcToHeroChat;
public CaseInsensitiveMap<Boolean> logIrcToVentureChat;
public CaseInsensitiveMap<Boolean> enableMessageFiltering;
public CaseInsensitiveMap<String> channelPrefix;
private final CaseInsensitiveMap<Boolean> shortify;
public CaseInsensitiveMap<String> heroChannelMap;
public CaseInsensitiveMap<String> ventureChatChannel;
public CaseInsensitiveMap<String> townyChannel;
public CaseInsensitiveMap<String> discordChannel;
public CaseInsensitiveMap<Collection<String>> opsList;
public CaseInsensitiveMap<Collection<String>> banList;
public CaseInsensitiveMap<Collection<String>> voicesList;
public CaseInsensitiveMap<Collection<String>> worldList;
public CaseInsensitiveMap<Collection<String>> muteList;
public CaseInsensitiveMap<Collection<String>> enabledMessages;
public CaseInsensitiveMap<CaseInsensitiveMap<String>> permissions;
public CaseInsensitiveMap<String> userPrefixes;
public CaseInsensitiveMap<CaseInsensitiveMap<String>> firstOccurrenceReplacements;
public String defaultCustomPrefix;
public CaseInsensitiveMap<CaseInsensitiveMap<CaseInsensitiveMap<String>>> commandMap;
public CaseInsensitiveMap<CaseInsensitiveMap<List<String>>> extraCommandMap;
public CaseInsensitiveMap<CaseInsensitiveMap<List<String>>> commandUsermasksMap;
public CaseInsensitiveMap<Long> joinNoticeCooldownMap;
public ArrayList<CommandSender> whoisSenders;
public List<String> channelCmdNotifyRecipients;
public List<String> channelCmdNotifyIgnore;
private final ArrayList<ListenerAdapter> ircListeners;
public IRCMessageQueueWatcher messageQueue;
public FloodChecker floodChecker;
public NickWatcher nickWatcher;
protected boolean floodControlEnabled;
protected int floodControlMaxMessages;
protected long floodControlTimeInterval;
protected long floodControlCooldown;
private final String fileName;
int joinNoticeCoolDown;
boolean joinNoticeEnabled;
boolean joinNoticePrivate;
boolean joinNoticeCtcp;
boolean joinNoticeNotice;
Type joinResponseType;
String joinNoticeMessage;
String version;
String finger;
private int reconnectCount;
private final ReadWriteLock rwl;
private final Lock wl;
public String sslInfo = "";
public List<String> actionCommands;
public List<String> ciphers;
public boolean botLinkingEnabled;
public CaseInsensitiveMap<String> botLinks;
public CaseInsensitiveMap<String> linkRequests;
public CaseInsensitiveMap<Collection<String>> remotePlayers;
public CaseInsensitiveMap<CaseInsensitiveMap<String>> remoteServerInfo;
private final List<LogTailer> tailers;
private boolean tailerEnabled;
private final List<String> tailerFiles;
private String tailerRecipient;
private boolean tailerCtcp;
private CommandSender zncSender;
public boolean joinOnKick;
/**
* Map of player names to IRC nicks.
*/
public CaseInsensitiveMap<String> ircPrivateMsgMap;
/**
*
* @param file
* @param plugin the PurpleIRC plugin
*/
public PurpleBot(File file, PurpleIRC plugin) {
this.rwl = new ReentrantReadWriteLock();
this.wl = rwl.writeLock();
this.fileName = file.getName();
this.altNicks = new ArrayList<>();
this.connected = false;
this.botChannels = new ArrayList<>();
this.ircListeners = new ArrayList<>();
this.channelCmdNotifyRecipients = new ArrayList<>();
this.channelCmdNotifyIgnore = new ArrayList<>();
this.commandMap = new CaseInsensitiveMap<>();
this.extraCommandMap = new CaseInsensitiveMap<>();
this.commandUsermasksMap = new CaseInsensitiveMap<>();
this.joinNoticeCooldownMap = new CaseInsensitiveMap<>();
this.enabledMessages = new CaseInsensitiveMap<>();
this.permissions = new CaseInsensitiveMap<>();
this.firstOccurrenceReplacements = new CaseInsensitiveMap<>();
this.userPrefixes = new CaseInsensitiveMap<>();
this.muteList = new CaseInsensitiveMap<>();
this.worldList = new CaseInsensitiveMap<>();
this.opsList = new CaseInsensitiveMap<>();
this.banList = new CaseInsensitiveMap<>();
this.voicesList = new CaseInsensitiveMap<>();
this.heroChannelMap = new CaseInsensitiveMap<>();
this.ventureChatChannel = new CaseInsensitiveMap<>();
this.townyChannel = new CaseInsensitiveMap<>();
this.discordChannel = new CaseInsensitiveMap<>();
this.invalidCommandCTCP = new CaseInsensitiveMap<>();
this.logIrcToHeroChat = new CaseInsensitiveMap<>();
this.logIrcToVentureChat = new CaseInsensitiveMap<>();
this.shortify = new CaseInsensitiveMap<>();
this.invalidCommandPrivate = new CaseInsensitiveMap<>();
this.hideQuitWhenVanished = new CaseInsensitiveMap<>();
this.hideListWhenVanished = new CaseInsensitiveMap<>();
this.hideJoinWhenVanished = new CaseInsensitiveMap<>();
this.ignoreIRCChat = new CaseInsensitiveMap<>();
this.channelAutoJoin = new CaseInsensitiveMap<>();
this.channelTopicProtected = new CaseInsensitiveMap<>();
this.channelModes = new CaseInsensitiveMap<>();
this.activeTopic = new CaseInsensitiveMap<>();
this.channelTopic = new CaseInsensitiveMap<>();
this.channelPassword = new CaseInsensitiveMap<>();
this.tabIgnoreNicks = new CaseInsensitiveMap<>();
this.tabIgnoreDuplicates = new CaseInsensitiveMap<>();
this.filters = new CaseInsensitiveMap<>();
this.tailerFilters = new ArrayList<>();
this.factionTagFilters = new CaseInsensitiveMap<>();
this.channelNicks = new CaseInsensitiveMap<>();
this.rawMessages = new ArrayList<>();
this.channelTopicChanserv = new CaseInsensitiveMap<>();
this.joinMsg = new CaseInsensitiveMap<>();
this.msgOnJoin = new CaseInsensitiveMap<>();
this.enableMessageFiltering = new CaseInsensitiveMap<>();
this.channelPrefix = new CaseInsensitiveMap<>();
this.plugin = plugin;
this.file = file;
this.reconnectCount = 0;
this.whoisSenders = new ArrayList<>();
this.actionCommands = new ArrayList<>();
this.ciphers = new LinkedList<>();
this.botLinks = new CaseInsensitiveMap<>();
this.linkRequests = new CaseInsensitiveMap<>();
this.remotePlayers = new CaseInsensitiveMap<>();
this.remoteServerInfo = new CaseInsensitiveMap<>();
this.ircPrivateMsgMap = new CaseInsensitiveMap<>();
this.tailers = new ArrayList<>();
this.tailerFiles = new ArrayList<>();
this.zncSender = plugin.getServer().getConsoleSender();
config = new YamlConfiguration();
goodBot = loadConfig();
if (goodBot) {
addListeners();
version = plugin.getDescription().getFullName() + ", "
+ plugin.getDescription().getDescription() + " - "
+ plugin.getDescription().getWebsite();
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
buildBot(false);
}
});
} else {
plugin.logError("Error loading " + this.fileName);
}
messageQueue = new IRCMessageQueueWatcher(this, plugin);
floodChecker = new FloodChecker(this, plugin);
if (nickTimer > 0) {
nickWatcher = new NickWatcher(this, plugin);
}
}
public void buildBot(boolean reload) {
if (!tailers.isEmpty()) {
for (LogTailer tailer : tailers) {
tailer.stopTailer();
}
}
Configuration.Builder configBuilder = new Configuration.Builder()
.setCapEnabled(sasl)
.setName(botNick)
.setLogin(botLogin)
.setAutoNickChange(true)
.setVersion(version)
.setFinger(finger)
.setCapEnabled(true)
.setMessageDelay(chatDelay)
.setRealName(botRealName)
.setMaxLineLength(ircMaxLineLength)
//.setAutoReconnect(autoConnect) // Why doesn't this work?
.setServer(botServer, botServerPort, botServerPass);
//addAutoJoinChannels(configBuilder);
for (ListenerAdapter ll : ircListeners) {
configBuilder.addListener(ll);
}
if (!ciphers.isEmpty()) {
configBuilder.setCiphers(ciphers);
}
if (!botIdentPassword.isEmpty()) {
if (!reload) {
plugin.logInfo("Setting IdentPassword ...");
}
configBuilder.setNickservPassword(botIdentPassword);
}
if (sasl) {
plugin.logInfo("Enabling SASL ...");
configBuilder.addCapHandler(new SASLCapHandler(saslUsername, saslPassword));
}
if (tls) {
plugin.logInfo("Enabling TLS ...");
configBuilder.addCapHandler(new TLSCapHandler());
} else if (ssl) {
UtilSSLSocketFactory socketFactory = new UtilSSLSocketFactory();
if (disableDiffieHellman) {
socketFactory.disableDiffieHellman();
}
if (trustAllCerts) {
plugin.logInfo("Enabling SSL and trusting all certificates ...");
socketFactory.trustAllCertificates();
} else {
plugin.logInfo("Enabling SSL ...");
}
if (!ciphers.isEmpty()) {
socketFactory.setCiphers(ciphers);
}
configBuilder.setSocketFactory(socketFactory);
}
if (charSet.isEmpty()) {
if (!reload) {
plugin.logInfo("Using default character set: " + Charset.defaultCharset());
}
} else if (Charset.isSupported(charSet)) {
if (!reload) {
plugin.logInfo("Using character set: " + charSet);
}
configBuilder.setEncoding(Charset.forName(charSet));
} else {
plugin.logError("Invalid character set: " + charSet);
if (!reload) {
plugin.logInfo("Available character sets: " + Joiner.on(", ").join(Charset.availableCharsets().keySet()));
plugin.logInfo("Using default character set: " + Charset.defaultCharset());
}
}
if (!bindAddress.isEmpty()) {
if (!reload) {
plugin.logInfo("Binding to " + bindAddress);
}
try {
configBuilder.setLocalAddress(InetAddress.getByName(bindAddress));
} catch (UnknownHostException ex) {
plugin.logError(ex.getMessage());
}
}
Configuration configuration = configBuilder.buildConfiguration();
bot = new PircBotX(configuration);
if (autoConnect) {
asyncConnect(reload);
} else {
plugin.logInfo("Auto-connect is disabled. To connect: /irc connect " + bot.getNick());
}
plugin.logDebug("Max line length: " + configBuilder.getMaxLineLength());
if (tailerEnabled && !tailerFiles.isEmpty() && !tailerRecipient.isEmpty()) {
for (String tailerFile : tailerFiles) {
LogTailer tailer = new LogTailer(this, plugin, tailerRecipient, tailerCtcp, tailerFile);
tailers.add(tailer);
}
}
}
protected void stopTailers() {
if (!tailers.isEmpty()) {
for (LogTailer tailer : tailers) {
if (tailer != null) {
tailer.stopTailer();
}
}
tailers.clear();
}
}
private void addListeners() {
ircListeners.add(new ActionListener(plugin, this));
ircListeners.add(new AwayListener(plugin, this));
ircListeners.add(new ConnectListener(plugin, this));
ircListeners.add(new DisconnectListener(plugin, this));
ircListeners.add(new JoinListener(plugin, this));
ircListeners.add(new KickListener(plugin, this));
ircListeners.add(new MessageListener(plugin, this));
ircListeners.add(new ModeListener(plugin, this));
ircListeners.add(new NickChangeListener(plugin, this));
ircListeners.add(new NoticeListener(plugin, this));
ircListeners.add(new PartListener(plugin, this));
ircListeners.add(new PrivateMessageListener(plugin, this));
ircListeners.add(new QuitListener(plugin, this));
ircListeners.add(new TopicListener(plugin, this));
ircListeners.add(new WhoisListener(plugin, this));
ircListeners.add(new MotdListener(plugin, this));
ircListeners.add(new ServerResponseListener(plugin, this));
}
public void autoJoinChannels() {
plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
@Override
public void run() {
for (String channelName : botChannels) {
if (channelAutoJoin.containsKey(channelName)) {
if (channelAutoJoin.get(channelName)) {
if (bot.isConnected()) {
if (channelPassword.get(channelName).isEmpty()) {
bot.sendIRC().joinChannel(channelName);
} else {
bot.sendIRC().joinChannel(channelName, channelPassword.get(channelName));
}
}
}
}
}
}
}, channelAutoJoinDelay);
}
public void reload(CommandSender sender) {
sender.sendMessage("Reloading bot: " + botNick);
reload();
}
public void reload() {
asyncQuit(true);
}
/**
*
* @param sender
*/
public void reloadConfig(CommandSender sender) {
config = new YamlConfiguration();
goodBot = loadConfig();
if (goodBot) {
sender.sendMessage("[PurpleIRC] [" + botNick + "] IRC bot configuration reloaded.");
} else {
sender.sendMessage("[PurpleIRC] [" + botNick + "] " + ChatColor.RED + "Error loading bot configuration!");
}
}
/**
*
* @param channelName
* @param sender
* @param userMask
*/
public void mute(String channelName, CommandSender sender, String userMask) {
if (muteList.get(channelName).contains(userMask)) {
sender.sendMessage("User '" + userMask + "' is already muted.");
} else {
sender.sendMessage("User '" + userMask + "' is now muted.");
muteList.get(channelName).add(userMask);
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".muted", muteList.get(channelName));
}
}
/**
*
* @param channelName
* @param sender
*/
public void muteList(String channelName, CommandSender sender) {
if (muteList.get(channelName).isEmpty()) {
sender.sendMessage("There are no users muted for " + channelName);
} else {
sender.sendMessage("Muted users for " + channelName
+ ": " + Joiner.on(", ").join(muteList.get(channelName)));
}
}
/**
*
* @param channelName
* @param sender
* @param user
*/
public void unMute(String channelName, CommandSender sender, String user) {
if (muteList.get(channelName).contains(user)) {
sender.sendMessage("User '" + user + "' is no longer muted.");
muteList.get(channelName).remove(user);
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".muted", muteList.get(channelName));
} else {
sender.sendMessage("User '" + user + "' is not muted.");
}
}
public void asyncConnect(CommandSender sender) {
sender.sendMessage(connectMessage);
asyncConnect(false);
}
public boolean isShortifyEnabled(String channelName) {
if (shortify.containsKey(channelName)) {
return shortify.get(channelName);
}
return false;
}
/**
*
* @param reload - true if this is a result of auto reconnect
*/
public void asyncConnect(final boolean reload) {
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
try {
if (!reload) {
plugin.logInfo(connectMessage);
}
bot.startBot();
reconnectCount = 0;
} catch (IOException | IrcException ex) {
if (reconnectCount <= plugin.reconnectSuppression) {
plugin.logError("Problem connecting to " + botServer
+ " [Nick: " + botNick + "] [Error: " + ex.getMessage() + "]");
}
reconnectCount++;
}
}
});
}
public void asyncIRCMessage(final String target, final String message) {
plugin.logDebug("Entering aysncIRCMessage");
IRCMessage ircMessage = new IRCMessage(target, plugin.colorConverter.gameColorsToIrc(message), MESSAGE);
messageQueue.add(ircMessage);
}
public void asyncCTCPMessage(final String target, final String message) {
plugin.logDebug("Entering asyncCTCPMessage");
IRCMessage ircMessage = new IRCMessage(target, plugin.colorConverter.gameColorsToIrc(message), CTCP);
messageQueue.add(ircMessage);
}
public void asyncNoticeMessage(final String target, final String message) {
plugin.logDebug("Entering asyncNoticeMessage");
IRCMessage ircMessage = new IRCMessage(target, plugin.colorConverter.gameColorsToIrc(message), NOTICE);
messageQueue.add(ircMessage);
}
public void asyncCTCPCommand(final String target, final String command) {
if (!this.isConnected()) {
return;
}
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendIRC().ctcpCommand(target, command);
}
});
}
/**
*
* @param sender
*/
public void saveConfig(CommandSender sender) {
if (goodBot) {
try {
config.save(file);
sender.sendMessage(plugin.LOG_HEADER_F
+ " Saving bot \"" + botNick + "\" to " + file.getName());
} catch (IOException ex) {
plugin.logError(ex.getMessage());
sender.sendMessage(ex.getMessage());
}
} else {
sender.sendMessage(plugin.LOG_HEADER_F
+ ChatColor.RED + " Not saving bot \"" + botNick + "\" to " + file.getName());
}
}
/**
*
*/
public void saveConfig() {
try {
config.save(file);
} catch (IOException ex) {
plugin.logError(ex.getMessage());
}
}
/**
*
* @param section
* @param obj
*/
public void saveConfig(String section, Object obj) {
plugin.logDebug("Saving [" + section + "]: " + obj.toString());
config.set(section, obj);
saveConfig();
}
/**
*
* @param sender
* @param newNick
*/
public void asyncChangeNick(final CommandSender sender, final String newNick) {
if (!this.isConnected()) {
return;
}
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendIRC().changeNick(newNick);
}
});
sender.sendMessage("Setting nickname to " + newNick);
saveConfig("nick", newNick);
}
public void asyncJoinChannel(final String channelName, final String password) {
if (!this.isConnected()) {
return;
}
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendIRC().joinChannel(channelName, password);
}
});
}
public void asyncJoinChannel(final String channelName) {
if (!this.isConnected()) {
return;
}
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendIRC().joinChannel(channelName);
}
});
}
public void asyncNotice(final String target, final String message) {
if (!this.isConnected()) {
return;
}
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendIRC().notice(target, message);
}
});
}
public void asyncRawlineNow(final List<String> messages) {
for (String s : messages) {
bot.sendRaw().rawLineNow(s);
}
}
public void asyncRawlineNow(final String message) {
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendRaw().rawLineNow(message);
}
});
}
public void znc(final CommandSender sender, final String message) {
zncSender = sender;
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendRaw().rawLineNow("znc " + message);
}
});
}
public void zncResponse(String message) {
if (zncSender != null) {
zncSender.sendMessage(message);
} else {
plugin.getServer().getConsoleSender().sendMessage(message);
}
}
public void asyncIdentify(final String password) {
if (!this.isConnected()) {
return;
}
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
bot.sendIRC().identify(password);
}
});
}
/**
*
* @param sender
* @param newLogin
*/
public void changeLogin(CommandSender sender, String newLogin) {
sender.sendMessage(ChatColor.LIGHT_PURPLE
+ "Login set to " + ChatColor.WHITE
+ newLogin + ChatColor.LIGHT_PURPLE
+ ". Reload the bot for the change to take effect.");
saveConfig("login", newLogin);
}
private void sanitizeServerName() {
botServer = botServer.replace("^.*\\/\\/", "");
botServer = botServer.replace(":\\d+$", "");
saveConfig("server", botServer);
}
private boolean loadConfig() {
try {
config.load(file);
autoConnect = config.getBoolean("autoconnect", true);
tls = config.getBoolean("tls", false);
ssl = config.getBoolean("ssl", false);
sasl = config.getBoolean("sasl", false);
ciphers = config.getStringList("ciphers");
plugin.logDebug("Ciphers => " + ciphers);
trustAllCerts = config.getBoolean("trust-all-certs", false);
disableDiffieHellman = config.getBoolean("disable-diffie-hellman", false);
sendRawMessageOnConnect = config.getBoolean("raw-message-on-connect", false);
rawMessages.add(config.getString("raw-message"));
rawMessages.addAll(config.getStringList("raw-message-list"));
relayPrivateChat = config.getBoolean("relay-private-chat", false);
logPrivateChat = config.getBoolean("log-private-chat", false);
partInvalidChannels = config.getBoolean("part-invalid-channels", false);
pingFixFull = config.getBoolean("zero-width-space", false);
partInvalidChannelsMsg = config.getString("part-invalid-channels-message", "");
nick = config.getString("nick", "");
botNick = nick;
altNicks = config.getStringList("alt-nicks");
nickTimer = config.getInt("alt-nick-timer", 1200);
plugin.loadTemplates(config, botNick, "message-format");
botLogin = config.getString("login", "PircBot");
botRealName = config.getString("realname", "");
ircMaxLineLength = config.getInt("max-line-length", 512);
if (botRealName.isEmpty()) {
botRealName = plugin.getServer()
.getPluginManager().getPlugin("PurpleIRC")
.getDescription().getWebsite();
}
botServer = config.getString("server", "");
bindAddress = config.getString("bind", "");
channelAutoJoinDelay = config.getLong("channel-auto-join-delay", 20);
charSet = config.getString("charset", "");
sanitizeServerName();
showMOTD = config.getBoolean("show-motd", false);
botServerPort = config.getInt("port");
botServerPass = config.getString("password", "");
botIdentPassword = config.getString("ident-password", "");
saslUsername = config.getString("sasl-username", "");
saslPassword = config.getString("sasl-password", "");
commandPrefix = config.getString("command-prefix", ".");
chatDelay = config.getLong("message-delay", 1000);
finger = config.getString("finger-reply", "PurpleIRC");
plugin.logDebug("Message Delay => " + chatDelay);
quitMessage = ChatColor.translateAlternateColorCodes('&', config.getString("quit-message", ""));
plugin.logDebug("Nick => " + botNick);
plugin.logDebug("Login => " + botLogin);
plugin.logDebug("Server => " + botServer);
plugin.logDebug("Channel Auto Join Delay => " + channelAutoJoinDelay);
plugin.logDebug(("Bind => ") + bindAddress);
plugin.logDebug("SSL => " + ssl);
plugin.logDebug("DisableDHE => " + disableDiffieHellman);
plugin.logDebug("TLS => " + tls);
plugin.logDebug("Trust All Certs => " + trustAllCerts);
plugin.logDebug("Port => " + botServerPort);
plugin.logDebug("Command Prefix => " + commandPrefix);
//plugin.logDebug("Server Password => " + botServerPass);
plugin.logDebug("Quit Message => " + quitMessage);
botChannels.clear();
opsList.clear();
banList.clear();
voicesList.clear();
muteList.clear();
enabledMessages.clear();
permissions.clear();
userPrefixes.clear();
firstOccurrenceReplacements.clear();
worldList.clear();
commandMap.clear();
extraCommandMap.clear();
commandUsermasksMap.clear();
tailerFilters.clear();
factionTagFilters.clear();
channelCmdNotifyEnabled = config.getBoolean("command-notify.enabled", false);
plugin.logDebug(" CommandNotifyEnabled => " + channelCmdNotifyEnabled);
channelCmdNotifyMode = config.getString("command-notify.mode", "msg");
plugin.logDebug(" channelCmdNotifyMode => " + channelCmdNotifyMode);
botLinkingEnabled = config.getBoolean("bot-linking-enabled", false);
plugin.logDebug(" BotLinkingEnabled => " + botLinkingEnabled);
if (config.contains("bot-links") && botLinkingEnabled) {
for (String t : config.getConfigurationSection("bot-links").getKeys(false)) {
if (!t.startsWith("MemorySection")) {
botLinks.put(t, config.getString("bot-links." + t, ""));
plugin.logDebug("Bot-Link: " + t + " => " + botLinks.get(t));
}
}
for (String s : botLinks.keySet()) {
remotePlayers.put(s, new ArrayList<String>());
remoteServerInfo.put(s, new CaseInsensitiveMap<String>());
}
}
for (String s : config.getStringList("custom-prefixes")) {
String pair[] = s.split(" ", 2);
if (pair.length > 0) {
userPrefixes.put(pair[0], ChatColor.translateAlternateColorCodes('&', pair[1]));
}
}
for (String key : userPrefixes.keySet()) {
plugin.logDebug(" CustomPrefix: " + key + " => " + userPrefixes.get(key));
}
defaultCustomPrefix = ChatColor.translateAlternateColorCodes('&', config.getString("custom-prefix-default", "[IRC]"));
for (String s : config.getStringList("replace-first-occurrences")) {
String pair[] = s.split(" ", 3);
if (pair.length > 2) {
CaseInsensitiveMap rfo = new CaseInsensitiveMap<>();
rfo.put(pair[1], pair[2]);
firstOccurrenceReplacements.put(pair[0], rfo);
plugin.logDebug("ReplaceFirstOccurence: " + pair[0] + " => " + pair[1] + " => " + pair[2]);
}
}
// build command notify recipient list
for (String recipient : config.getStringList("command-notify.recipients")) {
if (!channelCmdNotifyRecipients.contains(recipient)) {
channelCmdNotifyRecipients.add(recipient);
}
plugin.logDebug(" Command Notify Recipient => " + recipient);
}
if (channelCmdNotifyRecipients.isEmpty()) {
plugin.logInfo(" No command recipients defined.");
}
// load tailer settings
tailerEnabled = config.getBoolean("file-tailer.enabled", false);
joinOnKick = config.getBoolean("join-on-kick", true);
String tailerFile = config.getString("file-tailer.file", "server.log");
if (!tailerFiles.contains(tailerFile)) {
tailerFiles.add(tailerFile);
plugin.logDebug(" Tailer File => " + tailerFile);
}
for (String f : config.getStringList("file-tailer.extra_files")) {
if (!tailerFiles.contains(f)) {
tailerFiles.add(f);
}
plugin.logDebug(" Tailer File => " + f);
}
if (tailerFiles.isEmpty()) {
plugin.logInfo(" No command recipients defined.");
}
tailerRecipient = config.getString("file-tailer.recipient", "");
tailerCtcp = config.getBoolean("file-tailer.ctcp", false);
// build command notify ignore list
for (String command : config.getStringList("command-notify.ignore")) {
if (!channelCmdNotifyIgnore.contains(command)) {
channelCmdNotifyIgnore.add(command);
}
plugin.logDebug(" Command Notify Ignore => " + command);
}
if (channelCmdNotifyIgnore.isEmpty()) {
plugin.logInfo(" No command-notify ignores defined.");
}
// build tailer filter list
for (String re : config.getStringList("file-tailer.excludes")) {
if (!tailerFilters.contains(re)) {
tailerFilters.add(re);
}
plugin.logDebug("Filtered from tailer => " + re);
}
if (tailerFilters.isEmpty()) {
plugin.logInfo("Tailer filter list is empty!");
}
if (config.getConfigurationSection("channels") == null) {
plugin.logError("No channels found!");
return false;
} else {
for (String enChannelName : config.getConfigurationSection("channels").getKeys(false)) {
String channelName = decodeChannel(enChannelName);
if (isValidChannel(channelName)) {
plugin.logError("Ignoring duplicate channel: " + channelName);
continue;
}
plugin.logDebug("Channel => " + channelName);
botChannels.add(channelName);
channelAutoJoin.put(channelName, config.getBoolean("channels." + enChannelName + ".autojoin", true));
plugin.logDebug(" Autojoin => " + channelAutoJoin.get(channelName));
channelPassword.put(channelName, config.getString("channels." + enChannelName + ".password", ""));
channelTopic.put(channelName, config.getString("channels." + enChannelName + ".topic", ""));
plugin.logDebug(" Topic => " + channelTopic.get(channelName));
channelModes.put(channelName, config.getString("channels." + enChannelName + ".modes", ""));
plugin.logDebug(" Channel Modes => " + channelModes.get(channelName));
channelTopicProtected.put(channelName, config.getBoolean("channels." + enChannelName + ".topic-protect", false));
plugin.logDebug(" Topic Protected => " + channelTopicProtected.get(channelName).toString());
channelTopicChanserv.put(channelName, config.getBoolean("channels." + enChannelName + ".topic-chanserv", false));
plugin.logDebug(" Topic Chanserv Mode => " + channelTopicChanserv.get(channelName).toString());
heroChannelMap.put(channelName, config.getString("channels." + enChannelName + ".hero-channel", "admin"));
plugin.logDebug(" HeroChannel => " + heroChannelMap.get(channelName));
ventureChatChannel.put(channelName, config.getString("channels." + enChannelName + ".venture-channel", "global"));
plugin.logDebug(" VentureChatChannel => " + ventureChatChannel.get(channelName));
townyChannel.put(channelName, config.getString("channels." + enChannelName + ".towny-channel", ""));
plugin.logDebug(" TownyChannel => " + townyChannel.get(channelName));
discordChannel.put(channelName, config.getString("channels." + enChannelName + ".discord-channel", ""));
plugin.logDebug(" DiscordChannel => " + discordChannel.get(channelName));
logIrcToHeroChat.put(channelName, config.getBoolean("channels." + enChannelName + ".log-irc-to-hero-chat", false));
plugin.logDebug(" LogIrcToHeroChat => " + logIrcToHeroChat.get(channelName));
logIrcToVentureChat.put(channelName, config.getBoolean("channels." + enChannelName + ".log-irc-to-venture-chat", false));
plugin.logDebug(" LogIrcToVentureChat => " + logIrcToVentureChat.get(channelName));
ignoreIRCChat.put(channelName, config.getBoolean("channels." + enChannelName + ".ignore-irc-chat", false));
plugin.logDebug(" IgnoreIRCChat => " + ignoreIRCChat.get(channelName));
hideJoinWhenVanished.put(channelName, config.getBoolean("channels." + enChannelName + ".hide-join-when-vanished", true));
plugin.logDebug(" HideJoinWhenVanished => " + hideJoinWhenVanished.get(channelName));
hideListWhenVanished.put(channelName, config.getBoolean("channels." + enChannelName + ".hide-list-when-vanished", true));
plugin.logDebug(" HideListWhenVanished => " + hideListWhenVanished.get(channelName));
hideQuitWhenVanished.put(channelName, config.getBoolean("channels." + enChannelName + ".hide-quit-when-vanished", true));
plugin.logDebug(" HideQuitWhenVanished => " + hideQuitWhenVanished.get(channelName));
invalidCommandPrivate.put(channelName, config.getBoolean("channels." + enChannelName + ".invalid-command.private", false));
plugin.logDebug(" InvalidCommandPrivate => " + invalidCommandPrivate.get(channelName));
invalidCommandCTCP.put(channelName, config.getBoolean("channels." + enChannelName + ".invalid-command.ctcp", false));
plugin.logDebug(" InvalidCommandCTCP => " + invalidCommandCTCP.get(channelName));
shortify.put(channelName, config.getBoolean("channels." + enChannelName + ".shortify", true));
plugin.logDebug(" Shortify => " + shortify.get(channelName));
joinMsg.put(channelName, config.getString("channels." + enChannelName + ".raw-message", ""));
plugin.logDebug(" JoinMessage => " + joinMsg.get(channelName));
msgOnJoin.put(channelName, config.getBoolean("channels." + enChannelName + ".raw-message-on-join", false));
plugin.logDebug(" SendMessageOnJoin => " + msgOnJoin.get(channelName));
enableMessageFiltering.put(channelName, config.getBoolean("channels." + enChannelName + ".enable-filtering", false));
plugin.logDebug(" EnableMessageFiltering => " + enableMessageFiltering.get(channelName));
channelPrefix.put(channelName, config.getString("channels." + enChannelName + ".prefix", ""));
plugin.logDebug(" ChannelPrefix => " + channelPrefix.get(channelName));
tabIgnoreDuplicates.put(channelName, config.getBoolean("channels." + enChannelName + ".custom-tab-ignore-duplicates", false));
plugin.logDebug(" TabIgnoreDuplicates => " + tabIgnoreDuplicates.get(channelName));
// build channel op list
Collection<String> cOps = new ArrayList<>();
for (String channelOper : config.getStringList("channels." + enChannelName + ".ops")) {
if (!cOps.contains(channelOper)) {
cOps.add(channelOper);
}
plugin.logDebug(" Channel Op => " + channelOper);
}
opsList.put(channelName, cOps);
if (opsList.isEmpty()) {
plugin.logInfo("No channel ops defined.");
}
// build channel ban list
Collection<String> cBans = new ArrayList<>();
for (String channelBan : config.getStringList("channels." + enChannelName + ".banlist")) {
if (!cBans.contains(channelBan)) {
cBans.add(channelBan);
}
plugin.logDebug(" Channel Ban => " + channelBan);
}
banList.put(channelName, cBans);
if (banList.isEmpty()) {
plugin.logInfo("No channel bans defined.");
}
// build channel voice list
Collection<String> cVoices = new ArrayList<>();
for (String channelVoice : config.getStringList("channels." + enChannelName + ".voices")) {
if (!cVoices.contains(channelVoice)) {
cVoices.add(channelVoice);
}
plugin.logDebug(" Channel Voice => " + channelVoice);
}
voicesList.put(channelName, cVoices);
if (voicesList.isEmpty()) {
plugin.logInfo("No channel voices defined.");
}
// build mute list
Collection<String> m = new ArrayList<>();
for (String mutedUser : config.getStringList("channels." + enChannelName + ".muted")) {
if (!m.contains(mutedUser)) {
m.add(mutedUser);
}
plugin.logDebug(" Channel Mute => " + mutedUser);
}
muteList.put(channelName, m);
if (muteList.isEmpty()) {
plugin.logInfo("IRC mute list is empty.");
}
// build valid chat list
Collection<String> c = new ArrayList<>();
for (String validChat : config.getStringList("channels." + enChannelName + ".enabled-messages")) {
if (!c.contains(validChat)) {
c.add(validChat);
}
plugin.logDebug(" Enabled Message => " + validChat);
}
enabledMessages.put(channelName, c);
if (enabledMessages.isEmpty()) {
plugin.logInfo("There are no enabled messages!");
}
String permKeys[] = {
"chat",
"kick",
"action",
"mode",
"notice",
"join",
"part",
"quit",
"topic"
};
// build channel message permissions
CaseInsensitiveMap p = new CaseInsensitiveMap<>();
for (String key : permKeys) {
p.put(key, config.getString("channels." + enChannelName + ".permissions." + key, "irc.message." + key));
}
permissions.put(channelName, p);
for (String key : permissions.get(channelName).keySet()) {
plugin.logDebug("Permission node[" + channelName + "]: " + key + ": " + permissions.get(channelName).get(key));
}
// build valid world list
Collection<String> w = new ArrayList<>();
for (String validWorld : config.getStringList("channels." + enChannelName + ".worlds")) {
if (!w.contains(validWorld)) {
w.add(validWorld);
}
plugin.logDebug(" Enabled World => " + validWorld);
}
worldList.put(channelName, w);
if (worldList.isEmpty()) {
plugin.logInfo("World list is empty!");
}
// build valid world list
Collection<String> t = new ArrayList<>();
for (String name : config.getStringList("channels." + enChannelName + ".custom-tab-ignore-list")) {
if (!t.contains(name)) {
t.add(name);
}
plugin.logDebug(" Tab Ignore => " + name);
}
tabIgnoreNicks.put(channelName, t);
if (tabIgnoreNicks.isEmpty()) {
plugin.logInfo("Tab ignore list is empty!");
}
// build action command list
for (String name : config.getStringList("action-commands")) {
if (!actionCommands.contains(name)) {
actionCommands.add(name);
}
plugin.logDebug(" Action Command => " + name);
}
if (actionCommands.isEmpty()) {
actionCommands.add("/me");
}
// build message filter list
Collection<String> f = new ArrayList<>();
for (String word : config.getStringList("channels." + enChannelName + ".filter-list")) {
if (!f.contains(word)) {
f.add(word);
}
plugin.logDebug(" Filtered From IRC => " + word);
}
filters.put(channelName, f);
if (filters.isEmpty()) {
plugin.logInfo("Filter list is empty!");
}
// build faction tag filters
Collection<String> ft = new ArrayList<>();
for (String word : config.getStringList("channels." + enChannelName + ".faction-tag-filters")) {
if (!ft.contains(word)) {
ft.add(word);
}
plugin.logDebug(" Filtered Faction Tag => " + word);
}
factionTagFilters.put(channelName, ft);
if (factionTagFilters.isEmpty()) {
plugin.logInfo("Faction Filter list is empty!");
}
// build join notice
joinNoticeCoolDown = config.getInt("channels." + enChannelName + ".join-notice.cooldown", 60);
joinNoticeEnabled = config.getBoolean("channels." + enChannelName + ".join-notice.enabled", false);
joinNoticePrivate = config.getBoolean("channels." + enChannelName + ".join-notice.private", true);
joinNoticeMessage = config.getString("channels." + enChannelName + ".join-notice.message", "");
joinResponseType = Type.MESSAGE;
if (config.getBoolean("channels." + enChannelName + ".join-notice.ctcp", true)) {
joinResponseType = Type.CTCP;
}
if (config.getBoolean("channels." + enChannelName + ".join-notice.notice", false)) {
joinResponseType = Type.NOTICE;
}
plugin.logDebug("join-notice.cooldown: " + joinNoticeCoolDown);
plugin.logDebug("join-notice.enabled: " + joinNoticeEnabled);
plugin.logDebug("join-notice.private: " + joinNoticePrivate);
plugin.logDebug("join-notice.ctcp: " + joinNoticeCtcp);
plugin.logDebug("join-notice.message: " + joinNoticeMessage);
// flood control setup
floodControlEnabled = config.getBoolean("flood-control.enabled", false);
floodControlMaxMessages = config.getInt("flood-control.max-messages", 2);
floodControlTimeInterval = config.getLong("flood-control.time-interval", 1000L);
floodControlCooldown = config.getLong("flood-control.cooldown", 60000L);
// build command map
CaseInsensitiveMap<CaseInsensitiveMap<String>> map = new CaseInsensitiveMap<>();
CaseInsensitiveMap<List<String>> extraMap = new CaseInsensitiveMap<>();
CaseInsensitiveMap<List<String>> userMaskMap = new CaseInsensitiveMap<>();
try {
for (String command : config.getConfigurationSection("channels." + enChannelName + ".commands").getKeys(false)) {
plugin.logDebug(" Command => " + command);
CaseInsensitiveMap<String> optionPair = new CaseInsensitiveMap<>();
List<String> extraCommands = new ArrayList<>();
List<String> userMasks = new ArrayList<>();
String commandKey = "channels." + enChannelName + ".commands." + command + ".";
optionPair.put("modes", config.getString(commandKey + "modes", "*"));
optionPair.put("private", config.getString(commandKey + "private", "false"));
optionPair.put("ctcp", config.getString(commandKey + "ctcp", "false"));
optionPair.put("notice", config.getString(commandKey + "notice", "false"));
optionPair.put("game_command", config.getString(commandKey + "game_command", ""));
optionPair.put("cool_down", config.getString(commandKey + "cool_down", "0"));
optionPair.put("game_command_usage", config.getString(commandKey + "game_command_usage", ""));
optionPair.put("args_required", config.getString(commandKey + "args_required", "false"));
optionPair.put("sender", config.getString(commandKey + "sender", "CONSOLE"));
optionPair.put("private_listen", config.getString(commandKey + "private_listen", "true"));
optionPair.put("channel_listen", config.getString(commandKey + "channel_listen", "true"));
optionPair.put("perm", config.getString(commandKey + "perm", ""));
optionPair.put("output", config.getString(commandKey + "output", "%RESULT%"));
for (String s : optionPair.keySet()) {
config.set(commandKey + s, optionPair.get(s));
}
extraCommands.addAll(config.getStringList(commandKey + "extra_commands"));
plugin.logDebug("extra_commands: " + extraCommands.toString());
userMasks.addAll(config.getStringList(commandKey + "user_masks"));
plugin.logDebug("user_masks: " + userMasks.toString());
map.put(command, optionPair);
extraMap.put(command, extraCommands);
userMaskMap.put(command, userMasks);
config.set(commandKey + "extra_commands", extraCommands);
config.set(commandKey + "user_masks", userMasks);
}
} catch (Exception ex) {
plugin.logError("No commands found for channel " + enChannelName);
}
commandMap.put(channelName, map);
extraCommandMap.put(channelName, extraMap);
commandUsermasksMap.put(channelName, userMaskMap);
if (map.isEmpty()) {
plugin.logInfo("No commands specified!");
}
String channelMsgFormats = "channels." + enChannelName + ".message-format";
if (config.contains(channelMsgFormats)) {
plugin.logDebug("Found " + channelMsgFormats + " section.");
plugin.loadTemplates(config, botNick + "." + enChannelName, channelMsgFormats);
}
connectMessage = "Connecting to " + botServer + ":"
+ botServerPort + ": [Nick: " + botNick
+ "] [SSL: " + ssl + "]" + " [TrustAllCerts: "
+ trustAllCerts + "] [TLS: " + tls + "] [SASL: " + sasl + "]";
}
}
} catch (IOException | InvalidConfigurationException ex) {
plugin.logError(ex.getMessage());
return false;
}
return true;
}
/**
*
* @param sender
* @param delay
*/
public void setIRCDelay(CommandSender sender, long delay) {
saveConfig("message-delay", delay);
sender.sendMessage(ChatColor.LIGHT_PURPLE
+ "IRC message delay changed to "
+ ChatColor.WHITE + delay + ChatColor.LIGHT_PURPLE + " ms. "
+ "Reload for the change to take effect.");
}
public boolean isPlayerInValidWorld(Player player, String channelName) {
boolean validWorld = false;
String worldName = player.getWorld().getName();
if (worldList.containsKey(channelName)) {
if (worldList.get(channelName).contains("*")
|| worldList.get(channelName).contains(worldName)) {
validWorld = true;
}
}
plugin.logDebug("[isPlayerInValidWorld] [p: " + player.getName() + "] [w: " + worldName + "] [b: " + validWorld + "]");
return validWorld;
}
/**
* Called from normal game chat listener
*
* @param event
*/
public void gameChat(AsyncPlayerChatEvent event) {
Player player = event.getPlayer();
String message = event.getMessage();
if (!this.isConnected()) {
return;
}
if (plugin.isMuted(player)) {
return;
}
if (floodChecker.isSpam(player)) {
sendFloodWarning(player);
return;
}
for (String channelName : botChannels) {
if (isPlayerInValidWorld(player, channelName)) {
if (plugin.fcHook != null) {
String playerChatMode;
String playerFactionName;
try {
playerChatMode = plugin.fcHook.getChatMode(player);
} catch (IllegalAccessError ex) {
plugin.logDebug("FC Error: " + ex.getMessage());
playerChatMode = "public";
}
try {
playerFactionName = plugin.fcHook.getFactionName(player);
} catch (IllegalAccessError ex) {
plugin.logDebug("FC Error: " + ex.getMessage());
playerFactionName = "unknown";
}
String chatName = "faction-" + playerChatMode.toLowerCase() + "-chat";
plugin.logDebug("Faction [Player: " + player.getName()
+ "] [Tag: " + playerFactionName + "] [Mode: "
+ playerChatMode + "]");
if (factionTagFilters.get(channelName).contains(playerFactionName)) {
plugin.logDebug("Filtered out message due to tag filter.");
} else {
if (enabledMessages.get(channelName)
.contains(chatName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.chatFactionTokenizer(player, botNick, message,
playerFactionName, playerChatMode));
} else {
plugin.logDebug("Player " + player.getName() + " is in chat mode \""
+ playerChatMode + "\" but \"" + chatName + "\" is disabled.");
}
}
} else {
plugin.logDebug("No Factions");
}
if (plugin.ventureChatEnabled) {
plugin.logDebug("Calling VentureChatEvent: " + event.getMessage());
plugin.getServer().getScheduler().runTask(plugin, () -> plugin.getServer().getPluginManager().callEvent(new VentureChatEvent(event, this, channelName)));
}
if (isMessageEnabled(channelName, TemplateName.GAME_CHAT)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin.getMessageTemplate(botNick, channelName, TemplateName.GAME_CHAT), message));
}
}
}
}
public void sendFloodWarning(Player player) {
String message = plugin.getMessageTemplate(botNick, "", TemplateName.GAME_FLOOD_WARNING)
.replace("%COOLDOWN%", floodChecker.getCoolDown(player));
if (!message.isEmpty()) {
player.sendMessage(message);
}
}
/**
* Called from TitanChat listener
*
* @param participant
* @param tChannel
* @param tColor
* @param message
*/
public void titanChat(Participant participant, String tChannel, String tColor, String message) {
if (!this.isConnected()) {
return;
}
Player player = plugin.getServer().getPlayer(participant.getName());
if (floodChecker.isSpam(player)) {
sendFloodWarning(player);
return;
}
for (String channelName : botChannels) {
if (!isPlayerInValidWorld(player, channelName)) {
continue;
}
plugin.logDebug("TC Channel: " + tChannel);
if (isMessageEnabled(channelName, "titan-" + tChannel + "-chat")
|| isMessageEnabled(channelName, "titan-chat")) {
asyncIRCMessage(channelName, plugin.tokenizer
.titanChatTokenizer(player, tChannel, tColor, message,
plugin.getMessageTemplate(botNick, channelName, TemplateName.TITAN_CHAT)));
} else {
plugin.logDebug("Player " + player.getName() + " is in \""
+ tChannel + "\" but titan-" + tChannel + "-chat is disabled.");
}
}
}
/**
* Called from UltimateChat listener
*
* @param sender
* @param uChannel
* @param uColor
* @param message
*/
public void ultimateChat(CommandSender sender, String uChannel, String uColor, String message) {
if (!this.isConnected()) {
return;
}
Player player = plugin.getServer().getPlayer(sender.getName());
if (floodChecker.isSpam(player)) {
sendFloodWarning(player);
return;
}
for (String channelName : botChannels) {
if (!isPlayerInValidWorld(player, channelName)) {
continue;
}
plugin.logDebug("UC Channel: " + uChannel);
if (isMessageEnabled(channelName, "ultimatechat-" + uChannel + "-chat")
|| isMessageEnabled(channelName, TemplateName.ULTIMATE_CHAT)) {
asyncIRCMessage(channelName, plugin.tokenizer
.ultimateChatTokenizer(player, uChannel, uColor, message,
plugin.getMessageTemplate(botNick, channelName, TemplateName.ULTIMATE_CHAT)));
} else {
plugin.logDebug("Player " + player.getName() + " is in \""
+ uChannel + "\" but ultimatechat-" + uChannel + "-chat is disabled.");
}
}
}
// Called from /irc send
/**
*
* @param player
* @param channelName
* @param message
*/
public void gameChat(Player player, String channelName, String message) {
if (!this.isConnected()) {
return;
}
if (isValidChannel(channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_SEND), message));
}
}
// Called from CleverEvent
/**
*
* @param cleverBotName
* @param message
*/
public void cleverChat(String cleverBotName, String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, "clever-chat")) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(cleverBotName, plugin
.getMessageTemplate(botNick, channelName, TemplateName.CLEVER_SEND), message));
}
}
}
// Called from AdminChatEvent
/**
*
* @param name
* @param message
* @param world
*/
public void adminChat(String name, String message, String world) {
if (!this.isConnected() || world.isEmpty()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.GAME_ADMIN_CHAT)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(name, plugin.getMessageTemplate(botNick, channelName, TemplateName.GAME_ADMIN_CHAT), message)
.replace("%WORLD%", world)
);
}
}
}
/**
* Called from Discord ProcessChatEvent
*
* @param username
* @param nickname
* @param discordChannel
* @param color
* @param effectiveName
* @param message
* @param attachments
*/
public void discordChat(
String username,
String nickname,
String effectiveName,
Color color,
String discordChannel,
String message,
List<Attachment> attachments) {
if (!this.isConnected()) {
return;
}
List<String> aList = new ArrayList<>();
for (Attachment a : attachments) {
aList.add(a.getUrl());
}
String attUrls = String.join(", ", aList);
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.DISCORD_CHAT) || isMessageEnabled(channelName, "discord-" + discordChannel + "-chat")) {
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.DISCORD_CHAT);
asyncIRCMessage(channelName, plugin.tokenizer
.discordChatToIRCTokenizer(template, username, nickname, effectiveName, color, discordChannel, message, attUrls)
);
}
}
}
/**
* Called from SimpleTicketEvent
*
* @param uuid
* @param ticket
* @param botNick
* @param messageType
*/
public void simpleTicketNotify(UUID uuid,
uk.co.joshuawoolley.simpleticketmanager.ticketsystem.Ticket ticket,
String botNick, String messageType) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, messageType)) {
asyncIRCMessage(channelName, plugin.tokenizer
.simpleTicketTokenizer(uuid, plugin
.getMessageTemplate(botNick, channelName, messageType), ticket));
}
}
}
/**
* Called from ReportRTS event
*
* @param pName
* @param ticket
* @param botNick
* @param messageType
*/
public void reportRTSNotify(String pName, Ticket ticket, String botNick, String messageType) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, messageType)) {
asyncIRCMessage(channelName, plugin.tokenizer
.reportRTSTokenizer(pName, plugin
.getMessageTemplate(botNick, channelName, messageType), ticket));
}
}
}
public void reportRTSNotify(CommandSender sender, String message, String botNick, String messageType) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, messageType)) {
asyncIRCMessage(channelName, plugin.tokenizer
.reportRTSTokenizer(sender, message, plugin.getMessageTemplate(botNick, channelName, messageType)));
}
}
}
public void nTheEndNotify(String messages[], String botNick, String messageType) {
if (!this.isConnected()) {
return;
}
for (String message : messages) {
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, messageType)) {
asyncIRCMessage(
channelName,
plugin.tokenizer.gameChatToIRCTokenizer(
plugin.getMessageTemplate(botNick, channelName, messageType),
message));
}
}
}
}
/**
*
* @param channelName
* @param message
*/
public void consoleChat(String channelName, String message) {
if (!this.isConnected()) {
return;
}
if (isValidChannel(channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer("CONSOLE", message, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_SEND)));
}
}
/**
*
* @param message
*/
public void consoleChat(String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.CONSOLE_CHAT)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(plugin
.getMessageTemplate(botNick, channelName, TemplateName.CONSOLE_CHAT),
ChatColor.translateAlternateColorCodes('&', message)));
}
}
}
/**
*
* @param player
* @param message
*/
public void gameBroadcast(Player player, String message) {
if (!this.isConnected()) {
return;
}
if (floodChecker.isSpam(player)) {
sendFloodWarning(player);
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.BROADCAST_MESSAGE)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.BROADCAST_MESSAGE),
ChatColor.translateAlternateColorCodes('&', message)));
}
}
}
/**
*
* @param player
* @param message
*/
public void essHelpOp(Player player, String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.ESS_HELPOP)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.ESS_HELPOP),
ChatColor.translateAlternateColorCodes('&', message)));
}
}
}
/**
*
* @param player
* @param blockName
* @param oreName
* @param vein
* @param oreColor
* @param loc
*/
public void gameOreBroadcast(Player player, String blockName, String oreName, ChatColor oreColor, Set<Block> vein, Location loc) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.ORE_BROADCAST)) {
asyncIRCMessage(channelName, plugin.tokenizer.oreBroadcastTokenizer(player, botNick, blockName, oreName, oreColor, vein, loc));
}
}
}
/**
*
* @param name
* @param message
* @param source
*/
public void dynmapWebChat(String source, String name, String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
plugin.logDebug("dynmapWebChat: " + channelName);
if (isMessageEnabled(channelName, TemplateName.DYNMAP_WEB_CHAT)) {
plugin.logDebug("dynmapWebChat: sending message");
asyncIRCMessage(channelName, plugin.tokenizer
.dynmapWebChatToIRCTokenizer(source, name, plugin
.getMessageTemplate(botNick, channelName, TemplateName.DYNMAP_WEB_CHAT),
ChatColor.translateAlternateColorCodes('&', message)));
}
}
}
/**
*
* @param message
*/
public void consoleBroadcast(String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.BROADCAST_CONSOLE_MESSAGE)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(plugin
.getMessageTemplate(botNick, channelName, TemplateName.BROADCAST_CONSOLE_MESSAGE),
ChatColor.translateAlternateColorCodes('&', message)));
}
}
}
/**
*
* @param message
*/
public void redditStreamBroadcast(String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.REDDIT_MESSAGES)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(plugin
.getMessageTemplate(botNick, channelName, TemplateName.REDDIT_MESSAGES), message));
}
}
}
/**
*
* @param player
* @param message
*/
public void gameJoin(Player player, String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (hideJoinWhenVanished.get(channelName)) {
if (plugin.vanishHook.isVanished(player)) {
continue;
}
}
if (isMessageEnabled(channelName, TemplateName.GAME_FIRST_JOIN)
&& !player.hasPlayedBefore()) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(this, channelName, player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_FIRST_JOIN), message));
} else if (isMessageEnabled(channelName, TemplateName.GAME_JOIN)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(this, channelName, player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_JOIN), message));
}
}
}
/**
*
* @param player
* @param message
*/
public void gameQuit(Player player, String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (hideQuitWhenVanished.get(channelName)) {
if (plugin.vanishHook.isVanished(player)) {
continue;
}
}
if (isMessageEnabled(channelName, TemplateName.GAME_QUIT)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(this, channelName, player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_QUIT), message));
}
}
}
/**
*
* @param player
* @param message
*/
public void gameFakeJoin(Player player, String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.FAKE_JOIN)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(this, channelName, player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.FAKE_JOIN), message));
}
}
}
/**
*
* @param player
* @param message
*/
public void gameFakeQuit(Player player, String message) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.FAKE_QUIT)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(this, channelName, player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.FAKE_QUIT), message));
}
}
}
/**
*
* @param player
* @param advancement
*/
public void gameAdvancement(Player player, Advancement advancement) {
if (!this.isConnected() || advancement == null || player == null) {
return;
}
String message = Joiner.on(" ").join(advancement.getCriteria());
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.GAME_ADVANCEMENT)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_ADVANCEMENT), message));
}
}
}
/**
*
* @param player
* @param achievement
*/
public void gameAchievement(Player player, Achievement achievement) {
if (!this.isConnected() || achievement == null || player == null) {
return;
}
String message = achievement.toString();
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.GAME_ACHIEVEMENT)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_ACHIEVEMENT), message));
}
}
}
/**
*
* @param player
* @param gameMode
*/
public void gameModeChange(Player player, GameMode gameMode) {
if (!this.isConnected()) {
return;
}
String message = gameMode.toString();
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.GAME_MODE)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_MODE), message));
}
}
}
/**
*
* @param player
* @param message
* @param reason
*/
public void gameKick(Player player, String message, String reason) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.GAME_KICK)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameKickTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_KICK), message, reason));
}
}
}
/**
*
* @param player
* @param message
*/
public void gameAction(Player player, String message) {
if (!this.isConnected()) {
return;
}
if (plugin.isMuted(player)) {
return;
}
if (floodChecker.isSpam(player)) {
sendFloodWarning(player);
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.GAME_ACTION)
&& isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, TemplateName.GAME_ACTION), message));
}
}
}
/**
*
* @param player
* @param message
* @param templateName
*/
public void gameDeath(Player player, String message, String templateName) {
if (!this.isConnected()) {
return;
}
if (player == null || message == null) {
return;
}
if (message.isEmpty()) {
plugin.logDebug("gameDeath: blank death message for " + player.getDisplayName());
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, templateName)) {
if (isPlayerInValidWorld(player, channelName)) {
asyncIRCMessage(channelName, plugin.tokenizer
.gameChatToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, channelName, templateName), message));
}
}
}
}
/**
*
* @param channelName
* @param topic
* @param sender
*/
public void changeTopic(String channelName, String topic, CommandSender sender) {
Channel channel = this.getChannel(channelName);
String tTopic = tokenizedTopic(topic);
if (channel != null) {
setTheTopic(channel, tTopic);
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".topic", topic);
channelTopic.put(channelName, topic);
sender.sendMessage("IRC topic for " + channelName + " changed to \"" + topic + "\"");
} else {
sender.sendMessage("Invalid channel: " + channelName);
}
}
public String getConfigChannelName(String channelName) {
for (String s : botChannels) {
if (channelName.equalsIgnoreCase(s)) {
return s;
}
}
return channelName;
}
public Channel getChannel(String channelName) {
Channel channel = null;
for (Channel c : getChannels()) {
if (c.getName().equalsIgnoreCase(channelName)) {
return c;
}
}
return channel;
}
/**
*
* @param bot2
* @param code
*/
public void setBotLink(String bot2, String code) {
plugin.logInfo("Saving bot-link: " + bot2);
botLinks.put(bot2, code);
saveConfig("bot-links", botLinks);
}
/**
*
* @param sender
* @param botServer
*/
public void setServer(CommandSender sender, String botServer) {
setServer(sender, botServer, autoConnect);
}
/**
*
* @param sender
* @param server
* @param auto
*/
public void setServer(CommandSender sender, String server, Boolean auto) {
if (server.contains(":")) {
botServerPort = Integer.parseInt(server.split(":")[1]);
botServer = server.split(":")[0];
} else {
botServer = server;
}
sanitizeServerName();
autoConnect = auto;
saveConfig("server", botServer);
saveConfig("port", botServerPort);
saveConfig("autoconnect", autoConnect);
sender.sendMessage("IRC server changed to \"" + botServer + ":"
+ botServerPort + "\". (AutoConnect: "
+ autoConnect + ")");
}
/**
*
* @param channelName
* @param userMask
* @param sender
*/
public void addOp(String channelName, String userMask, CommandSender sender) {
if (opsList.get(channelName).contains(userMask)) {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " is already in the ops list.");
} else {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " has been added to the ops list.");
opsList.get(channelName).add(userMask);
}
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".ops", opsList.get(channelName));
}
/**
*
* @param channelName
* @param userMask
* @param sender
*/
public void addBan(String channelName, String userMask, CommandSender sender) {
if (banList.get(channelName).contains(userMask)) {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " is already in the ban list.");
} else {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " has been added to the ban list.");
banList.get(channelName).add(userMask);
}
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".ops", opsList.get(channelName));
}
/**
*
* @param channelName
* @param userMask
* @param sender
*/
public void addVoice(String channelName, String userMask, CommandSender sender) {
if (voicesList.get(channelName).contains(userMask)) {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " is already in the voices list.");
} else {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " has been added to the voices list.");
voicesList.get(channelName).add(userMask);
}
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".voices", voicesList.get(channelName));
}
/**
*
* @param channelName
* @param userMask
* @param sender
*/
public void removeOp(String channelName, String userMask, CommandSender sender) {
if (opsList.get(channelName).contains(userMask)) {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " has been removed from the ops list.");
opsList.get(channelName).remove(userMask);
} else {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " is not in the ops list.");
}
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".ops", opsList.get(channelName));
}
/**
*
* @param channelName
* @param userMask
* @param sender
*/
public void removeBan(String channelName, String userMask, CommandSender sender) {
if (banList.get(channelName).contains(userMask)) {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " has been removed from the ban list.");
banList.get(channelName).remove(userMask);
} else {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " is not in the ban list.");
}
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".banlist", banList.get(channelName));
}
/**
*
* @param channelName
* @param userMask
* @param sender
*/
public void removeVoice(String channelName, String userMask, CommandSender sender) {
if (voicesList.get(channelName).contains(userMask)) {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " has been removed to the voices list.");
voicesList.get(channelName).remove(userMask);
} else {
sender.sendMessage("User mask " + ChatColor.WHITE + userMask
+ ChatColor.RESET + " is not in the voices list.");
}
saveConfig("channels." + encodeChannel(getConfigChannelName(channelName)) + ".voices", voicesList.get(channelName));
}
/**
*
* @param channelName
* @param nick
*/
public void op(String channelName, String nick) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
if (user.getNick().equals(nick)) {
channel.send().op(user);
return;
}
}
}
}
/**
*
* @param channelName
* @param mask
*/
public void ban(String channelName, String mask) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
channel.send().ban(mask);
}
}
/**
*
* @param channelName
* @param mask
*/
public void unBan(String channelName, String mask) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
channel.send().unBan(mask);
}
}
/**
*
* @param channelName
* @param nick
*/
public void voice(String channelName, String nick) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
if (user.getNick().equals(nick)) {
channel.send().voice(user);
return;
}
}
}
}
/**
*
* @param channelName
* @param nick
*/
public void deOp(String channelName, String nick) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
if (user.getNick().equals(nick)) {
channel.send().deOp(user);
return;
}
}
}
}
/**
*
* @param channelName
* @param nick
*/
public void deVoice(String channelName, String nick) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
if (user.getNick().equals(nick)) {
channel.send().deVoice(user);
return;
}
}
}
}
/**
*
* @param channelName
* @param nick
*/
public void kick(String channelName, String nick) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
if (user.getNick().equals(nick)) {
channel.send().kick(user);
return;
}
}
}
}
/**
*
* @param channelName
* @param nick
* @param reason
*/
public void kick(String channelName, String nick, String reason) {
Channel channel;
channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
if (user.getNick().equals(nick)) {
channel.send().kick(user, reason);
return;
}
}
}
}
private String encodeChannel(String s) {
return s.replace(".", "%2E");
}
private String decodeChannel(String s) {
return s.replace("%2E", ".");
}
/**
*
* @param channel
* @param topic
* @param setBy
*/
public void fixTopic(Channel channel, String topic, String setBy) {
String channelName = channel.getName();
String tTopic = tokenizedTopic(topic);
if (setBy.equals(botNick)) {
return;
}
if (channelTopic.containsKey(channelName)) {
if (channelTopicProtected.containsKey(channelName)) {
if (channelTopicProtected.get(channelName)) {
plugin.logDebug("[" + channel.getName() + "] Topic protected.");
String myTopic = tokenizedTopic(channelTopic.get(channelName));
plugin.logDebug("rTopic: " + channelTopic.get(channelName));
plugin.logDebug("tTopic: " + tTopic);
plugin.logDebug("myTopic: " + myTopic);
if (!tTopic.equals(myTopic)) {
plugin.logDebug("Topic is not correct. Fixing it.");
setTheTopic(channel, myTopic);
} else {
plugin.logDebug("Topic is correct.");
}
}
}
}
}
private void setTheTopic(Channel channel, String topic) {
String channelName = channel.getName();
if (channelTopicChanserv.containsKey(channelName)) {
if (channelTopicChanserv.get(channelName)) {
String msg = String.format("TOPIC %s %s", channelName, topic);
plugin.logDebug("Sending chanserv rmessage: " + msg);
asyncIRCMessage("chanserv", msg);
return;
}
}
channel.send().setTopic(topic);
}
private String tokenizedTopic(String topic) {
return plugin.colorConverter
.gameColorsToIrc(topic.replace("%MOTD%", plugin.getServer().getMotd()));
}
/**
*
* @param sender
*/
public void asyncQuit(CommandSender sender) {
sender.sendMessage("Disconnecting " + bot.getNick() + " from IRC server " + botServer);
asyncQuit(false);
}
/**
*
* @param reload
*/
public void asyncQuit(final Boolean reload) {
plugin.logInfo("asyncQuit: " + reload);
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
quit();
if (reload) {
buildBot(true);
}
}
});
}
public void quit() {
if (this.isConnected()) {
plugin.logDebug("Q: " + quitMessage);
if (quitMessage.isEmpty()) {
bot.sendIRC().quitServer();
} else {
bot.sendIRC().quitServer(plugin.colorConverter.gameColorsToIrc(quitMessage));
}
}
}
/**
*
* @param sender
*/
public void sendTopic(CommandSender sender) {
for (String channelName : botChannels) {
if (commandMap.containsKey(channelName)) {
sender.sendMessage(ChatColor.WHITE + "[" + ChatColor.LIGHT_PURPLE
+ botNick + ChatColor.WHITE + "]" + ChatColor.RESET
+ " IRC topic for " + ChatColor.WHITE + channelName
+ ChatColor.RESET + ": \""
+ ChatColor.WHITE + plugin.colorConverter
.ircColorsToGame(activeTopic.get(channelName))
+ ChatColor.RESET + "\"");
}
}
}
/**
*
* @param sender
* @param nick
*/
public void sendUserWhois(CommandSender sender, String nick) {
User user = null;
for (Channel channel : getChannels()) {
bot.sendRaw().rawLineNow("WHO " + channel.getName());
for (User u : channel.getUsers()) {
if (u.getNick().equals(nick)) {
user = u;
}
}
}
if (user == null) {
sender.sendMessage(ChatColor.RED + "Invalid user: " + ChatColor.WHITE + nick);
} else {
bot.sendRaw().rawLineNow(String.format("WHOIS %s %s", nick, nick));
whoisSenders.add(sender);
}
}
/**
*
* @param sender
* @param channelName
*/
public void sendUserList(CommandSender sender, String channelName) {
String invalidChannel = ChatColor.RED + "Invalid channel: "
+ ChatColor.WHITE + channelName;
if (!isValidChannel(channelName)) {
sender.sendMessage(invalidChannel);
return;
}
Channel channel = getChannel(channelName);
if (channel != null) {
sendUserList(sender, channel);
} else {
sender.sendMessage(invalidChannel);
}
}
/**
*
* @param sender
* @param channel
*/
public void sendUserList(CommandSender sender, Channel channel) {
String channelName = channel.getName();
if (!isValidChannel(channelName)) {
sender.sendMessage(ChatColor.RED + "Invalid channel: "
+ ChatColor.WHITE + channelName);
return;
}
sender.sendMessage(ChatColor.LIGHT_PURPLE + "-----[ " + ChatColor.WHITE + channelName
+ ChatColor.LIGHT_PURPLE + " - " + ChatColor.WHITE + bot.getNick() + ChatColor.LIGHT_PURPLE + " ]-----");
if (!this.isConnected()) {
sender.sendMessage(ChatColor.RED + " Not connected!");
return;
}
List<String> channelUsers = new ArrayList<>();
for (User user : channel.getUsers()) {
String n = user.getNick();
n = getNickPrefix(user, channel) + n;
if (user.isAway()) {
n = n + ChatColor.GRAY + " | Away | " + user.getAwayMessage();
}
if (n.equals(bot.getNick())) {
n = ChatColor.LIGHT_PURPLE + n;
}
channelUsers.add(n);
}
Collections.sort(channelUsers, Collator.getInstance());
for (String userName : channelUsers) {
sender.sendMessage(" " + ChatColor.WHITE + userName);
}
}
public String getNickPrefix(User user, Channel channel) {
try {
if (user.getChannels() != null) {
if (user.isIrcop()) {
return plugin.ircNickPrefixIrcOp;
} else if (user.getChannelsOwnerIn().contains(channel)) {
return plugin.ircNickPrefixOwner;
} else if (user.getChannelsSuperOpIn().contains(channel)) {
return plugin.ircNickPrefixSuperOp;
} else if (user.getChannelsOpIn().contains(channel)) {
return plugin.ircNickPrefixOp;
} else if (user.getChannelsHalfOpIn().contains(channel)) {
return plugin.ircNickPrefixHalfOp;
} else if (user.getChannelsVoiceIn().contains(channel)) {
return plugin.ircNickPrefixVoice;
}
}
} catch (Exception ex) {
plugin.logDebug(ex.getMessage());
}
return "";
}
public String getChannelPrefix(Channel channel) {
if (channelPrefix.containsKey(channel.getName())) {
return channelPrefix.get(channel.getName());
}
return "";
}
/**
*
* @param sender
*/
public void sendUserList(CommandSender sender) {
for (Channel channel : getChannels()) {
if (isValidChannel(channel.getName())) {
sendUserList(sender, channel);
}
}
}
/**
*
*/
public void updateNickList() {
if (!this.isConnected()) {
return;
}
for (Channel channel : this.getChannels()) {
this.updateNickList(channel);
}
}
/**
*
* @param channel
*/
public void updateNickList(Channel channel) {
if (!this.isConnected()) {
return;
}
// Build current list of names in channel
ArrayList<String> users = new ArrayList<>();
for (User user : channel.getUsers()) {
//plugin.logDebug("N: " + user.getNick());
users.add(user.getNick());
}
try {
wl.tryLock(10, TimeUnit.MILLISECONDS);
} catch (InterruptedException ex) {
plugin.logDebug("Lock Error: " + ex.getMessage());
return;
}
try {
String channelName = channel.getName();
if (channelNicks.containsKey(channelName)) {
for (String name : channelNicks.get(channelName)) {
//plugin.logDebug("O: " + name);
if (!users.contains(name)) {
plugin.logDebug("Removing " + name + " from list.");
if (plugin.netPackets != null) {
plugin.netPackets.remFromTabList(name);
}
}
}
channelNicks.remove(channelName);
}
channelNicks.put(channelName, users);
} finally {
wl.unlock();
}
}
/**
*
* @param channel
*/
public void opIrcUsers(Channel channel) {
for (User user : channel.getUsers()) {
opIrcUser(channel, user);
}
}
/**
*
* @param channelName
*/
public void opIrcUsers(String channelName) {
Channel channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
opIrcUser(channel, user);
}
}
}
/**
*
* @param channel
*/
public void voiceIrcUsers(Channel channel) {
for (User user : channel.getUsers()) {
voiceIrcUser(channel, user);
}
}
/**
*
* @param channelName
*/
public void voiceIrcUsers(String channelName) {
Channel channel = getChannel(channelName);
if (channel != null) {
for (User user : channel.getUsers()) {
voiceIrcUser(channel, user);
}
}
}
/**
*
* @param user
* @param userMask
* @return
*/
public boolean checkUserMask(User user, String userMask) {
String mask[] = userMask.split("[\\!\\@]", 3);
if (mask.length == 3) {
String gUser = plugin.regexGlobber.createRegexFromGlob(mask[0]);
String gLogin = plugin.regexGlobber.createRegexFromGlob(mask[1]);
String gHost = plugin.regexGlobber.createRegexFromGlob(mask[2]);
return (user.getNick().matches(gUser)
&& user.getLogin().matches(gLogin)
&& user.getHostmask().matches(gHost));
}
return false;
}
/**
*
* @param channel
* @param user
*/
public void opIrcUser(Channel channel, User user) {
String channelName = channel.getName();
if (user.getNick().equals(botNick)) {
return;
}
if (channel.getOps().contains(user)) {
plugin.logInfo("User " + user.getNick() + " is already an operator on " + channelName);
return;
}
for (String userMask : opsList.get(channelName)) {
if (checkUserMask(user, userMask)) {
plugin.logInfo("Giving operator status to " + user.getNick() + " on " + channelName);
channel.send().op(user);
break;
}
}
}
/**
*
* @param channel
* @param user
*/
public void banIrcUser(Channel channel, User user) {
String channelName = channel.getName();
if (user.getNick().equals(botNick)) {
return;
}
for (String userMask : banList.get(channelName)) {
if (checkUserMask(user, userMask)) {
plugin.logInfo("Setting +b for " + userMask + " on " + channelName);
ban(channelName, userMask);
kick(channelName, user.getNick(), "Banned");
break;
}
}
}
/**
*
* @param channel
* @param user
*/
public void voiceIrcUser(Channel channel, User user) {
String channelName = channel.getName();
if (user.getNick().equals(botNick)) {
return;
}
if (channel.getVoices().contains(user)) {
plugin.logInfo("User " + user.getNick() + " is already a voice on " + channelName);
return;
}
for (String userMask : voicesList.get(channelName)) {
if (checkUserMask(user, userMask)) {
plugin.logInfo("Giving voice status to " + user.getNick() + " on " + channelName);
channel.send().voice(user);
break;
}
}
}
/**
*
* @param message
* @param channelName
* @return
*/
public String filterMessage(String message, String channelName) {
if (enableMessageFiltering.containsKey(channelName)) {
if (enableMessageFiltering.get(channelName)) {
if (filters.containsKey(channelName)) {
if (!filters.get(channelName).isEmpty()) {
for (String filter : filters.get(channelName)) {
if (filter.startsWith("/") && filter.endsWith("/")) {
filter = filter.substring(1, filter.length() - 1);
plugin.logDebug("Regex filtering " + filter + " from " + message);
message = message.replaceAll(filter, "");
} else {
plugin.logDebug("Filtering " + filter + " from " + message);
message = message.replace(filter, "");
}
}
}
}
}
}
return message;
}
// Broadcast chat messages from IRC to the game
/**
*
* @param user
* @param channel
* @param target
* @param message
* @param override
* @param responseType
*/
public void broadcastChat(User user, org.pircbotx.Channel channel, String target, String message, boolean override, Type responseType) {
boolean messageSent = false;
String channelName = channel.getName();
/*
First occurrence replacements
*/
if (!firstOccurrenceReplacements.isEmpty()) {
for (String key : firstOccurrenceReplacements.keySet()) {
if (user.getNick().equalsIgnoreCase(key) || checkUserMask(user, key)) {
CaseInsensitiveMap cm = firstOccurrenceReplacements.get(key);
for (Object obj : cm.keySet()) {
message = message.replaceFirst((String) obj, ChatColor.translateAlternateColorCodes('&', (String) cm.get(obj)));
}
}
}
}
// https://github.com/cnaude/PurpleIRC-spigot/issues/49
if (message == null) {
return;
}
/*
Send messages to Dynmap if enabled
*/
if (plugin.dynmapHook != null) {
plugin.logDebug("Checking if " + TemplateName.IRC_DYNMAP_WEB_CHAT + " is enabled ...");
if (enabledMessages.get(channelName).contains(TemplateName.IRC_DYNMAP_WEB_CHAT)) {
plugin.logDebug("Yes, " + TemplateName.IRC_DYNMAP_WEB_CHAT + " is enabled...");
plugin.logDebug("broadcastChat [DW]: " + message);
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_DYNMAP_WEB_CHAT);
String rawDWMessage = filterMessage(
plugin.tokenizer.ircChatToGameTokenizer(this, user, channel, template, message), channelName);
String nickTmpl = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_DYNMAP_NICK);
String rawNick = nickTmpl.replace("%NICK%", user.getNick());
plugin.dynmapHook.sendMessage(rawNick, rawDWMessage);
messageSent = true;
} else {
plugin.logDebug("Nope, " + TemplateName.IRC_DYNMAP_WEB_CHAT + " is NOT enabled...");
}
}
/*
Send messages to TownyChat if enabled
*/
if (plugin.tcHook != null) {
if (isMessageEnabled(channelName, TemplateName.IRC_TOWNY_CHAT)) {
if (townyChannel.containsKey(channelName)) {
String tChannel = townyChannel.get(channelName);
if (!tChannel.isEmpty()) {
String tmpl = plugin.getIrcTownyChatTemplate(botNick, tChannel);
plugin.logDebug("broadcastChat [TC]: " + tChannel + ": " + tmpl);
String rawTCMessage = filterMessage(
plugin.tokenizer.ircChatToTownyChatTokenizer(this, user, channel, tmpl, message, tChannel), channelName);
plugin.tcHook.sendMessage(tChannel, rawTCMessage);
messageSent = true;
}
}
}
}
/*
Send messages to mcMMO if enabled
*/
if (plugin.mcMMOChatHook != null) {
/*
Send to mcMMMO admin channel if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_MCMMO_ADMIN_CHAT)) {
String tmpl = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_MCMMO_ADMIN_CHAT);
plugin.logDebug("broadcastChat [mcMMO:admin]: " + message);
String rawMcMMOMessage = filterMessage(
plugin.tokenizer.ircChatToGameTokenizer(this, user, channel, tmpl, message), channelName);
plugin.mcMMOChatHook.sendAdminMessage(user.getNick(), rawMcMMOMessage);
messageSent = true;
}
/*
Send to specific mcMMMO party channel if enabled
*/
for (String em : getEnabledMessages(channel.getName())) {
if (em.startsWith("irc-mcmmo-party-") && em.endsWith("-chat")) {
if (isMessageEnabled(channelName, em)) {
String party = em.replace("irc-mcmmo-party-", "").replace("-chat", "");
if (!party.isEmpty()) {
String tmpl = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_MCMMO_PARTY_CHAT);
plugin.logDebug("broadcastChat [mcMMO:party]: " + party + " : " + message);
String rawMcMMOMessage = filterMessage(
plugin.tokenizer.ircChatToGameTokenizer(this, user, channel, tmpl, message), channelName);
plugin.mcMMOChatHook.sendPartyMessage(user.getNick(), party, rawMcMMOMessage);
messageSent = true;
}
}
}
}
}
/*
Send messages to players if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_CHAT) || override) {
String newMessage = filterMessage(
plugin.tokenizer.ircChatToGameTokenizer(this, user, channel, plugin.getMessageTemplate(
botNick, channelName, TemplateName.IRC_CHAT), message), channelName);
if (!newMessage.isEmpty()) {
plugin.broadcastToGame(newMessage, channelName, getIrcMessagePermission(channelName, "chat"));
messageSent = true;
}
}
/*
Send messages to console if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_CONSOLE_CHAT)) {
String tmpl = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_CONSOLE_CHAT);
plugin.logDebug("broadcastChat [Console]: " + tmpl);
plugin.getServer().getConsoleSender().sendMessage(plugin.tokenizer.ircChatToGameTokenizer(
this, user, channel, plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_CONSOLE_CHAT), message));
messageSent = true;
}
/*
Send messages to Herochat if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_HERO_CHAT)) {
String hChannel = heroChannelMap.get(channelName);
String tmpl = plugin.getIrcHeroChatTemplate(botNick, hChannel);
plugin.logDebug("broadcastChat [HC]: " + hChannel + ": " + tmpl);
String rawHCMessage = filterMessage(
plugin.tokenizer.ircChatToHeroChatTokenizer(this, user, channel, tmpl, message, hChannel), channelName);
if (!rawHCMessage.isEmpty()) {
if (!plugin.herochatHook.isValidChannel(hChannel)) {
plugin.logError("Herochat channel is invalid: " + hChannel);
} else {
plugin.herochatHook.sendHeroMessage(hChannel, rawHCMessage);
messageSent = true;
if (logIrcToHeroChat.containsKey(channelName)) {
if (logIrcToHeroChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawHCMessage);
}
}
}
}
}
/*
Send messages to VentureChat if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_VENTURE_CHAT) && plugin.ventureChatEnabled) {
String vcChannel = ventureChatChannel.get(channelName);
String vcTemplate = plugin.getIrcVentureChatTemplate(botNick, vcChannel);
plugin.logDebug("broadcastChat [VC]: " + vcChannel + ": " + vcTemplate);
String rawVcMessage = filterMessage(
plugin.tokenizer.ircChatToVentureChatTokenizer(this, user, channel, vcTemplate, message, vcChannel), channelName);
if (!rawVcMessage.isEmpty()) {
plugin.vcHook.sendMessage(vcChannel, rawVcMessage);
messageSent = true;
if (logIrcToVentureChat.containsKey(channelName)) {
if (logIrcToVentureChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawVcMessage);
}
}
}
}
/*
Send messages to Essentials if enabled
*/
if (plugin.isPluginEnabled("Essentials")) {
if (isMessageEnabled(channelName, TemplateName.IRC_ESS_HELPOP) || override) {
String newMessage = filterMessage(
plugin.tokenizer.ircChatToGameTokenizer(this, user, channel, plugin.getMessageTemplate(
botNick, channelName, TemplateName.IRC_ESS_HELPOP), message), channelName);
if (!newMessage.isEmpty()) {
plugin.broadcastToGame(newMessage, channelName, "essentials.helpop.receive");
messageSent = true;
}
}
}
/*
Send messages to AdminPrivateChat if enabled
*/
if (plugin.adminPrivateChatHook != null) {
if (isMessageEnabled(channelName, TemplateName.IRC_ADMIN_CHAT) || override) {
String newMessage = filterMessage(
plugin.tokenizer.ircChatToGameTokenizer(this, user, channel, plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_ADMIN_CHAT), message), channelName);
if (!newMessage.isEmpty()) {
plugin.adminPrivateChatHook.sendMessage(newMessage, user.getNick());
messageSent = true;
}
}
}
/*
Send messages to Discord if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_DISCORD_CHAT) && plugin.discHook != null) {
String discordChannelName = discordChannel.get(channelName);
String discordTemplate = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_DISCORD_CHAT);
plugin.logDebug("broadcastChat [Discord]: " + discordChannelName + ": " + discordTemplate);
String rawDiscordMessage = filterMessage(
plugin.tokenizer.ircChatToDiscordTokenizer(this, user, channel, discordTemplate, message, discordChannelName), channelName);
if (!rawDiscordMessage.isEmpty()) {
plugin.discHook.sendMessage(discordChannelName, rawDiscordMessage);
messageSent = true;
}
}
/*
Notify IRC user that message was sent.
*/
if (isMessageEnabled(channelName, TemplateName.IRC_CHAT_RESPONSE) && messageSent && target != null) {
// Let the sender know the message was sent
String responseTemplate = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_CHAT_RESPONSE);
if (!responseTemplate.isEmpty()) {
switch (responseType) {
case CTCP:
asyncCTCPMessage(target, plugin.tokenizer.targetChatResponseTokenizer(user.getNick(), target, message, responseTemplate));
break;
case MESSAGE:
asyncIRCMessage(target, plugin.tokenizer.targetChatResponseTokenizer(user.getNick(), target, message, responseTemplate));
break;
case NOTICE:
asyncNoticeMessage(target, plugin.tokenizer.targetChatResponseTokenizer(user.getNick(), target, message, responseTemplate));
break;
}
}
}
}
/**
* Broadcast chat messages from IRC to specific hero channel
*
* @param user
* @param channel
* @param target
* @param message
*/
public void broadcastHeroChat(User user, org.pircbotx.Channel channel, String target, String message) {
String channelName = channel.getName();
if (message == null) {
plugin.logDebug("H: NULL MESSAGE");
asyncIRCMessage(target, "No channel specified!");
return;
}
if (message.contains(" ")) {
String hChannel;
String msg;
hChannel = message.split(" ", 2)[0];
msg = message.split(" ", 2)[1];
if (enabledMessages.get(channelName).contains(TemplateName.IRC_HERO_CHAT)) {
plugin.logDebug("Checking if " + hChannel + " is a valid hero channel...");
if (plugin.herochatHook.isValidChannel(hChannel)) {
hChannel = plugin.herochatHook.getChannelName(hChannel);
String template = plugin.getIrcHeroChatTemplate(botNick, hChannel);
plugin.logDebug("T: " + template);
String t = plugin.tokenizer.ircChatToHeroChatTokenizer(this, user, channel, template, msg, hChannel);
plugin.logDebug("Sending message to" + hChannel + ":" + t);
plugin.herochatHook.sendHeroMessage(hChannel, t);
//plugin.logDebug("Channel format: " + Herochat.getChannelManager().getChannel(hChannel).getFormat());
// Let the sender know the message was sent
String responseTemplate = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_HCHAT_RESPONSE);
if (!responseTemplate.isEmpty()) {
asyncIRCMessage(target, plugin.tokenizer
.targetChatResponseTokenizer(user.getNick(), hChannel, msg, responseTemplate));
}
} else {
asyncIRCMessage(target, "Hero channel \"" + hChannel + "\" does not exist!");
}
}
} else {
asyncIRCMessage(target, "No message specified.");
}
}
/**
* Send chat messages from IRC to player.
*
* @param user
* @param channel
* @param target
* @param message
*/
public void playerReplyChat(User user, org.pircbotx.Channel channel, String target, String message) {
if (message == null) {
plugin.logDebug("H: NULL MESSAGE");
asyncIRCMessage(target, "No message specified!");
return;
}
for (String name : ircPrivateMsgMap.keySet()) {
if (ircPrivateMsgMap.get(name).equals(target)) {
playerChat(user, channel, target, name + " " + message);
break;
}
}
}
/**
* Send chat messages from IRC to player.
*
* @param user
* @param channel
* @param target
* @param message
*/
public void playerChat(User user, org.pircbotx.Channel channel, String target, String message) {
String channelName = channel.getName();
if (message == null) {
plugin.logDebug("H: NULL MESSAGE");
asyncIRCMessage(target, "No player specified!");
return;
}
if (message.contains(" ")) {
String pName;
String msg;
pName = message.split(" ", 2)[0];
msg = message.split(" ", 2)[1];
if (isMessageEnabled(channelName, TemplateName.IRC_PCHAT)) {
Player player = plugin.getServer().getPlayer(pName);
if (player != null) {
if (player.isOnline()) {
plugin.logDebug("Yup, " + pName + " is a valid player...");
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_PCHAT);
String t = plugin.tokenizer.ircChatToGameTokenizer(this, user,
channel, template, msg);
String responseTemplate = plugin.getMessageTemplate(
botNick, channelName, TemplateName.IRC_PCHAT_RESPONSE);
if (!responseTemplate.isEmpty()) {
asyncIRCMessage(target, plugin.tokenizer
.targetChatResponseTokenizer(user.getNick(), pName, msg, responseTemplate));
}
plugin.logDebug("Tokenized message: " + t);
plugin.broadcastToPlayer(t, channelName, "irc.message.chat", player);
ircPrivateMsgMap.put(pName, user.getNick());
if (logPrivateChat) {
plugin.logInfo("Private message from IRC: " + user.getNick() + " -> " + pName + ": " + msg);
}
} else {
asyncIRCMessage(target, "Player is offline: " + pName);
}
} else {
asyncIRCMessage(target, "Player not found (possibly offline): " + pName);
}
}
} else {
asyncIRCMessage(target, "No message specified.");
}
}
/**
* Send received private chat to a player
*
* @param user
* @param from
* @param pName
* @param msg
*/
public void playerCrossChat(User user, String from, String pName, String msg) {
if (true) {
Player player = plugin.getServer().getPlayer(pName);
if (plugin.isMuted(player)) {
return;
}
if (player != null) {
if (player.isOnline()) {
plugin.logDebug("Yup, " + pName + " is a valid player...");
String template = plugin.getMessageTemplate(botNick, "", TemplateName.CROSS_CHAT);
String m = template.replace("%MESSAGE%", msg).replace("%SERVER%", user.getNick());
player.sendMessage(plugin.colorConverter.ircColorsToGame(m));
plugin.privateMsgReply.put(pName, from);
} else {
//no such player online
}
} else {
//asyncIRCMessage(from, "Player not found (possibly offline): " + pName);
}
}
}
/**
* Broadcast action messages from IRC
*
* @param user
* @param channel
* @param message
*/
public void broadcastAction(User user, org.pircbotx.Channel channel, String message) {
String channelName = channel.getName();
if (isMessageEnabled(channelName, TemplateName.IRC_ACTION)) {
plugin.broadcastToGame(plugin.tokenizer.ircChatToGameTokenizer(
this, user, channel, plugin.getMessageTemplate(
botNick, channelName, TemplateName.IRC_ACTION), message),
channelName, getIrcMessagePermission(channelName, "action"));
} else {
plugin.logDebug("Ignoring action due to "
+ TemplateName.IRC_ACTION + " is false");
}
/*
Send IRC action messages to HeroChat if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_HERO_ACTION)) {
String hChannel = heroChannelMap.get(channelName);
String tmpl = plugin.getIrcHeroActionTemplate(botNick, hChannel);
plugin.logDebug("broadcastChat [HA]: " + hChannel + ": " + tmpl);
String rawHCMessage = filterMessage(
plugin.tokenizer.ircChatToHeroChatTokenizer(this, user, channel, tmpl, message, hChannel), channelName);
if (!rawHCMessage.isEmpty()) {
plugin.herochatHook.sendHeroMessage(hChannel, rawHCMessage);
if (logIrcToHeroChat.containsKey(channelName)) {
if (logIrcToHeroChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawHCMessage);
}
}
}
}
/*
Send IRC action messages to VentureChat if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_VENTURE_ACTION) && plugin.ventureChatEnabled) {
String vcChannel = ventureChatChannel.get(channelName);
String vcTemplate = plugin.getIrcVentureChatActionTemplate(botNick, vcChannel);
plugin.logDebug("broadcastAction [VC]: " + vcChannel + ": " + vcTemplate);
String rawVcMessage = filterMessage(
plugin.tokenizer.ircChatToVentureChatTokenizer(this, user, channel, vcTemplate, message, vcChannel), channelName);
if (!rawVcMessage.isEmpty()) {
plugin.vcHook.sendMessage(vcChannel, rawVcMessage);
if (logIrcToVentureChat.containsKey(channelName)) {
if (logIrcToVentureChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawVcMessage);
}
}
}
}
/*
Send IRC action messages to VentureChat if enabled
*/
if (plugin.dynmapHook != null) {
if (isMessageEnabled(channelName, TemplateName.IRC_ACTION_DYNMAP_WEB_CHAT)) {
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_ACTION_DYNMAP_WEB_CHAT);
String rawDWMessage = filterMessage(
plugin.tokenizer.ircChatToGameTokenizer(this, user, channel, template, message), channelName);
plugin.dynmapHook.sendMessage(user.getNick(), rawDWMessage);
}
}
/*
Send IRC action messages to Discord if enabled
*/
if (isMessageEnabled(channelName, TemplateName.IRC_DISCORD_ACTION) && plugin.discHook != null) {
String discordChannelName = discordChannel.get(channelName);
String discordTemplate = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_DISCORD_ACTION);
plugin.logDebug("broadcastAction [Discord]: " + discordChannelName + ": " + discordTemplate);
String rawDiscordMessage = filterMessage(
plugin.tokenizer.ircChatToDiscordTokenizer(this, user, channel, discordTemplate, message, discordChannelName), channelName);
if (!rawDiscordMessage.isEmpty()) {
plugin.discHook.sendMessage(discordChannelName, rawDiscordMessage);
}
}
}
/**
*
* @param recipient
* @param kicker
* @param reason
* @param channel
*/
public void broadcastIRCKick(User recipient, User kicker, String reason, org.pircbotx.Channel channel) {
String channelName = channel.getName();
if (isMessageEnabled(channelName, TemplateName.IRC_KICK)) {
plugin.broadcastToGame(plugin.tokenizer.ircKickTokenizer(
this, recipient, kicker, reason, channel, plugin.getMessageTemplate(
botNick, channelName, TemplateName.IRC_KICK)),
channelName,
getIrcMessagePermission(channelName, "kick"));
}
if (isMessageEnabled(channelName, TemplateName.IRC_HERO_KICK)) {
String hChannel = heroChannelMap.get(channelName);
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_HERO_KICK);
String message = plugin.tokenizer.ircKickToHeroChatTokenizer(this, recipient, kicker, reason, channel, template, hChannel);
plugin.herochatHook.sendHeroMessage(hChannel, message);
}
// Broadcast kick message to VentureChat
if (isMessageEnabled(channelName, TemplateName.IRC_VENTURE_KICK) && plugin.ventureChatEnabled) {
String vcChannel = ventureChatChannel.get(channelName);
String vcTemplate = plugin.getMessageTemplate(botNick, vcChannel, TemplateName.IRC_VENTURE_KICK);
plugin.logDebug("broadcastIRCkick [VC]: " + vcChannel + ": " + vcTemplate);
String rawVcMessage = plugin.tokenizer.ircKickTokenizer(this, recipient, kicker, reason, channel, vcTemplate);
if (!rawVcMessage.isEmpty()) {
plugin.vcHook.sendMessage(vcChannel, rawVcMessage);
if (logIrcToVentureChat.containsKey(channelName)) {
if (logIrcToVentureChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawVcMessage);
}
}
}
}
}
/**
*
* @return
*/
public boolean isConnectedBlocking() {
return bot.isConnected();
}
/**
*
* @param user
* @param mode
* @param channel
*/
public void broadcastIRCMode(User user, String mode, org.pircbotx.Channel channel) {
String channelName = channel.getName();
if (isMessageEnabled(channel, TemplateName.IRC_MODE)) {
plugin.broadcastToGame(plugin.tokenizer.ircModeTokenizer(this, user, mode,
channel, plugin.getMessageTemplate(
botNick, channelName, TemplateName.IRC_MODE)),
channelName, getIrcMessagePermission(channelName, "mode"));
}
}
/**
*
* @param user
* @param message
* @param notice
* @param channel
*/
public void broadcastIRCNotice(User user, String message, String notice, org.pircbotx.Channel channel) {
String channelName = channel.getName();
if (isMessageEnabled(channel, TemplateName.IRC_NOTICE)) {
plugin.broadcastToGame(plugin.tokenizer.ircNoticeTokenizer(this, user,
message, notice, channel, plugin.getMessageTemplate(
botNick, channelName, TemplateName.IRC_NOTICE)),
channelName, getIrcMessagePermission(channelName, "notice"));
}
}
/**
*
* @param user
* @param channel
*/
public void broadcastIRCJoin(User user, org.pircbotx.Channel channel) {
String channelName = channel.getName();
if (isMessageEnabled(channel, TemplateName.IRC_JOIN)) {
plugin.logDebug("[broadcastIRCJoin] Broadcasting join message because " + TemplateName.IRC_JOIN + " is true.");
plugin.broadcastToGame(plugin.tokenizer.chatIRCTokenizer(
this, user, channel, plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_JOIN)),
channelName,
getIrcMessagePermission(channelName, "join"));
} else {
plugin.logDebug("[broadcastIRCJoin] NOT broadcasting join message because irc-join is false.");
}
// Broadcast join message to HeroChat
if (isMessageEnabled(channel, TemplateName.IRC_HERO_JOIN) && plugin.herochatHook != null) {
String hChannel = heroChannelMap.get(channelName);
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_HERO_JOIN);
String message = plugin.tokenizer.ircChatToHeroChatTokenizer(this, user, channel, template, hChannel);
plugin.herochatHook.sendHeroMessage(heroChannelMap.get(channelName), message);
}
// Broadcast join message to VentureChat
if (isMessageEnabled(channelName, TemplateName.IRC_VENTURE_JOIN) && plugin.ventureChatEnabled) {
String vcChannel = ventureChatChannel.get(channelName);
String vcTemplate = plugin.getMessageTemplate(botNick, vcChannel, TemplateName.IRC_VENTURE_JOIN);
plugin.logDebug("broadcastIRCJoin [VC]: " + vcChannel + ": " + vcTemplate);
String rawVcMessage = plugin.tokenizer.chatIRCTokenizer(this, user, channel, vcTemplate);
if (!rawVcMessage.isEmpty()) {
plugin.vcHook.sendMessage(vcChannel, rawVcMessage);
if (logIrcToVentureChat.containsKey(channelName)) {
if (logIrcToVentureChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawVcMessage);
}
}
}
}
}
public void broadcastIRCPart(User user, org.pircbotx.Channel channel) {
String channelName = channel.getName();
if (isMessageEnabled(channel, TemplateName.IRC_PART)) {
String message = plugin.tokenizer.chatIRCTokenizer(
this, user, channel, plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_PART));
plugin.logDebug("[broadcastIRCPart] Broadcasting part message because "
+ TemplateName.IRC_PART + " is true: " + message);
plugin.broadcastToGame(message, channelName, getIrcMessagePermission(channelName, "part"));
} else {
plugin.logDebug("[broadcastIRCPart] NOT broadcasting part message because "
+ TemplateName.IRC_PART + " is false.");
}
if (isMessageEnabled(channel, TemplateName.IRC_HERO_PART)) {
String hChannel = heroChannelMap.get(channel.getName());
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_HERO_PART);
String message = plugin.tokenizer.ircChatToHeroChatTokenizer(this, user, channel, template, hChannel);
plugin.herochatHook.sendHeroMessage(hChannel, message);
}
// Broadcast part message to VentureChat
if (isMessageEnabled(channelName, TemplateName.IRC_VENTURE_PART) && plugin.ventureChatEnabled) {
String vcChannel = ventureChatChannel.get(channelName);
String vcTemplate = plugin.getMessageTemplate(botNick, vcChannel, TemplateName.IRC_VENTURE_PART);
plugin.logDebug("broadcastIRCPart [VC]: " + vcChannel + ": " + vcTemplate);
String rawVcMessage = plugin.tokenizer.chatIRCTokenizer(this, user, channel, vcTemplate);
if (!rawVcMessage.isEmpty()) {
plugin.vcHook.sendMessage(vcChannel, rawVcMessage);
if (logIrcToVentureChat.containsKey(channelName)) {
if (logIrcToVentureChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawVcMessage);
}
}
}
}
}
public void broadcastIRCQuit(User user, org.pircbotx.Channel channel, String reason) {
String channelName = channel.getName();
if (isMessageEnabled(channel, TemplateName.IRC_QUIT)) {
plugin.logDebug("[broadcastIRCQuit] Broadcasting quit message because "
+ TemplateName.IRC_QUIT + " is true.");
plugin.broadcastToGame(plugin.tokenizer.chatIRCTokenizer(
this, user, channel, plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_QUIT))
.replace("%REASON%", reason), channelName, getIrcMessagePermission(channelName, "quit"));
} else {
plugin.logDebug("[broadcastIRCQuit] NOT broadcasting quit message because "
+ TemplateName.IRC_QUIT + " is false.");
}
if (isMessageEnabled(channel, TemplateName.IRC_HERO_QUIT)) {
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_HERO_QUIT);
String message = plugin.tokenizer.ircChatToHeroChatTokenizer(this, user, channel, template, heroChannelMap.get(channel.getName()));
plugin.herochatHook.sendHeroMessage(heroChannelMap.get(channel.getName()), message);
}
// Broadcast part message to VentureChat
if (isMessageEnabled(channelName, TemplateName.IRC_VENTURE_QUIT) && plugin.ventureChatEnabled) {
String vcChannel = ventureChatChannel.get(channelName);
String vcTemplate = plugin.getMessageTemplate(botNick, vcChannel, TemplateName.IRC_VENTURE_QUIT);
plugin.logDebug("broadcastIRCQuit [VC]: " + vcChannel + ": " + vcTemplate);
String rawVcMessage = plugin.tokenizer.chatIRCTokenizer(this, user, channel, vcTemplate);
if (!rawVcMessage.isEmpty()) {
plugin.vcHook.sendMessage(vcChannel, rawVcMessage);
if (logIrcToVentureChat.containsKey(channelName)) {
if (logIrcToVentureChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawVcMessage);
}
}
}
}
}
/**
* Broadcast topic changes from IRC
*
* @param user
* @param channel
* @param oldTopic
* @param topic
*/
public void broadcastIRCTopic(User user, org.pircbotx.Channel channel, String oldTopic, String topic) {
String channelName = channel.getName();
if (isMessageEnabled(channel, TemplateName.IRC_TOPIC)) {
plugin.broadcastToGame(plugin.tokenizer.chatIRCTokenizer(
this, user, channel, plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_TOPIC)),
channelName,
getIrcMessagePermission(channelName, "topic"));
}
if (isMessageEnabled(channel, TemplateName.IRC_HERO_TOPIC)) {
String hChannel = heroChannelMap.get(channel.getName());
String template = plugin.getMessageTemplate(botNick, channelName, TemplateName.IRC_HERO_TOPIC);
String message = plugin.tokenizer.ircChatToHeroChatTokenizer(this, user, channel, template, topic, hChannel);
plugin.herochatHook.sendHeroMessage(hChannel, message);
}
// Broadcast topic message to VentureChat
if (isMessageEnabled(channelName, TemplateName.IRC_VENTURE_TOPIC) && plugin.ventureChatEnabled) {
String vcChannel = ventureChatChannel.get(channelName);
String vcTemplate = plugin.getMessageTemplate(botNick, vcChannel, TemplateName.IRC_VENTURE_TOPIC);
plugin.logDebug("broadcastIRCTopic [VC]: " + vcChannel + ": " + vcTemplate);
String rawVcMessage = plugin.tokenizer.ircTopicToGameTokenizer(this, user, channel, vcTemplate, oldTopic, topic);
if (!rawVcMessage.isEmpty()) {
plugin.vcHook.sendMessage(vcChannel, rawVcMessage);
if (logIrcToVentureChat.containsKey(channelName)) {
if (logIrcToVentureChat.get(channelName)) {
plugin.getServer().getConsoleSender().sendMessage(rawVcMessage);
}
}
}
}
}
/**
*
* @param channelName
* @param templateName
* @return
*/
public boolean isMessageEnabled(String channelName, String templateName) {
boolean isEnabled = enabledMessages.get(channelName).contains(templateName);
plugin.logDebug("[isMessageEnabled] " + channelName + ":" + templateName + ":" + isEnabled);
return isEnabled;
}
/**
*
* @param channelName
* @return
*/
public Collection<String> getEnabledMessages(String channelName) {
if (enabledMessages.containsKey(channelName)) {
return enabledMessages.get(channelName);
}
return new ArrayList<>();
}
/**
*
* @param channel
* @param templateName
* @return
*/
public boolean isMessageEnabled(Channel channel, String templateName) {
return isMessageEnabled(channel.getName(), templateName);
}
/**
* Broadcast disconnect messages from IRC
*
* @param nick
*/
public void broadcastIRCDisconnect(String nick) {
plugin.broadcastToGame("[" + nick + "] Disconnected from IRC server.", "", "irc.message.disconnect");
}
/**
* Broadcast connect messages from IRC
*
* @param nick
*/
public void broadcastIRCConnect(String nick) {
plugin.broadcastToGame("[" + nick + "] Connected to IRC server.", "", "irc.message.connect");
}
/**
* Notify when players use commands
*
* @param player
* @param cmd
* @param params
*/
public void commandNotify(Player player, String cmd, String params) {
if (!this.isConnected()) {
return;
}
if (channelCmdNotifyMode.equalsIgnoreCase("msg")) {
for (String recipient : channelCmdNotifyRecipients) {
asyncIRCMessage(recipient, plugin.tokenizer.gameCommandToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, recipient, TemplateName.GAME_COMMAND), cmd, params));
}
} else if (channelCmdNotifyMode.equalsIgnoreCase("ctcp")) {
for (String recipient : channelCmdNotifyRecipients) {
asyncCTCPMessage(recipient, plugin.tokenizer.gameCommandToIRCTokenizer(player, plugin
.getMessageTemplate(botNick, recipient, TemplateName.GAME_COMMAND), cmd, params));
}
}
}
/**
* Send AFK message
*
* @param player
* @param afk
*/
public void essentialsAFK(Player player, boolean afk) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.GAME_AFK) && isPlayerInValidWorld(player, channelName)) {
String template;
if (afk) {
template = plugin.getMessageTemplate(botNick, channelName, TemplateName.ESS_PLAYER_AFK);
} else {
template = plugin.getMessageTemplate(botNick, channelName, TemplateName.ESS_PLAYER_NOT_AFK);
}
plugin.logDebug("Sending AFK message to " + channelName);
asyncIRCMessage(channelName, plugin.tokenizer.gamePlayerAFKTokenizer(player, template));
}
}
}
/**
* Send a private message to a player
*
* @param sender
* @param nick
* @param message
*/
public void msgPlayer(Player sender, String nick, String message) {
String msg = plugin.tokenizer.gameChatToIRCTokenizer(sender,
plugin.getMessageTemplate(botNick, "", TemplateName.GAME_PCHAT), message);
asyncIRCMessage(nick, msg);
ircPrivateMsgMap.put(sender.getName(), nick);
if (logPrivateChat) {
plugin.logInfo("Private message from game: " + sender.getName() + " -> " + nick + ": " + message);
}
}
/**
* Send a private message to a remote linked bot.
*
* @param sender
* @param remoteBot
* @param remotePlayer
* @param message
*/
public void msgRemotePlayer(Player sender, String remoteBot, String remotePlayer, String message) {
String msg = plugin.tokenizer.gameChatToIRCTokenizer(sender,
plugin.getMessageTemplate(botNick, "", TemplateName.GAME_PCHAT), message);
if (botLinks.containsKey(remoteBot)) {
String code = botLinks.get(remoteBot);
String from = sender.getName();
String clearText = "PRIVATE_MSG:" + code + ":" + from + ":" + remotePlayer + ":" + msg;
asyncCTCPMessage(remoteBot, plugin.encodeLinkMsg(PurpleIRC.LINK_CMD, clearText));
} else {
sender.sendMessage(ChatColor.RED + "Not linked to " + ChatColor.WHITE + remoteBot);
}
if (logPrivateChat) {
plugin.logInfo("Private message from game: " + sender.getName() + " -> " + remotePlayer + ": " + message);
}
}
public void sendRemotePlayerInfo() {
plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() {
@Override
public void run() {
if (botLinkingEnabled) {
for (String remoteBot : botLinks.keySet()) {
String code = botLinks.get(remoteBot);
String clearText = "PLAYER_INFO:" + code + ":"
+ plugin.getOnlinePlayerCount()
+ ":" + plugin.getServer().getMaxPlayers();
List<String> players = new ArrayList<>();
for (Player player : plugin.getServer().getOnlinePlayers()) {
players.add(player.getName());
}
clearText = clearText + ":" + Joiner.on(",").join(players);
asyncCTCPMessage(remoteBot, plugin.encodeLinkMsg(PurpleIRC.LINK_CMD, clearText));
}
}
}
}, 20);
}
/**
* Send a private message to a remote linked bot.
*
* @param remoteBot
* @param remotePlayer
* @param message
*/
public void replyToRemotePlayer(String remotePlayer, String remoteBot, String message) {
if (botLinks.containsKey(remoteBot)) {
String code = botLinks.get(remoteBot);
String clearText = "PRIVATE_AUTO_REPLY:" + code + ":" + botNick + ":" + remotePlayer + ":" + message;
asyncCTCPMessage(remoteBot, plugin.encodeLinkMsg(PurpleIRC.LINK_CMD, clearText));
}
}
/**
*
* @param nick
* @param message
*/
public void consoleMsgPlayer(String nick, String message) {
String msg = plugin.tokenizer.gameChatToIRCTokenizer("console",
plugin.getMessageTemplate(botNick, "", TemplateName.CONSOLE_CHAT), message);
asyncIRCMessage(nick, msg);
}
/**
* Send a private message to remote player.
*
* @param sender
* @param remoteBot
* @param remotePlayer
* @param message
*/
public void msgRemotePlayer(CommandSender sender, String remoteBot, String remotePlayer, String message) {
String msg = plugin.tokenizer.gameChatToIRCTokenizer(sender.getName(),
plugin.getMessageTemplate(botNick, "", TemplateName.CONSOLE_CHAT), message);
if (botLinks.containsKey(remoteBot)) {
String code = botLinks.get(remoteBot);
String from = sender.getName();
String clearText = "PRIVATE_MSG:" + code + ":" + from + ":" + remotePlayer + ":" + msg;
asyncCTCPMessage(remoteBot, plugin.encodeLinkMsg(PurpleIRC.LINK_CMD, clearText));
} else {
sender.sendMessage(ChatColor.RED + "Not linked to " + ChatColor.WHITE + remoteBot);
}
}
/**
*
* @param player
* @return
*/
protected String getFactionName(Player player) {
MPlayer mPlayer = MPlayer.get(player);
Faction faction = mPlayer.getFaction();
return faction.getName();
}
public boolean isConnected() {
return connected;
}
public ImmutableSortedSet<Channel> getChannels() {
if (bot.getNick().isEmpty()) {
return ImmutableSortedSet.<Channel>naturalOrder().build();
}
return bot.getUserBot().getChannels();
}
public long getMessageDelay() {
return bot.getConfiguration().getMessageDelay();
}
public String getMotd() {
return bot.getServerInfo().getMotd();
}
public boolean isValidChannel(String channelName) {
boolean valid = false;
for (String s : botChannels) {
if (channelName.equalsIgnoreCase(s)) {
valid = true;
break;
}
}
plugin.logDebug("[isValidChannel] [c: " + channelName + "] [b: " + valid + "]");
return valid;
}
public PircBotX getBot() {
return bot;
}
/**
*
* @param connected
*/
public void setConnected(boolean connected) {
this.connected = connected;
}
public String getFileName() {
return fileName;
}
public String prismBlockStateChangeTokens(String message, ArrayList<BlockStateChange> blockStateChange) {
String X;
String Y;
String Z;
String origBlock;
String newBlock;
String blockWorld;
try {
blockWorld = String.valueOf(blockStateChange.get(0).getNewBlock().getWorld().getName());
} catch (Exception ex) {
plugin.logDebug(ex.getMessage());
blockWorld = "";
}
try {
origBlock = String.valueOf(blockStateChange.get(0).getOriginalBlock().getType().name());
} catch (Exception ex) {
plugin.logDebug(ex.getMessage());
origBlock = "";
}
try {
newBlock = String.valueOf(blockStateChange.get(0).getNewBlock().getType().name());
} catch (Exception ex) {
plugin.logDebug(ex.getMessage());
newBlock = "";
}
try {
X = String.valueOf(blockStateChange.get(0).getNewBlock().getX());
Y = String.valueOf(blockStateChange.get(0).getNewBlock().getY());
Z = String.valueOf(blockStateChange.get(0).getNewBlock().getZ());
} catch (Exception ex) {
plugin.logDebug(ex.getMessage());
X = "";
Y = "";
Z = "";
}
if (X == null) {
X = "";
}
if (Y == null) {
Y = "";
}
if (Z == null) {
Z = "";
}
if (blockWorld == null) {
blockWorld = null;
}
if (origBlock == null) {
origBlock = "";
}
if (newBlock == null) {
newBlock = "";
}
return message
.replace("%ORIGINALBLOCK%", origBlock)
.replace("%NEWBLOCK%", newBlock)
.replace("%X%", X)
.replace("%Y%", Y)
.replace("%Z%", Z)
.replace("%BLOCKWORLD%", blockWorld);
}
public void gamePrismRollback(Player player, QueryParameters queryParams, ArrayList<BlockStateChange> blockStateChange) {
if (!this.isConnected()) {
return;
}
String keyword = queryParams.getKeyword();
String sortDirection = queryParams.getSortDirection();
String worldName = queryParams.getWorld();
String id = String.valueOf(queryParams.getId());
String radius = String.valueOf(queryParams.getRadius());
if (keyword == null) {
keyword = "";
}
if (sortDirection == null) {
sortDirection = "";
}
if (worldName == null) {
worldName = "";
}
if (id == null) {
id = "";
}
if (radius == null) {
radius = "";
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.PRISM_ROLLBACK)) {
asyncIRCMessage(channelName, prismBlockStateChangeTokens(plugin.tokenizer
.playerTokenizer(player, plugin.getMessageTemplate(botNick, channelName, TemplateName.PRISM_ROLLBACK))
.replace("%COMMAND%", queryParams.getOriginalCommand())
.replace("%KEYWORD%", keyword)
.replace("%SORTDIRECTION%", sortDirection)
.replace("%PARAMWORLD%", worldName)
.replace("%ID%", id)
.replace("%RADIUS%", radius), blockStateChange
));
}
}
}
public void gamePrismRollback(String name, QueryParameters queryParams, ArrayList<BlockStateChange> blockStateChange) {
if (!this.isConnected()) {
return;
}
String keyword = queryParams.getKeyword();
String sortDirection = queryParams.getSortDirection();
String worldName = queryParams.getWorld();
String id = String.valueOf(queryParams.getId());
String radius = String.valueOf(queryParams.getRadius());
if (keyword == null) {
keyword = "";
}
if (sortDirection == null) {
sortDirection = "";
}
if (worldName == null) {
worldName = "";
}
if (id == null) {
id = "";
}
if (radius == null) {
radius = "";
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.PRISM_ROLLBACK)) {
asyncIRCMessage(channelName, prismBlockStateChangeTokens(plugin.tokenizer
.gameChatToIRCTokenizer(name, plugin.getMessageTemplate(botNick, channelName, TemplateName.PRISM_ROLLBACK))
.replace("%NAME%", name)
.replace("%COMMAND%", queryParams.getOriginalCommand())
.replace("%KEYWORD%", keyword)
.replace("%SORTDIRECTION%", sortDirection)
.replace("%PARAMWORLD%", worldName)
.replace("%ID%", id)
.replace("%RADIUS%", radius), blockStateChange
));
}
}
}
public void gamePrismDrainOrExtinguish(String template, Player player, int radius, ArrayList<BlockStateChange> blockStateChange) {
if (!this.isConnected()) {
return;
}
String radiusStr = String.valueOf(radius);
if (radiusStr == null) {
radiusStr = "";
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, template)) {
asyncIRCMessage(channelName, prismBlockStateChangeTokens(plugin.tokenizer
.playerTokenizer(player, plugin.getMessageTemplate(botNick, channelName, template))
.replace("%RADIUS%", radiusStr), blockStateChange
));
}
}
}
public void gamePrismCustom(Player player, String actionName, String message, String pluginName) {
if (!this.isConnected()) {
return;
}
for (String channelName : botChannels) {
if (isMessageEnabled(channelName, TemplateName.PRISM_CUSTOM)) {
asyncIRCMessage(channelName, plugin.tokenizer
.playerTokenizer(player, plugin.getMessageTemplate(botNick, channelName, TemplateName.PRISM_CUSTOM))
.replace("%ACTION%", actionName)
.replace("%MESSAGE%", message)
.replace("%PLUGIN%", pluginName)
);
}
}
}
/**
* Send an IRC join notice to the game.
*
* @param channel IRC channel of the user that joined
* @param user IRC user that joined the channel
*/
public void joinNotice(Channel channel, User user) {
if (user.getNick().equalsIgnoreCase(botNick)) {
return;
}
if (joinNoticeEnabled) {
if (joinNoticeCooldownMap.containsKey(user.getHostmask())) {
long prevTime = joinNoticeCooldownMap.get(user.getHostmask());
long currentTime = System.currentTimeMillis();
long diff = currentTime - prevTime;
if (diff < (joinNoticeCoolDown * 1000)) {
plugin.logDebug("joinNotice: " + diff);
return;
}
} else {
joinNoticeCooldownMap.put(user.getHostmask(), System.currentTimeMillis());
}
String target = channel.getName();
if (joinNoticePrivate) {
target = user.getNick();
}
String myMessage = ChatColor.translateAlternateColorCodes('&', plugin.colorConverter.gameColorsToIrc(joinNoticeMessage.replace("%NAME%", user.getNick())));
if (joinNoticeMessage.startsWith("/")) {
plugin.commandQueue.add(new IRCCommand(
new IRCCommandSender(this, target, plugin, joinResponseType, "CONSOLE", "%RESULT%"),
new IRCConsoleCommandSender(this, target, plugin, joinResponseType, "CONSOLE"),
myMessage.trim().substring(1)));
} else if (joinNoticeCtcp) {
asyncCTCPMessage(target, myMessage);
} else {
asyncIRCMessage(target, myMessage);
}
}
}
/**
* Change the bot's IRC nick to an alternate.
*/
public void altNickChange() {
if (altNicks.isEmpty()) {
return;
}
if (nickIndex >= 0 && nickIndex < altNicks.size()) {
botNick = altNicks.get(nickIndex).replace("%NICK%", nick);
nickIndex++;
} else {
nickIndex = 0;
}
plugin.logInfo("Trying alternate nick " + botNick);
bot.sendIRC().changeNick(botNick);
}
public String getIrcMessagePermission(String channelName, String node) {
if (permissions.containsKey(channelName)) {
if (permissions.get(channelName).containsKey(node)) {
return permissions.get(channelName).get(node);
}
}
return "irc.message." + node;
}
}