Closed cyanray closed 3 years ago
一些事件中,如群成员消息撤回事件(GroupRecallEvent),Operator 被定义为 GroupMember_t 类型的属性,表示引起该事件的操作者。 mirai-http 返回的这个事件的json,这个 Operator 可能为 null,表示 Operator 为 bot 自己。 然而,mirai-cpp最初为了简洁的设计,所有的事件类都没有用 getter/setter 编程样式,采用了直接暴露类成员的方式。(当事人表示非常后悔) 所以,现在的 mirai-cpp 无法处理 Operator 为 null 时的情况。
对于所有含有 Operator 且 Operator 可能为null的事件,都提供了一个 OperatorIsBot 的函数。读取 Operator 前,应该调用该函数,做一次判断,如果该函数返回 true,则不应该读取该事件的 Operator 成员。
如果忘了做判断,当 Operator 为null时直接读取 Operator,是不会有任何异常、报错出现的。(读取到的值都是没有意义的值)
暂时按照第三个解决方案进行,临时解决方案将废弃。
计划在mirai-cpp 2.0时提升最低c++标准为c++17,使用 std::optional 来实现可空(std::nullopt)成员。
背景
一些事件中,如群成员消息撤回事件(GroupRecallEvent),Operator 被定义为 GroupMember_t 类型的属性,表示引起该事件的操作者。 mirai-http 返回的这个事件的json,这个 Operator 可能为 null,表示 Operator 为 bot 自己。 然而,mirai-cpp最初为了简洁的设计,所有的事件类都没有用 getter/setter 编程样式,采用了直接暴露类成员的方式。(当事人表示非常后悔) 所以,现在的 mirai-cpp 无法处理 Operator 为 null 时的情况。
临时的解决方案
对于所有含有 Operator 且 Operator 可能为null的事件,都提供了一个 OperatorIsBot 的函数。读取 Operator 前,应该调用该函数,做一次判断,如果该函数返回 true,则不应该读取该事件的 Operator 成员。
临时解决方案存在的问题
如果忘了做判断,当 Operator 为null时直接读取 Operator,是不会有任何异常、报错出现的。(读取到的值都是没有意义的值)
其他的解决方案
未来的计划
暂时按照第三个解决方案进行,临时解决方案将废弃。