Timers are started now and all commands should work fine now
Signed-off-by: Louis Vallat <louis@louis-vallat.xyz>
This commit is contained in:
parent
187c46e1f2
commit
167fa6a0eb
@ -20,10 +20,12 @@ public class App {
|
|||||||
DBManager.initializeDatabase();
|
DBManager.initializeDatabase();
|
||||||
DiscordManager.login();
|
DiscordManager.login();
|
||||||
TimerManager.startAutoReimportTimer();
|
TimerManager.startAutoReimportTimer();
|
||||||
|
TimerManager.startAllTimersForStudents();
|
||||||
|
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||||
logger.info("Received shut down signal. Bye!");
|
logger.info("Received shut down signal. Bye!");
|
||||||
DiscordManager.logout();
|
DiscordManager.logout();
|
||||||
|
TimerManager.stopAllTimersForStudents();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
DiscordManager.onDisconnect();
|
DiscordManager.onDisconnect();
|
||||||
|
@ -15,10 +15,13 @@ public class Desinscription extends Command {
|
|||||||
public Mono<Void> execute(MessageCreateEvent event) {
|
public Mono<Void> execute(MessageCreateEvent event) {
|
||||||
return event.getMessage().getChannel().flatMap(channel -> {
|
return event.getMessage().getChannel().flatMap(channel -> {
|
||||||
if (event.getMessage().getAuthor().isEmpty() ||
|
if (event.getMessage().getAuthor().isEmpty() ||
|
||||||
!StudentManager.deleteFromSnowflake(event.getMessage().getAuthor().get().getId().asString()))
|
StudentManager.getStudentFromSnowflake(event.getMessage().getAuthor().get().getId().asString()) == null)
|
||||||
return channel.createMessage("On dirait que je ne t'ai pas dans ma base de données !");
|
return channel.createMessage("On dirait que je ne t'ai pas dans ma base de données !");
|
||||||
|
if (!StudentManager.deleteFromSnowflake(event.getMessage().getAuthor().get().getId().asString()))
|
||||||
|
return channel.createMessage("Une erreur est survenue pendant la suppression de ton " +
|
||||||
|
"identifiant dans ma base... Réessaie plus tard !");
|
||||||
TimerManager.cancelStudentTimer(event.getMessage().getAuthor().get().getId().asString());
|
TimerManager.cancelStudentTimer(event.getMessage().getAuthor().get().getId().asString());
|
||||||
return channel.createMessage("C'est bon, tu n'es plus dans ma base de données ! :thumbs_up:");
|
return channel.createMessage("C'est bon, tu n'es plus dans ma base de données !");
|
||||||
}).then().onErrorResume(t -> fatalError(event, t));
|
}).then().onErrorResume(t -> fatalError(event, t));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import xyz.vallat.louis.managers.calendar.CalendarManager;
|
|||||||
import xyz.vallat.louis.managers.database.EventManager;
|
import xyz.vallat.louis.managers.database.EventManager;
|
||||||
import xyz.vallat.louis.managers.database.StudentManager;
|
import xyz.vallat.louis.managers.database.StudentManager;
|
||||||
import xyz.vallat.louis.managers.database.dao.Student;
|
import xyz.vallat.louis.managers.database.dao.Student;
|
||||||
|
import xyz.vallat.louis.timer.TimerManager;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -33,18 +34,21 @@ public class Inscription extends Command {
|
|||||||
Student studentFromDatabase = StudentManager.getStudentFromDatabase(Integer.parseInt(args[1]));
|
Student studentFromDatabase = StudentManager.getStudentFromDatabase(Integer.parseInt(args[1]));
|
||||||
if (studentFromDatabase != null) return alreadyImported(event, studentFromDatabase);
|
if (studentFromDatabase != null) return alreadyImported(event, studentFromDatabase);
|
||||||
return event.getMessage().getChannel().flatMap(messageChannel -> {
|
return event.getMessage().getChannel().flatMap(messageChannel -> {
|
||||||
Snowflake snowflake = event.getMessage().getAuthor().isEmpty() ? null :
|
if (event.getMessage().getAuthor().isEmpty())
|
||||||
event.getMessage().getAuthor().get().getId();
|
return messageChannel.createMessage("Je ne peux pas t'importer, on dirait que tu n'existes pas!");
|
||||||
Student student = new Student(snowflake == null ? null : snowflake.asString(), Integer.parseInt(args[1]));
|
Snowflake snowflake = event.getMessage().getAuthor().get().getId();
|
||||||
|
Student student = new Student(snowflake.asString(), Integer.parseInt(args[1]));
|
||||||
List<VEvent> events = CalendarManager.getEventsFromResource(Integer.parseInt(args[1]));
|
List<VEvent> events = CalendarManager.getEventsFromResource(Integer.parseInt(args[1]));
|
||||||
Map<Student, List<VEvent>> studentListMap = new HashMap<>();
|
Map<Student, List<VEvent>> studentListMap = new HashMap<>();
|
||||||
studentListMap.put(student, events);
|
studentListMap.put(student, events);
|
||||||
int importedEvents = EventManager.importEvents(studentListMap);
|
int importedEvents = EventManager.importEvents(studentListMap);
|
||||||
if (importedEvents == 0) return messageChannel.createMessage(
|
if (importedEvents == 0) return messageChannel.createMessage(
|
||||||
"On dirait qu'il y a eu une erreur lors de l'importation. Es-tu sûr que c'est bien ton identifiant ADE ?");
|
"On dirait qu'il y a eu une erreur lors de l'importation. Es-tu sûr que c'est bien ton identifiant ADE ?");
|
||||||
else return messageChannel.createMessage("Hey, " +
|
else {
|
||||||
(student.getSnowflake() == null ? "" : "<@!" + student.getSnowflake() + ">, ")
|
TimerManager.startEvents(snowflake.asString(), EventManager.getNextEventsFromStudent(student));
|
||||||
+ "tout est bon pour moi ! Je surveille maintenant tes " + importedEvents + " prochains évènements !");
|
return messageChannel.createMessage("Hey <@!" + student.getSnowflake() + "> !"
|
||||||
|
+ " Tout est bon pour moi ! Je surveille maintenant tes " + importedEvents + " prochains évènements !");
|
||||||
|
}
|
||||||
}).then().onErrorResume(throwable -> fatalError(event, throwable));
|
}).then().onErrorResume(throwable -> fatalError(event, throwable));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ public final class CalendarManager {
|
|||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(CalendarManager.class.getCanonicalName());
|
private static final Logger logger = LoggerFactory.getLogger(CalendarManager.class.getCanonicalName());
|
||||||
public static final Calendar TZ_UTC = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
|
public static final Calendar TZ_UTC = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
|
||||||
public static final Calendar TZ = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
|
public static final Calendar TZ = Calendar.getInstance(TimeZone.getDefault());
|
||||||
|
|
||||||
private CalendarManager() {
|
private CalendarManager() {
|
||||||
}
|
}
|
||||||
|
@ -4,10 +4,13 @@ import biweekly.component.VEvent;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import xyz.vallat.louis.managers.calendar.CalendarManager;
|
import xyz.vallat.louis.managers.calendar.CalendarManager;
|
||||||
|
import xyz.vallat.louis.managers.database.dao.Event;
|
||||||
import xyz.vallat.louis.managers.database.dao.Student;
|
import xyz.vallat.louis.managers.database.dao.Student;
|
||||||
|
import xyz.vallat.louis.timer.TimerManager;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -21,6 +24,7 @@ public final class EventManager {
|
|||||||
|
|
||||||
public static int reimportAllEvents() {
|
public static int reimportAllEvents() {
|
||||||
int importedEvents;
|
int importedEvents;
|
||||||
|
TimerManager.stopAllTimersForStudents();
|
||||||
try (Connection connection = DBManager.getConnection()) {
|
try (Connection connection = DBManager.getConnection()) {
|
||||||
connection.setAutoCommit(false);
|
connection.setAutoCommit(false);
|
||||||
flushEvents(connection);
|
flushEvents(connection);
|
||||||
@ -32,6 +36,7 @@ public final class EventManager {
|
|||||||
logger.error("No events were re-imported. Rolling back.");
|
logger.error("No events were re-imported. Rolling back.");
|
||||||
connection.rollback();
|
connection.rollback();
|
||||||
} else {
|
} else {
|
||||||
|
logger.debug("'{}' events reimported, commiting.", importedEvents);
|
||||||
try {
|
try {
|
||||||
connection.commit();
|
connection.commit();
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
@ -39,9 +44,10 @@ public final class EventManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
logger.error("SQLError:", e);
|
logger.error("SQLError while reimporting all events:", e);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
TimerManager.startAllTimersForStudents();
|
||||||
return importedEvents;
|
return importedEvents;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,6 +82,38 @@ public final class EventManager {
|
|||||||
return importedEvents;
|
return importedEvents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Event> getNextEventsFromStudent(Student s) {
|
||||||
|
logger.debug("Getting events from student '{}'.", s.getSnowflake());
|
||||||
|
String sql = "SELECT id, summary, start_event, end_event" +
|
||||||
|
" FROM events WHERE students_id = ? AND start_event >= NOW();";
|
||||||
|
List<Event> events = new ArrayList<>();
|
||||||
|
try (Connection connection = DBManager.getConnection()) {
|
||||||
|
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
|
||||||
|
stmt.setInt(1, s.getId());
|
||||||
|
stmt.execute();
|
||||||
|
ResultSet rs = stmt.getResultSet();
|
||||||
|
while (rs.next())
|
||||||
|
events.add(new Event(rs.getString("summary"),
|
||||||
|
rs.getTimestamp("start_event", CalendarManager.TZ).toLocalDateTime(),
|
||||||
|
rs.getTimestamp("end_event", CalendarManager.TZ).toLocalDateTime())
|
||||||
|
.setId(rs.getInt("id")));
|
||||||
|
logger.debug("Student '{}' has {} events.", s.getSnowflake(), events.size());
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
logger.error("An SQLError happened:", e);
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<Student, List<Event>> getStudentEvents() {
|
||||||
|
logger.debug("Getting students events.");
|
||||||
|
Map<Student, List<Event>> studentsEvents = new HashMap<>();
|
||||||
|
for (Student s : StudentManager.getStudentsFromDatabase())
|
||||||
|
studentsEvents.put(s, getNextEventsFromStudent(s));
|
||||||
|
return studentsEvents;
|
||||||
|
}
|
||||||
|
|
||||||
private static int importEvent(Student student, VEvent event, Connection connection) throws SQLException {
|
private static int importEvent(Student student, VEvent event, Connection connection) throws SQLException {
|
||||||
String sql = "INSERT INTO events(students_id, summary, start_event, end_event) VALUES (?, ?, ?, ?);";
|
String sql = "INSERT INTO events(students_id, summary, start_event, end_event) VALUES (?, ?, ?, ?);";
|
||||||
try (PreparedStatement stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
try (PreparedStatement stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
||||||
|
@ -83,6 +83,25 @@ public final class StudentManager {
|
|||||||
return studentList;
|
return studentList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Student getStudentFromSnowflake(String snowflake) {
|
||||||
|
logger.debug("Getting student from snowflake '{}'.", snowflake);
|
||||||
|
try (Connection connection = DBManager.getConnection()) {
|
||||||
|
String sql = "SELECT id, snowflake, ade_resource FROM students WHERE snowflake = ?;";
|
||||||
|
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
|
||||||
|
stmt.setString(1, snowflake);
|
||||||
|
stmt.execute();
|
||||||
|
if (stmt.getResultSet().next()) {
|
||||||
|
return new Student(stmt.getResultSet().getString("snowflake"),
|
||||||
|
stmt.getResultSet().getInt("ade_resource"))
|
||||||
|
.setId(stmt.getResultSet().getInt("id"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
logger.error("An SQLError happened while getting a student:", e);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean deleteFromSnowflake(String snowflake) {
|
public static boolean deleteFromSnowflake(String snowflake) {
|
||||||
logger.debug("Deleting student {}.", snowflake);
|
logger.debug("Deleting student {}.", snowflake);
|
||||||
try (Connection connection = DBManager.getConnection()) {
|
try (Connection connection = DBManager.getConnection()) {
|
||||||
|
@ -0,0 +1,38 @@
|
|||||||
|
package xyz.vallat.louis.managers.database.dao;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
public class Event {
|
||||||
|
|
||||||
|
private final String summary;
|
||||||
|
private final LocalDateTime startEvent;
|
||||||
|
private final LocalDateTime endEvent;
|
||||||
|
private int id = 0;
|
||||||
|
|
||||||
|
public Event(String summary, LocalDateTime startEvent, LocalDateTime endEvent) {
|
||||||
|
this.summary = summary;
|
||||||
|
this.startEvent = startEvent;
|
||||||
|
this.endEvent = endEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Event setId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSummary() {
|
||||||
|
return summary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDateTime getStartEvent() {
|
||||||
|
return startEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LocalDateTime getEndEvent() {
|
||||||
|
return endEvent;
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +1,10 @@
|
|||||||
package xyz.vallat.louis.managers.database.dao;
|
package xyz.vallat.louis.managers.database.dao;
|
||||||
|
|
||||||
import discord4j.common.util.Snowflake;
|
|
||||||
|
|
||||||
public class Student {
|
public class Student {
|
||||||
|
|
||||||
private int id;
|
|
||||||
private final String snowflake;
|
private final String snowflake;
|
||||||
private final int ade;
|
private final int ade;
|
||||||
|
private int id;
|
||||||
|
|
||||||
public Student(String snowflake, int ade) {
|
public Student(String snowflake, int ade) {
|
||||||
this.snowflake = snowflake;
|
this.snowflake = snowflake;
|
||||||
|
@ -2,13 +2,21 @@ package xyz.vallat.louis.timer;
|
|||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import xyz.vallat.louis.managers.database.EventManager;
|
||||||
|
import xyz.vallat.louis.managers.database.dao.Event;
|
||||||
|
import xyz.vallat.louis.managers.database.dao.Student;
|
||||||
import xyz.vallat.louis.timer.tasks.AutoReimport;
|
import xyz.vallat.louis.timer.tasks.AutoReimport;
|
||||||
|
import xyz.vallat.louis.timer.tasks.MessagePresence;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public final class TimerManager {
|
public final class TimerManager {
|
||||||
|
|
||||||
|
private static final int[] months = {Calendar.JANUARY, Calendar.FEBRUARY, Calendar.MARCH, Calendar.APRIL,
|
||||||
|
Calendar.MAY, Calendar.JUNE, Calendar.JULY, Calendar.AUGUST, Calendar.SEPTEMBER, Calendar.OCTOBER,
|
||||||
|
Calendar.NOVEMBER, Calendar.DECEMBER};
|
||||||
private static final Logger logger = LoggerFactory.getLogger(TimerManager.class.getCanonicalName());
|
private static final Logger logger = LoggerFactory.getLogger(TimerManager.class.getCanonicalName());
|
||||||
private static final Map<String, List<Timer>> studentsTimers = new HashMap<>();
|
private static final Map<String, List<Timer>> studentsTimers = new HashMap<>();
|
||||||
|
|
||||||
@ -16,17 +24,12 @@ public final class TimerManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void cancelStudentTimer(String snowflake) {
|
public static void cancelStudentTimer(String snowflake) {
|
||||||
List<Timer> timers = studentsTimers.remove(snowflake);
|
logger.debug("Cancelling all events for student '{}'.", snowflake);
|
||||||
for (Timer t : timers) {
|
if (studentsTimers.containsKey(snowflake)) studentsTimers.remove(snowflake).forEach(Timer::cancel);
|
||||||
try {
|
|
||||||
t.cancel();
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.warn("Got exception while cancelling student's timer:", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void startAutoReimportTimer() {
|
public static void startAutoReimportTimer() {
|
||||||
|
logger.debug("Setting up auto reimport timer.");
|
||||||
Calendar midday = Calendar.getInstance();
|
Calendar midday = Calendar.getInstance();
|
||||||
midday.set(Calendar.HOUR, 12);
|
midday.set(Calendar.HOUR, 12);
|
||||||
midday.set(Calendar.MINUTE, 30);
|
midday.set(Calendar.MINUTE, 30);
|
||||||
@ -35,5 +38,46 @@ public final class TimerManager {
|
|||||||
Timer reimportCron = new Timer();
|
Timer reimportCron = new Timer();
|
||||||
reimportCron.schedule(new AutoReimport(), midday.getTime(),
|
reimportCron.schedule(new AutoReimport(), midday.getTime(),
|
||||||
TimeUnit.MILLISECONDS.convert(12, TimeUnit.HOURS));
|
TimeUnit.MILLISECONDS.convert(12, TimeUnit.HOURS));
|
||||||
|
String date = midday.getTime().toString();
|
||||||
|
logger.debug("Auto reimport timer set to run first on {}.", date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void stopAllTimersForStudents() {
|
||||||
|
logger.debug("Stopping all timers for all students.");
|
||||||
|
for (Map.Entry<String, List<Timer>> entry : studentsTimers.entrySet()) {
|
||||||
|
logger.debug("Stopping all {} timers for student '{}'.", entry.getValue().size(), entry.getKey());
|
||||||
|
for (Timer t : entry.getValue()) t.cancel();
|
||||||
|
}
|
||||||
|
logger.debug("Done stopping all timers.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int startEvents(String studentSnowflake, List<Event> events) {
|
||||||
|
int eventsStarted = 0;
|
||||||
|
for (Event e : events) {
|
||||||
|
LocalDateTime startTime = e.getStartEvent();
|
||||||
|
Calendar cal = Calendar.getInstance();
|
||||||
|
cal.set(startTime.getYear(), months[startTime.getMonthValue() - 1],
|
||||||
|
startTime.getDayOfMonth(), startTime.getHour(), startTime.getMinute());
|
||||||
|
cal.add(Calendar.MINUTE, 5);
|
||||||
|
Timer t = new Timer();
|
||||||
|
t.schedule(new MessagePresence(e.getSummary(), studentSnowflake), cal.getTime());
|
||||||
|
List<Timer> eventList = studentsTimers.getOrDefault(studentSnowflake, new ArrayList<>());
|
||||||
|
eventList.add(t);
|
||||||
|
studentsTimers.put(studentSnowflake, eventList);
|
||||||
|
eventsStarted++;
|
||||||
|
logger.debug("Starting event '{}' for student '{}' on {}.", e.getSummary(), studentSnowflake, startTime);
|
||||||
|
}
|
||||||
|
return eventsStarted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void startAllTimersForStudents() {
|
||||||
|
studentsTimers.clear();
|
||||||
|
logger.debug("Starting all timers for students.");
|
||||||
|
int timerStarted = 0;
|
||||||
|
for (Map.Entry<Student, List<Event>> entry : EventManager.getStudentEvents().entrySet()) {
|
||||||
|
logger.debug("Starting events for student '{}'.", entry.getKey().getSnowflake());
|
||||||
|
timerStarted += startEvents(entry.getKey().getSnowflake(), entry.getValue());
|
||||||
|
}
|
||||||
|
logger.debug("All {} timers have been started.", timerStarted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user