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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

channels.go 3.1KB

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