diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-12 18:38:38 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-12 18:38:38 +0100 |
commit | 11eb107fbc0a4d8f667b5fb201569ebd5dd49e77 (patch) | |
tree | 3f2f9f7708b1d6ee733e9675bd308df066a7bf38 /cli | |
parent | dc8304afefa71037bea99722bee29f7645753836 (diff) | |
download | weareserver-11eb107fbc0a4d8f667b5fb201569ebd5dd49e77.tar weareserver-11eb107fbc0a4d8f667b5fb201569ebd5dd49e77.tar.bz2 weareserver-11eb107fbc0a4d8f667b5fb201569ebd5dd49e77.tar.zst |
cli and respack works
Diffstat (limited to 'cli')
-rw-r--r-- | cli/Cargo.toml | 1 | ||||
-rw-r--r-- | cli/src/main.rs | 91 |
2 files changed, 90 insertions, 2 deletions
diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 84587ba..535553b 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -12,3 +12,4 @@ anyhow = "1.0.95" clap = { version = "4.5.23", features = ["derive"] } env_logger = "0.11.6" weareshared = { path = "../shared" } +log = "0.4.26" diff --git a/cli/src/main.rs b/cli/src/main.rs index e7a11a9..9cf5e3a 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,3 +1,90 @@ -fn main() { - println!("Hello, world!"); +#![feature(random)] +use std::{ + fs::File, + io::Write, + net::{SocketAddr, TcpStream}, + path::PathBuf, + random::random, +}; + +use anyhow::Result; +use clap::{Parser, Subcommand}; +use log::info; +use weareshared::{ + helper::ReadWrite, + packets::{Data, Object, Packet}, + respack::RespackReader, + store::ResourceStore, +}; + +#[derive(Parser)] +struct Args { + #[clap(subcommand)] + action: Action, +} + +#[derive(Subcommand)] +enum Action { + Add(Add), +} + +#[derive(Parser)] +struct Add { + address: SocketAddr, + pack: PathBuf, + #[arg(short = 'A', long)] + announce: bool, + #[arg(short, long)] + add: bool, + #[arg(short, long)] + disown: bool, +} + +fn main() -> Result<()> { + env_logger::init_from_env("LOG"); + let args = Args::parse(); + + match args.action { + Action::Add(a) => action_add(a), + } +} + +fn action_add(args: Add) -> Result<()> { + info!("loading pack"); + let pack = RespackReader::open(File::open(&args.pack)?)?; + let entry = pack.entry().unwrap(); + let store = ResourceStore::new_respack(pack)?; + let entry = store.get(entry)?.unwrap(); + + info!("connecting"); + let mut sock = TcpStream::connect(args.address)?; + Packet::Connect(random()).write(&mut sock)?; + for p in entry.c_prefab { + info!("adding {p}"); + if args.announce { + Packet::AnnouncePrefab(p.clone()).write(&mut sock)?; + } + if args.add { + let ob = Object::new(); + Packet::Add(ob, p.clone()).write(&mut sock)?; + if args.disown { + // TODO disown packet once it exists + } + } + } + sock.flush()?; + + info!("idling for resource requests"); + loop { + let packet = Packet::read(&mut sock)?; + match packet { + Packet::RequestResource(hash) => { + if let Some(d) = store.get_raw(hash)? { + Packet::RespondResource(hash, Data(d)).write(&mut sock)?; + sock.flush()?; + } + } + _ => (), + } + } } |