Commit 0f38e630aa386b70a2425014fc7e8bcf48a1d8ad

Authored by mfcb
1 parent 7d394baa

Added informalDate-functionality. Added basic DeleteReminder-functionality

services/Common/src/main/java/de/bht/beuthbot/model/Intent.java
@@ -7,7 +7,7 @@ public enum Intent { @@ -7,7 +7,7 @@ public enum Intent {
7 7
8 SHOW_FOOD("showFood"), HELLO("Hello"), GREET("greet"), BYE("Bye"), 8 SHOW_FOOD("showFood"), HELLO("Hello"), GREET("greet"), BYE("Bye"),
9 GOODBYE("goodbye"), RESTAURANT_SEARCH("restaurant_search"), START("Start"), 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 private String text; 12 private String text;
13 13
services/Common/src/main/java/de/bht/beuthbot/utils/DateStringExtractor.java
@@ -3,6 +3,7 @@ package de.bht.beuthbot.utils; @@ -3,6 +3,7 @@ package de.bht.beuthbot.utils;
3 import javax.ejb.Local; 3 import javax.ejb.Local;
4 import java.time.DayOfWeek; 4 import java.time.DayOfWeek;
5 import java.time.LocalDate; 5 import java.time.LocalDate;
  6 +import java.time.LocalDateTime;
6 import java.time.format.TextStyle; 7 import java.time.format.TextStyle;
7 import java.util.Locale; 8 import java.util.Locale;
8 9
services/MainBot/src/main/java/de/bht/beuthbot/canteen/model/CanteenData.java
@@ -5,6 +5,7 @@ import org.slf4j.Logger; @@ -5,6 +5,7 @@ import org.slf4j.Logger;
5 import org.slf4j.LoggerFactory; 5 import org.slf4j.LoggerFactory;
6 6
7 import java.time.LocalDate; 7 import java.time.LocalDate;
  8 +import java.time.LocalDateTime;
8 import java.util.List; 9 import java.util.List;
9 import java.util.stream.Collectors; 10 import java.util.stream.Collectors;
10 11
services/MainBot/src/main/java/de/bht/beuthbot/scheduler/SchedulerBean.java
1 package de.bht.beuthbot.scheduler; 1 package de.bht.beuthbot.scheduler;
2 2
3 import de.bht.beuthbot.attachments.AttachmentStore; 3 import de.bht.beuthbot.attachments.AttachmentStore;
  4 +import de.bht.beuthbot.daos.AppUserDAO;
4 import de.bht.beuthbot.jms.Target; 5 import de.bht.beuthbot.jms.Target;
5 import de.bht.beuthbot.model.Attachment; 6 import de.bht.beuthbot.model.Attachment;
6 import de.bht.beuthbot.model.EntityName; 7 import de.bht.beuthbot.model.EntityName;
@@ -21,6 +22,10 @@ import de.bht.beuthbot.jms.TaskMessage; @@ -21,6 +22,10 @@ import de.bht.beuthbot.jms.TaskMessage;
21 import java.text.ParseException; 22 import java.text.ParseException;
22 import java.text.SimpleDateFormat; 23 import java.text.SimpleDateFormat;
23 import java.time.LocalDate; 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 import java.util.*; 29 import java.util.*;
25 import javax.annotation.PostConstruct; 30 import javax.annotation.PostConstruct;
26 import javax.annotation.Resource; 31 import javax.annotation.Resource;
@@ -51,8 +56,14 @@ public class SchedulerBean { @@ -51,8 +56,14 @@ public class SchedulerBean {
51 @Resource(lookup = "java:global/global/ApplicationBean") 56 @Resource(lookup = "java:global/global/ApplicationBean")
52 private Application application; 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 boolean isActive = true; 68 boolean isActive = true;
58 69
@@ -73,16 +84,19 @@ public class SchedulerBean { @@ -73,16 +84,19 @@ public class SchedulerBean {
73 84
74 if (!isActive) return; 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 //Check if date time now equals reminder date time 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 Long messageID = 1L; 96 Long messageID = 1L;
83 - AppUser user = reminder.getUser(); //TODO: Fill with correct value from DB 97 + AppUser user = userDAO.findById(reminder.getUserId());
84 Long messengerId = Long.valueOf(user.getFacebookUserId() == null ? user.getTelegramUserId() : user.getFacebookUserId()); 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 String text = ""; 100 String text = "";
87 String intent = reminder.getIntent(); 101 String intent = reminder.getIntent();
88 Map entities = reminder.getEntities(); 102 Map entities = reminder.getEntities();
@@ -96,6 +110,14 @@ public class SchedulerBean { @@ -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 public Reminder createReminder(TaskMessage message, AppUser user) { 121 public Reminder createReminder(TaskMessage message, AppUser user) {
100 logger.debug("Creating reminder"); 122 logger.debug("Creating reminder");
101 123
@@ -121,53 +143,77 @@ public class SchedulerBean { @@ -121,53 +143,77 @@ public class SchedulerBean {
121 break; 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 //Figure out what we're reminding the user of 207 //Figure out what we're reminding the user of
163 String intent = message.getEntities().getOrDefault("event","FALLBACK"); 208 String intent = message.getEntities().getOrDefault("event","FALLBACK");
164 209
  210 +
165 Map<String, String> entities = new HashMap<>(); 211 Map<String, String> entities = new HashMap<>();
166 switch(intent) { 212 switch(intent) {
167 case "showFood": 213 case "showFood":
168 intent = Intent.SHOW_FOOD.getText(); 214 intent = Intent.SHOW_FOOD.getText();
169 logger.debug("Intent is show food"); 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 entities.put(EntityName.TIME.getText(), cycleTime.toString()); 217 entities.put(EntityName.TIME.getText(), cycleTime.toString());
172 logger.debug("Entities added: " + entities); 218 logger.debug("Entities added: " + entities);
173 break; 219 break;
@@ -179,13 +225,39 @@ public class SchedulerBean { @@ -179,13 +225,39 @@ public class SchedulerBean {
179 break; 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 //TODO: Insert the new Reminder into Database 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,6 +5,7 @@ import de.bht.beuthbot.model.Messenger;
5 import de.bht.beuthbot.model.entities.AppUser; 5 import de.bht.beuthbot.model.entities.AppUser;
6 6
7 import java.time.LocalDate; 7 import java.time.LocalDate;
  8 +import java.time.LocalDateTime;
8 import java.util.Date; 9 import java.util.Date;
9 import java.util.HashMap; 10 import java.util.HashMap;
10 import java.util.Map; 11 import java.util.Map;
@@ -15,9 +16,7 @@ public class Reminder { @@ -15,9 +16,7 @@ public class Reminder {
15 //Reminder cycle 16 //Reminder cycle
16 private ReminderCycle _reminderCycle; 17 private ReminderCycle _reminderCycle;
17 //Date of Cycle 18 //Date of Cycle
18 - private LocalDate _cycleDate;  
19 - //Time of cycle  
20 - private Date _cycleTime; 19 + private LocalDateTime _cycleDate;
21 //private 20 //private
22 //Used Messenger 21 //Used Messenger
23 private Messenger _messenger; 22 private Messenger _messenger;
@@ -26,11 +25,10 @@ public class Reminder { @@ -26,11 +25,10 @@ public class Reminder {
26 //Entities 25 //Entities
27 private final Map<String, String> _entities; 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 _user = user; 29 _user = user;
31 _reminderCycle = reminderCycle; 30 _reminderCycle = reminderCycle;
32 _cycleDate = cycleDate; 31 _cycleDate = cycleDate;
33 - _cycleTime = cycleTime;  
34 _messenger = messenger; 32 _messenger = messenger;
35 _intent = intent; 33 _intent = intent;
36 _entities = entities; 34 _entities = entities;
@@ -68,17 +66,13 @@ public class Reminder { @@ -68,17 +66,13 @@ public class Reminder {
68 _reminderCycle = reminderCycle; 66 _reminderCycle = reminderCycle;
69 } 67 }
70 68
71 - public LocalDate getCycleDate() { 69 + public LocalDateTime getCycleDate() {
72 return _cycleDate; 70 return _cycleDate;
73 } 71 }
74 72
75 - public void setCycleDate(LocalDate cycleDate) { 73 + public void setCycleDate(LocalDateTime cycleDate) {
76 _cycleDate = cycleDate; 74 _cycleDate = cycleDate;
77 } 75 }
78 76
79 - public Date getCycleTime() { return _cycleTime; }  
80 -  
81 - public void setCycleTime(Date cycleTime) { _cycleTime = cycleTime; }  
82 -  
83 public Map<String, String> getEntities() { return _entities; } 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,32 +16,33 @@
16 16
17 package de.bht.beuthbot.drools 17 package de.bht.beuthbot.drools
18 18
19 -import java.util.List 19 +import java.util.List;
20 import java.util.ArrayList; 20 import java.util.ArrayList;
21 import java.util.Arrays; 21 import java.util.Arrays;
22 import java.util.HashMap; 22 import java.util.HashMap;
23 23
24 import java.time.LocalDate; 24 import java.time.LocalDate;
25 25
26 -import de.bht.beuthbot.canteen.model.Dish 26 +import de.bht.beuthbot.canteen.model.Dish;
27 import de.bht.beuthbot.canteen.model.DishType; 27 import de.bht.beuthbot.canteen.model.DishType;
28 import de.bht.beuthbot.canteen.model.CanteenData; 28 import de.bht.beuthbot.canteen.model.CanteenData;
29 import de.bht.beuthbot.model.Intent; 29 import de.bht.beuthbot.model.Intent;
30 import de.bht.beuthbot.model.EntityName; 30 import de.bht.beuthbot.model.EntityName;
31 import de.bht.beuthbot.drools.model.DroolsMessage; 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 import de.bht.beuthbot.scheduler.model.Reminder; 40 import de.bht.beuthbot.scheduler.model.Reminder;
41 41
42 import java.time.DayOfWeek; 42 import java.time.DayOfWeek;
43 -import java.time.LocalDate 43 +import java.time.LocalDate;
44 import de.bht.beuthbot.utils.DateStringExtractor; 44 import de.bht.beuthbot.utils.DateStringExtractor;
  45 +import java.time.format.DateTimeFormatter;
45 46
46 global de.bht.beuthbot.canteen.model.CanteenData canteenData; 47 global de.bht.beuthbot.canteen.model.CanteenData canteenData;
47 global de.bht.beuthbot.model.entities.AppUser user; 48 global de.bht.beuthbot.model.entities.AppUser user;
@@ -139,7 +140,7 @@ rule &quot;Create reminder&quot; @@ -139,7 +140,7 @@ rule &quot;Create reminder&quot;
139 Reminder reminder = s.createReminder(message, user); 140 Reminder reminder = s.createReminder(message, user);
140 String messageText = ""; 141 String messageText = "";
141 if(reminder.getIntent() == Intent.SHOW_FOOD.getText()) { 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 } else { 144 } else {
144 messageText = "Es war mir leider nicht möglich eine Erinnerung für dich anzulegen. Versuche es bitte noch einmal."; 145 messageText = "Es war mir leider nicht möglich eine Erinnerung für dich anzulegen. Versuche es bitte noch einmal.";
145 } //TODO: Add other intents 146 } //TODO: Add other intents
@@ -147,6 +148,24 @@ rule &quot;Create reminder&quot; @@ -147,6 +148,24 @@ rule &quot;Create reminder&quot;
147 148
148 end 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 // --------------------------- Fallback ------------------------- 170 // --------------------------- Fallback -------------------------
152 rule "Fallback" 171 rule "Fallback"