aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArjun Satarkar <me@arjunsatarkar.net>2024-07-17 08:23:28 +0000
committerArjun Satarkar <me@arjunsatarkar.net>2024-07-17 08:23:28 +0000
commitb00c2e890aa741ed9260fb36bb87e15d8075c2d1 (patch)
treec5ce0613f195fc0b858f04e0b26147942b3ec4ff
parentdb8d2349175db503f2ce889a9928b22a3067b30c (diff)
downloadaps-cogs-b00c2e890aa741ed9260fb36bb87e15d8075c2d1.tar
aps-cogs-b00c2e890aa741ed9260fb36bb87e15d8075c2d1.tar.gz
aps-cogs-b00c2e890aa741ed9260fb36bb87e15d8075c2d1.zip
Add wplink cog
-rw-r--r--starboard/__init__.py5
-rw-r--r--starboard/info.json5
-rw-r--r--starboard/starboard.py143
-rw-r--r--wplink/__init__.py5
-rw-r--r--wplink/info.json4
-rw-r--r--wplink/wplink.py35
6 files changed, 44 insertions, 153 deletions
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"<a:{emoji.name}:{emoji.id}>"
- 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
+ )