from ...messaging import RollbotMessage class ArgConverter: def __init__(self, conv): self.conv = conv Message = ArgConverter(lambda _, __, msg: msg) Database = ArgConverter(lambda _, db, __: db) Logger = ArgConverter(lambda cmd, _, __: cmd.logger) Bot = ArgConverter(lambda cmd, _, __: cmd.bot) ArgList = ArgConverter(lambda _, __, msg: msg.arg_list()) Subcommand = ArgConverter(lambda _, __, msg: RollbotMessage.from_subcommand(msg)) class Config(ArgConverter): def __init__(self, key): super().__init__(lambda cmd, _, __, key=key: cmd.bot.config.get(key)) class Singleton(ArgConverter): def __init__(self, cls): super().__init__(lambda _, db, msg, cls=cls: cls.get_or_create(db, msg)) def get_converters(parameters, annotations): converters = [] for p in parameters: annot = annotations.get(p, None) if isinstance(annot, ArgConverter): converters.append(annot.conv) elif p in ("msg", "message", "_msg"): converters.append(lambda cmd, db, msg: msg) elif p in ("db", "database"): converters.append(lambda cmd, db, msg: db) elif p in ("log", "logger"): converters.append(lambda cmd, db, msg: cmd.logger) elif p in ("bot", "rollbot"): converters.append(lambda cmd, db, msg: cmd.bot) elif p in ("args", "arg_list"): converters.append(lambda cmd, db, msg: msg.arg_list()) elif p in ("subc", "subcommand"): converters.append(lambda cmd, db, msg: RollbotMessage.from_subcommand(msg)) elif p in ("cfg", "config"): converters.append(lambda cmd, db, msg: cmd.bot.config) elif p.startswith("cfg") or p.endswith("cfg"): annot = annot or p converters.append(lambda cmd, db, msg, key=annot: cmd.bot.config.get(key)) elif p.startswith("data") or p.endswith("data"): converters.append(lambda cmd, db, msg, sing_cls=annot: sing_cls.get_or_create(db, msg)) else: raise ValueError(p) return converters