@prostovladikxd

Как передать автора модального окна в view?

Здравствуйте! Помогите пожалуйста, как передать автора модального окна в modroleView для открытия базы данных SQLite? Если передаю через параметр, первые строки, которые отвечают за работу кнопок после рестарта бота - перестают работать, так как там тоже нужно передавать автора.
class modroleViewBot(commands.Bot):
    def __init__(self):
        super().__init__(command_prefix=commands.when_mentioned)
        self.persistent_views_added = False

    async def on_ready(self):
        print ('bot started')
        if not self.persistent_views_added:
            self.add_view(modroleView())
            self.persistent_views_added = True

bot = modroleViewBot()

conn = sqlite3.connect("user.db")
cursor = conn.cursor()
cursor.execute(
    """
    CREATE TABLE IF NOT EXISTS users (
        id INTEGER PRIMARY KEY,
        nick TEXT,
        rang INTEGER,
        fraction TEXT,
        screen TEXT
    )
    """
)
conn.commit()

class role1Modal(disnake.ui.Modal):
    def __init__(self):
        components = [
            disnake.ui.TextInput(
                label="ВАШ НИК НА СЕРВЕРЕ",
                placeholder="Введите Nick Name. Пример: Vladislav Nekrasov",
                custom_id="nick",
                style=TextInputStyle.short,
            ),
            disnake.ui.TextInput(
                label="ВАША ФРАКЦИЯ",
                placeholder="Укажите фракцию. Пример: LSPD",
                custom_id="fraction",
                style=TextInputStyle.short,
            ),
            disnake.ui.TextInput(
                label="ВАШ РАНГ",
                placeholder="Укажите ваш ранг во фракции. Пример: 5",
                custom_id="rang",
                style=TextInputStyle.short,
            ),
            disnake.ui.TextInput(
                label="СКРИН /MM > СТАТИСТИКА ПЕРСОНАСЖА",
                placeholder="IMGUR, URL, и Т.Д",
                custom_id="screen",
                style=TextInputStyle.short,
            ),
        ]
        super().__init__(
            title=" | ЗАПРОС РОЛИ",
            custom_id="create_tag",
            components=components,
        )
    async def callback(self, interaction: disnake.ModalInteraction):
        nick = interaction.text_values["nick"].title()
        fraction = interaction.text_values["fraction"].upper()
        rang_input = interaction.text_values["rang"]
        rang = int(rang_input)
        screen = interaction.text_values["screen"]
        role_ids = [1239503710732812309, 1239503726218051625] #id фракционных ролей
        member = interaction.user
        frac_role = any(role_id in [role.id for role in member.roles] for role_id in role_ids)
        role_idt = [1239524487318474782] #id роли лидера
        lead_role = any(role_id in [role.id for role in member.roles] for role_id in role_idt)
        if lead_role:
            embed = disnake.Embed(title='Ошибка! Вы являетесь лидером!', description='', color=0xfc0000)
            await interaction.response.send_message(embed=embed, ephemeral=True)
        else:
            if frac_role:
                embed = disnake.Embed(title='Ошибка! У вас имеется одна из фракционных ролей! Для снятия роли, нажмите на кнопку "Снять роль" и повторите попытку!', description='', color=0xfc0000)
                await interaction.response.send_message(embed=embed, ephemeral=True)
            else:
                if "https:" in screen:
                    if rang < 0:
                        embed = disnake.Embed(title='Ошибка! Вы указали не существующий ранг!', description='', color=0xfc0000)
                        await interaction.response.send_message(embed=embed, ephemeral=True)
                    else:
                        if "_" in nick:
                            embed = disnake.Embed(title='Ошибка! Вы используете "_" в нике. Укажите свой ник в формате: Nick Name!', description='', color=0xfc0000)
                            await interaction.response.send_message(embed=embed, ephemeral=True)
                        else:
                            if fraction.lower() in ["lvpd", "lspd", "sfpd", "мэрия", "ап", "fbi", "swat", "мчс", "армия авианосец", "зона 51", "news"]:
                                if fraction.lower() in ["lvpd", "lspd", "sfpd", "армия авианосец", "зона 51"] and rang > 14:
                                    embed = disnake.Embed(title='Ошибка! Вы указываете ранг больше 14. В указанной фракции всего 14 рангов!', description='', color=0xfc0000)
                                    await interaction.response.send_message(embed=embed, ephemeral=True)
                                elif fraction.lower() in ["мэрия", "ап", "fbi", "swat", "мчс"] and rang > 9:
                                    embed = disnake.Embed(title='Ошибка! Вы указываете ранг больше 9. В указанной фракции всего 9 рангов!', description='', color=0xfc0000)
                                    await interaction.response.send_message(embed=embed, ephemeral=True)
                                elif fraction.lower() in ["news"] and rang > 12:
                                    embed = disnake.Embed(title='Ошибка! Вы указываете ранг больше 12. В указанной фракции всего 12 рангов!', description='', color=0xfc0000)
                                    await interaction.response.send_message(embed=embed, ephemeral=True)
                                else:
                                    user_id = interaction.user.id
                                    cursor.execute("SELECT * FROM users WHERE id=?", (user_id,))
                                    user = cursor.fetchone()
                                    if user is None:
                                        cursor.execute("INSERT INTO users VALUES (?, ?, ?, ?, ?)", (user_id, nick, rang, fraction, screen,))
                                        conn.commit()
                                        embed = disnake.Embed(title='Успешно! Ваша заявка отправлена на рассмотрение', description='', color=0x32fc00)
                                        await interaction.response.send_message(embed=embed, ephemeral=True)
                                        channel = bot.get_channel(1239794478919712808)#id канала куда приходят заявки
                                        embed = disnake.Embed(title='ЗАЯВКА НА ПОЛУЧЕНИЕ РОЛИ', description=f'ОТ {member.mention}', color=0x4636ff)
                                        embed.add_field(name=f'**Ник на сервере: {nick}**', value='', inline=False)
                                        embed.add_field(name=f'**Фракция: {fraction}**', value='', inline=False)
                                        embed.add_field(name=f'**Ранг {rang}**', value='', inline=False)
                                        embed.add_field(name=f'**Ссылка на статистику /mm: {screen}**', value='', inline=False)
                                        embed.add_field(name=f'', value='', inline=False)
                                        embed.add_field(name=f'❗❗❗', value='', inline=False)
                                        embed.add_field(name=f'**ВНИМАНИЕ!!! ОБЯЗАТЕЛЬНО СВЕРЯЙТЕ УКАЗАННЫЕ ДАННЫЕ СО СТАТИСТИКОЙ НА СКРИНЕ. ЕСЛИ ХОТЯБЫ 1 ДАННЫЕ НЕ СОВПАДАЮТ - ЗАЯВКА ДОЛЖНА БЫТЬ ОТКЛОНЕНА**', value='**Доп.информация:** За неверное рассмотрение заявки, администратор, который проверял заявку - получает выговор!', inline=False)
                                        await channel.send(embed=embed, view=modroleView())
                                        message = await channel.send('@everyone')
                                        await asyncio.sleep(1)
                                        await message.delete()
                                    else:
                                        embed = disnake.Embed(title='Ошибка! У вас уже подана заявка на роль. Дождитесь окончания проверки старой заявки', description='', color=0xfc0000)
                                        await interaction.response.send_message(embed=embed, ephemeral=True)
                            else:
                                embed = disnake.Embed(title='Ошибка! Вы указали неверную фракцию! Список доступных фракций можете посмотреть ниже:', description='```LSPD | LVPD | SFPD | Мэрия | АП | FBI | SWAT | Зона 51 | Армия Авианосец | МЧС | News```', color=0xfc0000)
                                await interaction.response.send_message(embed=embed, ephemeral=True)
                else:
                    embed = disnake.Embed(title='Ошибка! В не указали ссылку на скрин статистики /mm или она начинается не с "https:"', description='', color=0xfc0000)
                    await interaction.response.send_message(embed=embed, ephemeral=True)

class modroleView(disnake.ui.View):
    def __init__(self):
        super().__init__(timeout=None)
        self.button_pressed = False

    @disnake.ui.button(label='Одобрить', style=disnake.ButtonStyle.green, custom_id='but:3')
    async def b3_button_callback(self, button, interaction):
        if self.button_pressed == False:
            user_id = #НАДО АВТОРА МОДАЛЬНОГО ОКНА
            cursor.execute("SELECT * FROM users WHERE id=?", (user_id,))
            user = cursor.fetchone()
            if user is None:
                print ('1')
            else:
                await interaction.author.edit(nick=f'[{user[2]}] {user[1]}')
                await interaction.response.send_message(f'Получившийся ник: [{user[2]}] {user[1]}', ephemeral=True)
            cursor.execute("DELETE FROM users WHERE id=?", (user_id,))
            self.button_pressed = True
        else:
            return
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
interaction.author

UPD: Просто сделать так не получится, поскольку вторая модалка ничего не знает о первой. Так же как вы храните людей в БД нужно хранить там же связку id кнопки: человек.
Альтернативный способ хранить информацию о пользователе (ник или айдишник) в тексте эмбеда и читать его оттуда.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@prostovladikxd Автор вопроса
interaction.author не работает: https://youtu.be/PNuKgFH_WXI
Ответ написан
Комментировать
@Tiubert
Можно сохранять id автора(ну тут вообще просто сам объект автора сохраняется) в self'е класса View и передавать/брать его от туда.
Дам пример
class AcceptRoleView(disnake.ui.View):
    def __init__(self, author): # Сам класс с кнопкой
        self.author = author
        super().__init__(timeout=None)

    @disnake.ui.button(label="Принять", style=disnake.ButtonStyle.success)
    async def button_accept(self, button: disnake.ui.Button, inter: disnake.AppCmdInter):
        await inter.send(f"{self.author.mention} был принят {inter.author.mention}")

class Modal(disnake.ui.Modal):
    ... # Тут както создаем модал, до этого мы както его вызвали
    async def callback(self, interaction: disnake.ModalInteraction):
        # Как то обрабатываем модал и чтобы отправить сообщение указываем view
        await inter.send(content=inter.author.id, view=AcceptRoleView(inter.author))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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