Search code examples
automationslackslack-api

Slack automate calendar events


I'm looking for a way to automate the creation of calendar events. I'm part of multiple spaces in my school and they keep on posting some events that are happening on a regular basis.

I was wondering is there's a way to automate these calendar events. I want to write a script with Slack api's that can read the messages from all the spaces I'm part of and scan them to see if there's any event related information and create a new calendar event in my google calendars. I want to run this at the end of the day on all the messages from all the spaces.


Solution

  • from __future__ import print_function
    
    import os
    import json
    import pprint
    
    import time
    import parsedatetime
    from datetime import datetime
    from datetime import timedelta
    
    from slack_sdk import WebClient
    from slack_sdk.errors import SlackApiError
    
    from google.oauth2.credentials import Credentials
    from googleapiclient.discovery import build
    from googleapiclient.errors import HttpError
    
    
    def get_google_service():
        creds = None
        SCOPES = ['https://www.googleapis.com/auth/calendar']
        if os.path.exists('token.json'):
            creds = Credentials.from_authorized_user_file('token.json', SCOPES)
        return build('calendar', 'v3', credentials=creds)
    
    
    def send_google_calendar_invite(service, channel_name, start_time, end_time):
        try:
            # f = open("template.json", "r")
            # template_data = f.read()
            template_data = '''
                            {
                                "summary": "event_name",
                                "location": "event_location",
                                "description": "event_description",
                                "start": {
                                    "dateTime": "event_start_time",
                                    "timeZone": "America/Los_Angeles"
                                },
                                "end": {
                                    "dateTime": "event_end_time",
                                    "timeZone": "America/Los_Angeles"
                                }
                            }
                            '''
            template_data = template_data.replace('event_name', channel_name)
            template_data = template_data.replace('event_location', channel_name+'-meeting')
            template_data = template_data.replace('event_description', channel_name+'-desrpition')
            template_data = template_data.replace('event_start_time', start_time)
            template_data = template_data.replace('event_end_time', end_time)
            json_object = json.loads(template_data)
            json_formatted_str = json.dumps(json_object, indent=2)
            print(json_formatted_str)
    
            event = service.events().insert(calendarId='primary', body=json_object).execute()
            print('Event created: %s' % (event.get('htmlLink')))
    
        except HttpError as error:
            print('An error occurred: %s' % error)
    
    
    def read_slack_messages():
        channel_id = "C04QL76V21X"
    
        try:
            lastHourDateTime = datetime.now() - timedelta(hours=24)
            client = WebClient(token=open("secrets.txt", "r").read())
            conversation_history = client.conversations_history(channel=channel_id, oldest=time.mktime(lastHourDateTime.timetuple()))
            channel_info_result = client.conversations_info(channel=channel_id)
    
            channel_name = channel_info_result['channel']['name']
            conversation_messages = conversation_history["messages"]
            print("{} messages found in {}".format(len(conversation_messages), id))
            # import pdb; pdb.set_trace();
    
            
            service = get_google_service()
            for message in conversation_messages[:2]:
                chat_message = message['text']
    
                try:
                    cal = parsedatetime.Calendar()
                    dates = cal.parse(chat_message)
                    print(dates)
                    start_time = time.strftime('%Y-%m-%dT%H:%M:%S-%000:00', (dates[0]))
                    end_time = start_time[:11]+f"{int(start_time[11:13])+1:02}"+start_time[13:]
                    print(chat_message, ' : ', start_time, ' ||| ', end_time)
    
                    send_google_calendar_invite(service, channel_name, start_time, end_time)
    
                except TypeError as e: 
                    print(' : Nope : ', e);
    
        except SlackApiError as e:
            print("Error getting conversation: {}".format(e))
    
    
    if __name__ == '__main__':
        read_slack_messages()