import discord, random, re from discord.ext import commands from setup.logger import LOGGER from setup.config import Config from cogs import FeatureCog class InsultsCog(FeatureCog): def __init__(self, bot: discord.Bot): super().__init__(bot, feature_name="insults") LOGGER.debug("InsultsCog initialized") def reload_men_list(self): self.men: list[discord.Member] = [] for guild in self.bot.guilds: for role in guild.roles: if role.name and re.match(r'^([hH]im|[hH]e).*$', role.name): self.men.extend(role.members) # dedupe by id self.men = list({m.id: m for m in self.men}.values()) @commands.Cog.listener() async def on_message(self, message: discord.Message): if not message.guild or message.author.bot: return # only run if feature enabled for this guild if not self.is_enabled(message.guild.id): return if len(message.content.split()) <= 3: return author = message.author if not hasattr(self, 'men') or not self.men: self.reload_men_list() if any(author.id == u.id for u in self.men): guild_cfg = Config.GUILD_CONFIGS.get(message.guild.id, {}) insults_cfg = guild_cfg.get("configs", {}).get("insults", {}) safeguard_patterns = insults_cfg.get("safeguard_patterns", []) safeguard_match = any(re.match(pattern, message.content) for pattern in safeguard_patterns) if safeguard_match: return r = random.random() * 100 exceptions = insults_cfg.get("exceptions", []) filtered = [ex for ex in exceptions if ex.get("user_id") == author.id] if filtered: try: r *= float(filtered[0].get("factor", 1)) except Exception: pass if r < 5: insults = insults_cfg.get("insults", []) if insults: insult = random.choice(insults) await message.reply(insult) @commands.Cog.listener() async def on_ready(self): self.reload_men_list() @commands.Cog.listener() async def on_member_update(self, before: discord.Member, after: discord.Member): before_roles = set(before.roles) after_roles = set(after.roles) removed = before_roles.difference(after_roles) added = after_roles.difference(before_roles) role = None if removed: role = list(removed).pop() elif added: role = list(added).pop() if role and re.match(r'^([hH]im|[hH]e).*$', role.name): self.reload_men_list()