Comments (7)
目前我觉得是这个地方有问题,目前card
和title
都是String!
,但是设计这俩的地方好像挺多的,不敢乱动
from overflow.
感觉是 Gson 跟 kotlin 的兼容性问题,我没想到 null 是可以赋值到 kotlin 的非空字段里的,等有空我统一处理一下这个问题
from overflow.
// GroupMemberInfoResp: 44
override fun toString(): String {
return "GroupMemberInfoResp(groupId=$groupId, userId=$userId, nickname='$nickname', card='$card', sex='$sex', age=$age, area='$area', joinTime=$joinTime, lastSentTime=$lastSentTime, level=$level, role='$role', unfriendly=$unfriendly, title='$title', titleExpireTime=$titleExpireTime, cardChangeable=$cardChangeable, shutUpTimestamp=$shutUpTimestamp)"
}
// JsonHelper: 114
inline fun <reified T : Any> JsonObject.fromJson(key: String): T? {
return gson.fromJson(this[key].deepCopyIgnoreNulls(), T::class.java)
}
inline fun <reified T : Any> JsonObject.fromJsonOld(key: String): T? {
return gson.fromJson(this[key], T::class.java)
}
fun main() {
val json = JsonParser.parseString("{\"data\":{\"user_id\":114514,\"card\":null}}").asJsonObject
println(json)
val old = json.fromJsonOld<GroupMemberInfoResp>("data")
val new = json.fromJson<GroupMemberInfoResp>("data")
println("Old: $old")
println("New: $new")
}
{"data":{"user_id":114514,"card":null}}
Old: GroupMemberInfoResp(groupId=0, userId=114514, nickname='', card='null', sex='', age=0, area='', joinTime=0, lastSentTime=0, level=0, role='member', unfriendly=false, title='', titleExpireTime=0, cardChangeable=true, shutUpTimestamp=0)
New: GroupMemberInfoResp(groupId=0, userId=114514, nickname='', card='', sex='', age=0, area='', joinTime=0, lastSentTime=0, level=0, role='member', unfriendly=false, title='', titleExpireTime=0, cardChangeable=true, shutUpTimestamp=0)
测试通过
from overflow.
更新最新版本后petpet依然报错,检查了下petpet的逻辑写了套报错的实例代码
@Override
public void onEnable() {
getLogger().info("Plugin loaded!");
GlobalEventChannel.INSTANCE.subscribeAlways(GroupMessageEvent.class, event->{
System.out.println("===ENTER TEST===");
Member m = event.getGroup().getBotAsMember();
System.out.print("NameCard is: ");
System.out.println(m.getNameCard());
System.out.print("Nick is: ");
System.out.println(m.getNick());
try{
String test = m.getNameCard().isEmpty() ? m.getNick() : m.getNameCard();
System.out.println(test);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("===END TEST===");
});
}
日志如下:
2024-05-15 17:15:56 I/stdout: ===ENTER TEST===
2024-05-15 17:15:56 I/stdout: NameCard is: null
2024-05-15 17:15:56 I/stdout: Nick is: BOTNICK
2024-05-15 17:15:56 W/stderr: java.lang.NullPointerException: Cannot invoke "String.isEmpty()" because the return value of "net.mamoe.mirai.contact.Member.getNameCard()" is null
2024-05-15 17:15:56 W/stderr: at demo-0.1.0.mirai2.jar//com.example.Demo.lambda$onEnable$0(Demo.java:31)
2024-05-15 17:15:56 W/stderr: at net.mamoe.mirai.event.EventChannel$subscribeAlways$2$1.invoke(EventChannel.kt:605)
2024-05-15 17:15:56 W/stderr: at net.mamoe.mirai.event.EventChannel$subscribeAlways$2$1.invoke(EventChannel.kt:605)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.InterruptibleKt.runInterruptibleInExpectedContext(Interruptible.kt:51)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.InterruptibleKt.access$runInterruptibleInExpectedContext(Interruptible.kt:1)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.InterruptibleKt$runInterruptible$2.invokeSuspend(Interruptible.kt:43)
2024-05-15 17:15:56 W/stderr: at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.internal.LimitedDispatcher.run(LimitedDispatcher.kt:42)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:95)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:570)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:750)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:677)
2024-05-15 17:15:56 W/stderr: at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:664)
2024-05-15 17:15:56 I/stdout: ===END TEST===
Group.getBotAsMember()
这个函数以某种形式依然获取了null到card里
from overflow.
2024-05-18 17:06:59 I/stdout: ===ENTER TEST===
2024-05-18 17:06:59 I/stdout: NameCard is:
2024-05-18 17:06:59 I/stdout: Nick is: 电子
2024-05-18 17:06:59 I/stdout: 电子
2024-05-18 17:06:59 I/stdout: ===END TEST===
在新版本中测试通过
from overflow.
2024-05-18 17:06:59 I/stdout: ===ENTER TEST=== 2024-05-18 17:06:59 I/stdout: NameCard is: 2024-05-18 17:06:59 I/stdout: Nick is: 电子 2024-05-18 17:06:59 I/stdout: 电子 2024-05-18 17:06:59 I/stdout: ===END TEST===
在新版本中测试通过
估计是Lagrange的兼容性问题,我去看了下新版本依然存在这个问题,看了下当前的逻辑是这样:
2024-05-18 18:49:49 I/Onebot: 服务端版本信息
{
"status": "ok",
"retcode": 0,
"data": {
"app_name": "Lagrange.OneBot",
"app_version": "0.0.3",
"protocol_version": "v11",
"nt_protocol": "Linux | 3.1.2-13107"
},
"echo": 0
}
2024-05-18 18:49:54 D/Onebot: Client received <--
{
"message_type": "group",
"sub_type": "normal",
"message_id": 942040339,
"group_id": 12345,
"user_id": 88888,
"anonymous": null,
"message": [
{
"type": "text",
"data": {
"text": "3"
}
}
],
"raw_message": "3",
"font": 0,
"sender": {
"user_id": 88888,
"nickname": "E710",
"card": "username",
"sex": "unknown",
"age": 0,
"area": "",
"level": "100",
"role": "owner",
"title": ""
},
"time": 1716029394,
"self_id": 77777,
"post_type": "message"
}
2024-05-18 18:49:54 D/Onebot: Send to server -->
{
"action": "get_group_member_list",
"params": {
"group_id": 12345
},
"echo": 4
}
2024-05-18 18:49:54 D/Onebot: Client received <--
{
"status": "ok",
"retcode": 0,
"data": [
{
"group_id": 12345,
"user_id": 66666,
"nickname": "Q群管家",
"card": null,
"sex": "",
"age": 0,
"area": "",
"join_time": 1671523796,
"last_sent_time": 1671524715,
"level": "0",
"role": "member",
"unfriendly": false,
"title": null,
"title_expire_time": 0,
"card_changeable": false
},
{
"group_id": 12345,
"user_id": 88888,
"nickname": "ID",
"card": "username",
"sex": "",
"age": 0,
"area": "",
"join_time": 1565643645,
"last_sent_time": 1715932682,
"level": "100",
"role": "owner",
"unfriendly": false,
"title": "芝士群主",
"title_expire_time": 0,
"card_changeable": false
},
{
"group_id": 12345,
"user_id": 77777,
"nickname": "芝士BOT",
"card": null,
"sex": "",
"age": 0,
"area": "",
"join_time": 1697010760,
"last_sent_time": 1715932682,
"level": "43",
"role": "member",
"unfriendly": false,
"title": null,
"title_expire_time": 0,
"card_changeable": false
}
],
"echo": 4
}
2024-05-18 18:49:55 D/Onebot: Client received <--
{
"message_type": "group",
"sub_type": "normal",
"message_id": 942088876,
"group_id": 12345,
"user_id": 88888,
"anonymous": null,
"message": [
{
"type": "text",
"data": {
"text": "3"
}
}
],
"raw_message": "3",
"font": 0,
"sender": {
"user_id": 88888,
"nickname": "ID",
"card": "username",
"sex": "unknown",
"age": 0,
"area": "",
"level": "100",
"role": "owner",
"title": "芝士群主"
},
"time": 1716029395,
"self_id": 77777,
"post_type": "message"
}
2024-05-18 18:49:55 D/Onebot: Client received <--
{
"message_type": "group",
"sub_type": "normal",
"message_id": 942189006,
"group_id": 12345,
"user_id": 88888,
"anonymous": null,
"message": [
{
"type": "text",
"data": {
"text": "3"
}
}
],
"raw_message": "3",
"font": 0,
"sender": {
"user_id": 88888,
"nickname": "ID",
"card": "username",
"sex": "unknown",
"age": 0,
"area": "",
"level": "100",
"role": "owner",
"title": "芝士群主"
},
"time": 1716029395,
"self_id": 77777,
"post_type": "message"
}
也就是Group.getBotAsMember()
的信息其实是get_group_member_list
来的
get_group_member_list
是在Bot.kt
里
然后我参考上次修复其他为空的方法改了下这里
Overflow/onebot/src/main/kotlin/client/core/Bot.kt
Lines 1466 to 1472 in de5585c
改成:
inline fun <reified T> JsonElement.withToken(): T {
return gson.fromJson(this.deepCopyIgnoreNulls(), object : TypeToken<T>() {}.type)
}
inline fun <reified T> JsonElement.withClass(): T {
return gson.fromJson(this.deepCopyIgnoreNulls(), T::class.java)
}
现在正常了,这样改应该没啥问题,您再看看
from overflow.
好的
from overflow.
Related Issues (20)
- 是否可以支持satori协议 HOT 3
- 使用拉格朗日有些群消息无法获取 HOT 1
- 目前如何使用mirai码构造Image图片 HOT 6
- 请求兼容Mirai的序列化方法
- `69f24b2`之后无法正常启动
- 建议功能 HOT 4
- 关于`Image`类的一些讨论 HOT 6
- data Type问题 HOT 12
- 与Gensokyo-kook 配合问题 HOT 3
- 临时会话消息接收不到 HOT 1
- NapCat正向WS无法将临时会话的消息推至Mirai新消息 HOT 1
- 从openshamrock接收消息时报错
- 无法识别群成员管理员权限
- 新版本在重启后,必须接受一次来自目标群/好友的信息才能正常发送
- 在某一时刻overflow对QQ消息的解析突然就戛然而止 HOT 2
- 使用OneBot时获取Bot的所有群聊会返回一个空的ContactList HOT 4
- 在群中复读时会出现undefined
- 好友列表拉取为空 HOT 5
- 无回复 HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from overflow.