mirror of
http://shenjack.top:5100/shenjack/icalingua-python-bot.git
synced 2024-11-23 20:45:06 +08:00
又是一大堆
This commit is contained in:
parent
e5f0d1b60e
commit
198839c65f
|
@ -2,7 +2,7 @@ use std::env;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use toml;
|
use toml::from_str;
|
||||||
|
|
||||||
/// Icalingua bot 的配置
|
/// Icalingua bot 的配置
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Debug, Deserialize)]
|
||||||
|
@ -25,7 +25,7 @@ impl IcaConfig {
|
||||||
pub fn new_from_path(config_file_path: String) -> Self {
|
pub fn new_from_path(config_file_path: String) -> Self {
|
||||||
// try read config from file
|
// try read config from file
|
||||||
let config = fs::read_to_string(&config_file_path).expect("Failed to read config file");
|
let config = fs::read_to_string(&config_file_path).expect("Failed to read config file");
|
||||||
let ret: Self = toml::from_str(&config)
|
let ret: Self = from_str(&config)
|
||||||
.expect(format!("Failed to parse config file {}", &config_file_path).as_str());
|
.expect(format!("Failed to parse config file {}", &config_file_path).as_str());
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ use crate::data_struct::{MessageId, RoomId, UserId};
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Value as JsonValue;
|
use serde_json::Value as JsonValue;
|
||||||
use tracing::warn;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub enum At {
|
pub enum At {
|
||||||
|
@ -103,33 +102,6 @@ pub struct NewMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl NewMessage {
|
impl NewMessage {
|
||||||
/// export default interface Message {
|
|
||||||
/// _id: string | number
|
|
||||||
/// senderId?: number
|
|
||||||
/// username: string
|
|
||||||
/// content: string
|
|
||||||
/// code?: string
|
|
||||||
/// timestamp?: string
|
|
||||||
/// date?: string
|
|
||||||
/// role?: string
|
|
||||||
/// file?: MessageFile
|
|
||||||
/// files: MessageFile[]
|
|
||||||
/// time?: number
|
|
||||||
/// replyMessage?: Message
|
|
||||||
/// at?: boolean | 'all'
|
|
||||||
/// deleted?: boolean
|
|
||||||
/// system?: boolean
|
|
||||||
/// mirai?: MessageMirai
|
|
||||||
/// reveal?: boolean
|
|
||||||
/// flash?: boolean
|
|
||||||
/// title?: string
|
|
||||||
/// anonymousId?: number
|
|
||||||
/// anonymousflag?: string
|
|
||||||
/// hide?: boolean
|
|
||||||
/// bubble_id?: number
|
|
||||||
/// subid?: number
|
|
||||||
/// head_img?: string
|
|
||||||
/// }
|
|
||||||
pub fn new_from_json(json: &JsonValue) -> Self {
|
pub fn new_from_json(json: &JsonValue) -> Self {
|
||||||
// room id 还是必定有的
|
// room id 还是必定有的
|
||||||
let room_id = json["roomId"].as_i64().unwrap();
|
let room_id = json["roomId"].as_i64().unwrap();
|
||||||
|
@ -155,16 +127,19 @@ impl NewMessage {
|
||||||
// 身份
|
// 身份
|
||||||
let role = message["role"].as_str().unwrap_or("unknown");
|
let role = message["role"].as_str().unwrap_or("unknown");
|
||||||
// 文件
|
// 文件
|
||||||
let files: Vec<MessageFile> = message["files"]
|
let value_files = message["files"].as_array().unwrap_or(&Vec::new()).to_vec();
|
||||||
.as_array()
|
let mut files = Vec::with_capacity(value_files.len());
|
||||||
.unwrap_or(&Vec::new())
|
for file in &value_files {
|
||||||
.iter()
|
let file = serde_json::from_value::<MessageFile>(file.clone());
|
||||||
.map(|value| serde_json::from_value(value.clone()).unwrap())
|
if let Ok(file) = file {
|
||||||
.collect();
|
files.push(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
// 回复的消息
|
// 回复的消息
|
||||||
let reply: Option<ReplyedMessage> = message
|
let reply: Option<ReplyedMessage> = match message.get("replyMessage") {
|
||||||
.get("replyMessage")
|
Some(value) => serde_json::from_value::<ReplyedMessage>(value.clone()).ok(),
|
||||||
.map(|value| serde_json::from_value(value.clone()).unwrap());
|
None => None,
|
||||||
|
};
|
||||||
// At
|
// At
|
||||||
let at = At::new_from_json(&message["at"]);
|
let at = At::new_from_json(&message["at"]);
|
||||||
// 是否已撤回
|
// 是否已撤回
|
||||||
|
@ -178,7 +153,7 @@ impl NewMessage {
|
||||||
// flash
|
// flash
|
||||||
let flash = message["flash"].as_bool().unwrap_or(false);
|
let flash = message["flash"].as_bool().unwrap_or(false);
|
||||||
// "群主授予的头衔"
|
// "群主授予的头衔"
|
||||||
let title = message["title"].as_str().unwrap();
|
let title = message["title"].as_str().unwrap_or("");
|
||||||
// anonymous id
|
// anonymous id
|
||||||
let anonymous_id = message["anonymousId"].as_i64();
|
let anonymous_id = message["anonymousId"].as_i64();
|
||||||
// 是否已被隐藏
|
// 是否已被隐藏
|
||||||
|
@ -233,6 +208,9 @@ impl NewMessage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
pub struct SendMessage {}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
|
@ -2,9 +2,9 @@ use colored::Colorize;
|
||||||
use rust_socketio::{Event, Payload, RawClient};
|
use rust_socketio::{Event, Payload, RawClient};
|
||||||
use tracing::{info, warn};
|
use tracing::{info, warn};
|
||||||
|
|
||||||
|
use crate::data_struct::all_rooms::Room;
|
||||||
use crate::data_struct::messages::NewMessage;
|
use crate::data_struct::messages::NewMessage;
|
||||||
use crate::data_struct::online_data::OnlineData;
|
use crate::data_struct::online_data::OnlineData;
|
||||||
use crate::data_struct::all_rooms::Room;
|
|
||||||
use crate::py;
|
use crate::py;
|
||||||
|
|
||||||
/// 获取在线数据
|
/// 获取在线数据
|
||||||
|
@ -53,7 +53,10 @@ pub fn update_all_room(payload: Payload, _client: RawClient) {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|room| Room::new_from_json(room))
|
.map(|room| Room::new_from_json(room))
|
||||||
.collect();
|
.collect();
|
||||||
info!("update_all_room {}", format!("{:#?}", rooms).purple());
|
unsafe {
|
||||||
|
crate::ClientStatus.update_rooms(rooms.clone());
|
||||||
|
}
|
||||||
|
info!("update_all_room {}", rooms.len());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -82,6 +85,20 @@ pub fn any_event(event: Event, payload: Payload, _client: RawClient) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Event::Message => {
|
||||||
|
match payload {
|
||||||
|
Payload::Text(values) => {
|
||||||
|
if let Some(value) = values.first() {
|
||||||
|
if handled.contains(&value.as_str().unwrap()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
info!("收到消息 {}", value.to_string().yellow());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
match payload {
|
match payload {
|
||||||
|
@ -114,7 +131,10 @@ pub fn connect_callback(payload: Payload, _client: RawClient) {
|
||||||
Some("authRequired") => {
|
Some("authRequired") => {
|
||||||
warn!("{}", "需要登录到 icalingua!".yellow())
|
warn!("{}", "需要登录到 icalingua!".yellow())
|
||||||
}
|
}
|
||||||
_ => (),
|
Some(msg) => {
|
||||||
|
warn!("未知消息 {}", msg.yellow())
|
||||||
|
}
|
||||||
|
None => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ fn main() {
|
||||||
.transport_type(rust_socketio::TransportType::Websocket)
|
.transport_type(rust_socketio::TransportType::Websocket)
|
||||||
.on_any(events::any_event)
|
.on_any(events::any_event)
|
||||||
.on("requireAuth", move |a, b| ica_singer.sign_callback(a, b))
|
.on("requireAuth", move |a, b| ica_singer.sign_callback(a, b))
|
||||||
.on("authRequired", events::connect_callback)
|
.on("message", events::connect_callback)
|
||||||
.on("authSucceed", events::connect_callback)
|
.on("authSucceed", events::connect_callback)
|
||||||
.on("authFailed", events::connect_callback)
|
.on("authFailed", events::connect_callback)
|
||||||
.on("onlineData", events::get_online_data)
|
.on("onlineData", events::get_online_data)
|
||||||
|
|
106
ica-rs/src/py/class.rs
Normal file
106
ica-rs/src/py/class.rs
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
use pyo3::prelude::*;
|
||||||
|
|
||||||
|
use crate::ClientStatus;
|
||||||
|
|
||||||
|
#[pyclass]
|
||||||
|
#[pyo3(name = "IcaStatus")]
|
||||||
|
pub struct IcaStatusPy {}
|
||||||
|
|
||||||
|
#[pymethods]
|
||||||
|
impl IcaStatusPy {
|
||||||
|
#[new]
|
||||||
|
pub fn py_new() -> Self {
|
||||||
|
Self {}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_login(&self) -> bool {
|
||||||
|
unsafe { ClientStatus.login }
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_self_id(&self) -> Option<i64> {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => Some(data.qqid),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_nicn_name(&self) -> Option<String> {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => Some(data.nick.clone()),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_online(&self) -> bool {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => data.online,
|
||||||
|
None => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_ica_version(&self) -> Option<String> {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => Some(data.icalingua_info.ica_version.clone()),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_os_info(&self) -> Option<String> {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => Some(data.icalingua_info.os_info.clone()),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_resident_set_size(&self) -> Option<String> {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => Some(data.icalingua_info.resident_set_size.clone()),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_heap_used(&self) -> Option<String> {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => Some(data.icalingua_info.heap_used.clone()),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[getter]
|
||||||
|
pub fn get_load(&self) -> Option<String> {
|
||||||
|
unsafe {
|
||||||
|
match ClientStatus.online_data.as_ref() {
|
||||||
|
Some(data) => Some(data.icalingua_info.load.clone()),
|
||||||
|
None => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl IcaStatusPy {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self {}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
pub mod class;
|
||||||
|
|
||||||
use pyo3::{prelude::*, types::IntoPyDict};
|
use pyo3::{prelude::*, types::IntoPyDict};
|
||||||
use tracing::{debug, info};
|
use tracing::{debug, info};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user