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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. addr *net.TCPAddr
  20. connected bool
  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.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. func NewCrash() {
  95. crashesChan <- struct{}{}
  96. }
  97. func ClientConnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
  98. connectionsChan <- &connectionData{
  99. connectionType: connectionType,
  100. addr: addr,
  101. connected: true,
  102. }
  103. }
  104. func ClientDisconnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
  105. connectionsChan <- &connectionData{
  106. connectionType: connectionType,
  107. addr: addr,
  108. connected: false,
  109. }
  110. }
  111. func IngressTraffic(traffic int) {
  112. trafficChan <- &trafficData{
  113. traffic: traffic,
  114. ingress: true,
  115. }
  116. }
  117. func EgressTraffic(traffic int) {
  118. trafficChan <- &trafficData{
  119. traffic: traffic,
  120. ingress: false,
  121. }
  122. }