mirror of
https://github.com/Mrs4s/MiraiGo.git
synced 2025-05-04 11:07:40 +08:00
supported JoinGroupEvent.
This commit is contained in:
parent
d2131325d0
commit
4a5fe018eb
@ -182,7 +182,7 @@ func (c *QQClient) GetFriendList() (*FriendListResponse, error) {
|
||||
return r, nil
|
||||
}
|
||||
|
||||
func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage) int32 {
|
||||
func (c *QQClient) SendGroupMessage(groupUin int64, m *message.SendingMessage) int32 {
|
||||
eid := utils.RandomString(6)
|
||||
mr := int32(rand.Uint32())
|
||||
ch := make(chan int32)
|
||||
@ -192,7 +192,7 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage)
|
||||
c.onGroupMessageReceipt(eid)
|
||||
}
|
||||
})
|
||||
_, pkt := c.buildGroupSendingPacket(groupCode, mr, m)
|
||||
_, pkt := c.buildGroupSendingPacket(utils.ToGroupCode(groupUin), mr, m)
|
||||
_ = c.send(pkt)
|
||||
var mid int32
|
||||
select {
|
||||
@ -204,9 +204,9 @@ func (c *QQClient) SendGroupMessage(groupCode int64, m *message.SendingMessage)
|
||||
return mid
|
||||
}
|
||||
|
||||
func (c *QQClient) UploadGroupImage(groupCode int64, img []byte) (*message.GroupImageElement, error) {
|
||||
func (c *QQClient) UploadGroupImage(groupUin int64, img []byte) (*message.GroupImageElement, error) {
|
||||
h := md5.Sum(img)
|
||||
seq, pkt := c.buildGroupImageStorePacket(groupCode, h, int32(len(img)))
|
||||
seq, pkt := c.buildGroupImageStorePacket(utils.ToGroupCode(groupUin), h, int32(len(img)))
|
||||
r, err := c.sendAndWait(seq, pkt)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -430,6 +430,7 @@ func (c *QQClient) loop() {
|
||||
continue
|
||||
}
|
||||
}
|
||||
//fmt.Println(pkt.CommandName)
|
||||
go func() {
|
||||
decoder, ok := c.decoders[pkt.CommandName]
|
||||
if !ok {
|
||||
|
@ -7,9 +7,14 @@ import (
|
||||
"github.com/Mrs4s/MiraiGo/client/pb"
|
||||
"github.com/Mrs4s/MiraiGo/client/pb/msg"
|
||||
"github.com/golang/protobuf/proto"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
groupJoinLock = new(sync.Mutex)
|
||||
)
|
||||
|
||||
func decodeLoginResponse(c *QQClient, seq uint16, payload []byte) (interface{}, error) {
|
||||
reader := binary.NewReader(payload)
|
||||
reader.ReadUInt16() // sub command
|
||||
@ -143,10 +148,26 @@ func decodeMessageSvcPacket(c *QQClient, seq uint16, payload []byte) (interface{
|
||||
MsgUid: message.Head.MsgUid,
|
||||
}
|
||||
delItems = append(delItems, delItem)
|
||||
|
||||
if message.Head.ToUin != c.Uin {
|
||||
continue
|
||||
}
|
||||
switch message.Head.MsgType {
|
||||
case 33:
|
||||
groupJoinLock.Lock()
|
||||
group := c.FindGroup(message.Head.FromUin)
|
||||
if message.Head.AuthUin == c.Uin {
|
||||
if group != nil {
|
||||
groupJoinLock.Unlock()
|
||||
continue
|
||||
}
|
||||
if c.ReloadGroupList() != nil {
|
||||
groupJoinLock.Unlock()
|
||||
continue
|
||||
}
|
||||
c.dispatchNewGroupEvent(c.FindGroup(message.Head.FromUin))
|
||||
}
|
||||
groupJoinLock.Unlock()
|
||||
case 166:
|
||||
if message.Body.RichText == nil || message.Body.RichText.Elems == nil {
|
||||
continue
|
||||
}
|
||||
@ -154,10 +175,10 @@ func decodeMessageSvcPacket(c *QQClient, seq uint16, payload []byte) (interface{
|
||||
continue
|
||||
}
|
||||
c.lastMessageSeq = message.Head.MsgSeq
|
||||
|
||||
c.dispatchFriendMessage(c.parsePrivateMessage(message))
|
||||
}
|
||||
}
|
||||
}
|
||||
_, _ = c.sendAndWait(c.buildDeleteMessageRequestPacket(delItems))
|
||||
if rsp.SyncFlag != msg.SyncFlag_STOP {
|
||||
seq, pkt := c.buildGetMessageRequestPacket(rsp.SyncFlag, time.Now().Unix())
|
||||
|
@ -13,6 +13,7 @@ type eventHandlers struct {
|
||||
groupMessageHandlers []func(*QQClient, *message.GroupMessage)
|
||||
groupMuteEventHandlers []func(*QQClient, *GroupMuteEvent)
|
||||
groupRecalledHandlers []func(*QQClient, *GroupMessageRecalledEvent)
|
||||
joinGroupHandlers []func(*QQClient, *GroupInfo)
|
||||
groupMessageReceiptHandlers sync.Map
|
||||
}
|
||||
|
||||
@ -26,6 +27,8 @@ func (c *QQClient) OnEvent(i interface{}) error {
|
||||
c.OnGroupMuted(f)
|
||||
case func(*QQClient, *GroupMessageRecalledEvent):
|
||||
c.OnGroupMessageRecalled(f)
|
||||
case func(*QQClient, *GroupInfo):
|
||||
c.OnJoinGroup(f)
|
||||
default:
|
||||
return ErrEventUndefined
|
||||
}
|
||||
@ -52,6 +55,10 @@ func (c *QQClient) OnGroupMuted(f func(*QQClient, *GroupMuteEvent)) {
|
||||
c.eventHandlers.groupMuteEventHandlers = append(c.eventHandlers.groupMuteEventHandlers, f)
|
||||
}
|
||||
|
||||
func (c *QQClient) OnJoinGroup(f func(*QQClient, *GroupInfo)) {
|
||||
c.eventHandlers.joinGroupHandlers = append(c.eventHandlers.joinGroupHandlers, f)
|
||||
}
|
||||
|
||||
func (c *QQClient) OnGroupMessageRecalled(f func(*QQClient, *GroupMessageRecalledEvent)) {
|
||||
c.eventHandlers.groupRecalledHandlers = append(c.eventHandlers.groupRecalledHandlers, f)
|
||||
}
|
||||
@ -114,6 +121,17 @@ func (c *QQClient) dispatchGroupMessageRecalledEvent(e *GroupMessageRecalledEven
|
||||
}
|
||||
}
|
||||
|
||||
func (c *QQClient) dispatchJoinGroupEvent(group *GroupInfo) {
|
||||
if group == nil {
|
||||
return
|
||||
}
|
||||
for _, f := range c.eventHandlers.joinGroupHandlers {
|
||||
cover(func() {
|
||||
f(c, group)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (c *QQClient) dispatchGroupMessageReceiptEvent(e *groupMessageReceiptEvent) {
|
||||
c.eventHandlers.groupMessageReceiptHandlers.Range(func(_, f interface{}) bool {
|
||||
go f.(func(*QQClient, *groupMessageReceiptEvent))(c, e)
|
||||
|
@ -116,8 +116,6 @@ func (info *DeviceInfo) GenDeviceInfoData() []byte {
|
||||
}
|
||||
|
||||
func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage {
|
||||
switch msg.Head.MsgType {
|
||||
case 166:
|
||||
friend := c.FindFriend(msg.Head.FromUin)
|
||||
if friend == nil {
|
||||
return nil
|
||||
@ -130,9 +128,6 @@ func (c *QQClient) parsePrivateMessage(msg *msg.Message) *message.PrivateMessage
|
||||
},
|
||||
Elements: parseMessageElems(msg.Body.RichText.Elems),
|
||||
}
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (c *QQClient) parseGroupMessage(m *msg.Message) *message.GroupMessage {
|
||||
|
@ -94,6 +94,13 @@ func (msg *SendingMessage) Append(e IMessageElement) *SendingMessage {
|
||||
return msg
|
||||
}
|
||||
|
||||
func (s *Sender) DisplayName() string {
|
||||
if s.CardName == "" {
|
||||
return s.Nickname
|
||||
}
|
||||
return s.CardName
|
||||
}
|
||||
|
||||
func ToProtoElems(elems []IMessageElement) (r []*msg.Elem) {
|
||||
for _, elem := range elems {
|
||||
switch e := elem.(type) {
|
||||
|
43
utils/group.go
Normal file
43
utils/group.go
Normal file
@ -0,0 +1,43 @@
|
||||
package utils
|
||||
|
||||
func ToGroupUin(groupCode int64) int64 {
|
||||
left := groupCode / 1000000
|
||||
switch {
|
||||
case left >= 0 && left <= 10:
|
||||
left += 202
|
||||
case left >= 11 && left <= 19:
|
||||
left += 480 - 11
|
||||
case left >= 20 && left <= 66:
|
||||
left += 2100 - 20
|
||||
case left >= 67 && left <= 156:
|
||||
left += 2010 - 67
|
||||
case left >= 157 && left <= 209:
|
||||
left += 2147 - 157
|
||||
case left >= 210 && left <= 309:
|
||||
left += 4100 - 210
|
||||
case left >= 310 && left <= 499:
|
||||
left += 3800 - 310
|
||||
}
|
||||
return left*1000000 + groupCode%1000000
|
||||
}
|
||||
|
||||
func ToGroupCode(groupUin int64) int64 {
|
||||
left := groupUin / 1000000
|
||||
switch {
|
||||
case left >= 0+202 && left <= 10+202:
|
||||
left -= 202
|
||||
case left >= 11+480-11 && left <= 19+480-11:
|
||||
left -= 480 - 11
|
||||
case left >= 20+2100-20 && left <= 66+2100-20:
|
||||
left -= 2100 - 20
|
||||
case left >= 67+2010-67 && left <= 156+2010-67:
|
||||
left -= 2010 - 67
|
||||
case left >= 157+2147-157 && left <= 209+2147-157:
|
||||
left -= 2147 - 157
|
||||
case left >= 210+4100-210 && left <= 309+4100-210:
|
||||
left -= 4100 - 210
|
||||
case left >= 310+3800-310 && left <= 499+3800-310:
|
||||
left -= 3800 - 310
|
||||
}
|
||||
return left*1000000 + groupUin%1000000
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user