import discord from discord.ext import commands from datetime import datetime from pymongo import MongoClient from uuid import uuid4 import asyncio ticket_id = None member = None channel = None class Ticket_Modal(discord.ui.Modal): def __init__(self, connect, ticket, *args, **kwargs) -> None: super().__init__(*args, **kwargs) self.connect = connect self.ticket = ticket self.add_item(discord.ui.InputText( label="Опишите свою проблему", required=True, max_length=2000, min_length=2, style=discord.InputTextStyle.long, placeholder='Фотографии вы можете оставлять уже в открытом тикете.')) async def callback(self, interaction: discord.Interaction): ticket_id = uuid4().hex self.ticket.insert_one( {"ticket_id": ticket_id, "ticket_user": interaction.user.id, "ticket_value": self.children[0].value}) embed = discord.Embed( title=f"──⊰ ✜ ⊱ « <:read_suggestions:1008468392975548447> Ticket » ⊰ ✜ ⊱──", description=f"""**Причина открытия тикета**\n```{self.ticket.find_one({"ticket_id": ticket_id})["ticket_value"]}```\n**Статус:** Ожидается модератор.\n**Автор тикета:** <@{self.ticket.find_one({"ticket_id": ticket_id})["ticket_user"]}>""", colour=0xdfbe85) embed.set_footer( text=f'Ticket ID • {self.ticket.find_one({"ticket_id": ticket_id})["ticket_id"]}') guild = interaction.guild.id member = interaction.user moder = discord.utils.get( interaction.guild.roles, name='Модер') category = discord.utils.get( interaction.guild.categories, name="Конференция") overwrites = { } channel = await interaction.guild.create_text_channel(name=f'ticket-{member.name}', category=category, overwrites=overwrites) await channel.set_permissions(interaction.guild.default_role, read_messages=False, send_messages=False, use_external_emojis=True) await channel.set_permissions(member, read_messages=True, send_messages=True, read_message_history=True) await channel.set_permissions(moder, read_messages=True, send_messages=True, read_message_history=True) success = discord.Embed( description=f'Ваш тикет создан в <#{channel.id}>!', title='──⊰ ✜ ⊱ « <:read_suggestions:1008468392975548447> Ticket » ⊰ ✜ ⊱──', colour=0xdfbe85) await asyncio.sleep(2) await channel.send(embed=embed, view=Ticket_Delete_Buttons(ticket_id=ticket_id, connect=self.connect, ticket=self.ticket, channel=channel, member=member)) await interaction.response.send_message(embed=success, ephemeral=True) class Ticket_Delete_Buttons(discord.ui.View): def __init__(self, connect, ticket, channel, member, ticket_id): super().__init__(timeout=None) self.connect = connect self.ticket = ticket self.channel = channel self.member = member self.ticket_id = ticket_id @discord.ui.button(emoji='<:Trash:1007440964169769040>', label='Удалить тикет', style=ButtonStyle.green, custom_id='ticket_delete_button') async def ticket_delete_button_callback(self, button, interaction): if interaction.user.id == 826814785332445254: ticket_id = self.ticket.find_one( {"ticket_id": self.ticket_id})["ticket_id"] embed = discord.Embed( title='──⊰ ✜ ⊱ « <:read_suggestions:1008468392975548447> Ticket » ⊰ ✜ ⊱──', description=f'Ваш тикет будет удалён через 5 секунд.', colour=0xdfbe85) embed.set_footer( text=f'Ticket ID • {self.ticket.find_one({"ticket_id": ticket_id})["ticket_id"]}') await interaction.send(embed=embed) channel = interaction.bot.get_channel(self.channel.id) await channel.set_permissions(self.member, read_messages=True, send_messages=False, read_message_history=True) await asyncio.sleep(5) await channel.delete() else: photo_mod_error = discord.Embed( title='──⊰ ✜ ⊱ « <:error:979026927845253160> Ошибка » ⊰ ✜ ⊱──', description=f'{interaction.user.mention}, вы не модератор!', timestamp=datetime.now(), colour=0xe34234) photo_mod_error.set_footer(text='Система LollipopMC') await interaction.send(embed=photo_mod_error, ephemeral=True) class Ticket_Start_Buttons(discord.ui.View): def __init__(self, connect, ticket): super().__init__(timeout=None) self.connect = connect self.ticket = ticket @discord.ui.button(emoji='<:read_suggestions:1008468392975548447>', label='Открыть тикет', style=discord.ButtonStyle.grey, custom_id='ticket_start_button') async def ticket_start_button_callback(self, button, interaction): await interaction.response.send_modal(Ticket_Modal(title="Поддержка", connect=self.connect, ticket=self.ticket)) class Ticket(commands.Cog): def __init__(self, bot): self.bot = bot self.connect = MongoClient( "") self.ticket = self.connect.LollipopMC.Ticket @commands.slash_command(name='ticket') async def tic(self, interaction): if interaction.user.id == 826814785332445254: emb = discord.Embed( title='──⊰ ✜ ⊱ « <:read_suggestions:1008468392975548447> Ticket » ⊰ ✜ ⊱──', description="Здесь вы можете создать запрос в тех. поддержку, чтобы сообщить о нарушении <#731861709790117999>.\nТакже помните, что за использование тикетов не по назначению выдаётся наказание!\n-—-\n**Правила подачи жалобы:**\n> **[ 1 ]** Никнейм с тегом.\n> **[ 2 ]** Время по МСК.\n> **[ 3 ]** Доказательство в виде видеофрагмента или скриншота.", colour=0xdfbe85) await interaction.send(embed=emb, view=Ticket_Start_Buttons(connect=self.connect, ticket=self.ticket)) else: await interaction.send(content='Куда мы лезем?', ephemeral=True) @commands.Cog.listener() async def on_ready(self): self.bot.add_view(Ticket_Start_Buttons( connect=self.connect, ticket=self.ticket)) self.bot.add_view(Ticket_Delete_Buttons(channel=channel, member=member, connect=self.connect, ticket=self.ticket, ticket_id=ticket_id)) def setup(bot): bot.add_cog(Ticket(bot))