Some checks failed
CI / Run tests (pull_request) Has been cancelled
76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
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() |