Bot base version bump

This commit is contained in:
Suwako Moriya 2019-03-02 22:05:15 +01:00
parent ea6e11745c
commit 333ac8b732
7 changed files with 94 additions and 78 deletions

26
main.py
View File

@ -6,21 +6,21 @@ import traceback
import discord import discord
client = discord.Client() client = discord.Client()
prefix = ";" prefix = ';'
modules = {} # format : {'modulename':[module, initializedclass]} modules = {} # format : {'modulename':[module, initializedclass]}
owners = [281166473102098433, 318866596502306816, 436105272310759426] owners = [281166473102098433, 318866596502306816, 436105272310759426]
async def auth(user, moduleName): async def auth(user, module_name):
if user.id in owners: if user.id in owners:
return True return True
try: try:
modules[moduleName][1].authlist modules[module_name][1].authlist
except: except:
return True return True
for guild in client.guilds: for guild in client.guilds:
if guild.get_member(user.id): if guild.get_member(user.id):
for roleid in modules[moduleName][1].authlist: for roleid in modules[module_name][1].authlist:
if roleid in [r.id for r in guild.get_member(user.id).roles]: if roleid in [r.id for r in guild.get_member(user.id).roles]:
return True return True
@ -31,7 +31,7 @@ async def on_ready():
panic = False panic = False
error = None error = None
async def panicLoad(): async def panic_load():
print("--PANIC LOAD--") print("--PANIC LOAD--")
panic = True panic = True
modules = {} modules = {}
@ -43,13 +43,13 @@ async def on_ready():
except: except:
print("[ERROR] Le module {0} n'a pas pu être chargé.".format(filename)) print("[ERROR] Le module {0} n'a pas pu être chargé.".format(filename))
# initialisation # initialisation
for moduleName in list(modules.keys()): for module_name in list(modules.keys()):
try: try:
modules[moduleName].append(modules[moduleName][0].MainClass(client, modules, owners, prefix)) modules[module_name].append(modules[module_name][0].MainClass(client, modules, owners, prefix))
print("Module {0} initialisé.".format(moduleName)) print("Module {0} initialisé.".format(module_name))
except: except:
print("[ERROR] Le module {0} n'a pas pu être initialisé.".format(moduleName)) print("[ERROR] Le module {0} n'a pas pu être initialisé.".format(module_name))
modules.pop(moduleName, None) modules.pop(module_name, None)
if 'modules.py' in os.listdir('modules'): if 'modules.py' in os.listdir('modules'):
try: try:
@ -64,14 +64,14 @@ async def on_ready():
error = e error = e
except Exception as e: except Exception as e:
print("[ERROR] Le module {0} n'a pas pu être initialisé.".format('modules')) print("[ERROR] Le module {0} n'a pas pu être initialisé.".format('modules'))
await panicLoad() await panic_load()
error = e error = e
except Exception as e: except Exception as e:
print("[ERROR] Le module {0} n'a pas pu être chargé.".format('modules.py')) print("[ERROR] Le module {0} n'a pas pu être chargé.".format('modules.py'))
await panicLoad() await panic_load()
error = e error = e
else: else:
await panicLoad() await panic_load()
if panic: if panic:
for moduleName in list(modules.keys()): for moduleName in list(modules.keys()):

View File

@ -1,5 +1,4 @@
# dummy module class MainClass:
class MainClass():
def __init__(self, client, modules, owners, prefix): def __init__(self, client, modules, owners, prefix):
self.client = client self.client = client
self.modules = modules self.modules = modules

View File

@ -11,33 +11,33 @@ import discord
moduleFiles = "errors" moduleFiles = "errors"
class MainClass(): class MainClass:
def saveObject(self, object, objectname): def save_object(self, object_instance, object_name):
with open("storage/%s/" % moduleFiles + objectname + "tmp", "wb") as pickleFile: with open("storage/%s/" % moduleFiles + object_name + "tmp", "wb") as pickleFile:
pickler = pickle.Pickler(pickleFile) pickler = pickle.Pickler(pickleFile)
pickler.dump(object) pickler.dump(object_instance)
call(['mv', "storage/%s/" % moduleFiles + objectname + "tmp", "storage/%s/" % moduleFiles + objectname]) call(['mv', "storage/%s/" % moduleFiles + object_name + "tmp", "storage/%s/" % moduleFiles + object_name])
def loadObject(self, objectname): def load_object(self, objectname):
if self.saveExists(objectname): if self.save_exists(objectname):
with open("storage/%s/" % moduleFiles + objectname, "rb") as pickleFile: with open("storage/%s/" % moduleFiles + objectname, "rb") as pickleFile:
unpickler = pickle.Unpickler(pickleFile) unpickler = pickle.Unpickler(pickleFile)
return unpickler.load() return unpickler.load()
def saveExists(self, objectname): def save_exists(self, objectname):
return os.path.isfile("storage/%s/" % moduleFiles + objectname) return os.path.isfile("storage/%s/" % moduleFiles + objectname)
def __init__(self, client, modules, owners, prefix): def __init__(self, client, modules, owners, prefix):
if not os.path.isdir("storage/%s" % moduleFiles): if not os.path.isdir("storage/%s" % moduleFiles):
call(['mkdir', 'storage/%s' % moduleFiles]) call(['mkdir', 'storage/%s' % moduleFiles])
self.errorsDeque = None self.errorsDeque = None
self.devchanids = [549662392120901633] self.developpement_chan_id = [549662392120901633]
self.memes = [ self.memes = [
"https://cdn.discordapp.com/avatars/436105272310759426/6e6850c03fba976f45295a76410a6699.png?size=64", "https://cdn.discordapp.com/avatars/436105272310759426/6e6850c03fba976f45295a76410a6699.png?size=64",
"https://cdn.discordapp.com/avatars/281166473102098433/6e92bff42c9f409334e1580c9f666228.png?size=64", "https://cdn.discordapp.com/avatars/281166473102098433/6e92bff42c9f409334e1580c9f666228.png?size=64",
"https://cdn.discordapp.com/avatars/318866596502306816/8e1792132f5b9ceaca6f7aea1fd489f0.png?size=64" "https://cdn.discordapp.com/avatars/318866596502306816/8e1792132f5b9ceaca6f7aea1fd489f0.png?size=64"
] ]
self.icon = "https://moriya.zapto.org/avatars/5?s=140" self.icon = "https://cdn.discordapp.com/attachments/340620490009739265/431569015664803840/photo.png"
self.client = client self.client = client
self.modules = modules self.modules = modules
self.owners = owners self.owners = owners
@ -48,7 +48,7 @@ class MainClass():
self.name = "Error Handling" self.name = "Error Handling"
self.description = "Module de gestions des erreurs" self.description = "Module de gestions des erreurs"
self.interactive = True self.interactive = True
self.authlist = [] self.super_users_list = [431043517217898496]
self.color = 0xdb1348 self.color = 0xdb1348
self.help = """\ self.help = """\
</prefix>licorne </prefix>licorne
@ -56,8 +56,8 @@ class MainClass():
""" """
async def on_ready(self): async def on_ready(self):
if self.saveExists('errorsDeque'): if self.save_exists('errorsDeque'):
self.errorsDeque = self.loadObject('errorsDeque') self.errorsDeque = self.load_object('errorsDeque')
else: else:
self.errorsDeque = collections.deque() self.errorsDeque = collections.deque()
for i in range(len(self.errorsDeque)): for i in range(len(self.errorsDeque)):
@ -68,7 +68,7 @@ class MainClass():
await delete_message.delete() await delete_message.delete()
except: except:
raise raise
self.saveObject(self.errorsDeque, 'errorsDeque') self.save_object(self.errorsDeque, 'errorsDeque')
async def on_message(self, message): async def on_message(self, message):
5 / 0 5 / 0
@ -76,37 +76,37 @@ class MainClass():
async def on_error(self, event, *args, **kwargs): async def on_error(self, event, *args, **kwargs):
embed = discord.Embed(title="Aïe :/", description="```PYTHON\n{0}```".format(traceback.format_exc()), embed = discord.Embed(title="Aïe :/", description="```PYTHON\n{0}```".format(traceback.format_exc()),
color=self.color).set_image(url=random.choice(self.memes)) color=self.color).set_image(url=random.choice(self.memes))
messagelst = None message_list = None
try: try:
message = await args[0].channel.send( message = await args[0].channel.send(
embed=embed.set_footer(text="Ce message s'autodétruira dans une minute.", icon_url=self.icon)) embed=embed.set_footer(text="Ce message s'autodétruira dans une minute.", icon_url=self.icon))
messagelst = [message.channel.id, message.id] message_list = [message.channel.id, message.id]
self.errorsDeque.append(messagelst) self.errorsDeque.append(message_list)
except: except:
try: try:
message = args[1].channel.send( message = args[1].channel.send(
embed=embed.set_footer(text="Ce message s'autodétruira dans une minute.", icon_url=self.icon)) embed=embed.set_footer(text="Ce message s'autodétruira dans une minute.", icon_url=self.icon))
messagelst = [message.channel.id, message.id] message_list = [message.channel.id, message.id]
self.errorsDeque.append(messagelst) self.errorsDeque.append(message_list)
except: except:
pass pass
for chanid in self.devchanids: for chanid in self.developpement_chan_id:
try: try:
await self.client.get_channel(chanid).send( await self.client.get_channel(chanid).send(
embed=embed.set_footer(text="Ce message ne s'autodétruira pas.", icon_url=self.icon)) embed=embed.set_footer(text="Ce message ne s'autodétruira pas.", icon_url=self.icon))
except: except:
pass pass
self.saveObject(self.errorsDeque, 'errorsDeque') self.save_object(self.errorsDeque, 'errorsDeque')
await asyncio.sleep(60) await asyncio.sleep(60)
try: try:
channel = self.client.get_channel(messagelst[0]) channel = self.client.get_channel(message_list[0])
delete_message = await channel.get_message(messagelst[1]) delete_message = await channel.get_message(message_list[1])
await delete_message.delete() await delete_message.delete()
except: except:
raise raise
finally: finally:
try: try:
self.errorsDeque.remove(messagelst) self.errorsDeque.remove(message_list)
except: except ValueError:
pass pass
self.saveObject(self.errorsDeque, 'errorsDeque') self.save_object(self.errorsDeque, 'errorsDeque')

View File

@ -1,8 +1,7 @@
# dummy module
import os import os
class MainClass(): class MainClass:
def __init__(self, client, modules, owners, prefix): def __init__(self, client, modules, owners, prefix):
self.client = client self.client = client
self.modules = modules self.modules = modules
@ -27,12 +26,12 @@ class MainClass():
async def on_message(self, message): async def on_message(self, message):
args = message.content.split(' ') args = message.content.split(' ')
if len(args) == 2 and args[1] == 'update': if len(args) == 2 and args[1] == 'update':
with os.popen('git fetch --all') as stdin: with os.popen('git fetch --all') as std_out:
await message.channel.send(stdin.read()) await message.channel.send(std_out.read())
with os.popen('git symbolic-ref HEAD 2>/dev/null') as stdin: with os.popen('git symbolic-ref HEAD 2>/dev/null') as std_out:
branch = stdin.read().replace('refs/heads/', '') branch = std_out.read().replace('refs/heads/', '')
with os.popen('git reset --hard origin/%s' % branch) as stdin: with os.popen('git reset --hard origin/%s' % branch) as std_out:
await message.channel.send(stdin.read()) await message.channel.send(std_out.read())
await message.channel.send(message.author.mention + ", Le dépôt a été mis à jour (fetch + reset --hard).") await message.channel.send(message.author.mention + ", Le dépôt a été mis à jour (fetch + reset --hard).")
else: else:
await self.modules['help'][1].send_help(message.channel, self) await self.modules['help'][1].send_help(message.channel, self)

View File

@ -1,8 +1,8 @@
import discord import discord
class MainClass(): class MainClass:
async def auth(self, user, moduleName): def auth(self, user, moduleName):
if user.id in self.owners: if user.id in self.owners:
return True return True
try: try:
@ -11,8 +11,8 @@ class MainClass():
return True return True
for guild in self.client.guilds: for guild in self.client.guilds:
if guild.get_member(user.id): if guild.get_member(user.id):
for roleid in self.modules[moduleName][1].authlist: for role_id in self.modules[moduleName][1].authlist:
if roleid in [r.id for r in guild.get_member(user.id).roles]: if role_id in [r.id for r in guild.get_member(user.id).roles]:
return True return True
def __init__(self, client, modules, owners, prefix): def __init__(self, client, modules, owners, prefix):
@ -43,31 +43,36 @@ class MainClass():
if len(args) == 2 and args[1] == 'list': if len(args) == 2 and args[1] == 'list':
embed = discord.Embed(title="[Aide] - Liste des modules", color=self.color) embed = discord.Embed(title="[Aide] - Liste des modules", color=self.color)
for moduleName in list(self.modules.keys()): for moduleName in list(self.modules.keys()):
if self.modules[moduleName][1].interactive and await self.auth(message.author, moduleName): if self.modules[moduleName][1].interactive and \
self.auth(message.author, moduleName):
embed.add_field(name=moduleName.capitalize(), value=self.modules[moduleName][1].description) embed.add_field(name=moduleName.capitalize(), value=self.modules[moduleName][1].description)
await message.channel.send(embed=embed) await message.channel.send(embed=embed)
elif len(args) == 2 and args[1] in list(self.modules.keys()) and self.modules[args[1]][ elif len(args) == 2 and args[1] in list(self.modules.keys()) and \
1].interactive and await self.auth(message.author, args[1]): self.modules[args[1]][1].interactive and \
self.auth(message.author, args[1]):
await message.channel.send(embed=discord.Embed(title="[{0}] - Aide".format(args[1].capitalize()), await message.channel.send(embed=discord.Embed(title="[{0}] - Aide".format(args[1].capitalize()),
description=self.modules[args[1]][1].help.replace( description=self.modules[args[1]][1].help.replace(
"</prefix>", self.prefix), "</prefix>", self.prefix),
color=self.modules[args[1]][1].color)) color=self.modules[args[1]][1].color)
)
elif len(args) == 2 and args[1] == 'all': elif len(args) == 2 and args[1] == 'all':
async with message.channel.typing(): async with message.channel.typing():
for moduleName in list(self.modules.keys()): for moduleName in list(self.modules.keys()):
if self.modules[moduleName][1].interactive and await self.auth(message.author, moduleName): if self.modules[moduleName][1].interactive and \
self.auth(message.author, moduleName):
await message.channel.send( await message.channel.send(
embed=discord.Embed(title="[{0}] - Aide".format(moduleName.capitalize()), embed=discord.Embed(title="[{0}] - Aide".format(moduleName.capitalize()),
description=self.modules[moduleName][1].help.replace("</prefix>", description=self.modules[moduleName][1].help.replace("</prefix>",
self.prefix), self.prefix),
color=self.modules[moduleName][1].color)) color=self.modules[moduleName][1].color)
)
else: else:
await self.modules['help'][1].send_help(message.channel, self) await self.modules['help'][1].send_help(message.channel, self)
async def send_help(self, channel, module): async def send_help(self, channel, module):
moduleName = None moduleName = None
for name, listpck in self.modules.items(): for name, list_module_instance in self.modules.items():
if module == listpck[1]: if module == list_module_instance[1]:
moduleName = name moduleName = name
break break
await channel.send(embed=discord.Embed(title="[{0}] - Aide".format(moduleName.capitalize()), await channel.send(embed=discord.Embed(title="[{0}] - Aide".format(moduleName.capitalize()),

View File

@ -10,7 +10,7 @@ temp_dir = "temp_load"
moduleFiles = "modules" moduleFiles = "modules"
class MainClass(): class MainClass:
def __init__(self, client, modules, owners, prefix): def __init__(self, client, modules, owners, prefix):
if os.path.exists("storage/" + moduleFiles + "/" + temp_dir): if os.path.exists("storage/" + moduleFiles + "/" + temp_dir):
shutil.rmtree("storage/" + moduleFiles + "/" + temp_dir) shutil.rmtree("storage/" + moduleFiles + "/" + temp_dir)
@ -60,7 +60,9 @@ class MainClass():
if len(args) == 2 and args[1] == 'list': if len(args) == 2 and args[1] == 'list':
await message.channel.send(embed=discord.Embed(title="[Modules] - Modules list", await message.channel.send(embed=discord.Embed(title="[Modules] - Modules list",
description="```PYTHON\n{0}```".format( description="```PYTHON\n{0}```".format(
str(self.states).replace(',', '\n,')))) str(self.states).replace(',', '\n,'))
)
)
elif len(args) == 3 and args[1] in ['enable', 'disable', 'reload']: elif len(args) == 3 and args[1] in ['enable', 'disable', 'reload']:
if args[1] == 'enable': if args[1] == 'enable':
for moduleName in args[2].split(','): for moduleName in args[2].split(','):
@ -81,8 +83,9 @@ class MainClass():
for moduleName in args[2].split(','): for moduleName in args[2].split(','):
if moduleName == 'modules': if moduleName == 'modules':
await message.channel.send( await message.channel.send(
message.author.mention + ", le module {0} ne peut pas être désactivé car il est nécéssaire pour gérer les modules.".format( message.author.mention + ", le module {0} ne peut pas être désactivé car il est nécéssaire "
moduleName)) "pour gérer les modules.".format(moduleName)
)
else: else:
if moduleName + '.py' in os.listdir('modules'): if moduleName + '.py' in os.listdir('modules'):
self.unload_module(moduleName) self.unload_module(moduleName)
@ -95,8 +98,9 @@ class MainClass():
for moduleName in args[2].split(','): for moduleName in args[2].split(','):
if moduleName == 'modules': if moduleName == 'modules':
await message.channel.send( await message.channel.send(
message.author.mention + ", le module {0} ne peut pas être rechargé car il est nécéssaire pour gérer les modules.".format( message.author.mention + ", le module {0} ne peut pas être rechargé car il est nécéssaire "
moduleName)) "pour gérer les modules.".format(moduleName)
)
else: else:
if moduleName in self.modules.keys(): if moduleName in self.modules.keys():
self.unload_module(moduleName) self.unload_module(moduleName)
@ -114,10 +118,13 @@ class MainClass():
error = e error = e
await message.channel.send( await message.channel.send(
message.author.mention + ", le module {0} **n'a pas pu être activé**".format( message.author.mention + ", le module {0} **n'a pas pu être activé**".format(
moduleName)) moduleName)
)
else: else:
await message.channel.send( await message.channel.send(
message.author.mention + ", le module {0} n'existe pas.".format(moduleName)) message.author.mention + ", le module {0} n'existe pas.".format(moduleName)
)
else: else:
await self.modules['help'][1].send_help(message.channel, self) await self.modules['help'][1].send_help(message.channel, self)
if error: if error:
@ -140,14 +147,15 @@ class MainClass():
def load_module(self, moduleName): def load_module(self, moduleName):
if moduleName + ".py" in os.listdir('modules'): if moduleName + ".py" in os.listdir('modules'):
if not moduleName in list(self.states.keys()) or self.states[moduleName] == 'not loaded': if moduleName not in list(self.states.keys()) or self.states[moduleName] == 'not loaded':
try: try:
tmpstr = str( new_file_name = str(
"storage/" + moduleFiles + "/" + temp_dir + "/" + moduleName + "-%s.py") % random.randint(1, "storage/" +
100000000000000000000000000000000) moduleFiles + "/" +
shutil.copy2("modules/%s.py" % moduleName, tmpstr) temp_dir + "/" + moduleName + "-%s.py") % random.randint(1, 100000000000000000000000000000000)
shutil.copy2("modules/%s.py" % moduleName, new_file_name)
time.sleep(0.1) time.sleep(0.1)
self.modules.update({moduleName: [importlib.import_module(tmpstr.replace('/', '.')[:-3:])]}) self.modules.update({moduleName: [importlib.import_module(new_file_name.replace('/', '.')[:-3:])]})
print("Module {0} chargé.".format(moduleName)) print("Module {0} chargé.".format(moduleName))
self.states[moduleName] = 'loaded' self.states[moduleName] = 'loaded'
except: except:

View File

@ -1,4 +1,4 @@
class MainClass(): class MainClass:
def __init__(self, client, modules, owners, prefix): def __init__(self, client, modules, owners, prefix):
self.client = client self.client = client
self.modules = modules self.modules = modules
@ -17,5 +17,10 @@ class MainClass():
""" """
async def on_message(self, message): async def on_message(self, message):
await message.channel.send(message.author.mention + ", Le bot va redémarrer...") args = message.content.split(" ")
await self.client.logout() if args[0] == '%srestart' % self.prefix:
if 'py' in args:
await message.channel.send(message.author.mention + ", Le bot va redémarrer...")
await self.client.logout()
else:
await self.modules['help'][1].send_help(message.channel, self)