Skip to content

Commit 312f137

Browse files
committed
feat: args
This add a args feature, for example if your arg is called `argreply` You can do: `?reply Hello, read the following: {argreply}
1 parent 6e094af commit 312f137

File tree

3 files changed

+206
-1
lines changed

3 files changed

+206
-1
lines changed

bot.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,10 @@ async def wait_for_connected(self) -> None:
377377
def snippets(self) -> typing.Dict[str, str]:
378378
return self.config["snippets"]
379379

380+
@property
381+
def args(self) -> typing.Dict[str, str]:
382+
return self.config["args"]
383+
380384
@property
381385
def aliases(self) -> typing.Dict[str, str]:
382386
return self.config["aliases"]

cogs/modmail.py

Lines changed: 201 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from dateutil import parser
1717

1818
from core import checks
19-
from core.models import DMDisabled, PermissionLevel, SimilarCategoryConverter, getLogger
19+
from core.models import DMDisabled, PermissionLevel, SimilarCategoryConverter, UnseenFormatter, getLogger
2020
from core.paginator import EmbedPaginatorSession
2121
from core.thread import Thread
2222
from core.time import UserFriendlyTime, human_timedelta
@@ -535,6 +535,199 @@ async def snippet_rename(self, ctx, name: str.lower, *, value):
535535
embed = create_not_found_embed(name, self.bot.snippets.keys(), "Snippet")
536536
await ctx.send(embed=embed)
537537

538+
@commands.group(invoke_without_command=True)
539+
@checks.has_permissions(PermissionLevel.SUPPORTER)
540+
async def args(self, ctx, *, name: str.lower = None):
541+
"""
542+
Create dynamic arguments for use in replies.
543+
544+
When `{prefix}args` is used by itself, this will retrieve
545+
a list of args that are currently set. `{prefix}args name` will show what the
546+
arg point to.
547+
548+
To create an arg:
549+
- `{prefix}args add arg-name A value.`
550+
551+
You can use your arg in a reply with `{arg-name}`.
552+
"""
553+
554+
if name is not None:
555+
if name == "compact":
556+
embeds = []
557+
558+
for i, names in enumerate(zip_longest(*(iter(sorted(self.bot.args)),) * 15)):
559+
description = format_description(i, names)
560+
embed = discord.Embed(color=self.bot.main_color, description=description)
561+
embed.set_author(
562+
name="Args", icon_url=self.bot.get_guild_icon(guild=ctx.guild, size=128)
563+
)
564+
embeds.append(embed)
565+
566+
session = EmbedPaginatorSession(ctx, *embeds)
567+
await session.run()
568+
return
569+
570+
if name not in self.bot.args:
571+
embed = create_not_found_embed(name, self.bot.args.keys(), "Arg")
572+
else:
573+
val = self.bot.args[name]
574+
embed = discord.Embed(
575+
title=f'Arg - "{name}":',
576+
description=val,
577+
color=self.bot.main_color,
578+
)
579+
return await ctx.send(embed=embed)
580+
581+
if not self.bot.args:
582+
embed = discord.Embed(
583+
color=self.bot.error_color,
584+
description="You dont have any args at the moment.",
585+
)
586+
embed.set_footer(text=f'Check "{self.bot.prefix}help args add" to add an arg.')
587+
embed.set_author(
588+
name="Args",
589+
icon_url=self.bot.get_guild_icon(guild=ctx.guild, size=128),
590+
)
591+
return await ctx.send(embed=embed)
592+
593+
embeds = [discord.Embed(color=self.bot.main_color) for _ in range((len(self.bot.args) // 10) + 1)]
594+
for embed in embeds:
595+
embed.set_author(name="Args", icon_url=self.bot.get_guild_icon(guild=ctx.guild, size=128))
596+
597+
for i, arg in enumerate(sorted(self.bot.args.items())):
598+
embeds[i // 10].add_field(
599+
name=arg[0], value=return_or_truncate(arg[1], 350), inline=False
600+
)
601+
602+
session = EmbedPaginatorSession(ctx, *embeds)
603+
await session.run()
604+
605+
@args.command(name="raw")
606+
@checks.has_permissions(PermissionLevel.SUPPORTER)
607+
async def args_raw(self, ctx, *, name: str.lower):
608+
"""
609+
View the raw content of an arg.
610+
"""
611+
if name not in self.bot.args:
612+
embed = create_not_found_embed(name, self.bot.args.keys(), "Arg")
613+
else:
614+
val = truncate(escape_code_block(self.bot.args[name]), 2048 - 7)
615+
embed = discord.Embed(
616+
title=f'Raw arg - "{name}":',
617+
description=f"```\n{val}```",
618+
color=self.bot.main_color,
619+
)
620+
621+
return await ctx.send(embed=embed)
622+
623+
@args.command(name="add", aliases=["create", "make"])
624+
@checks.has_permissions(PermissionLevel.SUPPORTER)
625+
async def args_add(self, ctx, name: str.lower, *, value: commands.clean_content):
626+
"""
627+
Add an arg.
628+
629+
Simply to add an arg, do: ```
630+
{prefix}args add name value
631+
```
632+
"""
633+
if name in self.bot.args:
634+
embed = discord.Embed(
635+
title="Error",
636+
color=self.bot.error_color,
637+
description=f"Arg `{name}` already exists.",
638+
)
639+
return await ctx.send(embed=embed)
640+
641+
if len(name) > 120:
642+
embed = discord.Embed(
643+
title="Error",
644+
color=self.bot.error_color,
645+
description="Arg names cannot be longer than 120 characters.",
646+
)
647+
return await ctx.send(embed=embed)
648+
649+
self.bot.args[name] = value
650+
await self.bot.config.update()
651+
652+
embed = discord.Embed(
653+
title="Added arg",
654+
color=self.bot.main_color,
655+
description="Successfully created arg.",
656+
)
657+
return await ctx.send(embed=embed)
658+
659+
@args.command(name="remove", aliases=["del", "delete"])
660+
@checks.has_permissions(PermissionLevel.SUPPORTER)
661+
async def args_remove(self, ctx, *, name: str.lower):
662+
"""Remove an arg."""
663+
if name in self.bot.args:
664+
self.bot.args.pop(name)
665+
await self.bot.config.update()
666+
embed = discord.Embed(
667+
title="Removed arg",
668+
color=self.bot.main_color,
669+
description=f"Arg `{name}` is now deleted.",
670+
)
671+
else:
672+
embed = create_not_found_embed(name, self.bot.args.keys(), "Arg")
673+
await ctx.send(embed=embed)
674+
675+
@args.command(name="edit")
676+
@checks.has_permissions(PermissionLevel.SUPPORTER)
677+
async def args_edit(self, ctx, name: str.lower, *, value):
678+
"""
679+
Edit an arg.
680+
"""
681+
if name in self.bot.args:
682+
self.bot.args[name] = value
683+
await self.bot.config.update()
684+
685+
embed = discord.Embed(
686+
title="Edited arg",
687+
color=self.bot.main_color,
688+
description=f'`{name}` will now be replaced with "{value}".',
689+
)
690+
else:
691+
embed = create_not_found_embed(name, self.bot.args.keys(), "Arg")
692+
await ctx.send(embed=embed)
693+
694+
@args.command(name="rename")
695+
@checks.has_permissions(PermissionLevel.SUPPORTER)
696+
async def args_rename(self, ctx, name: str.lower, *, value):
697+
"""
698+
Rename an arg.
699+
"""
700+
if name in self.bot.args:
701+
if value in self.bot.args:
702+
embed = discord.Embed(
703+
title="Error",
704+
color=self.bot.error_color,
705+
description=f"Arg `{value}` already exists.",
706+
)
707+
return await ctx.send(embed=embed)
708+
709+
if len(value) > 120:
710+
embed = discord.Embed(
711+
title="Error",
712+
color=self.bot.error_color,
713+
description="Arg names cannot be longer than 120 characters.",
714+
)
715+
return await ctx.send(embed=embed)
716+
717+
old_arg_value = self.bot.args[name]
718+
self.bot.args.pop(name)
719+
self.bot.args[value] = old_arg_value
720+
await self.bot.config.update()
721+
722+
embed = discord.Embed(
723+
title="Renamed arg",
724+
color=self.bot.main_color,
725+
description=f'`{name}` has been renamed to "{value}".',
726+
)
727+
else:
728+
embed = create_not_found_embed(name, self.bot.args.keys(), "Arg")
729+
await ctx.send(embed=embed)
730+
538731
@commands.command(usage="<category> [options]")
539732
@checks.has_permissions(PermissionLevel.MODERATOR)
540733
@checks.thread_only()
@@ -1510,6 +1703,9 @@ async def reply(self, ctx, *, msg: str = ""):
15101703
automatically embedding image URLs.
15111704
"""
15121705

1706+
if self.bot.args:
1707+
msg = UnseenFormatter().format(msg, **self.bot.args)
1708+
15131709
# Ensure logs record only the reply text, not the command.
15141710
ctx.message.content = msg
15151711
async with safe_typing(ctx):
@@ -1532,6 +1728,7 @@ async def freply(self, ctx, *, msg: str = ""):
15321728
"""
15331729
msg = self.bot.formatter.format(
15341730
msg,
1731+
**self.bot.args,
15351732
channel=ctx.channel,
15361733
recipient=ctx.thread.recipient,
15371734
author=ctx.message.author,
@@ -1558,6 +1755,7 @@ async def fareply(self, ctx, *, msg: str = ""):
15581755
"""
15591756
msg = self.bot.formatter.format(
15601757
msg,
1758+
**self.bot.args,
15611759
channel=ctx.channel,
15621760
recipient=ctx.thread.recipient,
15631761
author=ctx.message.author,
@@ -1584,6 +1782,7 @@ async def fpreply(self, ctx, *, msg: str = ""):
15841782
"""
15851783
msg = self.bot.formatter.format(
15861784
msg,
1785+
**self.bot.args,
15871786
channel=ctx.channel,
15881787
recipient=ctx.thread.recipient,
15891788
author=ctx.message.author,
@@ -1610,6 +1809,7 @@ async def fpareply(self, ctx, *, msg: str = ""):
16101809
"""
16111810
msg = self.bot.formatter.format(
16121811
msg,
1812+
**self.bot.args,
16131813
channel=ctx.channel,
16141814
recipient=ctx.thread.recipient,
16151815
author=ctx.message.author,

core/config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ class ConfigManager:
182182
"override_command_level": {},
183183
# threads
184184
"snippets": {},
185+
"args": {},
185186
"notification_squad": {},
186187
"subscriptions": {},
187188
"closures": {},

0 commit comments

Comments
 (0)