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.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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() { // nolint: gocyclo
  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.ActiveConnections.Abridged.IPv4 += inc
  45. if event.connected {
  46. instance.AllConnections.Abridged.IPv4 += inc
  47. }
  48. } else {
  49. instance.ActiveConnections.Abridged.IPv6 += inc
  50. if event.connected {
  51. instance.AllConnections.Abridged.IPv6 += inc
  52. }
  53. }
  54. default:
  55. if isIPv4 {
  56. instance.ActiveConnections.Intermediate.IPv4 += inc
  57. if event.connected {
  58. instance.AllConnections.Intermediate.IPv4 += inc
  59. }
  60. } else {
  61. instance.ActiveConnections.Intermediate.IPv6 += inc
  62. if event.connected {
  63. instance.AllConnections.Intermediate.IPv6 += inc
  64. }
  65. }
  66. }
  67. instance.mutex.RUnlock()
  68. }
  69. }
  70. func trafficManager() {
  71. speedChan := time.Tick(time.Second)
  72. for {
  73. select {
  74. case event := <-trafficChan:
  75. instance.mutex.RLock()
  76. if event.ingress {
  77. instance.Traffic.Ingress += trafficValue(event.traffic)
  78. instance.speedCurrent.Ingress += trafficSpeedValue(event.traffic)
  79. } else {
  80. instance.Traffic.Egress += trafficValue(event.traffic)
  81. instance.speedCurrent.Egress += trafficSpeedValue(event.traffic)
  82. }
  83. instance.mutex.RUnlock()
  84. case <-speedChan:
  85. instance.mutex.RLock()
  86. instance.Speed.Ingress = instance.speedCurrent.Ingress
  87. instance.Speed.Egress = instance.speedCurrent.Egress
  88. instance.speedCurrent.Ingress = trafficSpeedValue(0)
  89. instance.speedCurrent.Egress = trafficSpeedValue(0)
  90. instance.mutex.RUnlock()
  91. }
  92. }
  93. }
  94. // NewCrash indicates new crash.
  95. func NewCrash() {
  96. crashesChan <- struct{}{}
  97. }
  98. // ClientConnected indicates that new client was connected.
  99. func ClientConnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
  100. connectionsChan <- &connectionData{
  101. connectionType: connectionType,
  102. addr: addr,
  103. connected: true,
  104. }
  105. }
  106. // ClientDisconnected indicates that client was disconnected.
  107. func ClientDisconnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
  108. connectionsChan <- &connectionData{
  109. connectionType: connectionType,
  110. addr: addr,
  111. connected: false,
  112. }
  113. }
  114. // IngressTraffic accounts new ingress traffic.
  115. func IngressTraffic(traffic int) {
  116. trafficChan <- &trafficData{
  117. traffic: traffic,
  118. ingress: true,
  119. }
  120. }
  121. // EgressTraffic accounts new ingress traffic.
  122. func EgressTraffic(traffic int) {
  123. trafficChan <- &trafficData{
  124. traffic: traffic,
  125. ingress: false,
  126. }
  127. }