From a1b47248e370221d47c1572019cde306f9fd7cac Mon Sep 17 00:00:00 2001 From: Peter van Arkel Date: Thu, 23 Mar 2023 10:16:12 +0100 Subject: [PATCH 1/4] No quotes in list --- jeevesbot/env.py.dist | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jeevesbot/env.py.dist b/jeevesbot/env.py.dist index 687a788..dbb6a0f 100644 --- a/jeevesbot/env.py.dist +++ b/jeevesbot/env.py.dist @@ -2,7 +2,7 @@ TOKEN = 'discord-bot-token-here' ADMIN_ROLE = 'role-to-exclude-from-gifbot' -GIFCHANNELS = 'add-channel-ids-for-bot-to-work-in' -BOTCHANNEL = ['add id of bot channel'] -FLAIRROLES = ['add list of role ids to correspond to the emoji'] -FLAIRROLE = ['add id of flair separator role'] \ No newline at end of file +GIFCHANNELS = [add-channel-ids-for-bot-to-work-in] +BOTCHANNEL = [add id of bot channel] +FLAIRROLES = [add list of role ids to correspond to the emoji] +FLAIRROLE = [add id of flair separator role] \ No newline at end of file From 337f4abfcd3800991f90a4623be019a16fbda02b Mon Sep 17 00:00:00 2001 From: Peter van Arkel Date: Fri, 24 Mar 2023 10:04:50 +0100 Subject: [PATCH 2/4] rename cog to preview.py and add youtube preview functionality --- cogs/{gif.py => preview.py} | 37 +++++++++++++++++++++++++++++++++---- jeevesbot/env.py.dist | 2 +- jeevesbot/functions.py | 2 +- requirements.txt | 1 + 4 files changed, 36 insertions(+), 6 deletions(-) rename cogs/{gif.py => preview.py} (59%) diff --git a/cogs/gif.py b/cogs/preview.py similarity index 59% rename from cogs/gif.py rename to cogs/preview.py index 56721e3..3d58fdc 100644 --- a/cogs/gif.py +++ b/cogs/preview.py @@ -2,7 +2,9 @@ import discord from discord.ext import commands from jeevesbot import functions from logging import getLogger - +import re +import pytube +from pytube.exceptions import RegexMatchError # setup logging log = getLogger(__name__) @@ -11,11 +13,12 @@ log = getLogger(__name__) e = discord.Embed() -class Gif(commands.Cog): - """ Ensures that high-risk channels don't display embedded links, but only gifs.""" +class Preview(commands.Cog): + """ Ensures that high-risk channels don't display embedded links, but only gifs and youtube previews.""" def __init__(self, bot): self.bot = bot + self.video_id_regex = re.compile(r'(?:youtube\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/|m\.youtube\.com/(?:watch\?v=|embed/|v/))([^"&?/ ]{11})') @commands.Cog.listener() @@ -55,6 +58,32 @@ class Gif(commands.Cog): await message.channel.send(embed=embed) logline = (str(message.author) + ' requested a gif: ' + str(gif_url)) log.info(logline) + if 'https://youtu' or 'https://m.youtu' or 'https://www.youtu' in message.content(): + roles = functions.checkrole(message.author.roles) + channel = functions.checkchannel(message.channel.id) + if channel is True: + if roles is not True: + url = message.content + youtube = pytube.YouTube(url) + video_title = youtube.title + video_author = youtube.author + video_id = self.extract_video_id(url) + if video_id: + embed = discord.Embed() + embed.set_image(url=f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg") + embed.set_author(name=f"{video_author}") + embed.add_field(name=f"", value=f"[{video_title}]({url})") + await message.channel.send(embed=embed) + log.info(f'User {message.author} requested preview for {url}') + + + def extract_video_id(self, url): + try: + match = self.video_id_regex.search(url) + if match: + return match.group(1) + except pytube.exceptions.RegexMatchError as e: + pass @commands.Cog.listener() @@ -63,4 +92,4 @@ class Gif(commands.Cog): async def setup(bot): - await bot.add_cog(Gif(bot)) \ No newline at end of file + await bot.add_cog(Preview(bot)) \ No newline at end of file diff --git a/jeevesbot/env.py.dist b/jeevesbot/env.py.dist index dbb6a0f..80ef7c6 100644 --- a/jeevesbot/env.py.dist +++ b/jeevesbot/env.py.dist @@ -2,7 +2,7 @@ TOKEN = 'discord-bot-token-here' ADMIN_ROLE = 'role-to-exclude-from-gifbot' -GIFCHANNELS = [add-channel-ids-for-bot-to-work-in] +PREVIEWCHANNELS = [add-channel-ids-for-bot-to-work-in] BOTCHANNEL = [add id of bot channel] FLAIRROLES = [add list of role ids to correspond to the emoji] FLAIRROLE = [add id of flair separator role] \ No newline at end of file diff --git a/jeevesbot/functions.py b/jeevesbot/functions.py index f1af938..9e0a838 100644 --- a/jeevesbot/functions.py +++ b/jeevesbot/functions.py @@ -25,7 +25,7 @@ def checkrole(roles): # check if the source channel is in the list of channels that are watched by the bot. def checkchannel(channelid): - if channelid in env.GIFCHANNELS: + if channelid in env.PREVIEWCHANNELS: return True else: return False diff --git a/requirements.txt b/requirements.txt index 4c76b47..42ef7bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,7 @@ pylint gspread oauth2client Pillow +pytube # needs this version, otherwise TypeErrors will break stuff yarl==1.4.2 From e7f39ac82b9f7e3c83bd7a1ff79c84bde321225c Mon Sep 17 00:00:00 2001 From: Peter van Arkel Date: Mon, 22 May 2023 10:07:02 +0200 Subject: [PATCH 3/4] Update FUNDING.yml --- .github/FUNDING.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index e4493a8..1075108 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -3,7 +3,7 @@ github: # patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username -ko_fi: parkel +ko_fi: pvanarkel tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username From c72aa1df67c2863634d07e6f4f07c39657c2a59b Mon Sep 17 00:00:00 2001 From: Peter van Arkel Date: Tue, 27 Jun 2023 21:20:32 +0200 Subject: [PATCH 4/4] Cleanup edits for 2.1 --- Makefile | 18 ------------ README.md | 9 ++++++ cogs/admin.py | 3 -- cogs/flair.py | 65 ------------------------------------------ cogs/setup.py | 63 ---------------------------------------- help/adminhelp.md | 5 ---- help/info.md | 1 - scripts/jeeves.service | 12 ++++++++ 8 files changed, 21 insertions(+), 155 deletions(-) delete mode 100644 Makefile delete mode 100644 cogs/flair.py delete mode 100644 cogs/setup.py create mode 100644 scripts/jeeves.service diff --git a/Makefile b/Makefile deleted file mode 100644 index 926a23b..0000000 --- a/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -init: - pip install -r requirements.txt - -install: - mkdir logs - cp jeevesbot/env.py.dist jeevesbot/env.py - cp jeevesbot/secret.json.dist jeevesbot/secret.json - -clearlog: - rm logs/jeeves.log* - -clean: - rm logs/jeeves.log* - rm jeevesbot/env.py - rm jeevesbot/secret.json - rm -rf cogs/__pycache__/ - rm -rf jeevesbot/__pycache__/ - rm -rf __pycache__/ \ No newline at end of file diff --git a/README.md b/README.md index 7770d40..f27abaf 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ # discord-jeeves + +## Installation +- Clone this repository to a directory you want the bot to run from +- `pip3 install -r requirements.txt` +- Copy `jeevesbot/env.py.dist` to `jeevesbot/env.py` and change the variables. +- Copy `jeevesbot/secret.json.dist` to `jeevesbot/secret.json` and add your Google Drive API secret.json +- `cp scripts/jeeves.service /etc/systemd/system/jeeves.service` and change the variables to suit your environment. +- `systemctl daemon-reload` +- `systemctl start jeeves.service` \ No newline at end of file diff --git a/cogs/admin.py b/cogs/admin.py index ae31731..1f5ea92 100644 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -9,9 +9,6 @@ from discord import User, errors, TextChannel, Forbidden log = getLogger(__name__) -embed = discord.Embed() - - class Admin(commands.Cog): """ Admin Commands, Use at own risk. """ def __init__(self, bot): diff --git a/cogs/flair.py b/cogs/flair.py deleted file mode 100644 index 15b92c5..0000000 --- a/cogs/flair.py +++ /dev/null @@ -1,65 +0,0 @@ -import discord -from discord.ext import commands -from logging import getLogger -from jeevesbot import env - -# setup logging -log = getLogger(__name__) -e = discord.Embed() - - -class Flair(commands.Cog): - """ This part of the bot is responsible for giving users roles! """ - def __init__(self, bot): - self.bot = bot - self.message_id = 1084937456819908679 - self.reactions = { - '1️⃣' : env.FLAIRROLES[0], - '2️⃣' : env.FLAIRROLES[1], - '3️⃣' : env.FLAIRROLES[2], - '4️⃣' : env.FLAIRROLES[3], - '5️⃣' : env.FLAIRROLES[4], - '6️⃣' : env.FLAIRROLES[5], - '👍' : env.FLAIRROLES[6], - '👎' : env.FLAIRROLES[7], - '🔞' : env.FLAIRROLES[8], - } - - - @commands.Cog.listener() - async def on_raw_reaction_add(self, payload): - try: - if payload.message_id == self.message_id and str(payload.emoji) in self.reactions: - guild = self.bot.get_guild(payload.guild_id) - member = guild.get_member(payload.user_id) - role_id = self.reactions[str(payload.emoji)] - role = guild.get_role(role_id) - flairrole = guild.get_role(env.FLAIRROLE[0]) - await member.add_roles(flairrole) - await member.add_roles(role) - log.info(f'Added role "{role}" to {member}') - except: - log.debug("Reaction not found.") - - - @commands.Cog.listener() - async def on_raw_reaction_remove(self, payload): - try: - if payload.message_id == self.message_id and str(payload.emoji) in self.reactions: - guild = self.bot.get_guild(payload.guild_id) - member = guild.get_member(payload.user_id) - role_id = self.reactions[str(payload.emoji)] - role = guild.get_role(role_id) - await member.remove_roles(role) - log.info(f'Removed role "{role}" from {member}') - except: - log.debug("Could not remove role") - - - @commands.Cog.listener() - async def on_ready(self): - log.info(f'module active') - - -async def setup(bot): - await bot.add_cog(Flair(bot)) diff --git a/cogs/setup.py b/cogs/setup.py deleted file mode 100644 index 9cadaa3..0000000 --- a/cogs/setup.py +++ /dev/null @@ -1,63 +0,0 @@ -import discord -from discord.ext import commands -from logging import getLogger -from jeevesbot import env - - -# setup logging -log = getLogger(__name__) - -embed = discord.Embed() - -class BotSetup(commands.Cog): - """ Admin Commands, Use at own risk. """ - def __init__(self, bot): - self.bot = bot - self.botchannel = int(env.BOTCHANNEL[0]) - - - @commands.command(hidden=True) - @commands.is_owner() - async def flairsetup(self, ctx): - """ Setup reaction post as embed. """ - await ctx.message.delete() - channel_id = ctx.channel.id - if (channel_id) == (self.botchannel): - embed = discord.Embed(title="Kies je rollen!", - description="Klik op de emoji onder het bericht om de rol te krijgen.") - embed.add_field(name="", value="", inline=False) - embed.add_field(name="Voornaamwoorden:", value="", inline=False) - embed.add_field(name=":one:", value="hij/hem") - embed.add_field(name=":two:", value="zij/haar") - embed.add_field(name=":three:", value="hen/hun") - embed.add_field(name=":four:", value="die/hun") - embed.add_field(name=":five:", value="die/diens") - embed.add_field(name=":six:", value="iedere/all") - embed.add_field(name="Sta je open voor Direct Messages van andere serverleden?", value="", inline=False) - embed.add_field(name=":thumbsup:", value="DM: ja") - embed.add_field(name=":thumbsdown:", value="DM: nee") - embed.add_field(name="Rollen voor toegang tot opt-in kanalen.", value="", inline=False) - embed.add_field(name=":underage:", value="serieuze-onderwerpen") - embed.set_footer(text="Mis je een voornaamwoord of heb je ideeën voor een andere rol? Laat het de mods weten in de #ideeënbus!\nJe kan zelf je rollen verwijderen door opnieuw op de emoji te drukken.") - message = await ctx.send(embed=embed) - await message.add_reaction("1️⃣") - await message.add_reaction("2️⃣") - await message.add_reaction("3️⃣") - await message.add_reaction("4️⃣") - await message.add_reaction("5️⃣") - await message.add_reaction("6️⃣") - await message.add_reaction("👍") - await message.add_reaction("👎") - await message.add_reaction("🔞") - log.warn(f'{ctx.message.author} reset the flair embed, new message_id = {message.id}') - else: - log.warn(f'{ctx.message.author} tried setting up the flair in the wrong channel') - - - @commands.Cog.listener() - async def on_ready(self): - log.info(f'module active') - - -async def setup(bot): - await bot.add_cog(BotSetup(bot)) \ No newline at end of file diff --git a/help/adminhelp.md b/help/adminhelp.md index a129657..80cefbe 100644 --- a/help/adminhelp.md +++ b/help/adminhelp.md @@ -14,9 +14,4 @@ All purge commands also delete their own message. --- -`!flairsetup` - Can be used to reset the flair embed for Jeeves. Needs manual steps to fix the bot giving out roles. Don't use unless you know what you're doing. - ---- - *To easily copy IDs of discord items, turn on Developer Mode in Advanced settings in your profile. After this, you can right click on almost all items in discord to get the "Copy ID" option.* \ No newline at end of file diff --git a/help/info.md b/help/info.md index da4a574..cf96c08 100644 --- a/help/info.md +++ b/help/info.md @@ -1,6 +1,5 @@ ** GIFs ** -** Flair ** ** Extra informatie voor het !roll commando ** diff --git a/scripts/jeeves.service b/scripts/jeeves.service new file mode 100644 index 0000000..b87e463 --- /dev/null +++ b/scripts/jeeves.service @@ -0,0 +1,12 @@ +[Unit] +Description=Jeeves Discord Bot +After=network.target + +[Service] +User= +WorkingDirectory=/path/to/bot/directory +ExecStart=/usr/bin/python3 /path/to/bot/directory/bot.py +Restart=always + +[Install] +WantedBy=multi-user.target \ No newline at end of file