Перейти к содержимому

Как настроить тикет бота дискорд

  • автор:

SkyTickets

Если вы нашли ошибку или у вас есть вопросы по настройке, пишите в канал ├✙・поддержка на нашем Discord сервере.

Функции: Модерация Утилиты Статистика Другое
Разработчики: arik_ua#0 xakvit.ru#0

Комментарии ( 17 )

oneits#0 03.12.2023 в 08:49
Хорошие тикеты как и сам функционал бота, этот бот достоен лучшего)
doruba1#0 29.11.2023 в 05:04

Это самый лучший бот который я видел за всю свою жизнь, он очень качественный почему я раньше о нём не знал

arik_ua#0 12.10.2023 в 23:34
Как по мне все получилось отлично, сообщайте обо всех багах в нашем сервере поддержки
antelopa001k#0 12.10.2023 в 13:00

Замечательный бот, как по мне tickettool который я использовала ранее нервно курит в сторонк (изменено)

Исходник Ticket System для Discord бота | Discord.py

Перед использованием создайте файл по пути files/servers.json с контентном ‘<>‘ (без апострофов)
Создайте категорию и установите её id с помощью команды tickets_category_set
Далее, настройте эту категорию, чтобы никто, кроме админов/проверяющих не имел доступ к этой категории, все нужные права для участников настроит бот
Поменяйте id админов в листе admin_ids или же сделайте проверку с определённой ролью
Поменяйте при необходимости значение логической переменной CAN_READ_IF_CLOSE

Спойлер: Исходный код

import os import sys import random import asyncio sys.path.append(os.path.abspath('../settings')) from global_sets import * from discord.ext import commands ''' Перед использованием создайте файл по пути files/servers.json с контентном '<>' (без апострофов) Создайте категорию и установите её id с помощью команды tickets_category_set Далее, настройте эту категорию, чтобы никто, кроме админов/проверяющих не имел доступ к этой категории, все нужные права для участников настроит бот Поменяйте id админов в листе admin_ids или же сделайте проверку с определённой ролью Поменяйте при необходимости значение логической переменной CAN_READ_IF_CLOSE ''' #### CUSTOM ## VARS ## CAN_READ_IF_CLOSE = True admin_ids = [] ## CUSTOM ## VARS #### def generate(length): letters = 'qwertyuiopasdfghjklzxcvbnm1234567890' name = ''.join(random.choice(letters) for i in range(length)) return name async def create_text_channel(category, channel_name): channel = await category.create_text_channel(channel_name) return channel async def create_voice_channel(category, channel_name): channel = await category.create_voice_channel(channel_name) return channel async def delete_channel(guild, channel_id): channel = guild.get_channel(channel_id) await channel.delete() def is_ticket_message(ctx): with open('files/servers.json', 'r') as f: table = json.load(f) channel_name = (ctx.message.channel.name)[-7:] guild_id = str(ctx.message.guild.id) if (guild_id in table): if ('tickets' in table[guild_id]): if (channel_name in table[guild_id]['tickets']): return True return False def is_ticket_server(server): with open('files/servers.json', 'r') as f: table = json.load(f) if not server.channel: return False channel_name = (server.channel.name)[-7:] guild_id = str(server.channel.guild.id) if (guild_id in table): if ('tickets' in table[guild_id]): if (channel_name in table[guild_id]['tickets']): return True return False @client.command(aliases = ['tickets_category_set']) async def __tickets_category_set(ctx, id:int): if (not (str(ctx.message.author.id) in admin_ids)): return False if (not right_channel(ctx)): return False category = client.get_channel(id) if (not category): return False with open('files/servers.json', 'r') as f: table = json.load(f) guild_id = str(ctx.message.guild.id) if (not guild_id in table): table[guild_id] = <> table[guild_id]['tickets_category'] = id with open('files/servers.json', 'w') as f: json.dump(table, f) await ctx.message.delete() @client.command(aliases = ['ticket']) async def __ticket(ctx, *users:discord.User): # Проверка, в каком канале написана команда if (not right_channel(ctx)): return False with open('files/servers.json', 'r') as f: table = json.load(f) ticket_id = generate(7) channel_name = ctx.message.author.name + '-' + ticket_id guild_id = str(ctx.message.guild.id) # Если в нашем файле нет ключа нашего сервера - записываем if (not guild_id in table): table[guild_id] = <> table[guild_id]['tickets'] = <> with open('files/servers.json', 'w') as f: json.dump(table, f) return False # Есть ли запись категории с тикетами if (not 'tickets_category' in table[guild_id]): print('Tickets category ID is invalid, update it (!tickets_category_set)') return False category_id = table[guild_id]['tickets_category'] category = client.get_channel(category_id) # Существует ли категория с таким id if (not category): print('Tickets category ID is invalid, update it (!tickets_category_set)') return False if (not 'tickets' in table[guild_id]): table[guild_id]['tickets'] = <> # Если id тикета совпал с существующим while (ticket_id in table[guild_id]['tickets']): ticket_id = generate(7) channel_name = ctx.message.author.name + '-' + ticket_id # Создаём текстовый канал нашего тикета channel = await create_text_channel(category, channel_name) if (not channel): print('Cant create a text-channel' + channel_name) return False users_list = [] for user in users: if (user.id != ctx.message.author.id): users_list.append(user.id) # Создаём новую запись о тикете в файле table[guild_id]['tickets'][ticket_id] = <> table[guild_id]['tickets'][ticket_id]['channel'] = channel.id table[guild_id]['tickets'][ticket_id]['author'] = ctx.message.author.id table[guild_id]['tickets'][ticket_id]['users'] = users_list table[guild_id]['tickets'][ticket_id]['closed'] = False with open('files/servers.json', 'w') as f: json.dump(table, f) # Создаём оверрайт-права overwrite = discord.PermissionOverwrite() overwrite.send_messages = True overwrite.read_messages = True overwrite.read_message_history = True overwrite.attach_files = True overwrite.view_channel = True # Задаём права автору сообщения и тегаем await channel.set_permissions(ctx.message.author, overwrite=overwrite) await channel.send(f'>') await asyncio.sleep(1) # Задаём права доп. участникам тикета и тегаем for user in users: await channel.set_permissions(user, overwrite=overwrite) await channel.send(f'>') await asyncio.sleep(1) # Саздём emb emb = discord.Embed( title = f'Тикет #', description = '', colour = discord.Color.red() ) emb.set_author(name = ctx.author.name, icon_url = ctx.author.avatar_url) emb.add_field( name = 'Команды', value = f'`voice`', inline=False) emb.add_field( name = 'Админ-команды', value = f'`close` `open` `delete`', inline=False) emb.set_thumbnail(url = "https://icons.iconarchive.com/icons/sonya/swarm/128/Ticket-icon.png") await channel.send(embed=emb) await ctx.send(f':tickets: Тикет создан! (>)') @client.command(aliases = ['voice']) async def __voice(ctx): if not is_ticket_message(ctx): return False with open('files/servers.json', 'r') as f: table = json.load(f) channel = await create_voice_channel(ctx.message.channel.category, ctx.message.channel.name) ticket_id = (ctx.message.channel.name)[-7:] guild_id = str(ctx.message.guild.id) # Создаём оверрайт-права overwrite = discord.PermissionOverwrite() overwrite.connect = True overwrite.speak = True overwrite.stream = True author = ctx.message.guild.get_member(table[guild_id]['tickets'][ticket_id]['author']) # Выдаём войс-права для автора await channel.set_permissions(author, overwrite=overwrite) # Выдаём войс-права сторонним пользователям for user_id in table[guild_id]['tickets'][ticket_id]['users']: user = ctx.message.guild.get_member(user_id) if (not user): continue await channel.set_permissions(user, overwrite=overwrite) @client.event async def on_voice_state_update(member, before, after): if (is_ticket_server(before)): if len(before.channel.members) == 0: await delete_channel(before.channel.guild, before.channel.id) @client.command(aliases = ['close']) async def __close(ctx): if not is_ticket_message(ctx): return False if (not (str(ctx.message.author.id) in admin_ids)): return False with open('files/servers.json', 'r') as f: table = json.load(f) ticket_id = (ctx.message.channel.name)[-7:] guild_id = str(ctx.message.guild.id) channel_id = table[guild_id]['tickets'][ticket_id]['channel'] channel = ctx.message.channel.guild.get_channel(channel_id) table[guild_id]['tickets'][ticket_id]['closed'] = True with open('files/servers.json', 'w') as f: json.dump(table, f) # Создаём оверрайт-права overwrite = discord.PermissionOverwrite() overwrite.send_messages = False overwrite.read_messages = CAN_READ_IF_CLOSE overwrite.read_message_history = CAN_READ_IF_CLOSE overwrite.attach_files = False overwrite.view_channel = False author = ctx.message.guild.get_member(table[guild_id]['tickets'][ticket_id]['author']) # Удаляем права с создателя await channel.set_permissions(author, overwrite=overwrite) await asyncio.sleep(1) # Удаляем права с юзеров for user_id in table[guild_id]['tickets'][ticket_id]['users']: user = ctx.message.guild.get_member(user_id) if (not user): continue await channel.set_permissions(user, overwrite=overwrite) @client.command(aliases = ['open']) async def __open(ctx): if not is_ticket_message(ctx): return False if (not (str(ctx.message.author.id) in admin_ids)): return False with open('files/servers.json', 'r') as f: table = json.load(f) ticket_id = (ctx.message.channel.name)[-7:] guild_id = str(ctx.message.guild.id) channel_id = table[guild_id]['tickets'][ticket_id]['channel'] channel = ctx.message.channel.guild.get_channel(channel_id) table[guild_id]['tickets'][ticket_id]['closed'] = False with open('files/servers.json', 'w') as f: json.dump(table, f) # Создаём оверрайт-права overwrite = discord.PermissionOverwrite() overwrite.send_messages = True overwrite.read_messages = True overwrite.read_message_history = True overwrite.attach_files = True overwrite.view_channel = True author = ctx.message.guild.get_member(table[guild_id]['tickets'][ticket_id]['author']) # Удаляем права с создателя await channel.set_permissions(author, overwrite=overwrite) await asyncio.sleep(1) # Удаляем права с юзеров for user_id in table[guild_id]['tickets'][ticket_id]['users']: user = ctx.message.guild.get_member(user_id) if (not user): continue await channel.set_permissions(user, overwrite=overwrite) @client.command(aliases = ['delete']) async def __delete(ctx): if not is_ticket_message(ctx): return False if (not (str(ctx.message.author.id) in admin_ids)): return False with open('files/servers.json', 'r') as f: table = json.load(f) ticket_id = (ctx.message.channel.name)[-7:] guild_id = str(ctx.message.guild.id) channel_id = table[guild_id]['tickets'][ticket_id]['channel'] channel = ctx.message.channel.guild.get_channel(channel_id) # delete text channel & ticket await channel.delete() del table[guild_id]['tickets'][ticket_id] # delete voice_channel probably channel = discord.utils.get(ctx.message.guild.channels, name=ctx.message.channel.name) if (channel is not None): await channel.delete()

Описание бота Ticket Tool для Дискорда

Tickettool бот для Дискорда – специально разработанная утилита, которая не относится к встроенному компоненту программного обеспечения. Чтобы воспользоваться функционалом, требуется знать четкую последовательность действий и помнить об имеющихся особенностях.

Главные функции и возможности

Тикет бот Дискорд – уникальная разработка программиста-одиночки, с помощью которой можно настроить автоматическую продажу билетов через созданный тематический канал. Преимуществами бота являются:

  • отсутствие технических сбоев;
  • простота в управлении;
  • доступность.

Разработчики тематических каналов в программном обеспечении Дискорд отмечают возможность существенно упростить задачу в области реализации билетов. Главное уметь правильно настроить работу, чтобы увидеть первые результаты.

Как скачать и добавить бота

Процедура добавления и загрузки специализированного бота не вызывает сложностей. Потенциальным основателям тематических групп и сообществ, требуется соблюдать четкую последовательность действий. Исчерпывающая инструкция подразумевает под собой:

  • Первоначальную загрузку программного обеспечения с последующей авторизацией в учетной записи. Для этого вводится уникальный персональный идентификатор. В случае утраты ключа безопасности, восстановление осуществляется с помощью соответствующей функции «Забыли пароль?» и следовать дальнейшей инструкции.
  • Дальнейшим переход на официальный ресурс разработчика рассматриваемого бота для последующего добавления на интересующий канал.

Благодаря имеющимся подсказкам, пользователь вносит персональные настройки в работу бота при необходимости в этом. Обратите внимание, разработчик предусматривает первоначальные стандартные параметры, которых вполне достаточно для решения определенных задач. Рекомендуется с ними ознакомиться, что исключить недопонимание с вытекающими последствиями.

На завершающем этапе пользователю требуется нажать на клавишу «Сохранить», которая находится в нижней части панели управления.

Бот предоставляется пользователям бесплатно, при добавлении сложностей не возникает. Об этом свидетельствуют многочисленные отзывы пользователей.

Настройка бота и отключение

Чтобы внести соответствующие настройки, пользователям требуется соблюдать определенную последовательность действий. Для этого не нужно быть опытным пользователем ПК – главное соблюдать следующую инструкцию:

  • Выполняется запуск программного обеспечения Дискорд – пользователям можно пользоваться стационарным компьютером, ноутбуком, планшетом, мобильным телефоном.
  • Осуществляется по стандартной схеме авторизация в зарегистрированном аккаунте.
  • На следующем этапе необходимо нажать на графическое изображение шестеренки для последующего перехода в раздел внесения настроек – клавиша расположена на панели управления.
  • Далее требуется перейти в категорию ранее созданного пользователем сервера.
  • Во вновь открывшейся форме необходимо из сформированного списка выбрать интересующий тематический канал, в котором планируется инициировать функционирование бота.
  • На следующем этапе пользователь повторно должен перейти в раздел внесения пользовательских настроек бота – графическое изображение шестеренки.
  • В новой вкладке в зависимости от поставленных задач, требуется поставить соответствующие отметки возле интересующих параметров.
  • В завершении выполняется сохранение полученных результатов, путем нажатия на соответствующую клавишу «Сохранить».

Пользователям требуется знать, что внесенные изменения моментально вступают в силу, поэтому достаточно обновить страницу, чтобы приступить к тестированию полученных результатов.

Команды управления ботом

Управление ботом для большинства пользователей считается сложной задачей. На практике это считается мифом. Разработчик рассматриваемой функции рекомендуется придерживаться представленной выше инструкции, чтобы избежать недопонимания с вытекающими негативными последствиями. По любым вопросам можно обратиться за помощью к создателю дополнительной утилиты через официальный сайт. Для этого требуется воспользоваться специально разработанной формой организации обратной связи.

Запуск команд при запуске дискорд бота

Описание

У меня есть функция которая при команде /ticket отправляет в чат сообщение Я хочу чтобы это сообщение отправлялось с запуском бота. Это сама функция

 @commands.slash_command(name="ticket") async def create_ticket(self, ctx): if ctx.author.top_role.name in settings['admin_role']: button1 = Button(custom_id='create_ticket', label='Подать заявку', style=discord.ButtonStyle.primary) button1.callback = self.button_create_ticket button2 = Button(custom_id='rule', label='Правила', style=discord.ButtonStyle.primary) button2.callback = self.button_rules button3 = Button(custom_id='rename', label='Смена ника', style=discord.ButtonStyle.primary) button3.callback = self.button_create_rename view = discord.ui.View(timeout=None) view.add_item(button1) view.add_item(button2) view.add_item(button3) await ctx.channel.purge(limit=2) embed = discord.Embed(title='**Заявка на вступление в ряды сервера**', description="Для добавления вас в белый список сервера, вам нужно подать заявку на рассмотрение администрации. \n\nПеред подачей заявки, ознакомьтесь с правилами проекта, что-бы избежать лишних проблем.\n\nС уважением Администрация UniOn.", color=discord.Color.from_rgb(199, 135, 24), ) print("Успешно создано меню тикетов") await ctx.send(embed=embed, view=view) 

Так же вот еще функция которая запускаетя при нажатии на кнопку «Подать заявку»

 async def button_create_ticket(self, interaction): db, sql = self.connect() global member member = interaction.user sql_list = sql.execute(f"""SELECT ticket FROM applications WHERE ticket = ''""") if sql_list > 0: await interaction.response.send_message('У вас уже создан один тикет', ephemeral=True) print(f"У уже создан тикет") else: await interaction.response.send_message(f'Заявка создана', ephemeral=True) sql.execute("""SELECT ticket FROM count""") ticket_timer = sql.fetchall()[0]["ticket"] print(f"Заявка открыта ") sql.execute(f"""INSERT INTO applications VALUES('','','','','','','')""") db.commit() button2 = Button(custom_id='close_ticket', label='Закрыть заявку', style=discord.ButtonStyle.danger) button2.callback = self.button_close_ticket view = discord.ui.View(timeout=None) view.add_item(button2) channel = await interaction.guild.create_text_channel(f'Заявка-№') ticket_timer += 1 # Добавляю номер тикета + 1 sql.execute(f"""UPDATE count SET ticket = """) db.commit() await channel.set_permissions(channel.guild.default_role, read_messages=False) # Запрещенно всем видеть await channel.set_permissions(interaction.user, read_messages=True, send_messages=True) # + Права у автора тикета groles = interaction.guild.roles # for i in settings["ticket_role"]: await channel.set_permissions(discord.utils.get(groles, name="Администрация проекта!"), read_messages=True) embed = discord.Embed(title='**Форма подачи заявки**', description="""1. Ваш игровой ник:\n2. Возраст (полные годы):\n3. Сколько часов в день вы готовы уделять нашему серверу?:\n4. Расскажите о своих планах на сервере:\n5. Обладаете ли вы микрофоном для коммуникации с другими игроками?:\n6. Откуда вы узнали о нашем сервере?:\n7. Какой опыт у вас имеется в данной игре или подобных серверах?:\n\nПримечание: После заполнения анкеты, администрация сервера свяжется с \nвами для дальнейшего рассмотрения заявки и предоставления дополнительной \nинформации о сервере, если необходимо.\n\nС уважением Администрация UniOn. """, color=discord.Color.from_rgb(199, 135, 24), ) await channel.send(f' подайте заявку на добавления в список сервера по форме ниже, и ожидайте ответа от ||@everyone||', embed=embed, view=view) db.close() 

По итогу я просто перенес код из первой функции в main.py в функию on_ready. Но это тоже не сработало

@bot.event async def on_ready(): guild = bot.get_guild(guild_id) if guild is None: guild = await bot.fetch_guild(guild_id) # ==================================================== button1 = Button(custom_id='create_ticket', label='Подать заявку', style=discord.ButtonStyle.primary) button1.callback = Tickets(bot).button_create_ticket button2 = Button(custom_id='rule', label='Правила', style=discord.ButtonStyle.primary) button2.callback = Tickets(bot).button_rules button3 = Button(custom_id='rename', label='Смена ника', style=discord.ButtonStyle.primary) button3.callback = Tickets(bot).button_create_rename view = discord.ui.View(timeout=None) view.add_item(button1) view.add_item(button2) view.add_item(button3) channel = guild.get_channel(channel_id) await channel.purge(limit=2) embed = discord.Embed(title='**Заявка на вступление в ряды сервера**', description="Для добавления вас в белый список сервера, вам нужно подать заявку на рассмотрение администрации. \n\nПеред подачей заявки, ознакомьтесь с правилами проекта, что-бы избежать лишних проблем.\n\nС уважением Администрация UniOn.", color=discord.Color.from_rgb(199, 135, 24), ) await channel.send(embed=embed, view=view) print("Успешно создано меню тикетов") 

Не получилось через on_ready потому что не передается interaction в функции кнопок. Есть ли варианты как запускать команды вместе с запуском бота

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *