You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.3 KiB
114 lines
3.3 KiB
package session |
|
|
|
import ( |
|
"github.com/go-faster/errors" |
|
|
|
"github.com/gotd/td/session/tdesktop" |
|
"github.com/gotd/td/telegram/dcs" |
|
"github.com/gotd/td/tg" |
|
) |
|
|
|
func findDCAddr(list []tg.DCOption, dcID int) string { |
|
for _, opt := range list { |
|
if opt.ID != dcID { |
|
continue |
|
} |
|
if opt.TCPObfuscatedOnly || |
|
opt.CDN || |
|
opt.MediaOnly { |
|
continue |
|
} |
|
|
|
return opt.IPAddress |
|
} |
|
|
|
return "" |
|
} |
|
|
|
func mapConfig(mainDC int, cfg tdesktop.MTPConfig) tg.Config { |
|
var opts []tg.DCOption |
|
for _, dc := range cfg.DCOptions.Options { |
|
opts = append(opts, tg.DCOption{ |
|
Flags: dc.Flags, |
|
Ipv6: dc.IPv6(), |
|
MediaOnly: dc.MediaOnly(), |
|
TCPObfuscatedOnly: dc.TCPOOnly(), |
|
CDN: dc.CDN(), |
|
Static: dc.Static(), |
|
ID: int(dc.ID), |
|
IPAddress: dc.IP, |
|
Port: int(dc.Port), |
|
Secret: dc.Secret, |
|
}) |
|
} |
|
return tg.Config{ |
|
DCOptions: opts, |
|
ThisDC: mainDC, |
|
ChatSizeMax: int(cfg.ChatSizeMax), |
|
MegagroupSizeMax: int(cfg.MegagroupSizeMax), |
|
ForwardedCountMax: int(cfg.ForwardedCountMax), |
|
OnlineUpdatePeriodMs: int(cfg.OnlineUpdatePeriod), |
|
OfflineBlurTimeoutMs: int(cfg.OfflineBlurTimeout), |
|
OfflineIdleTimeoutMs: int(cfg.OfflineIdleTimeout), |
|
OnlineCloudTimeoutMs: int(cfg.OnlineCloudTimeout), |
|
NotifyCloudDelayMs: int(cfg.NotifyCloudDelay), |
|
NotifyDefaultDelayMs: int(cfg.NotifyDefaultDelay), |
|
SavedGifsLimit: int(cfg.SavedGifsLimit), |
|
EditTimeLimit: int(cfg.EditTimeLimit), |
|
RevokeTimeLimit: int(cfg.RevokeTimeLimit), |
|
RevokePmTimeLimit: int(cfg.RevokePrivateTimeLimit), |
|
RevokePmInbox: cfg.RevokePrivateInbox, |
|
StickersRecentLimit: int(cfg.StickersRecentLimit), |
|
StickersFavedLimit: int(cfg.StickersFavedLimit), |
|
PinnedDialogsCountMax: int(cfg.PinnedDialogsCountMax), |
|
PinnedInfolderCountMax: int(cfg.PinnedDialogsInFolderMax), |
|
MeURLPrefix: cfg.InternalLinksDomain, |
|
ChannelsReadMediaPeriod: int(cfg.ChannelsReadMediaPeriod), |
|
CallReceiveTimeoutMs: int(cfg.CallReceiveTimeoutMs), |
|
CallRingTimeoutMs: int(cfg.CallRingTimeoutMs), |
|
CallConnectTimeoutMs: int(cfg.CallConnectTimeoutMs), |
|
CallPacketTimeoutMs: int(cfg.CallPacketTimeoutMs), |
|
WebfileDCID: int(cfg.WebFileDCID), |
|
DCTxtDomainName: cfg.TxtDomainString, |
|
PhonecallsEnabled: cfg.PhoneCallsEnabled, |
|
BlockedMode: cfg.BlockedMode, |
|
CaptionLengthMax: int(cfg.CaptionLengthMax), |
|
} |
|
} |
|
|
|
// TDesktopSession converts TDesktop's Account to Data. |
|
func TDesktopSession(account tdesktop.Account) (*Data, error) { |
|
auth := account.Authorization |
|
cfg := account.Config |
|
dc := auth.MainDC |
|
|
|
key, ok := auth.Keys[dc] |
|
if !ok { |
|
return nil, errors.Errorf("key for main DC (%d) not found", dc) |
|
} |
|
keyID := key.ID() |
|
|
|
mappedCfg := mapConfig(dc, cfg) |
|
addr := findDCAddr(mappedCfg.DCOptions, dc) |
|
if addr == "" { |
|
// Fallback to built-in addrs. |
|
var list dcs.List |
|
if !cfg.Environment.Test() { |
|
list = dcs.Prod() |
|
} else { |
|
list = dcs.Test() |
|
} |
|
addr = findDCAddr(list.Options, dc) |
|
if addr == "" { |
|
return nil, errors.Errorf("can't find address for DC %d", dc) |
|
} |
|
} |
|
|
|
return &Data{ |
|
DC: dc, |
|
Addr: addr, |
|
Config: mappedCfg, |
|
AuthKey: key[:], |
|
AuthKeyID: keyID[:], |
|
}, nil |
|
}
|
|
|