summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-03-12 18:38:38 +0100
committermetamuffin <metamuffin@disroot.org>2025-03-12 18:38:38 +0100
commit11eb107fbc0a4d8f667b5fb201569ebd5dd49e77 (patch)
tree3f2f9f7708b1d6ee733e9675bd308df066a7bf38 /cli
parentdc8304afefa71037bea99722bee29f7645753836 (diff)
downloadweareserver-11eb107fbc0a4d8f667b5fb201569ebd5dd49e77.tar
weareserver-11eb107fbc0a4d8f667b5fb201569ebd5dd49e77.tar.bz2
weareserver-11eb107fbc0a4d8f667b5fb201569ebd5dd49e77.tar.zst
cli and respack works
Diffstat (limited to 'cli')
-rw-r--r--cli/Cargo.toml1
-rw-r--r--cli/src/main.rs91
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()?;
+ }
+ }
+ _ => (),
+ }
+ }
}