lab_resource_manager/interface/slack/
bot.rs

1use super::commands::SlackCommandHandler;
2use slack_morphism::prelude::*;
3use std::sync::Arc;
4
5/// Slack Socket Mode Bot
6///
7/// Socket Modeで使用される簡易ラッパー。
8/// 実際のSocket Modeサーバーのセットアップはバイナリ(main.rsまたはbinファイル)で
9/// slack-morphismのSocket Mode機能を使用して行う必要がある。
10pub struct SlackBot {
11    command_handler: Arc<SlackCommandHandler>,
12    client: Arc<SlackHyperClient>,
13}
14
15impl SlackBot {
16    /// 新しいボットインスタンスを作成
17    ///
18    /// # 引数
19    /// * `bot_token` - Bot User OAuth Token (xoxb-...)
20    /// * `command_handler` - コマンドハンドラ
21    pub async fn new(
22        command_handler: Arc<SlackCommandHandler>,
23    ) -> Result<Self, Box<dyn std::error::Error + Send + Sync>> {
24        let client = Arc::new(SlackClient::new(SlackClientHyperConnector::new()?));
25
26        Ok(Self {
27            command_handler,
28            client,
29        })
30    }
31
32    /// Slashコマンドを処理
33    pub async fn handle_command(
34        &self,
35        event: SlackCommandEvent,
36    ) -> Result<SlackCommandEventResponse, Box<dyn std::error::Error + Send + Sync>> {
37        self.command_handler.route_slash_command(event).await
38    }
39
40    /// クライアントへの参照を取得
41    pub fn client(&self) -> Arc<SlackHyperClient> {
42        self.client.clone()
43    }
44}