From 323d79239aab57b81bc7f3431ee63da3c94f2b61 Mon Sep 17 00:00:00 2001 From: NovaFox161 Date: Tue, 3 Jan 2017 10:32:45 -0600 Subject: [PATCH] Add Google Calendar APIs and support. --- .gitignore | 2 +- pom.xml | 10 ++ src/main/java/com/cloudcraftgaming/Main.java | 11 ++ .../eventlisteners/ReadyEventListener.java | 19 +++ .../internal/calendar/CalendarAuth.java | 131 ++++++++++++++++++ .../internal/data/BotData.java | 10 ++ 6 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/cloudcraftgaming/eventlisteners/ReadyEventListener.java create mode 100644 src/main/java/com/cloudcraftgaming/internal/calendar/CalendarAuth.java create mode 100644 src/main/java/com/cloudcraftgaming/internal/data/BotData.java diff --git a/.gitignore b/.gitignore index ca881569..d9255106 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ .idea/dataSources.local.xml .idea/sqlDataSources.xml .idea/dynamic.xml -.idea/uiDesigner.xml # Gradle: .idea/gradle.xml @@ -59,3 +58,4 @@ hs_err_pid* /.idea/ /src/test/ /DisCal.iml +/src/main/resources/client_secret.json diff --git a/pom.xml b/pom.xml index 0ea472e6..2a1cff63 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,16 @@ google-api-client 1.22.0 + + com.google.apis + google-api-services-calendar + v3-rev225-1.22.0 + + + com.google.oauth-client + google-oauth-client-jetty + 1.22.0 + mysql diff --git a/src/main/java/com/cloudcraftgaming/Main.java b/src/main/java/com/cloudcraftgaming/Main.java index 11ac51f8..3ea95ff9 100644 --- a/src/main/java/com/cloudcraftgaming/Main.java +++ b/src/main/java/com/cloudcraftgaming/Main.java @@ -3,6 +3,8 @@ package com.cloudcraftgaming; import com.cloudcraftgaming.database.DatabaseInfo; import com.cloudcraftgaming.database.MySQL; import com.cloudcraftgaming.eventlisteners.MessageListener; +import com.cloudcraftgaming.eventlisteners.ReadyEventListener; +import com.cloudcraftgaming.internal.calendar.CalendarAuth; import com.cloudcraftgaming.internal.consolecommand.ConsoleCommandExecutor; import com.cloudcraftgaming.internal.file.ReadFile; import sx.blah.discord.api.ClientBuilder; @@ -10,6 +12,7 @@ import sx.blah.discord.api.IDiscordClient; import sx.blah.discord.api.events.EventDispatcher; import sx.blah.discord.util.DiscordException; +import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; @@ -35,8 +38,16 @@ public class Main { MySQL mySQL = ReadFile.readDatabaseSettings(args[1]); connectToMySQL(mySQL); + //Connect to Google Calendar + try { + CalendarAuth.init(args); + } catch (IOException e) { + e.printStackTrace(); + } + //Register events EventDispatcher dispatcher = client.getDispatcher(); + dispatcher.registerListener(new ReadyEventListener()); dispatcher.registerListener(new MessageListener()); //Accept commands diff --git a/src/main/java/com/cloudcraftgaming/eventlisteners/ReadyEventListener.java b/src/main/java/com/cloudcraftgaming/eventlisteners/ReadyEventListener.java new file mode 100644 index 00000000..da8a8030 --- /dev/null +++ b/src/main/java/com/cloudcraftgaming/eventlisteners/ReadyEventListener.java @@ -0,0 +1,19 @@ +package com.cloudcraftgaming.eventlisteners; + +import com.cloudcraftgaming.Main; +import sx.blah.discord.api.events.EventSubscriber; +import sx.blah.discord.handle.impl.events.ReadyEvent; +import sx.blah.discord.handle.obj.Status; + +/** + * Created by Nova Fox on 1/2/2017. + * Website: www.cloudcraftgaming.com + * For Project: DisCal + */ +public class ReadyEventListener { + + @EventSubscriber + public void onReadyEvent(ReadyEvent event) { + Main.client.changeStatus(Status.game("Google Calendar")); + } +} \ No newline at end of file diff --git a/src/main/java/com/cloudcraftgaming/internal/calendar/CalendarAuth.java b/src/main/java/com/cloudcraftgaming/internal/calendar/CalendarAuth.java new file mode 100644 index 00000000..5c5d250a --- /dev/null +++ b/src/main/java/com/cloudcraftgaming/internal/calendar/CalendarAuth.java @@ -0,0 +1,131 @@ +package com.cloudcraftgaming.internal.calendar; + +import com.google.api.client.auth.oauth2.Credential; +import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp; +import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver; +import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; +import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.http.HttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.client.json.JsonFactory; +import com.google.api.client.util.store.FileDataStoreFactory; +import com.google.api.client.util.DateTime; + +import com.google.api.services.calendar.CalendarScopes; +import com.google.api.services.calendar.model.*; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.List; + +public class CalendarAuth { + /** Application name. */ + private static final String APPLICATION_NAME = + "DisCal"; + + /** Directory to store user credentials for this application. */ + private static final java.io.File DATA_STORE_DIR = new java.io.File( + System.getProperty("user.home"), ".credentials/calendar-java-quickstart"); + + /** Global instance of the {@link FileDataStoreFactory}. */ + private static FileDataStoreFactory DATA_STORE_FACTORY; + + /** Global instance of the JSON factory. */ + private static final JsonFactory JSON_FACTORY = + JacksonFactory.getDefaultInstance(); + + /** Global instance of the HTTP transport. */ + private static HttpTransport HTTP_TRANSPORT; + + /** Global instance of the scopes required by this quickstart. + * + * If modifying these scopes, delete your previously saved credentials + * at ~/.credentials/calendar-java-quickstart + */ + private static final List SCOPES = + Arrays.asList(CalendarScopes.CALENDAR_READONLY); + + static { + try { + HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); + DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(1); + } + } + + /** + * Creates an authorized Credential object. + * @return an authorized Credential object. + * @throws IOException + */ + public static Credential authorize() throws IOException { + // Load client secrets. + InputStream in = + CalendarAuth.class.getResourceAsStream("/client_secret.json"); + GoogleClientSecrets clientSecrets = + GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in)); + + // Build flow and trigger user authorization request. + GoogleAuthorizationCodeFlow flow = + new GoogleAuthorizationCodeFlow.Builder( + HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES) + .setDataStoreFactory(DATA_STORE_FACTORY) + .setAccessType("offline") + .build(); + Credential credential = new AuthorizationCodeInstalledApp( + flow, new LocalServerReceiver()).authorize("user"); + System.out.println( + "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath()); + return credential; + } + + /** + * Build and return an authorized Calendar client service. + * @return an authorized Calendar client service + * @throws IOException + */ + public static com.google.api.services.calendar.Calendar + getCalendarService() throws IOException { + Credential credential = authorize(); + return new com.google.api.services.calendar.Calendar.Builder( + HTTP_TRANSPORT, JSON_FACTORY, credential) + .setApplicationName(APPLICATION_NAME) + .build(); + } + + public static void init(String[] args) throws IOException { + // Build a new authorized API client service. + // Note: Do not confuse this class with the + // com.google.api.services.calendar.model.Calendar class. + com.google.api.services.calendar.Calendar service = + getCalendarService(); + + // List the next 10 events from the primary calendar. + DateTime now = new DateTime(System.currentTimeMillis()); + Events events = service.events().list("primary") + .setMaxResults(10) + .setTimeMin(now) + .setOrderBy("startTime") + .setSingleEvents(true) + .execute(); + List items = events.getItems(); + if (items.size() == 0) { + System.out.println("No upcoming events found."); + } else { + System.out.println("Upcoming events"); + for (Event event : items) { + DateTime start = event.getStart().getDateTime(); + if (start == null) { + start = event.getStart().getDate(); + } + System.out.printf("%s (%s)\n", event.getSummary(), start); + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/cloudcraftgaming/internal/data/BotData.java b/src/main/java/com/cloudcraftgaming/internal/data/BotData.java new file mode 100644 index 00000000..d15f0cd2 --- /dev/null +++ b/src/main/java/com/cloudcraftgaming/internal/data/BotData.java @@ -0,0 +1,10 @@ +package com.cloudcraftgaming.internal.data; + +/** + * Created by Nova Fox on 1/2/2017. + * Website: www.cloudcraftgaming.com + * For Project: DisCal + */ +public class BotData { + +} \ No newline at end of file