Задать вопрос
  • Как сделать чтобы кнопка работала даже после перезапуска бота?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    При старте бота в событии on_ready нужно регистрировать обработчик.
    Официальный пример с комментариями.
    Ответ написан
    1 комментарий
  • Бот не высвечивает кто пригласил, как исправить?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Потому что при result is None and chann is not None inviter_id будет None.
    inviter_id = None
    if result is not None:
       ... 
    
    if chann:
        embed = nextcord.Embed(
            title='Leafy InviteLogger',
            description=f'{member.mention} join the server!\n\n Invited by <@{inviter_id}>\n Total invitations {total_invites}',
            colour=0x2b2d31
        )


    P.S. Отредактируйте вопрос в соответствии с правилами ресурса. Используйте спойлер для портянок и изображений.
    Ответ написан
  • Что делать ошибка после возрата?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Переводим ошибку
    coroutine 'ApplicationContext.respond' was never awaited

    Смотрим на строку, которая эту ошибку вызывает
    ctx.respond(f'Вы уже использовали {us} из {kyp}',ephemeral=True)

    Сравниваем с вашим же кодом на 10 строк нижe
    await ctx.respond(embed=embedvar,ephemeral=True)
    Играем в игру "найди одно ключевое отличие", добавляем в код await

    С учетом того, что у библиотеки discord.py нет объектов ApplicationContext, похоже код использует какой-то форк и такие вещи стоит указывать.
    Ответ написан
    Комментировать
  • Как вызвать одну функцию из другой в discord боте?

    fenrir1121
    @fenrir1121
    Начни с документации
    Как вызвать одну функцию из другой в discord боте?
    Так же как не в дискорд боте.

    Есть две команды
    В приложенном коде только одна команда search, а ask просто функция.

    # Создаем контекст для выполнения команды /search с вопросом пользователя
    ctx = await bot.get_context(channel.message)
    ctx.message.content = f"/search {question}"

    Зачем вы пытаетесь отправить сообщение и самому на него отреагировать?
    Почему вы пытаетесь использовать слеш в команде с префиксом?

    По ощущениям код на 80% написан кодогенератором и пишется без понимания что он вообще делает.
    Ответ написан
  • Guild.members не возвращает список всех участников сервера. Что делать?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Вам не дадут всех участников всех серверов. А если вы расчитываете когда-то получить верификацию, учитывайте что вам могут вообще не дать смотреть участников.
    650aa23f17855437585678.png
    1. Никогда не пишите в БД в on_ready. Вы миллион раз будете запускать бота и он миллион раз будет писать миллион пользователей
    2. Не храните пустых пользователей. 99% участников серверов не воспользуются вашим ботом никогда, зачем вы их храните?
    3. Добавляйте запись когда в ней есть необходимость, используйте INSERT ... ON CONFLICT ... UPDATE
    Ответ написан
    Комментировать
  • Можно ли в Python сделать такой механизм, чтобы при изменении значения в любой ветки словаря, я был уведомлен?

    fenrir1121
    @fenrir1121
    Начни с документации
    Наследование от dict повлечет за собой неявные ошибки, используйте предназначенный для этого collections.UserDict
    from collections import UserDict
    class MyDict(UserDict):
        def __setitem__(self, key, value):
            print(f'Меняем значение {key} на {value}')
            super().__setitem__(key, value)


    Мне нужно чтобы при изменении любого значения словаря, в том числе значения словаря по ключу 'z', выполнялся определенный код.

    Очевидно вам это нужно для ваших конкретных словарей с бизнес логикой. И это нормально что они будут отдельным классом. Питон под капотом тоже использует словари и там явно не должен выполняться ваш код.
    Ответ написан
    Комментировать
  • Существует ли аналог Proxy и Reflect (как в JS) для Python?

    fenrir1121
    @fenrir1121
    Начни с документации
    @property переопределяет доступ к атрибутам и логику чтения, записи и удаления.
    Ответ написан
    Комментировать
  • Как убрать строку между name и value в embed.add_field - disnake.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Никак.
    Name и Value всегда на разные строках так же как Title и Description.
    Если текст должен быть в одной строке просто положите его в одно поле.

    P.S. поправьте текст вопроса.
    Ответ написан
    Комментировать
  • Не работает on_member_join Как исправить?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Не работает on_member_join?

    on_member_join работает, не работает ваш код. Вероятно channel is None, поскольку этой ветки у вас нет вам об этом и не сообщается.

    1. Поправьте вопрос как описано в сообщении модератора

    2. Проверяйте типы объектов, которыми оперируете и делайте все возможные ветвления, если код работает не как ожидается.

    3. Открывайте документацию

    4. Для приветственных сообщений есть системный канал, который рекомендуется под это использовать.
    Хардкод это плохая практика.

    import discord
    
    class MyClient(discord.Client):
        async def on_member_join(self, member):
            guild = member.guild
            if guild.system_channel is not None:
                msg = f'{member.mention} добро пожаловать на сервер {guild.name}!'
                await guild.system_channel.send(msg)
    
    
    intents = discord.Intents.default()
    intents.members = True
    
    client = MyClient(intents=intents)
    client.run('token')
    Ответ написан
    Комментировать
  • Реалтайм на питоне возможен?

    fenrir1121
    @fenrir1121
    Начни с документации
    Подскажите как можно оценить погрешность для кода питон?

    Так же как для не питон кода - замерить. Подойдет time.perf_counter, а если пользуетесь юпитер блокнотами волшебная функция %timeit
    %timeit 'while True: pass'
    6.38 ns ± 0.138 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)
    Ответ написан
    2 комментария
  • Как правильно обработать # IndexError: string index out of range?

    fenrir1121
    @fenrir1121
    Начни с документации
    Обычно сравнивают с предыдущим символом, а не следующим, тогда и проблем с выходом за длину строки не возникнет
    def compress(s: str) -> str:
        out = ''
        cnt = 1
        for i in range(1, len(s)):
            if s[i] == s[i - 1]:
                cnt += 1
            else:
                out += s[i - 1] + str(cnt) if cnt > 1 else s[i - 1]
                cnt = 1
    
        out += s[-1] + str(cnt) if cnt > 1 else s[-1]
        return out
    Ответ написан
    Комментировать
  • Как превратить str(словарь) обратно в словарь?

    fenrir1121
    @fenrir1121
    Начни с документации
    Можно использовать модуль ast. Но лучше воспользоваться советом Vindicar и поправить код, который привел к этой ситуации.
    In [7]: import ast
    
    In [8]: what = "{'id': '4315398315201472005'}"
    
    In [9]: d = ast.literal_eval(what)
    
    In [10]: d
    Out[10]: {'id': '4315398315201472005'}
    
    In [11]: d['id']
    Out[11]: '4315398315201472005'
    Ответ написан
    Комментировать
  • Приложение не отвечает?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Приложите код оформив как положено.

    Без отступов нельзя сказать на 100%, но вероятно дело в том, что у вас в середине функции что-то забыл return, после которого ничего не выполнится.
    Ответ написан
    1 комментарий
  • Как сделать так чтобы бот отвечал на определённое сообщение пользователя?

    fenrir1121
    @fenrir1121
    Начни с документации
    Любой учебник открываете, смотрите раздел условный оператор.
    Конструкция, которую вы написали эквивалентна выражению
    if message.text == 'Профиль' or True, что всегда будет истиной.

    Ну и для подобной проверки есть message_handler, но вы лучше с основ начните, а потом ботов трогайте.
    Ответ написан
  • Как настроить использование слэш-команды в конкретном канале (disnake)?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Это можно сделать, только не в параметрах.
    Можно либо где-нибудь в БД хранить разрешенные id каналов и повесить check на команду (предпочительно, если бот на много серверов)
    Или собственно в настройках сервера -> Интеграция выставить в каких каналах она должна быть доступна (если бот на одном сервере). В этом случае в коде вообще ничего делать не нужно.
    Ответ написан
    Комментировать
  • Не работает код Discord.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Не работает код Discord.py?
    Да не работает.

    библиотеки нужные я установил
    Значит не установили, иначе yarl бы подтянулся
    ➜  ~ (test) pip install discord
    ...
    ➜  ~ (test) pip freeze | cat
    aiohttp==3.8.5
    aiosignal==1.3.1
    async-timeout==4.0.3
    attrs==23.1.0
    charset-normalizer==3.2.0
    discord==2.3.2
    discord.py==2.3.2
    frozenlist==1.4.0
    idna==3.4
    multidict==6.0.4
    yarl==1.9.2


    Python 3.1.1
    Что правда 3.1.1?

    Смотрите что и как наустанавливали.
    Ответ написан
    Комментировать
  • Как сделать команду которую может использовать только владелец сервера?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Для владельца могут быть отдельные команды и готовой проверки нет, нужно пилить кастомную.

    Владельца можно получить из ctx.guild.owner_id
    # checks.py
    from discord.ext import commands
    def is_owner():
        async def predicate(ctx: commands.Context) -> bool:
            return ctx.author.id == ctx.guild.owner_id:
        return commands.check(predicate)


    и используем аналогично дискордовским
    @bot.command()
    @checks.is_owner()
    async def test(ctx):
        await ctx.send('You can manage messages.')
    Ответ написан
    Комментировать
  • Как внедрить меню dropdown?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Как внедрить меню dropdown?
    Как написано в документации и примерах использования dropdown

    (желательно ответьте куском кода )

    Код из примера
    import discord
    from discord.ext import commands
    
    class Dropdown(discord.ui.Select):
        def __init__(self):
            options = [
                discord.SelectOption(label='Red', description='Your favourite colour is red', emoji=''),
                discord.SelectOption(label='Green', description='Your favourite colour is green', emoji=''),
                discord.SelectOption(label='Blue', description='Your favourite colour is blue', emoji=''),
            ]
            super().__init__(placeholder='Choose your favourite colour...', min_values=1, max_values=1, options=options)
    
        async def callback(self, interaction: discord.Interaction):
            await interaction.response.send_message(f'Your favourite colour is {self.values[0]}')
    
    
    class DropdownView(discord.ui.View):
        def __init__(self):
            super().__init__()
            self.add_item(Dropdown())
    
    
    class Bot(commands.Bot):
        def __init__(self):
            intents = discord.Intents.default()
            intents.message_content = True
    
            super().__init__(command_prefix=commands.when_mentioned_or('$'), intents=intents)
    
        async def on_ready(self):
            print(f'Logged in as {self.user} (ID: {self.user.id})')
            print('------')
    
    
    bot = Bot()
    
    
    @bot.command()
    async def colour(ctx):
        view = DropdownView()
        await ctx.send('Pick your favourite colour:', view=view)
    
    bot.run('token')
    Ответ написан
    Комментировать
  • Почему if isinstance(interaction.component, disnake.ui.Button) возвращает False?

    fenrir1121
    @fenrir1121
    Начни с документации
    Потому что disnake.ui.Button и disnake.Button не одно и то же.

    disnake.ui.Button используется для создания кнопок, а в component лежит или disnake.Button или disnake.BaseSelectMenu
    Ответ написан
    Комментировать
  • Как выучить disnake?

    fenrir1121
    @fenrir1121
    Начни с документации
    disnake это библиотека, а не язык чтобы его учить. Берете и пользуетесь.

    Для начала у него достаточно крупное ру комьюнити и начать стоит с руководства, где очень подробно описан весь основной функционал.

    Когда основ недостаточно добро пожаловать в документацию.
    Ответ написан
    Комментировать