Socket 모드를 사용하여 Golang을 사용하는 사용자를 정확하게 환영합니다.
26499 단어 tutorialslackprogramminggo
나는 본고가 당신이 Slack 응용 프로그램의 일부 핵심 기능을 이해하는 데 도움을 줄 수 있기를 바랍니다.인코딩을 시작하기 전에 두 가지 용례를 보여 주고 슬랙의 용어를 설명해 드리겠습니다.이 기본 설정이 있으면 사용자와 더욱 흥분된 상호작용을 할 수 있을 것이다.나는 이것들이 어떠한 해이한 응용 프로그램의 기초라고 생각한다.
이 강좌는 slack-go 라이브러리와 Slack Socket Mode를 사용하여 제가 Golang에서 처음에 언급한 두 가지 용례를 실현하는 것을 지도할 것입니다.
Why Socket Mode?
너는 공공 서버가 필요 없다.노트북, 복분자 pi, 또는 개인 서버가 로봇을 위탁 관리할 수 있다는 얘기다.Socket 모드는 배포하지 않으려는 소규모 어플리케이션에 적합합니다.
응용 프로그램 디렉토리 예1: 사용자가 채널에 가입할 때 짧은 인사 메시지를 보냅니다.
특정 사용자만 볼 수 있고 대화가 지속되지 않습니다.이것은 사용자 상호작용에 대한 이상적인 반응이다. 예를 들어 채널 가입, 민감한 정보 대답, 지령 제시 등이다.
Ephemeral messages
예2: 응용 프로그램 홈페이지에서 응용 프로그램이나 로봇에 대한 메시지로 응답하기
는 Slack 애플리케이션을 위한 전용 공간입니다.맞춤형 로그인 페이지를 만들고 응용 프로그램을 기록하는 페이지를 추가할 수 있으며, 응용 프로그램과 사용자 사이에 개인 메시지 라인이 있습니다.짧은 메시지와 달리, 이 메시지는 오래 지속됩니다. 이것은 당신이 보낸 모든 알림과 기교가 쉽게 접근할 수 있음을 의미합니다.그 밖에 저는 개인적으로 로봇을 통해 개인 메시지로 보내는 것이 아니라 슬랙 앱 홈에서 정보성 메시지를 보내는 것을 좋아합니다.사용자가 당신의 앱 홈이 당신의 앱이나 Bot 정보를 찾을 수 있는 곳이라고 믿게 하고 싶다.
App Home
자습서 1단계: 응용 프로그램 구성
를 생성합니다 .멋진 이름을 지어주세요.
new Application
해당 섹션에서 소켓 모드를 활성화합니다.프로그램에 제공된 영패를 저장하는 것을 잊지 마십시오.
이벤트 Api를 활성화하고 다음 이벤트에 가입합니다.
이동
OAuth & Permissions
저장Bot User OAuth Token
필요에 따라 다음 권한을 추가합니다.자습서 2단계: 프로젝트 저장소 만들기
우선, 새로운 go 프로젝트를 만들고
slack-go
라이브러리를 가져옵니다.go mod init
go get -u github.com/slack-go/slack
나는 이 강좌에서 나의 fork ofslack-go
를 사용한다. 왜냐하면 내가 보여준 기능이 아직 통합되지 않았기 때문이다
.fork를 사용하려면
go.mod
에 replace 문을 추가해야 합니다.replace github.com/slack-go/slack => github.com/xnok/slack
그런 다음 이러한 변화를 고려하도록 강요합니다.go mod tidy
그리고 다음 항목 구조를 만들거나 저희가 강좌를 배울 때 참고할 수 있습니다+ controllers
|`- greetingController.go
+ drivers
|`- Slack.go
+ views
|`+ greetingViewsAssets
| | `- greeting.json
|`- greetingViews.go
+ main.go
MVC 구조를 사용하여 파일을 구성합니다.다음에 나는 모든 원소와 그 실현을 설명할 것이다.너는 나의 튜토리얼 #PR904 의 전체 코드를 찾을 수 있다.이것은 코드를 후속자에게 나누어 주는 데 도움이 될 것이다.여기 있다 자습서 3:Foundation>main.가다
이 파일
main.go
은 기본적으로 초기화와 의존 항목을 관리한다.우선, 파일에서 우리가 필요로 하는 두 개의 느슨한 영패를 읽는다.SLACK_APP_TOKEN=xapp-xxxxxxxxx
SLACK_BOT_TOKEN=xoxb-xxxxxxxxx
에서 두 환경 변수를 검증하고 Slack 클라이언트를 실례화하는 작은 조수ConnectToSlackViaSocketmode
를 만듭니다.
그리고 이벤트 탐지기와 컨트롤러를 초기화합니다.마지막으로, 프로그램이 슬랙에서 구독한 이벤트를 받기 시작하도록 이벤트 순환을 시작합니다.
func main() {
// read bot token from .env file
err := godotenv.Load("./test_slack.env")
if err != nil {
log.Fatal().Msg("Error loading .env file")
}
// Instantiate slack socket mode client
client, err := drivers.ConnectToSlackViaSocketmode()
if err != nil {
log.Error().
Str("error", err.Error()).
Msg("Unable to connect to slack")
os.Exit(1)
}
// Inject deps in event handler
socketmodeHandler := socketmode.NewsSocketmodeHandler(client)
// Inject deps to Controller
controllers.NewGreetingController(socketmodeHandler)
socketmodeHandler.RunEventLoop()
}
이 코드가 어떤 일을 하든지 하기 위해서 컨트롤러를 만들어야 합니다. 시작합시다.
드라이버/느슨함 참조.모든 코드 자습서 4단계: 컨트롤러 만들기 > 시작 컨트롤러.가다
이 컨트롤러를 통해 다음과 같은 프로세스를 수행하려고 합니다.
컨트롤러의 상단 관리 의존 항목과 이벤트 처리
NewGreetingController
는 GreetingController
의 초기화 구조 함수다.이것은 EventHandler
을 사용하여 우리가 감청하고자 하는 사건을 등록하고, 어떤 함수를 리셋해서 처리합니까?이 Slack 프로그램은 모든 이벤트를 처리하기 위해 프로세서와 중간부품 디자인 모드를 사용합니다. 더 많은 설명이 필요하시면 전문적인 글을 읽을 수 있습니다. type GreetingController struct {
EventHandler *socketmode.SocketmodeHandler
}
func NewGreetingController(eventhandler *socketmode.SocketmodeHandler) GreetingController {
c := GreetingController{
EventHandler: eventhandler,
}
// App Home (2)
c.EventHandler.HandleEventsAPI(
slackevents.AppMention,
c.reactToMention,
)
// App Home (2)
c.EventHandler.HandleEventsAPI(
slackevents.MemberJoinedChannel,
c.postGreetingMessage,
)
return c
}
Bot의 핵심 논리는 reactToMention
및 postGreetingMessage
에 정의됩니다.우리 깊이 연구합시다.여기 있다 반응성 암시
코드 세그먼트에는 다음 다섯 가지 중요한 단계가 있습니다.
*socketmode.Event
는 일반적인 유형의 이벤트로 이 함수를 등록하여 수신AppMentionEvent
하기 때문에 더 쉽게 처리할 수 있도록 전송 이벤트를 변환해야 합니다.GetUserInfo
를 사용합니다.Slack은 이 데이터가 민감하다고 여겨질 수 있기 때문에 사용자 ID만 제공합니다.func (c *GreetingController) reactToMention(evt *socketmode.Event, clt *socketmode.Client) {
// we need to cast our socketmode.Event into slackevents.AppMentionEvent
evt_api, _ := evt.Data.(slackevents.EventsAPIEvent)
evt_app_mention, ok := evt_api.InnerEvent.Data.(*slackevents.AppMentionEvent)
clt.Ack(*evt.Request)
if ok != true {
log.Printf("ERROR converting event to slackevents.MemberJoinedChannelEvent: %v", ok)
}
userInfo, err := clt.GetApiClient().GetUserInfo(evt_app_mention.User)
if err != nil {
log.Printf("ERROR unable to retrive user info: %v", err)
}
// create the View using block-kit
blocks := views.GreetingMessage(userInfo.Name)
// Post greeting message (3) in User's App Home
// Pass a user's ID as the value of channel to post to that User's App Home
// We get the Api client from `clt`
_, _, err = clt.GetApiClient().PostMessage(
evt_app_mention.User,
slack.MsgOptionBlocks(blocks...),
)
//Handle errors
if err != nil {
log.Printf("ERROR reactToMention: %v", err)
}
}
답장
4항을 제외하고 우리의 다섯 가지 요점은
reactToMention
와 같다.우리는 전용 기능을 통해 짧은 정보를 보낸다.func (c *GreetingController) postGreetingMessage(evt *socketmode.Event, clt *socketmode.Client) {
// we need to cast our socketmode.Event into slackevents.AppHomeOpenedEvent
evt_api, _ := evt.Data.(slackevents.EventsAPIEvent)
evt_member_join, ok := evt_api.InnerEvent.Data.(*slackevents.MemberJoinedChannelEvent)
clt.Ack(*evt.Request)
if ok != true {
log.Printf("ERROR converting event to slackevents.AppMentionEvent: %v", ok)
}
userInfo, err := clt.GetApiClient().GetUserInfo(evt_member_join.User)
if err != nil {
log.Printf("ERROR unable to retrive user info: %v", err)
}
// create the View using block-kit
blocks := views.GreetingMessage(userInfo.Name)
// Post greeting message (3)
// We get the Api client from `clt`
_, err = clt.GetApiClient().PostEphemeral(
evt_member_join.Channel,
evt_member_join.User,
slack.MsgOptionBlocks(blocks...),
)
//Handle errors
if err != nil {
log.Printf("ERROR postGreetingMessage: %v", err)
}
}
컨트롤러/인사 컨트롤러 참조.go) 전체 코드 강좌 5단계: 보기 만들기 > 시작 보기.가다
Slack에 대한 뷰를 만들 때 내 삶을 쉽게 만들기 위해 몇 가지 팁을 사용했습니다.
greetingViewsAssets/greeting.json
참조.embed
패키지를 사용합니다.이 보기를 만드는 데는 몇 가지 간단한 절차가 필요합니다.우선, 템플릿을 보여주면 사용자 이름을 메시지에 주입합니다.그런 다음 생성된 JSON을 Slack 메시지로 그룹화할 수 있습니다.
//go:embed greetingViewsAssets/*
var greetingAssets embed.FS
func GreetingMessage(user string) []slack.Block {
// we need a stuct to hold template arguments
type args struct {
User string
}
tpl := renderTemplate(greetingAssets, "greetingViewsAssets/greeting.json", args{User: user})
// we convert the View into a message struct
view := slack.Msg{}
// dump the renderd template into the view
str, _ := ioutil.ReadAll(&tpl)
json.Unmarshal(str, &view)
// We only return the block because of the way the PostEphemeral function works
// we are going to use slack.MsgOptionBlocks in the controller
return view.Blocks.BlockSet
}
Go template 보기/인사 보기를 참조하십시오.모든 코드 이 앱을 사용해 보세요.
튜토리얼이 성공적으로 완료되면 응용 프로그램을 실행할 수 있습니다.
go run ./main.go
너도 직접 복제
로 미리 시험해 볼 수 있다.내 저장소 마지막 생각
이 강좌를 완성하면 사용자와의 상호작용의 기초를 제공할 것입니다.기술적으로 말하자면, 너는 아직 나에게서 일반적인 소식을 어떻게 보내는지 배우지 못했다.그러나 나는 슬랙이 제공하는 모든 통신 방법을 어떻게 사용해서 통지의 피로를 줄이는 것을 이해하는 것이 중요하다고 생각한다.만약 제작이 잘 되지 않는다면, 한 무리의 게으른 로봇들이 대량의 소음을 일으킬 수도 있다.
그때부터 슬랙에서 더 높은 기능을 연구할 수 있다. 이 기능들은 당신의 작업 영역 자동화를 새로운 수준으로 향상시켰다. 그것이 바로 응용 프로그램 홈 옵션 카드, 평행봉 명령, 단축키, 상호작용, 작업 흐름이다.
느슨한 용어 이해 링크
Reference
이 문제에 관하여(Socket 모드를 사용하여 Golang을 사용하는 사용자를 정확하게 환영합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/xnok/properly-welcome-users-in-slack-with-golang-using-socket-mode-2fea텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)