Fixes for XMPP: Prevent loops on errors

git-svn-id: https://svn.java.net/svn/essentials~svn/trunk@1577 e251c2fe-e539-e718-e476-b85c1f46cddb
This commit is contained in:
snowleo 2011-06-03 03:57:41 +00:00
parent 991a5cb24c
commit 5a47d18a9b

View file

@ -40,7 +40,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
private transient List<String> logUsers; private transient List<String> logUsers;
private transient Level logLevel; private transient Level logLevel;
private transient boolean ignoreLagMessages = true; private transient boolean ignoreLagMessages = true;
public XMPPManager(final JavaPlugin parent) public XMPPManager(final JavaPlugin parent)
{ {
super(); super();
@ -49,7 +49,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
config.setTemplateName("/config.yml", EssentialsXMPP.class); config.setTemplateName("/config.yml", EssentialsXMPP.class);
reloadConfig(); reloadConfig();
} }
public void sendMessage(final String address, final String message) public void sendMessage(final String address, final String message)
{ {
if (address != null && !address.isEmpty()) if (address != null && !address.isEmpty())
@ -65,17 +65,19 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
catch (XMPPException ex) catch (XMPPException ex)
{ {
disableChat(address, ex); disableChat(address);
} }
} }
} }
@Override @Override
public void processMessage(final Chat chat, final Message msg) public void processMessage(final Chat chat, final Message msg)
{ {
final String message = msg.getBody(); // Normally we should log the error message
if (message.length() > 0) // But we would create a loop if the connection to a log-user fails.
if (msg.getType() != Message.Type.error && msg.getBody().length() > 0)
{ {
final String message = msg.getBody();
switch (message.charAt(0)) switch (message.charAt(0))
{ {
case '@': case '@':
@ -89,7 +91,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
} }
} }
private void connect() private void connect()
{ {
final String server = config.getString("xmpp.server"); final String server = config.getString("xmpp.server");
@ -124,7 +126,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
LOGGER.log(Level.WARNING, "Failed to connect to server: " + server, ex); LOGGER.log(Level.WARNING, "Failed to connect to server: " + server, ex);
} }
} }
public final void disconnect() public final void disconnect()
{ {
if (connection != null) if (connection != null)
@ -132,7 +134,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
connection.disconnect(new Presence(Presence.Type.unavailable)); connection.disconnect(new Presence(Presence.Type.unavailable));
} }
} }
@Override @Override
public void chatCreated(final Chat chat, final boolean createdLocally) public void chatCreated(final Chat chat, final boolean createdLocally)
{ {
@ -146,7 +148,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
} }
} }
@Override @Override
public final void reloadConfig() public final void reloadConfig()
{ {
@ -174,7 +176,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
ignoreLagMessages = config.getBoolean("ignore-lag-messages", true); ignoreLagMessages = config.getBoolean("ignore-lag-messages", true);
} }
} }
@Override @Override
public void publish(final LogRecord logRecord) public void publish(final LogRecord logRecord)
{ {
@ -199,25 +201,23 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
catch (Exception e) catch (Exception e)
{ {
// Ignore all exception and just print them to the console // Ignore all exceptions
// Otherwise we create a loop. // Otherwise we create a loop.
System.out.println(e.getMessage());
e.printStackTrace();
} }
} }
@Override @Override
public void flush() public void flush()
{ {
// Ignore this // Ignore this
} }
@Override @Override
public void close() throws SecurityException public void close() throws SecurityException
{ {
// Ignore this // Ignore this
} }
private void startChat(final String address) throws XMPPException private void startChat(final String address) throws XMPPException
{ {
if (chatManager == null) if (chatManager == null)
@ -237,14 +237,14 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
} }
} }
private void sendPrivateMessage(final Chat chat, final String message) private void sendPrivateMessage(final Chat chat, final String message)
{ {
final String[] parts = message.split(" ", 2); final String[] parts = message.split(" ", 2);
if (parts.length == 2) if (parts.length == 2)
{ {
final List<Player> matches = parent.getServer().matchPlayer(parts[0].substring(1)); final List<Player> matches = parent.getServer().matchPlayer(parts[0].substring(1));
if (matches.isEmpty()) if (matches.isEmpty())
{ {
try try
@ -258,7 +258,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
else else
{ {
final String from = "[X:" + EssentialsXMPP.getInstance().getUserByAddress(StringUtils.parseBareAddress(chat.getParticipant())) + ">"; final String from = "[X:" + EssentialsXMPP.getInstance().getUserByAddress(StringUtils.parseBareAddress(chat.getParticipant())) + ">";
for (Player p : matches) for (Player p : matches)
{ {
p.sendMessage(from + p.getDisplayName() + "] " + message); p.sendMessage(from + p.getDisplayName() + "] " + message);
@ -266,7 +266,7 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
} }
} }
private void sendCommand(final Chat chat, final String message) private void sendCommand(final Chat chat, final String message)
{ {
if (config.getStringList("op-users", new ArrayList<String>()).contains(StringUtils.parseBareAddress(chat.getParticipant()))) if (config.getStringList("op-users", new ArrayList<String>()).contains(StringUtils.parseBareAddress(chat.getParticipant())))
@ -278,15 +278,14 @@ public class XMPPManager extends Handler implements MessageListener, ChatManager
} }
} }
} }
private void disableChat(final String address, final XMPPException exception) private void disableChat(final String address)
{ {
final Chat chat = chats.get(address); final Chat chat = chats.get(address);
if (chat != null) if (chat != null)
{ {
chat.removeMessageListener(this); chat.removeMessageListener(this);
chats.remove(address); chats.remove(address);
LOGGER.log(Level.WARNING, "Failed to send xmpp message.", exception);
} }
} }
} }