Commit 0f38e630aa386b70a2425014fc7e8bcf48a1d8ad
1 parent
7d394baa
Added informalDate-functionality. Added basic DeleteReminder-functionality
Showing
6 changed files
with
157 additions
and
70 deletions
services/Common/src/main/java/de/bht/beuthbot/model/Intent.java
| ... | ... | @@ -7,7 +7,7 @@ public enum Intent { |
| 7 | 7 | |
| 8 | 8 | SHOW_FOOD("showFood"), HELLO("Hello"), GREET("greet"), BYE("Bye"), |
| 9 | 9 | GOODBYE("goodbye"), RESTAURANT_SEARCH("restaurant_search"), START("Start"), |
| 10 | - SHOW_PRICE("showPrice"), REMIND("remind"), CREATE_REMINDER("createReminder"), FALLBACK("Fallback"); | |
| 10 | + SHOW_PRICE("showPrice"), REMIND("remind"), CREATE_REMINDER("createReminder"), DELETE_REMINDER("deleteReminder"), FALLBACK("Fallback"); | |
| 11 | 11 | |
| 12 | 12 | private String text; |
| 13 | 13 | ... | ... |
services/Common/src/main/java/de/bht/beuthbot/utils/DateStringExtractor.java
services/MainBot/src/main/java/de/bht/beuthbot/canteen/model/CanteenData.java
services/MainBot/src/main/java/de/bht/beuthbot/scheduler/SchedulerBean.java
| 1 | 1 | package de.bht.beuthbot.scheduler; |
| 2 | 2 | |
| 3 | 3 | import de.bht.beuthbot.attachments.AttachmentStore; |
| 4 | +import de.bht.beuthbot.daos.AppUserDAO; | |
| 4 | 5 | import de.bht.beuthbot.jms.Target; |
| 5 | 6 | import de.bht.beuthbot.model.Attachment; |
| 6 | 7 | import de.bht.beuthbot.model.EntityName; |
| ... | ... | @@ -21,6 +22,10 @@ import de.bht.beuthbot.jms.TaskMessage; |
| 21 | 22 | import java.text.ParseException; |
| 22 | 23 | import java.text.SimpleDateFormat; |
| 23 | 24 | import java.time.LocalDate; |
| 25 | +import java.time.LocalDateTime; | |
| 26 | +import java.time.LocalTime; | |
| 27 | +import java.time.format.DateTimeFormatter; | |
| 28 | +import java.time.temporal.TemporalAccessor; | |
| 24 | 29 | import java.util.*; |
| 25 | 30 | import javax.annotation.PostConstruct; |
| 26 | 31 | import javax.annotation.Resource; |
| ... | ... | @@ -51,8 +56,14 @@ public class SchedulerBean { |
| 51 | 56 | @Resource(lookup = "java:global/global/ApplicationBean") |
| 52 | 57 | private Application application; |
| 53 | 58 | |
| 54 | - //list of reminders to be populated with data from the DB | |
| 55 | - private static ArrayList<Reminder> _reminders = new ArrayList<>(); | |
| 59 | + /** Injected AppUserDAO */ | |
| 60 | + @Resource(lookup = "java:global/global/AppUserDAOImpl") | |
| 61 | + private AppUserDAO userDAO; | |
| 62 | + | |
| 63 | + /** Injected ReminderDAO */ | |
| 64 | + @Resource(lookup = "java:global/global/ReminderDAOImpl") | |
| 65 | + private ReminderDAO reminderDAO; | |
| 66 | + | |
| 56 | 67 | |
| 57 | 68 | boolean isActive = true; |
| 58 | 69 | |
| ... | ... | @@ -73,16 +84,19 @@ public class SchedulerBean { |
| 73 | 84 | |
| 74 | 85 | if (!isActive) return; |
| 75 | 86 | |
| 76 | - SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy KK:mm"); | |
| 77 | - String dateNow = formatter.format(new Date()); | |
| 87 | + List<Reminder> reminders = reminderDAO.findAll(); | |
| 78 | 88 | |
| 79 | - for (Reminder reminder : _reminders) { | |
| 89 | + LocalDateTime dateNow = LocalDateTime.now(); | |
| 90 | + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd HH:mm"); | |
| 91 | + for (Reminder reminder : reminders) { | |
| 92 | + LocalDateTime reminderDate = reminder.getCycleDate(); | |
| 93 | + logger.debug("Date now: " + dateNow.format(formatter) + " reminder date: " + reminder.getCycleDate().format(formatter)); | |
| 80 | 94 | //Check if date time now equals reminder date time |
| 81 | - if(dateNow.equals(formatter.format(reminder.getCycleTime()))) { | |
| 95 | + if(dateNow.format(formatter).equals(reminderDate.format(formatter))) { | |
| 82 | 96 | Long messageID = 1L; |
| 83 | - AppUser user = reminder.getUser(); //TODO: Fill with correct value from DB | |
| 97 | + AppUser user = userDAO.findById(reminder.getUserId()); | |
| 84 | 98 | Long messengerId = Long.valueOf(user.getFacebookUserId() == null ? user.getTelegramUserId() : user.getFacebookUserId()); |
| 85 | - Messenger messenger = reminder.getMessenger(); //TODO: Fill with correct value from DB | |
| 99 | + Messenger messenger = reminder.getMessenger(); | |
| 86 | 100 | String text = ""; |
| 87 | 101 | String intent = reminder.getIntent(); |
| 88 | 102 | Map entities = reminder.getEntities(); |
| ... | ... | @@ -96,6 +110,14 @@ public class SchedulerBean { |
| 96 | 110 | } |
| 97 | 111 | } |
| 98 | 112 | |
| 113 | + //--------------------- | |
| 114 | + //CreateReminder function | |
| 115 | + //The way this function works is by extracting the date and time from the entities of a TaskMessage. | |
| 116 | + //First a LocalDate variable is instantiated, storing the desired reminder date. | |
| 117 | + //If the message contains a cycle entity, the cycle is set accordingly, otherwise it defaults to ONCE. | |
| 118 | + //Then a LocalTime variable is created in order to extract the time at which the user desires to be reminded. | |
| 119 | + //Should there be no time-entity present, a sensible value is chosen instead. | |
| 120 | + //--------------------- | |
| 99 | 121 | public Reminder createReminder(TaskMessage message, AppUser user) { |
| 100 | 122 | logger.debug("Creating reminder"); |
| 101 | 123 | |
| ... | ... | @@ -121,53 +143,77 @@ public class SchedulerBean { |
| 121 | 143 | break; |
| 122 | 144 | } |
| 123 | 145 | |
| 124 | - LocalDate cycleDate = DateStringExtractor.getLocalDateFromString(messageDay); | |
| 125 | - | |
| 126 | - Date cycleTime; | |
| 127 | - try { | |
| 128 | - //Read out time for Reminder | |
| 129 | - | |
| 130 | - String messageTime = message.getEntities().getOrDefault("time",""); | |
| 131 | - //time should not be empty | |
| 132 | - if(!messageTime.equals("")) { | |
| 133 | - //get Date new for day, month, year | |
| 134 | - String dateNow = new SimpleDateFormat("dd.MM.yyyy").format(new Date()); | |
| 135 | - //remove all chars from time String (e.g. "10 Uhr") | |
| 136 | - String reminderTime = messageTime.replaceAll("[^0-9:]", ""); | |
| 137 | - //trim spaces | |
| 138 | - reminderTime = reminderTime.trim(); | |
| 139 | - //check if given time is e.g. "11:15" | |
| 140 | - if(reminderTime.contains(":")) { | |
| 141 | - //split for hours and minutes | |
| 142 | - String[] splittedTime = reminderTime.split(":"); | |
| 143 | - //add hours and minutes to date | |
| 144 | - if(splittedTime.length > 1) | |
| 145 | - dateNow = dateNow + " " + splittedTime[0] + ":" + splittedTime[1]; | |
| 146 | - } else { | |
| 147 | - //add hours from time and set to "00" | |
| 148 | - dateNow = dateNow + " " + reminderTime + ":" + "00"; | |
| 149 | - } | |
| 146 | + LocalDate cycleDay = DateStringExtractor.getLocalDateFromString(messageDay); | |
| 147 | + | |
| 148 | + LocalTime cycleTime = LocalTime.now(); | |
| 150 | 149 | |
| 151 | - SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy hh:mm"); | |
| 152 | - Date d = f.parse(dateNow); | |
| 153 | - long milliseconds = d.getTime(); | |
| 154 | - cycleTime = new Date(milliseconds); | |
| 150 | + String messageTime = message.getEntities().getOrDefault("time",""); | |
| 155 | 151 | |
| 156 | - } else | |
| 157 | - cycleTime = new Date(); | |
| 152 | + if(!messageTime.equals("")) { | |
| 153 | + String dateNow = new SimpleDateFormat("dd.MM.yyyy").format(new Date()); | |
| 154 | + logger.debug("Date now: " + dateNow); | |
| 155 | + | |
| 156 | + String reminderTime = messageTime.replaceAll("[^0-9:]", ""); | |
| 157 | + //trim spaces | |
| 158 | + reminderTime = reminderTime.trim(); | |
| 159 | + //check if given time is e.g. "11:15" | |
| 160 | + if (reminderTime.contains(":")) { | |
| 161 | + //split for hours and minutes | |
| 162 | + String[] splittedTime = reminderTime.split(":"); | |
| 163 | + //add hours and minutes to date | |
| 164 | + if (splittedTime.length > 1) | |
| 165 | + dateNow = splittedTime[0] + ":" + splittedTime[1]; | |
| 166 | + } else { | |
| 167 | + //add hours from time and set to "00" | |
| 168 | + dateNow = reminderTime + ":" + "00"; | |
| 169 | + } | |
| 170 | + logger.debug("DateNow:" + dateNow); | |
| 171 | + cycleTime = LocalTime.parse(dateNow); | |
| 172 | + } else if((messageTime = message.getEntities().getOrDefault("informalTime", "")) != "") { | |
| 173 | + //the user might have given an informal time, such as "morning" or "evening" | |
| 174 | + switch(messageTime) { | |
| 175 | + case "MORNING": | |
| 176 | + cycleTime = LocalTime.of(9,0); | |
| 177 | + break; | |
| 178 | + case "NOON": | |
| 179 | + cycleTime = LocalTime.of(12,0); | |
| 180 | + break; | |
| 181 | + case "EVENING": | |
| 182 | + cycleTime = LocalTime.of(20,0); | |
| 183 | + break; | |
| 184 | + default: | |
| 185 | + cycleTime = LocalTime.of(9,0); | |
| 186 | + break; | |
| 187 | + } | |
| 188 | + } else { | |
| 189 | + //if no time entity is given, we will decide ourselves when it makes sense | |
| 190 | + if(cycleDay.isEqual(LocalDate.now())) { | |
| 191 | + //if the desired day is today, we'll remind the user in a few hours | |
| 192 | + //...unless that would make it tomorrow | |
| 193 | + if(cycleTime.plusHours(4).getHour() < cycleTime.getHour()) { | |
| 194 | + cycleTime = LocalTime.of(23,59); | |
| 195 | + } else { | |
| 196 | + cycleTime = LocalTime.of(cycleTime.plusHours(4).getHour(),0); | |
| 197 | + } | |
| 158 | 198 | |
| 159 | - } catch (Exception e) { | |
| 160 | - return null; | |
| 199 | + } else { | |
| 200 | + //if the desired day is sometime in the future, remind the user at 9 in the morning | |
| 201 | + cycleTime = LocalTime.of(9,0); | |
| 202 | + } | |
| 161 | 203 | } |
| 204 | + logger.debug("Resulting cycleTime: " + cycleTime.toString()); | |
| 205 | + LocalDateTime cycleDate = LocalDateTime.of(cycleDay, cycleTime); | |
| 206 | + | |
| 162 | 207 | //Figure out what we're reminding the user of |
| 163 | 208 | String intent = message.getEntities().getOrDefault("event","FALLBACK"); |
| 164 | 209 | |
| 210 | + | |
| 165 | 211 | Map<String, String> entities = new HashMap<>(); |
| 166 | 212 | switch(intent) { |
| 167 | 213 | case "showFood": |
| 168 | 214 | intent = Intent.SHOW_FOOD.getText(); |
| 169 | 215 | logger.debug("Intent is show food"); |
| 170 | - entities.put(EntityName.DATE.getText(), cycleDate.toString()); | |
| 216 | + entities.put(EntityName.DATE.getText(), cycleDate.toLocalDate().toString()); | |
| 171 | 217 | entities.put(EntityName.TIME.getText(), cycleTime.toString()); |
| 172 | 218 | logger.debug("Entities added: " + entities); |
| 173 | 219 | break; |
| ... | ... | @@ -179,13 +225,39 @@ public class SchedulerBean { |
| 179 | 225 | break; |
| 180 | 226 | } |
| 181 | 227 | |
| 182 | - logger.debug("Creating reminder with date " + cycleDate.toString() + " and time " + cycleTime.toString()); | |
| 183 | - Reminder reminder = new Reminder(user, cycle, cycleDate, cycleTime, messenger, intent, entities); | |
| 184 | - _reminders.add(reminder); | |
| 228 | + logger.debug("Creating reminder with date " + cycleDate.toString() + " and time " + cycleTime.minusHours(1).toString()); //For some reason the server time is off by an hour, so we need to subtract it from the cycleTime | |
| 185 | 229 | |
| 186 | - return reminder; | |
| 230 | + Reminder reminder = reminderDAO.createReminder(); | |
| 231 | + reminder.setUserId(user.getId()); | |
| 232 | + reminder.setReminderCycle(cycle); | |
| 233 | + reminder.setCycleTime(cycleDate); | |
| 234 | + reminder.setMessenger(messenger); | |
| 235 | + reminder.setIntent(intent); | |
| 236 | + reminder.setEntities(entities); | |
| 237 | + | |
| 238 | + return reminderDAO.saveOrUpdate(reminder); | |
| 187 | 239 | |
| 188 | 240 | //TODO: Insert the new Reminder into Database |
| 189 | 241 | } |
| 190 | 242 | |
| 243 | + public boolean deleteReminder(TaskMessage message, AppUser user) { | |
| 244 | + int deletedReminders = 0; | |
| 245 | + logger.debug("Delete reminders for user:" + user.getTelegramUserId()); | |
| 246 | + List<Reminder> reminders = reminderDAO.findAll(); | |
| 247 | + logger.debug("Number of reminders: " + reminders.size()); | |
| 248 | + for(Reminder reminder : reminders) { | |
| 249 | + logger.debug("Found reminder for this user:" + reminder.getUser().getTelegramUserId()); | |
| 250 | + if(reminder.getUser().getTelegramUserId().equals(user.getTelegramUserId()) || reminder.getUser().getFacebookUserId().equals(user.getFacebookUserId())) { | |
| 251 | + logger.debug("Found reminder of this user"); | |
| 252 | + reminders.remove(reminder); | |
| 253 | + deletedReminders++; | |
| 254 | + } | |
| 255 | + } | |
| 256 | + if(deletedReminders > 0) { | |
| 257 | + return true; | |
| 258 | + } else { | |
| 259 | + return false; | |
| 260 | + } | |
| 261 | + } | |
| 262 | + | |
| 191 | 263 | } | ... | ... |
services/MainBot/src/main/java/de/bht/beuthbot/scheduler/model/Reminder.java
| ... | ... | @@ -5,6 +5,7 @@ import de.bht.beuthbot.model.Messenger; |
| 5 | 5 | import de.bht.beuthbot.model.entities.AppUser; |
| 6 | 6 | |
| 7 | 7 | import java.time.LocalDate; |
| 8 | +import java.time.LocalDateTime; | |
| 8 | 9 | import java.util.Date; |
| 9 | 10 | import java.util.HashMap; |
| 10 | 11 | import java.util.Map; |
| ... | ... | @@ -15,9 +16,7 @@ public class Reminder { |
| 15 | 16 | //Reminder cycle |
| 16 | 17 | private ReminderCycle _reminderCycle; |
| 17 | 18 | //Date of Cycle |
| 18 | - private LocalDate _cycleDate; | |
| 19 | - //Time of cycle | |
| 20 | - private Date _cycleTime; | |
| 19 | + private LocalDateTime _cycleDate; | |
| 21 | 20 | //private |
| 22 | 21 | //Used Messenger |
| 23 | 22 | private Messenger _messenger; |
| ... | ... | @@ -26,11 +25,10 @@ public class Reminder { |
| 26 | 25 | //Entities |
| 27 | 26 | private final Map<String, String> _entities; |
| 28 | 27 | |
| 29 | - public Reminder(AppUser user, ReminderCycle reminderCycle, LocalDate cycleDate, Date cycleTime, Messenger messenger, String intent, Map<String, String> entities) { | |
| 28 | + public Reminder(AppUser user, ReminderCycle reminderCycle, LocalDateTime cycleDate, Messenger messenger, String intent, Map<String, String> entities) { | |
| 30 | 29 | _user = user; |
| 31 | 30 | _reminderCycle = reminderCycle; |
| 32 | 31 | _cycleDate = cycleDate; |
| 33 | - _cycleTime = cycleTime; | |
| 34 | 32 | _messenger = messenger; |
| 35 | 33 | _intent = intent; |
| 36 | 34 | _entities = entities; |
| ... | ... | @@ -68,17 +66,13 @@ public class Reminder { |
| 68 | 66 | _reminderCycle = reminderCycle; |
| 69 | 67 | } |
| 70 | 68 | |
| 71 | - public LocalDate getCycleDate() { | |
| 69 | + public LocalDateTime getCycleDate() { | |
| 72 | 70 | return _cycleDate; |
| 73 | 71 | } |
| 74 | 72 | |
| 75 | - public void setCycleDate(LocalDate cycleDate) { | |
| 73 | + public void setCycleDate(LocalDateTime cycleDate) { | |
| 76 | 74 | _cycleDate = cycleDate; |
| 77 | 75 | } |
| 78 | 76 | |
| 79 | - public Date getCycleTime() { return _cycleTime; } | |
| 80 | - | |
| 81 | - public void setCycleTime(Date cycleTime) { _cycleTime = cycleTime; } | |
| 82 | - | |
| 83 | 77 | public Map<String, String> getEntities() { return _entities; } |
| 84 | 78 | } | ... | ... |
services/MainBot/src/main/resources/de/bht/beuthbot/drools/Canteen.drl
| ... | ... | @@ -16,32 +16,33 @@ |
| 16 | 16 | |
| 17 | 17 | package de.bht.beuthbot.drools |
| 18 | 18 | |
| 19 | -import java.util.List | |
| 19 | +import java.util.List; | |
| 20 | 20 | import java.util.ArrayList; |
| 21 | 21 | import java.util.Arrays; |
| 22 | 22 | import java.util.HashMap; |
| 23 | 23 | |
| 24 | 24 | import java.time.LocalDate; |
| 25 | 25 | |
| 26 | -import de.bht.beuthbot.canteen.model.Dish | |
| 26 | +import de.bht.beuthbot.canteen.model.Dish; | |
| 27 | 27 | import de.bht.beuthbot.canteen.model.DishType; |
| 28 | 28 | import de.bht.beuthbot.canteen.model.CanteenData; |
| 29 | 29 | import de.bht.beuthbot.model.Intent; |
| 30 | 30 | import de.bht.beuthbot.model.EntityName; |
| 31 | 31 | import de.bht.beuthbot.drools.model.DroolsMessage; |
| 32 | 32 | |
| 33 | -import de.bht.beuthbot.scheduler.SchedulerBean | |
| 34 | -import de.bht.beuthbot.jms.TaskMessage | |
| 35 | -import de.bht.beuthbot.scheduler.model.ReminderCycle | |
| 36 | -import java.util.Date | |
| 37 | -import java.text.SimpleDateFormat | |
| 38 | -import java.text.ParseException | |
| 39 | -import de.bht.beuthbot.model.Messenger | |
| 33 | +import de.bht.beuthbot.scheduler.SchedulerBean; | |
| 34 | +import de.bht.beuthbot.jms.TaskMessage; | |
| 35 | +import de.bht.beuthbot.scheduler.model.ReminderCycle; | |
| 36 | +import java.util.Date; | |
| 37 | +import java.text.SimpleDateFormat; | |
| 38 | +import java.text.ParseException; | |
| 39 | +import de.bht.beuthbot.model.Messenger; | |
| 40 | 40 | import de.bht.beuthbot.scheduler.model.Reminder; |
| 41 | 41 | |
| 42 | 42 | import java.time.DayOfWeek; |
| 43 | -import java.time.LocalDate | |
| 43 | +import java.time.LocalDate; | |
| 44 | 44 | import de.bht.beuthbot.utils.DateStringExtractor; |
| 45 | +import java.time.format.DateTimeFormatter; | |
| 45 | 46 | |
| 46 | 47 | global de.bht.beuthbot.canteen.model.CanteenData canteenData; |
| 47 | 48 | global de.bht.beuthbot.model.entities.AppUser user; |
| ... | ... | @@ -139,7 +140,7 @@ rule "Create reminder" |
| 139 | 140 | Reminder reminder = s.createReminder(message, user); |
| 140 | 141 | String messageText = ""; |
| 141 | 142 | if(reminder.getIntent() == Intent.SHOW_FOOD.getText()) { |
| 142 | - messageText = "Ich werde dir " + DateStringExtractor.getGermanWeekDayFromLocalDate(reminder.getCycleDate(), true) + " um " + new SimpleDateFormat("KK:mm").format(reminder.getCycleTime()) + " Uhr den Mensaplan mitteilen!"; | |
| 143 | + messageText = "Ich werde dir " + DateStringExtractor.getGermanWeekDayFromLocalDate(reminder.getCycleDate().toLocalDate(), true) + " um " + reminder.getCycleDate().toLocalTime().format(DateTimeFormatter.ofPattern("HH:mm")) + " Uhr den Mensaplan mitteilen!"; | |
| 143 | 144 | } else { |
| 144 | 145 | messageText = "Es war mir leider nicht möglich eine Erinnerung für dich anzulegen. Versuche es bitte noch einmal."; |
| 145 | 146 | } //TODO: Add other intents |
| ... | ... | @@ -147,6 +148,24 @@ rule "Create reminder" |
| 147 | 148 | |
| 148 | 149 | end |
| 149 | 150 | |
| 151 | +rule "Delete reminder" | |
| 152 | + dialect "java" | |
| 153 | + when | |
| 154 | + m : DroolsMessage(getIntent().equals(Intent.DELETE_REMINDER.getText())) | |
| 155 | + then | |
| 156 | + SchedulerBean s = new SchedulerBean(); | |
| 157 | + TaskMessage message = new TaskMessage(m); | |
| 158 | + boolean didDelete = s.deleteReminder(message, user); | |
| 159 | + String messageText = ""; | |
| 160 | + if(didDelete) { | |
| 161 | + messageText = "Ich werde dir von nun an keine Erinnerungen mehr schicken!"; | |
| 162 | + } else { | |
| 163 | + messageText = "Ich tu doch gar nichts!"; | |
| 164 | + } | |
| 165 | + m.setText(messageText); | |
| 166 | + | |
| 167 | +end | |
| 168 | + | |
| 150 | 169 | |
| 151 | 170 | // --------------------------- Fallback ------------------------- |
| 152 | 171 | rule "Fallback" | ... | ... |