281 lines
16 KiB
Python
281 lines
16 KiB
Python
import disnake
|
||
from disnake.ext import commands
|
||
from disnake.ext import tasks
|
||
import requests
|
||
import numpy as np
|
||
import asyncio
|
||
import sys
|
||
import os
|
||
import copy
|
||
import datetime
|
||
import math
|
||
import random
|
||
import json
|
||
import shutil
|
||
|
||
|
||
def setup(bot):
|
||
bot.add_cog(UIModule(bot))
|
||
|
||
class UIModule(commands.Cog):
|
||
def __init__(self, client):
|
||
self.client = client
|
||
self.DataBaseManager = self.client.DataBaseManager
|
||
|
||
@commands.Cog.listener()
|
||
async def on_ready(self):
|
||
print(f'KrekModBot UI module activated')
|
||
|
||
@commands.slash_command(description="Показывает действительные наказания пользователя", name="наказания")
|
||
async def penalties(self, ctx: disnake.AppCmdInter, member: disnake.Member = None):
|
||
models = self.client.DataBaseManager.model_classes
|
||
if not member:
|
||
member = ctx.author
|
||
embed = self.client.AnswEmbed(title="Наказания", description = f"{member.mention}")
|
||
embed.set_thumbnail(url=member.avatar)
|
||
|
||
async with self.DataBaseManager.session() as session:
|
||
async with session.begin():
|
||
stmt = self.DataBaseManager.select(models['punishment_mutes_text']).where(models['punishment_mutes_text'].user_id == member.id)
|
||
result = (await session.execute(stmt)).scalars().all()
|
||
stmt = self.DataBaseManager.select(models['punishment_mutes_voice']).where(models['punishment_mutes_voice'].user_id == member.id)
|
||
result += (await session.execute(stmt)).scalars().all()
|
||
stmt = self.DataBaseManager.select(models['punishment_bans']).where(models['punishment_bans'].user_id == member.id)
|
||
result += (await session.execute(stmt)).scalars().all()
|
||
stmt = self.DataBaseManager.select(models['punishment_warns']).where(models['punishment_warns'].user_id == member.id)
|
||
result += (await session.execute(stmt)).scalars().all()
|
||
stmt = self.DataBaseManager.select(models['punishment_reprimands']).where(models['punishment_reprimands'].user_id == member.id)
|
||
result += (await session.execute(stmt)).scalars().all()
|
||
stmt = self.DataBaseManager.select(models['punishment_perms']).where(models['punishment_perms'].user_id == member.id)
|
||
result += (await session.execute(stmt)).scalars().all()
|
||
|
||
result = sorted(result, key=lambda a: a.time_begin, reverse=True)
|
||
|
||
for penalt in result:
|
||
match penalt.get_table_name():
|
||
case 'punishment_mutes_text':
|
||
embed.add_field(name = f"Текстовый мут", value = f"Заканчивается {'<t:{time_end}:f>'.format(time_end = int(penalt.time_end)) if penalt.time_warn is None else '<t:{time_warn}:f> (предупреждение)'.format(time_warn = int(penalt.time_warn))}\n```{penalt.reason}```", inline = False)
|
||
case 'punishment_mutes_voice':
|
||
embed.add_field(name = f"Голосовой мут", value = f"Заканчивается {'<t:{time_end}:f>'.format(time_end = int(penalt.time_end)) if penalt.time_warn is None else '<t:{time_warn}:f> (предупреждение)'.format(time_warn = int(penalt.time_warn))}\n```{penalt.reason}```", inline = False)
|
||
case 'punishment_bans':
|
||
embed.add_field(name = f"Бан", value = f"Заканчивается {'<t:{time_end}:f>'.format(time_end = int(penalt.time_end)) if not penalt.time_end is None else 'никогда (предупреждение)'}\n```{penalt.reason}```", inline = False)
|
||
case 'punishment_warns':
|
||
embed.add_field(name = f"Предупреждение", value = f"Заканчивается <t:{int(penalt.time_warn)}:f>\n```{penalt.reason}```", inline = False)
|
||
case 'punishment_reprimands':
|
||
embed.add_field(name = f"Выговор", value = f"Заканчивается <t:{int(penalt.time_warn)}:f>\n```{penalt.reason}```", inline = False)
|
||
case 'punishment_perms':
|
||
embed.add_field(name = f"Вечный бан", value = f"```{penalt.reason}```", inline = False)
|
||
|
||
if len(embed.fields)==0:
|
||
embed.add_field(name = f"Наказаний нет", value = f"", inline = False)
|
||
|
||
await ctx.response.send_message(embed = embed)
|
||
|
||
|
||
@commands.slash_command(description="Подайте жалобу на нарушение правил сервера или действия модератора", name="жалоба")
|
||
async def report(self, ctx: disnake.AppCmdInter, member: disnake.Member = commands.Param(description="На кого хотите подать жалобу?", name="пользователь"), reason: str = commands.Param(description="Кратко опишите причину жалобы", name="причина")):
|
||
|
||
client = self.client
|
||
async def ReportCallback(ctx, member, report_message, reason, embed, mentions, mod):
|
||
|
||
async def AcceptCallback(report_message, member, embed, mod, call, channel):
|
||
if call.author == mod.author:
|
||
await channel.delete()
|
||
embed.set_footer(text = f"Рассмотрено в пользу исца\n{mod.author.name} ({mod.author.id})")
|
||
embed.colour=0x008000
|
||
await report_message.edit(content = "", embed=embed, view=None)
|
||
await member.send(embed = client.WarnEmbed(title=f"", description = f"После разбора нарушения модератор {mod.author.mention} признал вас виновным"))
|
||
|
||
await client.bt_send({"type": "complaint", "options": {"accepted": True, "attack_member": ctx.author.id, "defence_member": member.id, "moderator": mod.author.id}})
|
||
else:
|
||
await call.send(embed = client.ErrEmbed(title=f"", description = f"Только судья может использовать эти команды"), ephemeral=True)
|
||
|
||
async def DenyCallback(report_message, member, embed, mod, call, channel):
|
||
if call.author == mod.author:
|
||
await channel.delete()
|
||
embed.set_footer(text = f"Рассмотрено в пользу ответчика\n{mod.author.name} ({mod.author.id})")
|
||
embed.colour=0x008000
|
||
await report_message.edit(content = "", embed=embed, view=None)
|
||
#await member.send(embed = client.AnswEmbed(title=f"", description = f"После разбора нарушения модератор {mod.author.mention} признал вас невиновным", colour = 0xff9900))
|
||
|
||
await client.bt_send({"type": "complaint", "options": {"accepted": False, "attack_member": ctx.author.id, "defence_member": member.id, "moderator": mod.author.id}})
|
||
else:
|
||
await call.send(embed = client.ErrEmbed(title=f"", description = f"Только судья может использовать эти команды"), ephemeral=True)
|
||
|
||
class AttackClass:
|
||
def __init__(self, member, channel, mod):
|
||
self.member=member
|
||
self.channel=channel
|
||
self.mod=mod
|
||
self.permatt=True
|
||
async def callback(self, mod):
|
||
if mod.author == self.mod.author:
|
||
await self.channel.set_permissions(self.member, read_messages = True, read_message_history=True, send_messages=self.permatt) #read_messages=self.permatt
|
||
await mod.send(embed = client.SuccessEmbed(title=f"", description = f"{self.member.mention}-{'право ответа включено' if self.permatt else 'право ответа выключено'}"), ephemeral=True)
|
||
self.permatt=not self.permatt
|
||
else:
|
||
await mod.send(embed = client.ErrEmbed(title=f"", description = f"Только судья может использовать эти команды"), ephemeral=True)
|
||
class DefenceClass:
|
||
def __init__(self, member, channel, mod):
|
||
self.member=member
|
||
self.channel=channel
|
||
self.mod=mod
|
||
self.permdef=True
|
||
async def callback(self, mod):
|
||
if mod.author == self.mod.author:
|
||
await self.channel.set_permissions(self.member, read_messages = True, read_message_history=True, send_messages=self.permdef) #read_messages=self.permdef
|
||
await mod.send(embed = client.SuccessEmbed(title=f"", description = f"{self.member.mention}-{'право ответа включено' if self.permdef else 'право ответа выключено'}"), ephemeral=True)
|
||
self.permdef=not self.permdef
|
||
else:
|
||
await mod.send(embed = client.ErrEmbed(title=f"", description = f"Только судья может использовать эти команды"), ephemeral=True)
|
||
|
||
if not any(i.mention in mentions for i in mod.author.roles):
|
||
await mod.send(embed = client.ErrEmbed(description = f"Вы не можете принять этот репорт"), ephemeral=True)
|
||
return
|
||
|
||
if mod.author == ctx.author:
|
||
await mod.send(embed = client.ErrEmbed(description = f"Вы не можете принять свой же репорт"), ephemeral=True)
|
||
return
|
||
|
||
embed.set_footer(text = f"Принято\n{mod.author.name} ({mod.author.id})")
|
||
embed.colour=0x008000
|
||
await report_message.edit(content = "", embed=embed, view=None)
|
||
|
||
parsing_channel = await ctx.guild.create_text_channel(
|
||
name=f"⚠️Жалоба от {ctx.author.name} на {member}",
|
||
overwrites = {ctx.author: disnake.PermissionOverwrite(read_messages=True, send_messages=False, read_message_history=True, attach_files=True),
|
||
mod.author: disnake.PermissionOverwrite(read_messages=True, send_messages=True, read_message_history=True, attach_files=True),
|
||
member: disnake.PermissionOverwrite(read_messages=True, send_messages=False, read_message_history=True, attach_files=True),
|
||
client.everyone: disnake.PermissionOverwrite(read_messages=False, send_messages=False, read_message_history=False)},
|
||
category=ctx.guild.get_channel(1220744958961778850)
|
||
)
|
||
|
||
view = disnake.ui.View(timeout=86400)
|
||
|
||
btnatt = disnake.ui.Button(label="⚔️", style=disnake.ButtonStyle.primary)
|
||
view.add_item(btnatt)
|
||
btndef = disnake.ui.Button(label="⚰️", style=disnake.ButtonStyle.primary)
|
||
view.add_item(btndef)
|
||
btnacc = disnake.ui.Button(label="✅", style=disnake.ButtonStyle.primary)
|
||
view.add_item(btnacc)
|
||
btnden = disnake.ui.Button(label="❌", style=disnake.ButtonStyle.primary)
|
||
view.add_item(btnden)
|
||
|
||
attack = AttackClass(ctx.author, parsing_channel, mod)
|
||
defence = DefenceClass(member, parsing_channel, mod)
|
||
|
||
pin = await parsing_channel.send( f"{mod.author.mention}" ,embed = client.AnswEmbed(title=f"Жалоба", description = f"Вы вызвались судить {member.mention} по жалобе от {ctx.author.mention}\n\
|
||
⚔️ - Дать {ctx.author.mention} право ответа\n\
|
||
⚰️ - Дать {member.mention} право ответа\n\
|
||
✅ - Виновен\n\
|
||
❌ - Невиновен\n\
|
||
Перед закрытием дела убедитесь, что сохранили все доказательства", colour = 0x008000), view=view)
|
||
btnatt.callback = lambda mod: attack.callback(mod)
|
||
btndef.callback = lambda mod: defence.callback(mod)
|
||
btnacc.callback = lambda call: AcceptCallback(report_message, member, embed, mod, call, parsing_channel)
|
||
btnden.callback = lambda call: DenyCallback(report_message, member, embed, mod, call, parsing_channel)
|
||
await pin.pin()
|
||
|
||
if member==ctx.author:
|
||
await ctx.send(embed = client.ErrEmbed(description = f'Нельзя подать жалобу на самого себя!', colour = 0xFF4500), ephemeral=True)
|
||
return
|
||
mentions = []
|
||
|
||
report_channel = disnake.utils.get(ctx.guild.channels, id = 1219644036378394746)
|
||
|
||
highest = [i for i in client.hierarchy if i in member.roles][0]
|
||
for i in range(0, client.hierarchy.index(highest)):
|
||
mentions.append(f"{client.hierarchy[i].mention}")
|
||
|
||
|
||
if len(mentions)==0:
|
||
mentions.append(f"{client.me.mention}")
|
||
|
||
report_embed = client.AnswEmbed(title=f"**Жалоба**", colour = 0xDC143C)
|
||
|
||
report_embed.add_field(name=f"Обвинитель: ", value = f"{ctx.author.mention}\n({ctx.author.id})", inline=True)
|
||
report_embed.add_field(name=f"Обвиняемый: ", value = f"{member.mention}\n({member.id})", inline=True)
|
||
report_embed.add_field(name=f"Причина: ", value = f"```{reason}```", inline=False)
|
||
view = disnake.ui.View(timeout=86400)
|
||
btn = disnake.ui.Button(label="✅", style=disnake.ButtonStyle.primary)
|
||
view.add_item(btn)
|
||
report_embed.set_thumbnail(url=member.avatar)
|
||
report_message = await report_channel.send(", ".join(mentions), embed = report_embed, view=view)
|
||
btn.callback = lambda mod: ReportCallback(ctx,member,report_message,reason,report_embed,mentions,mod)
|
||
|
||
await ctx.send(embed = client.SuccessEmbed(description = f'Жалоба на {member.mention} успешно подана', colour = 0x008000), ephemeral=True)
|
||
|
||
'''
|
||
|
||
Иерархия
|
||
|
||
'''
|
||
|
||
@commands.slash_command(description="Показывает весь персонал, по ролям и веткам", name="иерархия", administrator=True)
|
||
async def hierarchy(self, ctx: disnake.AppCmdInter, branchid: int = commands.Param(description="Укажите id ветки, в которой вам нужна иерархия", name="ветвь", default=None),
|
||
devmod: bool = commands.Param(description="Показывать подробную информацию?", name="devmode", default=False)):
|
||
|
||
async with self.DataBaseManager.session() as session:
|
||
async with session.begin():
|
||
|
||
if branchid is None:
|
||
stmt = (
|
||
self.DataBaseManager.select(self.DataBaseManager.model_classes['staff_branches'])
|
||
.options(
|
||
self.DataBaseManager.selectinload(self.DataBaseManager.model_classes['staff_branches'].roles)
|
||
)
|
||
.order_by(
|
||
self.DataBaseManager.model_classes['staff_branches'].layer.asc()
|
||
)
|
||
)
|
||
branches = (await session.execute(stmt)).scalars().all()
|
||
for branch in branches:
|
||
branch.roles.sort(key=lambda role: role.layer)
|
||
|
||
embed = self.client.AnswEmbed(title = f"", description = f"# Общая иерархия\n", colour = 0xff9900)
|
||
for branchcounter, branch in enumerate(branches, start=1):
|
||
embed.description += f"## {branchcounter}) {branch.purpose}"
|
||
if devmod:
|
||
embed.description += f" id:({branch.id}) layer:({branch.layer})"
|
||
embed.description += "\n"
|
||
|
||
for rolecounter, role in enumerate(branch.roles, start=1):
|
||
embed.description += f"### {rolecounter}. <@&{role.id}>"
|
||
if devmod:
|
||
embed.description += f" layer:({role.layer})"
|
||
embed.description += "\n"
|
||
await ctx.send(embed = embed)
|
||
else:
|
||
branch = await session.get(self.DataBaseManager.model_classes['staff_branches'], branchid)
|
||
|
||
stmt = (
|
||
self.DataBaseManager.select(self.DataBaseManager.model_classes['staff_branches'])
|
||
.options(
|
||
self.DataBaseManager.selectinload(self.DataBaseManager.model_classes['staff_branches'].roles)
|
||
.selectinload(self.DataBaseManager.model_classes['staff_roles'].users)
|
||
)
|
||
.where(
|
||
self.DataBaseManager.model_classes['staff_branches'].id == branchid
|
||
)
|
||
)
|
||
branch = (await session.execute(stmt)).scalars().first()
|
||
if branch is None:
|
||
await ctx.send(embed = self.client.ErrEmbed(description = f'Ветви с идентификатором {branchid} не существует', colour = 0xff9900))
|
||
return 1
|
||
|
||
branch.roles.sort(key=lambda role: role.layer)
|
||
|
||
embed = self.client.AnswEmbed(title = f"", description = f"# Иерархия по ветви {branch.purpose}\n", colour = 0xff9900)
|
||
|
||
for rolecounter, role in enumerate(branch.roles, start=1):
|
||
embed.description += f"## {rolecounter}) <@&{role.id}>"
|
||
if devmod:
|
||
embed.description += f" layer:({role.layer})"
|
||
embed.description += "\n"
|
||
|
||
for membercounter, user in enumerate(role.users, start=1):
|
||
embed.description += f"### - <@{user.user_id}>"
|
||
if devmod:
|
||
embed.description += f" update_time:(<t:{int(user.update_time)}:R>)"
|
||
embed.description += "\n"
|
||
await ctx.send(embed = embed) |