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ů.

multi_observer.go 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package events
  2. import (
  3. "sync"
  4. "github.com/9seconds/mtg/v2/mtglib"
  5. )
  6. type multiObserver struct {
  7. observers []Observer
  8. }
  9. func (m multiObserver) EventStart(evt mtglib.EventStart) {
  10. wg := &sync.WaitGroup{}
  11. wg.Add(len(m.observers))
  12. for _, v := range m.observers {
  13. go func(obs Observer) {
  14. defer wg.Done()
  15. obs.EventStart(evt)
  16. }(v)
  17. }
  18. wg.Wait()
  19. }
  20. func (m multiObserver) EventConnectedToDC(evt mtglib.EventConnectedToDC) {
  21. wg := &sync.WaitGroup{}
  22. wg.Add(len(m.observers))
  23. for _, v := range m.observers {
  24. go func(obs Observer) {
  25. defer wg.Done()
  26. obs.EventConnectedToDC(evt)
  27. }(v)
  28. }
  29. wg.Wait()
  30. }
  31. func (m multiObserver) EventDomainFronting(evt mtglib.EventDomainFronting) {
  32. wg := &sync.WaitGroup{}
  33. wg.Add(len(m.observers))
  34. for _, v := range m.observers {
  35. go func(obs Observer) {
  36. defer wg.Done()
  37. obs.EventDomainFronting(evt)
  38. }(v)
  39. }
  40. wg.Wait()
  41. }
  42. func (m multiObserver) EventTraffic(evt mtglib.EventTraffic) {
  43. wg := &sync.WaitGroup{}
  44. wg.Add(len(m.observers))
  45. for _, v := range m.observers {
  46. go func(obs Observer) {
  47. defer wg.Done()
  48. obs.EventTraffic(evt)
  49. }(v)
  50. }
  51. wg.Wait()
  52. }
  53. func (m multiObserver) EventFinish(evt mtglib.EventFinish) {
  54. wg := &sync.WaitGroup{}
  55. wg.Add(len(m.observers))
  56. for _, v := range m.observers {
  57. go func(obs Observer) {
  58. defer wg.Done()
  59. obs.EventFinish(evt)
  60. }(v)
  61. }
  62. wg.Wait()
  63. }
  64. func (m multiObserver) EventConcurrencyLimited(evt mtglib.EventConcurrencyLimited) {
  65. wg := &sync.WaitGroup{}
  66. wg.Add(len(m.observers))
  67. for _, v := range m.observers {
  68. go func(obs Observer) {
  69. defer wg.Done()
  70. obs.EventConcurrencyLimited(evt)
  71. }(v)
  72. }
  73. wg.Wait()
  74. }
  75. func (m multiObserver) EventIPBlocklisted(evt mtglib.EventIPBlocklisted) {
  76. wg := &sync.WaitGroup{}
  77. wg.Add(len(m.observers))
  78. for _, v := range m.observers {
  79. go func(obs Observer) {
  80. defer wg.Done()
  81. obs.EventIPBlocklisted(evt)
  82. }(v)
  83. }
  84. wg.Wait()
  85. }
  86. func (m multiObserver) EventReplayAttack(evt mtglib.EventReplayAttack) {
  87. wg := &sync.WaitGroup{}
  88. wg.Add(len(m.observers))
  89. for _, v := range m.observers {
  90. go func(obs Observer) {
  91. defer wg.Done()
  92. obs.EventReplayAttack(evt)
  93. }(v)
  94. }
  95. wg.Wait()
  96. }
  97. func (m multiObserver) EventIPListSize(evt mtglib.EventIPListSize) {
  98. wg := &sync.WaitGroup{}
  99. wg.Add(len(m.observers))
  100. for _, v := range m.observers {
  101. go func(obs Observer) {
  102. defer wg.Done()
  103. obs.EventIPListSize(evt)
  104. }(v)
  105. }
  106. wg.Wait()
  107. }
  108. func (m multiObserver) Shutdown() {
  109. for _, v := range m.observers {
  110. v.Shutdown()
  111. }
  112. }
  113. func newMultiObserver(factories []ObserverFactory) Observer {
  114. observers := make([]Observer, len(factories))
  115. for i, v := range factories {
  116. observers[i] = v()
  117. }
  118. return multiObserver{
  119. observers: observers,
  120. }
  121. }