111 lines
3.6 KiB
Python
111 lines
3.6 KiB
Python
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}")
|