Ruby-Cogs/levelup/listeners/reactions.py
Valerie 477974d53c
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
Upload 2 Cogs & Update README
2025-05-23 01:30:53 -04:00

72 lines
2.3 KiB
Python

import logging
from datetime import datetime, timedelta
import discord
from redbot.core import commands
from redbot.core.i18n import Translator
from ..abc import MixinMeta
log = logging.getLogger("red.vrt.levelup.listeners.reactions")
_ = Translator("LevelUp", __file__)
class ReactionListener(MixinMeta):
@commands.Cog.listener()
async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent):
if not payload:
return
if not payload.guild_id:
return
if not payload.member:
return
if payload.emoji.name != "\N{WHITE MEDIUM STAR}":
return
if not payload.member:
return
if payload.member.bot:
return
guild = self.bot.get_guild(payload.guild_id)
if not guild:
return
if guild.id in self.db.ignored_guilds:
return
channel = guild.get_channel(payload.channel_id)
if not channel:
return
try:
msg = await channel.fetch_message(payload.message_id)
except (discord.NotFound, discord.Forbidden):
return
if not msg:
return
if msg.author.bot:
return
if msg.author.id == payload.member.id:
return
last_used = self.stars.setdefault(guild.id, {}).get(payload.member.id)
conf = self.db.get_conf(guild)
now = datetime.now()
if last_used:
can_use_after = last_used + timedelta(seconds=conf.starcooldown)
if now < can_use_after:
return
self.stars[guild.id][payload.member.id] = now
profile = conf.get_profile(msg.author)
profile.stars += 1
if conf.weeklysettings.on:
weekly = conf.get_weekly_profile(msg.author)
weekly.stars += 1
self.save()
txt = _("{} just gave a star to {}!").format(
f"**{payload.member.display_name}**",
f"**{msg.author.display_name}**",
)
if conf.starmention and channel.permissions_for(guild.me).send_messages:
kwargs = {"content": txt}
if conf.starmentionautodelete:
kwargs["delete_after"] = conf.starmentionautodelete
await channel.send(**kwargs)