Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

channels.go 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package stats
  2. import (
  3. "net"
  4. "time"
  5. "github.com/9seconds/mtg/mtproto"
  6. )
  7. const (
  8. crashesChanLength = 1
  9. connectionsChanLength = 20
  10. trafficChanLength = 5000
  11. )
  12. var (
  13. crashesChan = make(chan struct{}, crashesChanLength)
  14. connectionsChan = make(chan *connectionData, connectionsChanLength)
  15. trafficChan = make(chan *trafficData, trafficChanLength)
  16. )
  17. type connectionData struct {
  18. connectionType mtproto.ConnectionType
  19. connected bool
  20. addr *net.TCPAddr
  21. }
  22. type trafficData struct {
  23. traffic int
  24. ingress bool
  25. }
  26. func crashManager() {
  27. for range crashesChan {
  28. instance.mutex.RLock()
  29. instance.Crashes++
  30. instance.mutex.RUnlock()
  31. }
  32. }
  33. func connectionManager() {
  34. for event := range connectionsChan {
  35. instance.mutex.RLock()
  36. isIPv4 := event.addr.IP.To4() != nil
  37. var inc uint32 = 1
  38. if !event.connected {
  39. inc = ^uint32(0)
  40. }
  41. switch event.connectionType {
  42. case mtproto.ConnectionTypeAbridged:
  43. if isIPv4 {
  44. instance.Connections.Abridged.IPv4 += inc
  45. } else {
  46. instance.Connections.Abridged.IPv6 += inc
  47. }
  48. case mtproto.ConnectionTypeSecure:
  49. if isIPv4 {
  50. instance.Connections.Secure.IPv4 += inc
  51. } else {
  52. instance.Connections.Secure.IPv6 += inc
  53. }
  54. default:
  55. if isIPv4 {
  56. instance.Connections.Intermediate.IPv4 += inc
  57. } else {
  58. instance.Connections.Intermediate.IPv6 += inc
  59. }
  60. }
  61. instance.mutex.RUnlock()
  62. }
  63. }
  64. func trafficManager() {
  65. speedChan := time.Tick(time.Second)
  66. for {
  67. select {
  68. case event := <-trafficChan:
  69. instance.mutex.RLock()
  70. if event.ingress {
  71. instance.Traffic.Ingress += trafficValue(event.traffic)
  72. instance.speedCurrent.Ingress += trafficSpeedValue(event.traffic)
  73. } else {
  74. instance.Traffic.Egress += trafficValue(event.traffic)
  75. instance.speedCurrent.Egress += trafficSpeedValue(event.traffic)
  76. }
  77. instance.mutex.RUnlock()
  78. case <-speedChan:
  79. instance.mutex.RLock()
  80. instance.Speed.Ingress = instance.speedCurrent.Ingress
  81. instance.Speed.Egress = instance.speedCurrent.Egress
  82. instance.speedCurrent.Ingress = trafficSpeedValue(0)
  83. instance.speedCurrent.Egress = trafficSpeedValue(0)
  84. instance.mutex.RUnlock()
  85. }
  86. }
  87. }
  88. // NewCrash indicates new crash.
  89. func NewCrash() {
  90. crashesChan <- struct{}{}
  91. }
  92. // ClientConnected indicates that new client was connected.
  93. func ClientConnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
  94. connectionsChan <- &connectionData{
  95. connectionType: connectionType,
  96. addr: addr,
  97. connected: true,
  98. }
  99. }
  100. // ClientDisconnected indicates that client was disconnected.
  101. func ClientDisconnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
  102. connectionsChan <- &connectionData{
  103. connectionType: connectionType,
  104. addr: addr,
  105. connected: false,
  106. }
  107. }
  108. // IngressTraffic accounts new ingress traffic.
  109. func IngressTraffic(traffic int) {
  110. trafficChan <- &trafficData{
  111. traffic: traffic,
  112. ingress: true,
  113. }
  114. }
  115. // EgressTraffic accounts new ingress traffic.
  116. func EgressTraffic(traffic int) {
  117. trafficChan <- &trafficData{
  118. traffic: traffic,
  119. ingress: false,
  120. }
  121. }