@VickR0mE

Как заставить бота создавать роль при подключении к серверу, если ее раннее не было?

Пишу бота дискорд, хочу, что бы при присоединении к серверу он сканировал роль с определенным названием и если ее не было бы, то создавал ее сам. Как можно по проще расписать такой код?
import os
import disnake
from disnake.ext import commands
from func import *

token = "токен"

activity = disnake.Activity(
    name="v!help",
    type=disnake.ActivityType.watching,
)

bot = commands.Bot(command_prefix="v!", help_command=None, intents=disnake.Intents.all(), activity=activity)


if not os.path.exists("guilds.json"):
	with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "w") as file:
		file.write("{}")
		file.close()
if not os.path.exists("mutedroles.json"):
	with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/mutedroles.json", "w") as file:
		file.write("{}")
		file.close()


@bot.event
async def on_ready():

	for guild in bot.guilds:
		with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "r") as file:
			data = json.load(file)
			file.close()


		with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "w") as file:
			data[str(guild.id)] = str(guild.name)
			json.dump(data, file, indent=4)
			file.close()
			
	print(f"Бот {bot.user} к вашим услугам!!!")


#Обработка ошибок
@bot.event
async def on_command_error(ctx, error):
	print(error)

	if isinstance(error, commands.MissingPermissions):
		await ctx.send(f"{ctx.author}, у вас не достаточно прав!")
	elif isinstance(error, commands.UserInputError):
		await ctx.send(embed=disnake.Embed(
			description=f"Правильное использование команды: `{ctx.prefix}{ctx.command.name}` ({ctx.command.brief})\nExample: {ctx.prefix}{ctx.command.usage}"
		))


@bot.slash_command()
async def load(ctx, extension):
	if ctx.author.id == 623446417268277268:
		bot.load_extension(f"cogs.{extension}")
		await ctx.send("Cog is loaded...")
	else:
		await ctx.send("Вы не являетесь разработчиком бота!!!")


@bot.slash_command()
async def unload(ctx, extension):
	if ctx.author.id == 623446417268277268:
		bot.unload_extension(f"cogs.{extension}")
		await ctx.send("Cog is unloaded...")
	else:
		await ctx.send("Вы не являетесь разработчиком бота!!!")


@bot.slash_command()
async def reload(ctx, extension):
	if ctx.author.id == 623446417268277268:
		bot.unload_extension(f"cogs.{extension}")
		bot.load_extension(f"cogs.{extension}")
		await ctx.send("Cog is reloaded...")
	else:
		await ctx.send("Вы не являетесь разработчиком бота!!!")


for file in os.listdir("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/cogs"):
	if file.endswith(".py"):
		bot.load_extension(f"cogs.{file[:-3]}")


bot.run(token)
  • Вопрос задан
  • 207 просмотров
Решения вопроса 1
@5465
Для реализации такой функциональности, вам необходимо добавить обработчик событий on_guild_join, который будет вызываться каждый раз, когда ваш бот присоединяется к новому серверу. В обработчике событий вы можете проверить наличие роли с нужным именем в сервере и, если ее нет, создать новую роль.

Вот пример кода на основе вашего скрипта, который реализует эту функциональность:

import os
import disnake
from disnake.ext import commands
from func import *

token = "токен"

activity = disnake.Activity(
    name="v!help",
    type=disnake.ActivityType.watching,
)

bot = commands.Bot(command_prefix="v!", help_command=None, intents=disnake.Intents.all(), activity=activity)

# Функция для создания роли, если ее не существует
async def create_role(guild):
    role_name = "Название роли"
    role = disnake.utils.get(guild.roles, name=role_name)
    if role is None:
        role = await guild.create_role(name=role_name, reason="Роль создана ботом")
    return role

if not os.path.exists("guilds.json"):
  with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "w") as file:
    file.write("{}")
    file.close()
if not os.path.exists("mutedroles.json"):
  with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/mutedroles.json", "w") as file:
    file.write("{}")
    file.close()


@bot.event
async def on_ready():
  for guild in bot.guilds:
    with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "r") as file:
      data = json.load(file)
      file.close()

    with open("C:/Users/murat/OneDrive/Рабочий стол/Ботинок ДС/jsons/guilds.json", "w") as file:
      data[str(guild.id)] = str(guild.name)
      json.dump(data, file, indent=4)
      file.close()

    # Вызов функции создания роли
    role = await create_role(guild)
    print(f"Роль {role.name} создана в сервере {guild.name}.")

  print(f"Бот {bot.user} к вашим услугам!!!")


# Обработка ошибок
@bot.event
async def on_command_error(ctx, error):
  print(error)

  if isinstance(error, commands.MissingPermissions):
    await ctx.send(f"{ctx.author}, у вас не достаточно прав!")
  elif isinstance(error, commands.UserInputError):
    await ctx.send(embed=disnake.Embed(
      description=f"Правильное использование команды: `{ctx.prefix}{ctx.command.name}` ({ctx.command.brief})\nExample: {ctx.prefix}{ctx.command.usage}"
    ))


@bot.slash_command()
async def load(ctx, extension):
  if ctx.author.id == 623446417268277268:
    bot.load_extension(f"cogs.{extension}")
    await
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы