Не получается сделать разные каналы отправки для Select Menus

Делаю дискорд бота. И не получается разделить для разных SelectOption разные каналы. Меняла разные способы, но все еще не получилось... Сейчас остановилась на таком варианте, но и он не работает. Пишу на языке python с библиотекой disnake.

    class RecruitementModal(disnake.ui.Modal):
    def __init__(self, arg, interaction, group_name):
        self.group_name = group_name
        components = [
            disnake.ui.TextInput(label="-", placeholder="-", custom_id="nm"),
            disnake.ui.TextInput(label="-", placeholder="-", custom_id="ag"),
            disnake.ui.TextInput(label="-", placeholder="-", custom_id="pro"),
            disnake.ui.TextInput(label="-", placeholder="-", custom_id="rp"),
            disnake.ui.TextInput(label="-", placeholder="-", custom_id="gp")
        ]
        super().__init__(title=f"-", components=components, custom_id="recruitementModal")

    async def callback(self, interaction: disnake.ModalInteraction) -> None:
        nm = interaction.text_values["nm"]
        ag = interaction.text_values["ag"]
        pro = interaction.text_values["pro"]
        rp = interaction.text_values["rp"]
        gp = interaction.text_values["gp"]
        embed = disnake.Embed(color=0x2F3136,)
        embed.description = f"-"
        
        channel_id = None
        if self.group_name == "okp":
            channel_id = 1226240467981570160  # Вставить ID канала
        elif self.group_name == "yo":
            channel_id = 1227278896286929081 
        elif self.group_name == "cs":
            channel_id = 1227321022932324434
            
        channel = interaction.guild.get_channel(channel_id)    
        
        current = datetime.datetime.now(pytz.timezone('Europe/Moscow')).strftime('%d.%m.%Y %H:%M')
        embed1 = disnake.Embed(color=0x2F3136)
        embed1.description = f"-"
        await channel.send(embed=embed1)


class RecruitementSelect(disnake.ui.Select):
    def __init__(self):
        options = [
            disnake.SelectOption(label="-", value="okp"),
            disnake.SelectOption(label="-", value="yo"),
            disnake.SelectOption(label="-", value="cs"),
            disnake.SelectOption(label="-", value="do"),
            disnake.SelectOption(label="-", value="net"),
            disnake.SelectOption(label="-", value="bd"),
            disnake.SelectOption(label="-", value="cv"),
            disnake.SelectOption(label="-", value="reg"),
            disnake.SelectOption(label="-", value="nm"),
            disnake.SelectOption(label="-", value="gr"),
        ]
        super().__init__(
            placeholder="Выбор", options=options, min_values=0, max_values=1, custom_id="recruitement"
        )

    async def callback(self, interaction: disnake.MessageInteraction):
        if not interaction.values:
            await interaction.response.defer()
        else:
            selected_value = interaction.values[0]
            selected_label = [option.label for option in self.options if option.value == selected_value][0]
            await interaction.response.send_modal(RecruitementModal(selected_value, interaction, selected_label))

Ответы (2 шт):

Автор решения: SuperFeda

Я немного не понял цель того, что должен делать код, но ответить и указать на ошибку попытаюсь.

В RecruitementModal.callback вы сравниваете group_name с например: "opk", но проблема в том, что если в RecruitementSelect.callback правильно написан генератор, то в selected_label сохраняется лейбл выбранной строки, а не ее значение, то есть она никак не может быть == "opk", сюдя по вашему построению кода она будет == "-". И уже эта переменная, в строке отправки модального окна, переходит в параметр group_name класса RecruitementModal, где она сравнивается после заполнения TextInput и никчему не приходит. Попробуйте передавать не лейбл, а value в RecruitementModal.group_name, может быть это исправит проблему.

Еще в RecruitementSelect.callback не имеет никакого смысла проверка на выбранную строку. Ведь если пользователь выбрал что-то в вашем SelectMenu, то тогда что-то произойдет, а если он ничего не выбирал, то ничего не произойдет и соответственно код callback никак не будет вызван. Еще бы посоветовал заменить параметр min_values с 0 на 1.

Во время чтения данного кода у меня также возник вопрос: что это за такой класс disnake.ui.Select? Я ничего не нашел о нем в документации. Вы пишите на старой версии Disnake?

→ Ссылка
Автор решения: qweq

Необходимо было заменить self.group_name на уже имеющейся self.arg

Работающая версия для одного варианта выглядит так:

if self.arg == "okp":
            channel_id = 1227700090509201479  # Вставить ID канала 
            channel = interaction.guild.get_channel(channel_id)
→ Ссылка