await guild.create_text_channel("channel_name", category=guild.get_channel(732068815788336617))
# или
await guild.create_text_channel("channel_name", category=discord.utils.get(guild.channels, name="Category"))
# или
await guild.get_channel(732068815788336617).create_text_channel("channel_name")
# или
await discord.utils.get(guild.channels, name="Category").create_text_channel("channel_name")
on_member_join
требует members intent: https://discordpy.readthedocs.io/en/stable/api.htm...intents
в конструктор бота:intents = discord.Intents.default()
intents.members = True
bot = commands.Bot(..., intents=intents)
Help on function fetch_member in module discord.guild:
async fetch_member(self, member_id)
class Horse: # тип - лошадь
...
def send_to_space(self, encapsulate: bool):
# Функция позволяющая отправить лошадь в космос
self.move(Place("Space"))
special_horse_in_vacuum = Horse(...) # Один определенный сферический конь
special_horse_in_vacuum.send_to_space(True) # Отправляем определенного коня в вакуум
special_horse_in_vacuum = Horse # Определение лошади
special_horse_in_vacuum.send_to_space(True) # Пытаемся отправить определение "лошадь" в космос
# Получаем TypeError: send_to_space() missing 1 required positional argument: 'encapsulate'
@bot.command()
async def test(ctx, member_id: int):
print(await ctx.guild.fetch_member(member_id)) # Получить пользователя через API
print(ctx.guild.get_member(member_id)) # Получить пользователя из кэша бота
@bot.command()
async def info(ctx, *, member: discord.Member):
await ctx.send(f"Вас называют: {member.display_name}. Ваш ID: {member.id}. etc...")
intents
передаётся в конструктор бота, а не в декоратор команды: https://discordpy.readthedocs.io/en/stable/intents.htmlimport random
import discord
from discord.ext import commands
intents = discord.Intents()
intents.members = True
bot = commands.Bot(intents = intents, command_prefix = '-')
...
@bot.command(name="кто")
async def who(ctx, *, question):
# Python поддерживает полный UTF-8 в именах переменных и функций
# Но использовать не ASCII английские имена переменных - плохая идея, см. PEP8:
# https://www.python.org/dev/peps/pep-0008/
# https://pep8.ru/doc/pep8/ - на русском
# Программисты, которые не говорят на английском языке,
# пожалуйста, пишите комментарии на английском,
# если только вы не уверены на 120 процентов,
# что ваш код никогда не будут читать люди, не знающие вашего родного языка.
await ctx.send(f'Вопрос: кто {question}\nОтвет: {random.choice(ctx.channel.guild.members).mention}')
bot.run("your_token_here")
on_raw_reaction_add
первым аргументом передаётся не объект типа commands.Context
, а объект типа RawReactionActionEvent: @client.event
async def on_raw_reaction_add(raw_reaction):
print(raw_reaction.user_id) # Выведет ID человека, поставившего реакцию
print(raw_reaction.member.name) # Выведет имя человека, поставившего реакцию, в случае если реакция проставлена на сервере, в противном случае выпадет в ошибку "AttributeError: 'NoneType' object has no attribute 'name'"
discord.Message
, а discord.Context
: https://discordpy.readthedocs.io/en/stable/ext/com..."A command must always have at least one parameter, ctx, which is the Context as the first one.
@bot.command()
async def say(ctx: commands.Context):
args = ctx.message.content
await ctx.send(args.lstrip('{}say'.format(prefix)))
@bot.command()
async def say(ctx: commands.Context, *, content: str):
await ctx.send(content)
client
не определена, о чём и говорит ошибка. В данном контексте вам нужно брать client из класса, в котором находится команда: self.client
discord.Bot.get_guild
принимает в качестве аргумента - ID сервера, типа int
str
). Используйте конвертеры для автоматической конвертации аргументов. Помните также, что функция get_guild
(как и большая часть остальных get_
функций) - не асинхронная, и не работает с await@commands.command()
async def test(self, ctx, arg: int):
channel = self.client.get_guild(arg)
await channel.send("Я написал в канал, который ты указал!")
@bot.event
async def on_member_join(member):
if welcome_channel := member.guild.get_channel(754741279918410952):
await welcome_channel.send(f"Welcome, {member.mention} to {member.guild.name}")
%H
форматирует текущий час в двухзначном формате (00, 01, …, 23
).while True
в асинхронном коде не самая лучшая идея. Используйте asyncio tasks для этого. discord.py имеет расширение для упрощенного управления asyncio tasks: https://discordpy.readthedocs.io/en/stable/ext/tas... while True
в asyncio - коде, обычно, не самая лучшая идея, так как это практически всегда блокирует главный цикл.from discord.ext import tasks, commands
@tasks.loop(seconds=5.0)
async def printer():
print("5 seconds has passed")
printer.start()
on_member_join
и on_member_remove
требуют members intent: https://discordpy.readthedocs.io/en/stable/api.htm...<@&769849037137641482>
.on_member_join
требует Members intent: https://discordpy.readthedocs.io/en/stable/api.htm...@bot.listener()
async def on_command_error(ctx, error):
if isinstance(error, commands.CommandOnCooldown):
await ctx.send(
f"Эту команду можно использовать {error.cooldown.rate} раз в "
f"{error.cooldown.per} секунд на {error.cooldown.type}."
f"Попробуйте еще раз через {error.retry_after} секунд."
)
settings = {}
if guild.id not in settings:
settings[guild.id] = {}
settings[guild.id]["my_data"] = "yes"