| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package telegram
-
- import (
- "fmt"
- "sync"
- "time"
-
- "go.uber.org/zap"
-
- "github.com/9seconds/mtg/conntypes"
- "github.com/9seconds/mtg/telegram/api"
- )
-
- const middleTelegramBackgroundUpdateEvery = time.Hour
-
- 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)
- }
|