1616from dateutil import parser
1717
1818from core import checks
19- from core .models import DMDisabled , PermissionLevel , SimilarCategoryConverter , getLogger
19+ from core .models import DMDisabled , PermissionLevel , SimilarCategoryConverter , UnseenFormatter , getLogger
2020from core .paginator import EmbedPaginatorSession
2121from core .thread import Thread
2222from 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 ,
0 commit comments