diff --git a/app/src/main/java/xyz/vallat/louis/App.java b/app/src/main/java/xyz/vallat/louis/App.java index 45e77b1..522585e 100644 --- a/app/src/main/java/xyz/vallat/louis/App.java +++ b/app/src/main/java/xyz/vallat/louis/App.java @@ -4,6 +4,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import xyz.vallat.louis.managers.database.DBManager; import xyz.vallat.louis.managers.discord.DiscordManager; +import xyz.vallat.louis.timertasks.AutoReimport; + +import java.util.Calendar; +import java.util.Timer; +import java.util.concurrent.TimeUnit; public class App { @@ -18,6 +23,7 @@ public class App { DBManager.testConnection(); DBManager.initializeDatabase(); DiscordManager.login(); + setTimers(); Runtime.getRuntime().addShutdownHook(new Thread(() -> { logger.info("Received shut down signal. Bye!"); @@ -26,4 +32,15 @@ public class App { DiscordManager.onDisconnect(); } + + private static void setTimers() { + Calendar midday = Calendar.getInstance(); + midday.set(Calendar.HOUR_OF_DAY, 12); + midday.set(Calendar.MINUTE, 30); + midday.set(Calendar.SECOND, 0); + + Timer reimportCron = new Timer(); + reimportCron.schedule(new AutoReimport(), midday.getTime(), + TimeUnit.MILLISECONDS.convert(12, TimeUnit.HOURS)); + } } diff --git a/app/src/main/java/xyz/vallat/louis/managers/database/EventManager.java b/app/src/main/java/xyz/vallat/louis/managers/database/EventManager.java index a0fbfea..95d9b3a 100644 --- a/app/src/main/java/xyz/vallat/louis/managers/database/EventManager.java +++ b/app/src/main/java/xyz/vallat/louis/managers/database/EventManager.java @@ -8,8 +8,7 @@ import xyz.vallat.louis.managers.database.dao.Student; import java.sql.*; import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneOffset; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -20,16 +19,49 @@ public final class EventManager { private EventManager() { } + public static int reimportAllEvents() { + int importedEvents; + try (Connection connection = DBManager.getConnection()) { + connection.setAutoCommit(false); + flushEvents(connection); + Map> studentEvents = new HashMap<>(); + StudentManager.getStudentsFromDatabase() + .forEach(s -> studentEvents.put(s, CalendarManager.getEventsFromResource(s.getAde()))); + importedEvents = importEvents(studentEvents); + if (importedEvents == 0) { + logger.error("No events were re-imported. Rolling back."); + connection.rollback(); + } else { + try { + connection.commit(); + } catch (SQLException e) { + connection.rollback(); + } + } + } catch (SQLException e) { + logger.error("SQLError:", e); + return 0; + } + return importedEvents; + } + + private static void flushEvents(Connection connection) throws SQLException { + String sql = "TRUNCATE events RESTART IDENTITY;"; + try (Statement stmt = connection.createStatement()) { + stmt.executeUpdate(sql); + } + } + public static int importEvents(Map> events) { - int imported_events = 0; + int importedEvents = 0; try (Connection connection = DBManager.getConnection()) { connection.setAutoCommit(false); for (Map.Entry> e : events.entrySet()) { if (e.getValue().isEmpty()) continue; - e.getKey().setId(StudentManager + if (e.getKey().getId() == 0) e.getKey().setId(StudentManager .addStudent(e.getKey().getSnowflake(), e.getKey().getAde(), connection)); for (VEvent event : e.getValue()) - if (importEvent(e.getKey(), event, connection) != 0) imported_events++; + if (importEvent(e.getKey(), event, connection) != 0) importedEvents++; } try { connection.commit(); @@ -38,10 +70,10 @@ public final class EventManager { return 0; } } catch (SQLException e) { - logger.error("Couldn't import events.", e); + logger.error("SQLError while importing events.", e); return 0; } - return imported_events; + return importedEvents; } private static int importEvent(Student student, VEvent event, Connection connection) throws SQLException { diff --git a/app/src/main/java/xyz/vallat/louis/managers/database/StudentManager.java b/app/src/main/java/xyz/vallat/louis/managers/database/StudentManager.java index af9f012..5a94304 100644 --- a/app/src/main/java/xyz/vallat/louis/managers/database/StudentManager.java +++ b/app/src/main/java/xyz/vallat/louis/managers/database/StudentManager.java @@ -8,6 +8,8 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; public final class StudentManager { @@ -62,6 +64,25 @@ public final class StudentManager { return null; } + public static List getStudentsFromDatabase() { + List studentList = new ArrayList<>(); + try (Connection connection = DBManager.getConnection()) { + String sql = "SELECT id, snowflake, ade_resource FROM students;"; + try (Statement stmt = connection.createStatement()) { + stmt.execute(sql); + while (stmt.getResultSet().next()) { + studentList.add(new Student(stmt.getResultSet().getString("snowflake"), + stmt.getResultSet().getInt("ade_resource")) + .setId(stmt.getResultSet().getInt("id"))); + } + } + } catch (SQLException e) { + logger.error("SQLException while getting all students.", e); + return new ArrayList<>(); + } + return studentList; + } + public static boolean deleteFromSnowflake(String snowflake) { logger.debug("Deleting student {}.", snowflake); try (Connection connection = DBManager.getConnection()) { diff --git a/app/src/main/java/xyz/vallat/louis/timertasks/AutoReimport.java b/app/src/main/java/xyz/vallat/louis/timertasks/AutoReimport.java new file mode 100644 index 0000000..d66ad5f --- /dev/null +++ b/app/src/main/java/xyz/vallat/louis/timertasks/AutoReimport.java @@ -0,0 +1,18 @@ +package xyz.vallat.louis.timertasks; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.vallat.louis.managers.database.EventManager; + +import java.util.TimerTask; + +public class AutoReimport extends TimerTask { + + private static final Logger logger = LoggerFactory.getLogger(AutoReimport.class.getCanonicalName()); + + @Override + public void run() { + logger.info("Reimporting all events."); + logger.info("Done reimporting {} events.", EventManager.reimportAllEvents()); + } +}