227 lines
7.6 KiB
Python
227 lines
7.6 KiB
Python
from datetime import datetime, timedelta, timezone
|
|
|
|
import discord
|
|
|
|
from payphone.db import models
|
|
from payphone.bot import Payphone
|
|
from payphone.core import constants, formatting
|
|
from payphone.cogs.admin import embeds
|
|
|
|
|
|
class ReportView(discord.ui.View):
|
|
"""The report view."""
|
|
|
|
def __init__(self, bot: Payphone, report: models.Report) -> None:
|
|
"""Initializes the ReportView.
|
|
|
|
Args:
|
|
bot (Payphone): The bot.
|
|
report (models.Report): The report.
|
|
"""
|
|
|
|
super().__init__(disable_on_timeout=True)
|
|
|
|
self.bot = bot
|
|
self.report = report
|
|
|
|
@discord.ui.select(
|
|
placeholder="Select an action",
|
|
options=[
|
|
discord.SelectOption(
|
|
value="approve",
|
|
label="Approve",
|
|
description="Send a nice message to the user (does not ban nor warn).",
|
|
),
|
|
discord.SelectOption(
|
|
value="warn",
|
|
label="Warn",
|
|
description="Send a warning to the user. This is done automatically.",
|
|
),
|
|
discord.SelectOption(
|
|
value="ban",
|
|
label="Ban",
|
|
description="Ban the user. The duration of the ban will be applied automatically.",
|
|
),
|
|
discord.SelectOption(
|
|
value="ban_permanently",
|
|
label="Permanent Ban",
|
|
description="Ban the user permanently. Use this when the user must not be allowed back.",
|
|
),
|
|
],
|
|
)
|
|
async def action_callback(
|
|
self, select: discord.SelectMenu, interaction: discord.Interaction
|
|
) -> None:
|
|
"""Handles the action select."""
|
|
|
|
self.report.resolved = True
|
|
await self.report.save()
|
|
|
|
report = await models.Report.filter(resolved=False).first()
|
|
|
|
if report is None:
|
|
self.stop()
|
|
|
|
await interaction.response.edit_message(
|
|
content="✅ No reports left, have this cookie 🍪 !!",
|
|
embeds=[],
|
|
view=None,
|
|
)
|
|
|
|
else:
|
|
await interaction.response.edit_message(
|
|
embed=embeds.report_embed(report), view=ReportView(self.bot, report)
|
|
)
|
|
|
|
user = await models.User.get_cache_or_db(self.bot.redis, self.report.user_id)
|
|
|
|
if select.values[0] == "warn":
|
|
user.warns_count += 1
|
|
await user.save(force_update=True)
|
|
await user.set_cache(self.bot.redis)
|
|
|
|
embed = discord.Embed(
|
|
color=constants.MASK_COLOR,
|
|
title="Warned",
|
|
description=f"You've been warned. You've received `{user.warns_count}` warnings in total.",
|
|
fields=[
|
|
discord.EmbedField(
|
|
name="Message Content",
|
|
value=f"{formatting.trim(self.report.message_content, 500)}",
|
|
),
|
|
discord.EmbedField(
|
|
name="User Name",
|
|
value=self.report.user_name,
|
|
),
|
|
],
|
|
thumbnail=self.report.user_avatar_url,
|
|
footer=discord.EmbedFooter(
|
|
text="⚠️ Repeating this action will result in a ban."
|
|
),
|
|
)
|
|
|
|
try:
|
|
await (await self.bot.get_or_fetch_user(self.report.user_id)).send(
|
|
embed=embed
|
|
)
|
|
|
|
except discord.Forbidden:
|
|
pass
|
|
|
|
elif select.values[0] == "approve":
|
|
embed = discord.Embed(
|
|
color=constants.APPROVE_COLOR,
|
|
title="Approved",
|
|
description="You got reported, but the mods laughed at this so the report got dismissed.",
|
|
fields=[
|
|
discord.EmbedField(
|
|
name="Message Content",
|
|
value=f"{formatting.trim(self.report.message_content, 500)}",
|
|
),
|
|
discord.EmbedField(
|
|
name="User Name",
|
|
value=self.report.user_name,
|
|
),
|
|
],
|
|
thumbnail=self.report.user_avatar_url,
|
|
footer=discord.EmbedFooter(
|
|
text="🫢 Damn."
|
|
),
|
|
)
|
|
|
|
try:
|
|
await (await self.bot.get_or_fetch_user(self.report.user_id)).send(
|
|
embed=embed
|
|
)
|
|
|
|
except discord.Forbidden:
|
|
pass
|
|
|
|
else:
|
|
user.bans_count += 1
|
|
await user.save(force_update=True)
|
|
await user.set_cache(self.bot.redis)
|
|
|
|
expires_at = None
|
|
|
|
if select.values[0] == "ban":
|
|
expiry_times = {
|
|
1: datetime.now(timezone.utc) + timedelta(days=1),
|
|
2: datetime.now(timezone.utc) + timedelta(days=7),
|
|
3: datetime.now(timezone.utc) + timedelta(days=30),
|
|
}
|
|
|
|
expires_at = expiry_times.get(user.bans_count, None)
|
|
|
|
await self.bot.ban(
|
|
self.report.user_id,
|
|
self.report,
|
|
expires_at=expires_at,
|
|
created_by_id=interaction.user.id,
|
|
)
|
|
|
|
embed = discord.Embed(
|
|
color=constants.MODERATOR_COLOR,
|
|
title="Banned",
|
|
description=f"You've been banned. You've been banned `{user.bans_count}` times.",
|
|
fields=[
|
|
discord.EmbedField(
|
|
name="Message Content",
|
|
value=f"You sent the following message in a call:\n> {formatting.trim(self.report.message_content, 900)}",
|
|
),
|
|
discord.EmbedField(
|
|
name="User Name",
|
|
value=self.report.user_name,
|
|
),
|
|
discord.EmbedField(
|
|
name="Expires At",
|
|
value=(
|
|
expires_at.strftime("%Y-%m-%d %H:%M:%S")
|
|
+ f" <t:{int(expires_at.timestamp())}:R>"
|
|
if expires_at
|
|
else "Never"
|
|
),
|
|
),
|
|
],
|
|
thumbnail=self.report.user_avatar_url,
|
|
footer=discord.EmbedFooter(
|
|
text=(
|
|
"⚠️ In case you get banned again, your ban will last longer. Multiple bans will result in a permanent ban."
|
|
if expires_at is not None
|
|
else "⚠️ You've been permanently banned."
|
|
)
|
|
),
|
|
)
|
|
|
|
try:
|
|
await (await self.bot.get_or_fetch_user(self.report.user_id)).send(
|
|
embed=embed
|
|
)
|
|
|
|
except discord.Forbidden:
|
|
pass
|
|
|
|
@discord.ui.button(label="Skip", style=discord.ButtonStyle.gray)
|
|
async def skip_callback(
|
|
self, _button: discord.ui.Button, interaction: discord.Interaction
|
|
) -> None:
|
|
"""Skips the report."""
|
|
|
|
self.report.resolved = True
|
|
await self.report.save()
|
|
|
|
report = await models.Report.filter(resolved=False).first()
|
|
|
|
if report is None:
|
|
self.stop()
|
|
|
|
return await interaction.response.edit_message(
|
|
content="✅ No reports left, have this cookie 🍪 !!",
|
|
embeds=[],
|
|
view=None,
|
|
)
|
|
|
|
await interaction.response.edit_message(
|
|
embed=embeds.report_embed(report), view=ReportView(self.bot, report)
|
|
)
|