From 31a9efe051f526bed248af296457a5f8c48c495f Mon Sep 17 00:00:00 2001 From: bswalia Date: Fri, 29 Sep 2023 13:53:01 -0400 Subject: [PATCH] feat: Allowed for bot to access Google Calendar API (Issue #2) --- .gitignore | 6 ++++- cogs/calendar.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 cogs/calendar.py diff --git a/.gitignore b/.gitignore index 0c8c7efcc..23c4ea57e 100644 --- a/.gitignore +++ b/.gitignore @@ -128,4 +128,8 @@ dmypy.json # Pyre type checker .pyre/ bot.env -bot.env \ No newline at end of file +bot.env + +#Google calendar stuff +credentials.json +token.json diff --git a/cogs/calendar.py b/cogs/calendar.py new file mode 100644 index 000000000..03e1f2d19 --- /dev/null +++ b/cogs/calendar.py @@ -0,0 +1,68 @@ +from __future__ import print_function + +import datetime +import os.path + +from discord.ext import commands, tasks +from google.auth.transport.requests import Request +from google.oauth2.credentials import Credentials +from google_auth_oauthlib.flow import InstalledAppFlow +from googleapiclient.discovery import build +from googleapiclient.errors import HttpError + + +class Calendar(commands.Cog): + + def __init__(self, bot): + self.bot = bot + + @commands.command(name="listCalendarEvents") + async def listCalendarEvents(self, ctx): + # If modifying these scopes, delete the file token.json. + SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'] + + creds = None + # The file token.json stores the user's access and refresh tokens, and is + # created automatically when the authorization flow completes for the first + # time. + if os.path.exists('token.json'): + creds = Credentials.from_authorized_user_file('token.json', SCOPES) + # If there are no (valid) credentials available, let the user log in. + if not creds or not creds.valid: + if creds and creds.expired and creds.refresh_token: + creds.refresh(Request()) + else: + flow = InstalledAppFlow.from_client_secrets_file( + 'credentials.json', SCOPES) + creds = flow.run_local_server(port=0) + # Save the credentials for the next run + with open('token.json', 'w') as token: + token.write(creds.to_json()) + + try: + service = build('calendar', 'v3', credentials=creds) + + # Call the Calendar API + now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time + print('Getting the upcoming 10 events') + events_result = service.events().list(calendarId='primary', timeMin=now, + maxResults=10, singleEvents=True, + orderBy='startTime').execute() + events = events_result.get('items', []) + + if not events: + print('No upcoming events found.') + return + + # Prints the start and name of the next 10 events + for event in events: + start = event['start'].get('dateTime', event['start'].get('date')) + print(start, event['summary']) + + except HttpError as error: + print('An error occurred: %s' % error) + +async def setup(bot): + n = Calendar(bot) + await bot.add_cog(n) +