【问题标题】:Unable to run Discord bot command in Heroku无法在 Heroku 中运行 Discord bot 命令
【发布时间】:2021-10-14 12:28:29
【问题描述】:

我一直在制作一个不和谐的机器人来托管在 Heroku 上:

目录的一般形式是:

bot
   cogs
       fun.py
   main.py

main.py 在哪里(代码简化):


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 是(代码简化):

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

但是当我尝试运行类似“!hello”的命令时,什么都不会发生(无论是在 discord 频道还是在应用程序日志中)。

如果有人可以向我解释为什么 Heroku 上的不和谐命令在本地运行时不起作用,我将非常感激 :)

【问题讨论】:

  • 您使用的是 Heroku CLI 还是 Github 集成?

标签: python heroku discord discord.py


【解决方案1】:

一个潜在的解决方案是使用正确的方式给你的机器人一个前缀:

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

而在 Cogs 中,commandslisteners

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

我对heroku不太熟悉,但我知道

是的,我知道你说它在本地工作,所以这让你的问题更加令人费解,但这里有一些你可以尝试的东西

【讨论】:

    猜你喜欢
    • 2019-06-08
    • 2018-08-15
    • 2022-07-12
    • 2021-04-16
    • 2023-01-22
    • 2021-11-10
    • 2020-05-28
    • 2020-05-13
    • 2018-03-04
    相关资源
    最近更新 更多