diff --git a/robocop_ng/__main__.py b/robocop_ng/__main__.py index 0ba16d4..c9d18fe 100755 --- a/robocop_ng/__main__.py +++ b/robocop_ng/__main__.py @@ -46,6 +46,7 @@ wanted_jsons = [ "data/robocronptab.json", "data/userlog.json", "data/invites.json", + "data/macros.json", "data/persistent_roles.json" ] diff --git a/robocop_ng/cogs/macro.py b/robocop_ng/cogs/macro.py new file mode 100644 index 0000000..412b2be --- /dev/null +++ b/robocop_ng/cogs/macro.py @@ -0,0 +1,65 @@ +from typing import Optional + +import discord +from discord.ext import commands +from discord.ext.commands import Cog, Context, BucketType + +from robocop_ng.helpers.checks import check_if_staff +from robocop_ng.helpers.macros import get_macro, add_macro, edit_macro, remove_macro, get_macros + + +class Macro(Cog): + @commands.cooldown(3, 30, BucketType.member) + @commands.command(aliases=["m"]) + async def macro(self, ctx: Context, target: Optional[discord.Member], key: str): + if len(key) > 0: + text = get_macro(key) + if text is not None: + if target is not None: + await ctx.send(f"{target.mention}:\n{text}") + else: + await ctx.send(text) + else: + await ctx.send(f"{ctx.author.mention}: The macro '{key}' doesn't exist.") + + @commands.check(check_if_staff) + @commands.command(name="macroadd", aliases=["ma", "addmacro", "add_macro"]) + async def add_macro(self, ctx: Context, key: str, *, text: str): + if add_macro(key, text): + await ctx.send(f"Macro '{key}' added!") + else: + await ctx.send(f"Error: Macro '{key}' already exists.") + + @commands.check(check_if_staff) + @commands.command(name="macroedit", aliases=["me", "editmacro", "edit_macro"]) + async def edit_macro(self, ctx: Context, key: str, *, text: str): + if edit_macro(key, text): + await ctx.send(f"Macro '{key}' edited!") + else: + await ctx.send(f"Error: Macro '{key}' not found.") + + @commands.check(check_if_staff) + @commands.command(name="macroremove", aliases=[ + "mr", "md", "removemacro", "remove_macro", "macrodel", "delmacro", "delete_macro" + ]) + async def remove_macro(self, ctx: Context, key: str): + if remove_macro(key): + await ctx.send(f"Macro '{key}' removed!") + else: + await ctx.send(f"Error: Macro '{key}' not found.") + + @commands.cooldown(3, 30, BucketType.channel) + @commands.command(name="macros", aliases=["ml", "listmacros", "list_macros"]) + async def list_macros(self, ctx: Context): + macros = get_macros() + if len(macros) > 0: + await ctx.send( + "📝 **Macros**:\n" + "\n".join([f"- {key}" for key in macros.keys()]) + ) + else: + await ctx.send("Couldn't find any macros.") + + +async def setup(bot): + await bot.add_cog(Macro(bot)) diff --git a/robocop_ng/helpers/macros.py b/robocop_ng/helpers/macros.py new file mode 100644 index 0000000..ec77e57 --- /dev/null +++ b/robocop_ng/helpers/macros.py @@ -0,0 +1,55 @@ +import json +import os +from typing import Optional + +MACROS_FILE = "data/macros.json" + + +def get_macros() -> dict[str, str]: + if os.path.isfile(MACROS_FILE): + with open(MACROS_FILE, "r") as f: + return json.load(f) + return {} + + +def set_macros(contents: dict[str, str]): + with open(MACROS_FILE, "w") as f: + json.dump(contents, f) + + +def get_macro(key: str) -> Optional[str]: + macros = get_macros() + key = key.lower() + if key in macros.keys(): + return macros[key] + return None + + +def add_macro(key: str, message: str) -> bool: + macros = get_macros() + key = key.lower() + if key not in macros.keys(): + macros[key] = message + set_macros(macros) + return True + return False + + +def edit_macro(key: str, message: str) -> bool: + macros = get_macros() + key = key.lower() + if key in macros.keys(): + macros[key] = message + set_macros(macros) + return True + return False + + +def remove_macro(key: str) -> bool: + macros = get_macros() + key = key.lower() + if key in macros.keys(): + del macros[key] + set_macros(macros) + return True + return False