GithubHelp home page GithubHelp logo

Comments (7)

EvolvedGhost avatar EvolvedGhost commented on June 2, 2024

https://github.com/MrXiaoM/Overflow/blob/main/onebot/src/main/kotlin/sdk/response/group/GroupMemberInfoResp.kt

目前我觉得是这个地方有问题,目前cardtitle都是String!,但是设计这俩的地方好像挺多的,不敢乱动

from overflow.

MrXiaoM avatar MrXiaoM commented on June 2, 2024

感觉是 Gson 跟 kotlin 的兼容性问题,我没想到 null 是可以赋值到 kotlin 的非空字段里的,等有空我统一处理一下这个问题

from overflow.

MrXiaoM avatar MrXiaoM commented on June 2, 2024
// 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.

EvolvedGhost avatar EvolvedGhost commented on June 2, 2024

更新最新版本后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.

MrXiaoM avatar MrXiaoM commented on June 2, 2024
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.

EvolvedGhost avatar EvolvedGhost commented on June 2, 2024
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

然后我参考上次修复其他为空的方法改了下这里

inline fun <reified T> JsonElement.withToken(): T {
return gson.fromJson(this, object : TypeToken<T>() {}.type)
}
inline fun <reified T> JsonElement.withClass(): T {
return gson.fromJson(this, T::class.java)
}

改成:

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.

MrXiaoM avatar MrXiaoM commented on June 2, 2024

好的

from overflow.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.