use crate::adapter::Adapter;
use crate::context::Context;
use crate::error::FrameworkResult;
use crate::message::MessageElement;
use crate::types::*;
use std::sync::Arc;
pub struct Bot {
pub adapter: Arc<dyn Adapter>,
pub ctx: Arc<Context>,
pub platform: String,
pub self_id: String,
pub state: LoginStatus,
pub user: User,
}
impl Bot {
pub fn new(ctx: Arc<Context>, adapter_instance: Arc<dyn Adapter>) -> Self {
let platform = adapter_instance.get_name();
Bot {
adapter: adapter_instance,
ctx,
platform,
self_id: String::new(),
state: LoginStatus::Offline,
user: User::default(),
}
}
pub async fn start(self: Arc<Self>) -> FrameworkResult<()> {
tracing::info!("尝试启动适配器: {}", self.platform);
self.adapter.connect(self.clone()).await; tracing::info!("适配器 {} 已启动。", self.platform);
Ok(())
}
pub async fn stop(self: Arc<Self>) -> FrameworkResult<()> {
tracing::info!("尝试停止适配器: {}", self.platform);
self.adapter.disconnect(self.clone()).await;
tracing::info!("适配器 {} 已停止。", self.platform);
Ok(())
}
pub fn online(&mut self) {
self.state = LoginStatus::Online
}
pub fn offline(&mut self) {
self.state = LoginStatus::Offline
}
pub async fn create_reaction(
&self,
message_id: &str,
channel_id: &str,
emoji: &str,
) -> FrameworkResult<()> {
self.adapter
.create_reaction(message_id, channel_id, emoji)
.await
}
pub async fn delete_reaction(
&self,
message_id: &str,
channel_id: &str,
emoji: &str,
user_id: &str,
) -> FrameworkResult<()> {
self.adapter
.delete_reaction(message_id, channel_id, emoji, user_id)
.await
}
pub async fn clear_reaction(
&self,
message_id: &str,
channel_id: &str,
emoji: &str,
) -> FrameworkResult<()> {
self.adapter
.clear_reaction(message_id, channel_id, emoji)
.await
}
pub async fn get_reaction_list(
&self,
message_id: &str,
channel_id: &str,
emoji: &str,
next: Option<&str>,
) -> FrameworkResult<Vec<User>> {
self.adapter
.get_reaction_list(message_id, channel_id, emoji, next)
.await
}
pub async fn get_channel(&self, channel_id: &str) -> FrameworkResult<Channel> {
self.adapter.get_channel(channel_id).await
}
pub async fn get_channel_list(
&self,
guild_id: &str,
next: Option<&str>,
) -> FrameworkResult<Vec<Channel>> {
self.adapter.get_channel_list(guild_id, next).await
}
pub async fn create_channel(&self, guild_id: &str, data: Channel) -> FrameworkResult<Channel> {
self.adapter.create_channel(guild_id, data).await
}
pub async fn update_channel(&self, channel_id: &str, data: Channel) -> FrameworkResult<()> {
self.adapter.update_channel(channel_id, data).await
}
pub async fn delete_channel(&self, channel_id: &str) -> FrameworkResult<()> {
self.adapter.delete_channel(channel_id).await
}
pub async fn create_direct_channel(&self, user_id: &str) -> FrameworkResult<Channel> {
self.adapter.create_direct_channel(user_id).await
}
pub async fn set_guild_member_role(
&self,
guild_id: &str,
user_id: &str,
role_id: &str,
) -> FrameworkResult<()> {
self.adapter
.set_guild_member_role(guild_id, user_id, role_id)
.await
}
pub async fn unset_guild_member_role(
&self,
guild_id: &str,
user_id: &str,
role_id: &str,
) -> FrameworkResult<()> {
self.adapter
.unset_guild_member_role(guild_id, user_id, role_id)
.await
}
pub async fn get_guild_member_role_list(
&self,
guild_id: &str,
next: Option<&str>,
) -> FrameworkResult<Vec<GuildRole>> {
self.adapter
.get_guild_member_role_list(guild_id, next)
.await
}
pub async fn create_guild_role(
&self,
guild_id: &str,
role_name: &str,
) -> FrameworkResult<GuildRole> {
self.adapter.create_guild_role(guild_id, role_name).await
}
pub async fn update_guild_role(
&self,
guild_id: &str,
role_id: &str,
role: GuildRole,
) -> FrameworkResult<()> {
self.adapter
.update_guild_role(guild_id, role_id, role)
.await
}
pub async fn delete_guild_role(&self, guild_id: &str, role_id: &str) -> FrameworkResult<()> {
self.adapter.delete_guild_role(guild_id, role_id).await
}
pub async fn send_message(
&self,
channel_id: &str,
elements: &[MessageElement],
) -> FrameworkResult<Vec<String>> {
self.adapter.send_message(channel_id, elements).await
}
pub async fn send_private_message(
&self,
user_id: &str,
guild_id: &str,
elements: &[MessageElement],
) -> FrameworkResult<Vec<String>> {
self.adapter
.send_private_message(user_id, guild_id, elements)
.await
}
pub async fn get_message(
&self,
channel_id: &str,
message_id: &str,
) -> FrameworkResult<Message> {
self.adapter.get_message(channel_id, message_id).await
}
pub async fn delete_message(&self, channel_id: &str, message_id: &str) -> FrameworkResult<()> {
self.adapter.delete_message(channel_id, message_id).await
}
pub async fn update_message(
&self,
channel_id: &str,
message_id: &str,
elements: &[MessageElement],
) -> FrameworkResult<()> {
self.adapter
.update_message(channel_id, message_id, elements)
.await
}
pub async fn get_message_list(
&self,
channel_id: &str,
next: Option<&str>,
directory: Option<&str>,
) -> FrameworkResult<Vec<Message>> {
self.adapter
.get_message_list(channel_id, next, directory)
.await
}
pub async fn broadcast(
&self,
channels: Vec<String>,
elements: &[MessageElement],
) -> FrameworkResult<()> {
for channel in channels {
self.adapter
.send_message(channel.as_str(), elements)
.await?;
}
Ok(())
}
pub async fn get_user(&self, user_id: &str) -> FrameworkResult<User> {
self.adapter.get_user(user_id).await
}
pub async fn get_friend_list(&self, next: Option<&str>) -> FrameworkResult<Vec<User>> {
self.adapter.get_friends(next).await
}
pub async fn handle_friend_request(
&self,
message_id: &str,
accept: bool,
comment: Option<&str>,
) -> FrameworkResult<()> {
self.adapter
.handle_friend_request(message_id, accept, comment)
.await
}
pub async fn get_guild(&self, guild_id: &str) -> FrameworkResult<Guild> {
self.adapter.get_guild(guild_id).await
}
pub async fn get_guild_list(&self, next: Option<&str>) -> FrameworkResult<Vec<Guild>> {
self.adapter.get_guilds(next).await
}
pub async fn handle_guild_invite(
&self,
message_id: &str,
accept: bool,
comment: Option<&str>,
) -> FrameworkResult<()> {
self.adapter
.handle_guild_invite(message_id, accept, comment)
.await
}
pub async fn get_guild_member(
&self,
guild_id: &str,
user_id: &str,
) -> FrameworkResult<GuildMember> {
self.adapter.get_guild_member(guild_id, user_id).await
}
pub async fn get_guild_member_list(
&self,
guild_id: &str,
next: Option<&str>,
) -> FrameworkResult<Vec<GuildMember>> {
self.adapter.get_guild_members(guild_id, next).await
}
pub async fn kick_guild_member(
&self,
guild_id: &str,
user_id: &str,
permanent: Option<bool>,
) -> FrameworkResult<()> {
self.adapter
.kick_guild_member(guild_id, user_id, permanent)
.await
}
pub async fn mute_guild_member(
&self,
guild_id: &str,
user_id: &str,
duration: Option<u64>,
reason: &str,
) -> FrameworkResult<()> {
self.adapter
.mute_guild_member(guild_id, user_id, duration, reason)
.await
}
pub async fn handle_guild_request(
&self,
message_id: &str,
accept: bool,
comment: Option<&str>,
) -> FrameworkResult<()> {
self.adapter
.handle_guild_request(message_id, accept, comment)
.await
}
pub async fn get_login(&self) -> FrameworkResult<Login> {
self.adapter.get_login().await
}
}