diff --git a/.github/workflows/codacy-analysis.yml b/.github/workflows/codacy-analysis.yml index f2633e9..4d9b2dc 100644 --- a/.github/workflows/codacy-analysis.yml +++ b/.github/workflows/codacy-analysis.yml @@ -10,9 +10,9 @@ name: Codacy Security Scan on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] jobs: codacy-security-scan: diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8f965ce..3817332 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,12 +13,12 @@ name: "CodeQL" on: push: - branches: [ main ] + branches: [main] pull_request: # The branches below must be a subset of the branches above - branches: [ main ] + branches: [main] schedule: - - cron: '29 1 * * 1' + - cron: "29 1 * * 1" jobs: analyze: @@ -28,40 +28,40 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'python' ] + language: ["python"] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] # Learn more: # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Checkout repository + uses: actions/checkout@v2 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/checks.py b/checks.py index 3f22d95..3937808 100644 --- a/checks.py +++ b/checks.py @@ -21,9 +21,11 @@ creative_designer = 771748500576141332 master_builder = 769659653121900550 server_chat = 769843495045169163 + class no_permission(commands.MissingPermissions): pass - + + def is_staff(): def predicate(ctx): user = ctx.message.author @@ -34,6 +36,7 @@ def is_staff(): raise no_permission(['IS_STAFF_MEMBER']) return commands.check(predicate) + def is_dev(): def predicate(ctx): user = ctx.message.author @@ -43,6 +46,7 @@ def is_dev(): raise no_permission(['BOT_DEVELOPER']) return commands.check(predicate) + def is_mod_or_has_perms(**permissions): def predicate(ctx): user = ctx.message.author @@ -53,6 +57,7 @@ def is_mod_or_has_perms(**permissions): raise no_permission(['IS_MOD_OR_HAS_PERMS']) return commands.check(predicate) + def is_executive(): def predicate(ctx): user = ctx.message.author @@ -63,7 +68,7 @@ def is_executive(): raise no_permission(['IS_EXECUTIVE']) return commands.check(predicate) - + def is_tf_developer(): def predicate(ctx): user = ctx.message.author @@ -74,32 +79,35 @@ def is_tf_developer(): raise no_permission(['IS_TOTALFREEDOM_DEVELOPER']) return commands.check(predicate) + def is_liaison(): def predicate(ctx): user = ctx.message.author for role in user.roles: if role.id == server_liaison: - return True + return True else: raise no_permission(['IS_SERVER_LIAISON']) return commands.check(predicate) + def is_creative_designer(): def predicate(ctx): user = ctx.message.author for role in user.roles: if role.id == creative_designer: - return True + return True else: raise no_permission(['IS_CREATIVE_DESIGNER']) return commands.check(predicate) - + + def is_senior(): def predicate(ctx): user = ctx.message.author for role in user.roles: if role.id == senior_admin: - return True + return True else: raise no_permission(['IS_SENIOR_ADMIN']) return commands.check(predicate) diff --git a/commands/help.py b/commands/help.py index 28065d7..07294f6 100644 --- a/commands/help.py +++ b/commands/help.py @@ -4,12 +4,13 @@ import discord from discord.ext import commands from functions import get_avatar + class Help(commands.Cog): def __init__(self, bot): self.bot = bot self.bot.remove_command('help') - - @commands.command(aliases=['h','?']) + + @commands.command(aliases=['h', '?']) async def help(self, ctx, page=1): 'Displays the help command' em = discord.Embed() @@ -17,12 +18,12 @@ class Help(commands.Cog): command_list = '' cog_list = [c for c in self.bot.cogs.keys()] page_count = math.ceil(len(cog_list) / 4) - + page = int(page) - if page > page_count or page<1: + if page > page_count or page < 1: await ctx.send(f'Page number \'{page}\' not found.') return - + cogs_needed = [] for i in range(4): x = i + (int(page) - 1) * 4 @@ -30,7 +31,7 @@ class Help(commands.Cog): cogs_needed.append(cog_list[x]) except IndexError: pass - + for cog in cogs_needed: command_list = '' for command in self.bot.get_cog(cog).get_commands(): @@ -38,18 +39,20 @@ class Help(commands.Cog): if command.hidden: showcommand = False if command.parent: - showcommand = False + showcommand = False for check in command.checks: try: check(ctx) except: showcommand = False if showcommand: - command_list += f'**{ctx.prefix}{command.name}** - {command.help}\n' + command_list += f'**{ctx.prefix}{command.name}** - {command.help}\n' if command_list: - em.add_field(name=cog, value=command_list, inline=False) - em.set_footer(text=f'Requested by {ctx.message.author}', icon_url=get_avatar(ctx.message.author)) + em.add_field(name=cog, value=command_list, inline=False) + em.set_footer(text=f'Requested by {ctx.message.author}', icon_url=get_avatar( + ctx.message.author)) await ctx.send(embed=em) + def setup(bot): bot.add_cog(Help(bot)) diff --git a/commands/miscellaneous.py b/commands/miscellaneous.py index 83b6915..76e2811 100644 --- a/commands/miscellaneous.py +++ b/commands/miscellaneous.py @@ -10,6 +10,7 @@ from discord.ext import commands from checks import * from functions import * + class Miscellaneous(commands.Cog): def __init__(self, bot): self.bot = bot @@ -22,7 +23,7 @@ class Miscellaneous(commands.Cog): await ctx.send(embed=em) await self.bot.logout() return - + @is_tf_developer() @commands.command() async def telnetconfig(self, ctx, *args): @@ -51,25 +52,29 @@ class Miscellaneous(commands.Cog): else: em.description = 'Configuration successful' em.colour = 0x00FF00 - + elif args[0] == 'test': command = '' for x in range(1, len(args)): command += f'{args[x]} ' time_sent = str(datetime.utcnow().replace(microsecond=0))[11:] - - self.bot.telnet_object.session.write(bytes(command, 'ascii') + b"\r\n") - self.bot.telnet_object.session.read_until(bytes(f'{time_sent} INFO]:', 'ascii'), 2) + + self.bot.telnet_object.session.write( + bytes(command, 'ascii') + b"\r\n") + self.bot.telnet_object.session.read_until( + bytes(f'{time_sent} INFO]:', 'ascii'), 2) if ctx.channel == ctx.guild.get_channel(server_chat): - self.bot.telnet_object.session.read_until(bytes('\r\n', 'ascii'), 2) - next_line = self.bot.telnet_object.session.read_until(bytes('\r\n', 'ascii'), 2) + self.bot.telnet_object.session.read_until( + bytes('\r\n', 'ascii'), 2) + next_line = self.bot.telnet_object.session.read_until( + bytes('\r\n', 'ascii'), 2) em.description = f"Response from server: {next_line.decode('utf-8')}" else: em.description = f'Command **{args[0]}** not found.' em.colour = 0xFF0000 - + await ctx.send(embed=em) - + @is_dev() @commands.command() async def debug(self, ctx, *, cmd): @@ -84,5 +89,6 @@ class Miscellaneous(commands.Cog): await ctx.send(f'''```py {type(e).__name__}: {e}```''') + def setup(bot): bot.add_cog(Miscellaneous(bot)) diff --git a/commands/moderation.py b/commands/moderation.py index 190429e..3dee32e 100644 --- a/commands/moderation.py +++ b/commands/moderation.py @@ -7,11 +7,12 @@ from functions import * muted_role_id = 769659653121900546 + class Moderation(commands.Cog): def __init__(self, bot): self.bot = bot self.moderator_role_id = 769659653129896023 - + @commands.command() @commands.has_permissions(kick_members=True) async def kick(self, ctx, user: discord.Member, *, reason="No reason specified"): @@ -36,7 +37,7 @@ class Moderation(commands.Cog): await ctx.send(embed=discord.Embed(description=f'{user.name} has been unbanned by: {ctx.author.name} for reason: {reason}')) print(f"[{datetime.datetime.utcnow().replace(microsecond=0)} INFO]: [Moderation] Banned {user.name} from {ctx.guild.name}") - @commands.command(aliases=['massdelete','purge']) + @commands.command(aliases=['massdelete', 'purge']) @commands.has_permissions(manage_messages=True) async def prune(self, ctx, msgs): """Purge messages from a channel.""" @@ -50,7 +51,7 @@ class Moderation(commands.Cog): async def mute(self, ctx, member: discord.Member, *, reason=''): """Mutes a member of the server.""" muted_role = ctx.guild.get_role(muted_role_id) - await member.add_roles(muted_role, reason = f'{reason} || by {ctx.author.name}') + await member.add_roles(muted_role, reason=f'{reason} || by {ctx.author.name}') if reason == '': reason = 'No reason specified' await ctx.send(embed=discord.Embed(description=f'{member} muted by: {ctx.author.name} for: {reason}')) @@ -61,20 +62,21 @@ class Moderation(commands.Cog): async def unmute(self, ctx, member: discord.Member, *, reason=''): """Unmutes a member of the server.""" muted_role = ctx.guild.get_role(muted_role_id) - await member.remove_roles(muted_role, reason = f'{reason} || by {ctx.author.name}') + await member.remove_roles(muted_role, reason=f'{reason} || by {ctx.author.name}') await ctx.send(embed=discord.Embed(description=f'{member} unmuted by {ctx.author.name}')) print(f'[{datetime.datetime.utcnow().replace(microsecond=0)} INFO]: [Moderation] Unmuted {member} in {ctx.guild.name}') - + @commands.command() @commands.has_permissions(manage_roles=True) - async def setreaction(self, ctx, role : discord.Role=None, msg : discord.Message=None, emoji=None): - if role and msg and emoji : + async def setreaction(self, ctx, role: discord.Role = None, msg: discord.Message = None, emoji=None): + if role and msg and emoji: await msg.add_reaction(emoji) - self.bot.reaction_roles.append([role.id,msg.id,emoji]) + self.bot.reaction_roles.append([role.id, msg.id, emoji]) data = read_json('config') - data['reaction_roles'].append([role.id,msg.id,emoji]) + data['reaction_roles'].append([role.id, msg.id, emoji]) print(data['reaction_roles']) write_json('config', data) - + + def setup(bot): bot.add_cog(Moderation(bot)) diff --git a/commands/server_commands.py b/commands/server_commands.py index ed41b4f..fca635e 100644 --- a/commands/server_commands.py +++ b/commands/server_commands.py @@ -7,10 +7,11 @@ from datetime import datetime from functions import * from unicode import * + class ServerCommands(commands.Cog): def __init__(self, bot): self.bot = bot - + @commands.command() @is_liaison() async def eventhost(self, ctx, user: discord.Member): @@ -22,7 +23,7 @@ class ServerCommands(commands.Cog): else: await user.add_roles(eventhostrole) await ctx.send(f'```Succesfully added {eventhostrole.name} to {user.name}```') - + @commands.command() @is_creative_designer() async def masterbuilder(self, ctx, user: discord.Member): @@ -34,7 +35,7 @@ class ServerCommands(commands.Cog): else: await user.add_roles(master_builder_role) await ctx.send(f'```Succesfully added {master_builder_role.name} to {user.name}```') - + @commands.command() @is_staff() async def serverban(self, ctx, user: discord.Member): @@ -46,7 +47,7 @@ class ServerCommands(commands.Cog): else: await user.add_roles(serverbannedrole) await ctx.send(f'Added Server Banned role to {user.name}') - + @commands.command() @is_staff() async def start(self, ctx): @@ -55,23 +56,23 @@ class ServerCommands(commands.Cog): try: attempt = hit_endpoint('start') except Exception as e: - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 - em.description='Something went wrong' + em.description = 'Something went wrong' print(f'Error while starting server: {e}') await ctx.send(embed=em) else: if 'error' in attempt.lower(): - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 - em.description=f'{attempt}' + em.description = f'{attempt}' await ctx.send(embed=em) else: em.title = 'Success' em.colour = 0x00FF00 em.description = f'{attempt}' await ctx.send(embed=em) - + @commands.command() async def uptime(self, ctx): "Returns the uptime of the VPS" @@ -79,7 +80,7 @@ class ServerCommands(commands.Cog): em.title = 'VPS Uptime Information' em.description = hit_endpoint('uptime') await ctx.send(embed=em) - + @commands.command() @is_staff() async def stop(self, ctx): @@ -88,23 +89,23 @@ class ServerCommands(commands.Cog): try: attempt = hit_endpoint('stop') except Exception as e: - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 - em.description='Something went wrong' + em.description = 'Something went wrong' print(f'Error while stopping server: {e}') await ctx.send(embed=em) else: if 'error' in attempt.lower(): - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 - em.description=f'{attempt}' + em.description = f'{attempt}' await ctx.send(embed=em) else: em.title = 'Success' em.colour = 0x00FF00 em.description = f'{attempt}' await ctx.send(embed=em) - + @commands.command(aliases=['adminconsole', 'ac']) @is_staff() async def telnet(self, ctx, *args): @@ -114,17 +115,19 @@ class ServerCommands(commands.Cog): for arg in args: command += f'{arg} ' try: - if args[0] in ['mute', 'stfu', 'gtfo', 'ban', 'unban', 'unmute', 'smite', 'noob', 'tban', 'tempban', 'warn', 'mv', 'kick', 'cc','say']: - self.bot.telnet_object.session.write(bytes(command, 'ascii') + b"\r\n") + if args[0] in ['mute', 'stfu', 'gtfo', 'ban', 'unban', 'unmute', 'smite', 'noob', 'tban', 'tempban', 'warn', 'mv', 'kick', 'cc', 'say']: + self.bot.telnet_object.session.write( + bytes(command, 'ascii') + b"\r\n") elif args[0] == 'slconfig': if args[1] not in ['add', 'remove']: raise no_permission(['IS_SENIOR_ADMIN']) else: - self.bot.telnet_object.session.write(bytes(command, 'ascii') + b"\r\n") + self.bot.telnet_object.session.write( + bytes(command, 'ascii') + b"\r\n") else: raise no_permission(['IS_SENIOR_ADMIN']) except Exception as e: - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 em.description = f'{e}' await ctx.send(embed=em) @@ -133,7 +136,7 @@ class ServerCommands(commands.Cog): em.colour = 0x00FF00 em.description = 'Command sent.' await ctx.send(embed=em) - + @commands.command() @is_senior() async def kill(self, ctx): @@ -142,16 +145,16 @@ class ServerCommands(commands.Cog): try: attempt = hit_endpoint('kill') except Exception as e: - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 - em.description='Something went wrong' + em.description = 'Something went wrong' print(f'Error while killing server: {e}') await ctx.send(embed=em) else: if 'error' in attempt.lower(): - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 - em.description='{attempt}' + em.description = '{attempt}' print(f'Error while killing server: {e}') await ctx.send(embed=em) else: @@ -159,19 +162,19 @@ class ServerCommands(commands.Cog): em.colour = 0x00FF00 em.description = f'{attempt}' await ctx.send(embed=em) - - + @commands.command() @is_staff() async def restart(self, ctx): 'Restarts the server' em = discord.Embed() try: - self.bot.telnet_object.session.write(bytes('restart', 'ascii') + b"\r\n") + self.bot.telnet_object.session.write( + bytes('restart', 'ascii') + b"\r\n") except Exception as e: - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 - em.description='Something went wrong' + em.description = 'Something went wrong' print(f'Error while restarting server: {e}') await ctx.send(embed=em) else: @@ -179,17 +182,18 @@ class ServerCommands(commands.Cog): em.colour = 0x00FF00 em.description = 'Server restarting.' await ctx.send(embed=em) - + @commands.command() @is_senior() - async def console(self, ctx,*, command): + async def console(self, ctx, *, command): 'Send a command as console' '''await ctx.send(f'```:[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: {ctx.author.name} issued server command: /{command}```')''' em = discord.Embed() try: - self.bot.telnet_object.session.write(bytes(command, 'ascii') + b"\r\n") + self.bot.telnet_object.session.write( + bytes(command, 'ascii') + b"\r\n") except Exception as e: - em.title='Command error' + em.title = 'Command error' em.colour = 0xFF0000 em.description = f'{e}' await ctx.send(embed=em) @@ -198,13 +202,14 @@ class ServerCommands(commands.Cog): em.colour = 0x00FF00 em.description = 'Command sent.' await ctx.send(embed=em) - + @commands.command(aliases=['status']) async def state(self, ctx): 'Gets the current status of the Server' em = discord.Embed() - try: - requests.get("http://play.totalfreedom.me:28966/list?json=true", timeout=5).json() + try: + requests.get( + "http://play.totalfreedom.me:28966/list?json=true", timeout=5).json() except: em.description = 'Server is offline' em.colour = 0xFF0000 @@ -212,14 +217,15 @@ class ServerCommands(commands.Cog): em.description = 'Server is online' em.colour = 0x00FF00 await ctx.send(embed=em) - + @commands.command(name='list') async def online(self, ctx): 'Gives a list of online players.' em = discord.Embed() em.title = "Player List" - try: - json = requests.get("http://play.totalfreedom.me:28966/list?json=true", timeout=5).json() + try: + json = requests.get( + "http://play.totalfreedom.me:28966/list?json=true", timeout=5).json() if json["online"] == 0: em.description = "There are no online players" else: @@ -230,24 +236,27 @@ class ServerCommands(commands.Cog): rank = rank.split('_') for word in range(len(rank)): rank[word] = rank[word].capitalize() - em = format_list_entry(em, json[rank], f'{" ".join(rank)}') - + em = format_list_entry( + em, json[rank], f'{" ".join(rank)}') + except: em.description = 'Server is offline' await ctx.send(embed=em) + @commands.command() async def ip(self, ctx): 'Returns the server IP' - await ctx.send(embed=discord.Embed(description='play.totalfreedom.me',title='Server IP')) - #pass #discordSRV responds already. - + await ctx.send(embed=discord.Embed(description='play.totalfreedom.me', title='Server IP')) + # pass #discordSRV responds already. + @commands.command() @is_staff() async def archivereports(self, ctx): """Archive all in-game reports older than 24 hours""" count = 0 reports_channel = self.bot.get_channel(reports_channel_id) - archived_reports_channel = self.bot.get_channel(archived_reports_channel_id) + archived_reports_channel = self.bot.get_channel( + archived_reports_channel_id) await ctx.channel.trigger_typing() async for report in reports_channel.history(limit=100): try: @@ -261,7 +270,7 @@ class ServerCommands(commands.Cog): await archived_reports_channel.send("Message archived because it is older than 24 hours", embed=embed) count += 1 await ctx.send("Archived **{}** reports that are older than 24 hours".format(count)) - + @commands.command() @is_mod_or_has_perms() async def fixreports(self, ctx): @@ -275,5 +284,6 @@ class ServerCommands(commands.Cog): fixed += 1 await ctx.send(f'Fixed **{fixed}** reports') + def setup(bot): bot.add_cog(ServerCommands(bot)) diff --git a/config.json b/config.json index 95c95f6..6a179ef 100644 --- a/config.json +++ b/config.json @@ -25,4 +25,4 @@ "\u2705" ] ] -} +} \ No newline at end of file diff --git a/events.py b/events.py index 95c3aed..984d30c 100644 --- a/events.py +++ b/events.py @@ -18,6 +18,7 @@ telnet_username = "root" telnet_password = "root" print = logscript.logging.getLogger().critical + class Events(commands.Cog): def __init__(self, bot): self.bot = bot @@ -31,25 +32,26 @@ class Events(commands.Cog): telnet_password = config['TELNET_PASSWORD'] self.bot.reaction_roles = [] - self.bot.telnet_object = telnet(telnet_ip, telnet_port, telnet_username, telnet_password) + self.bot.telnet_object = telnet( + telnet_ip, telnet_port, telnet_username, telnet_password) self.bot.telnet_object.connect() - + print(f'[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [TELNET] Bot logged into Telnet as: {self.bot.telnet_object.username}') - + reaction_data = read_json('config') self.bot.reaction_roles = reaction_data['reaction_roles'] - + print(f'[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Client] {self.bot.user.name} is online.') game = discord.Game('play.totalfreedom.me') await self.bot.change_presence(status=discord.Status.online, activity=game) - + guildCount = len(self.bot.guilds) print(f'[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Guilds] bot currently in {guildCount} guilds.') for guild in self.bot.guilds: print(f'[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Guilds] Connected to guild: {guild.name}, Owner: {guild.owner}') starttime = datetime.utcnow() global starttime - + '''@commands.Cog.listener() async def on_message(self, message): if message.guild and message.author is message.guild.me and message.channel.id == reports_channel_id: @@ -81,7 +83,7 @@ class Events(commands.Cog): await message.delete() await message.channel.send(f"{message.author.mention} do not post invite links to other discord servers.") return''' - + @commands.Cog.listener() async def on_message_edit(self, before, after): if not isinstance(before.author, discord.Member): @@ -89,24 +91,27 @@ class Events(commands.Cog): if before.guild.id != guild_id: return users = removed_user_mentions(before.mentions, after.mentions) - roles = removed_role_mentions(before.role_mentions, after.role_mentions) + roles = removed_role_mentions( + before.role_mentions, after.role_mentions) if users: users = ", ".join([str(member) for member in users]) if roles: roles = ", ".join([role.name for role in roles]) if not users and not roles: return - embed = discord.Embed(description="In {}".format(before.channel.mention)) + embed = discord.Embed( + description="In {}".format(before.channel.mention)) if users: embed.add_field(name="Users", value=users, inline=True) if roles: embed.add_field(name="Roles", value=roles, inline=True) embed.color = 0xFF0000 embed.title = "Message Edit" - embed.set_footer(text=str(before.author), icon_url=get_avatar(before.author)) + embed.set_footer(text=str(before.author), + icon_url=get_avatar(before.author)) channel = before.guild.get_channel(mentions_channel_id) await channel.send(embed=embed) - + @commands.Cog.listener() async def on_message_delete(self, message): if not isinstance(message.author, discord.Member): @@ -121,17 +126,19 @@ class Events(commands.Cog): roles = ", ".join([role.name for role in message.role_mentions]) if not users and not roles: return - embed = discord.Embed(description="In {}".format(message.channel.mention)) + embed = discord.Embed( + description="In {}".format(message.channel.mention)) if users is not None: embed.add_field(name="Users", value=users, inline=True) if roles is not None: embed.add_field(name="Roles", value=roles, inline=True) embed.color = 0xFF0000 embed.title = "Message Deletion" - embed.set_footer(text=str(message.author), icon_url=get_avatar(message.author)) + embed.set_footer(text=str(message.author), + icon_url=get_avatar(message.author)) channel = message.guild.get_channel(mentions_channel_id) await channel.send(embed=embed) - + @commands.Cog.listener() async def on_command_error(self, ctx, error): em = discord.Embed() @@ -140,14 +147,15 @@ class Events(commands.Cog): em.colour = 0xFF0000 await ctx.send(embed=em) print(f'[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Commands] {ctx.author} (ID: {ctx.author.id}) failed running: {ctx.message.content} in guild: {ctx.guild.name}') - + @commands.Cog.listener() async def on_command_completion(self, ctx): print(f'[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Commands] {ctx.author} (ID: {ctx.author.id}) ran: {ctx.message.content} in guild: {ctx.guild.name}') bot_logs_channel = self.bot.get_channel(bot_logs_channel_id) - log = discord.Embed(title='Logging', description=f'{ctx.author} (ID: {ctx.author.id}) ran: {ctx.message.content}', colour=0xA84300) + log = discord.Embed( + title='Logging', description=f'{ctx.author} (ID: {ctx.author.id}) ran: {ctx.message.content}', colour=0xA84300) await bot_logs_channel.send(embed=log) - + @commands.Cog.listener() async def on_raw_reaction_add(self, payload): if payload.member == self.bot.user: @@ -169,10 +177,11 @@ class Events(commands.Cog): await report.add_reaction(clipboard) elif payload.emoji.name == confirm: embed = report.embeds[0] - archived_reports_channel = self.bot.get_channel(archived_reports_channel_id) + archived_reports_channel = self.bot.get_channel( + archived_reports_channel_id) await report.delete() await archived_reports_channel.send("Handled by " + guild.get_member(payload.user_id).mention, embed=embed) - + @commands.Cog.listener() async def on_raw_reaction_remove(self, payload): if payload.member == self.bot.user: @@ -181,6 +190,7 @@ class Events(commands.Cog): for role_id, msg_id, emoji in self.bot.reaction_roles: if msg_id == payload.message_id and emoji == str(payload.emoji.name): await self.bot.get_guild(payload.guild_id).get_member(payload.user_id).remove_roles(self.bot.get_guild(payload.guild_id).get_role(role_id), reason='reaction') - + + def setup(bot): bot.add_cog(Events(bot)) diff --git a/functions.py b/functions.py index cedacda..964aecb 100644 --- a/functions.py +++ b/functions.py @@ -5,16 +5,20 @@ import requests from discord.ext import commands from checks import * + def format_list_entry(embed, list, name): - embed.add_field(name="{} ({})".format(name, len(list)), value=", ".join(list), inline=False) + embed.add_field(name="{} ({})".format(name, len(list)), + value=", ".join(list), inline=False) return embed - + + def did_mention_other_user(users, author): for user in users: if user is not author: return True return False + def removed_user_mentions(old, new): users = [] for user in old: @@ -22,6 +26,7 @@ def removed_user_mentions(old, new): users.append(user) return users + def removed_role_mentions(old, new): roles = [] for role in old: @@ -29,6 +34,7 @@ def removed_role_mentions(old, new): roles.append(role) return roles + def get_avatar(user, animate=True): if user.avatar_url: avatar = str(user.avatar_url).replace(".webp", ".png") @@ -38,20 +44,24 @@ def get_avatar(user, animate=True): avatar = avatar.replace(".gif", ".png") return avatar + def read_json(file_name): with open(f'/root/totalfreedom/{file_name}.json', 'r') as file: data = json.load(file) return data + def write_json(file_name, data): with open(f'/root/totalfreedom/{file_name}.json', 'w') as file: - json.dump(data,file,indent=4) + json.dump(data, file, indent=4) return data + def hit_endpoint(command): url = [CENSORED_URL] payload = {} headers = {} - response = json.loads(requests.request("GET", url, headers=headers, data = payload, timeout=100).text) + response = json.loads(requests.request( + "GET", url, headers=headers, data=payload, timeout=100).text) return response['response'] diff --git a/logscript.py b/logscript.py index 3dec6b1..d3b0c8e 100644 --- a/logscript.py +++ b/logscript.py @@ -1,3 +1,4 @@ import logging -logging.basicConfig(level=logging.CRITICAL, format='%(message)s',handlers=[logging.FileHandler('log.log', 'a')]) +logging.basicConfig(level=logging.CRITICAL, format='%(message)s', handlers=[ + logging.FileHandler('log.log', 'a')]) diff --git a/main.py b/main.py index c54f7b1..75ce03c 100644 --- a/main.py +++ b/main.py @@ -18,7 +18,8 @@ load_dotenv() botToken = os.getenv('botToken') intents = discord.Intents.all() -bot = commands.Bot(command_prefix=os.getenv('prefix'), description='TotalFreedom bot help command', intents=intents) +bot = commands.Bot(command_prefix=os.getenv('prefix'), + description='TotalFreedom bot help command', intents=intents) extensions = [ @@ -34,9 +35,11 @@ if __name__ == '__main__': for extension in extensions: try: bot.load_extension(extension) - print(f"[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Extensions] {extension} loaded successfully") + print( + f"[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Extensions] {extension} loaded successfully") except Exception as e: - print(f"[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Extensions] {extension} didn't load {e}") + print( + f"[{str(datetime.utcnow().replace(microsecond=0))[11:]} INFO]: [Extensions] {extension} didn't load {e}") @bot.event @@ -54,7 +57,7 @@ async def on_message(message): if role.id in bypass_roles: bypass = True else: - if 'Server has started' in message.content: # Telnet reconnect script + if 'Server has started' in message.content: # Telnet reconnect script try: bot.telnet_object.connect() except Exception as e: @@ -63,12 +66,13 @@ async def on_message(message): try: bot.telnet_object.connect() except Exception as fuckup: - print(f'Second attempt failed to reconnect telnet: {fuckup}') + print( + f'Second attempt failed to reconnect telnet: {fuckup}') if not bypass: if re.search('discord\.gg\/[a-zA-z0-9\-]{1,16}', message.content) or re.search('discordapp\.com\/invite\/[a-z0-9]+/ig', message.content): await message.delete() await message.channel.send(f"{message.author.mention} do not post invite links to other discord servers.") - + if message.content.lower().startswith(os.getenv('prefix')): await bot.process_commands(message) diff --git a/telnet.py b/telnet.py index 2fab3b9..a6d104a 100644 --- a/telnet.py +++ b/telnet.py @@ -2,6 +2,7 @@ import time from telnetlib import Telnet + class telnet: def __init__(self, ip, port, username, password): self.ip = ip @@ -14,10 +15,10 @@ class telnet: for x in username: self.username = username[0] - if b'Username:' in self.session.read_until(b'Username:', timeout = 3): + if b'Username:' in self.session.read_until(b'Username:', timeout=3): time.sleep(0.5) self.session.write(bytes(self.username, 'ascii') + b"\r\n") - if b'Password:' in self.session.read_until(b'Password:', timeout = 3): + if b'Password:' in self.session.read_until(b'Password:', timeout=3): time.sleep(0.5) self.session.write(bytes(self.password, 'ascii') + b"\r\n") else: diff --git a/unicode.py b/unicode.py index d65cf6b..b2e3f46 100644 --- a/unicode.py +++ b/unicode.py @@ -1,4 +1,4 @@ -#straight from the old bot +# straight from the old bot confirm = "✅" clipboard = "📋"