在没有上下文的情况下向当前频道发送消息? | discord.py重写

Send a message to current channel without context? | discord.py rewrite

我已经开始为我的机器人设置一个升级系统,并且一直在努力尝试实现一个关于升级的消息。但是,因为我正在创建的函数不是命令,所以我认为我无法将上下文传递给它,这会导致问题。

由于缺乏更好的解决方案,我将它放入我的函数中,该函数检查 exp 并与级别匹配 - 发生的是复制用户级别,然后与更新的级别进行比较以查看是否发生了升级。这行得通,但是我唯一的问题是无法发送 "level-up" 消息。

async def levelcheck(user):
    global userlvl
    global userlvlc

    channel = discord.Object(id="")
    # copying the userlevel BEFORE update
    try:
        userlvlc = userlvl
    except NameError as e:
        print(e)

    with open('userexp.json', 'r') as fp:
        userexp = json.load(fp)

    # finding out level based on exp 
    for x in range(0,len(levelcaps)):
        if userexp[str(user)] <= levelcaps[x]:
            userlvl = x
            try:
                if userlvlc < userlvl:
                    await ctx.send('You levelled up --> {}'.format(userlvl))
            except NameError as e:
                print(e)
            #
            return userlvl

您可以清楚地看到,这不是一个漂亮的命令,但确实有效。我开始尝试获取频道 ID,却意识到我不知道如何获取当前频道的上下文。有没有办法在没有上下文的情况下向当前频道发送消息,还是我需要重新考虑我的方法?

看到你有一个用户 ID,我会提出这个解决方案。

user_to_level_up = bot.fetch_user(user) # since your user variable is an ID
dm_channel = user_to_level_up.dm_channel
if dm_channel is None:
    await user_to_level_up.create_dm()
    dm_channel = user_to_level_up.dm_channel
await dm_channel.send("You've leveled up! You are now level {}".format(userlvl))

注意:这是未经测试的,但链接应提供使其有效的信息!

这只是向他们发送个人消息,而不是 post 在服务器中发送。对于服务器中的 post,您似乎需要交叉引用用户所在的服务器,机器人也在其中,这对我来说听起来工作量太大 XD