import os import discord import datetime import google_auth_oauthlib.flow from weather import OpenWeatherMapAPIClient from googleapiclient.discovery import build from discord.ext import commands from dotenv import load_dotenv global service service = None SCOPES = ['https://www.googleapis.com/auth/calendar.readonly'] service = None load_dotenv() DISCORD_TOKEN = os.getenv("DISCORD_TOKEN") WEATHER_TOKEN = os.getenv("WEATHER_TOKEN") weather_client = OpenWeatherMapAPIClient(WEATHER_TOKEN, "MyDiscordWeatherBot") intents = discord.Intents(messages=True, guilds=True) intents.message_content = True bot = commands.Bot(command_prefix='!', intents=intents) #Calendar authentification @bot.tree.command() async def authenticate(interaction: discord.Interaction): await interaction.response.defer(thinking=True) global service try: if service: await interaction.response.send_message('Already authenticated with Google Calendar.') return flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file('./calendar/credentials.json', SCOPES) credentials = flow.run_local_server(port=0) service = build('calendar', 'v3', credentials=credentials) await interaction.followup.send('Successfully authenticated with Google Calendar !') except Exception as e: await interaction.followup.send(f'An error occurred: {e}') @bot.tree.command(name='weekly_events') async def events(interaction: discord.Interaction): await interaction.response.defer(thinking=True) if service is None: await interaction.followup.send('Please authenticate first using /authenticate.') return now = datetime.datetime.utcnow() current_weekday = now.weekday() start_of_week = now - datetime.timedelta(days=current_weekday) start_of_week = start_of_week.replace(hour=0, minute=0, second=0, microsecond=0).isoformat() + 'Z' end_of_week = start_of_week + datetime.timedelta(days=6) end_of_week= end_of_week.replace(hour=23, minute=59, second=59, microsecond=999999).isoformat() + 'Z' try: events_result = service.events().list( calendarId='primary', timeMin=start_of_week, timeMax=end_of_week, singleEvents=True, orderBy='startTime' ).execute() events = events_result.get('items',[]) if not events: await interaction.response.send_message('No tasks for today !') else: tasks = [] for event in events: task= f"{event['summary']} at {event['start'].get('dateTime', event['start'].get('date'))}" tasks.append(task) await interaction.followup.send('\n'.join(tasks)) except Exception as e: await interaction.followup.send(f'An error occurred: {e}') #Weather commad tree @bot.tree.command(name="weather") async def current_weather(interaction: discord.Interaction, location: str): print(f"Received weather command from {interaction.user.display_name}") # Log intéraction current_weather = weather_client.get_current_weather(location) print(f"JSON API {current_weather}") # Check that current_weather is a dictionary and contains necessary keys if not isinstance(current_weather, dict) or 'main' not in current_weather or 'weather' not in current_weather: await interaction.response.send_message("Could not retrieve weather data. Please check the location.") return weather_list = current_weather['weather'] if len(weather_list) == 0: await interaction.response.send_message("Weather information is not available.") return weather_condition = weather_list[0]['main'] temp = current_weather['main']['temp'] icon = current_weather['weather']['icon'] embed = discord.Embed( title=f"Current weather in {location}", description=f"Temperature: {temp}°C\nSky: {weather_condition}", ) embed.set_thumbnail(url=f"https://openweathermap.org/img/wn/{icon}.png") await interaction.response.send_message(embed=embed) @bot.tree.command(name='hello') async def hello_command(interaction: discord.Interaction): print(f"Received hello command from {interaction.user.display_name}") # Log intéraction user_nick = interaction.user.display_name await interaction.response.send_message(f'Hello {user_nick}!') @bot.event async def on_ready(): print(f'Logged in as {bot.user}') await bot.tree.sync() #Liste commandes enregistré commands = await bot.tree.fetch_commands() print("Registered Commands:") for command in commands: print(f"- {command.name}") bot.run(DISCORD_TOKEN)