fix(group): make set-group-info callback field replacement nil-safe

webhookBeforeSetGroupInfo and webhookBeforeSetGroupInfoEx called
datautil.NotNilReplace(&req.X, &resp.X). NotNilReplace only checks the outer pointer,
which is never nil for a field address, so a successful callback that did not return
these fields unconditionally overwrote the pending request values with zero values.
For SetGroupInfoExReq the wrapped fields were set to nil, UpdateGroupInfoExMap then
returned an empty map and the update silently no-op'd (e.g. renaming a group failed
while changing its avatar still worked, because the callback returns faceURL).

Only overwrite request fields when the callback explicitly provided a value:
plain strings check != "", wrapper-pointer fields check != nil.
pull/3809/head
皮皮萌宝 2 days ago committed by GitHub
parent 175a7bb067
commit 7481958648
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -341,10 +341,19 @@ func (g *groupServer) webhookBeforeSetGroupInfo(ctx context.Context, before *con
if resp.ApplyMemberFriend != nil {
req.GroupInfoForSet.ApplyMemberFriend = wrapperspb.Int32(*resp.ApplyMemberFriend)
}
datautil.NotNilReplace(&req.GroupInfoForSet.GroupID, &resp.GroupID)
datautil.NotNilReplace(&req.GroupInfoForSet.GroupName, &resp.GroupName)
datautil.NotNilReplace(&req.GroupInfoForSet.FaceURL, &resp.FaceURL)
datautil.NotNilReplace(&req.GroupInfoForSet.Introduction, &resp.Introduction)
// resp 中的字符串为零值时表示回调未提供,保留请求原值,避免空串覆盖待更新字段
if resp.GroupID != "" {
req.GroupInfoForSet.GroupID = resp.GroupID
}
if resp.GroupName != "" {
req.GroupInfoForSet.GroupName = resp.GroupName
}
if resp.FaceURL != "" {
req.GroupInfoForSet.FaceURL = resp.FaceURL
}
if resp.Introduction != "" {
req.GroupInfoForSet.Introduction = resp.Introduction
}
return nil
})
}
@ -405,14 +414,31 @@ func (g *groupServer) webhookBeforeSetGroupInfoEx(ctx context.Context, before *c
return err
}
datautil.NotNilReplace(&req.GroupID, &resp.GroupID)
datautil.NotNilReplace(&req.GroupName, &resp.GroupName)
datautil.NotNilReplace(&req.FaceURL, &resp.FaceURL)
datautil.NotNilReplace(&req.Introduction, &resp.Introduction)
datautil.NotNilReplace(&req.Ex, &resp.Ex)
datautil.NotNilReplace(&req.NeedVerification, &resp.NeedVerification)
datautil.NotNilReplace(&req.LookMemberInfo, &resp.LookMemberInfo)
datautil.NotNilReplace(&req.ApplyMemberFriend, &resp.ApplyMemberFriend)
// 仅当回调显式提供字段时才覆盖,避免把请求中的增量字段抹成 nil
if resp.GroupID != "" {
req.GroupID = resp.GroupID
}
if resp.GroupName != nil {
req.GroupName = resp.GroupName
}
if resp.FaceURL != nil {
req.FaceURL = resp.FaceURL
}
if resp.Introduction != nil {
req.Introduction = resp.Introduction
}
if resp.Ex != nil {
req.Ex = resp.Ex
}
if resp.NeedVerification != nil {
req.NeedVerification = resp.NeedVerification
}
if resp.LookMemberInfo != nil {
req.LookMemberInfo = resp.LookMemberInfo
}
if resp.ApplyMemberFriend != nil {
req.ApplyMemberFriend = resp.ApplyMemberFriend
}
return nil
})

Loading…
Cancel
Save