mirror of
http://shenjack.top:5100/shenjack/icalingua-python-bot.git
synced 2024-11-23 12:41:05 +08:00
tailchat p 5
This commit is contained in:
parent
427b113312
commit
3d81fce13b
|
@ -113,6 +113,26 @@ impl BotConfig {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 检查是否启用 Tailchat
|
||||||
|
pub fn check_tailchat(&self) -> bool {
|
||||||
|
match self.enable_tailchat {
|
||||||
|
Some(enable) => {
|
||||||
|
if enable && self.tailchat.is_none() {
|
||||||
|
warn!("enable_tailchat 为 true 但未填写 [tailchat] 配置\n将不启用 Tailchat");
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
if self.tailchat.is_some() {
|
||||||
|
warn!("未填写 enable_tailchat 但填写了 [tailchat] 配置\n将不启用 Tailchat");
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// 检查是否启用 Python 插件
|
/// 检查是否启用 Python 插件
|
||||||
pub fn check_py(&self) -> bool {
|
pub fn check_py(&self) -> bool {
|
||||||
match self.enable_py {
|
match self.enable_py {
|
||||||
|
@ -134,5 +154,6 @@ impl BotConfig {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ica(&self) -> IcaConfig { self.ica.clone().expect("No ica config found") }
|
pub fn ica(&self) -> IcaConfig { self.ica.clone().expect("No ica config found") }
|
||||||
|
pub fn tailchat(&self) -> TailchatConfig { self.tailchat.clone().expect("No tailchat config found") }
|
||||||
pub fn py(&self) -> PyConfig { self.py.clone().expect("No py config found") }
|
pub fn py(&self) -> PyConfig { self.py.clone().expect("No py config found") }
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ use tracing::{event, info, span, Level};
|
||||||
pub static mut MAIN_STATUS: status::BotStatus = status::BotStatus {
|
pub static mut MAIN_STATUS: status::BotStatus = status::BotStatus {
|
||||||
config: None,
|
config: None,
|
||||||
ica_status: None,
|
ica_status: None,
|
||||||
|
tailchat_status: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub type MainStatus = status::BotStatus;
|
pub type MainStatus = status::BotStatus;
|
||||||
|
@ -80,6 +81,18 @@ async fn main() {
|
||||||
event!(Level::INFO, "未启用 ica");
|
event!(Level::INFO, "未启用 ica");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let (tailchat_send, tailchat_recv) = tokio::sync::oneshot::channel::<()>();
|
||||||
|
|
||||||
|
if bot_config.check_tailchat() {
|
||||||
|
event!(Level::INFO, "启动 Tailchat");
|
||||||
|
let config = bot_config.tailchat();
|
||||||
|
tokio::spawn(async move {
|
||||||
|
tailchat::start_tailchat(config, tailchat_recv).await.unwrap();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
event!(Level::INFO, "未启用 Tailchat");
|
||||||
|
}
|
||||||
|
|
||||||
tokio::time::sleep(Duration::from_secs(2)).await;
|
tokio::time::sleep(Duration::from_secs(2)).await;
|
||||||
// 等待一个输入
|
// 等待一个输入
|
||||||
info!("Press any key to exit");
|
info!("Press any key to exit");
|
||||||
|
@ -87,6 +100,7 @@ async fn main() {
|
||||||
std::io::stdin().read_line(&mut input).unwrap();
|
std::io::stdin().read_line(&mut input).unwrap();
|
||||||
|
|
||||||
ica_send.send(()).ok();
|
ica_send.send(()).ok();
|
||||||
|
tailchat_send.send(()).ok();
|
||||||
|
|
||||||
info!("Disconnected");
|
info!("Disconnected");
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,7 +169,7 @@ pub async fn ica_delete_message_py(msg_id: ica::MessageId, client: &Client) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn tailchat_new_message_py(message: tailchat::messages::ReciveMessage, client: &Client) {
|
pub async fn tailchat_new_message_py(message: &tailchat::messages::ReciveMessage, client: &Client) {
|
||||||
verify_plugins();
|
verify_plugins();
|
||||||
|
|
||||||
let plugins = PyStatus::get_files();
|
let plugins = PyStatus::get_files();
|
||||||
|
|
|
@ -5,6 +5,7 @@ use crate::MAIN_STATUS;
|
||||||
pub struct BotStatus {
|
pub struct BotStatus {
|
||||||
pub config: Option<BotConfig>,
|
pub config: Option<BotConfig>,
|
||||||
pub ica_status: Option<ica::MainStatus>,
|
pub ica_status: Option<ica::MainStatus>,
|
||||||
|
pub tailchat_status: Option<tailchat::MainStatus>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl BotStatus {
|
impl BotStatus {
|
||||||
|
@ -18,6 +19,11 @@ impl BotStatus {
|
||||||
MAIN_STATUS.ica_status = Some(status);
|
MAIN_STATUS.ica_status = Some(status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
pub fn update_tailchat_status(status: tailchat::MainStatus) {
|
||||||
|
unsafe {
|
||||||
|
MAIN_STATUS.tailchat_status = Some(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn static_init(config: BotConfig) {
|
pub fn static_init(config: BotConfig) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -33,13 +39,20 @@ impl BotStatus {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn global_config() -> &'static BotConfig { unsafe { MAIN_STATUS.config.as_ref().unwrap() } }
|
pub fn global_config() -> &'static BotConfig { unsafe { MAIN_STATUS.config.as_ref().unwrap() } }
|
||||||
|
|
||||||
pub fn global_ica_status() -> &'static ica::MainStatus {
|
pub fn global_ica_status() -> &'static ica::MainStatus {
|
||||||
unsafe { MAIN_STATUS.ica_status.as_ref().unwrap() }
|
unsafe { MAIN_STATUS.ica_status.as_ref().unwrap() }
|
||||||
}
|
}
|
||||||
|
pub fn global_tailchat_status() -> &'static tailchat::MainStatus {
|
||||||
|
unsafe { MAIN_STATUS.tailchat_status.as_ref().unwrap() }
|
||||||
|
}
|
||||||
|
|
||||||
pub fn global_ica_status_mut() -> &'static mut ica::MainStatus {
|
pub fn global_ica_status_mut() -> &'static mut ica::MainStatus {
|
||||||
unsafe { MAIN_STATUS.ica_status.as_mut().unwrap() }
|
unsafe { MAIN_STATUS.ica_status.as_mut().unwrap() }
|
||||||
}
|
}
|
||||||
|
pub fn global_tailchat_status_mut() -> &'static mut tailchat::MainStatus {
|
||||||
|
unsafe { MAIN_STATUS.tailchat_status.as_mut().unwrap() }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub mod ica {
|
pub mod ica {
|
||||||
|
@ -65,3 +78,34 @@ pub mod ica {
|
||||||
pub fn update_online_status(&mut self, status: OnlineData) { self.online_status = status; }
|
pub fn update_online_status(&mut self, status: OnlineData) { self.online_status = status; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub mod tailchat {
|
||||||
|
use crate::data_struct::tailchat::UserId;
|
||||||
|
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct MainStatus {
|
||||||
|
/// 是否启用 tailchat
|
||||||
|
pub enable: bool,
|
||||||
|
/// 是否登录
|
||||||
|
pub login: bool,
|
||||||
|
/// 用户 ID
|
||||||
|
pub user_id: UserId,
|
||||||
|
/// 昵称
|
||||||
|
pub nick_name: String,
|
||||||
|
/// 邮箱
|
||||||
|
pub email: String,
|
||||||
|
/// JWT Token
|
||||||
|
pub jwt_token: String,
|
||||||
|
/// avatar
|
||||||
|
pub avatar: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MainStatus {
|
||||||
|
pub fn update_user_id(&mut self, user_id: UserId) { self.user_id = user_id; }
|
||||||
|
pub fn update_nick_name(&mut self, nick_name: String) { self.nick_name = nick_name; }
|
||||||
|
pub fn update_email(&mut self, email: String) { self.email = email; }
|
||||||
|
pub fn update_jwt_token(&mut self, jwt_token: String) { self.jwt_token = jwt_token; }
|
||||||
|
pub fn update_avatar(&mut self, avatar: String) { self.avatar = avatar; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,27 +1,55 @@
|
||||||
pub mod events;
|
pub mod events;
|
||||||
|
|
||||||
use futures_util::FutureExt;
|
use futures_util::FutureExt;
|
||||||
use reqwest::ClientBuilder as reqwest_ClientBuilder;
|
use md5::{Digest, Md5};
|
||||||
|
use reqwest::{Body, ClientBuilder as reqwest_ClientBuilder};
|
||||||
use rust_socketio::asynchronous::{Client, ClientBuilder};
|
use rust_socketio::asynchronous::{Client, ClientBuilder};
|
||||||
use rust_socketio::{Event, Payload, TransportType};
|
use rust_socketio::{Event, Payload, TransportType};
|
||||||
|
use serde_json::json;
|
||||||
use tracing::{event, span, Level};
|
use tracing::{event, span, Level};
|
||||||
|
|
||||||
// use crate::config::IcaConfig;
|
use crate::config::TailchatConfig;
|
||||||
use crate::error::{ClientResult, TailchatError};
|
use crate::error::{ClientResult, TailchatError};
|
||||||
|
use crate::StopGetter;
|
||||||
|
|
||||||
pub async fn start_tailchat() -> ClientResult<(), TailchatError> {
|
pub async fn start_tailchat(
|
||||||
|
config: TailchatConfig,
|
||||||
|
stop_receiver: StopGetter,
|
||||||
|
) -> ClientResult<(), TailchatError> {
|
||||||
let span = span!(Level::INFO, "Tailchat Client");
|
let span = span!(Level::INFO, "Tailchat Client");
|
||||||
let _enter = span.enter();
|
let _enter = span.enter();
|
||||||
|
|
||||||
event!(Level::INFO, "tailchat-async-rs v{} initing", crate::TAILCHAT_VERSION);
|
event!(Level::INFO, "tailchat-async-rs v{} initing", crate::TAILCHAT_VERSION);
|
||||||
|
|
||||||
let tailchat_req = reqwest_ClientBuilder::new().build()?;
|
let mut hasher = Md5::new();
|
||||||
|
hasher.update(config.app_id.as_bytes());
|
||||||
|
hasher.update(config.app_secret.as_bytes());
|
||||||
|
|
||||||
// tailchat_req.get("http://localhost:8080").send().await?;
|
let token = format!("{:x}", hasher.finalize());
|
||||||
|
|
||||||
// let socket = match ClientBuilder::new() {
|
let mut header_map = reqwest::header::HeaderMap::new();
|
||||||
|
header_map.append("Content-Type", "application/json".parse().unwrap());
|
||||||
|
|
||||||
// };
|
let client = reqwest_ClientBuilder::new().default_headers(header_map).build()?;
|
||||||
|
let status = match client
|
||||||
|
.post(&format!("{}/api/openapi/bot/login", config.host))
|
||||||
|
.body(json!{{"appId": config.app_id, "token": token}}.to_string())
|
||||||
|
.send()
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(resp) => {
|
||||||
|
if resp.status().is_success() {
|
||||||
|
let body = resp.text().await?;
|
||||||
|
event!(Level::INFO, "login success: {}", body);
|
||||||
|
body
|
||||||
|
} else {
|
||||||
|
Err(TailchatError::LoginFailed(resp.text().await?))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => return Err(TailchatError::LoginFailed(e.to_string())),
|
||||||
|
};
|
||||||
|
// notify:chat.message.delete
|
||||||
|
// notify:chat.message.add
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user