Как разрешить боту публиковать / отправлять сообщения каждые 5 минут или из-за другого события? - PullRequest
2 голосов
/ 28 мая 2020

Я думал, что это будет простая задача, но каким-то образом я могу даже это испортить. Поэтому я просто хочу, чтобы мой бот отправлял сообщение (чтобы троллить моих друзей) с конкретным c сообщением каждые 5 минут. Итак, я нашел то, что не работает, или какой-либо другой код. Я даже не получаю сообщения об ошибке. Так что я в значительной степени невежественный, что отстой.

import discord
import asyncio

client = discord.Client()

async def my_background_task():
    await client.wait_until_ready()
    counter = 0
    channel = discord.Object(id='channel_id_here')
    while not client.is_closed:
        counter += 1
        await client.send_message(channel, counter)
        await asyncio.sleep(60) # task runs every 60 seconds

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

client.loop.create_task(my_background_task())
client.run('token')

В любом случае, вот мой сводный код без всех команд бота.

import discord
from discord.ext.commands import Bot, has_permissions

import secrets
import numpy as np
import re

TOKEN = 'mytokenasastring'
BOT = Bot(command_prefix='!')
#... some commands for my bot for my friends and myself
BOT.loop.create_task(my_background_task())
BOT.run(TOKEN)

Итак, я просто добавил приведенный выше код, например,

async def my_background_task():
await BOT.wait_until_ready()
counter = 0
channel = discord.Object(id='mytestchannelidasastring') #i also tried as int but also doenst work
while not BOT.is_closed:
    counter += 1
    await BOT.send_message(channel, counter)
    await asyncio.sleep(60) # task runs every 60 seconds

тогда vs code сообщает, что у моего бота есть метод send_message. поэтому я меняю код send_message на этот

await channel.send(counter)

Но теперь я получаю VS-код формы предупреждения / ошибки, что канал не имеет метода отправки, поэтому я получаю (настоящий ?!) канал, подобный этому

BOT.get_channel(id='mychannelidasstring')

и он по-прежнему не работает, или я не получаю никаких сообщений об ошибках ... пожалуйста, помогите, или я go злюсь ....

Ответы [ 2 ]

3 голосов
/ 28 мая 2020

Попробуйте использовать discord.tasks.loop.

from discord.ext import tasks

counter = 0

@tasks.loop(minutes=1.0, count=None)
async def my_background_task():
    global counter
    channel = BOT.get_channel(123456789) # channel id as an int
    counter += 1
    await channel.send(f'{counter}')
my_background_task.start()

в l oop вашу функцию троллинга каждую минуту.

1 голос
/ 28 мая 2020

Похоже, вы используете некоторые из старых документов / руководств asyn c (v0.16.x), которые можно увидеть из send_message() и записываете идентификаторы в виде строк. Я бы порекомендовал вам попытаться найти более свежие руководства и вместо этого прочитать последние документы.

См. здесь для всех основных изменений с тех пор в самую последнюю версию, перепишите (v1.x )

Что касается вашего кода, вот как он должен выглядеть:

async def my_background_task():
    await client.wait_until_ready() # ensures cache is loaded
    counter = 0
    channel = client.get_channel(id=112233445566778899) # replace with target channel id
    while not client.is_closed():
        counter += 1
        await channel.send(counter)
        await asyncio.sleep(60) # or 300 if you wish for it to be 5 minutes

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')
    client.loop.create_task(my_background_task()) # best to put it in here

client.run("token")

Ссылки:

...