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:
parent
eaee349fe4
commit
91432ce12e
@ -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
19
client/statistics.go
Normal 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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user