Initialize project

This commit is contained in:
Дмитрий Шиманский
2024-02-22 19:04:48 +03:00
commit ae43a31e39
29 changed files with 2156 additions and 0 deletions

281
cogs/buttons.py Normal file
View File

@@ -0,0 +1,281 @@
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))