#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
Я не слишком хорошо знаком с героку и чем-то еще, но я знаю это
И да, я знаю, вы сказали, что это сработало локально, так что это делает ваш вопрос еще более загадочным, но, тем не менее, вот кое-что, что вы можете попробовать