| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package telegram
-
- import (
- "fmt"
- "net"
- "sync"
- "time"
-
- "go.uber.org/zap"
-
- "github.com/9seconds/mtg/conntypes"
- "github.com/9seconds/mtg/telegram/api"
- )
-
- const middleTelegramBackgroundUpdateEvery = time.Hour
-
- var Middle Telegram
-
- type middleTelegram struct {
- baseTelegram
-
- mutex sync.RWMutex
- }
-
- func (m *middleTelegram) Secret() []byte {
- m.mutex.RLock()
- defer m.mutex.RUnlock()
-
- return m.baseTelegram.Secret()
- }
-
- func (m *middleTelegram) update() error {
- secret, err := api.Secret()
- if err != nil {
- return fmt.Errorf("cannot fetch secret: %w", err)
- }
-
- v4Addresses, v4DefaultDC, err := api.AddressesV4()
- if err != nil {
- return fmt.Errorf("cannot fetch addresses for ipv4: %w", err)
- }
-
- v6Addresses, v6DefaultDC, err := api.AddressesV6()
- if err != nil {
- return fmt.Errorf("cannot fetch addresses for ipv6: %w", err)
- }
-
- m.mutex.Lock()
- m.secret = secret
- m.v4DefaultDC = v4DefaultDC
- m.V6DefaultDC = v6DefaultDC
- m.v4Addresses = v4Addresses
- m.v6Addresses = v6Addresses
- m.mutex.Unlock()
-
- return nil
- }
-
- func (m *middleTelegram) backgroundUpdate() {
- logger := zap.S().Named("telegram")
- for range time.Tick(middleTelegramBackgroundUpdateEvery) {
- if err := m.update(); err != nil {
- logger.Warnw("Cannot update Telegram proxies", "error", err)
- }
- }
- }
-
- func (m *middleTelegram) Dial(dc conntypes.DC,
- protocol conntypes.ConnectionProtocol) (conntypes.StreamReadWriteCloser, error) {
- if dc == 0 {
- dc = conntypes.DCDefaultIdx
- }
-
- m.mutex.RLock()
- defer m.mutex.RUnlock()
-
- return m.baseTelegram.dial(dc, protocol)
- }
-
- func MiddleInit() {
- tg := &middleTelegram{
- baseTelegram: baseTelegram{
- dialer: net.Dialer{Timeout: telegramDialTimeout},
- },
- }
- if err := tg.update(); err != nil {
- panic(err)
- }
- go tg.backgroundUpdate()
-
- Middle = tg
- }
|