파비의 매일매일 공부기록

Mattermost Chatbot - #6 Bot 동작 개발 본문

Side Project (완료)/Mattermost Chatbot (2020)

Mattermost Chatbot - #6 Bot 동작 개발

fabichoi 2021. 1. 22. 23:30

지난시간에 REST API Call 까지 완료했기에

어찌보면 Side Project는 다 했다고 볼 수 있다.

 

사실 몇일전에 업무에서 모니터링 로그 채널의 Bot 메시지를 삭제하는 기능을 구현했기에

내가 목표하던 바는 이루었지만..

소스를 가지고 나올 수 없는 상황이기에 다시 한 번 작성 해볼까 한다.

 

기존의 git clone 했던 폴더에서 bot_sample.go를 mon_bot.go로 이름 변경을 한다.

main함수에서 위쪽의 대부분은 Connection Setting이고

webSocketClient.Listen() 이후가 Chatbot의 동작을 정의해놓은 곳이다.

go func() {
	for {
		select {
		case resp := <-webSocketClient.EventChannel:
			HandleWebSocketResponse(resp)
		case <-ticker.C:
			webSocketClient.Conn.SetWriteDeadline(time.Now().Add(2 * time.Second))
			if err := webSocketClient.Conn.WriteMessage(websocket.PingMessage, []byte{}); err != nil {
				println("send heartbeat error: ", err)
				return
			}
		}
	}
}()

여기서 case resp는 사용자의 입력에 따라 응답을 하는 부분이고

case <-ticker.C는 5초마다 Bot이 죽었는지 살았는지 체크(Heartbeat)하는 부분이다.

우리는 case resp에서 Call하는 HandleWebSocketResponse을 수정할 계획이다.

HandleWebSocketResponse는 HandleMsgFromDebuggingChannel를 부르고

HandleMsgFromDebuggingChannel에 각각의 입력에 대한 동작들이 정의되어 있다.

if post != nill 분기에 아래와 같이 case를 추가한다.

if matched, _ := regexp.MatchString(`(?:^|\W)clean(?:$|\W)`, post.Message); matched {
	// 해당 채널의 지난 내용 삭제하는 함수
	DeleteBotMsgToDebuggingChannel()
	// 글 남기는 함수
	SendMsgToDebuggingChannel("Cleaning is done", post.Id)
	return
}

 

이제 DeleteBotMsgToDebuggingChannel 함수를 작성하면 되는데..

그러기 전에 아래의 코드를 잠깐 봐야 한다.

bot에서 사용되는 library를 선언한 부분으로

SendMsgToDebuggingChannel를 보면 client.CreatePost(post)라는 곳에서 사용되는 걸 확인 할수 있다.

CreatePost는 메시지를 채팅창에 작성하게 하는 함수인데

해당 파일을 열어보니(c:\Users\사용자 이름\go\src\github.com\mattermost\mattermost-server\model\client4.go) 직접 API Call을 보내지 않고도 함수만 호출해서 동작 시킬수 있는 방법이 있음을 확인했다.

 

그래서 어떤 함수를 사용하면 좋을까 해서 찾아보다가

GetPostsForChannel 함수를 활용하면 Channel에 있는 모든 Post(채팅 메시지)를 가져올수 있고

그중에서 bot이 작성한 Post만 추려서 삭제하면 되겠다는 생각이 들었다.

삭제에 대한건 DeletePost 함수를 활용하면 된다.

 

상기의 내용을 코드로 작성하면 아래와 같다.

func DeleteBotMsgToDebuggingChannel() {
	page := 0
	perPage := 100
	etag := ""
	if postList, resp := client.GetPostsForChannel(debuggingChannel.Id, page, perPage, etag); resp.Error != nil {
		println("We failed to delete messages to the logging channel")
		PrintError(resp.Error)
	} else {
		for _, post := range postList.Posts {
			if post.UserId == botUser.Id {
				client.DeletePost(post.Id)
			}
		}
	}
}

코드 자체는 간단해보이지만

자료형들에 대한 내용들을 다른 파일에서 참조해서 작성해야 하는 불편함이 있긴했다.

(c:\Users\사용자 이름\go\src\github.com\mattermost\mattermost-server\model\post_list.go

c:\Users\사용자 이름\go\src\github.com\mattermost\mattermost-server\model\post.go)

 

이걸로 Mattermost Chatbot Side Project는 Close하려고 한다.

반응형
Comments