From bab5d68a88df1a5b679fd78e69255c7bffef5e9f Mon Sep 17 00:00:00 2001 From: beacon Date: Sat, 2 Jul 2022 14:28:22 +0300 Subject: [PATCH] most commands moved into cogs --- .idea/discord-bot.iml | 6 +-- cogs/audio.py | 47 +++++++++++++++++++ cogs/general.py | 26 +++++++++++ cogs/info.py | 1 - lib.py | 28 ++++++++++- test.py | 106 ++---------------------------------------- 6 files changed, 104 insertions(+), 110 deletions(-) diff --git a/.idea/discord-bot.iml b/.idea/discord-bot.iml index 4559181..a864fcf 100644 --- a/.idea/discord-bot.iml +++ b/.idea/discord-bot.iml @@ -1,11 +1,7 @@ - - - - - + diff --git a/cogs/audio.py b/cogs/audio.py index febdae1..5218032 100644 --- a/cogs/audio.py +++ b/cogs/audio.py @@ -1,5 +1,7 @@ import logging +import lib +from os import path, makedirs, rename, remove from discord.ext import commands @@ -11,6 +13,51 @@ class Audio(commands.Cog): async def on_ready(self): logging.info(f'Cog {__name__.split(".")[1]} is ready!.') + @commands.command(name="upload_audio") + async def upload_audio(self, ctx, user=None): + user = user or ctx.author + if ctx.author.guild_permissions.administrator or user is ctx.author: + if ctx.message.attachments: + from os import error + if not path.isdir(f'tmp/{user.id}'): + try: + makedirs(f'tmp/{user.id}') + except error as _error: + logging.info(f"Failed to create dir", _error) + if not path.isdir(f'audio/{user.id}'): + try: + makedirs(f'audio/{user.id}') + except error as _error: + logging.info(f"Failed to create dir", _error) + for at in ctx.message.attachments: + import mimetypes + + await at.save(f'tmp/{user.id}/{at.filename}') + guess = mimetypes.guess_type(f'tmp/{user.id}/{at.filename}') + if guess[0]: + from pymediainfo import MediaInfo + file = f'tmp/{user.id}/{at.filename}' + duration = round(MediaInfo.parse(file).tracks[0].duration / 1000) + if duration > 15: + await ctx.reply(f'Audio duration is {duration}, but max is 15') + remove(f'tmp/{user.id}/{at.filename}') + else: + a = lib.DB.read_db(ctx.guild.id, user.id) + if a is None: + audiolist = f'{user.id}/{at.filename}' + else: + audiolist = lib.DB.read_db(ctx.guild.id, user.id) + ", " + f'{user.id}/{at.filename}' + + lib.DB.add_audio(ctx.guild.id, user.id, audiolist) + rename(f'tmp/{user.id}/{at.filename}', f'audio/{user.id}/{at.filename}') + else: + await ctx.reply(f'Failed to find MIME type of {at.filename}', ephemeral=True) + remove(f'tmp/{user.id}/{at.filename}') + else: + await ctx.reply("Has no Attachment", ephemeral=True) + else: + await ctx.reply(f'You`re not admin. You can add audio only for your own account', ephemeral=True) + def setup(bot): # an extension must have a setup function bot.add_cog(Audio(bot)) # adding a cog diff --git a/cogs/general.py b/cogs/general.py index c59d72d..8b864d2 100644 --- a/cogs/general.py +++ b/cogs/general.py @@ -22,6 +22,32 @@ class General(commands.Cog): logging.info(f'Cog {__name__.split(".")[1]} is ready!.') + @commands.Cog.listener() + async def on_guild_join(self, guild): + for g in guild.members: + lib.DB.fill_bd(g.name, g.id, g.bot, g.nick, guild.id) + + @commands.Cog.listener() + async def on_member_join(self, member): + lib.DB.fill_bd(member.name, member.id, member.bot, member.nick, member.guild.id) + + bot_role = lib.Commands.read_json(member.guild.id, 'bot_role') # Get bot role + guest_role = lib.Commands.read_json(member.guild.id, 'guest_role') # Get guest role + + if bot_role and guest_role: + if member.bot == 0: + role = discord.utils.get(member.guild.roles, id=guest_role) + else: + role = discord.utils.get(member.guild.roles, id=bot_role) + logging.info(f"Adding to {member} role {role}") + await member.add_roles(role) + + @commands.Cog.listener() + async def on_member_update(self, before: discord.Member, after: discord.Member): + sql_update_query = f"""UPDATE "{after.guild.id}" set nick = ? where userid = ?""" + data_tuple = (after.nick, before.id) + lib.DB.work_with_db(sql_update_query, data_tuple) + @slash_command( name="info", description="Read list of tracks for user", diff --git a/cogs/info.py b/cogs/info.py index c0be5b9..8f09151 100644 --- a/cogs/info.py +++ b/cogs/info.py @@ -21,7 +21,6 @@ class Bot_info(commands.Cog): description=f"General information on about bot", ) emb.add_field(name="Bot ping", value=f'Bot ping: {round(self.bot.latency * 1000)}', inline=True) - # emb.add_field(name="Roles list", value=f"{roles}", inline=True) emb.set_footer(text="Information requested by: {}".format(ctx.author.display_name)) await ctx.reply(embed=emb, ephemeral=True) diff --git a/lib.py b/lib.py index 9a1e974..154fa2a 100644 --- a/lib.py +++ b/lib.py @@ -1,7 +1,9 @@ import json import logging import sqlite3 -from os import walk, listdir +from os import walk, listdir, path + +DEFAULT_PREFIX = "$" # The prefix you want everyone to have if you don't define your own class DB: @@ -87,6 +89,13 @@ class CogsPrepare: class Commands: + @staticmethod + def chech_json(): + if not path.isfile('prefix.json'): + with open('prefix.json', 'w+') as f: + f.write("") + f.close() + @staticmethod async def set_prefix(ctx, prefix: str): await Commands.write_json(ctx.guild.id, "prefix", prefix) @@ -142,3 +151,20 @@ class Commands: with open('prefix.json', 'w') as _f: json.dump(_json, _f, indent=4) _f.close() + + @staticmethod + def determine_prefix(bot, msg): + guild = msg.guild + with open('prefix.json', 'r', encoding='utf-8') as fp: # Open the JSON + parameter = DEFAULT_PREFIX + try: + _json = json.load(fp) # Load the custom prefixes + except error: + _json = {} + if guild: # If the guild exists + try: + parameter = _json[f"{guild.id}"]["prefix"] # Read prefix from json if is setted up + except error: + pass + return parameter + diff --git a/test.py b/test.py index d17e8d9..3491259 100644 --- a/test.py +++ b/test.py @@ -5,48 +5,22 @@ import threading import discord import lib -from os import path, makedirs, remove, rename +from os import path from discord.ext import commands from dislash import InteractionClient, Option, OptionType, OptionChoice -DEFAULT_PREFIX = "$" # The prefix you want everyone to have if you don't define your own bot_owner = 386629192743256065 - -def determine_prefix(bot, msg): - guild = msg.guild - with open('prefix.json', 'r', encoding='utf-8') as fp: # Open the JSON - parameter = DEFAULT_PREFIX - try: - _json = json.load(fp) # Load the custom prefixes - except error: - _json = {} - if guild: # If the guild exists - try: - parameter = _json[f"{guild.id}"]["prefix"] # Read prefix from json if is setted up - except error: - pass - return parameter - - +lib.Commands.chech_json() intents = discord.Intents.default() intents.members = True -bot = commands.Bot(command_prefix=determine_prefix, guild_subscriptions=True, intents=intents) +bot = commands.Bot(command_prefix=lib.Commands.determine_prefix, guild_subscriptions=True, intents=intents) inter_client = InteractionClient(bot, sync_commands=True) - - threading.current_thread().name = "main" - - logging.basicConfig(stream=sys.stdout, filemode='w', level='INFO', format='%(asctime)s - %(levelname)s - %(threadName)s - %(message)s') -if not path.isfile('prefix.json'): - with open('prefix.json', 'w+') as f: - f.write("") - f.close() - for filename in lib.CogsPrepare.cog_list(): try: bot.load_extension(f'cogs.{filename}') @@ -68,80 +42,6 @@ async def on_ready(): logging.info('We have logged in as {0.user}'.format(bot)) -@bot.event -async def on_guild_join(guild): - for g in guild.members: - lib.DB.fill_bd(g.name, g.id, g.bot, g.nick, guild.id) - - -@bot.event -async def on_member_join(member): - lib.DB.fill_bd(member.name, member.id, member.bot, member.nick, member.guild.id) - - bot_role = lib.Commands.read_json(member.guild.id, 'bot_role') # Get bot role - guest_role = lib.Commands.read_json(member.guild.id, 'guest_role') # Get guest role - - if bot_role and guest_role: - if member.bot == 0: - role = discord.utils.get(member.guild.roles, id=guest_role) - else: - role = discord.utils.get(member.guild.roles, id=bot_role) - logging.info(f"Adding to {member} role {role}") - await member.add_roles(role) - - -@bot.event -async def on_member_update(before: discord.Member, after: discord.Member): - sql_update_query = f"""UPDATE "{after.guild.id}" set nick = ? where userid = ?""" - data_tuple = (after.nick, before.id) - lib.DB.work_with_db(sql_update_query, data_tuple) - - -@bot.command(name="upload_audio") -async def upload_audio(ctx, user=None): - user = user or ctx.author - if ctx.author.guild_permissions.administrator or user is ctx.author: - if ctx.message.attachments: - from os import error - if not path.isdir(f'tmp/{user.id}'): - try: - makedirs(f'tmp/{user.id}') - except error as _error: - logging.info(f"Failed to create dir", _error) - if not path.isdir(f'audio/{user.id}'): - try: - makedirs(f'audio/{user.id}') - except error as _error: - logging.info(f"Failed to create dir", _error) - for at in ctx.message.attachments: - import mimetypes - - await at.save(f'tmp/{user.id}/{at.filename}') - guess = mimetypes.guess_type(f'tmp/{user.id}/{at.filename}') - if guess[0]: - from pymediainfo import MediaInfo - file = f'tmp/{user.id}/{at.filename}' - duration = round(MediaInfo.parse(file).tracks[0].duration / 1000) - if duration > 15: - await ctx.reply(f'Audio duration is {duration}, but max is 15', ephemeral=True) - else: - a = lib.DB.read_db(ctx.guild.id, user.id) - if a is None: - audiolist = f'{user.id}/{at.filename}' - else: - audiolist = lib.DB.read_db(ctx.guild.id, user.id) + ", " + f'{user.id}/{at.filename}' - - lib.DB.add_audio(ctx.guild.id, user.id, audiolist) - rename(f'tmp/{user.id}/{at.filename}', f'audio/{user.id}/{at.filename}') - else: - await ctx.reply(f'Failed to find MIME type of {at.filename}', ephemeral=True) - remove(f'tmp/{user.id}/{at.filename}') - else: - await ctx.reply("Has no Attachment", ephemeral=True) - else: - await ctx.reply(f'You`re not admin. You can add audio only for your own account', ephemeral=True) - - @inter_client.slash_command( name="cog", description="Work with cogs",