Если бы я хотел использовать discord.py «on message» для создания команд выключения и перезапуска, как бы я это сделал? - PullRequest
0 голосов
/ 05 февраля 2019

Мой Discord Bot запускает discord.py, используя функцию on_message.Если бы я хотел использовать это, чтобы создать команду, которая будет завершать работу, и другую, чтобы перезапустить мой Discord Bot, как бы я это сделал?

Я запускаю бот с хоста сервера на repl.it.Ниже я привожу некоторый код, чтобы вы могли понять, что я имею в виду под on_message:

  if message.content.upper().startswith("!SHUTDOWN"):
    if "534116283487223809" in [role.id for role in message.author.roles]:
      await client.send_message(message.channel, "*Shutting Down...*")
      time.sleep(0.5)
      #SCRIPT TO SHUTDOWN HERE

В идеале команды должны работать как !shutdown и !restart и должны использоваться только мной.

Заранее спасибо, H

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вы можете поместить свой код в цикл while и использовать client.logout(), чтобы закрыть соединение Discord.Команда !restart будет использовать только client.logout() без прерывания цикла while, а !shutdown также будет использовать client.logout(), но вызовет break для отмены цикла while.

Вы можете создать команды, чтобы справиться с этим, вместо того, чтобы иметь все в событии on_message, которое будет загромождено.

from discord.ext import commands

while True:
    client = commands.Bot(command_prefix='!')

    @client.command(pass_context=True)
    async def restart(ctx):
        if "534116283487223809" in [role.id for role in ctx.message.author.roles]:
            await client.logout()

    @client.command(pass_context=True)
    async def shutdown(ctx):
        if "534116283487223809" in [role.id for role in ctx.message.author.roles]:
            await client.logout()
            break

    @client.event
    async def on_message(message)
        # do previous on_message stuff here
        await client.process_commands(message) # add at bottom to allow commands to work

    client.run('token')
0 голосов
/ 05 февраля 2019

Чтобы выйти из скрипта, вы должны позвонить sys.exit([arg]).Чтобы перезапустить скрипт, взгляните на os.exec*().

Например:

if message.content.upper().startswith("!SHUTDOWN"):
  if "534116283487223809" in [role.id for role in message.author.roles]:
    await client.send_message(message.channel, "*Shutting Down...*")
    time.sleep(0.5)
    os.exit(0) # the exit code, 0, means it exited successfully
if message.content.upper().startswith("!RESTART"):
  if "534116283487223809" in [role.id for role in message.author.roles]:
    await client.send_message(message.channel, "*Restarting...*")
    time.sleep(0.5)
    python = sys.executable
    os.execl(python, python, *sys.argv)
...