package polly.reminds; import http.AllRemindsTableModel; import http.MyRemindTableModel; import http.RemindHttpController; import http.RemindTableFilter; import java.util.Set; import java.util.TreeSet; import org.apache.log4j.Logger; import commands.DeleteRemindCommand; import commands.LeaveCommand; import commands.MailRemindCommand; import commands.ModRemindCommand; import commands.MyRemindsCommand; import commands.OnReturnCommand; import commands.RemindCommand; import commands.SnoozeCommand; import commands.ToggleMailCommand; import core.DeliverRemindHandler; import core.RemindManager; import core.RemindManagerImpl; import core.RemindTraceNickchangeHandler; import de.skuzzle.polly.http.api.Controller; import de.skuzzle.polly.sdk.MyPolly; import de.skuzzle.polly.sdk.PollyPlugin; import de.skuzzle.polly.sdk.Types; import de.skuzzle.polly.sdk.Types.StringType; import de.skuzzle.polly.sdk.Types.TimespanType; import de.skuzzle.polly.sdk.User; import de.skuzzle.polly.sdk.UserManager; import de.skuzzle.polly.sdk.constraints.Constraints; import de.skuzzle.polly.sdk.exceptions.DatabaseException; import de.skuzzle.polly.sdk.exceptions.DisposingException; import de.skuzzle.polly.sdk.exceptions.DuplicatedSignatureException; import de.skuzzle.polly.sdk.exceptions.IncompatiblePluginException; import de.skuzzle.polly.sdk.exceptions.RoleException; import de.skuzzle.polly.sdk.httpv2.MenuCategory; import de.skuzzle.polly.sdk.httpv2.html.HTMLColumnFilter; import de.skuzzle.polly.sdk.httpv2.html.HTMLTable; import de.skuzzle.polly.sdk.httpv2.html.HTMLTableModel; import de.skuzzle.polly.sdk.roles.RoleManager; import de.skuzzle.polly.sdk.time.Milliseconds; import entities.RemindEntity; /** * * @author Simon * @version 27.07.2011 e1a9f7c */ public class MyPlugin extends PollyPlugin { public final static String REMIND_ROLE = "polly.roles.REMIND"; //$NON-NLS-1$ public final static String DELETE_REMIND_PERMISSION = "polly.permission.DELETE_REMIND"; //$NON-NLS-1$ public final static String LEAVE_PERMISSION = "polly.permission.LEAVE"; //$NON-NLS-1$ public final static String MAIL_REMIND_PERMISSION = "polly.permission.MAIL_REMIND"; //$NON-NLS-1$ public final static String MODIFY_REMIND_PERMISSION = "polly.permission.MODIFY_REMIND"; //$NON-NLS-1$ public final static String MODIFY_OTHER_REMIND_PERMISSION = "polly.permission.MODIFY_OTHER_REMIND"; //$NON-NLS-1$ public final static String MY_REMINDS_PERMISSION = "polly.permission.MY_REMINDS"; //$NON-NLS-1$ public final static String ON_RETURN_PERMISSION = "polly.permission.ON_RETURN"; //$NON-NLS-1$ public final static String REMIND_PERMISSION = "polly.permission.REMIND"; //$NON-NLS-1$ public final static String SNOOZE_PERMISSION = "polly.permission.SNOOZE"; //$NON-NLS-1$ public final static String TOGGLE_MAIL_PERMISSION = "polly.permission.TOGGLE_MAIL"; //$NON-NLS-1$ public final static String REMIND_FORMAT_NAME = "REMIND_FORMAT"; //$NON-NLS-1$ public final static StringType REMIND_FORMAT_VALUE = new Types.StringType( MSG.remindFormatValue); public final static String MESSAGE_FORMAT_NAME = "MESSAGE_FORMAT"; //$NON-NLS-1$ public final static Types MESSAGE_FORMAT_VALUE = new Types.StringType( MSG.remindFormatValue); public final static String SNOOZE_TIME = "SNOOZE_TIME"; //$NON-NLS-1$ public final static TimespanType SNOOZE_DEFAULT_VALUE = new Types.TimespanType( Milliseconds.fromMinutes(10) / 1000); public final static String USE_SNOOZE_TIME = "USE_SNOOZE_TIME"; //$NON-NLS-1$ public final static Types USE_SNOOZE_TIME_VALUE = new Types.BooleanType(false); public final static String DEFAULT_REMIND_TIME = "DEFAULT_REMIND_TIME"; //$NON-NLS-1$ public final static TimespanType DEFAULT_REMIND_TIME_VALUE = new Types.TimespanType( Milliseconds.fromMinutes(10) / 1000); public final static String DEFAULT_MSG = "REMIND_DEFAULT_MSG"; //$NON-NLS-1$ public final static Types DEFAULT_MSG_VALUE = new Types.StringType("Reminder!"); //$NON-NLS-1$ public final static String EMAIL = "EMAIL"; //$NON-NLS-1$ public final static Types DEFAULT_EMAIL = new Types.StringType("none"); //$NON-NLS-1$ public final static String LEAVE_AS_MAIL = "LEAVE_AS_MAIL"; //$NON-NLS-1$ public final static Types DEFAULT_LEAVE_AS_MAIL = new Types.BooleanType(false); public final static String REMIND_TRACK_NICKCHANGE = "REMIND_TRACK_NICKCHANGE"; //$NON-NLS-1$ public final static Types DEFAULT_REMIND_TRACK_NICKCHANGE = new Types.BooleanType(false); public final static String REMIND_DOUBLE_DELIVERY = "REMIND_DOUBLE_DELIVERY"; //$NON-NLS-1$ public final static Types DEFAULT_REMIND_DOUBLE_DELIVERY = new Types.BooleanType(false); public final static String AUTO_SNOOZE = "AUTO_SNOOZE"; //$NON-NLS-1$ public final static Types AUTO_SNOOZE_VALUE = new Types.BooleanType(false); public final static String AUTO_SNOOZE_INDICATOR = "AUTO_SNOOZE_INDICATOR"; //$NON-NLS-1$ public final static Types AUTO_SNOOZE_INDICATOR_VALUE = new Types.StringType("k"); //$NON-NLS-1$ public final static String REMIND_IDLE_TIME = "REMIND_IDLE_TIME"; //$NON-NLS-1$ private Logger logger; private RemindManager remindManager; private RemindTraceNickchangeHandler remindNickChangeTracer; private DeliverRemindHandler deliverRemindHandler; public MyPlugin(MyPolly myPolly) throws IncompatiblePluginException, DuplicatedSignatureException { super(myPolly); this.logger = Logger.getLogger(myPolly.getLoggerName(this.getClass())); myPolly.persistence().registerEntity(RemindEntity.class); this.remindManager = new RemindManagerImpl(myPolly); this.deliverRemindHandler = new DeliverRemindHandler(this.remindManager, myPolly.users()); this.remindNickChangeTracer = new RemindTraceNickchangeHandler( this.remindManager); this.addDisposable(this.remindManager); this.addCommand(new LeaveCommand(myPolly, this.remindManager)); this.addCommand(new OnReturnCommand(myPolly, this.remindManager)); this.addCommand(new RemindCommand(myPolly, this.remindManager)); this.addCommand(new MyRemindsCommand(myPolly, this.remindManager)); this.addCommand(new DeleteRemindCommand(myPolly, this.remindManager)); this.addCommand(new SnoozeCommand(myPolly, this.remindManager)); this.addCommand(new ModRemindCommand(myPolly, this.remindManager)); this.addCommand(new MailRemindCommand(myPolly, this.remindManager)); this.addCommand(new ToggleMailCommand(myPolly, this.remindManager)); myPolly.webInterface().addCategory(new MenuCategory(1, MSG.remindCategory)); final Controller ctrl = new RemindHttpController(myPolly, this.remindManager); this.getMyPolly().webInterface().getServer().addController(ctrl); // set up remind tables final HTMLColumnFilter filter = new RemindTableFilter(myPolly); final HTMLTableModel<RemindEntity> myRemindsModel = new MyRemindTableModel(this.remindManager); final HTMLTableModel<RemindEntity> allRemindsModel = new AllRemindsTableModel(this.remindManager); final HTMLTable<RemindEntity> myRemindsTable = new HTMLTable<>("myReminds", myRemindsModel, myPolly); //$NON-NLS-1$ final HTMLTable<RemindEntity> allRemindsTable = new HTMLTable<>("allReminds", allRemindsModel, myPolly); //$NON-NLS-1$ myRemindsTable.setFilter(filter); allRemindsTable.setFilter(filter); this.getMyPolly().webInterface().getServer().addHttpEventHandler("/api/myReminds", myRemindsTable); //$NON-NLS-1$ this.getMyPolly().webInterface().getServer().addHttpEventHandler("/api/allReminds", allRemindsTable); //$NON-NLS-1$ } @Override public void actualDispose() throws DisposingException { this.getMyPolly().irc().removeNickChangeListener(this.remindNickChangeTracer); this.getMyPolly().irc().removeJoinPartListener(this.deliverRemindHandler); this.getMyPolly().irc().removeMessageListener(this.deliverRemindHandler); this.getMyPolly().users().removeUserListener(this.deliverRemindHandler); super.actualDispose(); } private void assignListeners() { this.getMyPolly().irc().addNickChangeListener(this.remindNickChangeTracer); this.getMyPolly().irc().addJoinPartListener(this.deliverRemindHandler); this.getMyPolly().irc().addMessageListener(this.deliverRemindHandler); this.getMyPolly().users().addUserListener(this.deliverRemindHandler); } @Override public Set<String> getContainedPermissions() { Set<String> result = new TreeSet<String>(super.getContainedPermissions()); result.add(MODIFY_OTHER_REMIND_PERMISSION); return result; } @Override public void assignPermissions(RoleManager roleManager) throws RoleException, DatabaseException { super.assignPermissions(roleManager); roleManager.assignPermission(RoleManager.ADMIN_ROLE, MODIFY_OTHER_REMIND_PERMISSION); roleManager.createRole(REMIND_ROLE); roleManager.assignPermission(REMIND_ROLE, DELETE_REMIND_PERMISSION); roleManager.assignPermission(REMIND_ROLE, LEAVE_PERMISSION); roleManager.assignPermission(REMIND_ROLE, MAIL_REMIND_PERMISSION); roleManager.assignPermission(REMIND_ROLE, MODIFY_REMIND_PERMISSION); roleManager.assignPermission(REMIND_ROLE, MY_REMINDS_PERMISSION); roleManager.assignPermission(REMIND_ROLE, ON_RETURN_PERMISSION); roleManager.assignPermission(REMIND_ROLE, REMIND_PERMISSION); roleManager.assignPermission(REMIND_ROLE, SNOOZE_PERMISSION); roleManager.assignPermission(REMIND_ROLE, TOGGLE_MAIL_PERMISSION); } @Override public void onLoad() { logger.info("Scheduling all reminds..."); //$NON-NLS-1$ this.remindManager.rescheduleAll(); try { UserManager users = this.getMyPolly().users(); final String category = MSG.remindCategory; users.addAttribute(REMIND_FORMAT_NAME, REMIND_FORMAT_VALUE, MSG.remindFormatDesc, category); users.addAttribute(MESSAGE_FORMAT_NAME, MESSAGE_FORMAT_VALUE, MSG.remindFormatDesc, category); users.addAttribute(SNOOZE_TIME, SNOOZE_DEFAULT_VALUE, MSG.remindSnoozeDesc, category, Constraints.TIMESPAN); users.addAttribute(DEFAULT_MSG, DEFAULT_MSG_VALUE, MSG.remindDefaultMsgDesc, category); users.addAttribute(EMAIL, DEFAULT_EMAIL, MSG.remindEmailDesc, category, Constraints.MAILADDRESS); users.addAttribute(LEAVE_AS_MAIL, DEFAULT_LEAVE_AS_MAIL, MSG.remindLeaveAsMailDesc, category, Constraints.BOOLEAN); users.addAttribute(REMIND_IDLE_TIME, new TimespanType(User.IDLE_AFTER / 1000), MSG.remindIdleTimeDesc, category, Constraints.TIMESPAN); users.addAttribute(REMIND_TRACK_NICKCHANGE, DEFAULT_REMIND_TRACK_NICKCHANGE, MSG.remindTrackNickchangeDesc, category, Constraints.BOOLEAN); users.addAttribute(REMIND_DOUBLE_DELIVERY, DEFAULT_REMIND_DOUBLE_DELIVERY, MSG.remindDoubleDeliveryDesc, category, Constraints.BOOLEAN); users.addAttribute(DEFAULT_REMIND_TIME, DEFAULT_REMIND_TIME_VALUE, MSG.remindDefaultRemindTimeDesc, category, Constraints.TIMESPAN); users.addAttribute(AUTO_SNOOZE, AUTO_SNOOZE_VALUE, MSG.remindAutoSnoozeDesc, category, Constraints.BOOLEAN); users.addAttribute(AUTO_SNOOZE_INDICATOR, AUTO_SNOOZE_INDICATOR_VALUE, MSG.remindAutoSnoozeIndiDesc, category); users.addAttribute(USE_SNOOZE_TIME, USE_SNOOZE_TIME_VALUE, MSG.remindUseSnoozeTimeDesc, category, Constraints.BOOLEAN); } catch (DatabaseException e) { e.printStackTrace(); } this.assignListeners(); } }