migrate reminder in another file

This commit is contained in:
Mylloon 2021-07-28 22:25:18 +02:00
parent 03bc6f8937
commit ed9c78e31c
2 changed files with 207 additions and 193 deletions

202
src/cogs/reminder.py Normal file
View file

@ -0,0 +1,202 @@
import discord
from discord.ext import commands, tasks
from discord_slash import cog_ext
from utils.reminder import Reminder
from utils.core import getURLsInString, getMentionInString, isSlash, mySendHidden, mentionToUser, cleanCodeStringWithMentionAndURLs
from utils.time import stringTempsVersSecondes, nowUTC, intToDatetime, timedeltaToString, timestampScreen
def setup(client):
client.add_cog(Reminder(client))
class Reminder(commands.Cog):
"""Commandes relatives aux cours."""
def __init__(self, client):
self.client = client
@commands.command(name='reminder', aliases=["remind", "remindme", "rappel"])
async def _reminder(self, ctx, time, *reminder):
"""Met en place un rappel.\n ➡ Syntaxe: {PREFIX}reminder/remind/remindme/rappel <temps>[@] [message]"""
_, fromSlash, reminder = isSlash(reminder)
if len(reminder) > 0:
reminder = " ".join(reminder)
else:
reminder = None
embed = discord.Embed(color = 0xC41B1B)
extrarg = 0
guildID = ctx.guild.id # can be set to 0 if its a DM message, so it can be see from anywhere
destination = "ici"
if not reminder:
reminder = "Notification"
if time == "help":
seconds = 0
else:
if time.endswith("@"):
time = time[:-1]
extrarg = 1
if time.lower().endswith("p"):
time = time[:-1]
extrarg = 2
guildID = 0
destination = "en MP"
seconds = stringTempsVersSecondes(time)
if type(seconds) != int:
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
return await mySendHidden(ctx, fromSlash, seconds)
if seconds == 0:
embed.add_field(name="Attention", value=
"Format pour le temps : `d` ou `j` pour jour, `h` pour heure, `m` pour minute, `s` pour seconde (légères variances acceptés aussi). \
\nMet un `@` accolée aux temps pour mentionner les gens mentionner dans ton message. \
\nMet un `P` accolée au temps pour que le bot te DM au lieu de t'envoyer un message dans ce salon."
)
elif seconds > (50 * (86400 * 365.242)): # 50 ans
embed.add_field(name="Attention", value="Tu as spécifié une durée trop longue, la durée maximum étant de 50 ans.")
else:
now = int(nowUTC())
messageID = None
if fromSlash != True:
messageID = ctx.message.id
reminderID = Reminder().ajoutReminder(messageID, ctx.channel.id, extrarg, reminder, now, now + seconds, ctx.author.id, guildID)
return await mySendHidden(ctx, fromSlash, f"Ton reminder **`{reminderID[0][0]}`** est enrengistré, je te notifie {destination} dans {timedeltaToString(seconds)} (avec 1m de retard maximum).")
await mySendHidden(ctx, fromSlash, embed = embed)
@_reminder.error
async def _reminder_error(self, ctx, error):
if 'time is a required argument that is missing.' in str(error):
await ctx.send("Tu n'as pas spécifié de durée.")
@cog_ext.cog_slash(name="reminder", description = "Met en place un rappel.")
async def __reminder(self, ctx, time, reminder = None):
if reminder == None:
return await self._reminder(ctx, time, True)
else:
return await self._reminder(ctx, time, reminder, True)
@tasks.loop(minutes = 1)
async def _reminderLoop(self):
"""Méthode qui se répète toute les minutes pour vérifier si des rappels n'ont pas expirés, si expirés, les envoient."""
expiration = Reminder().recuperationExpiration(int(nowUTC())) # on récupères les éléments expirés
for expired in expiration: # on regarde tout les éléments expirés
reminder = expired[2] # message
userID = expired[4] # personne qui a fait le rappel
channel = self.client.get_channel(expired[0]) # salon du message
finalEmbed = discord.Embed(description = cleanCodeStringWithMentionAndURLs(reminder), timestamp = intToDatetime(expired[3]), color = discord.Colour.random())
if expired[1] == 2: # s'il faut envoyer en DM le message
user = self.client.get_user(userID)
if user == None: # si l'utilisateur n'est pas trouvé
return Reminder().suppressionReminder(expired[5]) # suppression du rappel
channel = await user.create_dm() # envoie en DM
userID = None # plus de mention
sourceMessage = None # plus de message source
elif channel == None: # si le salon n'existe plus
user = self.client.get_user(userID)
if user == None: # si l'utilisateur n'est pas trouvé
return Reminder().suppressionReminder(expired[5]) # suppression du rappel
channel = await user.create_dm() # envoie en DM
userID = None # plus de mention
sourceMessage = None # plus de message source
finalEmbed.add_field(name = "Info", value = "Message envoyé en DM car le salon n'est plus disponible.")
else:
sourceMessage = expired[6]
if sourceMessage != None: # vérification message avec slash command et que si c'est pas en DM
try:
sourceMessage = await channel.fetch_message(sourceMessage) # récupération message
except:
sourceMessage = None # message a été supprimé
if sourceMessage != None:
await sourceMessage.add_reaction(emoji = '') # ajout réaction
finalEmbed.set_footer(text=f"Message d'il y a {timedeltaToString(int(nowUTC()) - expired[3])}")
links = ""
findedURLs = getURLsInString(reminder)
for i in range(0, len(findedURLs)): # ajout de field "lien" pour pouvoir cliquer sur les liens facilement
links += f"[Lien {i + 1}]({findedURLs[i]}) · "
if len(findedURLs) > 0:
finalEmbed.add_field(name = f"Lien{'s' if len(findedURLs) > 1 else ''}", value = links[:-3])
message = ""
if userID != None: # metion de l'utilisateur si le message n'est pas en DM
message = f"<@{userID}>"
if expired[1] == 1: # s'il faut mentionner les personnes dans le message
mentionList = getMentionInString(reminder)
for i in mentionList:
message += f" {i}"
try:
await channel.send(message, embed = finalEmbed) # envoie du rappel
except: # les DM sont fermés
pass
Reminder().suppressionReminder(expired[5]) # suppression du rappel
@_reminderLoop.before_loop
async def __avant_reminderLoop(self):
await self.client.wait_until_ready()
@commands.command(name='reminderlist', aliases=["remindlist", "rl", "rappeliste"])
async def _reminderlist(self, ctx, *arg):
"""Affiche la liste des rappels d'un utilisateur.\n ➡ Syntaxe: {PREFIX}reminderlist/rl/remindlist/rappeliste [utilisateur]"""
_, fromSlash, arg = isSlash(arg)
utilisateur = ctx.author.id
page = 1
if len(arg) > 0:
try:
utilisateur = mentionToUser(getMentionInString(arg[0])[0])
except:
try:
page = int(arg[0])
except:
return await mySendHidden(ctx, fromSlash, "Veuillez renseigné un utilisateur ou un numéro de page valide.")
reminders = Reminder().listeReminder(utilisateur, ctx.guild.id)
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
pageMAX = -(-len(reminders) // 5)
embed = discord.Embed(description = f"**Rappel{'s' if len(reminders) > 1 else ''} de <@{utilisateur}>** • Page {page}/{pageMAX}", color = discord.Colour.random())
embed.set_thumbnail(url = self.client.get_user(utilisateur).avatar_url_as(size = 64))
limit = 5 * page
if len(reminders) > 0 and page <= pageMAX:
curseur = limit - 4
for reminder in reminders[limit - 5:]:
if curseur <= limit:
texte = reminder[0]
if len(texte) > 1024:
texte = f"{texte[:1021]}..."
expiration = reminder[2] - int(nowUTC())
if expiration > 0:
expiration = f"Expire dans {timedeltaToString(expiration)}"
else:
expiration = f"A déjà expiré."
embed.add_field(value = texte, name = f"#{reminder[3]} • Fais le {timestampScreen(intToDatetime(reminder[1]))}\n{expiration}", inline = False)
curseur += 1
else:
embed.add_field(name = "\u200b", value = f"L'utilisateur n'a aucun rappel en attente ou page n°{page} vide !")
embed.set_footer(text = "Les rappels qui ont déjà expirés vont apparaître dans quelques instants.\nIls peuvent avoir jusqu'à 1 minute de retard maximum.")
await ctx.send(embed = embed)
@cog_ext.cog_slash(name="reminderlist", description = "Affiche la liste des rappels d'un utilisateur.")
async def __reminderlist(self, ctx, userorpage = None):
if userorpage == None:
return await self._reminderlist(ctx, True)
else:
return await self._reminderlist(ctx, userorpage, True)
@commands.command(name='reminderdelete', aliases=["reminddelete", "rd"])
async def _reminderdelete(self, ctx, *id):
"""Suppprime un rappel.\n ➡ Syntaxe: {PREFIX}reminderdelete/rd <id>"""
id, fromSlash, _ = isSlash(id)
if id:
try:
id = int(id)
except:
return await mySendHidden(ctx, fromSlash, "L'ID renseigné n'est pas valide.")
else:
return await ctx.send("Veuillez renseigner un ID.")
verification = Reminder().appartenanceReminder(ctx.author.id, id, ctx.guild.id)
if verification:
Reminder().suppressionReminder(id)
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
return await ctx.send(f"Reminder **#{id}** supprimé !")
else:
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
return await mySendHidden(ctx, fromSlash, "Rappel non trouvé, pas sur le bon serveur ou qui ne vous appartiens pas.")
@cog_ext.cog_slash(name="reminderdelete", description = "Suppprime un rappel.")
async def __reminderdelete(self, ctx, id):
return await self._reminderdelete(ctx, id, True)

View file

@ -1,11 +1,11 @@
import discord
from discord.ext import commands, tasks
from discord.ext import commands
from random import randint, shuffle
from re import findall
from discord_slash import cog_ext
from utils.reminder import Reminder
from utils.core import map_list_among_us, getURLsInString, getMentionInString, cleanCodeStringWithMentionAndURLs, cleanUser, userOrNick
from utils.core import map_list_among_us, cleanCodeStringWithMentionAndURLs, cleanUser, userOrNick
from utils.core import mySendHidden, mentionToUser, getChangelogs, getActualVersion, isSlash, load, devOrStableChannel
from utils.time import stringTempsVersSecondes, nowUTC, intToDatetime, timedeltaToString, timestampScreen, getAge, ageLayout, nowCustom
from utils.time import nowUTC, intToDatetime, timestampScreen, getAge, ageLayout, nowCustom
def setup(client):
client.add_cog(Utils(client))
@ -249,7 +249,7 @@ class Utils(commands.Cog):
version = f"`{version}`"
if changes[0] == 200:
version = f"[{version}]({changes[1]})"
embed.add_field(name = "Version", value = f"{version} ({devOrStableChannel().replace("main", "stable")})")
embed.add_field(name = "Version", value = f"{version} ({devOrStableChannel().replace('main', 'stable')})")
embed.set_footer(text = f"Basé sur discord.py {discord.__version__}")
try:
if fromSlash != True:
@ -447,194 +447,6 @@ class Utils(commands.Cog):
args = args[:1]
return await self._avis(ctx, args, True)
@commands.command(name='reminder', aliases=["remind", "remindme", "rappel"])
async def _reminder(self, ctx, time, *reminder):
"""Met en place un rappel.\n ➡ Syntaxe: {PREFIX}reminder/remind/remindme/rappel <temps>[@] [message]"""
_, fromSlash, reminder = isSlash(reminder)
if len(reminder) > 0:
reminder = " ".join(reminder)
else:
reminder = None
embed = discord.Embed(color = 0xC41B1B)
extrarg = 0
guildID = ctx.guild.id # can be set to 0 if its a DM message, so it can be see from anywhere
destination = "ici"
if not reminder:
reminder = "Notification"
if time == "help":
seconds = 0
else:
if time.endswith("@"):
time = time[:-1]
extrarg = 1
if time.lower().endswith("p"):
time = time[:-1]
extrarg = 2
guildID = 0
destination = "en MP"
seconds = stringTempsVersSecondes(time)
if type(seconds) != int:
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
return await mySendHidden(ctx, fromSlash, seconds)
if seconds == 0:
embed.add_field(name="Attention", value=
"Format pour le temps : `d` ou `j` pour jour, `h` pour heure, `m` pour minute, `s` pour seconde (légères variances acceptés aussi). \
\nMet un `@` accolée aux temps pour mentionner les gens mentionner dans ton message. \
\nMet un `P` accolée au temps pour que le bot te DM au lieu de t'envoyer un message dans ce salon."
)
elif seconds > (50 * (86400 * 365.242)): # 50 ans
embed.add_field(name="Attention", value="Tu as spécifié une durée trop longue, la durée maximum étant de 50 ans.")
else:
now = int(nowUTC())
messageID = None
if fromSlash != True:
messageID = ctx.message.id
reminderID = Reminder().ajoutReminder(messageID, ctx.channel.id, extrarg, reminder, now, now + seconds, ctx.author.id, guildID)
return await mySendHidden(ctx, fromSlash, f"Ton reminder **`{reminderID[0][0]}`** est enrengistré, je te notifie {destination} dans {timedeltaToString(seconds)} (avec 1m de retard maximum).")
await mySendHidden(ctx, fromSlash, embed = embed)
@_reminder.error
async def _reminder_error(self, ctx, error):
if 'time is a required argument that is missing.' in str(error):
await ctx.send("Tu n'as pas spécifié de durée.")
@cog_ext.cog_slash(name="reminder", description = "Met en place un rappel.")
async def __reminder(self, ctx, time, reminder = None):
if reminder == None:
return await self._reminder(ctx, time, True)
else:
return await self._reminder(ctx, time, reminder, True)
@tasks.loop(minutes = 1)
async def _reminderLoop(self):
"""Méthode qui se répète toute les minutes pour vérifier si des rappels n'ont pas expirés, si expirés, les envoient."""
expiration = Reminder().recuperationExpiration(int(nowUTC())) # on récupères les éléments expirés
for expired in expiration: # on regarde tout les éléments expirés
reminder = expired[2] # message
userID = expired[4] # personne qui a fait le rappel
channel = self.client.get_channel(expired[0]) # salon du message
finalEmbed = discord.Embed(description = cleanCodeStringWithMentionAndURLs(reminder), timestamp = intToDatetime(expired[3]), color = discord.Colour.random())
if expired[1] == 2: # s'il faut envoyer en DM le message
user = self.client.get_user(userID)
if user == None: # si l'utilisateur n'est pas trouvé
return Reminder().suppressionReminder(expired[5]) # suppression du rappel
channel = await user.create_dm() # envoie en DM
userID = None # plus de mention
sourceMessage = None # plus de message source
elif channel == None: # si le salon n'existe plus
user = self.client.get_user(userID)
if user == None: # si l'utilisateur n'est pas trouvé
return Reminder().suppressionReminder(expired[5]) # suppression du rappel
channel = await user.create_dm() # envoie en DM
userID = None # plus de mention
sourceMessage = None # plus de message source
finalEmbed.add_field(name = "Info", value = "Message envoyé en DM car le salon n'est plus disponible.")
else:
sourceMessage = expired[6]
if sourceMessage != None: # vérification message avec slash command et que si c'est pas en DM
try:
sourceMessage = await channel.fetch_message(sourceMessage) # récupération message
except:
sourceMessage = None # message a été supprimé
if sourceMessage != None:
await sourceMessage.add_reaction(emoji = '') # ajout réaction
finalEmbed.set_footer(text=f"Message d'il y a {timedeltaToString(int(nowUTC()) - expired[3])}")
links = ""
findedURLs = getURLsInString(reminder)
for i in range(0, len(findedURLs)): # ajout de field "lien" pour pouvoir cliquer sur les liens facilement
links += f"[Lien {i + 1}]({findedURLs[i]}) · "
if len(findedURLs) > 0:
finalEmbed.add_field(name = f"Lien{'s' if len(findedURLs) > 1 else ''}", value = links[:-3])
message = ""
if userID != None: # metion de l'utilisateur si le message n'est pas en DM
message = f"<@{userID}>"
if expired[1] == 1: # s'il faut mentionner les personnes dans le message
mentionList = getMentionInString(reminder)
for i in mentionList:
message += f" {i}"
try:
await channel.send(message, embed = finalEmbed) # envoie du rappel
except: # les DM sont fermés
pass
Reminder().suppressionReminder(expired[5]) # suppression du rappel
@_reminderLoop.before_loop
async def __avant_reminderLoop(self):
await self.client.wait_until_ready()
@commands.command(name='reminderlist', aliases=["remindlist", "rl", "rappeliste"])
async def _reminderlist(self, ctx, *arg):
"""Affiche la liste des rappels d'un utilisateur.\n ➡ Syntaxe: {PREFIX}reminderlist/rl/remindlist/rappeliste [utilisateur]"""
_, fromSlash, arg = isSlash(arg)
utilisateur = ctx.author.id
page = 1
if len(arg) > 0:
try:
utilisateur = mentionToUser(getMentionInString(arg[0])[0])
except:
try:
page = int(arg[0])
except:
return await mySendHidden(ctx, fromSlash, "Veuillez renseigné un utilisateur ou un numéro de page valide.")
reminders = Reminder().listeReminder(utilisateur, ctx.guild.id)
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
pageMAX = -(-len(reminders) // 5)
embed = discord.Embed(description = f"**Rappel{'s' if len(reminders) > 1 else ''} de <@{utilisateur}>** • Page {page}/{pageMAX}", color = discord.Colour.random())
embed.set_thumbnail(url = self.client.get_user(utilisateur).avatar_url_as(size = 64))
limit = 5 * page
if len(reminders) > 0 and page <= pageMAX:
curseur = limit - 4
for reminder in reminders[limit - 5:]:
if curseur <= limit:
texte = reminder[0]
if len(texte) > 1024:
texte = f"{texte[:1021]}..."
expiration = reminder[2] - int(nowUTC())
if expiration > 0:
expiration = f"Expire dans {timedeltaToString(expiration)}"
else:
expiration = f"A déjà expiré."
embed.add_field(value = texte, name = f"#{reminder[3]} • Fais le {timestampScreen(intToDatetime(reminder[1]))}\n{expiration}", inline = False)
curseur += 1
else:
embed.add_field(name = "\u200b", value = f"L'utilisateur n'a aucun rappel en attente ou page n°{page} vide !")
embed.set_footer(text = "Les rappels qui ont déjà expirés vont apparaître dans quelques instants.\nIls peuvent avoir jusqu'à 1 minute de retard maximum.")
await ctx.send(embed = embed)
@cog_ext.cog_slash(name="reminderlist", description = "Affiche la liste des rappels d'un utilisateur.")
async def __reminderlist(self, ctx, userorpage = None):
if userorpage == None:
return await self._reminderlist(ctx, True)
else:
return await self._reminderlist(ctx, userorpage, True)
@commands.command(name='reminderdelete', aliases=["reminddelete", "rd"])
async def _reminderdelete(self, ctx, *id):
"""Suppprime un rappel.\n ➡ Syntaxe: {PREFIX}reminderdelete/rd <id>"""
id, fromSlash, _ = isSlash(id)
if id:
try:
id = int(id)
except:
return await mySendHidden(ctx, fromSlash, "L'ID renseigné n'est pas valide.")
else:
return await ctx.send("Veuillez renseigner un ID.")
verification = Reminder().appartenanceReminder(ctx.author.id, id, ctx.guild.id)
if verification:
Reminder().suppressionReminder(id)
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
return await ctx.send(f"Reminder **#{id}** supprimé !")
else:
if fromSlash != True:
await ctx.message.add_reaction(emoji = '')
return await mySendHidden(ctx, fromSlash, "Rappel non trouvé, pas sur le bon serveur ou qui ne vous appartiens pas.")
@cog_ext.cog_slash(name="reminderdelete", description = "Suppprime un rappel.")
async def __reminderdelete(self, ctx, id):
return await self._reminderdelete(ctx, id, True)
@commands.command(name='changelogs', aliases=["changelog", "changement", "changements"])
async def _changelogs(self, ctx, *version):
"""Affiche les changements de la dernière version ou d'une version précise.\n ➡ Syntaxe: {PREFIX}changelogs/changelog/changement/changements [version]"""