Обертка для API взаимодействий Discord, которая не полагается на веб -кожи и, следовательно, может использоваться в среде веб -крючков без сохранения состояния.
Кроме того, это обеспечивает строгое разделение между структурой ваших команд и данными, полученными при ее запусках.
Требуется Python 3.8+
pip install discord-interactions.pypip install git+https://github.com/LiBa001/discord-interactions.pyПримечание
Установка непосредственно из GitHub требует, чтобы вы установили GIT на вашем компьютере.
python -m pip install ...py -m pip install ... Эта библиотека специально разработана для беспрепятственной работы с помощью флаг -микропрофлик.
Наиболее похожим на API пример с расширением колбы-это:
from discord_interactions . flask_ext import Interactions
from discord_interactions import (
ApplicationCommand ,
ApplicationCommandOption ,
ApplicationCommandOptionType ,
Interaction ,
InteractionResponse ,
InteractionResponseType ,
InteractionApplicationCommandCallbackData ,
)
from flask import Flask
import os
app = Flask ( __name__ )
interactions = Interactions ( app , os . getenv ( "CLIENT_PUBLIC_KEY" ))
echo_cmd = ApplicationCommand ( "echo" , "what goes around comes around" )
echo_cmd . add_option (
ApplicationCommandOption (
type = ApplicationCommandOptionType . STRING ,
name = "message" ,
description = "This will be echoed." ,
required = True ,
)
)
@ interactions . command ( echo_cmd )
def _echo ( interaction : Interaction ):
msg = interaction . data . options [ 0 ]. value # "message" option content
return InteractionResponse (
type = InteractionResponseType . CHANNEL_MESSAGE_WITH_SOURCE ,
data = InteractionApplicationCommandCallbackData ( content = msg ),
) Здесь мы используем элементарные классы ApplicationCommand , классы Interaction и InteractionResponse , которые находятся в их структуре, в основном точные аналоги оригинальных моделей API.
Давайте сделаем это немного проще:
@ interactions . command ( echo_cmd )
def _echo ( interaction : Interaction ):
# different way of getting an option
msg = interaction . data . get_option ( "message" ). value
return msg Теперь нам больше не нужно иметь дело с InteractionResponse , но вместо этого просто возвращайте контент ответа как строку. Тип ответа затем по умолчанию в InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE . Вы также можете просто вернуть нет, если не хотите отправлять ответ. Вы также можете просто вернуть логическое значение как второе значение, указывая, должен ли командный вызов отображаться в Discord (то есть в части типа ответа _WITH_SOURCE ). Также мы получаем опцию с помощью метода get_option Helper.
Эта библиотека обеспечивает еще один слой абстракции. Вдохновленный концепцией ORM базы данных, у него есть объект-коммерческий Mapper (OCM), который позволяет вам определить класс для каждой команды, который затем служит как общее структурное описание команды (например, ApplicationCommand ) , так и контейнер для фактических данных, которые получены при вызове команды (например, Interaction ).
Итак, самый простой возможный пример выглядит следующим образом:
from discord_interactions . flask_ext import Interactions
from discord_interactions . ocm import Command , Option
from flask import Flask
import os
app = Flask ( __name__ )
interactions = Interactions ( app , os . getenv ( "CLIENT_PUBLIC_KEY" ))
class _Echo ( Command ):
""" what goes around comes around """
message : str = Option ( "This will be echoed." , required = True )
@ interactions . command
def _echo ( cmd : _Echo ):
return cmd . message Если вы хотите отправлять сообщения после первоначального ответа, вам нужно создать последующие сообщения. Для этой цели вы можете использовать декоратор after_command , который регистрирует функцию, которая будет вызвана после возвращения фактической командной функции. Функция должна принять ровно один параметр, AfterCommandContext , который содержит несколько вещей, такие как Interaction и начальное InteractionResponse .
interactions = Interactions ( app , PUBLIC_KEY )
@ interactions . command ( "delay" )
def delay ( _ : Interaction ):
return "starting countdown" , True # this message is ephemeral
@ delay . after_command
def after_delay ( ctx : AfterCommandContext ):
delay_time = ctx . interaction . data . options [ 0 ]. value
time . sleep ( delay_time )
ctx . send ( f" { delay_time } seconds have passed" ) Вы также можете зарегистрировать обратные вызовы для компонентов сообщений, таких как кнопки. Компоненты зарегистрированы и идентифицируются по их custom_id .
@ interactions . component ( "my_button" )
def my_button_handler ( ctx : ComponentContext ):
return f" { ctx . interaction . user . username } clicked the button" Для получения дополнительных примеров различных функций взгляните на примеры.
Если вы хотите знать, как заставить вашего бота -диссораза работать с командами Slash и как все настроить, взгляните на этот пример проекта. Он размещает программу в без серверной среде через Google Cloud Run, а также предоставляет демонстрационный бот, так что вы можете попробовать команды SLASH на вашем сервере Discord. Проверьте это, чтобы узнать больше!