diff --git a/bot/exts/levels/_cog.py b/bot/exts/levels/_cog.py index abdd3b1..9f934de 100644 --- a/bot/exts/levels/_cog.py +++ b/bot/exts/levels/_cog.py @@ -132,6 +132,10 @@ async def _cycle_rules_task(self) -> None: rule_trigger for rule in self.rules_active for rule_trigger in rule.rule_triggers if rule_trigger.interaction_type=="reaction" ] + self.all_message_rule_triggers = [ + rule_trigger for rule in self.rules_all + for rule_trigger in rule.rule_triggers if rule_trigger.interaction_type=="message" + ] # [rule for rule in self.rules_active if rule.interaction_type=="reaction"] # self.active_message_rule_triggers = [rule for rule in self.rules_active if rule.interaction_type=="message"] @@ -194,6 +198,9 @@ async def _update_role_assignment(self, user_id: int) -> None: user = await members.get_or_fetch_member(guild, user_id) if role in user.roles: return + for user_role in user.roles: + if user_role in LEVEL_ROLES: + await members.handle_role_change(user, user.remove_roles, user_role) logger.debug(f"Assigning {role.name} to {user.name}") await members.handle_role_change(user, user.add_roles, role) @@ -224,6 +231,15 @@ async def on_message(self, msg: discord.Message) -> None: user_id = msg.author.id await self._update_points(user_id, total_points) + total_rule_matches = 0 + for rule_trigger in self.all_message_rule_triggers: + re_pattern = rule_trigger.message_content + match = re.search(re_pattern, msg.content) + if match: + total_rule_matches += 1 + if total_rule_matches >= 3: + await self._update_points(user_id, -5) + @commands.Cog.listener() async def on_reaction_add(self, reaction: discord.Reaction, user: discord.Member) -> None: diff --git a/bot/exts/levels/rules/monty_python.toml b/bot/exts/levels/rules/monty_python.toml index 721fb4b..ec74112 100644 --- a/bot/exts/levels/rules/monty_python.toml +++ b/bot/exts/levels/rules/monty_python.toml @@ -17,3 +17,13 @@ points = 3 interaction_type = "message" message_content = '''\b(IDLE|Idle|Cleese|Gilliam|Jones|Chapman|Palin)\b''' points = 1 + +[[rule]] +interaction_type = "message" +message_content = '''\b(\'[Tt]is but a scratch)\b''' +points = 1 + +[[rule]] +interaction_type = "message" +message_content = '''\b([Ff]light [Ss]peed|[Uu]nladen [Ss]wallow|[Aa]frican or [Ee]uropean)\b''' +points = 2