Some cleanup, refactoring of EssentialsHelp class

This commit is contained in:
snowleo 2011-10-27 00:03:16 +02:00
parent 7622c5c510
commit 60b9d4fc80
24 changed files with 603 additions and 431 deletions

View File

@ -1,12 +1,11 @@
package com.earth2me.essentials.update; package com.earth2me.essentials.update;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public abstract class WorkListener public abstract class AbstractWorkListener
{ {
public WorkListener(final Plugin plugin, final VersionInfo newVersionInfo) public AbstractWorkListener(final Plugin plugin, final VersionInfo newVersionInfo)
{ {
this.plugin = plugin; this.plugin = plugin;
this.newVersionInfo = newVersionInfo; this.newVersionInfo = newVersionInfo;

View File

@ -1,16 +1,16 @@
package com.earth2me.essentials.update; package com.earth2me.essentials.update;
import java.io.BufferedReader; import com.earth2me.essentials.update.chat.Command;
import java.io.File; import com.earth2me.essentials.update.chat.ConfigCommand;
import java.io.FileInputStream; import com.earth2me.essentials.update.chat.ErrorsCommand;
import java.io.IOException; import com.earth2me.essentials.update.chat.HelpCommand;
import java.io.InputStreamReader; import com.earth2me.essentials.update.chat.IrcBot;
import java.nio.charset.Charset; import com.earth2me.essentials.update.chat.ListCommand;
import java.util.logging.Level; import com.earth2me.essentials.update.chat.StartupCommand;
import java.util.logging.Logger; import com.earth2me.essentials.update.chat.UsernameUtil;
import java.util.regex.Matcher; import java.util.HashMap;
import java.util.regex.Pattern; import java.util.Locale;
import org.bukkit.Bukkit; import java.util.Map;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -21,7 +21,6 @@ import org.bukkit.event.player.PlayerListener;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.jibble.pircbot.User;
public class EssentialsHelp extends PlayerListener public class EssentialsHelp extends PlayerListener
@ -29,14 +28,19 @@ public class EssentialsHelp extends PlayerListener
private transient Player chatUser; private transient Player chatUser;
private final transient Server server; private final transient Server server;
private final transient Plugin plugin; private final transient Plugin plugin;
private final static Charset UTF8 = Charset.forName("utf-8");
private transient IrcBot ircBot; private transient IrcBot ircBot;
private final transient Map<String, Command> commands = new HashMap<String, Command>();
public EssentialsHelp(final Plugin plugin) public EssentialsHelp(final Plugin plugin)
{ {
super(); super();
this.plugin = plugin; this.plugin = plugin;
this.server = plugin.getServer(); this.server = plugin.getServer();
commands.put("!help", new HelpCommand());
commands.put("!list", new ListCommand());
commands.put("!startup", new StartupCommand(plugin));
commands.put("!errors", new ErrorsCommand(plugin));
commands.put("!config", new ConfigCommand(plugin));
} }
public void registerEvents() public void registerEvents()
@ -46,7 +50,7 @@ public class EssentialsHelp extends PlayerListener
pluginManager.registerEvent(Type.PLAYER_CHAT, this, Priority.Low, plugin); pluginManager.registerEvent(Type.PLAYER_CHAT, this, Priority.Low, plugin);
} }
public void onCommand(CommandSender sender) public void onCommand(final CommandSender sender)
{ {
if (sender instanceof Player && sender.hasPermission("essentials.helpchat")) if (sender instanceof Player && sender.hasPermission("essentials.helpchat"))
{ {
@ -74,11 +78,7 @@ public class EssentialsHelp extends PlayerListener
public void onDisable() public void onDisable()
{ {
if ( ircBot != null) closeConnection();
{
ircBot.quit();
ircBot = null;
}
} }
private boolean sendChatMessage(final Player player, final String message) private boolean sendChatMessage(final Player player, final String message)
@ -90,35 +90,19 @@ public class EssentialsHelp extends PlayerListener
} }
if (ircBot == null) if (ircBot == null)
{ {
if (messageCleaned.equalsIgnoreCase("yes")) return handleAnswer(messageCleaned, player);
{
player.sendMessage("Connecting...");
connectToIRC(player);
return true;
}
if (messageCleaned.equalsIgnoreCase("no") || message.equalsIgnoreCase("!quit"))
{
chatUser = null;
return true;
}
return false;
} }
else else
{ {
if (ircBot.isKicked()) { if (ircBot.isKicked())
chatUser = null; {
ircBot.quit(); closeConnection();
ircBot = null;
return false; return false;
} }
final String lowMessage = messageCleaned.toLowerCase(); final String lowMessage = messageCleaned.toLowerCase(Locale.ENGLISH);
if (lowMessage.startsWith("!quit")) if (lowMessage.startsWith("!quit"))
{ {
chatUser = null; closeConnection();
if (ircBot != null) {
ircBot.quit();
ircBot = null;
}
player.sendMessage("Connection closed."); player.sendMessage("Connection closed.");
return true; return true;
} }
@ -126,52 +110,8 @@ public class EssentialsHelp extends PlayerListener
{ {
return false; return false;
} }
if (lowMessage.startsWith("!list")) if (handleCommands(lowMessage, player))
{ {
final User[] members = ircBot.getUsers();
final StringBuilder sb = new StringBuilder();
for (User user : members)
{
if (sb.length() > 0)
{
sb.append("§f, ");
}
if (user.isOp() || user.hasVoice())
{
sb.append("§6");
}
else
{
sb.append("§7");
}
sb.append(user.getPrefix()).append(user.getNick());
}
player.sendMessage(sb.toString());
return true;
}
if (lowMessage.startsWith("!help"))
{
player.sendMessage("Commands: (Note: Files send to the chat will be public viewable.)");
player.sendMessage("!errors - Send the last server errors to the chat.");
player.sendMessage("!startup - Send the last startup messages to the chat.");
player.sendMessage("!config - Sends your Essentials config to the chat.");
player.sendMessage("!list - List all players in chat.");
player.sendMessage("!quit - Leave chat.");
return true;
}
if (lowMessage.startsWith("!errors"))
{
sendErrors();
return true;
}
if (lowMessage.startsWith("!startup"))
{
sendStartup();
return true;
}
if (lowMessage.startsWith("!config"))
{
sendConfig();
return true; return true;
} }
ircBot.sendMessage(messageCleaned); ircBot.sendMessage(messageCleaned);
@ -180,300 +120,62 @@ public class EssentialsHelp extends PlayerListener
} }
} }
private String buildIrcName() private void closeConnection()
{ {
final StringBuilder nameBuilder = new StringBuilder(); chatUser = null;
nameBuilder.append(chatUser.getName()); if (ircBot != null)
final Matcher versionMatch = Pattern.compile("git-Bukkit-([0-9]+).([0-9]+).([0-9]+)-[0-9]+-[0-9a-z]+-b([0-9]+)jnks.*").matcher(server.getVersion());
if (versionMatch.matches())
{ {
nameBuilder.append(" CB"); ircBot.quit();
nameBuilder.append(versionMatch.group(4)); ircBot = null;
} }
}
final Plugin essentials = server.getPluginManager().getPlugin("Essentials"); private boolean handleAnswer(final String message, final Player player)
if (essentials != null) {
if (message.equalsIgnoreCase("yes"))
{ {
nameBuilder.append(" ESS"); player.sendMessage("Connecting...");
nameBuilder.append(essentials.getDescription().getVersion()); connectToIRC(player);
return true;
} }
if (message.equalsIgnoreCase("no") || message.equalsIgnoreCase("!quit"))
final Plugin groupManager = server.getPluginManager().getPlugin("GroupManager");
if (groupManager != null)
{ {
nameBuilder.append(" GM"); chatUser = null;
if (!groupManager.isEnabled()) return true;
{
nameBuilder.append('!');
}
} }
return false;
}
final Plugin pex = server.getPluginManager().getPlugin("PermissionsEx"); private boolean handleCommands(final String lowMessage, final Player player)
if (pex != null) {
final String[] parts = lowMessage.split(" ");
if (commands.containsKey(parts[0]))
{ {
nameBuilder.append(" PEX"); commands.get(parts[0]).run(ircBot, player);
if (!pex.isEnabled()) return true;
{
nameBuilder.append('!');
}
nameBuilder.append(pex.getDescription().getVersion());
} }
return false;
final Plugin pb = server.getPluginManager().getPlugin("PermissionsBukkit");
if (pb != null)
{
nameBuilder.append(" PB");
if (!pb.isEnabled())
{
nameBuilder.append('!');
}
nameBuilder.append(pb.getDescription().getVersion());
}
final Plugin bp = server.getPluginManager().getPlugin("bPermissions");
if (bp != null)
{
nameBuilder.append(" BP");
if (!bp.isEnabled())
{
nameBuilder.append('!');
}
nameBuilder.append(bp.getDescription().getVersion());
}
final Plugin perm = server.getPluginManager().getPlugin("Permissions");
if (perm != null)
{
nameBuilder.append(" P");
if (!perm.isEnabled())
{
nameBuilder.append('!');
}
nameBuilder.append(perm.getDescription().getVersion());
}
return nameBuilder.toString();
} }
private void connectToIRC(final Player player) private void connectToIRC(final Player player)
{ {
ircBot = new IrcBot(player, "Ess_" + player.getName(), buildIrcName()); ircBot = new IrcBot(player, "Ess_" + player.getName(), UsernameUtil.createUsername(player));
}
private void sendErrors()
{
BufferedReader page = null;
try
{
File bukkitFolder = plugin.getDataFolder().getAbsoluteFile().getParentFile().getParentFile();
if (bukkitFolder == null || !bukkitFolder.exists())
{
chatUser.sendMessage("Bukkit folder not found.");
return;
}
File logFile = new File(bukkitFolder, "server.log");
if (!logFile.exists())
{
chatUser.sendMessage("Server log not found.");
return;
}
FileInputStream fis = new FileInputStream(logFile);
if (logFile.length() > 1000000)
{
fis.skip(logFile.length() - 1000000);
}
page = new BufferedReader(new InputStreamReader(fis));
final StringBuilder input = new StringBuilder();
String line;
Pattern pattern = Pattern.compile("^[0-9 :-]+\\[INFO\\].*");
while ((line = page.readLine()) != null)
{
if (!pattern.matcher(line).matches())
{
input.append(line).append("\n");
}
}
if (input.length() > 10000)
{
input.delete(0, input.length() - 10000);
}
final PastieUpload pastie = new PastieUpload();
final String url = pastie.send(input.toString());
String message = "Errors: " + url;
chatUser.sendMessage("§6" + ircBot.getNick() + ": §7" + message);
ircBot.sendMessage(message);
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
chatUser.sendMessage(ex.getMessage());
}
finally
{
try
{
if (page != null)
{
page.close();
}
}
catch (IOException ex)
{
Logger.getLogger(EssentialsHelp.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void sendStartup()
{
BufferedReader page = null;
try
{
File bukkitFolder = plugin.getDataFolder().getAbsoluteFile().getParentFile().getParentFile();
if (bukkitFolder == null || !bukkitFolder.exists())
{
chatUser.sendMessage("Bukkit folder not found.");
return;
}
File logFile = new File(bukkitFolder, "server.log");
if (!logFile.exists())
{
chatUser.sendMessage("Server log not found.");
return;
}
FileInputStream fis = new FileInputStream(logFile);
if (logFile.length() > 1000000)
{
fis.skip(logFile.length() - 1000000);
}
page = new BufferedReader(new InputStreamReader(fis));
final StringBuilder input = new StringBuilder();
String line;
Pattern patternStart = Pattern.compile("^[0-9 :-]+\\[INFO\\] Starting minecraft server version.*");
Pattern patternEnd = Pattern.compile("^[0-9 :-]+\\[INFO\\] Done \\([0-9.,]+s\\)! For help, type \"help\".*");
boolean log = false;
while ((line = page.readLine()) != null)
{
if (patternStart.matcher(line).matches())
{
if (input.length() > 0)
{
input.delete(0, input.length());
}
log = true;
}
if (log)
{
input.append(line).append("\n");
}
if (patternEnd.matcher(line).matches())
{
log = false;
}
}
if (input.length() > 10000)
{
input.delete(0, input.length() - 10000);
}
final PastieUpload pastie = new PastieUpload();
final String url = pastie.send(input.toString());
String message = "Startup: " + url;
chatUser.sendMessage("§6" + ircBot.getNick() + ": §7" + message);
ircBot.sendMessage(message);
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
chatUser.sendMessage(ex.getMessage());
}
finally
{
try
{
if (page != null)
{
page.close();
}
}
catch (IOException ex)
{
Logger.getLogger(EssentialsHelp.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
private void sendConfig()
{
BufferedReader page = null;
try
{
File configFolder = new File(plugin.getDataFolder().getParentFile(), "Essentials");
if (!configFolder.exists())
{
chatUser.sendMessage("Essentials plugin folder not found.");
return;
}
File configFile = new File(configFolder, "config.yml");
if (!configFile.exists())
{
chatUser.sendMessage("Essentials config file not found.");
return;
}
page = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), UTF8));
final StringBuilder input = new StringBuilder();
String line;
while ((line = page.readLine()) != null)
{
input.append(line).append("\n");
}
final PastieUpload pastie = new PastieUpload();
final String url = pastie.send(input.toString());
String message = "Essentials config.yml: " + url;
chatUser.sendMessage("§6" + ircBot.getNick() + ": §7" + message);
ircBot.sendMessage(message);
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
chatUser.sendMessage(ex.getMessage());
}
finally
{
try
{
if (page != null)
{
page.close();
}
}
catch (IOException ex)
{
Logger.getLogger(EssentialsHelp.class.getName()).log(Level.SEVERE, null, ex);
}
}
} }
@Override @Override
public void onPlayerChat(PlayerChatEvent event) public void onPlayerChat(final PlayerChatEvent event)
{ {
if (event.getPlayer() == chatUser) if (event.getPlayer() == chatUser)
{ {
boolean success = sendChatMessage(event.getPlayer(), event.getMessage()); final boolean success = sendChatMessage(event.getPlayer(), event.getMessage());
event.setCancelled(success); event.setCancelled(success);
return; return;
} }
} }
@Override @Override
public void onPlayerQuit(PlayerQuitEvent event) public void onPlayerQuit(final PlayerQuitEvent event)
{ {
chatUser = null; closeConnection();
if (ircBot != null) {
ircBot.quit();
ircBot = null;
}
return;
} }
} }

View File

@ -12,7 +12,8 @@ import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.logging.Logger; import java.util.logging.Level;
import org.bukkit.Bukkit;
public class GetFile public class GetFile
@ -53,7 +54,7 @@ public class GetFile
} }
catch (NoSuchAlgorithmException ex) catch (NoSuchAlgorithmException ex)
{ {
// Ignore because the code is never called throw new RuntimeException(ex);
} }
} }
@ -101,7 +102,7 @@ public class GetFile
} }
if (brokenFile && !file.delete()) if (brokenFile && !file.delete())
{ {
Logger.getLogger("Minecraft").severe("Could not delete file " + file.getPath()); Bukkit.getLogger().log(Level.SEVERE, "Could not delete file {0}", file.getPath());
} }
} }
finally finally

View File

@ -3,7 +3,6 @@ package com.earth2me.essentials.update;
import java.io.File; import java.io.File;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -22,7 +21,7 @@ public class UpdateCheck
private final transient Plugin plugin; private final transient Plugin plugin;
private transient boolean essentialsInstalled; private transient boolean essentialsInstalled;
public UpdateCheck(Plugin plugin) public UpdateCheck(final Plugin plugin)
{ {
this.plugin = plugin; this.plugin = plugin;
updateFile = new UpdateFile(plugin); updateFile = new UpdateFile(plugin);
@ -31,21 +30,20 @@ public class UpdateCheck
private void checkForEssentials() private void checkForEssentials()
{ {
PluginManager pm = plugin.getServer().getPluginManager(); final PluginManager pluginManager = plugin.getServer().getPluginManager();
Plugin essentials = pm.getPlugin("Essentials"); final Plugin essentials = pluginManager.getPlugin("Essentials");
if (essentials == null) essentialsInstalled = essentials != null;
if (essentialsInstalled)
{
currentVersion = new Version(essentials.getDescription().getVersion());
}
else
{ {
essentialsInstalled = false;
if (new File(plugin.getDataFolder().getParentFile(), "Essentials.jar").exists()) if (new File(plugin.getDataFolder().getParentFile(), "Essentials.jar").exists())
{ {
Bukkit.getLogger().severe("Essentials.jar found, but not recognized by Bukkit. Broken download?"); Bukkit.getLogger().severe("Essentials.jar found, but not recognized by Bukkit. Broken download?");
} }
} }
else
{
essentialsInstalled = true;
currentVersion = new Version(essentials.getDescription().getVersion());
}
} }
public void scheduleUpdateTask() public void scheduleUpdateTask()
@ -81,6 +79,7 @@ public class UpdateCheck
return updateFile.getVersions().get(newVersion); return updateFile.getVersions().get(newVersion);
} }
public enum CheckResult public enum CheckResult
{ {
NEW_ESS, NEW_ESS_BUKKIT, NEW_BUKKIT, OK, UNKNOWN NEW_ESS, NEW_ESS_BUKKIT, NEW_BUKKIT, OK, UNKNOWN

View File

@ -60,7 +60,7 @@ public class UpdateProcess extends PlayerListener
currentPlayer.sendMessage("A newer version of EssentialsUpdate is found. Downloading new file and reloading server."); currentPlayer.sendMessage("A newer version of EssentialsUpdate is found. Downloading new file and reloading server.");
} }
Bukkit.getLogger().log(Level.INFO, "A newer version of EssentialsUpdate is found. Downloading new file and reloading server."); Bukkit.getLogger().log(Level.INFO, "A newer version of EssentialsUpdate is found. Downloading new file and reloading server.");
new SelfUpdate(new WorkListener(plugin, updateCheck.getNewVersionInfo()) new SelfUpdate(new AbstractWorkListener(plugin, updateCheck.getNewVersionInfo())
{ {
@Override @Override
public void onWorkAbort(final String message) public void onWorkAbort(final String message)

View File

@ -147,7 +147,7 @@ public class Version implements Comparable<Version>
hash = 71 * hash + this.major; hash = 71 * hash + this.major;
hash = 71 * hash + this.minor; hash = 71 * hash + this.minor;
hash = 71 * hash + this.build; hash = 71 * hash + this.build;
hash = 71 * hash + (this.type != null ? this.type.hashCode() : 0); hash = 71 * hash + (this.type == null ? 0 : this.type.hashCode());
return hash; return hash;
} }

View File

@ -0,0 +1,68 @@
package com.earth2me.essentials.update.chat;
import com.earth2me.essentials.update.PastieUpload;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import org.bukkit.plugin.Plugin;
public abstract class AbstractFileCommand implements Command
{
private final transient Plugin plugin;
private final static Charset UTF8 = Charset.forName("utf-8");
public AbstractFileCommand(final Plugin plugin)
{
this.plugin = plugin;
}
protected BufferedReader getServerLogReader() throws IOException
{
final File bukkitFolder = plugin.getDataFolder().getAbsoluteFile().getParentFile().getParentFile();
if (bukkitFolder == null || !bukkitFolder.exists())
{
throw new IOException("Bukkit folder not found.");
}
final File logFile = new File(bukkitFolder, "server.log");
if (!logFile.exists())
{
throw new IOException("Server log not found.");
}
final FileInputStream fis = new FileInputStream(logFile);
if (logFile.length() > 1000000)
{
fis.skip(logFile.length() - 1000000);
}
return new BufferedReader(new InputStreamReader(fis));
}
protected BufferedReader getPluginConfig(final String pluginName, final String fileName) throws IOException
{
final File configFolder = new File(plugin.getDataFolder().getAbsoluteFile().getParentFile(), pluginName);
if (!configFolder.exists())
{
throw new IOException(pluginName+" plugin folder not found.");
}
final File configFile = new File(configFolder, fileName);
if (!configFile.exists())
{
throw new IOException(pluginName+" plugin file "+fileName+" not found.");
}
return new BufferedReader(new InputStreamReader(new FileInputStream(configFile), UTF8));
}
protected String uploadToPastie(final StringBuilder input) throws IOException
{
if (input.length() > 10000)
{
input.delete(0, input.length() - 10000);
}
final PastieUpload pastie = new PastieUpload();
return pastie.send(input.toString());
}
}

View File

@ -0,0 +1,9 @@
package com.earth2me.essentials.update.chat;
import org.bukkit.entity.Player;
public interface Command
{
void run(final IrcBot ircBot, final Player player);
}

View File

@ -0,0 +1,62 @@
package com.earth2me.essentials.update.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class ConfigCommand extends AbstractFileCommand implements Command
{
public ConfigCommand(final Plugin plugin)
{
super(plugin);
}
@Override
public void run(final IrcBot ircBot, final Player player)
{
BufferedReader page = null;
try
{
page = getPluginConfig("Essentials", "config.yml");
final StringBuilder input = new StringBuilder();
do
{
final String line = page.readLine();
if (line == null) {
break;
} else {
input.append(line).append("\n");
}
} while (true);
page.close();
final String message = "Essentials config.yml: " + uploadToPastie(input);
player.sendMessage("§6" + ircBot.getNick() + ": §7" + message);
ircBot.sendMessage(message);
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
player.sendMessage(ex.getMessage());
}
finally
{
try
{
if (page != null)
{
page.close();
}
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
player.sendMessage(ex.getMessage());
}
}
}
}

View File

@ -0,0 +1,71 @@
package com.earth2me.essentials.update.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class ErrorsCommand extends AbstractFileCommand implements Command
{
private final transient Pattern pattern = Pattern.compile("^[0-9 :-]+\\[INFO\\].*");
public ErrorsCommand(final Plugin plugin)
{
super(plugin);
}
@Override
public void run(final IrcBot ircBot, final Player player)
{
BufferedReader page = null;
try
{
page = getServerLogReader();
final StringBuilder input = new StringBuilder();
do
{
final String line = page.readLine();
if (line == null)
{
break;
}
else
{
if (!pattern.matcher(line).matches())
{
input.append(line).append("\n");
}
}
}
while (true);
page.close();
final String message = "Errors: " + uploadToPastie(input);
player.sendMessage("§6" + ircBot.getNick() + ": §7" + message);
ircBot.sendMessage(message);
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
player.sendMessage(ex.getMessage());
}
finally
{
try
{
if (page != null)
{
page.close();
}
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
player.sendMessage(ex.getMessage());
}
}
}
}

View File

@ -0,0 +1,18 @@
package com.earth2me.essentials.update.chat;
import org.bukkit.entity.Player;
public class HelpCommand implements Command
{
@Override
public void run(final IrcBot ircBot, final Player player)
{
player.sendMessage("Commands: (Note: Files send to the chat will be public viewable.)");
player.sendMessage("!errors - Send the last server errors to the chat.");
player.sendMessage("!startup - Send the last startup messages to the chat.");
player.sendMessage("!config - Sends your Essentials config to the chat.");
player.sendMessage("!list - List all players in chat.");
player.sendMessage("!quit - Leave chat.");
}
}

View File

@ -1,4 +1,4 @@
package com.earth2me.essentials.update; package com.earth2me.essentials.update.chat;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; import java.util.logging.Level;
@ -95,7 +95,9 @@ public class IrcBot extends PircBot
} }
@Override @Override
protected void onKick(String channel, String kickerNick, String kickerLogin, String kickerHostname, String recipientNick, String reason) protected void onKick(final String channel, final String kickerNick,
final String kickerLogin, final String kickerHostname,
final String recipientNick, final String reason)
{ {
if (recipientNick.equals(getNick())) if (recipientNick.equals(getNick()))
{ {
@ -111,25 +113,33 @@ public class IrcBot extends PircBot
} }
@Override @Override
protected void onMessage(String channel, String sender, String login, String hostname, String message) protected void onMessage(final String channel, final String sender,
final String login, final String hostname,
final String message)
{ {
player.sendMessage(formatChatMessage(sender, message, false)); player.sendMessage(formatChatMessage(sender, message, false));
} }
@Override @Override
protected void onAction(String sender, String login, String hostname, String target, String action) protected void onAction(final String sender, final String login,
final String hostname, final String target,
final String action)
{ {
player.sendMessage(formatChatMessage(sender, action, true)); player.sendMessage(formatChatMessage(sender, action, true));
} }
@Override @Override
protected void onNotice(String sourceNick, String sourceLogin, String sourceHostname, String target, String notice) protected void onNotice(final String sourceNick, final String sourceLogin,
final String sourceHostname, final String target,
final String notice)
{ {
player.sendMessage(formatChatMessage(sourceNick, notice, false)); player.sendMessage(formatChatMessage(sourceNick, notice, false));
} }
@Override @Override
protected void onTopic(String channel, String topic, String setBy, long date, boolean changed) protected void onTopic(final String channel, final String topic,
final String setBy, final long date,
final boolean changed)
{ {
player.sendMessage(formatChatMessage(channel, topic, false)); player.sendMessage(formatChatMessage(channel, topic, false));
} }

View File

@ -0,0 +1,32 @@
package com.earth2me.essentials.update.chat;
import org.bukkit.entity.Player;
import org.jibble.pircbot.User;
public class ListCommand implements Command
{
@Override
public void run(final IrcBot ircBot, final Player player)
{
final User[] members = ircBot.getUsers();
final StringBuilder message = new StringBuilder();
for (User user : members)
{
if (message.length() > 0)
{
message.append("§f, ");
}
if (user.isOp() || user.hasVoice())
{
message.append("§6");
}
else
{
message.append("§7");
}
message.append(user.getPrefix()).append(user.getNick());
}
player.sendMessage(message.toString());
}
}

View File

@ -0,0 +1,77 @@
package com.earth2me.essentials.update.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.logging.Level;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public class StartupCommand extends AbstractFileCommand implements Command
{
private final transient Pattern patternStart = Pattern.compile("^[0-9 :-]+\\[INFO\\] Starting minecraft server version.*");
private final transient Pattern patternEnd = Pattern.compile("^[0-9 :-]+\\[INFO\\] Done \\([0-9.,]+s\\)! For help, type \"help\".*");
public StartupCommand(final Plugin plugin)
{
super(plugin);
}
@Override
public void run(final IrcBot ircBot, final Player player)
{
BufferedReader page = null;
try
{
page = getServerLogReader();
final StringBuilder input = new StringBuilder();
String line;
boolean log = false;
while ((line = page.readLine()) != null)
{
if (patternStart.matcher(line).matches())
{
if (input.length() > 0)
{
input.delete(0, input.length());
}
log = true;
}
if (log)
{
input.append(line).append("\n");
}
if (patternEnd.matcher(line).matches())
{
log = false;
}
}
page.close();
final String message = "Startup: " + uploadToPastie(input);
player.sendMessage("§6" + ircBot.getNick() + ": §7" + message);
ircBot.sendMessage(message);
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
player.sendMessage(ex.getMessage());
}
finally
{
try
{
if (page != null)
{
page.close();
}
}
catch (IOException ex)
{
Bukkit.getLogger().log(Level.SEVERE, null, ex);
player.sendMessage(ex.getMessage());
}
}
}
}

View File

@ -0,0 +1,124 @@
package com.earth2me.essentials.update.chat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
public final class UsernameUtil
{
private static final Pattern CB_PATTERN = Pattern.compile("git-Bukkit-([0-9]+).([0-9]+).([0-9]+)-[0-9]+-[0-9a-z]+-b([0-9]+)jnks.*");
private UsernameUtil()
{
}
public static String createUsername(final Player player)
{
final StringBuilder nameBuilder = new StringBuilder();
final Server server = Bukkit.getServer();
nameBuilder.append(player.getName());
addCraftBukkitVersion(server, nameBuilder);
addEssentialsVersion(server, nameBuilder);
addGroupManagerVersion(server, nameBuilder);
addPermissionsExVersion(server, nameBuilder);
addPermissionsBukkitVersion(server, nameBuilder);
addBPermissionsVersion(server, nameBuilder);
addPermissionsVersion(server, nameBuilder);
return nameBuilder.toString();
}
private static void addPermissionsVersion(final Server server, final StringBuilder nameBuilder)
{
final Plugin perm = server.getPluginManager().getPlugin("Permissions");
if (perm != null)
{
nameBuilder.append(" P");
if (!perm.isEnabled())
{
nameBuilder.append('!');
}
nameBuilder.append(perm.getDescription().getVersion());
}
}
private static void addBPermissionsVersion(final Server server, final StringBuilder nameBuilder)
{
final Plugin bperm = server.getPluginManager().getPlugin("bPermissions");
if (bperm != null)
{
nameBuilder.append(" BP");
if (!bperm.isEnabled())
{
nameBuilder.append('!');
}
nameBuilder.append(bperm.getDescription().getVersion());
}
}
private static void addPermissionsBukkitVersion(final Server server, final StringBuilder nameBuilder)
{
final Plugin permb = server.getPluginManager().getPlugin("PermissionsBukkit");
if (permb != null)
{
nameBuilder.append(" PB");
if (!permb.isEnabled())
{
nameBuilder.append('!');
}
nameBuilder.append(permb.getDescription().getVersion());
}
}
private static void addPermissionsExVersion(final Server server, final StringBuilder nameBuilder)
{
final Plugin pex = server.getPluginManager().getPlugin("PermissionsEx");
if (pex != null)
{
nameBuilder.append(" PEX");
if (!pex.isEnabled())
{
nameBuilder.append('!');
}
nameBuilder.append(pex.getDescription().getVersion());
}
}
private static void addGroupManagerVersion(final Server server, final StringBuilder nameBuilder)
{
final Plugin groupManager = server.getPluginManager().getPlugin("GroupManager");
if (groupManager != null)
{
nameBuilder.append(" GM");
if (!groupManager.isEnabled())
{
nameBuilder.append('!');
}
}
}
private static void addEssentialsVersion(final Server server, final StringBuilder nameBuilder)
{
final Plugin essentials = server.getPluginManager().getPlugin("Essentials");
if (essentials != null)
{
nameBuilder.append(" ESS");
nameBuilder.append(essentials.getDescription().getVersion());
}
}
private static void addCraftBukkitVersion(final Server server, final StringBuilder nameBuilder)
{
final Matcher versionMatch = CB_PATTERN.matcher(server.getVersion());
if (versionMatch.matches())
{
nameBuilder.append(" CB");
nameBuilder.append(versionMatch.group(4));
}
}
}

View File

@ -1,6 +1,6 @@
package com.earth2me.essentials.update.states; package com.earth2me.essentials.update.states;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -96,7 +96,7 @@ public abstract class AbstractState
/** /**
* Do something based on the answer, that the user gave. * Do something based on the answer, that the user gave.
*/ */
public void doWork(final WorkListener listener) public void doWork(final AbstractWorkListener listener)
{ {
listener.onWorkDone(); listener.onWorkDone();
} }

View File

@ -1,6 +1,6 @@
package com.earth2me.essentials.update.states; package com.earth2me.essentials.update.states;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import com.earth2me.essentials.update.tasks.InstallModule; import com.earth2me.essentials.update.tasks.InstallModule;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -35,7 +35,7 @@ public class EssentialsChat extends AbstractYesNoState
} }
@Override @Override
public void doWork(final WorkListener listener) public void doWork(final AbstractWorkListener listener)
{ {
if (getAnswer()) if (getAnswer())
{ {

View File

@ -1,6 +1,6 @@
package com.earth2me.essentials.update.states; package com.earth2me.essentials.update.states;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import com.earth2me.essentials.update.tasks.InstallModule; import com.earth2me.essentials.update.tasks.InstallModule;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -35,7 +35,7 @@ public class EssentialsGeoIP extends AbstractYesNoState
} }
@Override @Override
public void doWork(final WorkListener listener) public void doWork(final AbstractWorkListener listener)
{ {
if (getAnswer()) if (getAnswer())
{ {

View File

@ -1,6 +1,6 @@
package com.earth2me.essentials.update.states; package com.earth2me.essentials.update.states;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import com.earth2me.essentials.update.tasks.InstallModule; import com.earth2me.essentials.update.tasks.InstallModule;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -35,7 +35,7 @@ public class EssentialsProtect extends AbstractYesNoState
} }
@Override @Override
public void doWork(final WorkListener listener) public void doWork(final AbstractWorkListener listener)
{ {
if (getAnswer()) if (getAnswer())
{ {

View File

@ -1,6 +1,6 @@
package com.earth2me.essentials.update.states; package com.earth2me.essentials.update.states;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import com.earth2me.essentials.update.tasks.InstallModule; import com.earth2me.essentials.update.tasks.InstallModule;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -35,7 +35,7 @@ public class EssentialsSpawn extends AbstractYesNoState
} }
@Override @Override
public void doWork(final WorkListener listener) public void doWork(final AbstractWorkListener listener)
{ {
if (getAnswer()) if (getAnswer())
{ {

View File

@ -1,14 +1,14 @@
package com.earth2me.essentials.update.states; package com.earth2me.essentials.update.states;
import com.earth2me.essentials.update.UpdateCheck; import com.earth2me.essentials.update.UpdateCheck;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import java.util.Iterator; import java.util.Iterator;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public class StateMachine extends WorkListener implements Runnable public class StateMachine extends AbstractWorkListener implements Runnable
{ {
public enum MachineResult public enum MachineResult
{ {

View File

@ -3,7 +3,7 @@ package com.earth2me.essentials.update.tasks;
import com.earth2me.essentials.update.GetFile; import com.earth2me.essentials.update.GetFile;
import com.earth2me.essentials.update.ModuleInfo; import com.earth2me.essentials.update.ModuleInfo;
import com.earth2me.essentials.update.VersionInfo; import com.earth2me.essentials.update.VersionInfo;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import java.io.File; import java.io.File;
import java.net.URL; import java.net.URL;
import java.util.logging.Level; import java.util.logging.Level;
@ -12,16 +12,16 @@ import org.bukkit.Bukkit;
public class InstallModule implements Runnable, Task public class InstallModule implements Runnable, Task
{ {
protected final transient WorkListener listener; protected final transient AbstractWorkListener listener;
private final transient String moduleName; private final transient String moduleName;
private final transient String fileName; private final transient String fileName;
public InstallModule(final WorkListener listener, final String moduleName) public InstallModule(final AbstractWorkListener listener, final String moduleName)
{ {
this(listener, moduleName, moduleName + ".jar"); this(listener, moduleName, moduleName + ".jar");
} }
public InstallModule(final WorkListener listener, final String moduleName, final String fileName) public InstallModule(final AbstractWorkListener listener, final String moduleName, final String fileName)
{ {
this.listener = listener; this.listener = listener;
this.moduleName = moduleName; this.moduleName = moduleName;

View File

@ -1,14 +1,14 @@
package com.earth2me.essentials.update.tasks; package com.earth2me.essentials.update.tasks;
import com.earth2me.essentials.update.WorkListener; import com.earth2me.essentials.update.AbstractWorkListener;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
public class SelfUpdate extends WorkListener implements Task, Runnable public class SelfUpdate extends AbstractWorkListener implements Task, Runnable
{ {
private final transient WorkListener listener; private final transient AbstractWorkListener listener;
public SelfUpdate(final WorkListener listener) public SelfUpdate(final AbstractWorkListener listener)
{ {
super(listener.getPlugin(), listener.getNewVersionInfo()); super(listener.getPlugin(), listener.getNewVersionInfo());
this.listener = listener; this.listener = listener;

View File

@ -49,39 +49,39 @@ public class VersionTest extends TestCase
@Test @Test
public void testCompareTo() public void testCompareTo()
{ {
Version a = new Version("1.1.1"); final Version verA = new Version("1.1.1");
Version b = new Version("Dev1.1.2"); final Version verB = new Version("Dev1.1.2");
Version c = new Version("1.1.2"); final Version verC = new Version("1.1.2");
Version d = new Version("1.2.0"); final Version verD = new Version("1.2.0");
Version e = new Version("2.0.0"); final Version verE = new Version("2.0.0");
Version f = new Version("Pre1.1.1.1"); final Version verF = new Version("Pre1.1.1.1");
Version g = new Version("Dev1.2.2"); final Version verG = new Version("Dev1.2.2");
assertTrue("Testing dev", a.compareTo(b) < 0); assertTrue("Testing dev", verA.compareTo(verB) < 0);
assertTrue("Testing dev", b.compareTo(a) > 0); assertTrue("Testing dev", verB.compareTo(verA) > 0);
assertTrue("Testing build", a.compareTo(c) < 0); assertTrue("Testing build", verA.compareTo(verC) < 0);
assertTrue("Testing build", c.compareTo(a) > 0); assertTrue("Testing build", verC.compareTo(verA) > 0);
assertTrue("Testing minor", a.compareTo(d) < 0); assertTrue("Testing minor", verA.compareTo(verD) < 0);
assertTrue("Testing minor", d.compareTo(a) > 0); assertTrue("Testing minor", verD.compareTo(verA) > 0);
assertTrue("Testing major", a.compareTo(e) < 0); assertTrue("Testing major", verA.compareTo(verE) < 0);
assertTrue("Testing major", e.compareTo(a) > 0); assertTrue("Testing major", verE.compareTo(verA) > 0);
assertTrue("Testing pre", f.compareTo(a) < 0); assertTrue("Testing pre", verF.compareTo(verA) < 0);
assertTrue("Testing pre", a.compareTo(f) > 0); assertTrue("Testing pre", verA.compareTo(verF) > 0);
assertTrue("Testing dev vs dev", b.compareTo(g) < 0); assertTrue("Testing dev vs dev", verB.compareTo(verG) < 0);
assertTrue("Testing dev vs dev", g.compareTo(b) > 0); assertTrue("Testing dev vs dev", verG.compareTo(verB) > 0);
final TreeSet<Version> set = new TreeSet<Version>(); final TreeSet<Version> set = new TreeSet<Version>();
set.add(a); set.add(verA);
set.add(b); set.add(verB);
set.add(c); set.add(verC);
set.add(d); set.add(verD);
set.add(e); set.add(verE);
set.add(f); set.add(verF);
set.add(g); set.add(verG);
assertEquals("Testing sorting", f, set.pollFirst()); assertEquals("Testing sorting", verF, set.pollFirst());
assertEquals("Testing sorting", a, set.pollFirst()); assertEquals("Testing sorting", verA, set.pollFirst());
assertEquals("Testing sorting", c, set.pollFirst()); assertEquals("Testing sorting", verC, set.pollFirst());
assertEquals("Testing sorting", d, set.pollFirst()); assertEquals("Testing sorting", verD, set.pollFirst());
assertEquals("Testing sorting", e, set.pollFirst()); assertEquals("Testing sorting", verE, set.pollFirst());
assertEquals("Testing sorting", b, set.pollFirst()); assertEquals("Testing sorting", verB, set.pollFirst());
assertEquals("Testing sorting", g, set.pollFirst()); assertEquals("Testing sorting", verG, set.pollFirst());
} }
} }