1
Fork 0
mirror of https://github.com/RYGhub/royalnet.git synced 2024-11-27 13:34:28 +00:00

Implement aliases

This commit is contained in:
Steffo 2019-10-03 22:17:36 +02:00
parent 5fcf2652c6
commit 9bc92d7087
20 changed files with 61 additions and 15 deletions

View file

@ -24,19 +24,30 @@ class GenericBot:
def _init_commands(self) -> None: def _init_commands(self) -> None:
"""Generate the ``commands`` dictionary required to handle incoming messages, and the ``network_handlers`` """Generate the ``commands`` dictionary required to handle incoming messages, and the ``network_handlers``
dictionary required to handle incoming requests. """ dictionary required to handle incoming requests. """
log.debug(f"Now binding commands") log.info(f"Registering commands...")
self._Interface = self._interface_factory() self._Interface = self._interface_factory()
self._Data = self._data_factory() self._Data = self._data_factory()
self.commands = {} self.commands = {}
self.network_handlers: typing.Dict[str, typing.Type[NetworkHandler]] = {} self.network_handlers: typing.Dict[str, typing.Type[NetworkHandler]] = {}
for SelectedCommand in self.uninitialized_commands: for SelectedCommand in self.uninitialized_commands:
log.debug(f"Binding {SelectedCommand.name}...")
interface = self._Interface() interface = self._Interface()
try: try:
self.commands[f"{interface.prefix}{SelectedCommand.name}"] = SelectedCommand(interface) command = SelectedCommand(interface)
except Exception as e: except Exception as e:
log.error(f"{e.__class__.__name__} during the initialization of {SelectedCommand.name}, skipping...") log.error(f"{e.__class__.__qualname__} during the registration of {SelectedCommand.__qualname__}")
log.debug(f"Successfully bound commands") # Override the main command name, but warn if it's overriding something
if f"{interface.prefix}{SelectedCommand.name}" in self.commands:
log.warning(f"Overriding (already defined): {SelectedCommand.__qualname__} -> {interface.prefix}{SelectedCommand.name}")
else:
log.debug(f"Registering: {SelectedCommand.__qualname__} -> {interface.prefix}{SelectedCommand.name}")
self.commands[f"{interface.prefix}{SelectedCommand.name}"] = command
# Register aliases, but don't override anything
for alias in SelectedCommand.aliases:
if f"{interface.prefix}{alias}" not in self.commands:
log.debug(f"Aliasing: {SelectedCommand.__qualname__} -> {interface.prefix}{alias}")
self.commands[f"{interface.prefix}{alias}"] = self.commands[f"{interface.prefix}{SelectedCommand.name}"]
else:
log.info(f"Ignoring (already defined): {SelectedCommand.__qualname__} -> {interface.prefix}{alias}")
def _interface_factory(self) -> typing.Type[CommandInterface]: def _interface_factory(self) -> typing.Type[CommandInterface]:
# noinspection PyAbstractClass,PyMethodParameters # noinspection PyAbstractClass,PyMethodParameters
@ -121,20 +132,23 @@ class GenericBot:
"""Create an :py:class:`royalnet.database.Alchemy` with the tables required by the commands. Then, """Create an :py:class:`royalnet.database.Alchemy` with the tables required by the commands. Then,
find the chain that links the ``master_table`` to the ``identity_table``. """ find the chain that links the ``master_table`` to the ``identity_table``. """
if self.uninitialized_database_config: if self.uninitialized_database_config:
log.debug(f"Initializing database") log.info(f"Database: enabled")
required_tables = {self.uninitialized_database_config.master_table, self.uninitialized_database_config.identity_table} required_tables = {self.uninitialized_database_config.master_table, self.uninitialized_database_config.identity_table}
for command in self.uninitialized_commands: for command in self.uninitialized_commands:
required_tables = required_tables.union(command.require_alchemy_tables) required_tables = required_tables.union(command.require_alchemy_tables)
log.debug(f"Found {len(required_tables)} required tables") log.debug(f"Required tables: {', '.join([item.__qualname__ for item in required_tables])}")
self.alchemy = Alchemy(self.uninitialized_database_config.database_uri, required_tables) self.alchemy = Alchemy(self.uninitialized_database_config.database_uri, required_tables)
self.master_table = self.alchemy.__getattribute__(self.uninitialized_database_config.master_table.__name__) self.master_table = self.alchemy.__getattribute__(self.uninitialized_database_config.master_table.__name__)
log.debug(f"Master table: {self.master_table.__qualname__}")
self.identity_table = self.alchemy.__getattribute__(self.uninitialized_database_config.identity_table.__name__) self.identity_table = self.alchemy.__getattribute__(self.uninitialized_database_config.identity_table.__name__)
log.debug(f"Identity table: {self.identity_table.__qualname__}")
self.identity_column = self.identity_table.__getattribute__(self.identity_table, self.identity_column = self.identity_table.__getattribute__(self.identity_table,
self.uninitialized_database_config.identity_column_name) self.uninitialized_database_config.identity_column_name)
log.debug(f"Identity column: {self.identity_column.__class__.__qualname__}")
self.identity_chain = relationshiplinkchain(self.master_table, self.identity_table) self.identity_chain = relationshiplinkchain(self.master_table, self.identity_table)
log.debug(f"Identity chain is {self.identity_chain}") log.debug(f"Identity chain: {' -> '.join([str(item) for item in self.identity_chain])}")
else: else:
log.debug(f"Database is not enabled, setting everything to None") log.debug(f"Database: disabled")
self.alchemy = None self.alchemy = None
self.master_table = None self.master_table = None
self.identity_table = None self.identity_table = None
@ -142,13 +156,13 @@ class GenericBot:
def _init_sentry(self): def _init_sentry(self):
if self.uninitialized_sentry_dsn: if self.uninitialized_sentry_dsn:
log.debug("Sentry integration enabled") log.info("Sentry: enabled")
self.sentry = sentry_sdk.init(self.uninitialized_sentry_dsn, self.sentry = sentry_sdk.init(self.uninitialized_sentry_dsn,
integrations=[AioHttpIntegration(), integrations=[AioHttpIntegration(),
SqlalchemyIntegration(), SqlalchemyIntegration(),
LoggingIntegration(event_level=None)]) LoggingIntegration(event_level=None)])
else: else:
log.debug("Sentry integration disabled") log.info("Sentry: disabled")
def _init_loop(self): def _init_loop(self):
if self.uninitialized_loop is None: if self.uninitialized_loop is None:

View file

@ -10,7 +10,7 @@ class Command:
"""The main name of the command. """The main name of the command.
To have ``/example`` on Telegram, the name should be ``example``.""" To have ``/example`` on Telegram, the name should be ``example``."""
aliases: typing.List[str] = NotImplemented aliases: typing.List[str] = []
"""A list of possible aliases for a command. """A list of possible aliases for a command.
To have ``/e`` as alias for ``/example``, one should set aliases to ``["e"]``.""" To have ``/e`` as alias for ``/example``, one should set aliases to ``["e"]``."""

View file

@ -11,6 +11,8 @@ from ...utils import parse_5etools_entry
class DnditemCommand(Command): class DnditemCommand(Command):
name: str = "dnditem" name: str = "dnditem"
aliases = ["item"]
description: str = "Ottieni informazioni su un oggetto di D&D5e." description: str = "Ottieni informazioni su un oggetto di D&D5e."
syntax = "(nomeoggetto)" syntax = "(nomeoggetto)"

View file

@ -11,6 +11,8 @@ from ...utils import parse_5etools_entry, ordinalformat, andformat
class DndspellCommand(Command): class DndspellCommand(Command):
name: str = "dndspell" name: str = "dndspell"
aliases = ["spell"]
description: str = "Ottieni informazioni su una magia di D&D5e." description: str = "Ottieni informazioni su una magia di D&D5e."
syntax = "(nomemagia)" syntax = "(nomemagia)"

View file

@ -20,6 +20,8 @@ class MmCommand(Command):
Requires the MM_CHANNEL_ID envvar to be set.""" Requires the MM_CHANNEL_ID envvar to be set."""
name: str = "mm" name: str = "mm"
aliases = ["matchmaking", "matchmake"]
description: str = "Trova giocatori per una partita a qualcosa." description: str = "Trova giocatori per una partita a qualcosa."
syntax: str = "[ (data) ] (nomegioco)\n[descrizione]" syntax: str = "[ (data) ] (nomegioco)\n[descrizione]"

View file

@ -11,6 +11,8 @@ from ...audio import YtdlMp3
class Mp3Command(Command): class Mp3Command(Command):
name: str = "mp3" name: str = "mp3"
aliases = ["dlmusic"]
description: str = "Scarica un video con youtube-dl e invialo in chat." description: str = "Scarica un video con youtube-dl e invialo in chat."
syntax = "(ytdlstring)" syntax = "(ytdlstring)"

View file

@ -6,7 +6,7 @@ from ..commandargs import CommandArgs
from ..commanddata import CommandData from ..commanddata import CommandData
from ...utils import NetworkHandler from ...utils import NetworkHandler
from ...network import Request, ResponseSuccess from ...network import Request, ResponseSuccess
from ...error import NoneFoundError from ...error import NoneFoundError, TooManyFoundError
if typing.TYPE_CHECKING: if typing.TYPE_CHECKING:
from ...bots import DiscordBot from ...bots import DiscordBot

View file

@ -56,6 +56,8 @@ class PlayNH(NetworkHandler):
class PlayCommand(Command): class PlayCommand(Command):
name: str = "play" name: str = "play"
aliases = ["p"]
description: str = "Aggiunge una canzone alla coda della chat vocale." description: str = "Aggiunge una canzone alla coda della chat vocale."
syntax = "[ [guild] ] (url)" syntax = "[ [guild] ] (url)"

View file

@ -45,6 +45,8 @@ class PlaymodeNH(NetworkHandler):
class PlaymodeCommand(Command): class PlaymodeCommand(Command):
name: str = "playmode" name: str = "playmode"
aliases = ["pm", "mode"]
description: str = "Cambia modalità di riproduzione per la chat vocale." description: str = "Cambia modalità di riproduzione per la chat vocale."
syntax = "[ [guild] ] (mode)" syntax = "[ [guild] ] (mode)"

View file

@ -50,6 +50,8 @@ class QueueNH(NetworkHandler):
class QueueCommand(Command): class QueueCommand(Command):
name: str = "queue" name: str = "queue"
aliases = ["q"]
description: str = "Visualizza la coda di riproduzione attuale." description: str = "Visualizza la coda di riproduzione attuale."
syntax = "[ [guild] ]" syntax = "[ [guild] ]"

View file

@ -6,7 +6,9 @@ from ..commanddata import CommandData
class RageCommand(Command): class RageCommand(Command):
name: str = "ship" name: str = "rage"
aliases = ["balurage", "madden"]
description: str = "Arrabbiati per qualcosa, come una software house californiana." description: str = "Arrabbiati per qualcosa, come una software house californiana."

View file

@ -17,6 +17,8 @@ from ...error import *
class ReminderCommand(Command): class ReminderCommand(Command):
name: str = "reminder" name: str = "reminder"
aliases = ["calendar"]
description: str = "Ti ricorda di fare qualcosa dopo un po' di tempo." description: str = "Ti ricorda di fare qualcosa dopo un po' di tempo."
syntax: str = "[ (data) ] (messaggio)" syntax: str = "[ (data) ] (messaggio)"

View file

@ -9,6 +9,8 @@ from ...utils import safeformat
class ShipCommand(Command): class ShipCommand(Command):
name: str = "ship" name: str = "ship"
aliases = ["⛵️"]
description: str = "Crea una ship tra due nomi." description: str = "Crea una ship tra due nomi."
syntax = "(nomeuno) (nomedue)" syntax = "(nomeuno) (nomedue)"

View file

@ -39,6 +39,8 @@ class SkipNH(NetworkHandler):
class SkipCommand(Command): class SkipCommand(Command):
name: str = "skip" name: str = "skip"
aliases = ["s", "next", "n"]
description: str = "Salta la canzone attualmente in riproduzione in chat vocale." description: str = "Salta la canzone attualmente in riproduzione in chat vocale."
syntax: str = "[ [guild] ]" syntax: str = "[ [guild] ]"

View file

@ -9,6 +9,8 @@ from ...utils import safeformat
class SmecdsCommand(Command): class SmecdsCommand(Command):
name: str = "smecds" name: str = "smecds"
aliases = ["secondomeecolpadellostagista"]
description: str = "Secondo me, è colpa dello stagista..." description: str = "Secondo me, è colpa dello stagista..."
syntax = "" syntax = ""

View file

@ -28,6 +28,8 @@ class SummonNH(NetworkHandler):
class SummonCommand(Command): class SummonCommand(Command):
name: str = "summon" name: str = "summon"
aliases = ["cv"]
description: str = "Evoca il bot in un canale vocale." description: str = "Evoca il bot in un canale vocale."
syntax: str = "[nomecanale]" syntax: str = "[nomecanale]"

View file

@ -16,6 +16,8 @@ from ...database.tables import TriviaScore
class TriviaCommand(Command): class TriviaCommand(Command):
name: str = "trivia" name: str = "trivia"
aliases = ["t"]
description: str = "Manda una domanda dell'OpenTDB in chat." description: str = "Manda una domanda dell'OpenTDB in chat."
require_alchemy_tables = {TriviaScore} require_alchemy_tables = {TriviaScore}

View file

@ -9,6 +9,8 @@ from ...error import *
class VideochannelCommand(Command): class VideochannelCommand(Command):
name: str = "videochannel" name: str = "videochannel"
aliases = ["golive", "live", "video"]
description: str = "Converti il canale vocale in un canale video." description: str = "Converti il canale vocale in un canale video."
syntax = "[channelname]" syntax = "[channelname]"

View file

@ -76,6 +76,8 @@ class ZawarudoNH(NetworkHandler):
class ZawarudoCommand(Command): class ZawarudoCommand(Command):
name: str = "zawarudo" name: str = "zawarudo"
aliases = ["theworld", "world"]
description: str = "Ferma il tempo!" description: str = "Ferma il tempo!"
syntax = "[ [guild] ] [1-9]" syntax = "[ [guild] ] [1-9]"

View file

@ -1 +1 @@
semantic = "5.0a62" semantic = "5.0a63"