2021-05-28 13:52:37 +02:00
print ( " Chargement des extensions & librairie... " , end = " " )
2020-11-29 11:39:41 +01:00
2021-03-17 20:25:10 +01:00
import discord , re , pytz , os
2020-11-29 11:39:41 +01:00
from discord . ext import commands
2021-02-22 03:03:47 +01:00
from random import choice
from datetime import datetime
2020-11-29 11:39:41 +01:00
from pytz import timezone
2021-05-07 16:44:47 +02:00
customPrefix = os . environ [ ' PREFIX ' ]
2021-05-13 08:36:42 +02:00
customTimezone = os . environ [ ' TIMEZONE ' ]
2020-11-29 11:39:41 +01:00
2021-05-07 16:44:47 +02:00
client = commands . Bot ( command_prefix = customPrefix , case_insensitive = True , intents = discord . Intents . all ( ) )
2020-11-29 11:39:41 +01:00
2020-12-16 19:26:51 +01:00
client . load_extension ( " cogs.help " )
client . load_extension ( " cogs.utils " )
client . load_extension ( " cogs.internet " )
client . load_extension ( " cogs.music " )
client . load_extension ( " cogs.games " )
client . load_extension ( " cogs.fun " )
client . load_extension ( " cogs.autopublish " )
2021-05-15 20:07:49 +02:00
client . load_extension ( " cogs.school " )
2021-05-28 13:52:37 +02:00
print ( " Terminé ! " )
2020-12-16 19:26:51 +01:00
2020-11-29 11:39:41 +01:00
@client.event
async def on_connect ( ) :
2021-05-28 13:52:37 +02:00
print ( f " Connecté ! " )
2020-11-29 11:39:41 +01:00
@client.event
async def on_ready ( ) :
2021-05-07 16:48:40 +02:00
await client . change_presence ( status = discord . Status . online , activity = discord . Activity ( name = f " { customPrefix } help " , type = discord . ActivityType . playing ) )
2020-11-29 11:39:41 +01:00
print ( " Bot prêt. " )
channel = client . get_channel ( 742564480050790512 )
await channel . send ( " Le bot a bien démarré. " )
@client.event
async def on_member_join ( member ) :
if member . guild . id == 441208120644075520 : # Confrérie du Kassoulait
if member . bot == True :
role = discord . utils . get ( member . guild . roles , name = " Bot " )
else :
role = discord . utils . get ( member . guild . roles , name = " Copain " )
await member . add_roles ( role )
try :
await member . send ( f " Coucou ** { member . name } ** sur { member . guild . name } ! 🥰 \n \n Tu as le rôle ** { role } ** 💖! " )
except :
pass
channel = client . get_channel ( 741639570172674120 ) # salons des arrivées
2021-02-22 04:15:07 +01:00
switch = [
f " Bienvenue, { member . mention } . On espère que tu as apporté de la pizza. " ,
f " C ' est un plaisir de te voir, { member . mention } . " ,
f " { member . mention } vient juste d ' arriver ! " ,
f " { member . mention } vient juste d ' atterrir. " ,
f " { member . mention } vient de se glisser dans le serveur. " ,
f " { member . mention } a bondi dans le serveur. " ,
f " Contents de te voir, { member . mention } . " ,
f " { member . mention } est arrivé(e). " ,
f " Tout le monde, accueillez comme il se doit { member . mention } ! " ,
f " Youhou, tu as réussi, { member . mention } ! " ,
f " { member . mention } a rejoint le groupe. "
]
2020-11-29 11:39:41 +01:00
message = await channel . send ( " ... " ) # évite d'envoyer une notification
await message . edit ( content = choice ( switch ) )
@client.event
async def on_member_remove ( member ) :
if member . guild . id == 441208120644075520 : # Confrérie du Kassoulait
channel = client . get_channel ( 741639570172674120 ) # salons des arrivées
await channel . send ( f " { member . mention } vient de quitter le serveur. " )
@client.event
async def on_raw_reaction_add ( payload ) :
if payload . message_id == 644922358745792512 : # Règles de la Confrérie du Kassoulait
if payload . emoji . name == ' ✅ ' :
role = discord . utils . get ( payload . member . guild . roles , name = " règles-acceptés " )
await payload . member . add_roles ( role )
@client.event
async def on_raw_reaction_remove ( payload ) :
if payload . message_id == 644922358745792512 : # Règles de la Confrérie du Kassoulait
if payload . emoji . name == ' ✅ ' :
guild = discord . utils . find ( lambda g : g . id == payload . guild_id , client . guilds )
member = discord . utils . find ( lambda m : m . id == payload . user_id , guild . members )
role = discord . utils . get ( guild . roles , name = " règles-acceptés " )
await member . remove_roles ( role )
@client.event
async def on_command_error ( ctx , error ) :
if not ctx . invoked_with . startswith ( ' . ' ) :
print ( error )
2020-12-23 01:37:12 +01:00
await ctx . message . add_reaction ( emoji = ' ❓ ' )
2020-11-29 11:39:41 +01:00
@client.event
async def on_message ( message ) :
await client . process_commands ( message )
if message . author == client . user :
return
if client . user . mention == message . content . replace ( " ! " , " " ) :
ctx = await client . get_context ( message )
prefix = await client . get_prefix ( message )
await ctx . send ( f " >>> Coucou ! \n Mon préfix est ` { prefix } ` et ma commande d ' aide est ` { prefix } help` " )
urls = re . findall ( r ' http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!* \ ( \ ),]|(?: % [0-9a-fA-F][0-9a-fA-F]))+ ' , message . content )
for i in range ( len ( urls ) ) :
if urls [ i ] . startswith ( " https://discordapp.com/channels/ " ) or urls [ i ] . startswith ( " https://discord.com/channels/ " ) or urls [ i ] . startswith ( " https://ptb.discordapp.com/ " ) :
link = urls [ i ]
linkURL = link
if link . startswith ( " https://discord.com/channels/ " ) :
link = f ' 000 { link } '
if link . startswith ( " https://ptb.discordapp.com/ " ) :
link = link [ 4 : ]
if " @me " in urls [ i ] :
return await message . channel . send ( " Je ne cite pas les messages privés. " , delete_after = 5 )
try :
if int ( link [ 32 : - 38 ] ) == message . guild . id :
msgID = await client . get_channel ( int ( link [ 51 : - 19 ] ) ) . fetch_message ( int ( link [ 70 : ] ) )
2020-12-11 12:29:28 +01:00
couleur = 0x2f3136
2021-02-22 05:25:04 +01:00
msgFiles = msgID . attachments
imageExtensions = [ " jpg " , " jpeg " , " png " , " webp " , " gif " ]
2021-02-22 05:30:41 +01:00
desc = msgID . content
2021-02-22 05:25:04 +01:00
if len ( msgFiles ) > 1 :
listOfFiles = " "
for i in range ( 0 , len ( msgFiles ) ) :
listOfFiles = f " { listOfFiles } , { msgFiles [ i ] . filename } "
listOfFiles = listOfFiles [ 2 : ]
if len ( msgID . content ) > 0 :
desc = f " { msgID . content } \n \n Il y a plusieurs fichiers dans ce message : { listOfFiles } "
else :
desc = f " Il y a plusieurs fichiers dans ce message : { listOfFiles } "
2020-11-29 11:39:41 +01:00
else :
2021-02-22 05:25:04 +01:00
if len ( msgFiles ) == 1 :
if msgFiles [ 0 ] . filename [ - 4 : ] . split ( ' . ' ) [ 1 ] in imageExtensions :
2021-02-22 05:30:41 +01:00
if not len ( msgID . content ) > 0 :
2021-02-22 05:25:04 +01:00
desc = f " Une image jointe : { msgFiles [ 0 ] . filename } "
else :
linkFile = msgFiles [ 0 ] . url
2021-02-22 05:30:41 +01:00
if not len ( msgID . content ) > 0 :
2021-02-22 05:25:04 +01:00
desc = f " Un fichier joint : { msgFiles [ 0 ] . filename } "
embed = discord . Embed ( description = desc , colour = couleur )
2020-12-11 12:29:28 +01:00
auteur = " Auteur "
if message . author == msgID . author :
auteur = " Auteur & Citateur "
embed . add_field ( name = auteur , value = msgID . author . mention , inline = True )
2021-02-22 05:25:04 +01:00
try :
if len ( msgFiles ) == 1 :
if msgFiles [ 0 ] . filename [ - 4 : ] . split ( ' . ' ) [ 1 ] in imageExtensions :
embed . set_image ( url = msgFiles [ 0 ] . url )
else :
embed . add_field ( name = " Fichier " , value = f " [Lien]( { linkFile } ) " , inline = True )
except :
pass
2020-12-23 00:47:29 +01:00
embed . add_field ( name = " Message " , value = f " { msgID . channel . mention } - [Lien Message]( { linkURL } ) " , inline = True )
2020-11-29 11:39:41 +01:00
embed . set_author ( name = " Citation " , icon_url = msgID . author . avatar_url )
icon_url = message . author . avatar_url
2021-03-28 01:38:28 +01:00
date_1 = goodTimezone ( msgID . created_at , 0 )
2020-11-29 11:39:41 +01:00
edit = " "
if msgID . edited_at :
2021-03-28 01:38:28 +01:00
date_edit = goodTimezone ( msgID . edited_at , 0 )
2021-05-13 09:44:17 +02:00
edit = f " et modifié le { date_edit [ 0 ] [ 8 : ] } / { date_edit [ 0 ] [ 5 : - 3 ] } / { date_edit [ 0 ] [ : 4 ] } à { date_edit [ 1 ] } "
2021-03-27 00:02:01 +01:00
messageDuBas = f " Posté le { date_1 [ 0 ] [ 8 : ] } / { date_1 [ 0 ] [ 5 : - 3 ] } / { date_1 [ 0 ] [ : 4 ] } à { date_1 [ 1 ] } { edit } "
2020-11-29 11:39:41 +01:00
2021-03-28 01:38:28 +01:00
date_2 = goodTimezone ( message . created_at , 0 )
2020-11-29 11:39:41 +01:00
date_2 = f " { date_2 [ 0 ] [ 8 : ] } / { date_2 [ 0 ] [ 5 : - 3 ] } / { date_2 [ 0 ] [ : 4 ] } à { date_2 [ 1 ] } "
2020-12-11 12:29:28 +01:00
if auteur == " Auteur " :
2021-03-27 00:02:01 +01:00
messageDuBas = messageDuBas + f " \n Cité par { user_or_nick ( message . author ) } le { date_2 } "
embed . set_footer ( icon_url = icon_url , text = messageDuBas )
2020-11-29 11:39:41 +01:00
if message . content == linkURL . replace ( ' ' , ' ' ) :
2021-02-22 04:19:36 +01:00
await message . channel . send ( embed = embed )
2020-11-29 11:39:41 +01:00
await message . delete ( )
2021-02-22 04:19:36 +01:00
else :
2021-05-28 13:29:52 +02:00
await message . reply ( embed = embed , mention_author = False )
2020-11-29 11:39:41 +01:00
except Exception as e :
e = str ( e )
if not " invalid literal for int() with base 10: " in e or not " 404 Not Found (error code: 10008) " in e : # faute de frappe / message supprimé
print ( e )
@client.event
async def on_message_delete ( message ) :
if message . author . guild . id == 441208120644075520 : # Confrérie du Kassoulait
prefix = await client . get_prefix ( message )
if not (
message . content . startswith ( f " { prefix } note " ) or
message . content . startswith ( f " { prefix } memo " ) or
len ( re . findall ( " .com/channels/ " , message . content ) ) != 0 or
client . user . id is message . author . id
) :
user_suppressed = None
async for entry in message . guild . audit_logs ( limit = 1 ) :
if ( datetime . now ( ) - entry . created_at ) . seconds < 5 and str ( entry . action ) == ' AuditLogAction.message_delete ' :
user_suppressed = entry . user
channel = client . get_channel ( 742588187456831659 )
embed = discord . Embed ( description = f " { message . content } " )
embed . set_author ( name = user_or_nick ( message . author ) , icon_url = message . author . avatar_url )
if not user_suppressed :
2021-05-13 08:36:42 +02:00
embed . set_footer ( text = f " Channel: # { message . channel . name } | Date : { goodTimezone ( message . created_at , 1 ) } \n Supprimé le { datetime . now ( pytz . timezone ( customTimezone ) ) . strftime ( ' %d / % m/ % Y à % H: % M: % S ' ) } " )
2020-11-29 11:39:41 +01:00
else :
2021-05-13 08:36:42 +02:00
embed . set_footer ( icon_url = user_suppressed . avatar_url , text = f " Channel: # { message . channel . name } | Date : { goodTimezone ( message . created_at , 1 ) } \n Supprimé par { user_or_nick ( user_suppressed ) } le { datetime . now ( pytz . timezone ( customTimezone ) ) . strftime ( ' %d / % m/ % Y à % H: % M: % S ' ) } " )
2020-11-29 11:39:41 +01:00
await channel . send ( embed = embed )
# ne fonctionne pas quand un message a été supprimé avant que le bot ai démarré
# info sur la personne qui a supprimé ne fonctionne pas si il a supprimé un message auparavant (les logs se rajoute a un log deja existant)
def user_or_nick ( user ) :
if user . nick :
return f " { user . nick } ( { user . name } # { user . discriminator } ) "
else :
return f " { user . name } # { user . discriminator } "
2021-03-28 01:38:28 +01:00
def goodTimezone ( date , type ) :
if type == 0 :
2021-05-13 08:36:42 +02:00
return str ( pytz . timezone ( customTimezone ) . fromutc ( date ) ) [ : - 13 ] . replace ( ' - ' , ' / ' ) . split ( )
2021-03-28 01:38:28 +01:00
elif type == 1 :
2021-05-13 08:36:42 +02:00
return str ( pytz . timezone ( customTimezone ) . fromutc ( date ) ) [ : - 13 ] . replace ( ' - ' , ' / ' ) . replace ( ' ' , ' à ' )
2021-03-28 01:38:28 +01:00
2021-05-28 13:52:37 +02:00
print ( " Connexion à Discord... " , end = " " )
2021-03-17 20:25:10 +01:00
client . run ( os . environ [ ' TOKEN_DISCORD ' ] )