forked from lavina/lavina
1
0
Fork 0

some work

This commit is contained in:
Nikita Vilunov 2023-10-01 00:43:10 +02:00
parent 4433666b55
commit ab83c24000
4 changed files with 163 additions and 205 deletions

217
Cargo.lock generated
View File

@ -371,15 +371,6 @@ dependencies = [
"serde",
]
[[package]]
name = "encoding_rs"
version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
dependencies = [
"cfg-if",
]
[[package]]
name = "equivalent"
version = "1.0.1"
@ -582,31 +573,6 @@ version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
[[package]]
name = "h2"
version = "0.3.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833"
dependencies = [
"bytes",
"fnv",
"futures-core",
"futures-sink",
"futures-util",
"http",
"indexmap 1.9.3",
"slab",
"tokio",
"tokio-util",
"tracing",
]
[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "hashbrown"
version = "0.14.0"
@ -623,7 +589,7 @@ version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f"
dependencies = [
"hashbrown 0.14.0",
"hashbrown",
]
[[package]]
@ -685,17 +651,6 @@ dependencies = [
"itoa",
]
[[package]]
name = "http-body"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
dependencies = [
"bytes",
"http",
"pin-project-lite",
]
[[package]]
name = "http-body"
version = "1.0.0-rc.2"
@ -715,7 +670,7 @@ dependencies = [
"bytes",
"futures-util",
"http",
"http-body 1.0.0-rc.2",
"http-body",
"pin-project-lite",
]
@ -731,30 +686,6 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "hyper"
version = "0.14.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468"
dependencies = [
"bytes",
"futures-channel",
"futures-core",
"futures-util",
"h2",
"http",
"http-body 0.4.5",
"httparse",
"httpdate",
"itoa",
"pin-project-lite",
"socket2 0.4.9",
"tokio",
"tower-service",
"tracing",
"want",
]
[[package]]
name = "hyper"
version = "1.0.0-rc.3"
@ -766,7 +697,7 @@ dependencies = [
"futures-core",
"futures-util",
"http",
"http-body 1.0.0-rc.2",
"http-body",
"httparse",
"httpdate",
"itoa",
@ -786,16 +717,6 @@ dependencies = [
"unicode-normalization",
]
[[package]]
name = "indexmap"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
"hashbrown 0.12.3",
]
[[package]]
name = "indexmap"
version = "2.0.0"
@ -803,7 +724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
dependencies = [
"equivalent",
"hashbrown 0.14.0",
"hashbrown",
]
[[package]]
@ -812,12 +733,6 @@ version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
[[package]]
name = "ipnet"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
[[package]]
name = "itertools"
version = "0.10.5"
@ -853,7 +768,7 @@ dependencies = [
"figment",
"futures-util",
"http-body-util",
"hyper 1.0.0-rc.3",
"hyper",
"lazy_static",
"mgmt-api",
"nom",
@ -862,7 +777,6 @@ dependencies = [
"proto-irc",
"quick-xml",
"regex",
"reqwest",
"rustls-pemfile",
"serde",
"serde_json",
@ -950,12 +864,6 @@ dependencies = [
"serde",
]
[[package]]
name = "mime"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
@ -1354,40 +1262,6 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
[[package]]
name = "reqwest"
version = "0.11.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1"
dependencies = [
"base64",
"bytes",
"encoding_rs",
"futures-core",
"futures-util",
"h2",
"http",
"http-body 0.4.5",
"hyper 0.14.27",
"ipnet",
"js-sys",
"log",
"mime",
"once_cell",
"percent-encoding",
"pin-project-lite",
"serde",
"serde_json",
"serde_urlencoded",
"tokio",
"tower-service",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"winreg",
]
[[package]]
name = "ring"
version = "0.16.20"
@ -1552,18 +1426,6 @@ dependencies = [
"serde",
]
[[package]]
name = "serde_urlencoded"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
dependencies = [
"form_urlencoded",
"itoa",
"ryu",
"serde",
]
[[package]]
name = "sha1"
version = "0.10.5"
@ -1618,7 +1480,18 @@ dependencies = [
name = "sim-irc"
version = "0.0.1-dev"
dependencies = [
"anyhow",
"clap",
"http-body-util",
"hyper",
"mgmt-api",
"proto-irc",
"rand",
"serde",
"serde_json",
"tokio",
"tracing",
"tracing-subscriber",
]
[[package]]
@ -1636,16 +1509,6 @@ version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
[[package]]
name = "socket2"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
dependencies = [
"libc",
"winapi",
]
[[package]]
name = "socket2"
version = "0.5.3"
@ -1727,7 +1590,7 @@ dependencies = [
"futures-util",
"hashlink",
"hex",
"indexmap 2.0.0",
"indexmap",
"log",
"memchr",
"once_cell",
@ -1999,7 +1862,7 @@ dependencies = [
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
"socket2 0.5.3",
"socket2",
"tokio-macros",
"windows-sys",
]
@ -2025,20 +1888,6 @@ dependencies = [
"tokio",
]
[[package]]
name = "tokio-util"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
dependencies = [
"bytes",
"futures-core",
"futures-sink",
"pin-project-lite",
"tokio",
"tracing",
]
[[package]]
name = "toml"
version = "0.7.6"
@ -2066,19 +1915,13 @@ version = "0.19.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a"
dependencies = [
"indexmap 2.0.0",
"indexmap",
"serde",
"serde_spanned",
"toml_datetime",
"winnow",
]
[[package]]
name = "tower-service"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
[[package]]
name = "tracing"
version = "0.1.37"
@ -2282,18 +2125,6 @@ dependencies = [
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-futures"
version = "0.4.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03"
dependencies = [
"cfg-if",
"js-sys",
"wasm-bindgen",
"web-sys",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.87"
@ -2436,16 +2267,6 @@ dependencies = [
"memchr",
]
[[package]]
name = "winreg"
version = "0.50.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
dependencies = [
"cfg-if",
"windows-sys",
]
[[package]]
name = "yansi"
version = "1.0.0-rc.1"

View File

@ -18,6 +18,10 @@ anyhow = "1.0.68" # error utils
nonempty = "0.8.1"
clap = { version = "4.4.4", features = ["derive"] }
serde = { version = "1.0.152", features = ["rc", "serde_derive"] }
tracing = "0.1.37" # logging & tracing api
tracing-subscriber = "0.3.16"
http-body-util = "0.1.0-rc.3"
serde_json = "1.0.93"
[package]
name = "lavina"
@ -29,12 +33,12 @@ publish = false
anyhow.workspace = true
figment = { version = "0.10.8", features = ["env", "toml"] } # configuration files
hyper = { version = "1.0.0-rc.3,<1.0.0-rc.4", features = ["server", "http1"] } # http server
http-body-util = "0.1.0-rc.3"
http-body-util.workspace = true
serde.workspace = true
serde_json = "1.0.93"
serde_json.workspace = true
tokio.workspace = true
tracing = "0.1.37" # logging & tracing api
tracing-subscriber = "0.3.16"
tracing.workspace = true
tracing-subscriber.workspace = true
futures-util.workspace = true
prometheus = { version = "0.13.3", default-features = false }
regex = "1.7.1"
@ -54,4 +58,3 @@ clap.workspace = true
[dev-dependencies]
assert_matches.workspace = true
regex = "1.7.1"
reqwest = { version = "0.11", default-features = false }

View File

@ -5,3 +5,14 @@ version.workspace = true
[dependencies]
proto-irc = { path = "../proto-irc" }
mgmt-api = { path = "../mgmt-api" }
clap.workspace = true
tracing.workspace = true
tracing-subscriber.workspace = true
rand = "0.8.5"
tokio.workspace = true
anyhow.workspace = true
hyper = { version = "1.0.0-rc.3,<1.0.0-rc.4", features = ["client", "http1"] }
http-body-util.workspace = true
serde.workspace = true
serde_json = "1.0.93"

View File

@ -1,3 +1,126 @@
fn main() {
println!("Hello, world!");
use anyhow::Result;
use clap::Parser;
use http_body_util::Full;
use hyper::body::{Bytes, Incoming};
use hyper::client::conn::http1::SendRequest;
use hyper::{Request, Response};
use rand::prelude::Distribution;
use rand::{distributions::Uniform, Rng};
use serde::Serialize;
use std::net::SocketAddr;
use std::sync::Arc;
use tokio::io::{AsyncWriteExt, BufReader};
use tokio::net::tcp::{ReadHalf, WriteHalf};
use tokio::net::TcpStream;
use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
#[derive(Parser)]
struct CliArgs {
/// Management API address
#[arg(long)]
mgmt: SocketAddr,
/// IRC server address
#[arg(long)]
irc: SocketAddr,
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
let args = CliArgs::parse();
let mut gen = rand::thread_rng();
tracing::info!("Starting");
let stream = TcpStream::connect(args.mgmt).await?;
let (mut request_sender, connection) = hyper::client::conn::http1::handshake(stream).await?;
tracing::info!("Mgmt connected");
let fiber = tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("Error in connection: {}", e);
}
});
let name = generate_player_name(&mut gen);
let pass = generate_password(&mut gen);
{
let v = mgmt_api::CreatePlayerRequest { name: &*name };
let response = http_send(&mut request_sender, mgmt_api::paths::CREATE_PLAYER, &v).await?;
assert!(response.status().is_success());
tracing::info!("Player {} created", name);
}
{
let v = mgmt_api::ChangePasswordRequest {
player_name: &*name,
password: &*pass,
};
let response = http_send(&mut request_sender, mgmt_api::paths::SET_PASSWORD, &v).await?;
assert!(response.status().is_success());
tracing::info!("Password set for {}", name);
}
drop(request_sender);
fiber.await?;
let mut stream = TcpStream::connect(args.irc).await?;
tracing::info!("IRC connected");
let (reader, writer) = stream.split();
let reader = BufReader::new(reader);
let test_scope = TestScope { reader, writer, buffer: vec![] };
test_scope.send(&format!("PASS {pass}")).await?;
test_scope.send(&format!("NICK {name}")).await?;
test_scope.send(&format!("USER UserName 0 * :Real Name")).await?;
stream.shutdown().await?;
Ok(())
}
struct TestScope<'a> {
reader: BufReader<ReadHalf<'a>>,
writer: WriteHalf<'a>,
buffer: Vec<u8>,
}
impl<'a> TestScope<'a> {
async fn send(&mut self, str: &(impl AsRef<str> + ?Sized)) -> Result<()> {
self.writer.write_all(str.as_ref().as_bytes()).await?;
self.writer.write_all(b"\r\n").await?;
self.writer.flush().await?;
Ok(())
}
async fn assert(&mut self, f: impl FnOnce(&str) -> Result<()>) -> Result<()> {
let len = self.reader.read_until(b'\n', &mut self.buffer).await?;
let res = f(std::str::from_utf8(&self.buffer[0..len])?);
self.buffer.clear();
res
}
}
async fn http_send(
client: &mut SendRequest<Full<Bytes>>,
path: &str,
payload: &impl Serialize,
) -> Result<Response<Incoming>> {
let mut buffer = vec![];
serde_json::to_writer(&mut buffer, payload).expect("unexpected fail when writing to vec");
let body = Full::new(Bytes::from(buffer));
let request = Request::builder().method("POST").uri(path).body(body)?;
let response = client.send_request(request).await?;
Ok(response)
}
fn generate_player_name(gen: &mut impl Rng) -> Arc<str> {
let len = Uniform::from(7..14).sample(gen);
gen.sample_iter(Uniform::from('a'..'z'))
.take(len)
.collect::<String>()
.into()
}
fn generate_password(gen: &mut impl Rng) -> Arc<str> {
let len = Uniform::from(8..32).sample(gen);
gen.sample_iter(Uniform::from('0'..'z'))
.take(len)
.collect::<String>()
.into()
}