|
|
import os |
|
|
import openai |
|
|
from googleapiclient.discovery import build |
|
|
from google_auth_oauthlib.flow import InstalledAppFlow |
|
|
from google.auth.transport.requests import Request |
|
|
import pickle |
|
|
import dateparser |
|
|
|
|
|
|
|
|
openai.api_key = os.getenv('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') |
|
|
|
|
|
SCOPES = ['https://www.googleapis.com/auth/calendar'] |
|
|
|
|
|
def authenticate_google_calendar(): |
|
|
"""Authenticate and return the Google Calendar API service.""" |
|
|
creds = None |
|
|
if os.path.exists('token.pickle'): |
|
|
with open('token.pickle', 'rb') as token: |
|
|
creds = pickle.load(token) |
|
|
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) |
|
|
with open('token.pickle', 'wb') as token: |
|
|
pickle.dump(creds, token) |
|
|
return build('calendar', 'v3', credentials=creds) |
|
|
|
|
|
def parse_schedule_input(user_input): |
|
|
"""Parse natural language input for scheduling details.""" |
|
|
prompt = f"Extract an event title, date, and time from this input: '{user_input}'. Return in JSON format as {{'title': '...', 'date': 'YYYY-MM-DD', 'time': 'HH:MM'}}." |
|
|
response = openai.Completion.create( |
|
|
engine="text-davinci-003", |
|
|
prompt=prompt, |
|
|
max_tokens=100, |
|
|
temperature=0.3, |
|
|
) |
|
|
try: |
|
|
details = eval(response['choices'][0]['text'].strip()) |
|
|
return details |
|
|
except Exception as e: |
|
|
raise ValueError("Error parsing schedule input: " + str(e)) |
|
|
|
|
|
def add_event_to_calendar(service, event_details): |
|
|
"""Add a parsed event to the Google Calendar.""" |
|
|
try: |
|
|
event = { |
|
|
'summary': event_details['title'], |
|
|
'start': { |
|
|
'dateTime': f"{event_details['date']}T{event_details['time']}:00", |
|
|
'timeZone': 'UTC', |
|
|
}, |
|
|
'end': { |
|
|
'dateTime': f"{event_details['date']}T{event_details['time']}:00", |
|
|
'timeZone': 'UTC', |
|
|
}, |
|
|
} |
|
|
created_event = service.events().insert(calendarId='primary', body=event).execute() |
|
|
return f"Event created: {created_event.get('htmlLink')}" |
|
|
except Exception as e: |
|
|
return f"Failed to add event: {str(e)}" |
|
|
|
|
|
def schedule_bot_response(user_input): |
|
|
"""Main function to process user input and schedule a task.""" |
|
|
try: |
|
|
service = authenticate_google_calendar() |
|
|
event_details = parse_schedule_input(user_input) |
|
|
confirmation = add_event_to_calendar(service, event_details) |
|
|
return confirmation |
|
|
except Exception as e: |
|
|
return f"An error occurred: {str(e)}" |
|
|
|