• Как локализировать название и описание слеш команды используя disnake.Locale?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Внимательно читать документацию и корректно соблюдать нейминг.
    Для команд и аргументов в файле с локалью ru.json, должны быть строки вида XYZ_NAME и XYZ_DESCRIPTION.
    Посмотреть пример
    # For this example to work, you need to create a file `locale/de.json` containing the following:
    """
    {
        "HIGHSCORE_COMMAND_NAME": "rekord",
        "HIGHSCORE_COMMAND_DESCRIPTION": "Zeigt die Rekordpunktzahl des Users innerhalb des gewählten Zeitraums.",
        "HIGHSCORE_USER_NAME": "user",
        "HIGHSCORE_USER_DESCRIPTION": "Der User, dessen Punktzahl gezeigt werden soll.",
        "HIGHSCORE_GAME_NAME": "spiel",
        "HIGHSCORE_GAME_DESCRIPTION": "Spiel, für das Punktzahlen gefiltert werden.",
        "HIGHSCORE_RANGE_NAME": "zeitraum",
        "HIGHSCORE_RANGE_DESCRIPTION": "Der Zeitraum zur Berechnung der Rekordpunktzahl.",
    
        "CHOICE_DAY": "Letzter Tag",
        "CHOICE_WEEK": "Letzte Woche",
        "CHOICE_MONTH": "Letzter Monat",
    
        "GAME_TIC-TAC-TOE": "Tic-Tac-Toe",
        "GAME_CHESS": "Schach",
        "GAME_RISK": "Risiko"
    }
    """
    
    
    # localizations need to be loaded before the commands are defined
    bot.i18n.load(f"{os.path.dirname(__file__)}/locale/")
    
    
    @bot.slash_command()
    async def highscore(
        inter: disnake.CommandInteraction,
        user: disnake.User,
        game: str,
        interval: str = commands.Param(
            choices=[
                OptionChoice(Localized("Last Day", key="CHOICE_DAY"), "day"),
                OptionChoice(Localized("Last Week", key="CHOICE_WEEK"), "week"),
                OptionChoice(Localized("Last Month", key="CHOICE_MONTH"), "month"),
            ]
        ),
    ):
        """Shows the highscore of the selected user within the specified interval.
        {{ HIGHSCORE_COMMAND }}
    
        Parameters
        ----------
        user: The user to show data for. {{ HIGHSCORE_USER }}
        game: Which game to check scores in. {{ HIGHSCORE_GAME }}
        interval: The time interval to use. {{ HIGHSCORE_RANGE }}
        """
        db: Any = ...  # a placeholder for an actual database connection
        data = await db.highscores.find(user=user.id, game=game).filter(interval).max()
        await inter.send(f"max: {data}")
    
    
    @highscore.autocomplete("game")
    async def game_autocomp(inter: disnake.CommandInteraction, string: str):
        # this clearly isn't great autocompletion as it autocompletes based on the English name,
        # but for the purposes of this example it'll do
        games = ("Tic-tac-toe", "Chess", "Risk")
        return [
            Localized(game, key=f"GAME_{game.upper()}")
            for game in games
            if string.lower() in game.lower()
        ]
    Ответ написан
    Комментировать
  • Шаблонизаторы Python?

    fenrir1121
    @fenrir1121
    Начни с документации
    Если не считать Django Templates на ум приходит только Mako.

    P.S. меня тоже интересует вопрос какой смысл скрывается за асинхронными шаблонизаторами и в чем проблема Jinja2
    Ответ написан
    Комментировать
  • Как избавиться от ошибки " 'Button' object has no attribute 'guild' "?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Передать аргументы в правильном порядке
    async def open_ticket(self, interaction: discord.Interaction, button: discord.ui.Button):
        ...
    Ответ написан
    1 комментарий
  • Как изменить отправленное Embed сообщение через бота на disnake?

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

    С эмбедом можно работать через его методы, а можно работать с обычным словарем через методы Embed.to_dict и Embed.from_dict. Структура у него простая и подробно описана в офф документации.

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

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

    Как можно получить того, кто выгнал пользователя из голосового канала?
    Никак.
    Ответ написан
    Комментировать
  • Как "зафиксировать" список в питоне?

    fenrir1121
    @fenrir1121
    Начни с документации
    Вернуться к изучению основ, разобраться как работают изменяемые объекты, что такое передача по ссылке и по значению, формулировать какую вообще задачу вы решаете подобным кодом.

    Сейчас вы ссылаетесь на один и тот же объект 3 раза, вместо создания нового объекта.
    Исправляется созданием плоской копии списка.
    lst = []
    l = []
    for i in range(3):
        l.append(i)
        lst.append(l[:])
    print(lst)
    Ответ написан
    Комментировать
  • Как обновить конфигурацию оконного менеджера без ребута?

    fenrir1121
    @fenrir1121
    Начни с документации
    Да, я пытался искать его в sxhkdrc хоткеях и в ридмишках софта, но там его нет.

    Потому что для ребута нужно его просто убить.
    Достаточно использовать команды в терминале, не обязательно хоткеи.
    # make sxhkd reload:
    super + Escape
    	pkill -USR1 -x sxhkd
    
    # quit/restart bspwm
    super + shift + {Escape}
    	bspc {quit}
    Ответ написан
    Комментировать
  • Как поменять формат времени в сообщении discord бота?

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

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

    В общем виде не нужно никакую информацию по правам хранить в БД. Стандартные правила создания команд подразумевают, что человек применяющий команду должен иметь права, которые требуются для использования действия исполняемого ботом: если хочешь выгнать участника командой для этой команды должна стоять проверка соответствующих прав у вызывающего участника. Для всего этого есть соответствующие декораторы, которые вешаются на команду. Изучите все что есть в checks, вроде checks.has_permissions()

    Когда же речь заходит о каких-то тонких настройках(например действие команды только в отдельном канале отдельной ролью) для этого прямо в дискорде есть раздел Настройки - Интеграция - Нужный бот, который позволяет эти настройки делать на уровне сервера, а не вносить их в код. Это удобнее и бот не будет прибит костыльными гвоздями к одному серверу.
    Ответ написан
  • Где возможно посмотреть количество Telegram звёзд которые получены от продаж в боте?

    fenrir1121
    @fenrir1121
    Начни с документации
    • Вкладка «Монетизация» доступна в разделе статистики канала только в том случае, если хотя бы половина подписчиков канала имеет телефонные номера, выданные не в России, Украине, Палестине, Израиле или Германии, а общее число подписчиков канала превышает 1000. Местонахождение владельца канала и номер телефона его аккаунта никак не влияют на отображение вкладки «Монетизация».


    Источник kod.ru
    Ответ написан
  • Нужен ли Docker Desktop для работы с Docker из под Windows + WSL2 (Ubuntu)?

    fenrir1121
    @fenrir1121
    Начни с документации
    Нет не нужен, это просто самый простой способ получить докер в винде.
    Инструкции есть на learn.microsoft.com#configure-docker-daemon
    Ответ написан
    Комментировать
  • Зачем вообще нужна библиотека python turtle в реальной практике?

    fenrir1121
    @fenrir1121
    Начни с документации
    Это дань языку Logo для обучения детей программированию. Собственно сейчас назначение такое же.
    Ответ написан
    Комментировать
  • Как сделать систему напоминаний с защитой от флуда этих самых напоминаний в discord.py (disnake)?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Всем привет, перепробовал несколько вариантов, но показать их не могу.
    У нас есть несколько вариантов ответа, но показать их не можем.

    Использую ивент on_message
    Не использовать on_message. Даже из его названия очевидно, что он работает на каждое сообщение.

    Переписать всю логику на команду, вместо чтения всех сообщений, обрабатывать только их.
    Ответ написан
  • Как сделать оповещение об отключении бота если он на хостинге?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    С текущими вводными разве что идти от обратного: постоянно слать пинг вроде "я живой". Если пинга нет, значит отключен.
    Для полноценных оповещений, как верно отметил Shandy вам нужен второй сервер, который будет заниматься мониторингом первого, в связи с чем вопрос, а зачем вам это нужно? Примерно любой хостинг дает аптайм в 99+%, что за волшебный хостинг, который отключает сервер.
    Ответ написан
    2 комментария
  • Как вывести рандомный баннер?

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

    Чтобы получить баннер нужно взять случайного пользователя и проверить наличие Member.banner, повторять пока не найдется.

    Обновить баннер сервера можно через Guild.edit

    @tasks.loop(hours=2)
    async def change_banner():
       user_with_banner = await find_user()  # реализовать самому
       guild = await get_guild()  # реализовать самому
       await guild.edit(banner=user_with_banner.banner)
    Ответ написан
    Комментировать
  • Есть ли кроссплатформенное решение для ассоциации кастомной схемы URI со своим приложением?

    fenrir1121
    @fenrir1121
    Начни с документации
    На питоне не видел, но случайно сталкивался с решением на расте. В src лежит 3 файла с понятной логикой для каждой системы, вероятно получится переписать под себя или использовать через PyO3
    Ответ написан
    Комментировать
  • Можно ли подключить ноутбучную клавиатуру к обычному USB 1.0/2.0?

    fenrir1121
    @fenrir1121
    Начни с документации
    Таких ноутбучных клавиатур никто не делает. Разве что вы вытащите всю начинку из какого-то конкретного ноута и запихнете в деревянный корпус.
    Ответ написан
    Комментировать
  • Как использовать Tracemalloc для оптимизации использования памяти?

    fenrir1121
    @fenrir1121
    Начни с документации
    Как использовать Tracemalloc для оптимизации использования памяти?

    А в чем причина такого подхода к решению проблемы?

    Если растёт потребление памяти, значит вы ее не освобождаете. Да питон это делает за вас, но думать об этом все равно нужно потому что для очистки ему требуется чтобы на объект никто не ссылался.

    Берёте любой профилировщик, например memray и ищите где проблема в вашем коде.
    Ответ написан
  • Как подружить команду mute и unmute?

    fenrir1121
    @fenrir1121 Куратор тега discord.py
    Начни с документации
    Как подружить команду mute и unmute?
    Mute и Unmute дружите. Годится?

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

    Для начала разберемся в терминологии дискорда. То что вы делаете называется таймаутом пользователя, мут в отличии от таймаута автоматически не снимается. В данном случае это важно потому что вероятно вы все 16 часов гуглили не то.
    Таймаут не требуется хранить и отслеживать - специально для этого у объекта пользователя есть атрибут Member.timed_out_until, там будет None если таймаута нет или datetime его истечения.

    Далее. Если пытаетесь что-то хранить используйте для этого базу данных, а не словари. Первое же отключение бота приведет безвозвратной потере данных в ваших словарях и никакая дружба вам не поможет.

    И перейдите уже на слеш-команды. 80% кода состоит из валидации полей, вам там ок игнорировать последние 2 года развития библиотек?
    Ответ написан