Ответы пользователя по тегу Боты
  • Как сделать систему ачивок с картинками, авто выдача роли и мини игры как "Угадай число" у бота дискорд Python?

    FAbrickA
    @FAbrickA
    Программист
    Лично я реализовывал всё это через ввод в чат определённых команд. Это можно сделать так. Допустим, вы пишете в чат определённую команду, например "/start-game". Бот это считывает и выполняет вашу функцию по самой игре.
    Статистику можно хранить при помощи стандартной библиотеки sqlite3, и при достижении определённых параметров выдавать ачивку.
    Картинки можно отправлять вот так:

    image = Image.open('your\\path\\to\\image.jpg') # открытие картинки
    with io.BytesIO() as image_binary:
        # перевод картинки в байтовый формат
        image.save(image_binary, format="JPEG", quality=95) 
        image_binary.seek(0)
        # отправка картинки
        await channel.send(file=discord.File(fp=image_binary, filename="image.jpeg"))

    Здесь используется PIL.Image для открытия картинок и работы с ними, а так же io.BytesIO для перевода картинки в байтовый формат для отправки изображения в сообщении.
    Для понимания работы ролей советую посмотреть этот видеоролик: https://youtu.be/87_3zcv8q5I
    И напоследок скажу, что нужно привыкать читать документацию - без этого никуда. Документация по discord.py: https://discordpy.readthedocs.io/en/latest/api.html
    Ответ написан
    1 комментарий
  • Как отправить сообщение для отдельного пользователя через определенный промежуток времени?

    FAbrickA
    @FAbrickA
    Программист
    Самым простым способом будет реализовать всё это через threading и time.sleep()
    Здесь создаётся 2 потока, которые отправляют сообщения, а потом уходят в сон на 24 часа

    import datetime as dt
    from threading import Thread
    from time import sleep
    
    
    class SendThread(Thread):
        def __init__(self, hours: int):
            Thread.__init__(self)
            self.hours = hours
    
        def run(self):
            # Здесь код, который будет выполняться в потоке
            day_to_seconds = 24 * 60 * 60
            now = dt.datetime.now()
            today_time = now - dt.datetime(year=now.year, month=now.month, day=now.day)
            seconds = today_time / dt.timedelta(seconds=1)
            time_to_next_call = self.hours * 60 * 60 - seconds  # Время в секундах до первого вызова
            if time_to_next_call < 0:
                time_to_next_call += day_to_seconds
            sleep(time_to_next_call)
    
            while True:
                #  Ваш код (отправка сообщения)
                # ...
    
                sleep(day_to_seconds)
    
    
    # Ваш код...
    
    if command == "/start":
        send_12 = SendThread(hours=12)  # сообщение #1
        send_18 = SendThread(hours=18)  # сообщение #2
    
        send_12.start()
        send_18.start()
    Ответ написан
    8 комментариев