72 lines
2.3 KiB
Python
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)
|