Add toml crate and update dependencies
This commit is contained in:
parent
0116dbea32
commit
d2a05ef0c3
@ -188,13 +188,13 @@ async def add_message(data: Dict[str, Any]):
|
||||
room_id = data['roomId']
|
||||
|
||||
if not is_self:
|
||||
if data.get('message').get('content') == '/bot':
|
||||
if content == '/bot':
|
||||
message = Message(content='icalingua bot test',
|
||||
room_id=data['roomId'])
|
||||
await sio.emit('sendMessage', message.to_json())
|
||||
elif data.get('message').get('content').startswith('=='):
|
||||
elif content.startswith('=='):
|
||||
|
||||
evals: str = data.get('message').get('content')[2:]
|
||||
evals: str = content[2:]
|
||||
|
||||
# quene = multiprocessing.Queue()
|
||||
# def run(quene, evals):
|
||||
@ -226,7 +226,7 @@ async def add_message(data: Dict[str, Any]):
|
||||
|
||||
await asyncio.sleep(random.random() * 2)
|
||||
await sio.emit('sendMessage', message.to_json())
|
||||
elif data['message']['content'] == '!!jrrp':
|
||||
elif content == '!!jrrp':
|
||||
randomer = random.Random(f'{sender_id}-{data["message"]["date"]}-jrrp-v2')
|
||||
result = randomer.randint(0, 50) + randomer.randint(0, 50)
|
||||
print(f'{sender_name} 今日人品值为 {result}')
|
||||
|
53
ica-rs/Cargo.lock
generated
53
ica-rs/Cargo.lock
generated
@ -545,6 +545,7 @@ dependencies = [
|
||||
"hex",
|
||||
"rust_socketio",
|
||||
"serde_json",
|
||||
"toml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1026,6 +1027,15 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_urlencoded"
|
||||
version = "0.7.1"
|
||||
@ -1248,6 +1258,40 @@ dependencies = [
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.8.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_edit",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.21.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower-service"
|
||||
version = "0.3.2"
|
||||
@ -1613,6 +1657,15 @@ version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "0.5.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c830786f7720c2fd27a1a0e27a709dbd3c4d009b56d098fc742d4f4eab91fe2"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winreg"
|
||||
version = "0.50.0"
|
||||
|
@ -11,6 +11,7 @@ ed25519-dalek = "2.1.0"
|
||||
hex = "0.4.3"
|
||||
rust_socketio = "0.4.4"
|
||||
serde_json = "1.0.108"
|
||||
toml = "0.8.8"
|
||||
|
||||
[patch.crates-io]
|
||||
rust_socketio = { path = "../../../rust-socketio/socketio" }
|
@ -1,25 +1,65 @@
|
||||
use serde_json::Value;
|
||||
use ed25519_dalek::{Signature, Signer, SigningKey};
|
||||
use rust_socketio::{ClientBuilder, Event, Payload, RawClient};
|
||||
|
||||
pub struct IcalinguaSinger {
|
||||
pub host: String,
|
||||
pub pub_key: SigningKey,
|
||||
pub private_key: SigningKey,
|
||||
}
|
||||
|
||||
impl IcalinguaSinger {
|
||||
pub fn new(host: String, pub_key: &str) -> Self {
|
||||
pub fn new_from_config(config_file_path: String) -> Self {
|
||||
// try read config from file
|
||||
let config = std::fs::read_to_string(config_file_path).expect("Failed to read config file");
|
||||
let config: toml::Value = toml::from_str(&config).expect("Failed to parse config file");
|
||||
let host = config["host"]
|
||||
.as_str()
|
||||
.expect("host should be string")
|
||||
.to_string();
|
||||
let pub_key = config["private_key"]
|
||||
.as_str()
|
||||
.expect("private_key should be string")
|
||||
.to_string();
|
||||
|
||||
Self::new_from_raw(host, pub_key)
|
||||
}
|
||||
|
||||
pub fn new_from_raw(host: String, pub_key: String) -> Self {
|
||||
let array_key: [u8; 32] = hex::decode(pub_key).unwrap().try_into().unwrap();
|
||||
|
||||
let signing_key: SigningKey = SigningKey::from_bytes(&array_key);
|
||||
Self {
|
||||
host,
|
||||
pub_key: signing_key,
|
||||
private_key: signing_key,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn sign_for_salt(&self, salt: String) -> Vec<u8> {
|
||||
let salt: Vec<u8> = hex::decode(salt).unwrap();
|
||||
let signature: Signature = self.pub_key.sign(salt.as_slice());
|
||||
let signature: Signature = self.private_key.sign(salt.as_slice());
|
||||
|
||||
signature.to_bytes().to_vec()
|
||||
}
|
||||
|
||||
pub fn sign_callback(&self, payload: Payload, client: RawClient, _id: Option<i32>) {
|
||||
let require_data = match payload {
|
||||
Payload::Text(json_value) => Some(json_value),
|
||||
_ => None,
|
||||
}
|
||||
.expect("Payload should be Json data");
|
||||
|
||||
let (auth_key, version) = (&require_data[0], &require_data[1]);
|
||||
// println!("auth_key: {:?}, version: {:?}", auth_key, version);
|
||||
let auth_key = match &require_data.get(0) {
|
||||
Some(Value::String(auth_key)) => Some(auth_key),
|
||||
_ => None,
|
||||
}
|
||||
.expect("auth_key should be string");
|
||||
|
||||
let salt = hex::decode(auth_key).expect("Got an invalid salt from the server");
|
||||
let signature: Signature = self.private_key.sign(salt.as_slice());
|
||||
|
||||
let sign = signature.to_bytes().to_vec();
|
||||
client.emit("auth", sign).unwrap();
|
||||
}
|
||||
}
|
||||
|
@ -5,68 +5,50 @@ use rust_socketio::{ClientBuilder, Event, Payload, RawClient};
|
||||
use serde_json::Value;
|
||||
use std::time::Duration;
|
||||
|
||||
#[allow(unused)]
|
||||
fn require_auth_callback(payload: Payload, client: RawClient, _id: Option<i32>) {
|
||||
let key = std::env::args().nth(2).expect("No key given");
|
||||
let require_data = match payload {
|
||||
Payload::Text(json_value) => Some(json_value),
|
||||
_ => None,
|
||||
}
|
||||
.expect("Payload should be Json data");
|
||||
|
||||
let (auth_key, version) = (&require_data[0], &require_data[1]);
|
||||
// println!("auth_key: {:?}, version: {:?}", auth_key, version);
|
||||
let auth_key = match &require_data.get(0) {
|
||||
Some(Value::String(auth_key)) => Some(auth_key),
|
||||
_ => None,
|
||||
}
|
||||
.expect("auth_key should be string");
|
||||
|
||||
let array_key: [u8; 32] = hex::decode(key)
|
||||
.expect("Key should be hex")
|
||||
.try_into()
|
||||
.expect("Key should be 32 bytes");
|
||||
|
||||
let signing_key = SigningKey::from_bytes(&array_key);
|
||||
|
||||
let salt = hex::decode(auth_key).expect("Got an invalid salt from the server");
|
||||
let signature: Signature = signing_key.sign(salt.as_slice());
|
||||
// let sign = hex::encode(signature.to_bytes());
|
||||
let sign = signature.to_bytes().to_vec();
|
||||
client.emit("auth", sign).unwrap();
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
fn any_event(event: Event, payload: Payload, _client: RawClient, id: Option<i32>) {
|
||||
println!("event: {} |{:?}|id{:?}", event, payload, id)
|
||||
match payload {
|
||||
Payload::Binary(ref data) => {
|
||||
println!("event: {} |{:?}|id{:?}", event, data, id)
|
||||
}
|
||||
Payload::Text(ref data) => {
|
||||
print!("\x1b[35mevent: {event}\x1b[0m");
|
||||
for value in data {
|
||||
print!("|{}", value.to_string());
|
||||
}
|
||||
println!("|id:{:?}|", id);
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
// println!("event: {} |{:?}|id{:?}", event, payload, id)
|
||||
}
|
||||
|
||||
fn ws_main() {
|
||||
// define a callback which is called when a payload is received
|
||||
// this callback gets the payload as well as an instance of the
|
||||
// socket to communicate with the server
|
||||
let connect_call_back = |payload: Payload, _client: RawClient, _id| {
|
||||
match payload {
|
||||
let connect_call_back = |payload: Payload, _client: RawClient, _id| match payload {
|
||||
Payload::Text(values) => {
|
||||
if let Some(value) = values.first() {
|
||||
if let Some("authSucceed") = value.as_str() {
|
||||
println!("\x1b[32m已经登录到 icalingua!\x1b[0m");
|
||||
}
|
||||
}
|
||||
},
|
||||
_ => ()
|
||||
}
|
||||
_ => (),
|
||||
};
|
||||
// 从命令行获取 host 和 key
|
||||
let host = std::env::args().nth(1).expect("No host given");
|
||||
// 从命令行获取配置文件路径
|
||||
let config_path = std::env::args().nth(1).expect("No config path given");
|
||||
let ica_singer = client::IcalinguaSinger::new_from_config(config_path);
|
||||
|
||||
// get a socket that is connected to the admin namespace
|
||||
|
||||
let socket = ClientBuilder::new(host)
|
||||
let socket = ClientBuilder::new(ica_singer.host.clone())
|
||||
// .namespace("/admin")
|
||||
.on_any(any_event)
|
||||
.on("message", connect_call_back)
|
||||
.on("requireAuth", require_auth_callback)
|
||||
.on("requireAuth", move |a, b, c| ica_singer.sign_callback(a, b, c))
|
||||
.connect()
|
||||
.expect("Connection failed");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user