college-bot-v1/cogs/events.py

104 lines
3.9 KiB
Python
Raw Normal View History

2022-10-06 09:20:23 +01:00
from typing import Optional
2022-10-13 08:53:45 +01:00
from datetime import datetime, time
2022-10-06 09:20:23 +01:00
import discord
2022-10-13 08:53:45 +01:00
from discord.ext import commands, tasks
2022-10-06 09:20:23 +01:00
from utils import Student, get_or_none
2022-10-13 08:53:45 +01:00
from config import guilds, lupupa_warning
2022-10-06 09:20:23 +01:00
LTR = "\N{black rightwards arrow}\U0000fe0f"
RTL = "\N{leftwards black arrow}\U0000fe0f"
class Events(commands.Cog):
def __init__(self, bot):
self.bot: commands.Bot = bot
2022-10-13 08:53:45 +01:00
self.lupupa_warning_task.start()
def cog_unload(self):
self.lupupa_warning_task.stop()
@tasks.loop(minutes=30)
2022-10-13 08:53:45 +01:00
async def lupupa_warning_task(self):
2022-10-20 10:05:50 +01:00
if not self.bot.is_ready():
await self.bot.wait_until_ready()
2022-10-20 15:54:27 +01:00
now = datetime.now()
lupupa_warning_text = "\N{warning sign} Lupupa warning!!!"
2022-10-20 15:54:27 +01:00
lupupa_recovery_text = "\N{loudly crying face} Lupupa recovery..."
if lupupa_warning and now.strftime("%A") == "Thursday":
if now.time() > time(15, 15):
text = lupupa_recovery_text
2022-10-20 15:55:31 +01:00
status = discord.Status.idle
2022-10-20 15:54:27 +01:00
else:
text = lupupa_warning_text
2022-10-24 11:49:11 +01:00
status = discord.Status.dnd
2022-10-20 10:08:14 +01:00
if self.bot.activity:
2022-10-20 15:54:27 +01:00
if self.bot.activity.name == text:
2022-10-20 10:08:14 +01:00
return
await self.bot.change_presence(
activity=discord.Activity(
2022-10-20 15:54:27 +01:00
name=text,
type=discord.ActivityType.playing
2022-10-20 10:08:14 +01:00
),
2022-10-20 15:55:31 +01:00
status=status
2022-10-20 10:08:14 +01:00
)
else:
await self.bot.change_presence()
2022-10-06 09:20:23 +01:00
2022-10-06 09:34:23 +01:00
@commands.Cog.listener("on_raw_reaction_add")
2022-10-06 09:20:23 +01:00
async def on_raw_reaction_add(self, payload: discord.RawReactionActionEvent):
channel: Optional[discord.TextChannel] = self.bot.get_channel(payload.channel_id)
2022-10-06 09:31:20 +01:00
if channel is not None:
2022-10-06 09:20:23 +01:00
try:
message: discord.Message = await channel.fetch_message(payload.message_id)
except discord.HTTPException:
return
2022-10-06 09:32:38 +01:00
if message.author.id == self.bot.user.id:
2022-10-09 19:27:02 +01:00
if payload.emoji.name == "\N{wastebasket}\U0000fe0f":
2022-10-06 09:31:20 +01:00
await message.delete(delay=1)
2022-10-06 09:20:23 +01:00
@commands.Cog.listener()
async def on_member_join(self, member: discord.Member):
if member.guild is None or member.guild.id not in guilds:
return
student: Optional[Student] = await get_or_none(Student, user_id=member.id)
if student and student.id:
role = discord.utils.find(lambda r: r.name.lower() == "verified", member.guild.roles)
if role and role < member.guild.me.top_role:
await member.add_roles(role, reason="Verified")
channel: discord.TextChannel = discord.utils.get(member.guild.text_channels, name="general")
if channel and channel.can_send():
await channel.send(
f"{LTR} {member.mention} {f'({student.id})' if student else '(pending verification)'}"
)
@commands.Cog.listener()
async def on_member_remove(self, member: discord.Member):
if member.guild is None or member.guild.id not in guilds:
return
student: Optional[Student] = await get_or_none(Student, user_id=member.id)
channel: discord.TextChannel = discord.utils.get(member.guild.text_channels, name="general")
if channel and channel.can_send():
await channel.send(
f"{RTL} {member.mention} {f'({student.id})' if student else '(pending verification)'}"
)
2022-10-09 19:27:02 +01:00
@commands.Cog.listener()
async def on_message(self, message: discord.Message):
if message.channel.name == "pinboard":
2022-10-10 18:15:48 +01:00
if message.type == discord.MessageType.pins_add:
await message.delete(delay=0.01)
else:
try:
await message.pin(reason="Automatic pinboard pinning")
except discord.HTTPException as e:
return await message.reply(f"Failed to auto-pin: {e}", delete_after=10)
2022-10-09 19:27:02 +01:00
2022-10-06 09:20:23 +01:00
def setup(bot):
bot.add_cog(Events(bot))