package core;
import java.util.List;
import de.skuzzle.polly.sdk.UserManager;
import de.skuzzle.polly.sdk.eventlistener.ChannelEvent;
import de.skuzzle.polly.sdk.eventlistener.IrcUser;
import de.skuzzle.polly.sdk.eventlistener.JoinPartAdapter;
import de.skuzzle.polly.sdk.eventlistener.MessageEvent;
import de.skuzzle.polly.sdk.eventlistener.MessageListener;
import de.skuzzle.polly.sdk.eventlistener.UserEvent;
import de.skuzzle.polly.sdk.eventlistener.UserListener;
import entities.RemindEntity;
public class DeliverRemindHandler extends JoinPartAdapter implements MessageListener,
UserListener {
private RemindManager remindManager;
private UserManager userManager;
public DeliverRemindHandler(RemindManager remindManager, UserManager userManager) {
this.remindManager = remindManager;
this.userManager = userManager;
}
@Override
public void channelJoined(ChannelEvent e) {
this.deliverRemind(e, true, false);
}
@Override
public void publicMessage(MessageEvent e) {
if (this.remindManager.isOnActionAvailable(e.getUser().getNickName())) {
this.deliverRemind(e, false, false);
}
}
@Override
public void privateMessage(MessageEvent e) {
if (this.remindManager.isOnActionAvailable(e.getUser().getNickName())) {
this.deliverRemind(e, false, false);
}
}
@Override
public void actionMessage(MessageEvent e) {
if (this.remindManager.isOnActionAvailable(e.getUser().getNickName())) {
this.deliverRemind(e, false, false);
}
}
private synchronized void deliverRemind(ChannelEvent e, boolean join, boolean signOn) {
if (join && signOn) {
throw new IllegalArgumentException("cant be join and signon!"); //$NON-NLS-1$
}
// if there are no new reminds, return
if (!this.remindManager.isStale(e.getUser().getNickName())) {
return;
}
List<RemindEntity> reminds = this.remindManager.getDatabaseWrapper()
.getUndeliveredReminds(e.getUser().getNickName());
for (RemindEntity remind : reminds) {
// mails are not delivered on irc events
if (remind.isMail()) {
continue;
}
/*
* If this is a signon, there is no valid channel set in the ChannelEvent,
* so we use the destination channel of the current remind.
*/
String channel = signOn ? remind.getOnChannel() : e.getChannel();
/*
* Two opportunities to deliver leave messages:
* 1. the message was left in a channel #c and the destined user joins this
* channel
* 2. the message was left to be delivered in query. Then it is delivered
* when the user joins any channel.
*/
boolean deliverLeave = (join || signOn) &&
(!channel.startsWith("#") || //$NON-NLS-1$
channel.equals(remind.getOnChannel()));
/*
* The remind only gets delivered if the destination user is signed on or
* if no user with the destination user name exists.
*/
deliverLeave &= this.userManager.isSignedOn(e.getUser()) ||
this.userManager.getUser(remind.getForUser()) == null;
if (remind.isOnAction() || deliverLeave) {
// remind.setNotDelivered(false); // enable if leave messages should
// not be 'sleepable'
try {
this.remindManager.deliverRemind(remind, false);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
@Override
public void userSignedOn(UserEvent e) {
ChannelEvent c = new ChannelEvent(null,
new IrcUser(e.getUser().getCurrentNickName(), "", ""), ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
this.deliverRemind(c, false, true);
}
@Override
public void userSignedOff(UserEvent ignore) {}
@Override
public void noticeMessage(MessageEvent ignore) {}
}