diff --git a/LICENSE b/LICENSE.md similarity index 95% rename from LICENSE rename to LICENSE.md index c1713d7..6d6fe21 100644 --- a/LICENSE +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Peter van Arkel +Copyright (c) 2022 - Peter van Arkel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/cogs/admin.py b/cogs/admin.py index f4f3a96..b45adac 100644 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -1,33 +1,62 @@ import discord from discord.ext import commands from logging import getLogger - +import typing +from datetime import timedelta +from discord import User, errors, TextChannel, Forbidden # setup logging log = getLogger(__name__) - embed = discord.Embed() - class Admin(commands.Cog): - def __init__(self, bot): self.bot = bot - - @commands.command() + @commands.command(name='purge', hidden=True) @commands.is_owner() - async def clear(self, ctx, amount=1): - await ctx.channel.purge(limit=amount) - log.warn(f'{ctx.message.author} cleared {amount} messages') - + async def purge(self, ctx, amount=1): + """ Purge messages from current channel""" + await ctx.message.delete() + await ctx.channel.purge(limit = amount) + log.warn(f'{ctx.message.author} purged {amount} messages') + + @commands.command(name='purge_from', hidden=True) + @commands.is_owner() + async def purge_from(self, ctx, message_id: int): + """Purge all messages after the given message.id""" + try: + message = await ctx.channel.fetch_message(message_id) + except errors.NotFound: + log.warn(f'{ctx.message.author} tried purging {message_id}, but id was not found.') + return + await ctx.message.delete() + await ctx.channel.purge(after=message) + log.info(f'{ctx.message.author} purged all messages after {message_id}') + return True + @commands.command(name='purge_user', hidden=True) + @commands.is_owner() + async def purge_user(self, ctx, user: User, num_minutes: typing.Optional[int] = 5): + """Clear all messages of in all channels within the last [n=5] minutes""" + after = ctx.message.created_at - timedelta(minutes=num_minutes) + + def check(msg): + return msg.author.id == user.id + + for channel in await ctx.guild.fetch_channels(): + if type(channel) is TextChannel: + try: + await channel.purge(limit=10*num_minutes, check=check, after=after) + log.info(f'{ctx.message.author} purged all messages from {user.id} that were posted within the last {num_minutes}') + except Forbidden: + continue + @commands.Cog.listener() async def on_ready(self): log.info(f'module active') - -def setup(bot): - bot.add_cog(Admin(bot)) \ No newline at end of file +async def setup(bot): + await bot.add_cog(Admin(bot)) \ No newline at end of file diff --git a/cogs/flair.py b/cogs/flair.py deleted file mode 100644 index e5379e5..0000000 --- a/cogs/flair.py +++ /dev/null @@ -1,52 +0,0 @@ -import discord -from discord.ext import commands -from logging import getLogger -import asyncio - - -# setup logging -log = getLogger(__name__) - - -e = discord.Embed() - - -class Flair(commands.Cog): - """ The Flair functionality enables the user to setup flair for their profile. - - Currently, the flair-roles available are: - - gender pronouns - - willingness to join mature discussions - - whether or not they are open for DMs - - """ - - def __init__(self, bot): - self.bot = bot - self.msg1 = ['✅', '❌', '❔'] - - @commands.command() - async def flair(self, ctx): - msg1 = ( - f'Welkom bij de flair-wizard! Gebruik onderstaande opties om verder te gaan. \n\n' - f'Druk op ✅ als je verder wil gaan met de wizard.\n' - f'Als je niet je flair opnieuw wilt instellen, druk dan op ❌.\n' - f'Gebruik ❔ als je wil weten hoe je via een tekstcommando alles kan instellen.\n\n' - ) - dm = await ctx.author.send(msg1) - log.info(f'{ctx.author} started the flair wizard') - for emoji in self.msg1: - await dm.add_reaction(emoji) - - - @commands.Cog.listener() - async def on_ready(self): - log.info(f'module active') - - -def setup(bot): - bot.add_cog(Flair(bot)) - - - - # numbers_reactions = ['1️⃣', '2️⃣', '3️⃣', '4️⃣', '5️⃣', '6️⃣'] diff --git a/cogs/games.py b/cogs/games.py index ec3a3b4..19d2394 100644 --- a/cogs/games.py +++ b/cogs/games.py @@ -44,5 +44,5 @@ class Games(commands.Cog): log.info(f'module active') -def setup(bot): - bot.add_cog(Games(bot)) \ No newline at end of file +async def setup(bot): + await bot.add_cog(Games(bot)) \ No newline at end of file diff --git a/cogs/gif.py b/cogs/gif.py index edd28fc..c162231 100644 --- a/cogs/gif.py +++ b/cogs/gif.py @@ -63,5 +63,5 @@ class Gif(commands.Cog): log.info(f'module active') -def setup(bot): - bot.add_cog(Gif(bot)) \ No newline at end of file +async def setup(bot): + await bot.add_cog(Gif(bot)) \ No newline at end of file diff --git a/cogs/links.py b/cogs/links.py index d786036..97baa11 100644 --- a/cogs/links.py +++ b/cogs/links.py @@ -32,6 +32,6 @@ class Links(commands.Cog): log.info(f'module active') -def setup(bot): - bot.add_cog(Links(bot)) +async def setup(bot): + await bot.add_cog(Links(bot)) diff --git a/cogs/misc.py b/cogs/misc.py index c3d0137..208504f 100644 --- a/cogs/misc.py +++ b/cogs/misc.py @@ -33,5 +33,5 @@ class Misc(commands.Cog): log.info(f'module active') -def setup(bot): - bot.add_cog(Misc(bot)) \ No newline at end of file +async def setup(bot): + await bot.add_cog(Misc(bot)) \ No newline at end of file diff --git a/cogs/moderator.py b/cogs/moderator.py index 5515552..0bea4eb 100644 --- a/cogs/moderator.py +++ b/cogs/moderator.py @@ -22,5 +22,5 @@ class Moderator(commands.Cog): log.info(f'module active') -def setup(bot): - bot.add_cog(Moderator(bot)) \ No newline at end of file +async def setup(bot): + await bot.add_cog(Moderator(bot)) \ No newline at end of file diff --git a/jeeves.py b/jeeves.py index 8f39e40..19e1892 100755 --- a/jeeves.py +++ b/jeeves.py @@ -7,43 +7,44 @@ import os import log import logging.config from logging import getLogger - +import asyncio # setup root logger handlers logging.config.dictConfig(log.LOGGING) - # setup logging log = getLogger(__name__) - # setup discord.py bot intents = discord.Intents().all() bot = commands.Bot(command_prefix='!', intents=intents) e = discord.Embed() - -@bot.command() +@bot.command(name='load', hidden=True) @commands.has_permissions(administrator=True) async def load(ctx, extension): bot.load_extension(f'cogs.{extension}') log.info(f'{ctx.message.author} loaded the {extension} module') -@bot.command() +@bot.command(name='unload', hidden=True) @commands.has_permissions(administrator=True) async def unload(ctx, extension): bot.unload_extension(f'cogs.{extension}') log.info(f'{ctx.message.author} unloaded the {extension} module') -@bot.command() +@bot.command(name='reload', hidden=True) @commands.has_permissions(administrator=True) async def reload(ctx, extension): bot.unload_extension(f'cogs.{extension}') bot.load_extension(f'cogs.{extension}') log.info(f'{ctx.message.author} reloaded the {extension} module') +async def load_extensions(): + for filename in os.listdir('./cogs'): + if filename.endswith('.py'): + await bot.load_extension(f'cogs.{filename[:-3]}') @bot.event async def on_ready(): @@ -51,12 +52,9 @@ async def on_ready(): activity = discord.Activity(name='!help', type=discord.ActivityType.listening) await bot.change_presence(activity=activity) +async def main(): + async with bot: + await load_extensions() + await bot.start(env.TOKEN) -for filename in os.listdir('./cogs'): - if filename.endswith('.py'): - bot.load_extension(f'cogs.{filename[:-3]}') - - -if __name__ == '__main__': - bot.run(env.TOKEN) - +asyncio.run(main()) \ No newline at end of file diff --git a/jeevesbot/env.py b/jeevesbot/env.py new file mode 100644 index 0000000..206c473 --- /dev/null +++ b/jeevesbot/env.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +### bot settings +# TOKEN = 'ODE5NjMyNDg1MjU5ODA0NzU0.YEpcPA.M-zMGu3BT4QEm9HYKwgiMX3ssEk' #LIVE +TOKEN = 'OTI3NTYyNTIwMTE2NDczODk2.GaZvW-.kmcKCSVrL7Ain4bBufJyZtSSS3Z6rSx7l-cTR0' # TEST + +### channels +# GIFCHANNELS = [724331671020765247,729667183126511617,863879394233942016] #LIVE +GIFCHANNELS = [] #TEST +FLAIR_CHANNEL = 873576604419387413 + + +### roles +ADMIN_ROLE = 'administrator' +BINGOROLE = 'babbelbingo' + + +# 863879394233942016 #overflow-lounge @ LP +# 724331671020765247 #lounge @ LP +# 729667183126511617 #vraag-van-de-dag @ LP + +# 749399756752814105 #general @ TEST +# 776789540978556948 #guest @ TEST + +# 873576604419387413 #flair @ TEST \ No newline at end of file diff --git a/jeevesbot/secret.json b/jeevesbot/secret.json new file mode 100644 index 0000000..2a59c4d --- /dev/null +++ b/jeevesbot/secret.json @@ -0,0 +1,12 @@ +{ + "type": "service_account", + "project_id": "drive-pull-300915", + "private_key_id": "7d615dce3c433ae5d3c8553aa823629c2fc4d4f3", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDmxvsQLYTZCNIc\nkjRUW+asE/mMeXVIT6UL6JBsOF4Q3D1gRZh/69GOs1H/iJ+ZoqZdduwEQT1xH0TN\no/ERzw7dnZAtMXZXliIxXQV7jkSdQ9Kvyw1SfMVWSB2ZqWC+2nOgT9ztcc+5rNSO\n+A+ZgMejUHS7uKFJ69EJhH6YB4ZXL7w8Ty95EtH2OMaqYFICceSmLT91EftRmP/O\nanNjVgnxnc+P3ppg318pbAiF6DzN5wgbuFw3YgaoH1f23M6wq7/s9tLGAe0l0AnM\nOFDOfNZLA8FyLZaqUh+kTQLEyJsKzhR6wyEC7jrMu2qtfNdYFzXSzza+GUc9pemd\nXRx70LmzAgMBAAECggEAVmG2yjhvmJmPpDgptEXuEw0rBKTV/KorOkjj/k4fD6qQ\nor+KNJ+9ge+nSsIGE4jpQuTntTQCXpx4sYyjCKp7gwKeW/w+ssw0okuSaMw47LDd\nZQXZR74CU6iMw969otK8Iw6hwJMwUOzbZ2R82lV05LGR8E5MuRG23hwlEp0GcQ1s\nIOZBe14rkKoBoDrJy9Kh4GBP8TMPrI8XveMfzpVQogCNUZUODu01p59sKUh4LaIx\npRw7GZx0qvs5Fhf5CBaVMH+vvDsRmNSpVZnEoyTJpA1k7+tTgltSr+nhrPc3iWzB\ntqQ9QvzaCYIjbzVTJrbCptGwKyxw804diyaffa6ykQKBgQD5DcLIKKg/4KEDmMiN\nbBNTg2Tt8lLv9JEqcUm4dkg+vc1bi6T2e2f3Ycu129AVIfGTg3JZxg5jLJDIeZx7\nzf2ctNOYhUS56q6ntxXaCeXNBjKPv/NOqh6cgT+XUk573oeR/vwfbxiICqZ6Jx4G\nfix66rpVjv0YeFRsYGsDGDPvywKBgQDtNrng8m9x4Zsz6IYUOhIoydjLDQUvPtz7\nJDkUfSZYzVftVLu3KTZycmgrleUBIZ5IUrW7ld3zkpmnLNfO5KVruehjYZJyUPhD\ns4capE7FTWJzJWeRa3Y89tyFnydZs1UI7GaXTr+ttBXpIfsRIp0K2Ve7OFmN3+hx\nvC1LbOtQuQKBgBmLgckJ8ofqwFkgGKH4zdqpBXcqfbtC+IjD6e3TpAFbcm7LWfY2\nHinPjBdxHlysiJy6xMXUfLFLZuZJIvXH4RVrrrBcKvpuyc9GBiXBEiL/WbxI0enl\npRIkZ6Nbu9UUtA8TekS3HmsFvKGW1YuQ8XsCDG6uJeOWpAIhuZgtqVYVAoGAOPqS\nP4Q8XMByRU+vFSC1x/JkDrH78tNIxVJ4G4HMOjxoyGs4A9D0cR0mBIIm1dS7bmff\nm0VuYNlv6wYMeHfXfD7VoTmIscjdOXXgF/grq5zg7wOnEvkbF528bqRCEXvQCyqt\nod6akCDXun4dDoqf6kE2n5Pzfu6vqNIolxt8kpECgYEAmlwmccOtFDabchU5rxZJ\ngtqW/w1o86+NQE4o6Oq217YXY68PWoc+UgT2F6R5f6fJ3g8w6/1x2NGHMcte6E9/\n8rJT1L/P7dpdOzYWsN3BWlRhc0ICMslj4Aw7FnA+CL1YWSIp4SML/d6SjHBGkt+l\nVLZ4mr7mDtwPZ883nWw56po=\n-----END PRIVATE KEY-----\n", + "client_email": "drive-pull@drive-pull-300915.iam.gserviceaccount.com", + "client_id": "103799335310944603536", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/drive-pull%40drive-pull-300915.iam.gserviceaccount.com" + } \ No newline at end of file