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'] 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 async def authenticate(): print("Authenticating..") global service 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) @bot.tree.command(name='weekly_events') async def events(interaction: discord.Interaction): await interaction.response.defer(thinking=True) 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) 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) try: events_result = service.events().list( calendarId='primary', timeMin=start_of_week.isoformat() + 'Z', timeMax=end_of_week.isoformat() + 'Z', singleEvents=True, orderBy='startTime' ).execute() events = events_result.get('items',[]) if not events: await interaction.response.send_message('No events this week !') else: embed = discord.Embed( title="📅 Weekly Events Summary", color=discord.Color.blue() ) for event in events: event_time_str = event['start'].get('dateTime', event['start'].get('date')) if 'Z' in event_time_str: event_time = datetime.datetime.fromisoformat(event_time_str.replace('Z', '+00:00')) else: event_time = datetime.datetime.fromisoformat(event_time_str) event_time_local = event_time.strftime("%A, %B %d, %Y, %H:%M") task = f"**{event['summary']}**\n⏰ **At: {event_time_local}**" embed.add_field(name="\u200b", value=task, inline=False) await interaction.followup.send(embed=embed) 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 authenticate() 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)