feat: Refactored all cogs implementation
Some checks failed
CI / Run tests (pull_request) Has been cancelled

This commit is contained in:
2026-09-12 23:16:43 +02:00
parent 505621e0cd
commit c86ea54e86
10 changed files with 451 additions and 123 deletions

View File

@@ -1,32 +1,76 @@
import discord, json, os, random, re
import collections
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(commands.Cog):
def __init__(self, bot:discord.Bot):
self.bot = bot
class InsultsCog(FeatureCog):
def __init__(self, bot: discord.Bot):
super().__init__(bot, feature_name="insults")
LOGGER.debug("InsultsCog initialized")
with open(os.path.join(Config.CONFIG_PATH, "insults.txt")) as f:
self.insults = [l.strip() for l in f.readlines()]
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 len(message.content.split()) > 3:
author = message.author
if any(author.id == u.id for u in self.men):
r = int(random.random()*100)
print(r)
if r < 5:
insult = random.choice(self.insults)
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.men:list[discord.Member] = []
for guild in self.bot.guilds:
for role in guild.roles:
if re.match(r'^([hH]im|[hH]e).*$',role.name):
self.men.extend(role.members)
self.men = list(set(self.men))
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()