From b00c2e890aa741ed9260fb36bb87e15d8075c2d1 Mon Sep 17 00:00:00 2001 From: Arjun Satarkar Date: Wed, 17 Jul 2024 13:53:28 +0530 Subject: Add wplink cog --- starboard/__init__.py | 5 -- starboard/info.json | 5 -- starboard/starboard.py | 143 ------------------------------------------------- wplink/__init__.py | 5 ++ wplink/info.json | 4 ++ wplink/wplink.py | 35 ++++++++++++ 6 files changed, 44 insertions(+), 153 deletions(-) delete mode 100644 starboard/__init__.py delete mode 100644 starboard/info.json delete mode 100644 starboard/starboard.py create mode 100644 wplink/__init__.py create mode 100644 wplink/info.json create mode 100644 wplink/wplink.py diff --git a/starboard/__init__.py b/starboard/__init__.py deleted file mode 100644 index eeb3d75..0000000 --- a/starboard/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .starboard import Starboard - - -async def setup(bot): - await bot.add_cog(Starboard(bot)) diff --git a/starboard/info.json b/starboard/info.json deleted file mode 100644 index af11ade..0000000 --- a/starboard/info.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "author": ["Arjun Satarkar"], - "description": "Create starboards in your server.", - "short": "Create starboards in your server." -} diff --git a/starboard/starboard.py b/starboard/starboard.py deleted file mode 100644 index 751c7c3..0000000 --- a/starboard/starboard.py +++ /dev/null @@ -1,143 +0,0 @@ -import asyncio -import discord -import redbot.core -from redbot.core import Config -from redbot.core import commands - - -class Starboard(commands.Cog): - def __init__(self, bot): - self.bot = bot - self.config = Config.get_conf( - self, identifier="551742410770612234|31374c1f-a5e9-470a-8fed-1137e980f27a" - ) - self.config.register_guild(starboards={}) - - def emoji_as_sendable_text(self, emoji: discord.Emoji | discord.PartialEmoji | str): - if isinstance(emoji, str): - return emoji - if emoji.animated: - return f"" - else: - return f"<:{emoji.name}:{emoji.id}>" - - @commands.group() - async def starboard(self, _ctx): - pass - - @starboard.command() - @commands.admin_or_permissions(manage_guild=True) - async def add(self, ctx, name: str, channel: discord.TextChannel, threshold: int): - if threshold < 1: - await ctx.reply("Error: threshold must be 1 or higher.") - return - async with self.config.guild(ctx.guild).starboards() as starboards: - if name in starboards: - await ctx.reply( - "Error: a starboard with that name already exists (see `starboard list`)." - ) - return - starboards[name] = { - "channel_id": channel.id, - "threshold": threshold, - "allow_all_reactions": False, - "reactions": { - "unicode": {}, - "custom": {}, - }, - } - - wait_message_id = ( - await ctx.reply( - f"Creating starboard ``{name}`` posting to {channel.mention} requiring {threshold} reactions." - "\nReact to this message with all reactions you want the bot to consider for this starboard," - " then send DONE, or else type ANY to check for all reactions. If you don't react, ⭐ will" - " be chosen by default.", - allowed_mentions=discord.AllowedMentions.none(), - ) - ).id - - try: - done_message = await self.bot.wait_for( - "message", - check=lambda m: m.content.lower() in ["done", "any"], - timeout=120, - ) - except asyncio.TimeoutError: - await ctx.send( - f"Error: timed out; cancelling creation of starboard ``{name}``.", - allowed_mentions=discord.AllowedMentions.none(), - ) - del starboards[name] - return - - # Accumulated to easily post the confirmation message - emoji_text_list = [] - match done_message.content.lower(): - case "done": - reactions = ( - await ctx.channel.fetch_message(wait_message_id) - ).reactions - if not reactions: - starboards[name]["reactions"]["unicode"]["⭐"] = 1 - emoji_text_list.append("⭐") - else: - for reaction in reactions: - emoji = reaction.emoji - if isinstance(emoji, str): - starboards[name]["reactions"]["unicode"][emoji] = 1 - else: - starboards[name]["reactions"]["custom"][emoji.id] = 1 - emoji_text_list.append(self.emoji_as_sendable_text(emoji)) - case "any": - starboards[name]["allow_all_reactions"] = True - - confirmation_text = f"Created starboard ``{name}`` posting to {channel.mention} and requiring {threshold}" - if not emoji_text_list: - confirmation_text += " of any emoji." - else: - confirmation_text += f" reactions of {redbot.core.utils.chat_formatting.humanize_list(emoji_text_list, style='or')}." - await ctx.send( - confirmation_text, allowed_mentions=discord.AllowedMentions.none() - ) - - @starboard.command() - @commands.admin_or_permissions(manage_guild=True) - async def remove(self, ctx, name: str): - async with self.config.guild(ctx.guild).starboards() as starboards: - try: - del starboards[name] - except KeyError: - await ctx.reply( - "Error: no starboard found with that name (see `starboard list`)." - ) - else: - await ctx.reply("Removed that starboard.") - - @starboard.command() - async def list(self, ctx): - starboards = await self.config.guild(ctx.guild).starboards() - list_text = "Name, Channel, Threshold, Reactions" - for name in starboards: - starboard = starboards[name] - list_text += ( - f"\n* ``{name}``, {ctx.guild.get_channel(starboard['channel_id']).mention}," - f" {starboard['threshold']}, " - ) - if starboard["allow_all_reactions"]: - list_text += "*any*" - else: - emoji_list = [] - for emoji in starboard["reactions"]["custom"]: - emoji_list.append( - self.emoji_as_sendable_text(self.bot.get_emoji(int(emoji))) - ) - for emoji in starboard["reactions"]["unicode"]: - emoji_list.append(emoji) - list_text += redbot.core.utils.chat_formatting.humanize_list(emoji_list) - pages = [ - *redbot.core.utils.chat_formatting.pagify( - discord.utils.escape_mentions(list_text) - ) - ] - await redbot.core.utils.menus.menu(ctx, pages) diff --git a/wplink/__init__.py b/wplink/__init__.py new file mode 100644 index 0000000..f82c406 --- /dev/null +++ b/wplink/__init__.py @@ -0,0 +1,5 @@ +from .wplink import WPLink + + +async def setup(bot): + await bot.add_cog(WPLink(bot)) diff --git a/wplink/info.json b/wplink/info.json new file mode 100644 index 0000000..bd066ba --- /dev/null +++ b/wplink/info.json @@ -0,0 +1,4 @@ +{ + "author": ["Arjun Satarkar"], + "requirements": ["aiohttp"] +} diff --git a/wplink/wplink.py b/wplink/wplink.py new file mode 100644 index 0000000..e9781fc --- /dev/null +++ b/wplink/wplink.py @@ -0,0 +1,35 @@ +import aiohttp +import discord +from redbot.core import commands +import re +import urllib.parse + + +class WPLink(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @commands.Cog.listener() + async def on_message(self, message: discord.Message): + wikilink_pattern = r"\[\[(.+)\]\]" + match = re.search(wikilink_pattern, message.content) + if match is not None: + title = match.group(1) + page_url = await self.look_up_page(title) + if page_url is not None: + await message.reply( + page_url, allowed_mentions=discord.AllowedMentions.none() + ) + + async def look_up_page(self, title: str) -> str | None: + query_url = f"https://en.wikipedia.org/wiki/Special:Search?search={urllib.parse.quote(title)}&go=Go" + async with aiohttp.ClientSession() as session: + async with session.get(query_url) as response: + result_url = str(response.url) + return ( + result_url + if not result_url.startswith( + "https://en.wikipedia.org/wiki/Special:Search?" + ) + else None + ) -- cgit v1.2.3-57-g22cb