Socket 모드를 사용하여 Golang을 사용하는 사용자를 정확하게 환영합니다.

느슨한 프로그램을 만들어서 참여도를 높일 때 의미 있는 일대일 소규모 상호작용을 시작해야 한다.예를 들어, 슬랙 App Home 에서 응용 프로그램을 사용하는 방법에 대한 간단한 강좌를 보낼 수 있습니다.사용자가 가입할 때, 당신은 채널의 목적과 규칙을 소개할 수 있으며, 그 중에는 사용자만 볼 수 있는 정보를 포함하여 다른 구성원을 오염시키지 않도록 할 수 있다.
나는 본고가 당신이 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()
    
    }
    

    See main.go full code


    이 코드가 어떤 일을 하든지 하기 위해서 컨트롤러를 만들어야 합니다. 시작합시다.

    드라이버/느슨함 참조.모든 코드 자습서 4단계: 컨트롤러 만들기 > 시작 컨트롤러.가다


    이 컨트롤러를 통해 다음과 같은 프로세스를 수행하려고 합니다.

    컨트롤러의 상단 관리 의존 항목과 이벤트 처리NewGreetingControllerGreetingController의 초기화 구조 함수다.이것은 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의 핵심 논리는 reactToMentionpostGreetingMessage에 정의됩니다.우리 깊이 연구합시다.

    여기 있다 반응성 암시


    코드 세그먼트에는 다음 다섯 가지 중요한 단계가 있습니다.
  • *socketmode.Event는 일반적인 유형의 이벤트로 이 함수를 등록하여 수신AppMentionEvent하기 때문에 더 쉽게 처리할 수 있도록 전송 이벤트를 변환해야 합니다.
  • 메시지를 받았는지 확인해야 합니다.이것은 소켓 모드에 지정되어 있으며, 잊어버리면 오류가 발생할 수 있습니다.
  • 사용자의 실제 이름이 필요하기 때문에 GetUserInfo를 사용합니다.Slack은 이 데이터가 민감하다고 여겨질 수 있기 때문에 사용자 ID만 제공합니다.
  • 저희는 저희의 보기를 사용하여 귀하의 메시지를 생성합니다.우리는 아직 실시하지 않았다!
  • 응용 프로그램 홈 페이지에 메시지를 보냅니다.이것은 까다로운 부분이다.응용 프로그램 Home에서 메시지를 보내려면 channel ID를 사용자 ID로 설정해야 합니다.다시 말하면 당신의 앱 홈 채널 ID는 사용자 UserID입니다.나는 개인적으로 API 실현/약속이 좀 억지스럽다고 생각하지만, 지금 너는 알았다!!
  • 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에 대한 뷰를 만들 때 내 삶을 쉽게 만들기 위해 몇 가지 팁을 사용했습니다.
  • 저는 디자인 UI를 전문적으로 사용하고 JSON 부하를 JSON 파일에 저장합니다.예: greetingViewsAssets/greeting.json 참조.
  • 나는 Block-kit를 사용하여 나의 보기를 보여주고 변수 요소를 주입한다. 예를 들어 사용자 이름이다.
  • Golang 1.16 이후 프로젝트에 삽입된 파일에 접근하기 위해 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
    
    너도 직접 복제 로 미리 시험해 볼 수 있다.

    내 저장소 마지막 생각


    이 강좌를 완성하면 사용자와의 상호작용의 기초를 제공할 것입니다.기술적으로 말하자면, 너는 아직 나에게서 일반적인 소식을 어떻게 보내는지 배우지 못했다.그러나 나는 슬랙이 제공하는 모든 통신 방법을 어떻게 사용해서 통지의 피로를 줄이는 것을 이해하는 것이 중요하다고 생각한다.만약 제작이 잘 되지 않는다면, 한 무리의 게으른 로봇들이 대량의 소음을 일으킬 수도 있다.
    그때부터 슬랙에서 더 높은 기능을 연구할 수 있다. 이 기능들은 당신의 작업 영역 자동화를 새로운 수준으로 향상시켰다. 그것이 바로 응용 프로그램 홈 옵션 카드, 평행봉 명령, 단축키, 상호작용, 작업 흐름이다.

    느슨한 용어 이해 링크

  • App Home
  • Socket Mode
  • App Directory
  • Ephemeral messages
  • Block-kit
  • App Home Tabs
  • Slash command
  • Shortcuts
  • Interaction
  • 좋은 웹페이지 즐겨찾기