1
0
mirror of https://github.com/Mrs4s/MiraiGo.git synced 2025-05-04 19:17:38 +08:00

feature client statistics.

This commit is contained in:
Mrs4s 2020-11-20 23:23:26 +08:00
parent eaee349fe4
commit 91432ce12e
2 changed files with 46 additions and 0 deletions

View File

@ -87,6 +87,7 @@ type QQClient struct {
groupDataTransSeq int32 groupDataTransSeq int32
highwayApplyUpSeq int32 highwayApplyUpSeq int32
eventHandlers *eventHandlers eventHandlers *eventHandlers
stat Statistics
groupListLock sync.Mutex groupListLock sync.Mutex
} }
@ -286,6 +287,20 @@ func (c *QQClient) init() {
if !c.heartbeatEnabled { if !c.heartbeatEnabled {
go c.doHeartbeat() go c.doHeartbeat()
} }
c.stat.once.Do(func() {
c.OnGroupMessage(func(_ *QQClient, _ *message.GroupMessage) {
c.stat.MessageReceived++
})
c.OnPrivateMessage(func(_ *QQClient, _ *message.PrivateMessage) {
c.stat.MessageReceived++
})
c.OnTempMessage(func(_ *QQClient, _ *message.TempMessage) {
c.stat.MessageReceived++
})
c.onGroupMessageReceipt("internal", func(_ *QQClient, _ *groupMessageReceiptEvent) {
c.stat.MessageSent++
})
})
} }
func (c *QQClient) RequestSMS() bool { func (c *QQClient) RequestSMS() bool {
@ -504,6 +519,7 @@ func (c *QQClient) SendPrivateMessage(target int64, m *message.SendingMessage) *
_, pkt := c.buildFriendSendingPacket(target, seq, mr, 1, 0, 0, t, m.Elements) _, pkt := c.buildFriendSendingPacket(target, seq, mr, 1, 0, 0, t, m.Elements)
_ = c.send(pkt) _ = c.send(pkt)
} }
c.stat.MessageSent++
return &message.PrivateMessage{ return &message.PrivateMessage{
Id: seq, Id: seq,
InternalId: mr, InternalId: mr,
@ -538,6 +554,7 @@ func (c *QQClient) SendTempMessage(groupCode, target int64, m *message.SendingMe
t := time.Now().Unix() t := time.Now().Unix()
_, pkt := c.buildTempSendingPacket(group.Uin, target, seq, mr, t, m) _, pkt := c.buildTempSendingPacket(group.Uin, target, seq, mr, t, m)
_ = c.send(pkt) _ = c.send(pkt)
c.stat.MessageSent++
return &message.TempMessage{ return &message.TempMessage{
Id: seq, Id: seq,
GroupCode: group.Code, GroupCode: group.Code,
@ -1027,6 +1044,11 @@ func (c *QQClient) nextHighwayApplySeq() int32 {
func (c *QQClient) send(pkt []byte) error { func (c *QQClient) send(pkt []byte) error {
_, err := c.Conn.Write(pkt) _, err := c.Conn.Write(pkt)
if err != nil {
c.stat.PacketSent++
} else {
c.stat.PacketLost++
}
return err return err
} }
@ -1037,8 +1059,10 @@ func (c *QQClient) sendAndWait(seq uint16, pkt []byte) (interface{}, error) {
} }
_, err := c.Conn.Write(pkt) _, err := c.Conn.Write(pkt)
if err != nil { if err != nil {
c.stat.PacketLost++
return nil, err return nil, err
} }
c.stat.PacketSent++
ch := make(chan T) ch := make(chan T)
defer close(ch) defer close(ch)
c.handlers.Store(seq, func(i interface{}, err error) { c.handlers.Store(seq, func(i interface{}, err error) {
@ -1079,6 +1103,7 @@ func (c *QQClient) netLoop() {
l, err := reader.ReadInt32() l, err := reader.ReadInt32()
if err == io.EOF || err == io.ErrClosedPipe { if err == io.EOF || err == io.ErrClosedPipe {
c.Error("connection dropped by server: %v", err) c.Error("connection dropped by server: %v", err)
c.stat.DisconnectTimes++
err = c.connect() err = c.connect()
if err != nil { if err != nil {
c.Error("connect server error: %v", err) c.Error("connect server error: %v", err)
@ -1125,6 +1150,7 @@ func (c *QQClient) netLoop() {
errCount = 0 errCount = 0
retry = 0 retry = 0
c.Debug("rev pkt: %v seq: %v", pkt.CommandName, pkt.SequenceId) c.Debug("rev pkt: %v seq: %v", pkt.CommandName, pkt.SequenceId)
c.stat.PacketReceived++
go func() { go func() {
defer func() { defer func() {
if pan := recover(); pan != nil { if pan := recover(); pan != nil {
@ -1157,6 +1183,7 @@ func (c *QQClient) netLoop() {
if c.lastLostMsg == "" { if c.lastLostMsg == "" {
c.lastLostMsg = "Connection lost." c.lastLostMsg = "Connection lost."
} }
c.stat.LostTimes++
c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: c.lastLostMsg}) c.dispatchDisconnectEvent(&ClientDisconnectedEvent{Message: c.lastLostMsg})
} }

19
client/statistics.go Normal file
View File

@ -0,0 +1,19 @@
package client
import "sync"
type Statistics struct {
PacketReceived uint64 `json:"packet_received"`
PacketSent uint64 `json:"packet_sent"`
PacketLost uint32 `json:"packet_lost"`
MessageReceived uint64 `json:"message_received"`
MessageSent uint64 `json:"message_sent"`
DisconnectTimes uint32 `json:"disconnect_times"`
LostTimes uint32 `json:"lost_times"`
once sync.Once
}
func (c *QQClient) GetStatistics() Statistics {
return c.stat
}