Задать вопрос
  • 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 это библиотека, а не язык чтобы его учить. Берете и пользуетесь.

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

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

    fenrir1121
    @fenrir1121
    Начни с документации
    Использоваться девятью INNER JOIN.

    Но что-то мне подсказывает проблема в архитектуре базы и отсутствии внешних ключей, а не в необходимости запроса к 10 таблицам.
    Ответ написан
    Комментировать
  • Как создать слеш команды на discord.py?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Многие используют from discord_slash import SlashCommand
    Смелое заявление о библиотеке, которая не обновлялась с 2021 года. У нее уже даже архивный репозиторий удалили и ссылка ведет на interactions.py.

    Как создать слеш команды на discord.py?
    Открыть examples библиотеки, например basic.py, вставить свой токен и запустить. Все примеры снабжены исчерпывающими комментариями.
    Ответ написан
    Комментировать
  • Ошибка при импорта библиотеки?

    fenrir1121
    @fenrir1121
    Начни с документации
    Просто по приколу изучить язык прежде чем что-то делать.
    Просто по приколу не пытаться программировать на телефоне.
    Просто по приколу перевести ошибку.
    Причина и инструкция что нужно делать чёрным по белому написаны в ошибке:
    error: can't find Rust compiler

    If you did intend to build this package from source, try installing a Rust compiler from your system package manager and ensure it is on the PATH during installation. Alternatively, rustup (available at https://rustup.rs) is the recommended way to download and update the Rust compiler toolchain


    Кроме того прочитайте правила ресурса и оформите вопрос как положено: удалите теги, дискорд не имеет отношения к вашему вопросу, замените сложность и уберите портянку под спойлер
    Ответ написан
    2 комментария
  • Как исправить отличающийся символ в названии файла на macos и windows?

    fenrir1121
    @fenrir1121
    Начни с документации
    В linux и macos все кодировки по-умолчанию совпадают с UTF-8, а windows с ее cp1251 и cp866 для любителей острых ощущений.
    Что касается нормализации, есть 4 вида: NFC, NFD, NFKC и NFKD
    В разницу композиции и декомпозиции углубляться не буду, для этого есть документация и W3C, но отмечу что NFKC и NFKD могут приводить к потере данных, поэтому лучше использовать NFC, а остальные использовать если ее недостаточно.

    from unicodedata import normalize
    
    def eq_nfc(str1, str2):
        return normalize('NFC', str1) == normalize('NFC', str2)
    Ответ написан
    Комментировать