My Calendar

2018年6月23日 星期六

Node.js 開發Slack Bot - 3

      Slack API 可以設定當某些事件觸發的時候才執行該方法,如之前使用到的"connected"事件,當Bot成功連接Slack才會觸發。相關文件可以到http://slackapi.github.io/node-slack-sdk/rtm_api查看。

如果希望在Bot登入但連接到頻道之前可以用AUTHENTICATED。
slack.on("authenticated",(connectData)=>{
  console.log(`Logged in as ${connectData.self.name} of team ${connectData.team.name}, but not yet connected to a channel`);
});

當等你將會看到以下的訊息。
Logged in as hellobot of team Deikhoong, but not yet connected to a channel

Bot要接收使用者的訊息可以使用MESSAGE EVENT. 只要每次將訊息發送到Bot所在的頻道或向Bot發送Direct Message時,這個Event都會被觸發。當我們發送"Hi Bot"或"Hello Bot",Bot會回覆給發送者的頻道。

slack.on('message', (message) => {

  (async() =>{
      let user= {"user":message.user};
      let userInfo = await getUserInfo(user);
      console.log(userInfo.user.is_bot);
      if (userInfo && userInfo.user.is_bot) {
          return;
      }
      
      let channel = message.channel;
      if (message.text) {
          console.log(`Incoming message: ${message.text}`);
          let msg = message.text.toLowerCase();
          if (/(hello|hi) bot/g.test(msg)) {
            slack.sendMessage(`Hello to you too, ${userInfo.user.name}!`,channel);
          }
      }
  })();
     
});


結果如下










傳送Direct Message
Direct Message (DM) 是一個僅在兩個用戶之間運行的頻道。根據設計,它不能有多於或少於兩個用戶,並且用於私人通信。 發送DM與向頻道發送消息非常相似。

在index.js新增getDM() function和片段程式
slack.on('message', (message) => {

  (async() =>{
      let user= {"user":message.user};
      let userInfo = await getUserInfo(user);
      let dmInfo = await getDM(user);
      if (userInfo && userInfo.user.is_bot) {
          return;
      }
      
      let channel = message.channel;
      if (message.text) {
          console.log(`Incoming message: ${message.text}`);
          let msg = message.text.toLowerCase();

          if(/uptime/g.test(msg))
          {
            let uptime = process.uptime();
            let minutes = parseInt(uptime / 60, 10),
            hours = parseInt(minutes / 60, 10),
            seconds = parseInt(uptime % 60, 10);
            slack.sendMessage(`I have been running for: ${hours} hours,${minutes} minutes and ${seconds} seconds.`, dmInfo.channel.id);
          }else if (/(hello|hi) bot/g.test(msg)) {
            slack.sendMessage(`Hello to you too, ${userInfo.user.name}!`,channel);
          }
      }
  })();
     
});

function getDM(user) 
{
   return web.im.open(user).then((resp)=>{
      return resp;
   }).catch((error) => {console.log(error);});   
}

在這個例子中,我們的Bot會將當前正常運行時間透過DM發送給任何發送"uptime"關鍵字的用戶。









































限制訪問
偶爾,我們會希望Bot某些指令只允許Admin才能使用。我們使用之前的例子uptime 指令只能讓Admin才能使用,其他user使用將會回傳warning 訊息。只要透過userInfo判斷該user是否admin即可。
if(/uptime/g.test(msg)){
     if (!userInfo.user.is_admin) {
          slack.sendMessage(`Sorry ${userInfo.user.name}, but that functionality is only for admins.`, dmInfo.channel.id);
          return;
     }
            
     let uptime = process.uptime();
     let minutes = parseInt(uptime / 60, 10),
     hours = parseInt(minutes / 60, 10),
     seconds = parseInt(uptime % 60, 10);
     slack.sendMessage(`I have been running for: ${hours} hours,${minutes} minutes and ${seconds} seconds.`, dmInfo.channel.id);  
}




沒有留言:

張貼留言