use crate::proto_serde::ProtoSerde;
use crate::structs::{Address, NetworkEnvironment, PeerId, PublicKey, Seed, TrustData};
use crate::util::times::current_time_millis;
use itertools::Itertools;
impl Seed {
pub fn port_or(&self, default: u16) -> u16 {
self.port_offset.map(|p| p as u16).unwrap_or(default)
}
pub fn addresses(&self) -> Vec<Address> {
let pid = self.peer_id.as_ref().and_then(|p| p.peer_id.as_ref());
vec![self.public_key.as_ref(), pid].iter().flatten().flat_map(|pk| pk.address().ok()).collect_vec()
}
}
#[derive(Debug, serde::Deserialize)]
struct SeedCsvRecord {
external_address: String,
network_environment: String,
score: f64,
}
fn parse_seeds_csv_resource(str: &str) -> Vec<SeedCsvRecord> {
let mut rdr = csv::Reader::from_reader(str.as_bytes());
let mut res = vec![];
for result in rdr.deserialize() {
let record: SeedCsvRecord = result.expect("");
res.push(record);
}
res
}
pub fn seed(addr: impl Into<String>) -> Seed {
let mut s = Seed::default();
s.external_address = addr.into();
let t = TrustData::from_label(0.9);
s.trust = vec![t];
s.environments = vec![NetworkEnvironment::All as i32];
s
}
pub fn simple_seed(addr: impl Into<String>, pid: impl Into<String>, pk: impl Into<String>, is_main: bool) -> Seed {
let mut ss = seed(addr);
ss.peer_id = Some(PeerId::from_hex(pid).expect("hex"));
ss.public_key = Some(PublicKey::from_hex(pk).expect("hex"));
ss.environments = if is_main {
vec![NetworkEnvironment::Main as i32]
} else {
NetworkEnvironment::gui_networks().iter().filter_map(|e| {
if e.is_main() {
None
} else {
Some(e.clone() as i32)
}
}).collect_vec()
};
ss
}
pub fn get_all_hardcoded_seeds() -> Vec<Seed> {
vec![
simple_seed(
"n0.redgold.io",
"0a250a230a21028f78d7ac63a35087092f05981a115bf42b6afc31fd97eb4107b1e2b73d27f98a",
"0a230a2103a59d904435a72b9d97bddece79692bef51a0fb030b277deb9dc69b75ebc38c6f",
false),
simple_seed(
"n1.redgold.io",
"0a250a230a2102e81515dfc521dbfa5ed4ea952f8d080612f1782063f97fe5bbe858c470710027",
"0a230a2103219cb61b1463c1c507501f6621d18092cf44ee9c49c8e998a56c638da5b03b07",
false),
simple_seed(
"n2.redgold.io",
"0a250a230a2103dc0949cb7027639a8500b43986e34fd5eff774d968cb84133160b3b330c259aa",
"0a230a2103413bfd6768962e291e57047459baff1be8869e185b75c06c99fde66899aeb787",
false),
simple_seed(
"n3.redgold.io",
"0a250a230a21022ac18c9106276a154abe929b1bb0f3b7004db924d62a2d37fc9c2a3f4f996c28",
"0a230a210274a5a0382173ab16706782caaa9c9b4c2bca8dcd5d6321460c8e5619be830913",
false),
simple_seed(
"n4.redgold.io",
"0a250a230a210322841b5833ddb734ecec64ffd03250141a22d34978626d8db670f5eb21fef14f",
"0a230a2103bac75d3501cfe5893324cc79bbfb91f471712547dc30b26b34f7fedcb05ce1fe",
false),
simple_seed(
"n5.redgold.io",
"0a250a230a21023e4471aa6ad46d04e6e92642b5d6b52ef968022568ee39241cdb6daea0c888a0",
"0a230a21022a557a6f3b27a5b734665231d9eca9b38cdb44fec8149fbc17c86249725951e9",
false),
simple_seed(
"n6.redgold.io",
"0a250a230a21020d55dcaed1ab7c1256e39d0acba37ba4f64c6e383a44d5a720a80b999077cb1b",
"0a230a21031b3b7c2c3ccf56994f684743128b444f302e450f9dd2a384424234f7fb0e71a2",
false),
simple_seed(
"n7.redgold.io",
"0a250a230a2102f9a82dcf906be252dcf65569860a1f3f573928166917d621c38466c4ebcb685b",
"0a230a2102f76a329c8c0b80ba973b28c048dcfdfc58b8f992ac13d85c31463d64dfc1482d",
false),
simple_seed(
"n0.redgold.io",
"0a250a230a2102ef6e72f7160edaf940d04790cf4e6ba9e6380672916cdb2ed01e25af8be849e7",
"0a230a21032b1b73342cc848b41d9b5a53ed67730be78222a6abf22650a22a4c079743d3f8",
true),
simple_seed(
"n1.redgold.io",
"0a250a230a210241f3e4dacd61bacc6bc4ea2731ac2d66431e676cc96b9dc238c362eb785b08ed",
"0a230a21024e866d93f75c46a9e3070d8d35af36946597ffaeced201b0e7158ac85008699d",
true),
simple_seed(
"n2.redgold.io",
"0a250a230a2103bf103bb4fab013c55bfeaf386466a82d82fe61e5a453c3a9d6aca3e4dfd246b2",
"0a230a2103316ce5f955360c9c4e1597bc041d0f14fa3d4b9691209d3beb64eb246ac44102",
true),
simple_seed(
"n3.redgold.io",
"0a250a230a21021158dc186923ab8a1dba1b19e8cd5017e0d104ac7ed203723464218b8c6663d2",
"0a230a210217b3a710fbcc8ac68ad7b5a7e5910b189e071348cf560c3db853bef4afcdafc6",
true),
simple_seed(
"n4.redgold.io",
"0a250a230a2103a744d97d4b509edc6020985720479f5804d630d6a9d707bf3fffd6790a5aa4ba",
"0a230a2103039218939094eeb8acafecb0a6387d1024b411d3b6341a3b1e73001b6d2e11f3",
true),
simple_seed(
"n5.redgold.io",
"0a250a230a2102661fd340f7ab50e4d33f23fedd040cafd70ade7cd0dec2eecbcdb6d6533597fd",
"0a230a2103787246687366699530545a73bfd5d66e6b5186924f363fe4bce27161e92de56f",
true),
simple_seed(
"n6.redgold.io",
"0a250a230a2103b0b884f2f4d4df42b85c3c43acb8a122ae051ca0ceb735b791198bf9a6629a28",
"0a230a210207df4c1553162abcb9d018528d89619b77241676d9c352105fd92fd20cfa19d6",
true),
simple_seed(
"n7.redgold.io",
"0a250a230a2103ac58ceacf822ef6208aeef0c439b66311cf7fc1108412a6d3378049977d939ad",
"0a230a2103ebcb86c597c5ab059077fe4bdfe7fe44dd9d1b6b63ffc2fb2af7e5448317cccb",
true),
]
}
pub fn get_seeds_by_env(env: &NetworkEnvironment) -> Vec<Seed> {
get_all_hardcoded_seeds().into_iter()
.filter(|s| {
let env_match = s.environments.contains(&(env.clone() as i32));
let all_env = s.environments.iter()
.find(|e|
NetworkEnvironment::from_i32(**e)
.map(|e| e.is_all())
.unwrap_or(false
)
).is_some();
let allow_all = all_env && !env.is_local_debug();
env_match || allow_all
})
.collect_vec()
}
pub fn get_seeds_by_env_time(env: &NetworkEnvironment, _time: i64) -> Vec<Seed> {
get_seeds_by_env(env)
}
fn get_seeds_csv() -> Vec<Seed> {
let activation_time = 0;
let contents = if current_time_millis() < activation_time {
include_str!("resources/seeds/seeds-old.csv")
} else {
include_str!("resources/seeds/seeds.csv")
};
let csv_records = parse_seeds_csv_resource(contents);
csv_records.iter().map(|r| {
let mut s = Seed::default();
s.external_address = r.external_address.clone();
s.environments = vec![NetworkEnvironment::parse(r.network_environment.clone()) as i32];
let mut t = TrustData::default();
t.with_label(r.score);
s.trust = vec![t];
s
}).collect_vec()
}
#[test]
fn debug() {
}