Drincann / Mirai-js

运行在 Node.js、浏览器下,基于 mirai-api-http 的 QQ 机器人开发框架。
https://mirai-js-drincann.vercel.app
GNU Affero General Public License v3.0
252 stars 31 forks source link

添加sendForward #202

Closed semilt closed 2 years ago

semilt commented 2 years ago

尝试着实现了单独的Bot.sendForward 目前的用法是

bot.sendForward({
      friend: 'xxx',
      nodeList: new NodeList().addNodeListById(id).addNodeList({
          senderId: 'xxx',
          time: 1000,
          senderName: 'master',
          messageChain: new Message().addPlain('你好,我是bot1!')
      })
}).then(forwardId => {...});
vercel[bot] commented 2 years ago

This pull request is being automatically deployed with Vercel (learn more).
To see the status of your deployment, click below or on the icon next to each commit.

🔍 Inspect: https://vercel.com/drincann/mirai-js/4oURShgEngz5DSETpuSsZG52B99s
✅ Preview: Canceled

[Deployment for 902ee6b canceled]

Drincann commented 2 years ago

现在有一些问题需要解决。

  1. 不知道为什么,pre-commit hook 未成功运行 lint-staged,导致你提交的文件行尾换行是 LF,而不是 .eslintrc.json 中定义的 CRLF,能否在提交前额外运行一次 npm run lintnpx eslint --fix .

  2. 感觉关于 package.json 和 package-lock.json 的修改不适合出现在这次提交中,这个我在这次 PR 之后会检查一下。

麻烦在解决这些问题的基础上,不要添加新的 commit,因为尤其是行尾换行的问题可能造成一些不必要的麻烦。能否回退版本,在解决问题后 force push 到你的仓库。

Drincann commented 2 years ago

你可以不用 close 这个 pr,后续修改会自动同步到这里。

一会你可以 reopen。

semilt commented 2 years ago

额外运行了lint命令以及eslint命令后所有的js文件仍然是LF,我再看一下怎么处理 所有的ts文件都没有问题

semilt commented 2 years ago

@Drincann 我注意到我在原仓库直接fork出来的代码中dist/node下除index.js外的所有js文件的行尾全部都是LF?

Drincann commented 2 years ago

@Drincann 我注意到我在原仓库直接fork出来的代码中dist/node下除index.js外的所有js文件的行尾全部都是LF?

因为 .eslintignore 忽略了 dist 下的内容,构建的结果无所谓。

其中 dist/*.ts 是直接 copy 过去的,所以是 CRLF。另外,我这里 dist/node/index.js 也是 LF。

semilt commented 2 years ago

@Drincann 我注意到我在原仓库直接fork出来的代码中dist/node下除index.js外的所有js文件的行尾全部都是LF?

因为 .eslintignore 忽略了 dist 下的内容,构建的结果无所谓。

其中 dist/*.ts 是直接 copy 过去的,所以是 CRLF。另外,我这里 dist/node/index.js 也是 LF。

这样的话我还需要处理 dist 下的 js 文件全部为LF的问题吗?

Drincann commented 2 years ago

不需要,我特意在 .eslintignore 中忽略了 dist 下的所有文件,就是为了防止 lint 影响到它们,导致提交的时候出现很多不必要的修改。

semilt commented 2 years ago

我这边无法reopen,我重新提交一遍吧

semilt commented 2 years ago

comment一下以后又可以了……

semilt commented 2 years ago

我修改了一下NodeList的名称,这样更加明了

const { Bot, Message, ForwardNode } = require('Mirai-js');
...
bot.sendForward({
      friend: 'xxx',
      nodeList: new ForwardNode().addForwardNodeById(id).addForwardNode({
          senderId: 'xxx',
          time: 1000,
          senderName: 'master',
          messageChain: new Message().addPlain('你好,我是bot1!')
      })
}).then(forwardId => {...});
Drincann commented 2 years ago

还有一些问题,我们慢慢解决。

semilt commented 2 years ago

还有一些问题,我们慢慢解决。

例如什么问题呢?

Drincann commented 2 years ago

你可以直接在你的仓库提交修改。

semilt commented 2 years ago

好的,那我明天修改之后再提交

Drincann commented 2 years ago

我在思考将其从根暴露出来是否正确,因为它本质上还是一个 MessageChain。

...

我还有另外一个想法,那就是让 sendMessage 的 message 允许接收一个像 ForwardMessage 的东西,让它实现 MessageChainGetable,这保证了语义,也保证了一条合并转发消息链里只有一个 NodeList,还省去了实现 sendForword 重用 sendMessage 存在的一些问题。

你有什么建议吗?

我觉得这个想法很不错,值得与当前的方案进行讨论和对比一下。

semilt commented 2 years ago

我认为将sendForward与sendMessage合并是很不错的,只需要在方法内部设置参数优先级或者检查唯一性就可以。不过这样对于Message类的设计需要考虑如何将ForwardNodeList合并进去,是要在除messageChain以外再添加一个私有变量NodeList吗?这部分我还不是很确定

Drincann commented 2 years ago

现在 sendMessage 是抽象层,所以它不需要做任何改动,只需要扩展一个实现了 MessageChainGetable 的 ForwardMessage 类(或者还有更好的名字)即可。

关于如何合并到 Message 中,我有一个可行的方案,就是让 ForwardMessage 的构造过程作为 Message 的静态工厂方法暴露出去。

或者有更好的想法?

Drincann commented 2 years ago

我拉了下你的仓库,貌似 LF 的问题没有解决。:open_mouth:

semilt commented 2 years ago

修改了一个版本,另外我本地所有src中的文件都是CRLF,可能是git自动转换了,我已经重新配置了git 这个版本删除了 sendForward 方法和 ForwardNode 类,并入 sendMessage 方法和 Message 类。 新的用法为

bot.sendMessage({
    friend: 'xxx',
    message: new Message().createForward().addForwardDataNode({
        senderId: 'xxx',
        senderName: 'name',
        time: 1000,
        messageChain: new Message().addPlain('转发测试')
    }).addForwardIdNode(id)
});

在执行 createForward() 后这个Message类里的私有属性 isForward 变更为 True ,忽略已有的其他类型内容,并且新的其他类型的内容虽然会被添加进 messageChain 中但是最终在调用 getMessageChain 时也会被忽略。 在未调用 createForward() 时直接调用 addForwardDataNode 或 addForwardIdNode 会抛出异常

Drincann commented 2 years ago

先 merge 了,接下来的修改交给我吧。

semilt commented 2 years ago

OK,要close吗?

Drincann commented 2 years ago

不用