@divi1

Как сделать чтобы сообщения отправлялись спустя определённое время?

В общем я далек от программирования но вдруг мне в голову взбрело сделать бота который будет отправлять сообщения в дискорд канал. Я немного пошарил и смог написать что то. В целом всё работает, но проблема в том что у команд кулдаун разный. Например команда p!work должна вводиться раз в 30 секунд а команда p!trivia hard раз в десять минут. Таким образом когда я запускаю скрипт получается ненужный флуд. Прежде чем писать сюда я полазил в инете но ничего путного у меня не получилось так что надеюсь что вы мне поможете)

Код:

import discord
from discord.ext import commands
import time 
import asyncio

client = commands.Bot( command_prefix = "**1")
@client.event
async def on_ready():  
    print(f"thread 1 is working")
    channel = client.get_channel(#channelid)
    import time 
    while True:
        message = await channel.send('p!hilo')
        await asyncio.sleep(2)
        await message.delete()
        message1 = await channel.send('p!work')
        await asyncio.sleep(2)
        await message1.delete()
        pass 
        time.sleep(3)    
        message2 = await channel.send('h')
        await asyncio.sleep(2)
        await message2.delete()
        pass
        time.sleep(3)
        message3 = await channel.send('p!trivia hard')
        await asyncio.sleep(2)
        await message3.delete()
        pass  
        time.sleep(3)
        message4 = await channel.send('2')
        await asyncio.sleep(2)
        await message4.delete()
        pass
        time.sleep(3)
        message5 = await channel.send('p!dep all')
        await asyncio.sleep(2)
        await message5.delete()
        time.sleep(22)
        pass







   

   
client.run("#token", bot = False)
  • Вопрос задан
  • 466 просмотров
Решения вопроса 1
1. Не используйте time.sleep в асинхронном коде: https://discordpy.readthedocs.io/en/stable/faq.htm...
2. Используйте asyncio.Task'и для множества циклов в фоне.
2.1. discord.py имеет расширение для упрощения использования asyncio.Task'ов в контексте дискорда:
https://discordpy.readthedocs.io/en/stable/ext/tas...

from asyncio import sleep
from discord.ext import tasks

...

@tasks.loop(seconds=30)
async def call_work(channel):
    await channel.send("p!work")

@tasks.loop(minutes=10)
async def call_trivia(channel):
    await channel.send("p!trivia hard")

@client.event
async def on_ready():
    print("We are ready after socket connect")
    command_tasks = [call_work, call_trivia]
    for task in command_tasks: 
        if not task.is_running():  # on_ready может запускаться более чем один раз https://discordpy.readthedocs.io/en/stable/api.html#discord.on_ready
            print(f"Starting task {task.__name__}")
            task.start(client.get_channel(CHANNEL_ID))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
jerwright
@jerwright
while True: coding()
Вы делали всё правильно, но вместо цифры для time.sleep (2) попробуйте ввести 30 (для 1 случая) и 600 (10 минут) для 2 случая.
Ответ написан
Ваш ответ на вопрос

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

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