Fix mistake and handle errors

This commit is contained in:
Tulir Asokan 2019-06-23 02:56:44 +03:00
parent 0fcf7a8319
commit 2c54aa395a

View file

@ -89,7 +89,7 @@ class Template:
**extra_vars} **extra_vars}
content = copy.deepcopy(self.content) content = copy.deepcopy(self.content)
for path in self._variable_locations: for path in self._variable_locations:
data: Dict[str, Any] = self._recurse(content, path[:1]) data: Dict[str, Any] = self._recurse(content, path[:-1])
key = path[-1] key = path[-1]
if isinstance(key, Key): if isinstance(key, Key):
key = str(key) key = str(key)
@ -123,6 +123,10 @@ class Rule:
await evt.client.send_message_event(evt.room_id, self.type or self.template.type, content) await evt.client.send_message_event(evt.room_id, self.type or self.template.type, content)
class ConfigError(Exception):
pass
class ReactBot(Plugin): class ReactBot(Plugin):
rules: Dict[str, Rule] rules: Dict[str, Rule]
templates: Dict[str, Template] templates: Dict[str, Template]
@ -142,24 +146,33 @@ class ReactBot(Plugin):
return {name: JinjaTemplate(var_tpl) for name, var_tpl return {name: JinjaTemplate(var_tpl) for name, var_tpl
in data.get("variables", {}).items()} in data.get("variables", {}).items()}
def _make_template(self, tpl: Dict[str, Any]) -> Template: def _make_template(self, name: str, tpl: Dict[str, Any]) -> Template:
return Template(type=EventType.find(tpl.get("type", "m.room.message")), try:
variables=self._parse_variables(tpl), return Template(type=EventType.find(tpl.get("type", "m.room.message")),
content=tpl.get("content", {})).init() variables=self._parse_variables(tpl),
content=tpl.get("content", {})).init()
except Exception as e:
raise ConfigError(f"Failed to load {name}") from e
def _make_rule(self, rule: Dict[str, Any]) -> Rule: def _make_rule(self, name: str, rule: Dict[str, Any]) -> Rule:
return Rule(rooms=set(rule.get("rooms", [])), try:
matches=[re.compile(match) for match in rule.get("matches")], return Rule(rooms=set(rule.get("rooms", [])),
type=EventType.find(rule["type"]) if "type" in rule else None, matches=[re.compile(match) for match in rule.get("matches")],
template=self.templates[rule["template"]], type=EventType.find(rule["type"]) if "type" in rule else None,
variables=self._parse_variables(rule)) template=self.templates[rule["template"]],
variables=self._parse_variables(rule))
except Exception as e:
raise ConfigError(f"Failed to load {name}") from e
def on_external_config_update(self) -> None: def on_external_config_update(self) -> None:
self.config.load_and_update() self.config.load_and_update()
self.templates = {name: self._make_template(tpl) try:
for name, tpl in self.config["templates"].items()} self.templates = {name: self._make_template(name, tpl)
self.rules = {name: self._make_rule(rule) for name, tpl in self.config["templates"].items()}
for name, rule in self.config["rules"].items()} self.rules = {name: self._make_rule(name, rule)
for name, rule in self.config["rules"].items()}
except ConfigError:
self.log.exception("Failed to load config")
@event.on(EventType.ROOM_MESSAGE) @event.on(EventType.ROOM_MESSAGE)
async def event_handler(self, evt: MessageEvent) -> None: async def event_handler(self, evt: MessageEvent) -> None: