mirror of
https://github.com/yawaflua/AoyoBot.git
synced 2025-12-09 03:49:30 +02:00
281 lines
18 KiB
Python
281 lines
18 KiB
Python
from disnake.ext import commands
|
||
import disnake
|
||
import json
|
||
from pathlib import Path
|
||
import pyspw
|
||
from disnake import TextInputStyle
|
||
from handlers import api_id, api_token, takeSettings, bot
|
||
from asyncio import sleep
|
||
from random import randint
|
||
import datetime
|
||
import chat_exporter
|
||
import io
|
||
|
||
class buttons(commands.Cog):
|
||
def __init__(self, bot):
|
||
self.bot = bot
|
||
|
||
@bot.listen("on_button_click")
|
||
async def button(inter: disnake.MessageInteraction):
|
||
if inter.component.custom_id in ['role1', 'role2', 'role3']:
|
||
path = Path("guilds/guilds.json")
|
||
data = json.loads(path.read_text(encoding="utf-8"))
|
||
role = bot.get_guild(inter.guild.id).get_role(data["guilds"][f"{inter.guild.id}"]['issues'][f"{inter.message.id}"][inter.component.custom_id])
|
||
await inter.author.add_roles(role)
|
||
await inter.response.send_message(f'{role.mention} вам выдалась!', ephemeral=True)
|
||
elif inter.component.custom_id == "buttonOnModal":
|
||
path = Path("guilds/guilds.json")
|
||
data = json.loads(path.read_text(encoding="utf-8"))
|
||
modalData = data["guilds"][f"{inter.guild.id}"]["modals"][f"{inter.channel.id}"][f"{inter.message.id}"]
|
||
if data["guilds"][f"{inter.guild.id}"]["server"] != {}:
|
||
try:
|
||
api = pyspw.SpApi(card_id=api_id, card_token=api_token).get_user(inter.author.id).nickname
|
||
custom_id="customModal-api"
|
||
except Exception:
|
||
api = None
|
||
custom_id = "customModal"
|
||
|
||
component=[
|
||
disnake.ui.TextInput(
|
||
label=modalData["0"],
|
||
custom_id=modalData["0"],
|
||
style=TextInputStyle.short,
|
||
),
|
||
]
|
||
for i in range(len(modalData)-3):
|
||
i = i + 1
|
||
modalDatas = modalData[f"{i}"]
|
||
component.append(
|
||
disnake.ui.TextInput(
|
||
label=f"{modalDatas}",
|
||
custom_id=f"{modalDatas}",
|
||
style=TextInputStyle.short,
|
||
),
|
||
)
|
||
|
||
await inter.response.send_modal(
|
||
title="Aoyo Modal System",
|
||
custom_id=custom_id,
|
||
components=component,)
|
||
elif inter.component.custom_id in ["closePrivateRoom", "hidePrivateRoom"]:
|
||
guild = bot.get_guild(inter.guild.id)
|
||
role = guild.get_role(int(takeSettings(inter.guild.id, "on_join_role")))
|
||
member = inter.author
|
||
if inter.component.custom_id == "closePrivateRoom":
|
||
overwrites = {
|
||
guild.default_role: disnake.PermissionOverwrite(connect=False),
|
||
role: disnake.PermissionOverwrite(connect=False),
|
||
member: disnake.PermissionOverwrite(connect=True)
|
||
}
|
||
else:
|
||
overwrites = {
|
||
guild.default_role: disnake.PermissionOverwrite(view_channel=False),
|
||
role: disnake.PermissionOverwrite(view_channel=False),
|
||
member: disnake.PermissionOverwrite(view_channel=True)
|
||
}
|
||
await bot.get_channel(inter.channel.id).edit(overwrites=overwrites)
|
||
await inter.response.send_message("Готово.", ephemeral=True)
|
||
|
||
elif inter.component.custom_id in ["giveOwner", "kickUser", "deleteChannel"]:
|
||
path = Path("tempFiles/voiceTempFile.json")
|
||
data = json.loads(path.read_text(encoding="utf-8"))
|
||
if int(data["voice_channels"][f"{inter.channel.id}"]["channel_owner"]) == inter.author.id:
|
||
if inter.component.custom_id == "giveOwner": await inter.response.send_message("Отправьте пинг игрока, которому хотите передать права", ephemeral=True)
|
||
elif inter.component.custom_id == "deleteChannel": await inter.channel.delete()
|
||
else: await inter.response.send_message("Отправьте пинг игрока, которого хотите кикннуть", ephemeral=True)
|
||
def check(m):
|
||
return m.author == inter.author and m.channel == inter.channel
|
||
try:
|
||
message = await bot.wait_for('message', timeout=30.0, check=check)
|
||
except TimeoutError:
|
||
return
|
||
else:
|
||
content = message.mentions[0].id
|
||
await message.delete()
|
||
if inter.component.custom_id == "giveOwner":
|
||
data["voice_channels"][f"{inter.channel.id}"]["channel_owner"] = content
|
||
data["voice_channels"][f"{inter.channel.id}"]["old_channel_owner"] = inter.author.id
|
||
path.write_text(json.dumps(data, indent=6), encoding="utf-8", newline="\n")
|
||
await inter.response.send_message(f"Готово! Владелец канала теперь: <@{content}>", ephemeral=True)
|
||
else:
|
||
member = await bot.get_guild(inter.guild.id).fetch_member(int(content))
|
||
await member.edit(voice_channel=None)
|
||
await inter.response.send_message(f"Готово! <@{content}> был кикнут", ephemeral=True)
|
||
else:
|
||
await inter.response.send_message("Вы не создатель канала!", ephemeral=True)
|
||
|
||
elif inter.component.custom_id == "takeOwner":
|
||
path = Path("tempFiles/voiceTempFile.json")
|
||
data = json.loads(path.read_text(encoding="utf-8"))
|
||
if data["voice_channels"][f"{inter.channel.id}"]["old_channel_owner"] == inter.author.id:
|
||
data["voice_channels"][f"{inter.channel.id}"]["channel_owner"] = inter.author.id
|
||
path.write_text(json.dumps(data, indent=6), encoding="utf-8", newline="\n")
|
||
await inter.response.send_message(f"Готово! Владелец канала теперь: <@{inter.author.id}>", ephemeral=True)
|
||
elif inter.component.custom_id == "renamePrivateRoom":
|
||
await inter.response.send_modal(
|
||
title="Aoyo Modal System",
|
||
custom_id="renamePrivateRoom",
|
||
components=[
|
||
disnake.ui.TextInput(
|
||
label='Новое название канала:',
|
||
placeholder="Я люблю нюхать бебру",
|
||
custom_id='newNamePrivateRoom',
|
||
style=disnake.TextInputStyle.short,
|
||
)
|
||
],
|
||
)
|
||
elif inter.component.custom_id == "setUsersLimit":
|
||
await inter.response.send_modal(
|
||
title="Aoyo Modal System",
|
||
custom_id="setUsersLimit",
|
||
components=[
|
||
disnake.ui.TextInput(
|
||
label='Новое максимальное кол-во пользователей:',
|
||
placeholder="1",
|
||
custom_id='newUserLimit',
|
||
style=disnake.TextInputStyle.short,
|
||
)
|
||
],
|
||
)
|
||
# tickets
|
||
elif inter.component.custom_id in ["firstTicket", "secondTicket", "thirdTicket", "createTicket", "reportCreateTicket"]:
|
||
path = Path("guilds/guilds.json")
|
||
ticketData = Path("tempFiles/ticket.json")
|
||
aJsonData = json.loads(path.read_text(encoding="utf-8"))
|
||
fromJsonData = json.loads(path.read_text(encoding="utf-8")).get('guilds')[f"{inter.guild_id}"]
|
||
toJsonData = json.loads(ticketData.read_text(encoding="utf-8"))
|
||
mention = inter.author.mention
|
||
if inter.component.custom_id == "firstTicket":
|
||
role = fromJsonData["ticket"][f"{inter.channel.id}"][f"{inter.message.id}"]["first_role"]
|
||
if inter.component.custom_id == "secondTicket":
|
||
role = fromJsonData["ticket"][f"{inter.channel.id}"][f"{inter.message.id}"]["second_role"]
|
||
if inter.component.custom_id == "thirdTicket":
|
||
role = fromJsonData["ticket"][f"{inter.channel.id}"][f"{inter.message.id}"]["third_role"]
|
||
if inter.component.custom_id == "reportCreateTicket":
|
||
role = fromJsonData["moderation_role"]
|
||
embedMessage = inter.message.embeds[0]
|
||
mention = f"<@{embedMessage.footer.text}> \n{inter.author.mention}"
|
||
|
||
await inter.message.edit(components=[
|
||
disnake.ui.Button(style=disnake.ButtonStyle.success, custom_id="reportAccept", label="Принять"),
|
||
disnake.ui.Button(label="Создать тикет", style=disnake.ButtonStyle.success, custom_id="reportCreateTicket", disabled=True),
|
||
disnake.ui.Button(label="Удалить репорт", style=disnake.ButtonStyle.danger, custom_id="deleteReport"),
|
||
],)
|
||
embed = disnake.Embed(title="Управление тикетом", description="Если вы готовы завершить тикет, нажмите ниже.", colour=disnake.Color.blue())
|
||
buttons = disnake.ui.View()
|
||
buttons.add_item(disnake.ui.Button(style=disnake.ButtonStyle.danger, custom_id="closeTicket", label="Закрыть тикет"))
|
||
|
||
guild = bot.get_guild(inter.guild.id)
|
||
roleOverwrite = guild.get_role(int(takeSettings(inter.guild.id, "on_join_role")))
|
||
roleTicket = guild.get_role(int(role))
|
||
overwrites = {
|
||
guild.default_role: disnake.PermissionOverwrite(view_channel=False),
|
||
roleOverwrite: disnake.PermissionOverwrite(view_channel=False),
|
||
inter.author: disnake.PermissionOverwrite(view_channel=True),
|
||
roleTicket: disnake.PermissionOverwrite(view_channel=True)
|
||
}
|
||
if not fromJsonData['ticket'].get('counter'):
|
||
aJsonData['guilds'][f'{inter.guild.id}']['ticket']['counter'] = 1
|
||
aJsonData['guilds'][f'{inter.guild.id}']['ticket']['counter'] = int(aJsonData['guilds'][f'{inter.guild.id}']['ticket']['counter']) + 1
|
||
count = aJsonData['guilds'][f'{inter.guild.id}']['ticket']['counter']
|
||
category = disnake.utils.get(guild.categories, id=inter.channel.category.id)
|
||
channel = await guild.create_text_channel(name=f"ticket-{count}", category=category, overwrites=overwrites)
|
||
await channel.send(content=f"{mention}\n<@&{role}>",embed=embed, view=buttons)
|
||
newJsonData = {
|
||
"channel_owner": f"{inter.author.mention}",
|
||
"channel_name": f"{channel.name}",
|
||
"panel": f"{inter.component.custom_id}"
|
||
}
|
||
if not toJsonData["ticket"].get(f"{inter.guild_id}"):
|
||
toJsonData["ticket"][f"{inter.guild_id}"] = {}
|
||
|
||
toJsonData["ticket"][f"{inter.guild_id}"][f"{channel.id}"] = newJsonData
|
||
|
||
if inter.component.custom_id == "reportCreateTicket":
|
||
toJsonData["ticket"][f"{inter.guild_id}"][f"{channel.id}"]["user_name"] = f"{embedMessage.footer.text}"
|
||
path.write_text(json.dumps(aJsonData, indent=3), encoding="utf-8", newline="\n")
|
||
ticketData.write_text(json.dumps(toJsonData, indent=3), encoding="utf-8", newline="\n")
|
||
await inter.response.send_message(f'Ваш тикет: {channel.mention}', ephemeral=True)
|
||
|
||
elif inter.component.custom_id == "closeTicket":
|
||
embed = disnake.Embed(title="Подтверждение", description=f"Вы уверены, что хотите закрыть тикет, {inter.author.name}?")
|
||
buttons = disnake.ui.View()
|
||
buttons.add_item(disnake.ui.Button(style=disnake.ButtonStyle.danger, custom_id="closeTicketPerm", label="Да, закрыть тикет"))
|
||
buttons.add_item(disnake.ui.Button(style=disnake.ButtonStyle.success, custom_id="cancelCloseTicket", label="Нет"))
|
||
await inter.response.send_message(embed=embed, view=buttons)
|
||
await inter.message.edit(components=[
|
||
disnake.ui.Button(style=disnake.ButtonStyle.danger, custom_id="closeTicket", label="Закрыть тикет", disabled=True),
|
||
],)
|
||
elif inter.component.custom_id == "cancelCloseTicket":
|
||
for message in (await inter.channel.history(limit=None, oldest_first=True).flatten()):
|
||
msg = await bot.get_channel(inter.channel.id).fetch_message(message.id)
|
||
break
|
||
await msg.edit(components=[
|
||
disnake.ui.Button(style=disnake.ButtonStyle.danger, custom_id="closeTicket", label="Закрыть тикет", disabled=False),
|
||
],)
|
||
await inter.message.delete()
|
||
elif inter.component.custom_id == "closeTicketPerm":
|
||
embed = disnake.Embed(title='**Aoyo ticket system**', description=f'Канал закрыт {inter.author.mention}', color=0x00ff00)
|
||
embed.set_image('https://media.discordapp.net/attachments/876280751488909332/979778066417070151/Frame_280.png?width=1440&height=4')
|
||
buttons = disnake.ui.View().add_item(disnake.ui.Button(style=disnake.ButtonStyle.danger, custom_id='deleteChannelTicket', label='Удалить канал'))
|
||
channel = bot.get_channel(inter.channel.id)
|
||
overwrites = {
|
||
inter.author: disnake.PermissionOverwrite(view_channel=False),
|
||
}
|
||
await inter.message.delete()
|
||
await channel.edit(overwrites=overwrites, name=f"closed-{channel.name[7:]}")
|
||
await channel.send(embed=embed, view=buttons)
|
||
|
||
elif inter.component.custom_id == "deleteChannelTicket":
|
||
path = Path("guilds/guilds.json")
|
||
ticketData = Path("tempFiles/ticket.json")
|
||
fromJsonData = json.loads(path.read_text(encoding="utf-8"))
|
||
toJsonData = json.loads(ticketData.read_text(encoding="utf-8"))
|
||
guild = bot.get_guild(inter.guild.id)
|
||
member = await guild.fetch_member(int(toJsonData["ticket"][f"{inter.guild.id}"][f"{inter.channel.id}"]["channel_owner"].replace('<@', '').replace('>', '')))
|
||
channel = bot.get_channel(int(fromJsonData["guilds"][f"{inter.guild_id}"]["transcript_channel"]))
|
||
transcript = await chat_exporter.export(
|
||
inter.channel,
|
||
bot=bot,
|
||
)
|
||
embed = disnake.Embed(title='**Aoyo ticket system**', colour=disnake.Color.green())
|
||
embed.add_field(name="Создатель", value=member.mention)
|
||
embed.add_field(name="Название канала", value=toJsonData["ticket"][f"{inter.guild.id}"][f"{inter.channel.id}"]["channel_name"], inline=False)
|
||
embed.add_field(name="Причина открытия", value=toJsonData["ticket"][f"{inter.guild.id}"][f"{inter.channel.id}"]["panel"], inline=True)
|
||
embed.set_image('https://media.discordapp.net/attachments/876280751488909332/979778066417070151/Frame_280.png?width=1440&height=4')
|
||
|
||
transcript_file = disnake.File(
|
||
io.BytesIO(transcript.encode()),
|
||
filename=f"transcript-{inter.channel.name}.html",
|
||
)
|
||
|
||
await bot.get_channel(int(fromJsonData["guilds"][f"{inter.guild.id}"]["transcript_channel"])).send(f"**Сохранен и отправлен {inter.channel.name}**",file=transcript_file)
|
||
embed = disnake.Embed(title='**Aoyo ticket system**', description='Канал удалится в течении 10 секунд.', colour=disnake.Color.purple())
|
||
await inter.message.edit(view=None)
|
||
await inter.response.send_message(embed=embed)
|
||
await sleep(9)
|
||
await bot.get_channel(inter.channel.id).delete(reason=f'Deleted by {inter.author.id}')
|
||
del toJsonData["ticket"][f"{inter.guild.id}"][f"{inter.channel.id}"]
|
||
ticketData.write_text(json.dumps(toJsonData, indent=3), encoding="utf-8", newline="\n")
|
||
# report
|
||
elif inter.component.custom_id == "reportAccept":
|
||
member = await bot.get_guild(inter.guild.id).fetch_member(int(inter.message.embeds[0].footer.text))
|
||
await member.send(embed=disnake.Embed(title="Aoyo REPORT", description=f"Ваш репорт был принят и рассмотрен модератором {inter.author.mention}", color=0x00ff00,timestamp=datetime.datetime.now()))
|
||
await inter.message.edit(components=[
|
||
disnake.ui.Button(style=disnake.ButtonStyle.success, custom_id="reportAccept", label="Принять", disabled=True),
|
||
disnake.ui.Button(label="Создать тикет", style=disnake.ButtonStyle.success, custom_id="reportCreateTicket", disabled=True),
|
||
disnake.ui.Button(label="Удалить репорт", style=disnake.ButtonStyle.danger, custom_id="deleteReport", disabled=True),
|
||
],)
|
||
await inter.message.edit(embed=inter.message.embeds[0].add_field(name="Репорт был принят!", value=f"Репорт принял {inter.author.mention}"))
|
||
await inter.response.send_message("Готово!", ephemeral=True)
|
||
elif inter.component.custom_id == "deleteReport":
|
||
await inter.response.send_message("Готово!", ephemeral=True)
|
||
await inter.message.edit(components=[
|
||
disnake.ui.Button(style=disnake.ButtonStyle.success, custom_id="reportAccept", label="Принять", disabled=True),
|
||
disnake.ui.Button(label="Создать тикет", style=disnake.ButtonStyle.success, custom_id="reportCreateTicket", disabled=True),
|
||
disnake.ui.Button(label="Удалить репорт", style=disnake.ButtonStyle.danger, custom_id="deleteReport", disabled=True),
|
||
],)
|
||
else:
|
||
await inter.response.send_message('Ошибка!', ephemeral=True)
|
||
def setup(bot):
|
||
bot.add_cog(buttons(bot)) |