как импортировать объект Discord Bot для использования в другом модуле - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь уменьшить количество строк в главном файле моего диска-диска, поэтому я создал модуль для обработки определенных команд, проблема в том, что мне нужно передать объект бота каждой функции за пределами основного файла вмодуль, это увеличивает количество переменных, которые я передаю каждой функции, и это становится действительно запутанным.

В приведенном ниже примере KsBot.py - это мой основной файл бота, а BasicCommand.py - это место, где я пишу свои простые команды и импортирую его в KsBot.py для использования, KsBot - это объект бота

В 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, поэтому мне не нужнопередать объект бота в каждую функцию, я попытался импортировать сам объект бота в BasicCommand.py, добавив его в начало кода:

from KsBot import KsBot

Но это выдает ошибку, говорящую:

ImportError: невозможно импортировать имя 'KsBot'

Может кто-нибудь объяснить мне, почему происходит эта ошибка и есть ли способ передать этот объект бота.Я новичок в программировании и discord.py, поэтому любые альтернативные предложения также приветствуются, спасибо: D

1 Ответ

0 голосов
/ 12 мая 2018

Хороший бот 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): во втором файле. Оба являются допустимыми методами, но последний лучше всего работает с Cogs.

Следующий пример относится к первому способу:

# 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, в приведенных выше примерах не требуется иметь дескриптор события.

Примечание: для соглашения имена файлов должны быть в нижнем регистре.

...