use slack_morphism::prelude::SlackHyperClient;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::{Mutex, oneshot};
use tokio_util::sync::CancellationToken;
use uuid::Uuid;
use super::tool_group;
pub struct SlackState {
pub(super) client: Mutex<Option<Arc<SlackHyperClient>>>,
pub(super) bot_token: Mutex<Option<String>>,
pub(super) owner_channel_id: Mutex<Option<String>>,
pub(super) session_channels: Mutex<HashMap<Uuid, String>>,
pub(super) channel_sessions: Mutex<HashMap<String, Uuid>>,
pub(super) pending_approvals: Mutex<HashMap<String, oneshot::Sender<(bool, bool)>>>,
pub(super) pending_followups: Mutex<HashMap<Uuid, Vec<String>>>,
pub(super) cancel_tokens: Mutex<HashMap<Uuid, CancellationToken>>,
pub(super) tool_groups: Mutex<(Vec<String>, HashMap<String, tool_group::GroupState>)>,
}
impl Default for SlackState {
fn default() -> Self {
Self::new()
}
}
impl SlackState {
pub fn new() -> Self {
Self {
client: Mutex::new(None),
bot_token: Mutex::new(None),
owner_channel_id: Mutex::new(None),
session_channels: Mutex::new(HashMap::new()),
channel_sessions: Mutex::new(HashMap::new()),
pending_approvals: Mutex::new(HashMap::new()),
pending_followups: Mutex::new(HashMap::new()),
cancel_tokens: Mutex::new(HashMap::new()),
tool_groups: Mutex::new((Vec::new(), HashMap::new())),
}
}
}