@Daniel1200

Почему бот при ответе на слэш команду с модальным окном, сразу отправляет старые данные не дожидаясь ввода новых данных из модального окна .disnake?

Мне понадобилось сделать слэш команду в моем Дискорд боте, она должна была работать так:
1. вы пишете слэш команду - "/fangs"
2. открывается модальное окно
3.вы пишете нужные данные
4. бот обрабатывает и изменяет их, после чего отправляет их в виде сообщения в чат
но в итоге получилось это:
1. вы пишете слэш команду - "/fangs"
2. открывается модальное окно
3.бот отправляет данные которые были введены в прошлый раз
4.вы пишете нужные данные
5. бот обрабатывает и изменяет их, после чего отправляет их в виде сообщения в чат
как это исправить?
в пример я приведу упрощенный код, без изменения исходных данных:
import disnake
from disnake.ext import commands
from disnake import TextInputStyle
bot = commands.Bot(
    command_prefix='!',
    sync_commands_debug=True
)

class MyModal(disnake.ui.Modal):
    def __init__(self):
        # The details of the modal, and its components
        components = [
            disnake.ui.TextInput(
                label="test0",
                placeholder="введи свою мысль",
                custom_id="test0",
                style=TextInputStyle.short,
                max_length=667,
            ),
            disnake.ui.TextInput(
                label="test1",
                placeholder="Введи что-нибудь.",
                custom_id="test1",
                style=TextInputStyle.paragraph,
            ),
        ]
        ilw ="lor"
        super().__init__(
            title="Create Tag",
            custom_id=ilw,
            components=components,
        )
    async def callback(self, inter: disnake.ModalInteraction):
        A = inter.text_values.items()
        print(A)
        await inter.response.send_message(A)

@bot.slash_command(description="просто тест команды")
async def fangs(inter: disnake.AppCmdInter):
    """Sends a Modal to create a tag."""
    await inter.response.send_modal(modal=MyModal())
bot.run("OTUwUTgyMom,i'm_hacker?zMzU3Nzc3Uw.nbCPFrRgrtmlu4eFHM")
  • Вопрос задан
  • 712 просмотров
Пригласить эксперта
Ответы на вопрос 1
@ant1quariat
Ну так Вы в callback отправляете те данные, которые были получены из модального окна. Естественно они будут старые, т.к Вы их не обработали.

Вы можете их получить по custom_id и уже непосредственно их обрабатывать.

async def callback(self, inter: disnake.ModalInteraction):
    text_one = inter.text_values["test0"]
    text_two = inter.text_values["test1"]

    # Например, выведим вторую переменную в нижнем регистре, а первую в верхнем:
    await inter.response.send_message(f"{text_two.upper()}  {text_one.lower()}")


Так же Вы можете перебирать все ключи и значения (ключ это custom_id, значение это значение в полях) в цикле:
async def callback(self, inter: disnake.ModalInteraction):
    for key, values in inter.text_values.items():
        # Дествия....
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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