繁体   English   中英

我想动态更改 discord 机器人状态

[英]I want to change the discord bot status dynamically

这是我使用的代码

async def on_ready():
    print(f'bots up')
    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name='.help'))

就像状态每分钟都会改变一样,我尝试过,但它不允许我使用其他命令,我输入了这段代码,但它会给出一个错误,说我不能将消息参数放入on_ready()

await bot.process_commands(message)

要定期更改机器人的存在,您可以使用discord.ext.tasks.Loop 一个基本的蓝图可能看起来像这样:

import discord
from discord.ext import commands
from discord.ext import tasks

bot = commands.Bot('.')

@tasks.loop(seconds=30)
async def switch_presence():
    # list of all activities to switch between
    activities = [
        discord.Activity(type=discord.ActivityType.listening, name='First activity'),
        discord.Activity(type=discord.ActivityType.listening, name='Another activity')
    ]
    curr_activity = bot.activity
    # default to the first activity if not set or invalid
    if curr_activity not in activities:
        await bot.change_presence(activity=activities[0])
        return
    # use modulo to start from the beginning once the list is exhausted
    next_activity_index = (activities.index(curr_activity) + 1) % len(activities)
    await bot.change_presence(activity=activities[next_activity_index])

@bot.event
async def on_ready():
    switch_presence.start()

通过一些修改,您也可以将其放入 Cog 中。 这将允许您保留一个 static 活动列表,而不是动态创建它(只需在 Cog 的__init__中创建它并将其存储为 class 变量),还可以集中存储下一个活动的索引,无需每次都计算它调用循环的时间

这就是我改变机器人存在的方式

async def status_task():
while True:
    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.listening, name=f"listining status"))
    await asyncio.sleep(10)# 10 as in 10seconds
    await bot.change_presence(activity=discord.Game(name="playing status"))
    await asyncio.sleep(10)
    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.competing, name=f"competing status"))
    await asyncio.sleep(10)
    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.streaming, name=f"streaming status"))
    await asyncio.sleep(10)

然后 on_ready

@bot.event
async def on_ready():
    print(f"bots up")
    bot.loop.create_task(status_task())

希望这对您有用,(对于 status_task)将每个之间的 10 秒更改为 60 秒,然后每分钟都会更改

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM