From 8c5ecda42450e8bbc67247a5be897399bd92f831 Mon Sep 17 00:00:00 2001 From: Rachit Agrawal <111473259+Rancho-rachit@users.noreply.github.com> Date: Sun, 5 May 2024 14:46:49 +0530 Subject: [PATCH] ADD: Automation script for Scheduled events on Discord_Server and Google_Calender both. (#18) --- event-manager/README.md | 50 ++++++++++++++++++++++++++ event-manager/discord_.py | 47 +++++++++++++++++++++++++ event-manager/google_calendar_.py | 58 +++++++++++++++++++++++++++++++ event-manager/main.py | 31 +++++++++++++++++ event-manager/requirements.txt | 4 +++ event-manager/sample_env | 21 +++++++++++ 6 files changed, 211 insertions(+) create mode 100644 event-manager/README.md create mode 100644 event-manager/discord_.py create mode 100644 event-manager/google_calendar_.py create mode 100644 event-manager/main.py create mode 100644 event-manager/requirements.txt create mode 100644 event-manager/sample_env diff --git a/event-manager/README.md b/event-manager/README.md new file mode 100644 index 0000000..506bb05 --- /dev/null +++ b/event-manager/README.md @@ -0,0 +1,50 @@ +# Automation to create events across channels (google calendar & discord) +#### by [Rancho-rachit](https://github.com/Rancho-rachit) + +--- + +### Description: + +This script creates events across - +1. [Google Calendar](https://developersindia.in/events-calendar/) +2. [Discord](https://discord.com/channels/669880381649977354/) + +--- + +### FIRST TIME SETUP + +1. Get Python3 `sudo apt-get install python3 && python3 --version` + +2. Install required packages `pip install -r requirements.txt` + +3. Add respective tokens in the `.env` file + + 3.1 Discord Bot token [`DISCORD_BOT_TOKEN`] (Get it from [Discord Developers portal](https://discord.com/developers/applications/)) (bot must have MANAGE_EVENT & CREATE_EVENT permission) + + 3.2 Guild ID [`DISCORD_GUILD_ID`] (developersIndia => `1229786646468362260`) + + 3.3 calendar Id [`GOOGLE_calendar_ID`] (developerIndia => `9f1337e4154910eb1bdb3bfac32b88f69546468b1281a6db58f50a909df5049f@group.calendar.google.com`) + +4. Connect Google calendar through [Google cloud Console](https://console.cloud.google.com/) + + 4.1 Create a Project on Google Cloud Console + + 4.2 Search for calendar API and enable it + + 4.3 Create Credentials -> OAuth Client ID -> Application type as Desktop + + 4.4 Download the Json file + + 4.5 Rename that JSON file as `credentials.json` and save it to the project directory. + +5. `python3 main.py` + +--- + +### NOTES- + +> - Google authenication is required for the first time. +> +> - A file `token.json` will be downloaded automatically, and no web login will be needed afterwards. + + diff --git a/event-manager/discord_.py b/event-manager/discord_.py new file mode 100644 index 0000000..8b16ca4 --- /dev/null +++ b/event-manager/discord_.py @@ -0,0 +1,47 @@ +from datetime import datetime, timedelta +import discord +from discord.ext import commands + +def create_discord_event(bot_token, guild_id, + EVENT_NAME, EVENT_DESCRIPTION, EVENT_LOCATION, EVENT_DATE, EVENT_START_TIME, EVENT_END_TIME +): + + bot = commands.Bot(command_prefix='!', intents=discord.Intents.all()) + + @bot.event + async def on_ready(): + + # Convert the date string to a datetime object + date_object = datetime.strptime(EVENT_DATE, "%Y-%m-%d") + + # Convert the time string to a datetime object + start_time_object = datetime.strptime(EVENT_START_TIME, "%H:%M") + end_time_object = datetime.strptime(EVENT_END_TIME, "%H:%M") + + # Combine the date and time objects + st = date_object.replace(hour=start_time_object.hour, minute=start_time_object.minute).astimezone() + et = date_object.replace(hour=end_time_object.hour, minute=end_time_object.minute).astimezone() + + gg = bot.get_guild(guild_id) + + try: + event = await gg.create_scheduled_event( + name=EVENT_NAME, + entity_type=discord.EntityType.external, + description=EVENT_DESCRIPTION, + start_time=st, + end_time=et, + location=EVENT_LOCATION, + privacy_level=discord.PrivacyLevel.guild_only, + ) + print("Discord Event: ", event.url) + + except Exception as e: + print(e) + + await bot.close() + + # Run the bot + bot.run(bot_token) + +# END \ No newline at end of file diff --git a/event-manager/google_calendar_.py b/event-manager/google_calendar_.py new file mode 100644 index 0000000..ec998c0 --- /dev/null +++ b/event-manager/google_calendar_.py @@ -0,0 +1,58 @@ +import os.path + +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 + +SCOPES = ['https://www.googleapis.com/auth/calendar'] + +def create_google_calendar_event(calendar_id, name, description, location, date, start_time, end_time): + + creds = None + + # The file token.json stores the user's access and refresh tokens + 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: + print("Login to your Google account. [THIS IS A ONE TIME PROCESS]") + 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) + start = f"{date}T{start_time}:00" + end = f"{date}T{end_time}:00" + event = { + 'summary': name, + 'location': location, + 'description': description, + 'start': { + 'dateTime': start, + 'timeZone': 'Asia/Kolkata', + }, + 'end': { + 'dateTime': end, + 'timeZone': 'Asia/Kolkata', + }, + } + + event = service.events().insert(calendarId=calendar_id, body=event).execute() + + print('Google calendar: %s' % (event.get('htmlLink'))) + return event + + except Exception as e: + print(e) + return None + +# END \ No newline at end of file diff --git a/event-manager/main.py b/event-manager/main.py new file mode 100644 index 0000000..1cb2a34 --- /dev/null +++ b/event-manager/main.py @@ -0,0 +1,31 @@ +import os +from dotenv import load_dotenv + +load_dotenv() +bot_token = os.getenv('DISCORD_BOT_TOKEN') +guild_id = int(os.getenv('DISCORD_GUILD_ID')) +calendar_id = os.getenv('GOOGLE_CALENDAR_ID') + +def get_input(): + NAME = input("Event title: ") + DESCRIPTION = input("Event description: ") + LOCATION = input("Event location (red -> for developersindia subreddit): ") + if LOCATION == "red": + LOCATION = "https://www.reddit.com/r/developersindia/" + DATE = input("Enter the event date (yyyy-mm-dd): ") + START_TIME = input("Enter the event start time (hh:mm)- ") + END_TIME = input("Enter the event end time (hh:mm)- ") + + return NAME, DESCRIPTION, LOCATION, DATE, START_TIME, END_TIME + +EVENT_NAME, EVENT_DESCRIPTION, EVENT_LOCATION, EVENT_DATE, EVENT_START_TIME, EVENT_END_TIME = get_input() + +# Execute create_discord_event +from discord_ import create_discord_event +create_discord_event(bot_token, guild_id, EVENT_NAME, EVENT_DESCRIPTION, EVENT_LOCATION, EVENT_DATE, EVENT_START_TIME, EVENT_END_TIME) + +# Execute google_calendar_event +from google_calendar_ import create_google_calendar_event +create_google_calendar_event(calendar_id, EVENT_NAME, EVENT_DESCRIPTION, EVENT_LOCATION, EVENT_DATE, EVENT_START_TIME, EVENT_END_TIME) + +# END \ No newline at end of file diff --git a/event-manager/requirements.txt b/event-manager/requirements.txt new file mode 100644 index 0000000..7763c48 --- /dev/null +++ b/event-manager/requirements.txt @@ -0,0 +1,4 @@ +discord.py +google-api-python-client +google-auth-httplib2 +google-auth-oauthlib \ No newline at end of file diff --git a/event-manager/sample_env b/event-manager/sample_env new file mode 100644 index 0000000..b5a95b6 --- /dev/null +++ b/event-manager/sample_env @@ -0,0 +1,21 @@ +# This is the file contains the required tokens. + +# DISCORD BOT TOKEN +# MUST HAVE PERMISSIONS TO CREATE EVENTS & MANAGE EVENTS +# https://discord.com/developers/applications + +DISCORD_BOT_TOKEN = "TOKEN" + +# ----------- + +# DISCORD SERVER ID (GUILD ID) +# developersIndia => 1229786646468362260 + +DISCORD_GUILD_ID = 1229786646468362260 + +# ----------- + +# CALANDER ID +# developersIndia => "9f1337e4154910eb1bdb3bfac32b88f69546468b1281a6db58f50a909df5049f@group.calendar.google.com" + +GOOGLE_CALENDAR_ID = "9f1337e4154910eb1bdb3bfac32b88f69546468b1281a6db58f50a909df5049f@group.calendar.google.com"