package de.skuzzle.polly.core.eventhandler;
import java.util.concurrent.ExecutorService;
import org.apache.log4j.Logger;
import de.skuzzle.polly.core.internal.users.UserImpl;
import de.skuzzle.polly.core.internal.users.UserManagerImpl;
import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversalException;
import de.skuzzle.polly.sdk.CommandManager;
import de.skuzzle.polly.sdk.eventlistener.IrcUser;
import de.skuzzle.polly.sdk.eventlistener.MessageEvent;
import de.skuzzle.polly.sdk.eventlistener.MessageListener;
import de.skuzzle.polly.sdk.exceptions.CommandException;
import de.skuzzle.polly.sdk.exceptions.InsufficientRightsException;
import de.skuzzle.polly.sdk.exceptions.UnknownCommandException;
import de.skuzzle.polly.sdk.exceptions.UnknownSignatureException;
public class MessageHandler implements MessageListener {
private final static int OFF = 0;
private final static int SIMPLE = 1;
private static Logger logger = Logger.getLogger(MessageHandler.class.getName());
private CommandManager commands;
private UserManagerImpl userManager;
private ExecutorService executorThreadPool;
private int parseErrorDetails;
private boolean reportUnknownCommand;
public MessageHandler(CommandManager commandManager, UserManagerImpl userManager,
ExecutorService executorThreadPool, int parseErrorDetails,
boolean reportUnknownCommand) {
this.commands = commandManager;
this.userManager = userManager;
this.executorThreadPool = executorThreadPool;
this.parseErrorDetails = parseErrorDetails;
this.reportUnknownCommand = reportUnknownCommand;
}
@Override
public void publicMessage(MessageEvent e) {
this.execute(e, false);
}
@Override
public void privateMessage(MessageEvent e) {
this.execute(e, true);
}
@Override
public void actionMessage(MessageEvent e) {
this.getUser(e.getUser()).setLastMessageTime(System.currentTimeMillis());
}
private void execute(final MessageEvent e, final boolean isQuery) {
final de.skuzzle.polly.core.internal.users.UserImpl executor = this.getUser(e.getUser());
executor.setLastMessageTime(System.currentTimeMillis());
Runnable command = new Runnable() {
@Override
public void run() {
try {
MessageHandler.this.commands.executeString(e.getMessage(), e
.getChannel(), isQuery, executor, e.getSource());
} catch(CommandException e1) {
if (e1.getCause() instanceof ASTTraversalException) {
ASTTraversalException e2 = (ASTTraversalException) e1.getCause();
MessageHandler.this.reportParseError(e, e2);
} else {
e.getSource().sendMessage(e.getChannel(),
MSG.bind(MSG.cmdExecError, e1.getMessage()), this);
}
logger.debug("", e1); //$NON-NLS-1$
} catch (UnknownCommandException e1) {
if (reportUnknownCommand) {
e.getSource().sendMessage(e.getChannel(),
MSG.bind(MSG.cmdUnknown, e.getMessage()), this);
}
} catch (UnknownSignatureException e1) {
e.getSource().sendMessage(e.getChannel(),
MSG.bind(MSG.cmdUnknownSignature, e1.getSignature().toString()),
this);
} catch (InsufficientRightsException e1) {
e.getSource().sendMessage(e.getChannel(),
MSG.bind(MSG.cmdInsufficientRights, e1.getObject(),
e1.getObject().getRequiredPermission()), this);
} catch (Exception e1) {
logger.error("Exception while executing command: " + //$NON-NLS-1$
e1.getMessage(), e1);
e.getSource().sendMessage(e.getChannel(), MSG.cmdInternalError, this);
}
}
};
this.executorThreadPool.execute(command);
}
private void reportParseError(MessageEvent e, ASTTraversalException ex) {
int detail = this.parseErrorDetails;
if (detail == OFF) {
return;
}
if (detail > OFF) {
e.getSource().sendMessage(e.getChannel(), ex.getMessage());
}
if (detail > SIMPLE) {
String msg = ex.getPosition().mark(e.getMessage());
e.getSource().sendMessage(e.getChannel(), msg);
}
}
private de.skuzzle.polly.core.internal.users.UserImpl getUser(IrcUser user) {
UserImpl u = (UserImpl) this.userManager.getUser(user);
if (u == null) {
u = (UserImpl) this.userManager.createUser("~UNKNOWN", "blabla"); //$NON-NLS-1$//$NON-NLS-2$
u.setCurrentNickName(user.getNickName());
}
return u;
}
@Override
public void noticeMessage(MessageEvent e) {
this.getUser(e.getUser()).setLastMessageTime(System.currentTimeMillis());
}
}