rewrite: New Video channels and moderation.

This commit is contained in:
2023-08-15 14:03:23 +03:00
parent 7e6217a2ae
commit 2cc90375c7
21 changed files with 2227 additions and 11 deletions

View File

@@ -0,0 +1,110 @@
import datetime as dt
import discord
from meta import LionBot
from utils.lib import utc_now
from modules.moderation.cog import ModerationCog
from modules.moderation.data import TicketType, TicketState, ModerationData
from modules.moderation.ticket import Ticket, ticket_factory
from . import babel, logger
from .settings import VideoSettings
@ticket_factory(TicketType.STUDY_BAN)
class VideoTicket(Ticket):
__slots__ = ()
@classmethod
async def create(
cls, bot: LionBot, member: discord.Member,
moderatorid: int, reason: str, expiry=None,
**kwargs
):
modcog: ModerationCog = bot.get_cog('ModerationCog')
ticket_data = await modcog.data.Ticket.create(
guildid=member.guild.id,
targetid=member.id,
ticket_type=TicketType.STUDY_BAN,
ticket_state=TicketState.EXPIRING if expiry else TicketState.OPEN,
moderator_id=moderatorid,
auto=(moderatorid == bot.user.id),
content=reason,
expiry=expiry,
**kwargs
)
lguild = await bot.core.lions.fetch_guild(member.guild.id, guild=member.guild)
new_ticket = cls(lguild, ticket_data)
# Schedule expiry if required
if expiry:
cls.expiring.schedule_task(ticket_data.ticketid, expiry.timestamp())
await new_ticket.post()
# Cancel any existent expiring video blacklists
tickets = await cls.fetch_tickets(
bot,
(modcog.data.Ticket.ticketid != new_ticket.data.ticketid),
guildid=member.guild.id,
targetid=member.id,
ticket_state=TicketState.EXPIRING
)
for ticket in tickets:
await ticket.cancel_expiry()
return new_ticket
@classmethod
async def autocreate(cls, bot: LionBot, target: discord.Member, reason: str, **kwargs):
modcog: ModerationCog = bot.get_cog('ModerationCog')
lguild = await bot.core.lions.fetch_guild(target.guild.id, guild=target.guild)
blacklist = lguild.config.get(VideoSettings.VideoBlacklist.setting_id).value
if not blacklist:
return
# This will propagate HTTPException if needed
await target.add_roles(blacklist, reason=reason)
Ticket = modcog.data.Ticket
row = await Ticket.table.select_one_where(
(Ticket.ticket_state != TicketState.PARDONED),
guildid=target.guild.id,
targetid=target.id,
ticket_type=TicketType.STUDY_BAN,
).with_no_adapter().select(ticket_count="COUNT(*)")
count = row[0]['ticket_count'] if row else 0
durations = (await VideoSettings.VideoBlacklistDurations.get(target.guild.id)).value
if count < len(durations):
durations.sort()
duration = durations[count]
expiry = utc_now() + dt.timedelta(seconds=duration)
else:
duration = None
expiry = None
return await cls.create(
bot, target,
bot.user.id, reason,
duration=duration, expiry=expiry,
**kwargs
)
async def _revert(self, reason=None):
target = self.target
blacklist = self.lguild.config.get(VideoSettings.VideoBlacklist.setting_id).value
# TODO: User lion.remove_role instead
if target and blacklist in target.roles:
try:
await target.remove_roles(
blacklist,
reason=reason
)
except discord.HTTPException as e:
logger.debug(f"Revert failed for ticket {self.data.ticketid}: {e.text}")