| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- package dc
-
- import (
- "fmt"
- "net"
- "strings"
- )
-
- type Telegram struct {
- view dcView
- preferIP preferIP
- }
-
- func (t *Telegram) GetAddresses(dc int) []Addr {
- switch t.preferIP {
- case preferIPOnlyIPv4:
- return t.view.getV4(dc)
- case preferIPOnlyIPv6:
- return t.view.getV4(dc)
- case preferIPPreferIPv4:
- return append(t.view.getV4(dc), t.view.getV6(dc)...)
- }
-
- return append(t.view.getV6(dc), t.view.getV4(dc)...)
- }
-
- func New(ipPreference string, userOverrides map[int][]string) (*Telegram, error) {
- var pref preferIP
-
- switch strings.ToLower(ipPreference) {
- case "prefer-ipv4":
- pref = preferIPPreferIPv4
- case "prefer-ipv6":
- pref = preferIPPreferIPv6
- case "only-ipv4":
- pref = preferIPOnlyIPv4
- case "only-ipv6":
- pref = preferIPOnlyIPv6
- default:
- return nil, fmt.Errorf("unknown ip preference %s", ipPreference)
- }
-
- overrides := dcAddrSet{
- v4: map[int][]Addr{},
- v6: map[int][]Addr{},
- }
- for dc, addrs := range userOverrides {
- for _, addr := range addrs {
- host, _, err := net.SplitHostPort(addr)
- if err != nil {
- return nil, fmt.Errorf("incorrect host %s: %w", addr, err)
- }
-
- parsed := net.ParseIP(host)
- if parsed == nil {
- return nil, fmt.Errorf("incorrect host %s", addr)
- }
-
- if parsed.To4() != nil {
- overrides.v4[dc] = append(overrides.v4[dc], Addr{
- Network: "tcp4",
- Address: addr,
- })
- } else {
- overrides.v6[dc] = append(overrides.v6[dc], Addr{
- Network: "tcp6",
- Address: addr,
- })
- }
- }
- }
-
- return &Telegram{
- view: dcView{
- overrides: overrides,
- },
- preferIP: pref,
- }, nil
- }
|