From 1f378cd15f967f06958b21373a16b8114da3b900 Mon Sep 17 00:00:00 2001 From: huangzhe <3451701311@qq.com> Date: Wed, 30 Jul 2025 23:46:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=20db=20=E7=9A=84?= =?UTF-8?q?=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + db.sqlite | 0 packages/gotify-ws/Cargo.toml | 3 + packages/gotify-ws/src/main.rs | 66 ++++++++----------- packages/gotify-ws/src/model/ws.rs | 2 +- packages/gotify-ws/src/utils/mod.rs | 3 +- packages/gotify-ws/src/utils/sql/mod.rs | 1 + .../gotify-ws/src/utils/sql/sqlite/mod.rs | 31 +++++++++ .../src/utils/sql/sqlite/sql_line.rs | 15 +++++ packages/home-api/src/test/sqlite.rs | 2 +- packages/home-api/src/utils/database.rs | 2 +- rustfmt.toml | 4 ++ 12 files changed, 89 insertions(+), 41 deletions(-) create mode 100644 db.sqlite create mode 100644 packages/gotify-ws/src/utils/sql/mod.rs create mode 100644 packages/gotify-ws/src/utils/sql/sqlite/mod.rs create mode 100644 packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs create mode 100644 rustfmt.toml diff --git a/Cargo.toml b/Cargo.toml index 6469c4f..e9cc434 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,4 @@ [workspace] resolver = "2" members = ["packages/gotify-ws", "packages/home-api"] +default-members = ["packages/gotify-ws"] \ No newline at end of file diff --git a/db.sqlite b/db.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/packages/gotify-ws/Cargo.toml b/packages/gotify-ws/Cargo.toml index 9560bfd..5a54823 100644 --- a/packages/gotify-ws/Cargo.toml +++ b/packages/gotify-ws/Cargo.toml @@ -7,6 +7,9 @@ edition = "2024" env_logger = "0.11.8" futures = "0.3.31" log = "0.4.27" +r2d2 = "0.8.10" +r2d2_sqlite = "0.31.0" +rusqlite = { version = "0.37.0", features = ["bundled"] } serde = { version = "1.0.219", features = ["derive"] } serde_json = "1.0.133" tokio = { version = "1.47.0", features = ["full"] } diff --git a/packages/gotify-ws/src/main.rs b/packages/gotify-ws/src/main.rs index ae3cec1..9d579d4 100644 --- a/packages/gotify-ws/src/main.rs +++ b/packages/gotify-ws/src/main.rs @@ -1,48 +1,40 @@ -mod utils; mod model; +mod utils; +use crate::model::ws::WsMessage; use futures::StreamExt; use log::info; use serde_json; use tokio_tungstenite::connect_async; -use utils::logger; -use crate::model::ws::WsMessage; - +use utils::{logger, sql}; +use utils::sql::sqlite::SqliteDB; #[tokio::main] async fn main() { - logger::init_logger(); - const WS: &str = "wss://home.hzer.xyz/gotify/stream?token=CDIwYlYJuxWxVr5"; - - match connect_async(WS).await { - Ok((stream, _)) => { - info!("Connected to Gotify server {WS}"); - - let (_, mut read) = stream.split(); - while let Some(msg) = read.next().await { - match msg { - Ok(tokio_tungstenite::tungstenite::Message::Text(text)) => { - info!("Received text message: {}", text); - match serde_json::from_str::(&text) { - Ok(ws_msg) => { - info!("Parsed message: {ws_msg:?}"); - } - Err(e) => { - info!("Failed to parse message: {e}"); - } - } - } - Ok(other_msg) => { - info!("Received non-text message: {other_msg:?}"); - } - Err(e) => { - info!("Error receiving message: {e}"); - break; - } - } - } - } - Err(e) => { - info!("Failed to connect to Gotify server: {e}"); + logger::init_logger(); + const WS: &str = "wss://home.hzer.xyz/gotify/stream?token=CDIwYlYJuxWxVr5"; + let (stream, _) = connect_async(WS).await.unwrap(); + info!("Connected to Gotify server {WS}"); + + let (_, mut read) = stream.split(); + while let Some(msg) = read.next().await { + match msg { + Ok(msg) => { + let str = msg.to_text().unwrap().to_string(); + match serde_json::from_str::(&str) { + Ok(ws) => { + info!("Got {} from Gotify", ws.message); + let db = SqliteDB::new("db.sqlite").unwrap(); + db.create_table(); + } + Err(_) => { + info!("监听到心跳{}", &str) + } } + } + Err(e) => { + info!("Error receiving message: {e}"); + break; + } } + } } diff --git a/packages/gotify-ws/src/model/ws.rs b/packages/gotify-ws/src/model/ws.rs index e122233..f69910e 100644 --- a/packages/gotify-ws/src/model/ws.rs +++ b/packages/gotify-ws/src/model/ws.rs @@ -2,7 +2,7 @@ pub struct WsMessage { id: u64, appid: u64, - message: String, + pub message: String, title: String, priority: u64, date: String, diff --git a/packages/gotify-ws/src/utils/mod.rs b/packages/gotify-ws/src/utils/mod.rs index 7204c8c..94df7ff 100644 --- a/packages/gotify-ws/src/utils/mod.rs +++ b/packages/gotify-ws/src/utils/mod.rs @@ -1 +1,2 @@ -pub mod logger; \ No newline at end of file +pub mod logger; +pub mod sql; \ No newline at end of file diff --git a/packages/gotify-ws/src/utils/sql/mod.rs b/packages/gotify-ws/src/utils/sql/mod.rs new file mode 100644 index 0000000..78f2d8f --- /dev/null +++ b/packages/gotify-ws/src/utils/sql/mod.rs @@ -0,0 +1 @@ +pub mod sqlite; \ No newline at end of file diff --git a/packages/gotify-ws/src/utils/sql/sqlite/mod.rs b/packages/gotify-ws/src/utils/sql/sqlite/mod.rs new file mode 100644 index 0000000..bcd4bb1 --- /dev/null +++ b/packages/gotify-ws/src/utils/sql/sqlite/mod.rs @@ -0,0 +1,31 @@ +mod sql_line; + +use log::warn; +use r2d2::{Pool}; +use r2d2_sqlite::SqliteConnectionManager; +use crate::utils::sql::sqlite::sql_line::{generate_sql_line}; + +#[derive(Debug)] +pub struct SqliteDB { + pub connection_pool: Pool, +} + +impl SqliteDB { + pub fn new(address: &str) -> Option { + let manager = SqliteConnectionManager::file(address); + match Pool::builder().build(manager) { + Ok(pool) => Some(SqliteDB { + connection_pool: pool + }), + Err(e) => { + warn!("Failed to create connection pool: {}", e); + None + } + } + } + pub fn create_table(&self) { + let conn = self.connection_pool.get().unwrap(); + let line = generate_sql_line(); + conn.execute(line.get("create_table").unwrap(), []).expect(&format!("Failed to create db table: {:?}", self)); + } +} \ No newline at end of file diff --git a/packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs b/packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs new file mode 100644 index 0000000..391e088 --- /dev/null +++ b/packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs @@ -0,0 +1,15 @@ +use std::collections::HashMap; + +pub fn generate_sql_line() -> HashMap<&'static str, &'static str> { + let mut line = HashMap::new(); + line.insert("create_table", " + CREATE TABLE IF NOT EXISTS gotify ( + id INTEGER PRIMARY KEY, + appid INTEGER, + message TEXT, + title TEXT, + priority INTEGER, + date TEXT + "); + line +} \ No newline at end of file diff --git a/packages/home-api/src/test/sqlite.rs b/packages/home-api/src/test/sqlite.rs index cb741d1..b1334da 100644 --- a/packages/home-api/src/test/sqlite.rs +++ b/packages/home-api/src/test/sqlite.rs @@ -10,7 +10,7 @@ mod sqlite { #[test] fn init() { - let manager = SqliteConnectionManager::file("database.sqlite"); + let manager = SqliteConnectionManager::file("database.mod"); let pool = r2d2::Pool::new(manager).unwrap(); let file = File::open("./resources/ID/id.txt").unwrap(); diff --git a/packages/home-api/src/utils/database.rs b/packages/home-api/src/utils/database.rs index 0ca5e13..db7b370 100644 --- a/packages/home-api/src/utils/database.rs +++ b/packages/home-api/src/utils/database.rs @@ -9,7 +9,7 @@ pub struct SqliteState { } pub fn init_database() -> Data { - let db = SqliteConnectionManager::file("./database.sqlite"); + let db = SqliteConnectionManager::file("./database.mod"); let pool = Pool::new(db).unwrap(); Data::new(SqliteState { pool: pool.clone() }) } diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..559c1d5 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,4 @@ +# Rust 格式化配置 +tab_spaces = 2 # 设置缩进为2个空格 +max_width = 100 # 每行最大宽度 +edition = "2025" # 使用Rust 2021版本