Discord Python Script - Проблемы с расписанием ежедневной публикации на подключенных серверах - PullRequest
1 голос
/ 12 апреля 2020

Компьютер: MacOS w / Python 3.7 и установленный пакет Discord

Сервер: CentOS 6 с Python 3.6 и установленным пакетом Discord

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

class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))
        print(self.user.id)
        print('------')
        # loops through connected servers and assigns increments server count variable
        server_count = 0
        quote_count = 0
        for guild in client.guilds:
            server_count += 1
        print("The server count is {}".format(server_count))
        for quote in quotes:
            quote_count += 1
        print("There number of quotes available is: " + str(quote_count))
        print('------')
        while not client.is_closed():
            now = datetime.strftime(datetime.now(), '%H:%M')
            iter_count = 0
            print("current time is: " + now)
            if now == wakeup_time:  # enter for-loop at specific time
                for guild in client.guilds:
                    for channel in guild.channels:
                        if str(channel) == 'chat':
                            await channel.send('Good Morning/Afternoon/Good Night. Here is today\'s random quote:')
                            await channel.send('```' + str(random.choice(quotes)).strip('[]') + '```')
                            print("{} Server Greeted.").format(guild.name)
                            iter_count += 1
                            if iter_count == server_count:
                                await asyncio.sleep(7200)  # puts loop on hold for 1 hour
            else:
                await asyncio.sleep(10)

То, что он делает локально: Однократная публикация на канал #chat на каждом сервере разногласий, а затем отключение функции в течение 2 часов , Бот подключен к четырем дисконтным серверам. (это то, что я хочу, чтобы он делал).

Что он делает на сервере CentOS Linux: отправка на канал #chat только одного из серверов 5 раз, а затем Отключение функции в течение двух часов.

Вопрос: есть ли лучший способ оптимизировать код до l oop через серверы и публиковать сообщения в каналах чата один раз в утро?

1 Ответ

2 голосов
/ 13 апреля 2020

Лично я бы использовал фоновое задание для этого. Также вместо использования guild.channels используйте guild.text_channels. Я сделал несколько изменений в коде, надеюсь, это поможет.

class MyClient(discord.Client):
    async def start_task(self):
        while not client.is_closed():
            now = datetime.strftime(datetime.now(), '%H:%M')
            iter_count = 0
            print("current time is: " + now)
            if now == wakeup_time:  # enter for-loop at specific time
                for guild in client.guilds:
                    for channel in guild.text_channels:
                        if channel.name == 'chat':
                            await channel.send('Good Morning/Afternoon/Good Night. Here is today\'s random quote:')
                            await channel.send('```' + str(random.choice(quotes)).strip('[]') + '```')
                            print("{} Server Greeted.").format(guild.name)
                            iter_count += 1
                            if iter_count == server_count:
                                await asyncio.sleep(7200)  # puts loop on hold for 1 hour
                            break
            else:
                await asyncio.sleep(10)

    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))
        print(self.user.id)
        print('------')
        # loops through connected servers and assigns increments server count variable
        quote_count = 0
        print("The server count is {}".format(len(client.guilds)))
        for quote in quotes:
            quote_count += 1
        print("There number of quotes available is: " + str(quote_count))
        client.loop.create_task(start_task())
...