Не удалось запустить команду Discord bot в Heroku

#python #heroku #discord #discord.py

Вопрос:

Я делал бота discord для размещения на Heroku:

Общая форма справочника такова:

 bot
   cogs
       fun.py
   main.py
 

Где main.py is (упрощенный код):

 
from discord import Embed, File
from discord.ext.commands import Bot as BotBase
from datetime import datetime
from asyncio import sleep
import os

PREFIX = "!"

OWNER_IDS = [<IDS>]
BOT_CHANNEL = <CHANNEL> #hidden for privacy purposes
GUILD_ID = <ID> #hidden for privacy purposes

COGS = [file[:-3] for file in os.listdir("bot/cogs") if file.endswith('.py')]

TOKEN = os.getenv("DISCORD_TOKEN")

class Ready(object):
    def __init__(self):
        for cog in COGS:
            setattr(self, cog, False)

    def ready_up(self, cog):
        setattr(self, cog, True)
        print(f"{cog} cog ready")

    def all_ready(self):
        return all([getattr(self, cog) for cog in COGS])

class Bot(BotBase):
    def __init__(self):
        self.PREFIX = PREFIX
        self.ready = False
        self.cogs_ready = Ready()
        self.guild = None

        super().__init__(command_prefix=PREFIX, owner_ids=OWNER_IDS)

    def setup(self):
        for cog in COGS:
            self.load_extension(f"bot.cogs.{cog}")
            print(f" {cog} cog loaded")

        print("Setup complete")

    def run(self):

        print("Running setup...")
        self.setup()

        self.TOKEN = TOKEN

        print("Running bot...")
        super().run(self.TOKEN, reconnect=True)

    async def on_connect(self):
        print("Bot connected")

    async def on_disconnect(self):
        print("Bot disconnected")

    async def on_error(self, err, *args, **kwargs):
        if err == "on_command_error":
            await args[0].send("Something went wrong")

        await self.stdout.send("An error occured.")
        raise

    async def on_command_error(self, ctx, exc):
        if isinstance(exc, CommandNotFound):
            pass
        else:
            raise exc.original

    async def on_ready(self):
        if not self.ready:

            self.guild = self.get_guild(GUILD_ID)
            self.stdout = self.get_channel(BOT_CHANNEL)

            while not self.cogs_ready.all_ready():
                await sleep(0.5)

            self.ready = True
            print("Bot ready")

            await self.stdout.send("Now Online!")

        else:
            print("Bot reconnected")

    async def on_message(self, message):
        pass


bot = Bot()
bot.run()
 

И fun.py is (упрощенный код):

 from discord import Member
from discord.ext.commands import Cog
from discord.ext.commands import command

class Fun(Cog):
    def __init__(self, bot):
        self.bot = bot

    @command(name="hello", aliases=["hi", "Hello", "Hi"], hidden=False)
    async def say_hello(self, ctx):
        await ctx.send(f"Hello {ctx.author.mention}!")

    @Cog.listener()
    async def on_ready(self):
        if not self.bot.ready:
            self.bot.cogs_ready.ready_up("fun")
        #await self.bot.stdout.send("Fun cog ready")

def setup(bot):
    bot.add_cog(Fun(bot))

 

Когда я запустил код локально, он работал нормально.

Однако, когда я запустил его на Heroku (с небольшими изменениями, такими как наличие файла procfile, requirements.txt и т.д.), бот запустится

 2021-08-11T01:23:55.582108 00:00 heroku[worker.1]: State changed from starting to up
2021-08-11T01:23:58.388072 00:00 app[worker.1]: Running setup...
2021-08-11T01:23:58.390370 00:00 app[worker.1]: fun cog bot init
2021-08-11T01:23:58.390419 00:00 app[worker.1]:  fun cog loaded
2021-08-11T01:23:58.390428 00:00 app[worker.1]: Setup complete
2021-08-11T01:23:58.390440 00:00 app[worker.1]: Running bot...
2021-08-11T01:23:58.757181 00:00 app[worker.1]: Bot connected
2021-08-11T01:23:59.000000 00:00 app[api]: Build succeeded
2021-08-11T01:24:00.759729 00:00 app[worker.1]: fun cog ready
2021-08-11T01:24:01.260022 00:00 app[worker.1]: Bot ready

 

Но когда я попытался выполнить команду типа «!привет», ничего не произошло (ни в канале discord, ни в журнале приложений).

Если кто-нибудь может объяснить мне, почему команды discord на Heroku не будут работать при локальном запуске, я был бы чрезвычайно благодарен 🙂

Комментарии:

1. Используете ли вы интеграцию Heroku CLI или Github?

Ответ №1:

Потенциальным решением является использование правильного способа присвоения вашему боту префикса:

 bot = commands.Bot(command_prefix="!")
 

И что в винтиках commands и listeners находятся

 @commands.command()
async def hello(self, ctx):
#code here
 
 @commands.Cog.listener('on_ready')
async def randomtext(self):
#code here
 

Я не слишком хорошо знаком с героку и чем-то еще, но я знаю это

И да, я знаю, вы сказали, что это сработало локально, так что это делает ваш вопрос еще более загадочным, но, тем не менее, вот кое-что, что вы можете попробовать