Skip to content

Commit

Permalink
Merge pull request #4 from makcimerrr/feature--setconfigquery
Browse files Browse the repository at this point in the history
🆕 Nouvelle Fonctionnalité: Gestion des Queries Internes
  • Loading branch information
makcimerrr authored Sep 6, 2024
2 parents a316b91 + 31bc619 commit 5e15fc5
Show file tree
Hide file tree
Showing 12 changed files with 458 additions and 171 deletions.
4 changes: 3 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
TOKEN='your_discord_bot_toke'
RAPIDAPI_KEY='your_rapidapi_key'
RAPIDAPI_KEY2='your_rapidapi_key2'
RAPIDAPI_KEY2='your_rapidapi_key2'
QUERY_INTERNSHIP='your_query_internship'
QUERY_FULLTIME='your_query_fulltime'
2 changes: 1 addition & 1 deletion .idea/bot-discord-zone01.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 33 additions & 1 deletion bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@

bot = commands.Bot(command_prefix="!", intents=intents)

initial_extensions = ['cogs.gestion_ping', 'cogs.gestion_jobs', 'cogs.gestion_cdi', 'cogs.event_cog', 'cogs.helped_student', 'cogs.embed_cog']
initial_extensions = ['cogs.gestion_ping', 'cogs.gestion_jobs', 'cogs.gestion_cdi', 'cogs.event_cog',
'cogs.helped_student', 'cogs.embed_cog', 'cogs.query_cog']

# Flag to check if the bot is loading for the first time
first_ready = True
Expand Down Expand Up @@ -73,6 +74,37 @@ async def on_close():
print("Bot disconnected from Discord.")


# Ajoutez ce gestionnaire d'erreurs globalement dans votre fichier principal
# Gestionnaire d'événements pour les erreurs globales
@bot.event
async def on_command_error(ctx, error):
if isinstance(error, commands.CommandNotFound):
embed = discord.Embed(
title="🚫 Commande Inconnue",
description="La commande que vous avez essayée n'existe pas. Veuillez vérifier la commande et réessayer.",
color=discord.Color.red()
)
embed.set_footer(text="Utilisez !help pour voir les commandes disponibles.")
await ctx.send(embed=embed)
elif isinstance(error, commands.CommandInvokeError):
# Gestion d'erreurs spécifiques
embed = discord.Embed(
title="❌ Erreur d'Exécution",
description="Une erreur s'est produite lors de l'exécution de la commande. Veuillez réessayer plus tard.",
color=discord.Color.red()
)
embed.set_footer(text="Veuillez vérifier et réessayer.")
await ctx.send(embed=embed)
else:
embed = discord.Embed(
title="❌ Erreur",
description=str(error),
color=discord.Color.red()
)
embed.set_footer(text="Veuillez vérifier la commande et réessayer.")
await ctx.send(embed=embed)


attributes = {
'name': "help",
'aliases': ["helpme"],
Expand Down
95 changes: 68 additions & 27 deletions cogs/gestion_cdi.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@
from utils.config_loader import role_ping_cdi, forum_channel_id_cdi, guild_id
from utils.cdi_fetcher import fetch_api_fulltime


class CDICog(commands.Cog):
"""Cog pour la gestion des offres d'emploi."""
"""Cog pour la gestion des offres d'emploi CDI."""

def __init__(self, bot):
self.bot = bot
Expand All @@ -25,8 +24,6 @@ async def send_cdilist(self, ctx=None, loading_message=None):
return
forum_channel_cdi = guild.get_channel(forum_channel_id_cdi)

# forum_channel_cdi = ctx.guild.get_channel(forum_channel_id_cdi)

if isinstance(forum_channel_cdi, discord.ForumChannel):
# Obtenir les threads actifs et archivés existants
active_threads = forum_channel_cdi.threads
Expand All @@ -37,35 +34,67 @@ async def send_cdilist(self, ctx=None, loading_message=None):

all_threads = active_threads + archived_threads

list_jobs = await fetch_api_fulltime()
list_jobs, query_message = await fetch_api_fulltime(self.bot)

# Vérification si aucune query n'a été initialisée
if "Aucune query n'a été définie" in query_message:
if ctx:
if loading_message:
embed_error = discord.Embed(
title="🚫 Erreur : Query Non Initialisée",
description="Aucune query n'a été définie. Veuillez initialiser une query avec `!setqueryFulltime`.",
color=discord.Color.red()
)
embed_error.set_footer(text="Veuillez configurer une query pour continuer.")
await loading_message.edit(embed=embed_error)
return # Arrêter la fonction si la query n'est pas définie
else:
channel_id = 1257310056546963479 # Remplace par l'ID de ton channel
channel = self.bot.get_channel(channel_id)
if channel:
embed_error = discord.Embed(
title="⚠️ Erreur Automatique",
description="La tâche automatique n'a pas pu s'exécuter car aucune query n'a été définie. Veuillez configurer une query avec `!setqueryFulltime`.",
color=discord.Color.red()
)
await channel.send(embed=embed_error)
return

await asyncio.sleep(1)

verif = False

if ctx:
if not list_jobs:
await ctx.send("Aucune nouvelle offre d'emploi pour les apprenants.")
embed_no_jobs = discord.Embed(
title="🔍 Aucune Nouvelle Offre",
description="Aucune nouvelle offre d'emploi pour les contrats à temps plein n'a été trouvée.",
color=discord.Color.greyple()
)
embed_no_jobs.set_footer(text="Vérifiez plus tard pour les nouvelles offres.")
await ctx.send(embed=embed_no_jobs)
verif = True

if verif:
if loading_message:
# Modifier l'embed de chargement pour indiquer la fin de la mise à jour
embed_updated = discord.Embed(
title="Erreur lors de la mise à jour",
description=f"Aucune des listes d'offres d'emploi n'a pu être mise à jour. Veuillez "
f"réessayer plus tard.",
title="⚠️ Erreur lors de la Mise à Jour",
description="Aucune des listes d'offres d'emploi n'a pu être mise à jour. Veuillez réessayer plus tard.",
color=discord.Color.red()
)
embed_updated.add_field(
name="Message de l'API",
value=query_message if query_message else "Aucune query n'a été définie.",
inline=False
)
await loading_message.edit(embed=embed_updated)
return

all_jobs = list_jobs

found_threads = []
new_threads_created = False

for job in all_jobs:

title = job.get("job_title")
company = job.get("employer_name")
date = job.get("job_posted_at_datetime_utc")
Expand All @@ -76,9 +105,13 @@ async def send_cdilist(self, ctx=None, loading_message=None):

if title and link and company:
thread_title = f"{company} - {title}"

if date and link:
thread_content = f"Bonjour <@&{role_ping_cdi}> ! Offre sur **{city}**, chez **{company}** qui recherche un développeur **{title}**.Pour plus de détails et pour postuler, cliquez sur le lien : {link}"
thread_content = (
f"👋 Bonjour <@&{role_ping_cdi}> !\n\n"
f"🔎 Offre sur **{city}** chez **{company}**.\n"
f"📈 Poste recherché : **{title}**\n"
f"🔗 Pour plus de détails et pour postuler, cliquez sur le lien : [Postuler]({link})"
)

# Chercher un thread existant avec le même titre
existing_thread = None
Expand All @@ -90,7 +123,7 @@ async def send_cdilist(self, ctx=None, loading_message=None):

# Si un thread avec le même titre existe déjà, passe au suivant
if existing_thread:
print("Thread found:", existing_thread.name)
print("Thread trouvé :", existing_thread.name)
continue

# Créer le nouveau thread
Expand All @@ -101,55 +134,63 @@ async def send_cdilist(self, ctx=None, loading_message=None):
await asyncio.sleep(1)
except discord.errors.HTTPException as e:
if e.code == 429:
print(
"Rate limited by Discord, will try again later."
)
print("Rate limited by Discord, retrying later.")
break

await asyncio.sleep(1)

# Vérifier si aucun nouveau thread n'a été créé
if not new_threads_created:
if loading_message:
embed_updated = discord.Embed(
title="Aucune nouvelle offre",
description="Aucune nouvelle offre d'emploi n'a été trouvée.",
title="🔔 Aucune Nouvelle Offre",
description="Aucune nouvelle offre d'emploi n'a été trouvée pour les CDI.",
color=discord.Color.green()
)
embed_updated.add_field(
name="Message de l'API",
value=query_message if query_message else "Aucune query n'a été définie.",
inline=False
)
await loading_message.edit(embed=embed_updated)
else:
if loading_message:
embed_updated = discord.Embed(
title="Mise à jour terminée",
title="Mise à Jour Complète",
description="Toutes les nouvelles offres d'emploi ont été publiées avec succès.",
color=discord.Color.blue()
)
embed_updated.add_field(
name="Message de l'API",
value=query_message if query_message else "Aucune query n'a été définie.",
inline=False
)
await loading_message.edit(embed=embed_updated)

else:
print("Le canal spécifié n'est pas un ForumChannel.")
if loading_message:
embed_updated = discord.Embed(
title="Erreur lors de la mise à jour",
title="Erreur de Canal",
description="Le canal spécifié n'est pas un ForumChannel.",
color=discord.Color.red()
)
await loading_message.edit(embed=embed_updated)

@commands.command(name='update_cdi')
@commands.command(name='update_fulltime', aliases=['update_cdi'], description="Force la mise à jour des offres d'emploi pour les CDI.")
async def update_cdi(self, ctx):
"""Force la mise à jour des offres d'emploi pour les CDI."""
# await ctx.send(f"Updated jobs list !")
embed_loading = discord.Embed(
title="Mise à jour en cours",
title="🔄 Mise à Jour en Cours",
description="La liste des offres d'emploi pour les CDI est en cours de mise à jour, veuillez patienter...",
color=discord.Color.orange()
)
embed_loading.set_thumbnail(
url="https://i.imgur.com/5AGlfwy.gif") # Lien vers une icône d'engrenage animée
url="https://i.imgur.com/5AGlfwy.gif"
) # Lien vers une icône d'engrenage animée
loading_message = await ctx.send(embed=embed_loading)

await self.send_cdilist(ctx, loading_message)
# await ctx.send(f"Fini !")


async def setup(bot):
Expand Down
78 changes: 55 additions & 23 deletions cogs/gestion_help.py
Original file line number Diff line number Diff line change
@@ -1,58 +1,90 @@
import discord

from discord.ext import commands


async def send_command_error(ctx, error):
if isinstance(error, commands.CommandNotFound):
embed = discord.Embed(
title="🚫 Commande Inconnue",
description="La commande que vous avez essayée n'existe pas. Veuillez vérifier la commande et réessayer.",
color=discord.Color.red()
)
embed.set_footer(text="Utilisez !help pour voir les commandes disponibles.")
else:
embed = discord.Embed(
title="❌ Erreur",
description=str(error),
color=discord.Color.red()
)
embed.set_footer(text="Veuillez vérifier la commande et réessayer.")

await ctx.send(embed=embed)


class SupremeHelpCommand(commands.Cog, commands.HelpCommand):
def get_command_signature(self, command):
return '%s%s %s' % (self.context.clean_prefix, command.qualified_name, command.signature)

async def send_bot_help(self, mapping):
embed = discord.Embed(title="Help", color=discord.Color.blurple())
embed = discord.Embed(
title="🔧 Commandes du Bot",
description="Voici toutes les commandes disponibles pour ce bot.",
color=discord.Color.blurple()
)
embed.set_thumbnail(url="https://i.imgur.com/vn0HoFx.png") # Ajouter une image d'illustration

for cog, commands in mapping.items():
filtered = await self.filter_commands(commands, sort=True)
if command_signatures := [
self.get_command_signature(c) for c in filtered
]:
cog_name = getattr(cog, "qualified_name", "No Category")
embed.add_field(name=cog_name, value="\n".join(command_signatures), inline=False)
if filtered:
cog_name = getattr(cog, "qualified_name", "Aucune Catégorie")
command_list = "\n".join(f"`{self.get_command_signature(c)}`" for c in filtered)
embed.add_field(name=f"📁 {cog_name}", value=command_list, inline=False)

channel = self.get_destination()
await channel.send(embed=embed)

async def send_command_help(self, command):
embed = discord.Embed(title=self.get_command_signature(command), color=discord.Color.blurple())
if command.help:
embed.description = command.help
embed = discord.Embed(
title=self.get_command_signature(command),
description=command.help or "Aucune description disponible.",
color=discord.Color.blurple()
)
if alias := command.aliases:
embed.add_field(name="Aliases", value=", ".join(alias), inline=False)
embed.add_field(name="🔄 Alias", value=", ".join(alias), inline=False)
if command.cog:
embed.add_field(name="📁 Catégorie", value=command.cog.qualified_name, inline=False)

embed.set_footer(text="Pour plus d'informations sur d'autres commandes, utilisez !help")
channel = self.get_destination()
await channel.send(embed=embed)

async def send_help_embed(self, title, description, commands): # a helper function to add commands to an embed
embed = discord.Embed(title=title, description=description or "No help found...")
async def send_help_embed(self, title, description, commands):
embed = discord.Embed(
title=title,
description=description or "Aide non trouvée.",
color=discord.Color.blurple()
)
embed.set_thumbnail(url="https://i.imgur.com/vn0HoFx.png") # Ajouter une image d'illustration

if filtered_commands := await self.filter_commands(commands):
for command in filtered_commands:
embed.add_field(name=self.get_command_signature(command), value=command.help or "No help found...")
embed.add_field(
name=self.get_command_signature(command),
value=command.help or "Aucune description disponible.",
inline=False
)

embed.set_footer(text="Pour plus d'informations, utilisez !help")
await self.get_destination().send(embed=embed)

async def send_group_help(self, group):
title = self.get_command_signature(group)
await self.send_help_embed(title, group.help, group.commands)

async def send_cog_help(self, cog):
title = cog.qualified_name or "No"
await self.send_help_embed(f'{title} Category', cog.description, cog.get_commands())

async def send_error_message(self, error):
embed = discord.Embed(title="Error", description=error, color=discord.Color.red())
channel = self.get_destination()

await channel.send(embed=embed)
title = cog.qualified_name or "Aucune Catégorie"
await self.send_help_embed(f'📚 {title} Category', cog.description, cog.get_commands())


async def setup(bot):
await bot.add_cog(SupremeHelpCommand(bot))
await bot.add_cog(SupremeHelpCommand(bot))
Loading

0 comments on commit 5e15fc5

Please sign in to comment.