From 336ca7c4251a5d9b8b4c341d92a532df77710a8e Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 17:00:23 +0100 Subject: [PATCH 01/11] Added init files --- cogs/__init__.py | 0 datahandler/__init__.py | 0 helpfunctions/__init__.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 cogs/__init__.py create mode 100644 datahandler/__init__.py create mode 100644 helpfunctions/__init__.py diff --git a/cogs/__init__.py b/cogs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/datahandler/__init__.py b/datahandler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/helpfunctions/__init__.py b/helpfunctions/__init__.py new file mode 100644 index 0000000..e69de29 From 1feac5f50c47b33bc2c5779fc0300333ed0138dc Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 17:01:30 +0100 Subject: [PATCH 02/11] Bumped discord.py 1.7.3 -> 2.1.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 8d8c667..e25d3ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,3 @@ -discord==1.7.3 +discord.py==2.1.0 emoji==1.6.3 requests==2.22.0 From cba2ca9f3cdf5371010fcfe6ef58ab0a750bc5cd Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 17:03:48 +0100 Subject: [PATCH 03/11] Reoading cogs is now asynchronous --- cogs/commandgiverole.py | 8 +++----- cogs/commandlistener.py | 35 ++++++++++++++--------------------- cogs/commandmod.py | 4 ++-- cogs/commandmodserver.py | 4 ++-- cogs/commandowner.py | 22 +++++++++------------- cogs/commandpoll.py | 4 ++-- cogs/commandsubroutine.py | 14 +++++--------- cogs/commandsubserver.py | 7 +++---- cogs/commanduser.py | 8 +++----- main.py | 24 ++++++++++++++++++------ 10 files changed, 61 insertions(+), 69 deletions(-) diff --git a/cogs/commandgiverole.py b/cogs/commandgiverole.py index f75ea6d..945f1af 100644 --- a/cogs/commandgiverole.py +++ b/cogs/commandgiverole.py @@ -342,9 +342,7 @@ def search_table(self, channel_id, message_id): table_temp = self.get_table_content(table_name) table_mid = table_temp["messageid"] table_cid = table_temp["channelid"] - if str(channel_id) == str(table_cid) and str(message_id) == str( - table_mid - ): + if str(channel_id) == str(table_cid) and str(message_id) == str(table_mid): table_content = table_temp break return table_content @@ -462,5 +460,5 @@ def check_content_table(self, content): return (True, None) -def setup(bot): - bot.add_cog(Commandgiverole(bot)) +async def setup(bot): + await bot.add_cog(Commandgiverole(bot)) diff --git a/cogs/commandlistener.py b/cogs/commandlistener.py index ba03ac2..798f628 100644 --- a/cogs/commandlistener.py +++ b/cogs/commandlistener.py @@ -23,9 +23,7 @@ def __init__(self, bot): @commands.Cog.listener() async def on_command_error(self, ctx, error): - print( - "Ignoring exception in command {}:".format(ctx.command), file=sys.stderr - ) + print("Ignoring exception in command {}:".format(ctx.command), file=sys.stderr) traceback.print_exception( type(error), error, error.__traceback__, file=sys.stderr ) @@ -61,8 +59,7 @@ async def on_member_join(self, member): Creates a welcome message in the log channel """ - channel = self.bot.get_channel( - int(self.jh.getFromConfig("logchannel"))) + channel = self.bot.get_channel(int(self.jh.getFromConfig("logchannel"))) guild = self.bot.get_guild(int(self.jh.getFromConfig("guild"))) await channel.send(f"Hey **{member.mention}**, welcome to {guild}") @@ -81,8 +78,7 @@ async def on_member_remove(self, member): Sends a goodbye message in the log channel """ - channel = self.bot.get_channel( - int(self.jh.getFromConfig("logchannel"))) + channel = self.bot.get_channel(int(self.jh.getFromConfig("logchannel"))) guild = self.bot.get_guild(int(self.jh.getFromConfig("guild"))) await channel.send( f"**{member.name}** has left {guild}. Press F to pay respect." @@ -210,8 +206,7 @@ async def on_raw_reaction_add(self, payload): not (message.author.bot or payload.member.bot) and self.jh.getFromConfig("log") == "True" ): - self.jh.addReactionXP( - payload.user_id, self.xpf.randomRange(1, 5)) + self.jh.addReactionXP(payload.user_id, self.xpf.randomRange(1, 5)) self.jh.saveData() # When a user changes his voice state @@ -247,10 +242,7 @@ async def on_voice_state_update(self, member, before, after): and before.channel.name[-1].isdigit() ): # Member left first channel - if ( - before.channel.name[-1] == "1" - and not before.channel.name[-2].isdigit() - ): + if before.channel.name[-1] == "1" and not before.channel.name[-2].isdigit(): # Delete last channel, which has no user in it channelWithoutNumber = before.channel.name[:-1] @@ -302,8 +294,7 @@ async def on_voice_state_update(self, member, before, after): # in it if afterNumber and len( find( - lambda c: c.name == ( - channelWithoutNumber + "1"), allChannel + lambda c: c.name == (channelWithoutNumber + "1"), allChannel ).members ): # Get channels with after.channel.name without numbers in it and end @@ -363,9 +354,9 @@ async def on_message(self, message): a = "" + message.content # Stops user from writting in levelchannel none command messages - if str(message.channel.id) == str( - self.jh.getFromConfig("levelchannel") - ) and a[0] != self.jh.getFromConfig("command_prefix"): + if str(message.channel.id) == str(self.jh.getFromConfig("levelchannel")) and a[ + 0 + ] != self.jh.getFromConfig("command_prefix"): await message.delete() return @@ -404,7 +395,9 @@ async def on_message(self, message): + str(message.author.name) + "tried to invoke a command in " + str(channelName) - + ".\n# Command: {a}\n######" + + ".\n# Command: " + + a + + "\n######" ) await self.utils.log(string, 2) @@ -437,5 +430,5 @@ def _getLeaderboardChange(self, message): return i -def setup(bot): - bot.add_cog(Commandlistener(bot)) +async def setup(bot): + await bot.add_cog(Commandlistener(bot)) diff --git a/cogs/commandmod.py b/cogs/commandmod.py index f41fc12..6cb8f76 100644 --- a/cogs/commandmod.py +++ b/cogs/commandmod.py @@ -342,5 +342,5 @@ async def printData(self, ctx): await ctx.send(f"```{message}```") -def setup(bot): - bot.add_cog(Commandmod(bot)) +async def setup(bot): + await bot.add_cog(Commandmod(bot)) diff --git a/cogs/commandmodserver.py b/cogs/commandmodserver.py index d4f8555..55027e2 100644 --- a/cogs/commandmodserver.py +++ b/cogs/commandmodserver.py @@ -46,5 +46,5 @@ def __init__(self, bot): Commandmodserver.utils = self.utils -def setup(bot): - bot.add_cog(Commandmodserver(bot)) +async def setup(bot): + await bot.add_cog(Commandmodserver(bot)) diff --git a/cogs/commandowner.py b/cogs/commandowner.py index 501aa75..0d5d298 100644 --- a/cogs/commandowner.py +++ b/cogs/commandowner.py @@ -1,6 +1,6 @@ import os -from discord import InvalidArgument +from discord import NotFound from discord.ext import commands from helpfunctions.decorators import isBotOwnerCommand @@ -87,9 +87,7 @@ async def stoplog(self, ctx): guildName = str(self.bot.get_guild(guildID)) self.jh.config["log"] = "False" self.jh.saveConfig() - await self.utils.log( - f"Stopped to log users from Server:\n\t{guildName}", 2 - ) + await self.utils.log(f"Stopped to log users from Server:\n\t{guildName}", 2) else: await ctx.send("Bot is NOT logging. Logging state: False") @@ -139,7 +137,7 @@ async def addReaction(self, ctx, channelID, messageID, emoji): return try: await message.add_reaction(emoji) - except InvalidArgument: + except NotFound: await ctx.send("No vaild emoji was sent by user.") @commands.command(name="rlext") @@ -161,19 +159,17 @@ async def reloadExtensions(self, ctx, *extensions): [ "cogs." + ext[:-3] for ext in os.listdir("./") - if ext.endswith(".py") + if ext.endswith(".py") and not ext.startswith("__") ] ) reloadedExtensions = [] for ext in extensions: if ext in self.bot.extensions: - self.bot.unload_extension(ext) - self.bot.load_extension(ext) + await self.bot.unload_extension(ext) + await self.bot.load_extension(ext) reloadedExtensions.append(ext) - await self.utils.log( - f"Reloaded extensions: {', '.join(reloadedExtensions)}", 2 - ) + await self.utils.log(f"Reloaded extensions: {', '.join(reloadedExtensions)}", 2) -def setup(bot): - bot.add_cog(Commandowner(bot)) +async def setup(bot): + await bot.add_cog(Commandowner(bot)) diff --git a/cogs/commandpoll.py b/cogs/commandpoll.py index 0e151a1..4057c71 100644 --- a/cogs/commandpoll.py +++ b/cogs/commandpoll.py @@ -635,5 +635,5 @@ def votedOption(self, message): return i -def setup(bot): - bot.add_cog(Commandpoll(bot)) +async def setup(bot): + await bot.add_cog(Commandpoll(bot)) diff --git a/cogs/commandsubroutine.py b/cogs/commandsubroutine.py index 2a5317f..a2925f1 100644 --- a/cogs/commandsubroutine.py +++ b/cogs/commandsubroutine.py @@ -133,9 +133,7 @@ async def removeRoleSubroutineFunction(self, currentTime, bufferTime, guild): log_message, 2, ) - if ( - currentTime - offset - ) % interval < bufferTime and currentTime > offset: + if (currentTime - offset) % interval < bufferTime and currentTime > offset: role = guild.get_role(int(toRemove)) if role is None: log_message = ( @@ -236,8 +234,7 @@ def addMembersOnlineVoiceXp(self, serverid): # Total all connected members for channel in voiceChanels: membersInChannel = [ - member for member in channel.members if not member.bot - ] + member for member in channel.members if not member.bot] # Check if more than one person is in channel if len(membersInChannel) >= 2: membersNotMutedOrBot = [ @@ -246,8 +243,7 @@ def addMembersOnlineVoiceXp(self, serverid): if not (member.voice.self_mute or member.bot) ] self.jh.addAllUserVoice( - [member.id for member in membersNotMutedOrBot] - ) + [member.id for member in membersNotMutedOrBot]) # Extra XP membersStreamOrVideo = [ member @@ -281,5 +277,5 @@ async def levelAkk(self): ) -def setup(bot): - bot.add_cog(Subroutine(bot)) +async def setup(bot): + await bot.add_cog(Subroutine(bot)) diff --git a/cogs/commandsubserver.py b/cogs/commandsubserver.py index 3a22a27..50182c2 100644 --- a/cogs/commandsubserver.py +++ b/cogs/commandsubserver.py @@ -658,8 +658,7 @@ def get_all_subserver_roles(self): # Sort by subserver name. '+ r.name[1]' is for sorting sub roles on top of # subway roles, since '+ r.name[1]' is 'u' or 'w'. sorted_roles = sorted( - sub_roles, key=lambda r: r.name.split("-")[1] + r.name[1] - ) + sub_roles, key=lambda r: r.name.split("-")[1] + r.name[1]) if not sorted_roles: return [] # Data pattern: [(sub-a, sw-a), ...] @@ -809,5 +808,5 @@ def hash_invite_code(self, subserver_name): return code[:8] -def setup(bot): - bot.add_cog(Commandsubserver(bot)) +async def setup(bot): + await bot.add_cog(Commandsubserver(bot)) diff --git a/cogs/commanduser.py b/cogs/commanduser.py index 4935224..4dbab36 100644 --- a/cogs/commanduser.py +++ b/cogs/commanduser.py @@ -502,9 +502,7 @@ async def textunban(self, ctx, userID): f"User {ctx.author.mention} textunbaned {user.mention}" ) else: - await ctx.send( - content="ERROR: User has no textban.", delete_after=3600 - ) + await ctx.send(content="ERROR: User has no textban.", delete_after=3600) """ # When give star of the week should be queued @@ -752,5 +750,5 @@ async def reclaimData(self, ctx, voice, text, textCount, code, hash): """ -def setup(bot): - bot.add_cog(Commanduser(bot)) +async def setup(bot): + await bot.add_cog(Commanduser(bot)) diff --git a/main.py b/main.py index e7eacd7..8687e56 100644 --- a/main.py +++ b/main.py @@ -10,14 +10,24 @@ exit() import os +import asyncio from datahandler.jsonhandle import Jsonhandle +async def load_extension(bot): + print("[Startup] Loading Commands...") + for ext in os.listdir("./cogs/"): + if ext.endswith(".py") and not ext.startswith("__"): + await bot.load_extension("cogs." + ext[:-3]) + + print("[Startup] Commands loaded.") + + def start_bot(): print("[Startup] Prepare to start Bot...") - jh = Jsonhandel() + jh = Jsonhandle() intents = discord.Intents.default() intents.presences = True @@ -29,12 +39,14 @@ def start_bot(): jh.config["log"] = "False" jh.saveConfig() print("[Startup] Set log to False.") - print("[Startup] Loading Commands...") - for ext in os.listdir("./cogs/"): - if ext.endswith(".py"): - bot.load_extension("cogs." + ext[:-3]) - print("[Startup] Commands loaded.") + loop = asyncio.new_event_loop() + asyncio.set_event_loop(loop) + try: + loop.run_until_complete(load_extension(bot)) + finally: + loop.close() + asyncio.set_event_loop(None) print("[Startup] Starting Bot...") bot.run(jh.getFromConfig("token")) From 76b7c2bfb3d400faae327863d43b7da599bf650c Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 17:05:00 +0100 Subject: [PATCH 04/11] Output of what commands where invoked is now better readable in discord --- cogs/commandlistener.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cogs/commandlistener.py b/cogs/commandlistener.py index 798f628..8fdf996 100644 --- a/cogs/commandlistener.py +++ b/cogs/commandlistener.py @@ -391,13 +391,13 @@ async def on_message(self, message): except Exception: channelName = "DM" string = ( - "\n######\n# User " + "\n```User " + str(message.author.name) + "tried to invoke a command in " + str(channelName) - + ".\n# Command: " + + ".\nCommand: " + a - + "\n######" + + "```\n" ) await self.utils.log(string, 2) From f0f182be5c32549367e7f4066253649c68ebdbde Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 17:43:03 +0100 Subject: [PATCH 05/11] Now bots gets all intents --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 8687e56..66d7257 100644 --- a/main.py +++ b/main.py @@ -29,7 +29,7 @@ def start_bot(): jh = Jsonhandle() - intents = discord.Intents.default() + intents = discord.Intents.all() intents.presences = True intents.members = True bot = commands.Bot( From 09a29c926ce262defa78df610163e505c7688b6e Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 17:44:27 +0100 Subject: [PATCH 06/11] Changed 'User.avatar_url' to 'User.avatar' as in https://discordpy.readthedocs.io/en/stable/migrating.html\#major-webhook-changes --- cogs/commandlistener.py | 3 ++- cogs/commanduser.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cogs/commandlistener.py b/cogs/commandlistener.py index 8fdf996..da427b0 100644 --- a/cogs/commandlistener.py +++ b/cogs/commandlistener.py @@ -91,7 +91,7 @@ async def on_member_remove(self, member): [hash, code] = self.utils.hashData(voice, text, textCount, member.id) #Send user data embed = discord.Embed(title=f"{member.nick} ({member.name})", color=12008408) - embed.set_thumbnail(url=member.avatar_url) + embed.set_thumbnail(url=member.avatar) embed.add_field(name="VoiceXP", value=f"{voice}", inline=True) embed.add_field(name="TextXP", value=f"{text}", inline=True) embed.add_field(name="TextMessages", value=f"{textCount}", inline=True) @@ -354,6 +354,7 @@ async def on_message(self, message): a = "" + message.content # Stops user from writting in levelchannel none command messages + print(a) if str(message.channel.id) == str(self.jh.getFromConfig("levelchannel")) and a[ 0 ] != self.jh.getFromConfig("command_prefix"): diff --git a/cogs/commanduser.py b/cogs/commanduser.py index 4dbab36..274f643 100644 --- a/cogs/commanduser.py +++ b/cogs/commanduser.py @@ -645,7 +645,7 @@ async def getLevel(self, ctx, *inputs): return self.jh.addNewDataEntry(userID) # Create Embeded - avatar_url = member.avatar_url + avatar_url = member.avatar level = self.jh.getUserLevel(userID) voiceXP = self.jh.getUserVoice(userID) textXP = self.jh.getUserText(userID) From 84cabc940377b261d266e85130b2cc06b1314b56 Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 19:33:25 +0100 Subject: [PATCH 07/11] Check all areas which could get unwanted Thread object back instead of a TextChannel --- cogs/commandmod.py | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/cogs/commandmod.py b/cogs/commandmod.py index 6cb8f76..25a717c 100644 --- a/cogs/commandmod.py +++ b/cogs/commandmod.py @@ -101,27 +101,32 @@ async def addtextwhitelist(self, ctx, channelID=None): Adds channel to whitelist, so users can get XP in the channel. """ guild = self.bot.get_guild(self.jh.getFromConfig("guild")) + # This does not include threads channels = self.bot.guilds[0].text_channels # When channelID is not given, use ctx.channel.id. if not channelID: channelID = ctx.channel.id - # Test if channel is in Server - if str(channelID) in [str(channel.id) for channel in channels]: - # Try to write in whitelist - if self.jh.writeToWhitelist(channelID): - channelName = str(self.bot.get_channel(int(channelID))) - message = ( - "Added " - + str(channelName) - + " with ID " - + str(channelID) - + " to whitelist. This Text channel will be logged." - ) - else: - message = "Channel is already in whitelist." + channel_to_add = ctx.channel else: + channel_to_add = self.bot.get_channel(int(channelID)) + + if not str(channelID) in [str(channel.id) for channel in channels]: + # Test if channel is in Server message = f"Channel is not in the server {str(guild)}" await self.utils.log(f"{message} from user {ctx.author}", 2) + + elif self.jh.writeToWhitelist(channelID): + # Try to write in whitelist + channelName = channel_to_add.name + message = ( + "Added " + + str(channelName) + + " with ID " + + str(channelID) + + " to whitelist. This Text channel will be logged." + ) + else: + message = "Channel is already in whitelist." await ctx.send(message) @textwl.command(name="rm", brief="Removes a text channel from the whitelist") From b12fd42c32e684ba97b27e2933d2f45cb86577c1 Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 19:57:25 +0100 Subject: [PATCH 08/11] Fixed bug where 'textwl' and 'voicebl' do not output guild name --- cogs/commandmod.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cogs/commandmod.py b/cogs/commandmod.py index 25a717c..4dad562 100644 --- a/cogs/commandmod.py +++ b/cogs/commandmod.py @@ -100,7 +100,7 @@ async def addtextwhitelist(self, ctx, channelID=None): Adds channel to whitelist, so users can get XP in the channel. """ - guild = self.bot.get_guild(self.jh.getFromConfig("guild")) + guild = self.bot.get_guild(int(self.jh.getFromConfig("guild"))) # This does not include threads channels = self.bot.guilds[0].text_channels # When channelID is not given, use ctx.channel.id. @@ -112,7 +112,7 @@ async def addtextwhitelist(self, ctx, channelID=None): if not str(channelID) in [str(channel.id) for channel in channels]: # Test if channel is in Server - message = f"Channel is not in the server {str(guild)}" + message = f"Channel is not in the server {guild.name}" await self.utils.log(f"{message} from user {ctx.author}", 2) elif self.jh.writeToWhitelist(channelID): @@ -229,7 +229,7 @@ async def addblacklist(self, ctx, channelID): Adds channel to whitelist, so users can not get XP in the channel. """ - guild = self.bot.get_guild(self.jh.getFromConfig("guild")) + guild = self.bot.get_guild(int(self.jh.getFromConfig("guild"))) channels = self.bot.guilds[0].voice_channels # Test if channel is in Server if str(channelID) in [str(channel.id) for channel in channels]: @@ -246,7 +246,7 @@ async def addblacklist(self, ctx, channelID): else: message = "Channel is already in blacklist." else: - message = f"Channel is not in the server {str(guild)}" + message = f"Channel is not in the server {guild.name}" await self.utils.log(f"{message} from user {ctx.author}", 2) await ctx.send(message) From 92a42b0543ecf21ca582119f8cf5063eb25c9333 Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 19:58:01 +0100 Subject: [PATCH 09/11] Made start script executable --- startbot.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 startbot.sh diff --git a/startbot.sh b/startbot.sh old mode 100644 new mode 100755 From 535ae643417bd434a17a81491b1143697ef847e2 Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 20:07:47 +0100 Subject: [PATCH 10/11] Starting bot asynchronously instead of blocking --- main.py | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index 66d7257..fcc8e57 100644 --- a/main.py +++ b/main.py @@ -24,7 +24,7 @@ async def load_extension(bot): print("[Startup] Commands loaded.") -def start_bot(): +async def start_bot(): print("[Startup] Prepare to start Bot...") jh = Jsonhandle() @@ -40,17 +40,11 @@ def start_bot(): jh.saveConfig() print("[Startup] Set log to False.") - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - try: - loop.run_until_complete(load_extension(bot)) - finally: - loop.close() - asyncio.set_event_loop(None) + await load_extension(bot) print("[Startup] Starting Bot...") - bot.run(jh.getFromConfig("token")) + await bot.start(jh.getFromConfig("token")) if __name__ == "__main__": - start_bot() + asyncio.run(start_bot()) From 86096cfdf232dac9b33b98ad5e10369a69686f5e Mon Sep 17 00:00:00 2001 From: Aaron Neugebauer Date: Sun, 1 Jan 2023 20:08:08 +0100 Subject: [PATCH 11/11] Bumped bot version --- cogs/commandlistener.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/commandlistener.py b/cogs/commandlistener.py index da427b0..8701ea2 100644 --- a/cogs/commandlistener.py +++ b/cogs/commandlistener.py @@ -48,7 +48,7 @@ async def on_ready(self): # Sends message to mods, when bot is online print("Now Online") await self.utils.sendModsMessage( - "Bot is now online.\nVersion:\tDiscordBot DataBot v2.0.1" + "Bot is now online.\nVersion:\tDiscordBot DataBot v2.1.0" ) # When a member joins a guild