Общее
Общие вопросы, касающиеся использования библиотеки, относятся сюда.
Это содержание было взято непосредственно из документации и
унаследованно от 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_messageBot.fetch_userBot.fetch_guildsBot.fetch_guildBot.fetch_emojisBot.fetch_emojiBot.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.