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
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

multi_observer.go 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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) EventFinish(evt mtglib.EventFinish) {
  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.EventFinish(evt)
  27. }(v)
  28. }
  29. wg.Wait()
  30. }
  31. func (m multiObserver) EventConcurrencyLimited(evt mtglib.EventConcurrencyLimited) {
  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.EventConcurrencyLimited(evt)
  38. }(v)
  39. }
  40. wg.Wait()
  41. }
  42. func (m multiObserver) EventIPBlocklisted(evt mtglib.EventIPBlocklisted) {
  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.EventIPBlocklisted(evt)
  49. }(v)
  50. }
  51. wg.Wait()
  52. }
  53. func (m multiObserver) Shutdown() {
  54. for _, v := range m.observers {
  55. v.Shutdown()
  56. }
  57. }
  58. func newMultiObserver(factories []ObserverFactory) Observer {
  59. observers := make([]Observer, len(factories))
  60. for i, v := range factories {
  61. observers[i] = v()
  62. }
  63. return multiObserver{
  64. observers: observers,
  65. }
  66. }