如何导入discord bot对象以便在其他模块中使用

时间:2018-05-11 19:31:29

标签: python python-3.x python-import discord discord.py

我正在尝试减少我的discord bot的主文件中的行数,所以我创建了一个模块来处理某些命令,问题是我必须将bot对象传递给主文件外的每个函数模块,这增加了我传递给每个函数的变量的数量,并且它变得非常混乱。

在下面的示例中,KsBot.py是我的主要bot文件,BasicCommand.py是我编写简单命令并将其导入KsBot.py使用的地方,KsBot是bot对象

在KsBot.py中:

if message.content.startswith("//ping"):
    await BasicCommand.ping(KsBot,message.channel)

在BasicCommand.py中:

async def ping(bot,channel):
    KsBot = bot
    await KsBot.send_message(channel,"pong")

我想在BasicCommand.py中添加一个变量来表示KsBot,所以我不必在每个函数中传入bot对象,我尝试将bot对象本身导入BasicCommand.py中,方法是将其添加到代码的顶部:

from KsBot import KsBot

但它给我一个错误说:

  

ImportError:无法导入名称“KsBot”

有人可以向我解释为什么会发生此错误,以及是否有任何方法可以传递此bot对象。我是编程和discord.py的新手,所以任何其他建议也值得赞赏,谢谢:D

1 个答案:

答案 0 :(得分:0)

一个好的discord.py机器人不会手动调用on_message中的所有命令,您应该使用@bot.command(pass_context=True)添加命令。

摆脱def on_message(...):,因为你没有在那里做任何有意义的事情。

一个文件中的粗糙结构(不分割):

from discord.ext import commands

bot = commands.Bot('//')

@bot.command(pass_context=True)
async def ping(ctx):
    channel = ctx.message.channel
    await bot.send_message(channel, "pong")

bot.run("TOKEN")

这很容易!

现在,多个分割成多个文件,最简单的方法是定义自己的builtins.bot。或者,您可以在第二个文件中查看bot.load_extension("filename") def setup(bot):。两者都是有效的方法,但后者最适合使用齿轮。

以下示例适用于第一种方法:

# ksbot.py
from discord.ext import commands
import builtins

bot = commands.Bot('//')
builtins.bot = bot

import basiccommand

@bot.command(pass_context=True)
async def ping(ctx):
    channel = ctx.message.channel
    await bot.send_message(channel, "pong")

bot.run("TOKEN")


# basiccommand.py

from discord.ext import commands
from builtins import bot

@bot.command(pass_context=True)
async def hello(ctx):
    channel = ctx.message.channel
    await bot.send_message(channel, "hi")

现在你有两个命令ping,发送" pong"和hello,发送" hi"。

如果必须添加on_message句柄,请务必在bot.process_commands(message)末尾添加on_message,上述示例并不要求您有事件处理。

附注:对于惯例,文件名应该是小写的。