commit a657d2754e5e6101b3becd6a61e76519cb703830 Author: Andy Killorin <37423245+Speedy6451@users.noreply.github.com> Date: Sat Dec 16 11:57:42 2023 -0600 name generation diff --git a/server/Cargo.toml b/server/Cargo.toml new file mode 100644 index 0000000..fb14476 --- /dev/null +++ b/server/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "server" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.75" +axum = "0.7.2" +bit-struct = "0.3.2" +feistel_rs = "0.1.0" +rstar = "0.11.0" +rustmatica = "0.1.1" +tokio = { version = "1.0", features = ["full"] } +tower = { version = "0.4", features = ["util", "timeout", "load-shed", "limit"] } +tower-http = { version = "0.5.0", features = [ + "add-extension", + "auth", + "compression-full", + "limit", + "trace", +] } +tower-layer = "0.3.2" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } diff --git a/server/Makefile b/server/Makefile new file mode 100644 index 0000000..a347ff7 --- /dev/null +++ b/server/Makefile @@ -0,0 +1,8 @@ +surnames.txt: + curl https://raw.githubusercontent.com/Hyneman/moby-project/672f6bdca054c42d375f065ffee87e8ceba0c242/moby/mwords/21986na.mes |\ + iconv -f cp1252 - > surnames.txt + +names.txt: + curl https://raw.githubusercontent.com/Hyneman/moby-project/672f6bdca054c42d375f065ffee87e8ceba0c242/moby/mwords/3897male.nam > male.txt + curl https://raw.githubusercontent.com/Hyneman/moby-project/672f6bdca054c42d375f065ffee87e8ceba0c242/moby/mwords/4946fema.len > female.txt + cat male.txt female.txt | sort | uniq > names.txt diff --git a/server/order.txt b/server/order.txt new file mode 100644 index 0000000..ca07d4a --- /dev/null +++ b/server/order.txt @@ -0,0 +1,16 @@ +I +II +IIV +IV +V +VI +VII +IIX +IX +X +XI +XII +IIX +XIV +XV +XVI diff --git a/server/pronouns.txt b/server/pronouns.txt new file mode 100644 index 0000000..50c36c1 --- /dev/null +++ b/server/pronouns.txt @@ -0,0 +1,8 @@ +he/him +she/her +they/them +xe/xem +ze/zir +fae/faer +e/em + diff --git a/server/src/main.rs b/server/src/main.rs new file mode 100644 index 0000000..f26ca48 --- /dev/null +++ b/server/src/main.rs @@ -0,0 +1,33 @@ +use std::env::args; + +use axum::{ + routing::get, + Router, +}; +use anyhow::Error; +use rstar; +use rustmatica::BlockState; + +mod names; + + +struct ControlState { + //turtles: Vec, + //world: unimplemented!(), + //chunkloaders: unimplemented!(), + + +} + +#[tokio::main] +async fn main() -> Result<(), Error> { + println!("{}", names::Name::from_num(args().nth(1).unwrap().parse().unwrap()).to_str()); + println!("{:?}", feistel_rs::feistel_encrypt(&[127,127], &[127,127], 1)); + let serv = Router::new().route("/", get(|| async { "Hello" })); + + let listener = tokio::net::TcpListener::bind("0.0.0.0:48228").await.unwrap(); + + axum::serve(listener, serv).await.unwrap(); + + Ok(()) +} diff --git a/server/src/names.rs b/server/src/names.rs new file mode 100644 index 0000000..c12cb3c --- /dev/null +++ b/server/src/names.rs @@ -0,0 +1,94 @@ +use anyhow::Context; +use bit_struct::*; + +bit_struct! { + pub struct Name(u32) { + first: u13, + last: u14, + order: u3, + pronouns: u2, + } +} + +const FIRST_NAMES: &str = include_str!("../names.txt"); +const LAST_NAMES: &str = include_str!("../surnames.txt"); +const ORDER: &str = include_str!("../order.txt"); +const PRONOUNS: &str = include_str!("../pronouns.txt"); + +impl Name { + pub fn from_str(name: &str) -> anyhow::Result { + let parts: Vec<&str> = name.splitn(4, ' ').collect(); + let (first, last, order, pronouns) = (parts[0], parts[1], parts[2], parts[3]); + + let first = FIRST_NAMES.lines().position(|x| *x == *first).map(|n| u13::new(n as u16)).context("unknown first name")?; + let last = LAST_NAMES.lines().position(|x| *x == *last).map(|n| u14::new(n as u16)).context("unknown last name")?; + let order = ORDER.lines().position(|x| *x == *order).map(|n| u3::new(n as u8)).context("unknown title")?; + let pronouns = PRONOUNS.lines().position(|x| *x == *pronouns).map(|n| u2::new(n as u8)).context("invalid gender")?; + + // first name 14 bits + // last name 13 bits + // order 3 bits + // pronouns 2 bits + + + // TODO: trim tables to avoid "zach" crashes + Ok(Name::new(first.unwrap(), last.unwrap(), order.unwrap(), pronouns.unwrap())) + } + + pub fn from_num(name: u32) -> Self { + // This is ok because every possible value is valid + unsafe { + Name(UnsafeStorage::new_unsafe(name)) + } + } + + pub fn to_num(self) -> u32 { + self.raw() + } + + pub fn to_str(&mut self) -> String { + let first = FIRST_NAMES.lines().nth(self.first().get().value() as usize).unwrap(); + let last = LAST_NAMES.lines().nth(self.last().get().value() as usize).unwrap(); + let order = ORDER.lines().nth(self.order().get().value() as usize).unwrap(); + let pronouns = PRONOUNS.lines().nth(self.pronouns().get().value() as usize).unwrap(); + + let mut name = String::new(); + name.push_str(first); + name.push(' '); + name.push_str(last); + name.push(' '); + name.push_str(order); + name.push(' '); + name.push_str(pronouns); + name + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn test_to_from(num: u32) -> u32 { + let name = Name::from_num(num).to_str(); + + Name::from_str(&name).unwrap().to_num() + } + + #[test] + fn middling() { + const TEST_NUM: u32 = 6522345; + assert_eq!(TEST_NUM, test_to_from(TEST_NUM)); + } + + #[test] + fn small() { + const TEST_NUM: u32 = u32::MIN; + assert_eq!(TEST_NUM, test_to_from(TEST_NUM)); + } + + #[test] + fn big() { + const TEST_NUM: u32 = u32::MAX - 1; + assert_eq!(TEST_NUM, test_to_from(TEST_NUM)); + } +}