From eb1a7f0b0def1a1aa449552ee8f5e8e324ab865a Mon Sep 17 00:00:00 2001 From: hosted-fornet Date: Mon, 1 Apr 2024 13:05:49 -0700 Subject: [PATCH] new: add send script to chat --- src/new/templates/rust/no-ui/chat/Cargo.toml_ | 1 + .../rust/no-ui/chat/pkg/scripts.json | 13 ++++ .../rust/no-ui/chat/send/Cargo.toml_ | 17 +++++ .../templates/rust/no-ui/chat/send/src/lib.rs | 62 +++++++++++++++++++ 4 files changed, 93 insertions(+) create mode 100644 src/new/templates/rust/no-ui/chat/pkg/scripts.json create mode 100644 src/new/templates/rust/no-ui/chat/send/Cargo.toml_ create mode 100644 src/new/templates/rust/no-ui/chat/send/src/lib.rs diff --git a/src/new/templates/rust/no-ui/chat/Cargo.toml_ b/src/new/templates/rust/no-ui/chat/Cargo.toml_ index 31d65e6d..b1993b8b 100644 --- a/src/new/templates/rust/no-ui/chat/Cargo.toml_ +++ b/src/new/templates/rust/no-ui/chat/Cargo.toml_ @@ -2,6 +2,7 @@ resolver = "2" members = [ "{package_name}", + "send", ] [profile.release] diff --git a/src/new/templates/rust/no-ui/chat/pkg/scripts.json b/src/new/templates/rust/no-ui/chat/pkg/scripts.json new file mode 100644 index 00000000..ba63df9e --- /dev/null +++ b/src/new/templates/rust/no-ui/chat/pkg/scripts.json @@ -0,0 +1,13 @@ +{ + "send.wasm": { + "root": false, + "public": false, + "request_networking": false, + "request_capabilities": [ + "{package_name}:{package_name}:{publisher}" + ], + "grant_capabilities": [ + "{package_name}:{package_name}:{publisher}" + ] + } +} diff --git a/src/new/templates/rust/no-ui/chat/send/Cargo.toml_ b/src/new/templates/rust/no-ui/chat/send/Cargo.toml_ new file mode 100644 index 00000000..572cad7a --- /dev/null +++ b/src/new/templates/rust/no-ui/chat/send/Cargo.toml_ @@ -0,0 +1,17 @@ +[package] +name = "send" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0" +kinode_process_lib = { git = "https://github.com/kinode-dao/process_lib", tag = "v0.6.0" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +wit-bindgen = { git = "https://github.com/bytecodealliance/wit-bindgen", rev = "21a46c7" } + +[lib] +crate-type = ["cdylib"] + +[package.metadata.component] +package = "kinode:process" diff --git a/src/new/templates/rust/no-ui/chat/send/src/lib.rs b/src/new/templates/rust/no-ui/chat/send/src/lib.rs new file mode 100644 index 00000000..0d659b3c --- /dev/null +++ b/src/new/templates/rust/no-ui/chat/send/src/lib.rs @@ -0,0 +1,62 @@ +use serde::{Deserialize, Serialize}; + +use kinode_process_lib::{ + await_next_request_body, call_init, println, Address, Message, Request, +}; + +wit_bindgen::generate!({ + path: "wit", + world: "process", + exports: { + world: Component, + }, +}); + +#[derive(Debug, Serialize, Deserialize)] +enum ChatRequest { + Send { target: String, message: String }, + History, +} + +#[derive(Debug, Serialize, Deserialize)] +enum ChatResponse { + Ack, + History { messages: MessageArchive }, +} + +type MessageArchive = Vec<(String, String)>; + +call_init!(init); +fn init(our: Address) { + let Ok(body) = await_next_request_body() else { + println!("failed to get args!"); + return; + }; + + let args = String::from_utf8(body).unwrap_or_default(); + + let Some((target, message)) = args.split_once(" ") else { + println!("usage:\nsend:{package_name}:{publisher} target message"); + return; + }; + + let Ok(Ok(Message::Response { body, .. })) = + Request::to((our.node(), ("{package_name}", "{package_name}", "{publisher}"))) + .body( + serde_json::to_vec(&ChatRequest::Send { + target: target.into(), + message: message.into(), + }) + .unwrap(), + ) + .send_and_await_response(5) + else { + println!("did not receive expected Response from {package_name}:{package_name}:{publisher}"); + return; + }; + + let Ok(ChatResponse::Ack) = serde_json::from_slice(&body) else { + println!("did not receive expected Ack from {package_name}:{package_name}:{publisher}"); + return; + }; +}