diff --git a/royalnet/commands/null.py b/royalnet/commands/null.py index 4503ef16..236f2617 100644 --- a/royalnet/commands/null.py +++ b/royalnet/commands/null.py @@ -1,4 +1,4 @@ -from ..utils import Command, Call +from ..utils import Command, CommandArgs, Call class NullCommand(Command): @@ -6,5 +6,5 @@ class NullCommand(Command): command_name = "null" command_title = "Do nothing" - async def common(self, call: Call, *args, **kwargs): + async def common(self, call: Call, args: CommandArgs): pass diff --git a/royalnet/commands/ping.py b/royalnet/commands/ping.py index 517f9512..462b33e5 100644 --- a/royalnet/commands/ping.py +++ b/royalnet/commands/ping.py @@ -1,4 +1,4 @@ -from ..utils import Command, Call +from ..utils import Command, CommandArgs, Call class PingCommand(Command): @@ -6,5 +6,5 @@ class PingCommand(Command): command_name = "ping" command_title = "Ping pong!" - async def common(self, call: Call, *args, **kwargs): + async def common(self, call: Call, args: CommandArgs): await call.reply("Pong!") diff --git a/royalnet/commands/ship.py b/royalnet/commands/ship.py index 03ff52df..74592c5e 100644 --- a/royalnet/commands/ship.py +++ b/royalnet/commands/ship.py @@ -1,5 +1,5 @@ import re -from ..utils import Command, Call, safeformat +from ..utils import Command, CommandArgs, Call, safeformat SHIP_RESULT = "💕 {one} + {two} = {result}" @@ -10,7 +10,7 @@ class ShipCommand(Command): command_name = "ship" command_title = "Create a ship between two items" - async def common(self, call: Call, *args, **kwargs): + async def common(self, call: Call, args: CommandArgs): name_one = args[0] name_two = args[1] if name_two == "+": diff --git a/royalnet/commands/smecds.py b/royalnet/commands/smecds.py index 76a77378..521a418e 100644 --- a/royalnet/commands/smecds.py +++ b/royalnet/commands/smecds.py @@ -1,53 +1,53 @@ import random -from ..utils import Command, Call, safeformat +from ..utils import Command, CommandArgs, Call, safeformat DS_LIST = ["della secca", "del seccatore", "del secchiello", "del secchio", "del secchione", "del secondino", - "del sedano", "del sedativo", "della sedia", "del sedicente", "del sedile", "della sega", "del segale", - "della segatura", "della seggiola", "del seggiolino", "della seggiovia", "della segheria", "del seghetto", - "del segnalibro", "del segnaposto", "del segno", "del segretario", "della segreteria", "del seguace", - "del segugio", "della selce", "della sella", "della selz", "della selva", "della selvaggina", "del semaforo", - "del seme", "del semifreddo", "del seminario", "della seminarista", "della semola", "del semolino", - "del semplicione", "della senape", "del senatore", "del seno", "del sensore", "della sentenza", - "della sentinella", "del sentore", "della seppia", "del sequestratore", "della serenata", "del sergente", - "del sermone", "della serpe", "del serpente", "della serpentina", "della serra", "del serraglio", - "del serramanico", "della serranda", "della serratura", "del servitore", "della servitù", "del servizievole", - "del servo", "del set", "della seta", "della setola", "del sidecar", "del siderurgico", "del sidro", - "della siepe", "del sifone", "della sigaretta", "del sigaro", "del sigillo", "della signora", - "della signorina", "del silenziatore", "della silhouette", "del silicio", "del silicone", "del siluro", - "della sinagoga", "della sindacalista", "del sindacato", "del sindaco", "della sindrome", "della sinfonia", - "del sipario", "del sire", "della sirena", "della siringa", "del sismografo", "del sobborgo", - "del sobillatore", "del sobrio", "del soccorritore", "del socio", "del sociologo", "della soda", "del sofà", - "della soffitta", "del software", "dello sogghignare", "del soggiorno", "della sogliola", "del sognatore", - "della soia", "del solaio", "del solco", "del soldato", "del soldo", "del sole", "della soletta", - "della solista", "del solitario", "del sollazzare", "del sollazzo", "del sollecito", "del solleone", - "del solletico", "del sollevare", "del sollievo", "del solstizio", "del solubile", "del solvente", - "della soluzione", "del somaro", "del sombrero", "del sommergibile", "del sommo", "della sommossa", - "del sommozzatore", "del sonar", "della sonda", "del sondaggio", "del sondare", "del sonnacchioso", - "del sonnambulo", "del sonnellino", "del sonnifero", "del sonno", "della sonnolenza", "del sontuoso", - "del soppalco", "del soprabito", "del sopracciglio", "del sopraffare", "del sopraffino", "del sopraluogo", - "del sopramobile", "del soprannome", "del soprano", "del soprappensiero", "del soprassalto", - "del soprassedere", "del sopravvento", "del sopravvivere", "del soqquadro", "del sorbetto", "del sordido", - "della sordina", "del sordo", "della sorella", "della sorgente", "del sornione", "del sorpasso", - "della sorpresa", "del sorreggere", "del sorridere", "della sorsata", "del sorteggio", "del sortilegio", - "del sorvegliante", "del sorvolare", "del sosia", "del sospettoso", "del sospirare", "della sosta", - "della sostanza", "del sostegno", "del sostenitore", "del sostituto", "del sottaceto", "della sottana", - "del sotterfugio", "del sotterraneo", "del sottile", "del sottilizzare", "del sottintendere", - "del sottobanco", "del sottobosco", "del sottomarino", "del sottopassaggio", "del sottoposto", - "del sottoscala", "della sottoscrizione", "del sottostare", "del sottosuolo", "del sottotetto", - "del sottotitolo", "del sottovalutare", "del sottovaso", "della sottoveste", "del sottovuoto", - "del sottufficiale", "della soubrette", "del souvenir", "del soverchiare", "del sovrano", "del sovrapprezzo", - "della sovvenzione", "del sovversivo", "del sozzo", "dello suadente", "del sub", "del subalterno", - "del subbuglio", "del subdolo", "del sublime", "del suburbano", "del successore", "del succo", - "della succube", "del succulento", "della succursale", "del sudario", "della sudditanza", "del suddito", - "del sudicio", "del suffisso", "del suffragio", "del suffumigio", "del suggeritore", "del sughero", - "del sugo", "del suino", "della suite", "del sulfureo", "del sultano", "di Steffo", "di Spaggia", - "di Sabrina", "del sas", "del ses", "del sis", "del sos", "del sus", "della supremazia", "del Santissimo", - "della scatola", "del supercalifragilistichespiralidoso", "del sale", "del salame", "di (Town of) Salem", - "di Stronghold", "di SOMA", "dei Saints", "di S.T.A.L.K.E.R.", "di Sanctum", "dei Sims", "di Sid", - "delle Skullgirls", "di Sonic", "di Spiral (Knights)", "di Spore", "di Starbound", "di SimCity", "di Sensei", - "di Ssssssssssssss... Boom! E' esploso il dizionario", "della scala", "di Sakura", "di Suzie", "di Shinji", - "del senpai", "del support", "di Superman"] + "del sedano", "del sedativo", "della sedia", "del sedicente", "del sedile", "della sega", "del segale", + "della segatura", "della seggiola", "del seggiolino", "della seggiovia", "della segheria", "del seghetto", + "del segnalibro", "del segnaposto", "del segno", "del segretario", "della segreteria", "del seguace", + "del segugio", "della selce", "della sella", "della selz", "della selva", "della selvaggina", "del semaforo", + "del seme", "del semifreddo", "del seminario", "della seminarista", "della semola", "del semolino", + "del semplicione", "della senape", "del senatore", "del seno", "del sensore", "della sentenza", + "della sentinella", "del sentore", "della seppia", "del sequestratore", "della serenata", "del sergente", + "del sermone", "della serpe", "del serpente", "della serpentina", "della serra", "del serraglio", + "del serramanico", "della serranda", "della serratura", "del servitore", "della servitù", "del servizievole", + "del servo", "del set", "della seta", "della setola", "del sidecar", "del siderurgico", "del sidro", + "della siepe", "del sifone", "della sigaretta", "del sigaro", "del sigillo", "della signora", + "della signorina", "del silenziatore", "della silhouette", "del silicio", "del silicone", "del siluro", + "della sinagoga", "della sindacalista", "del sindacato", "del sindaco", "della sindrome", "della sinfonia", + "del sipario", "del sire", "della sirena", "della siringa", "del sismografo", "del sobborgo", + "del sobillatore", "del sobrio", "del soccorritore", "del socio", "del sociologo", "della soda", "del sofà", + "della soffitta", "del software", "dello sogghignare", "del soggiorno", "della sogliola", "del sognatore", + "della soia", "del solaio", "del solco", "del soldato", "del soldo", "del sole", "della soletta", + "della solista", "del solitario", "del sollazzare", "del sollazzo", "del sollecito", "del solleone", + "del solletico", "del sollevare", "del sollievo", "del solstizio", "del solubile", "del solvente", + "della soluzione", "del somaro", "del sombrero", "del sommergibile", "del sommo", "della sommossa", + "del sommozzatore", "del sonar", "della sonda", "del sondaggio", "del sondare", "del sonnacchioso", + "del sonnambulo", "del sonnellino", "del sonnifero", "del sonno", "della sonnolenza", "del sontuoso", + "del soppalco", "del soprabito", "del sopracciglio", "del sopraffare", "del sopraffino", "del sopraluogo", + "del sopramobile", "del soprannome", "del soprano", "del soprappensiero", "del soprassalto", + "del soprassedere", "del sopravvento", "del sopravvivere", "del soqquadro", "del sorbetto", "del sordido", + "della sordina", "del sordo", "della sorella", "della sorgente", "del sornione", "del sorpasso", + "della sorpresa", "del sorreggere", "del sorridere", "della sorsata", "del sorteggio", "del sortilegio", + "del sorvegliante", "del sorvolare", "del sosia", "del sospettoso", "del sospirare", "della sosta", + "della sostanza", "del sostegno", "del sostenitore", "del sostituto", "del sottaceto", "della sottana", + "del sotterfugio", "del sotterraneo", "del sottile", "del sottilizzare", "del sottintendere", + "del sottobanco", "del sottobosco", "del sottomarino", "del sottopassaggio", "del sottoposto", + "del sottoscala", "della sottoscrizione", "del sottostare", "del sottosuolo", "del sottotetto", + "del sottotitolo", "del sottovalutare", "del sottovaso", "della sottoveste", "del sottovuoto", + "del sottufficiale", "della soubrette", "del souvenir", "del soverchiare", "del sovrano", "del sovrapprezzo", + "della sovvenzione", "del sovversivo", "del sozzo", "dello suadente", "del sub", "del subalterno", + "del subbuglio", "del subdolo", "del sublime", "del suburbano", "del successore", "del succo", + "della succube", "del succulento", "della succursale", "del sudario", "della sudditanza", "del suddito", + "del sudicio", "del suffisso", "del suffragio", "del suffumigio", "del suggeritore", "del sughero", + "del sugo", "del suino", "della suite", "del sulfureo", "del sultano", "di Steffo", "di Spaggia", + "di Sabrina", "del sas", "del ses", "del sis", "del sos", "del sus", "della supremazia", "del Santissimo", + "della scatola", "del supercalifragilistichespiralidoso", "del sale", "del salame", "di (Town of) Salem", + "di Stronghold", "di SOMA", "dei Saints", "di S.T.A.L.K.E.R.", "di Sanctum", "dei Sims", "di Sid", + "delle Skullgirls", "di Sonic", "di Spiral (Knights)", "di Spore", "di Starbound", "di SimCity", "di Sensei", + "di Ssssssssssssss... Boom! E' esploso il dizionario", "della scala", "di Sakura", "di Suzie", "di Shinji", + "del senpai", "del support", "di Superman"] SMECDS = "🤔 Secondo me, è colpa {ds}." @@ -56,6 +56,6 @@ class SmecdsCommand(Command): command_name = "smecds" command_title = "Secondo me, è colpa dello stagista..." - async def common(self, call: Call, *args, **kwargs): + async def common(self, call: Call, args: CommandArgs): ds = random.sample(DS_LIST, 1)[0] return await call.reply(safeformat(SMECDS, ds=ds)) diff --git a/royalnet/utils/__init__.py b/royalnet/utils/__init__.py index 3e8886db..2af35184 100644 --- a/royalnet/utils/__init__.py +++ b/royalnet/utils/__init__.py @@ -1,6 +1,6 @@ from .asyncify import asyncify from .call import Call -from .command import Command, InvalidInputError, UnsupportedError +from .command import Command, CommandArgs, InvalidInputError, UnsupportedError from .safeformat import safeformat -__all__ = ["asyncify", "Call", "Command", "safeformat", "InvalidInputError", "UnsupportedError"] +__all__ = ["asyncify", "Call", "Command", "safeformat", "InvalidInputError", "UnsupportedError", "CommandArgs"] diff --git a/royalnet/utils/call.py b/royalnet/utils/call.py index f8f8853c..e7862200 100644 --- a/royalnet/utils/call.py +++ b/royalnet/utils/call.py @@ -1,5 +1,4 @@ -import typing -from .command import Command +from .command import Command, CommandArgs class Call: @@ -25,4 +24,4 @@ class Call: coroutine = getattr(self.command, self.interface_name) except AttributeError: coroutine = getattr(self.command, "common") - return await coroutine(self.command, self, *self.args, **self.kwargs) + return await coroutine(self.command, self, CommandArgs(*self.args, **self.kwargs)) diff --git a/royalnet/utils/command.py b/royalnet/utils/command.py index 8b02eeba..07df3628 100644 --- a/royalnet/utils/command.py +++ b/royalnet/utils/command.py @@ -13,11 +13,31 @@ class InvalidInputError(Exception): pass +class CommandArgs: + """The arguments of a command. Raises InvalidInputError if the requested argument does not exist.""" + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + + def __getitem__(self, item): + if isinstance(item, int): + try: + return self.args[item] + except IndexError: + raise InvalidInputError(f'Tried to get missing [{item}] arg from CommandArgs') + elif isinstance(item, str): + try: + return self.kwargs[item] + except IndexError: + raise InvalidInputError(f'Tried to get missing ["{item}"] kwarg from CommandArgs') + raise ValueError(f"Invalid type passed to CommandArgs.__getattr__: {type(item)}") + + class Command: """A generic command, called from any source.""" command_name: str = NotImplemented command_title: str = NotImplemented - async def common(self, call: "Call", *args, **kwargs): + async def common(self, call: "Call", args: CommandArgs): raise NotImplementedError()