|
@@ -31,6 +31,7 @@ type StatsService struct {
|
|
|
createdAt time.Time
|
|
|
inbounds map[string]bool
|
|
|
outbounds map[string]bool
|
|
|
+ users map[string]bool
|
|
|
access sync.Mutex
|
|
|
counters map[string]*atomic.Int64
|
|
|
}
|
|
@@ -41,26 +42,32 @@ func NewStatsService(options option.V2RayStatsServiceOptions) *StatsService {
|
|
|
}
|
|
|
inbounds := make(map[string]bool)
|
|
|
outbounds := make(map[string]bool)
|
|
|
+ users := make(map[string]bool)
|
|
|
for _, inbound := range options.Inbounds {
|
|
|
inbounds[inbound] = true
|
|
|
}
|
|
|
for _, outbound := range options.Outbounds {
|
|
|
outbounds[outbound] = true
|
|
|
}
|
|
|
+ for _, user := range options.Users {
|
|
|
+ users[user] = true
|
|
|
+ }
|
|
|
return &StatsService{
|
|
|
createdAt: time.Now(),
|
|
|
inbounds: inbounds,
|
|
|
outbounds: outbounds,
|
|
|
+ users: users,
|
|
|
counters: make(map[string]*atomic.Int64),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (s *StatsService) RoutedConnection(inbound string, outbound string, conn net.Conn) net.Conn {
|
|
|
+func (s *StatsService) RoutedConnection(inbound string, outbound string, user string, conn net.Conn) net.Conn {
|
|
|
var readCounter []*atomic.Int64
|
|
|
var writeCounter []*atomic.Int64
|
|
|
countInbound := inbound != "" && s.inbounds[inbound]
|
|
|
countOutbound := outbound != "" && s.outbounds[outbound]
|
|
|
- if !countInbound && !countOutbound {
|
|
|
+ countUser := user != "" && s.users[user]
|
|
|
+ if !countInbound && !countOutbound && !countUser {
|
|
|
return conn
|
|
|
}
|
|
|
s.access.Lock()
|
|
@@ -72,16 +79,21 @@ func (s *StatsService) RoutedConnection(inbound string, outbound string, conn ne
|
|
|
readCounter = append(readCounter, s.loadOrCreateCounter("outbound>>>"+outbound+">>>traffic>>>uplink"))
|
|
|
writeCounter = append(writeCounter, s.loadOrCreateCounter("outbound>>>"+outbound+">>>traffic>>>downlink"))
|
|
|
}
|
|
|
+ if countUser {
|
|
|
+ readCounter = append(readCounter, s.loadOrCreateCounter("user>>>"+user+">>>traffic>>>uplink"))
|
|
|
+ writeCounter = append(writeCounter, s.loadOrCreateCounter("user>>>"+user+">>>traffic>>>downlink"))
|
|
|
+ }
|
|
|
s.access.Unlock()
|
|
|
return trackerconn.New(conn, readCounter, writeCounter)
|
|
|
}
|
|
|
|
|
|
-func (s *StatsService) RoutedPacketConnection(inbound string, outbound string, conn N.PacketConn) N.PacketConn {
|
|
|
+func (s *StatsService) RoutedPacketConnection(inbound string, outbound string, user string, conn N.PacketConn) N.PacketConn {
|
|
|
var readCounter []*atomic.Int64
|
|
|
var writeCounter []*atomic.Int64
|
|
|
countInbound := inbound != "" && s.inbounds[inbound]
|
|
|
countOutbound := outbound != "" && s.outbounds[outbound]
|
|
|
- if !countInbound && !countOutbound {
|
|
|
+ countUser := user != "" && s.users[user]
|
|
|
+ if !countInbound && !countOutbound && !countUser {
|
|
|
return conn
|
|
|
}
|
|
|
s.access.Lock()
|
|
@@ -93,6 +105,10 @@ func (s *StatsService) RoutedPacketConnection(inbound string, outbound string, c
|
|
|
readCounter = append(readCounter, s.loadOrCreateCounter("outbound>>>"+outbound+">>>traffic>>>uplink"))
|
|
|
writeCounter = append(writeCounter, s.loadOrCreateCounter("outbound>>>"+outbound+">>>traffic>>>downlink"))
|
|
|
}
|
|
|
+ if countUser {
|
|
|
+ readCounter = append(readCounter, s.loadOrCreateCounter("user>>>"+user+">>>traffic>>>uplink"))
|
|
|
+ writeCounter = append(writeCounter, s.loadOrCreateCounter("user>>>"+user+">>>traffic>>>downlink"))
|
|
|
+ }
|
|
|
s.access.Unlock()
|
|
|
return trackerconn.NewPacket(conn, readCounter, writeCounter)
|
|
|
}
|