1use super::UserAttribution;
3use futu_core::conn_ip::CPP_PLATFORM_HARDCODED_PRIMARY_PORT;
4
5pub const CN: &[(&str, u16)] = &[
7 ("119.29.48.17", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("119.29.43.101", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("115.159.18.59", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("118.89.98.77", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("119.28.37.77", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("119.28.37.206", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("106.55.67.68", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("124.156.124.214", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.234.241.65", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("106.55.66.8", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("124.156.124.226", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.234.241.94", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ];
20
21pub const HK: &[(&str, u16)] = &[
23 ("101.32.217.163", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("43.135.111.64", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("43.132.195.157", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("43.135.85.38", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("106.55.216.230", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("134.175.255.64", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ];
30
31pub const US: &[(&str, u16)] = &[
33 ("49.51.78.96", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.51.77.161", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("134.175.254.224", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("119.28.38.243", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("170.106.48.244", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("170.106.48.172", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.51.78.184", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.51.79.131", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.51.78.91", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.51.79.75", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.51.79.238", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("170.106.48.163", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("49.51.78.214", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("170.106.48.193", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ];
48
49pub const SG: &[(&str, u16)] = &[
51 ("129.226.2.218", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("101.32.143.93", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("42.194.246.243", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("101.32.70.122", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("101.32.113.56", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("101.33.43.108", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("101.33.43.3", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("101.32.104.226", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("129.226.1.154", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("42.193.217.66", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("43.135.57.128", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ];
64
65pub const AU: &[(&str, u16)] = &[
67 ("3.24.228.217", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("13.210.218.25", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ];
70
71pub const JP: &[(&str, u16)] = &[
73 ("43.153.165.91", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ("124.156.236.226", CPP_PLATFORM_HARDCODED_PRIMARY_PORT), ];
76
77pub fn for_attribution(attr: UserAttribution) -> &'static [(&'static str, u16)] {
83 match attr {
84 UserAttribution::Cn => CN,
85 UserAttribution::Hk => HK,
86 UserAttribution::Us => US,
87 UserAttribution::Sg => SG,
88 UserAttribution::Au => AU,
89 UserAttribution::Jp => JP,
90 _ => &[],
91 }
92}
93
94pub fn domain_for_attribution(attr: UserAttribution) -> &'static str {
114 match attr {
115 UserAttribution::Cn => "nnconn.futunn.com",
116 UserAttribution::Hk => "hkconn.futunn.com",
117 UserAttribution::Us => "usconn.moomoo.com",
118 UserAttribution::Sg => "sgconn.moomoo.com",
119 UserAttribution::Au => "auconn.moomoo.com",
120 UserAttribution::Jp => "jpconn.moomoo.com",
121 _ => "",
122 }
123}
124
125pub async fn resolve_domain_ips(attr: UserAttribution) -> Vec<(String, u16)> {
128 use tokio::net::lookup_host;
129 const DNS_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(3);
130 let host = format!(
131 "{}:{CPP_PLATFORM_HARDCODED_PRIMARY_PORT}",
132 domain_for_attribution(attr)
133 );
134 match tokio::time::timeout(DNS_TIMEOUT, lookup_host(host.clone())).await {
135 Ok(Ok(addrs)) => addrs
136 .filter_map(|sa| match sa {
137 std::net::SocketAddr::V4(v4) => Some((v4.ip().to_string(), v4.port())),
139 std::net::SocketAddr::V6(_) => None,
140 })
141 .collect(),
142 Ok(Err(e)) => {
143 tracing::debug!(host = %host, error = %e, "DNS resolve failed");
144 Vec::new()
145 }
146 Err(_) => {
147 tracing::debug!(host = %host, "DNS resolve timed out after 3s");
148 Vec::new()
149 }
150 }
151}