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

hub.go 1.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package hub
  2. import (
  3. "errors"
  4. "sync"
  5. "github.com/9seconds/mtg/conntypes"
  6. "github.com/9seconds/mtg/protocol"
  7. )
  8. type Concentrator struct {
  9. hubs sync.Map
  10. }
  11. func (c *Concentrator) Write(packet conntypes.Packet, req *protocol.TelegramRequest) error {
  12. hub := c.getHub(req)
  13. connectionChan := make(chan *connection)
  14. hub.connectionRequestsChan <- &connectionHubRequest{
  15. req: req,
  16. responseChan: connectionChan,
  17. }
  18. conn, ok := <-connectionChan
  19. if !ok {
  20. return errors.New("cannot establish connection to telegram")
  21. }
  22. }
  23. func (c *Concentrator) getHub(req *protocol.TelegramRequest) *connectionHub {
  24. dcMapRaw, ok := c.hubs.Load(req.ClientProtocol.DC())
  25. if !ok {
  26. dcMapRaw, _ = c.hubs.LoadOrStore(req.ClientProtocol.DC(), &sync.Map{})
  27. }
  28. dcMap := dcMapRaw.(*sync.Map)
  29. loaded := true
  30. hubRaw, ok := dcMap.Load(req.ClientProtocol.ConnectionProtocol())
  31. if !ok {
  32. hubRaw, loaded = dcMap.LoadOrStore(req.ClientProtocol.ConnectionProtocol(),
  33. newConnectionHub())
  34. }
  35. hub := hubRaw.(*connectionHub)
  36. if !loaded {
  37. go hub.run()
  38. }
  39. return hub
  40. }