Общее
Общие вопросы, касающиеся использования библиотеки, относятся сюда.
Это содержание было взято непосредственно из документации и
унаследованно от discord.py
. Скорее всего, в будущем оно будет переписано.
Где я могу найти примеры использования?
Пример кода можно найти в папке примеры.
Как мне установить статус "Играет в"?
Именованный аргумент activity
может быть передан в
конструкторе commands.Bot
или Bot.change_presence
,
учитывая ссылку Activity
объект.
Конструктор может использоваться для статических активностей, в то время
как Bot.change_presence
может использоваться для обновления активности во время выполнения.
Настоятельно не рекомендуется
использовать Bot.change_presence
или вызовы API в on_ready
, поскольку это событие может вызываться много раз во время
выполнения, не только один раз. Существует высокая вероятность отключения, если присутствие будет изменено сразу после
подключения.
Тип статуса можно задать с помощью ActivityType
. В целях оптимизации памяти некоторые
действия предлагаются в уменьшенных версиях:
Собрав обе эти части информации вместе, вы получите следующее:
bot = commands.Bot(..., activity=disnake.Game(name="игру"))
# Или просмотр:
activity = disnake.Activity(
name="ютуб",
type=disnake.ActivityType.watching,
)
bot = commands.Bot(..., activity=activity)
Как мне отправить сообщение в определенный канал?
Вы должны получить канал напрямую, а затем вызвать соответствующий метод. Например:
channel = bot.get_channel(12324234183172)
await channel.send("привет")
Как мне отправить сообщение в ЛС?
Вы должны получить объект User
или Member
и
вызвать метод send()
. Например:
user = bot.get_user(381870129706958858)
await user.send("👀")
Если вы отвечаете на событие, например на on_message
, у вас уже есть ссылка на
объект User
через Message.author
:
await message.author.send("👋")
Как мне получить ID отправленного сообщения?
Метод abc.Messageable.send
возвращает ссылку
на Message
, которое было отправлено. К ID сообщения можно получить доступ
через Message.id
:
message = await channel.send("хмм…")
message_id = message.id
Как мне загрузить изображение?
Чтобы загрузить что-либо в Discord, вы должны использовать объект File
.
Объект File
принимает 2 параметра, файлоподобный объект (или путь к файлу) и имя
файла для передачи в Discord при загрузке.
Если вы хотите загрузить изображение, это так же просто, как:
await channel.send(file=disnake.File("my_file.png"))
Если у вас есть файлоподобный объект, вы можете сделать следующее:
with open("my_file.png", "rb") as fp:
await channel.send(file=disnake.File(fp, "new_filename.png"))
Чтобы загрузить несколько файлов, вы можете использовать именованный аргумент files
вместо file
:
my_files = [
disnake.File("result.zip"),
disnake.File("teaser_graph.png"),
]
await channel.send(files=my_files)
Если вы хотите загрузить что-то с URL-адреса, вам придется использовать HTTP-запрос с использованием
aiohttp
, а затем передайте
io.BytesIO экземпляр
в File
вот так:
import io
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.get(my_url) as resp:
if resp.status != 200:
return await channel.send("Невозможно загрузить файл...")
data = io.BytesIO(await resp.read())
await channel.send(file=disnake.File(data, "cool_image.png"))
Как я могу добавить реакцию на сообщение?
Вы можете использовать метод Message.add_reaction
.
Если вы хотите использовать эмодзи в юникоде, вы должны передать допустимую кодовую точку юникода в строке. В вашем коде вы можете написать это несколькими различными способами:
'👍'
'\U0001F44D'
'\N{THUMBS UP SIGN}'
Краткий пример:
emoji = "\N{THUMBS UP SIGN}"
# или '\U0001f44d' или '👍'
await message.add_reaction(emoji)
Если вы хотите использовать эмодзи, которые приходят из сообщения, вы уже получаете их кодовые точки в содержимом,
не делая ничего особенного. Вы не можете отправить ':thumbsup:'
стиль сокращений.
Для пользовательских эмодзи вы должны передать экземпляр Emoji
. Вы также можете
передать строку <:name:id>
, но если вы можете использовать указанный смайлик, вы должны быть в состоянии
использовать Bot.get_emoji
, чтобы получить смайлик через
ID или использовать utils.find
или utils.get
на Bot.emojis
или Guild.emojis
.
Имя и ID пользовательского смайлика можно найти в клиенте, добавив слэш к :custom_emoji:
. Например, отправка
сообщения \:python3:
приведет к <:python3:232720527448342530>
.
Краткий пример:
# Если у вас уже есть ID
emoji = bot.get_emoji(310177266011340803)
await message.add_reaction(emoji)
# Нет ID, выполните поиск
emoji = disnake.utils.get(guild.emojis, name="LUL")
if emoji:
await message.add_reaction(emoji)
# Если у вас есть имя и ID пользовательского смайлика:
emoji = "<:python3:232720527448342530>"
await message.add_reaction(emoji)
Как мне пропустить короутайн функции плеера "after"?
Музыкальный проигрыватель библиотеки запускается в отдельном потоке, следовательно, он не выполняется внутри
короутайна. Это не означает, что невозможно вызвать короутайн в параметре after
. Для этого вы должны передать
вызываемый объект, который включает в себя несколько аспектов.
Первое, о чем вы должны знать, - это то, что вызов короутайна не является потокобезопасной операцией. Поскольку
технически мы находимся в другом потоке, мы должны проявлять осторожность при вызове потокобезопасных операций, чтобы
не допустить сбоев. К счастью для нас, asyncio
поставляется с asyncio.run_coroutine_threadsafe
функция, которая позволяет нам вызывать короутайн из другого потока.
Однако эта функция возвращает
Future
, и чтобы действительно
вызвать его, мы должны получить его результат. Собрав все это вместе, мы можем сделать следующее:
def my_after(error):
coro = some_channel.send("Песня закончена!")
fut = asyncio.run_coroutine_threadsafe(coro, bot.loop)
try:
fut.result()
except:
# Произошла ошибка при отправке сообщения
pass
voice.play(disnake.FFmpegPCMAudio(url), after=my_after)
Как мне запустить что-то в фоновом режиме?
Посмотрите пример background_task.py
.
Как мне получить конкретную модель?
Есть несколько способов сделать это. Если у вас есть ID конкретной модели, вы можете использовать одну из следующих функций:
Следующее использует HTTP-запрос:
abc.Messageable.fetch_message
Bot.fetch_user
Bot.fetch_guilds
Bot.fetch_guild
Bot.fetch_emojis
Bot.fetch_emoji
Bot.fetch_member
Если вышеприведенные функции вам не помогают, то использование utils.find
или utils.get
может быть полезно для поиска конкретных моделей.
Краткий пример:
# Найдите сервер по названию
guild = disnake.utils.get(bot.guilds, name="My Server")
# Обязательно проверьте, найден ли он
if guild is not None:
# Поиск канала по названию
channel = disnake.utils.get(guild.text_channels, name="cool-channel")
Как мне сделать веб-запрос?
Чтобы сделать запрос, вы должны использовать неблокирующую библиотеку. Эта библиотека уже использует и требует
стороннюю библиотеку для выполнения запросов, aiohttp
.
Краткий пример:
async with aiohttp.ClientSession() as session:
async with session.get("http://aws.random.cat/meow") as r:
if r.status == 200:
js = await r.json()
Смотрите полную документацию по aiohttp
для большей информации.
Как мне использовать локальный файл изображения для изображения в эмбеде?
Настройка локального изображения для эмбеда может быть выполнена с помощью аргумента file
в
методе Embed.set_image
. Он принимает File
объект.
Краткий пример:
embed = disnake.Embed()
embed.set_image(file=disnake.File("path/to/file.png"))
await channel.send(embed=embed)
Существует ли событие для создания записей журнала аудита?
Поскольку Discord не отправляет эту информацию в шлюз, библиотека не может предоставить эту информацию. В настоящее время это ограничение Discord.