package de.jeyp91.googlecalendar; import com.google.api.client.util.DateTime; import com.google.api.services.calendar.Calendar; import com.google.api.services.calendar.model.Event; import com.google.api.services.calendar.model.EventDateTime; import com.google.api.services.calendar.model.EventReminder; import com.google.api.services.calendar.model.Events; import de.jeyp91.tippliga.TLWLeague; import de.jeyp91.tippliga.TLWMatchday; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.io.IOException; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static de.jeyp91.googlecalendar.GoogleCalendarConnector.getSerivce; public class TippligaGoogleEventManager { private static List allEvents = null; private static final Logger logger = LogManager.getLogger(TippligaGoogleEventManager.class); public static List getAllEvents(Integer season) { if(allEvents == null) { allEvents = getAllEventsStartingFromDateTime(new DateTime(season-1 + "-07-01T00:00:00Z")); } return allEvents; } public static List getAllEventsStartingFromDateTime(DateTime dateTime) { Calendar service = getSerivce(); Events events = null; String calendarUrl = CalendarConfigProvider.getCalendarUrl(); // Build a new authorized API client service. try { events = service.events().list(calendarUrl) .setMaxResults(500) .setTimeMin(dateTime) .setOrderBy("startTime") .setSingleEvents(true) .execute(); } catch (IOException e) { e.printStackTrace(); } assert events != null; return events.getItems(); } public static Event findEvent(List allEvents, Integer season, Integer league, Integer matchday, Integer deliveryDateNumber) { String description = getDescription(season, league, matchday, deliveryDateNumber); String descriptionHtml = getDescriptionHTML(season, league, matchday, deliveryDateNumber); for (Event event : allEvents) { String eventDescription = event.getDescription(); if ( (eventDescription.replaceAll("\\s+","").equals(description.replaceAll("\\s+",""))) || eventDescription.equals(descriptionHtml) ) { return event; } } return null; } public static void createOrUpdateEventsForMatchday(TLWMatchday matchday) { createOrUpdateEvent(matchday, matchday.getDeliveryDate(), 1); if(!matchday.getDeliveryDate2().equals("")) createOrUpdateEvent(matchday, matchday.getDeliveryDate2(), 2); if(!matchday.getDeliveryDate3().equals("")) createOrUpdateEvent(matchday, matchday.getDeliveryDate3(), 3); } public static void createOrUpdateEvent(TLWMatchday matchday, String deliveryDateString, Integer deliverDateNumber) { List allEvents = getAllEvents(matchday.getSeason()); Event event = findEvent(allEvents, matchday.getSeason(), matchday.getLeague(), matchday.getMatchday(), deliverDateNumber); if(event == null) { createNewEvent(matchday, deliveryDateString, deliverDateNumber); } else { String googleEventStart = event.getStart().getDateTime().toString(); String googleEventStartBeautified = googleEventStart.substring(0, 19).replace("T", " "); if(!googleEventStartBeautified.equals(deliveryDateString)) { updateEvent(event, matchday, deliveryDateString, deliverDateNumber); } } } private static void createNewEvent(TLWMatchday matchday, String deliveryDateString, Integer deliverDateNumber) { String calendarUrl = CalendarConfigProvider.getCalendarUrl(); Event event = getEvent(matchday, deliveryDateString, deliverDateNumber); try { logger.info("Create new google calendar event for " + matchday.getSeason() + ", " + matchday.getLeague() + ", " + matchday.getMatchday() + ", " + deliverDateNumber); getSerivce().events().insert(calendarUrl, event).execute(); } catch (IOException e) { e.printStackTrace(); } } public static void updateEvent(Event oldEvent, TLWMatchday matchday, String deliveryDateString, Integer deliverDateNumber) { String calendarUrl = CalendarConfigProvider.getCalendarUrl(); Event event = getEvent(matchday, deliveryDateString, deliverDateNumber); try { logger.info("Update google calendar event for " + matchday.getSeason() + ", " + matchday.getLeague() + ", " + matchday.getMatchday() + ", " + deliverDateNumber); Calendar.Events events = getSerivce().events(); events.update(calendarUrl, oldEvent.getId(), event).execute(); } catch (IOException e) { e.printStackTrace(); } } public static void deleteEvent(TLWMatchday matchday, Integer deliverDateNumber) { String calendarUrl = CalendarConfigProvider.getCalendarUrl(); Event event = findEvent(getAllEvents(matchday.getSeason()), matchday.getSeason(), matchday.getLeague(), matchday.getMatchday(), deliverDateNumber); if(event != null) { try { logger.info("Delete google calendar event for " + matchday.getSeason() + ", " + matchday.getLeague() + ", " + matchday.getMatchday() + ", " + deliverDateNumber); getSerivce().events().delete(calendarUrl, event.getId()).execute(); } catch (IOException e) { e.printStackTrace(); } } } public static void deleteAllEvents(int season) throws IOException { String calendarUrl = CalendarConfigProvider.getCalendarUrl(); List events = getAllEvents(season); for(Event event : events ) { getSerivce().events().delete(calendarUrl, event.getId()).execute(); } } private static Event getEvent(TLWMatchday matchday, String deliveryDateString, Integer deliverDateNumber) { String matchdayName = matchday.getMatchdayName().equals("") ? matchday.getMatchday().toString() + ". Spieltag" : matchday.getMatchdayName(); String summary = TLWLeague.getLeagueNameCalendar(matchday.getLeague()) + " " + matchdayName + " tippen!"; if(deliverDateNumber > 1) summary += " " + deliverDateNumber + ". Chance \uD83D\uDE43"; String description = getDescription(matchday.getSeason(), matchday.getLeague(), matchday.getMatchday(), deliverDateNumber); String location = "https://tippliga-wuerzburg.de/app.php/football/bet"; LocalDateTime deliveryLocalDateTime = LocalDateTime.parse(deliveryDateString.replace(" ", "T")); ZonedDateTime zdtBerlin = ZonedDateTime.of(deliveryLocalDateTime, ZoneId.of("Europe/Berlin")); DateTime deliveryDateTime = new DateTime(zdtBerlin.toInstant().toEpochMilli()); EventDateTime date = new EventDateTime() .setDateTime(deliveryDateTime) .setTimeZone("Europe/Berlin"); // Set reminder to 12 hours before Event.Reminders reminders = new Event.Reminders(); reminders.setUseDefault(true); return new Event() .setSummary(summary) .setLocation(location) .setDescription(description) .setStart(date) .setEnd(date) .setReminders(reminders); } private static String getDescription(Integer season, Integer league, Integer matchday, Integer deliverDateNumber) { league = league == 2 ? 1 : league; return "Saison: " + season + "\n" + "Liga: " + league + "\n" + "Spieltag: " + matchday + "\n" + "Abgabeschluss: " + deliverDateNumber; } private static String getDescriptionHTML(Integer season, Integer league, Integer matchday, Integer deliverDateNumber) { league = league == 2 ? 1 : league; return "Saison: " + season + "
" + "Liga: " + league + "
" + "Spieltag: " + matchday + "
" + "Abgabeschluss: " + deliverDateNumber; } public static void updateAllMatchdays(ArrayList matchdays) { matchdays.forEach(tlwMatchday -> { createOrUpdateEvent(tlwMatchday, tlwMatchday.getDeliveryDate(), 1); if(tlwMatchday.getDeliveryDate2().equals("")) { deleteEvent(tlwMatchday, 2); } else { createOrUpdateEvent(tlwMatchday, tlwMatchday.getDeliveryDate2(), 2); } if(tlwMatchday.getDeliveryDate3().equals("")) { deleteEvent(tlwMatchday, 3); } else { createOrUpdateEvent(tlwMatchday, tlwMatchday.getDeliveryDate3(), 3); } }); } }