升级到4.17.9后调用ctx.broadcast报错,请求帮助


cron中调用和指令.action()中调用都会报错,看了看好像没人提到,是只有我这里有问题吗?_(:3」∠)_

2 个赞

你好我在开发新插件遇到了一样的问题,请问这边解决了吗

1 个赞

没有解决,好像是获取已登记频道列表出了问题

1 个赞

我这边是使用bot.sendMessage函数临时解决了,等官方更新版本修复ctx.broadcast再换回去。
以下是我使用这个函数的包装函数块

async function sendMessageToChannel(ctx, guild, broadMessage) {
    const targetChannels = await ctx.database.get("channel", { id: guild.guildId, platform: guild.platform });

    if (targetChannels.length === 1) {
        const bot = ctx.bots.find((bot) => bot.userId === targetChannels[0].assignee);
        if (bot) {
            await bot.sendMessage(guild.guildId, broadMessage);
        } else {
            throw new Error("指定的bot未找到。");
        }
    } else if (targetChannels.length > 1) {
        throw new Error("有复数个bot存在于该群组/频道,请移除多余bot。");
    } else {
        throw new Error("未找到目标群组/频道。");
    }
}

因为不太了解具体机制,所以做了比较多的保险措施,好像频道代理人bot本身就是唯一的?不过是临时方案也就先这样写了_(:3」∠)_
代码具体逻辑为:

  1. 从channel表查询发送目标频道存为targetChannels
  2. 确保目标唯一
  3. 使用bots.find查找目标频道对应的代理人bot并调用sendMessage

以上是我的临时解决方案,低技术力仅供参考,欢迎看不下去的大佬指正优化_(:3」∠)_

3 个赞

测试发现 中间有点类型错误 可能是因为某些平台的guildId什么的都是数字不是字符串 用的时候发现的
第一个是… bot.userId === targetChannels[0] …
应该为 … bot.selfId === String(targetChannels[0].assignee) …(后面的修正不知道为什么强制类型转换没成功 待定一下)

第二个是sendMessage(guild.guildId, …
应该为 sendMessage(String(guild.guildId), …

↑仅仅是我的情况,可能对某些平台的用户不起作用,这样的话guild里面的id就可以填数字了

1 个赞