Files
2026-02-17 13:06:23 +08:00

481 lines
15 KiB
Go

package clientsdk
import (
"github.com/golang/protobuf/proto"
"github.com/micro/go-micro/util/log"
"xiawan/wx/clientsdk/baseinfo"
"xiawan/wx/protobuf/wechat"
)
// CreateModifyUserInfoField 创建修改 账号信息 项
func CreateModifyUserInfoField(modUserInfo *wechat.ModUserInfo, initFlag uint32, nickName string) *baseinfo.ModifyItem {
// set ModUserInfo
var bitFlag = initFlag
// NickName
if modUserInfo.NickName != nil &&
modUserInfo.NickName.Str != nil &&
len(*modUserInfo.NickName.Str) > 0 {
bitFlag |= 0x2
}
// BindEmail
if modUserInfo.BindEmail != nil &&
modUserInfo.BindEmail.Str != nil &&
len(*modUserInfo.BindEmail.Str) > 0 {
bitFlag |= 0x8
}
// PersonalCard
if modUserInfo.PersonalCard != nil &&
*modUserInfo.PersonalCard != 0 {
bitFlag |= 0x80
}
modUserInfo.BitFlag = &bitFlag
data, marshalErr := proto.Marshal(modUserInfo)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(1),
Len: uint32(len(data)),
Data: data,
}
}
// CreateDeleteFriendField 创建删掉好友项
func CreateDeleteFriendField(modContact *wechat.ModContact) *baseinfo.ModifyItem {
zeroValue32 := uint32(0)
var emptySKString wechat.SKBuiltinString
emptySKString.Str = nil
var emptySKBuffer wechat.SKBuiltinString_
emptySKBuffer.Len = &zeroValue32
// 构造新的ModContact
var tmpModContact wechat.ModContact
tmpModContact.UserName = modContact.UserName
tmpModContact.NickName = modContact.NickName
tmpModContact.Pyinitial = &emptySKString
tmpModContact.QuanPin = modContact.QuanPin
tmpModContact.Sex = modContact.Sex
tmpModContact.ImgBuf = &emptySKBuffer
tmpModContact.ImgFlag = &zeroValue32
// bitVal
bitVal := modContact.GetBitVal()&modContact.GetBitMask() | 2
bitVal = bitVal & 0xFFFFFFFE
tmpModContact.BitVal = &bitVal
// bitMask
bitMask := uint32(0xFFFFFFFF)
tmpModContact.BitMask = &bitMask
tmpModContact.Remark = modContact.Remark
tmpModContact.RemarkPyinitial = modContact.RemarkPyinitial
tmpModContact.RemarkQuanPin = modContact.RemarkQuanPin
tmpModContact.ContactType = modContact.ContactType
tmpModContact.ChatRoomNotify = modContact.ChatRoomNotify
tmpModContact.AddContactScene = &zeroValue32
tmpModContact.DeleteContactScene = &zeroValue32
data, marshalErr := proto.Marshal(&tmpModContact)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(2),
Len: uint32(len(data)),
Data: data,
}
}
// CreateModifyFriendField 创建修改好友 备注名项
func CreateModifyFriendField(modContact *wechat.ModContact) *baseinfo.ModifyItem {
zeroValue32 := uint32(0)
emptyString := string("")
var emptySKString wechat.SKBuiltinString
emptySKString.Str = &emptyString
var emptySKBuffer wechat.SKBuiltinString_
emptySKBuffer.Len = &zeroValue32
// 构造新的ModContact
var tmpModContact wechat.ModContact
tmpModContact.UserName = modContact.UserName
tmpModContact.NickName = modContact.NickName
tmpModContact.Pyinitial = &emptySKString
tmpModContact.QuanPin = modContact.QuanPin
tmpModContact.Sex = modContact.Sex
tmpModContact.ImgBuf = &emptySKBuffer
tmpModContact.ImgFlag = &zeroValue32
// bitVal
bitVal := modContact.GetBitVal() & modContact.GetBitMask()
bitVal = bitVal | 0x5
tmpModContact.BitVal = &bitVal
// bitMask
bitMask := uint32(0xFFFFFFFF)
tmpModContact.BitMask = &bitMask
tmpModContact.Remark = modContact.Remark
tmpModContact.RemarkPyinitial = modContact.RemarkPyinitial
tmpModContact.RemarkQuanPin = modContact.RemarkQuanPin
tmpModContact.ContactType = modContact.ContactType
tmpModContact.RoomInfoCount = &zeroValue32
tmpModContact.RoomInfoList = make([]*wechat.RoomInfo, 0)
tmpModContact.ChatRoomNotify = modContact.ChatRoomNotify
tmpModContact.AddContactScene = &zeroValue32
tmpModContact.DeleteContactScene = &zeroValue32
data, marshalErr := proto.Marshal(&tmpModContact)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(2),
Len: uint32(len(data)),
Data: data,
}
}
// CreateSaveGroupToAddressBookField 创建保存群聊到通讯录项
func CreateSaveGroupToAddressBookField(modContact *wechat.ModContact, bSafeToAddressBook bool) *baseinfo.ModifyItem {
zeroValue32 := uint32(0)
emptyString := string("")
var emptySKString wechat.SKBuiltinString
emptySKString.Str = &emptyString
var emptySKBuffer wechat.SKBuiltinString_
emptySKBuffer.Len = &zeroValue32
// 构造新的ModContact
var tmpModContact wechat.ModContact
tmpModContact.UserName = modContact.UserName
tmpModContact.NickName = modContact.NickName
tmpModContact.Pyinitial = &emptySKString
tmpModContact.QuanPin = modContact.QuanPin
tmpModContact.Sex = modContact.Sex
tmpModContact.ImgBuf = &emptySKBuffer
tmpModContact.ImgFlag = &zeroValue32
// bitVal
bitVal := modContact.GetBitVal() & modContact.GetBitMask()
if bSafeToAddressBook {
bitVal = bitVal | 0x1
} else {
bitVal = bitVal & 0xFFFFFFFE
}
tmpModContact.BitVal = &bitVal
// bitMask
bitMask := uint32(0xFFFFFFFF)
tmpModContact.BitMask = &bitMask
tmpModContact.Remark = modContact.Remark
tmpModContact.RemarkPyinitial = modContact.RemarkPyinitial
tmpModContact.RemarkQuanPin = modContact.RemarkQuanPin
tmpModContact.ContactType = modContact.ContactType
tmpModContact.RoomInfoCount = &zeroValue32
tmpModContact.RoomInfoList = make([]*wechat.RoomInfo, 0)
tmpModContact.ChatRoomNotify = modContact.ChatRoomNotify
tmpModContact.AddContactScene = &zeroValue32
tmpModContact.DeleteContactScene = &zeroValue32
data, marshalErr := proto.Marshal(&tmpModContact)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(2),
Len: uint32(len(data)),
Data: data,
}
}
// CreateModifyFriendBlack 创建修改好友项:拉黑
func CreateModifyFriendBlack(modContact *wechat.ModContact) *baseinfo.ModifyItem {
zeroValue32 := uint32(0)
emptyString := string("")
var emptySKString wechat.SKBuiltinString
emptySKString.Str = &emptyString
var emptySKBuffer wechat.SKBuiltinString_
emptySKBuffer.Len = &zeroValue32
// 构造新的ModContact
var tmpModContact wechat.ModContact
tmpModContact.UserName = modContact.UserName
tmpModContact.NickName = modContact.NickName
tmpModContact.Pyinitial = &emptySKString
tmpModContact.QuanPin = modContact.QuanPin
tmpModContact.Sex = modContact.Sex
tmpModContact.ImgBuf = &emptySKBuffer
tmpModContact.ImgFlag = &zeroValue32
// bitVal
bitVal := modContact.GetBitVal() & modContact.GetBitMask()
bitVal = bitVal | 0xF
tmpModContact.BitVal = &bitVal
// bitMask
bitMask := uint32(0xFFFFFFFF)
tmpModContact.BitMask = &bitMask
tmpModContact.Remark = modContact.Remark
tmpModContact.RemarkPyinitial = modContact.RemarkPyinitial
tmpModContact.RemarkQuanPin = modContact.RemarkQuanPin
tmpModContact.ContactType = modContact.ContactType
tmpModContact.RoomInfoCount = &zeroValue32
tmpModContact.RoomInfoList = make([]*wechat.RoomInfo, 0)
// ChatRoomNotify
chatRoomNotify := uint32(0)
if modContact.GetChatroomStatus() != 1 {
chatRoomNotify = 1
}
tmpModContact.ChatRoomNotify = &chatRoomNotify
tmpModContact.AddContactScene = &zeroValue32
tmpModContact.DeleteContactScene = &zeroValue32
data, marshalErr := proto.Marshal(&tmpModContact)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(2),
Len: uint32(len(data)),
Data: data,
}
}
// CreateDelContactField 创建联系人项
func CreateDelContactField(userName string) *baseinfo.ModifyItem {
var delContact wechat.DelContact
// UserName
var skUserName wechat.SKBuiltinString
skUserName.Str = &userName
delContact.UserName = &skUserName
// DeleteContactScene
delContactSecne := uint32(0)
delContact.DeleteContactScene = &delContactSecne
data, marshalErr := proto.Marshal(&delContact)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(7),
Len: uint32(len(data)),
Data: data,
}
}
// CreateQutiChatRoomItem 创建退出群聊项
// chatRoomName: 群微信ID
// userName: 自己的微信ID
func CreateQutiChatRoomItem(chatRoomName string, userName string) *baseinfo.ModifyItem {
var quitChatRoomItem wechat.QuitChatRoom
// chatRoomName
var chatRoomNameBuffer wechat.SKBuiltinString
chatRoomNameBuffer.Str = &chatRoomName
quitChatRoomItem.ChatRoomName = &chatRoomNameBuffer
// UserName
var userNameBuffer wechat.SKBuiltinString
userNameBuffer.Str = &userName
quitChatRoomItem.UserName = &userNameBuffer
data, marshalErr := proto.Marshal(&quitChatRoomItem)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(16),
Len: uint32(len(data)),
Data: data,
}
}
// CreateFunctionSwitchItem 创建开关项
// funcID:功能ID
// switchType:功能开关值
func CreateFunctionSwitchItem(funcID uint32, switchType uint32) *baseinfo.ModifyItem {
var functionSwitch wechat.FunctionSwitch
functionSwitch.FunctionId = &funcID
functionSwitch.SwitchValue = &switchType
data, marshalErr := proto.Marshal(&functionSwitch)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(23),
Len: uint32(len(data)),
Data: data,
}
}
// CreateModifyGroupNameField 创建修改群名称(群主题名称) 项
// groupWxid: 群微信id
// topicName: 新的群主题名称
func CreateModifyGroupNameField(groupWxid string, topicName string) *baseinfo.ModifyItem {
var modChatRoomTopic wechat.ModChatRoomTopic
// 群号
var groupWxidBuffer wechat.SKBuiltinString
groupWxidBuffer.Str = &groupWxid
modChatRoomTopic.ChatRoomName = &groupWxidBuffer
// 新的昵称
var topicNameBuffer wechat.SKBuiltinString
topicNameBuffer.Str = &topicName
modChatRoomTopic.ChatRoomTopic = &topicNameBuffer
data, marshalErr := proto.Marshal(&modChatRoomTopic)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(27),
Len: uint32(len(data)),
Data: data,
}
}
// CreateModifyGroupNickNameField 创建修改群的个人昵称 项
// groupWxid: 群微信ID
// wxID: 自己的微信ID
// groupNickName: 新的群个人昵称
func CreateModifyGroupNickNameField(groupWxid string, wxID string, groupNickName string) *baseinfo.ModifyItem {
var chatRoomMemberDisplayName wechat.ModChatRoomMemberDisplayName
// 群号
chatRoomMemberDisplayName.ChatRoomName = &groupWxid
// 自己的微信ID
chatRoomMemberDisplayName.UserName = &wxID
// 新的个人群昵称
chatRoomMemberDisplayName.DisplayName = &groupNickName
data, marshalErr := proto.Marshal(&chatRoomMemberDisplayName)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(48),
Len: uint32(len(data)),
Data: data,
}
}
// CreateSnsShowTimeItem 允许朋友查看朋友的时间范围(三天、一个月、半年、无限制)
// snsUserInfo:通过getProfile请求可以获取到
// hours:时间范围小时(72-三天,720-一个月、4320-半年、4294967295-全部),目前只能是这几个值
func CreateSnsShowTimeItem(snsUserInfo *wechat.SnsUserInfo, hours uint32) *baseinfo.ModifyItem {
snsUserInfo.SnsPrivacyRecent = &hours
data, marshalErr := proto.Marshal(snsUserInfo)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(51),
Len: uint32(len(data)),
Data: data,
}
}
// CreateSnsShowTenLineOfStrangerItem 允许陌生人查看十条朋友圈,设置
// snsUserInfo:通过getProfile请求可以获取到
// bShowTenLines: true-代表允许,false-代表不允许
func CreateSnsShowTenLineOfStrangerItem(snsUserInfo *wechat.SnsUserInfo, bShowTenLines bool) *baseinfo.ModifyItem {
tmpSnsFlagEx := snsUserInfo.GetSnsFlagex()
if bShowTenLines {
tmpSnsFlagEx = tmpSnsFlagEx & 0xFFFFFFFE
} else {
tmpSnsFlagEx = tmpSnsFlagEx | 1
}
snsUserInfo.SnsFlagex = &tmpSnsFlagEx
data, marshalErr := proto.Marshal(snsUserInfo)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(51),
Len: uint32(len(data)),
Data: data,
}
}
// CreateBlackSnsItem 创建Oplog项:别人添加我是否需要验证
// needVerify: 0-不需要验证,1-需要验证
func CreateBlackSnsItem(friendWxid string, modType uint32) *baseinfo.ModifyItem {
/*var snsBlackList wechat.ModSnsBlackList
snsBlackList.ContactUsername = &friendWxid
snsBlackList.ModType = &modType
data, marshalErr := proto.Marshal(&snsBlackList)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModUserInfo failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}*/
req := &wechat.FunctionSwitch{
FunctionId: proto.Uint32(4),
SwitchValue: proto.Uint32(modType),
}
reqBuf, _ := proto.Marshal(req)
return &baseinfo.ModifyItem{
CmdID: uint32(23),
Len: uint32(len(reqBuf)),
Data: reqBuf,
}
}
// CreateModifyNickNameField 创建修改 昵称 请求项
func CreateModifyNickNameField(newNickName string) *baseinfo.ModifyItem {
var singleField wechat.ModSingleField
// set singlefield
var opType = uint32(1)
singleField.OpType = &opType
singleField.Value = &newNickName
singleData, marshalErr := proto.Marshal(&singleField)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModSingleField failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(64),
Len: uint32(len(singleData)),
Data: singleData,
}
}
// CreateModifySignatureField 创建修改 个性签名 请求项
func CreateModifySignatureField(newSignature string) *baseinfo.ModifyItem {
var singleField wechat.ModSingleField
// set singlefield
var opType = uint32(2)
singleField.OpType = &opType
singleField.Value = &newSignature
singleData, marshalErr := proto.Marshal(&singleField)
if marshalErr != nil {
log.Info("proto.Marshal wechat.ModSingleField failed: ", marshalErr)
return &baseinfo.ModifyItem{}
}
return &baseinfo.ModifyItem{
CmdID: uint32(64),
Len: uint32(len(singleData)),
Data: singleData,
}
}