use kovi::RuntimeBot;
use kovi::bot::runtimebot::{
CanSendApi, send_api_await_response, send_api_request, send_api_request_with_forget,
send_api_request_with_response,
};
use kovi::bot::{ApiReturn, SendApi};
#[cfg(not(feature = "cqstring"))]
use kovi::message::Message as KoviMessage;
use log::info;
use serde::Serialize;
use serde_json::{Value, json};
#[cfg(feature = "cqstring")]
use crate::onebot_message::CQMessage;
#[cfg(not(feature = "cqstring"))]
use crate::onebot_message::OneBotMessage;
pub enum HonorType {
All,
Talkative,
Performer,
Legend,
StrongNewbie,
Emotion,
}
pub enum AddRequestType<'a> {
Type(&'a str),
SubType(&'a str),
}
pub trait OnebotTrait: CanSendApi {
#[cfg(not(feature = "cqstring"))]
fn send_group_msg_return<T>(
&self,
group_id: i64,
msg: T,
) -> impl std::future::Future<Output = Result<i32, ApiReturn>>
where
KoviMessage: From<T>,
T: Serialize,
{
let msg = KoviMessage::from(msg);
let group_id = &group_id;
info!("[send] [to group {group_id}]: {}", msg.to_human_string());
let msg = OneBotMessage::from(msg);
let send_api = SendApi::new(
"send_msg",
json!({
"message_type":"group",
"group_id":group_id,
"message":msg,
"auto_escape":true,
}),
);
let api_rx = send_api_request(self.__get_api_tx(), send_api);
async move {
let r = send_api_await_response(api_rx).await;
match r {
Ok(v) => match v.data.get("message_id").and_then(|v| v.as_i64()) {
Some(b) => Ok(b as i32),
None => Err(v),
},
Err(v) => Err(v),
}
}
}
#[cfg(feature = "cqstring")]
fn send_group_msg_return<T>(
&self,
group_id: i64,
msg: T,
) -> impl std::future::Future<Output = Result<i32, ApiReturn>>
where
CQMessage: From<T>,
T: Serialize,
{
let msg = CQMessage::from(msg);
let send_api = SendApi::new(
"send_msg",
json!({
"message_type":"group",
"group_id":group_id,
"message":msg,
"auto_escape":false,
}),
);
let group_id = &group_id;
info!(
"[send] [to group {group_id}]: {}",
Message::from(msg).to_human_string()
);
let api_rx = send_api_request(&self.__get_api_tx(), send_api);
async move {
let r = send_api_await_response(api_rx).await;
match r {
Ok(v) => match v.data.get("message_id").and_then(|v| v.as_i64()) {
Some(b) => Ok(b as i32),
None => Err(v),
},
Err(v) => Err(v),
}
}
}
#[cfg(not(feature = "cqstring"))]
fn send_private_msg_return<T>(
&self,
user_id: i64,
msg: T,
) -> impl std::future::Future<Output = Result<i32, ApiReturn>>
where
KoviMessage: From<T>,
T: Serialize,
{
let send_api = SendApi::new(
"send_msg",
json!({"message_type":"private",
"user_id":user_id,
"message":msg,
"auto_escape":true,}),
);
let msg = KoviMessage::from(msg);
let user_id = &user_id;
info!("[send] [to private {user_id}]: {}", msg.to_human_string());
let api_rx = send_api_request(self.__get_api_tx(), send_api);
async move {
let r = send_api_await_response(api_rx).await;
match r {
Ok(v) => match v.data.get("message_id").and_then(|v| v.as_i64()) {
Some(b) => Ok(b as i32),
None => Err(v),
},
Err(v) => Err(v),
}
}
}
#[cfg(feature = "cqstring")]
fn send_private_msg_return<T>(
&self,
user_id: i64,
msg: T,
) -> impl std::future::Future<Output = Result<i32, ApiReturn>>
where
CQMessage: From<T>,
T: Serialize,
{
let msg = CQMessage::from(msg);
let send_api = SendApi::new(
"send_msg",
json!({"message_type":"private",
"user_id":user_id,
"message":msg,
"auto_escape":false,}),
);
let user_id = &user_id;
info!(
"[send] [to private {user_id}]: {}",
Message::from(msg).to_human_string()
);
let api_rx = send_api_request(&self.__get_api_tx(), send_api);
async move {
let r = send_api_await_response(api_rx).await;
match r {
Ok(v) => match v.data.get("message_id").and_then(|v| v.as_i64()) {
Some(b) => Ok(b as i32),
None => Err(v),
},
Err(v) => Err(v),
}
}
}
fn can_send_image(&self) -> impl std::future::Future<Output = Result<bool, ApiReturn>> {
let send_api = SendApi::new("can_send_image", json!({}));
let api_rx = send_api_request(self.__get_api_tx(), send_api);
async move {
let r = send_api_await_response(api_rx).await;
match r {
Ok(v) => match v.data.get("yes").and_then(|v| v.as_bool()) {
Some(b) => Ok(b),
None => Err(v),
},
Err(v) => Err(v),
}
}
}
fn can_send_record(&self) -> impl std::future::Future<Output = Result<bool, ApiReturn>> {
let send_api = SendApi::new("can_send_record", json!({}));
let api_rx = send_api_request(self.__get_api_tx(), send_api);
async move {
let r = send_api_await_response(api_rx).await;
match r {
Ok(v) => match v.data.get("yes").and_then(|v| v.as_bool()) {
Some(b) => Ok(b),
None => Err(v),
},
Err(v) => Err(v),
}
}
}
#[cfg(not(feature = "cqstring"))]
fn send_group_msg<T>(&self, group_id: i64, msg: T)
where
KoviMessage: From<T>,
T: Serialize,
{
let msg = KoviMessage::from(msg);
let group_id = &group_id;
info!("[send] [to group {group_id}]: {}", msg.to_human_string());
let msg = OneBotMessage::from(msg);
let send_api = SendApi::new(
"send_msg",
json!({
"message_type":"group",
"group_id":group_id,
"message":msg,
"auto_escape":true,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
#[cfg(feature = "cqstring")]
fn send_group_msg<T>(&self, group_id: i64, msg: T)
where
CQMessage: From<T>,
T: Serialize,
{
let msg = CQMessage::from(msg);
let send_api = SendApi::new(
"send_msg",
json!({
"message_type":"group",
"group_id":group_id,
"message":msg,
"auto_escape":false,
}),
);
let group_id = &group_id;
info!(
"[send] [to group {group_id}]: {}",
Message::from(msg).to_human_string()
);
send_api_request_with_forget(&self.__get_api_tx(), send_api);
}
#[cfg(not(feature = "cqstring"))]
fn send_private_msg<T>(&self, user_id: i64, msg: T)
where
KoviMessage: From<T>,
T: Serialize,
{
let msg = KoviMessage::from(msg);
let user_id = &user_id;
info!("[send] [to private {user_id}]: {}", msg.to_human_string());
let msg = OneBotMessage::from(msg);
let send_api = SendApi::new(
"send_msg",
json!({
"message_type":"private",
"user_id":user_id,
"message":msg,
"auto_escape":true,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
#[cfg(feature = "cqstring")]
fn send_private_msg<T>(&self, user_id: i64, msg: T)
where
CQMessage: From<T>,
T: Serialize,
{
let msg = CQMessage::from(msg);
let send_api = SendApi::new(
"send_msg",
json!({
"message_type":"private",
"user_id":user_id,
"message":msg,
"auto_escape":false,
}),
);
let user_id = &user_id;
info!(
"[send] [to private {user_id}]: {}",
Message::from(msg).to_human_string()
);
send_api_request_with_forget(&self.__get_api_tx(), send_api);
}
fn delete_msg(&self, message_id: i32) {
let send_api = SendApi::new(
"delete_msg",
json!({
"message_id":message_id,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn send_like(&self, user_id: i64, times: usize) {
let send_api = SendApi::new(
"send_like",
json!({
"user_id":user_id,
"times":times,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_kick(&self, group_id: i64, user_id: i64, reject_add_request: bool) {
let send_api = SendApi::new(
"set_group_kick",
json!({
"group_id":group_id,
"user_id":user_id,
"reject_add_request":reject_add_request,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_ban(&self, group_id: i64, user_id: i64, duration: usize) {
let send_api = SendApi::new(
"set_group_ban",
json!({
"group_id":group_id,
"user_id":user_id,
"duration":duration,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_anonymous_ban_use_anonymous(
&self,
group_id: i64,
anonymous: Value,
duration: usize,
) {
let send_api = SendApi::new(
"set_group_anonymous_ban",
json!({
"group_id":group_id,
"anonymous":anonymous,
"duration":duration,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_anonymous_ban_use_flag(&self, group_id: i64, flag: &str, duration: usize) {
let send_api = SendApi::new(
"set_group_anonymous_ban",
json!({
"group_id":group_id,
"flag":flag,
"duration":duration,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_whole_ban(&self, group_id: i64, enable: bool) {
let send_api = SendApi::new(
"set_group_whole_ban",
json!({
"group_id":group_id,
"enable":enable,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_admin(&self, group_id: i64, user_id: i64, enable: bool) {
let send_api = SendApi::new(
"set_group_admin",
json!({
"group_id":group_id,
"user_id":user_id,
"enable":enable,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_anonymous(&self, group_id: i64, enable: bool) {
let send_api = SendApi::new(
"set_group_anonymous",
json!({
"group_id":group_id,
"enable":enable,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_card(&self, group_id: i64, user_id: i64, card: &str) {
let send_api = SendApi::new(
"set_group_card",
json!({
"group_id":group_id,
"user_id":user_id,
"card":card,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_name(&self, group_id: i64, group_name: &str) {
let send_api = SendApi::new(
"set_group_name",
json!({
"group_id":group_id,
"group_name":group_name,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_leave(&self, group_id: i64, is_dismiss: bool) {
let send_api = SendApi::new(
"set_group_leave",
json!({
"group_id":group_id,
"is_dismiss":is_dismiss,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_special_title(&self, group_id: i64, user_id: i64, special_title: &str) {
let send_api = SendApi::new(
"set_group_special_title",
json!({
"group_id":group_id,
"user_id":user_id,
"special_title":special_title,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_friend_add_request(&self, flag: &str, approve: bool, remark: &str) {
let send_api = SendApi::new(
"set_friend_add_request",
json!({
"flag":flag,
"approve":approve,
"remark":remark,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn set_group_add_request(
&self,
flag: &str,
type_: AddRequestType,
approve: bool,
reason: &str,
) {
let (type_, type_value) = match type_ {
AddRequestType::SubType(v) => ("sub_type", v),
AddRequestType::Type(v) => ("type", v),
};
let send_api = SendApi::new(
"set_group_add_request",
json!({
"flag":flag,
type_: type_value,
"approve":approve,
"reason":reason,
}),
);
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn clean_cache(&self) {
let send_api = SendApi::new("clean_cache", json!({}));
send_api_request_with_forget(self.__get_api_tx(), send_api);
}
fn get_msg(
&self,
message_id: i32,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_msg",
json!({
"message_id":message_id
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_forward_msg(
&self,
id: &str,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_forward_msg",
json!({
"id":id
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_login_info(&self) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new("get_login_info", json!({}));
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_stranger_info(
&self,
user_id: i64,
no_cache: bool,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_stranger_info",
json!({
"user_id":user_id,
"no_cache":no_cache
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_friend_list(&self) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new("get_friend_list", json!({}));
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_group_info(
&self,
group_id: i64,
no_cache: bool,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_group_info",
json!({
"group_id":group_id,
"no_cache":no_cache
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_group_list(&self) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new("get_group_list", json!({}));
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_group_member_info(
&self,
group_id: i64,
user_id: i64,
no_cache: bool,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_group_member_info",
json!({
"group_id":group_id,
"user_id":user_id,
"no_cache":no_cache
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_group_member_list(
&self,
group_id: i64,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_group_member_list",
json!({
"group_id":group_id,
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_group_honor_info(
&self,
group_id: i64,
honor_type: HonorType,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let honor_type = match honor_type {
HonorType::All => "all",
HonorType::Talkative => "talkative",
HonorType::Performer => "performer",
HonorType::Legend => "legend",
HonorType::StrongNewbie => "strong_newbie",
HonorType::Emotion => "emotion",
};
let send_api = SendApi::new(
"get_group_honor_info",
json!({
"group_id":group_id,
"type":honor_type
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_credentials(
&self,
domain: &str,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_credentials",
json!({
"domain":domain,
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_status(&self) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new("get_status", json!({}));
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_version_info(&self) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new("get_version_info", json!({}));
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_cookies(
&self,
domain: &str,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_cookies",
json!({
"domain":domain,
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_csrf_token(&self) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new("get_csrf_token", json!({}));
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_record(
&self,
file: &str,
out_format: &str,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_record",
json!({
"file":file,
"out_format":out_format
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn get_image(
&self,
file: &str,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"get_image",
json!({
"file":file,
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
fn send_like_return(
&self,
user_id: i64,
times: usize,
) -> impl std::future::Future<Output = Result<ApiReturn, ApiReturn>> {
let send_api = SendApi::new(
"send_like",
json!({
"user_id":user_id,
"times":times,
}),
);
send_api_request_with_response(self.__get_api_tx(), send_api)
}
}
impl OnebotTrait for RuntimeBot {
}