Не получается сделать разные каналы отправки для 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 шт):
Я немного не понял цель того, что должен делать код, но ответить и указать на ошибку попытаюсь.
В 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?
Необходимо было заменить self.group_name
на уже имеющейся self.arg
Работающая версия для одного варианта выглядит так:
if self.arg == "okp":
channel_id = 1227700090509201479 # Вставить ID канала
channel = interaction.guild.get_channel(channel_id)