Slack Next-gen Platform – “channel_created” Event Trigger

This is translation of Slack Next-gen Platform – “channel_created” Event Trigger  written by Kaz (SDK Engineering & DevRel at Slack), I do not include any personal opinion here except guessing when meaning of original text is not clear for me)

이 글은 슬랙의 SDK Engineering / DevRel 인 Kaz 의 글을 번역한것입니다. 저의 개인 의견은 들어가지 않으며, 일부 원문의 의미가 애매한 경우에만 부연 설명을 달았습니다.


이번 튜토리얼에서는, Slack 의 차세대플랫폼에서 event 트리거를 사용하는 방법에 대해 배워보겠습니다. 참고로 event 트리거는 채널 ID 를 필요로 하지 않습니다.

event 트리거는 특정 event 가 발생했을 때, 작동할 수 있는 트리거 인데요, event 트리거의 타입별로 인풋 데이터 스키마가 있기 때문에, 워크플로에서 트리거로부터 필요한 정보를 받을 수 있습니다.

2개 타입의 event 트리거가 존재합니다.

첫번째는 전체 워크스페이스내에 이벤트를 캡쳐할 수 있는 트리거 입니다. 예를 들면 “channel_created” (채널이 생성되었음), “dnd_updated” (멤버의 Do not Disturb 셋팅이 변경된경우), “emoji_changed”(커스텀 이모지가 생성되었거나 변경되었거나), “user_joined_team” (새로 멤버가 조인한 경우) 등이 있겠습니다.

나머지 타입은 특정 채널내에 이벤트가 발생했을 때 트리거가 되는 타입입니다. 예를 들어 “message_posted” (채널에 메세지가 올라왔음), “reaction_added” (멤버가 이모지를 남겼음), “user_joined_channel” (유저가 채널에 조인하였음), “user_left_channel” (유저가 채널을 떠났음) 등이 있겠습니다.

이번 튜토리얼에서는 첫번째 타입에 대해서 배워볼 것입니다. 바로 “channel_created” 입니다.

Prerequisites

차세대 플랫폼을 접하는 것이 처음이시라면, 이전의 튜토리얼인 “The Simplest Hello World” 부터 읽어주세요. 요약하면 유료 Slack 워크스페이스와 해당 워크스페이스에서 “beta feature” 를 사용할 수 있는 권한이 필요합니다. 가지고 계시다면 Slack CLI 와 워크스페이스를 연결하기만 하면 됩니다.

준비되었다면 앱을 한번 만들어보도록 하죠. 시작해보겠습니다.

Create a Blank Project

slack create 명령어를 사용하여, 새로운 프로젝트를 시작할 수 있습니다. 이 튜토리얼에서는 아무것도 없는 상태에서 앱을 만들어보겠습니다. “Blank Project” 를 선택하여 주십시요.

$ slack create
? Select a template to build from:

  Hello World
  A simple workflow that sends a greeting

  Scaffolded project
  A solid foundational project that uses a Slack datastore

> Blank project
  A, well.. blank project

  To see all available samples, visit github.com/slack-samples.

프로젝트가 생성되면, slack run 명령어가 정상적으로 동작하는지 확인해보세요. 이 명령어는 “dev” 버전의 앱을 워크스페이스에 설치합니다. 이 앱의 봇 유저가 생성되고, 이 봇은 API 호출을 위한 봇 토큰 값을 가지고 있습니다.

$ cd affectionate-panther-654
$ slack run
? Choose a workspace  seratch  T03E94MJU
   App is not installed to this workspace

Updating dev app install for workspace "Acme Corp"

  Outgoing domains
   No allowed outgoing domains are configured
   If your function makes network requests, you will need to allow the outgoing domains
   Learn more about upcoming changes to outgoing domains: https://api.slack.com/future/changelog
  seratch of Acme Corp
Connected, awaiting events

Connected, awaiting events 로그 메세지를 보신다면, 이 앱이 성공적으로 워크스페이스에 연결된 것입니다. “Ctrl +C” 를 눌러 로컬 앱 프로세스를 종료합니다.

Define Workflow and Trigger

간단한 데모 워크플로와 link 트리거를 정의해보겠습니다. workflow_and_trigger.ts 로 저장합니다.

// ----------------
// Workflow Definition
// ----------------
import { DefineWorkflow, Schema } from "deno-slack-sdk/mod.ts";
export const workflow = DefineWorkflow({
  callback_id: "example-workflow",
  title: "Example Workflow",
  input_parameters: {
    properties: {
      // All the possible inputs from the "channel_created" event trigger
      channel_id: { type: Schema.slack.types.channel_id },
      channel_name: { type: Schema.types.string },
      channel_type: { type: Schema.types.string },
      creator_id: { type: Schema.slack.types.user_id },
      created: { type: Schema.types.string },
    },
    required: ["creator_id"],
  },
});

workflow.addStep(Schema.slack.functions.SendMessage, {
  channel_id: workflow.inputs.channel_id,
  message:
    `Hi <@${workflow.inputs.creator_id}>, thanks for creating this channel!`,
});

// ----------------
// Trigger Definition
// ----------------
import { Trigger } from "deno-slack-api/types.ts";
const trigger: Trigger<typeof workflow.definition> = {
  type: "event", // Event Trigger
  name: "Trigger the example workflow",
  workflow: `#/workflows/${workflow.definition.callback_id}`,
  // "channel_created" event trigger
  event: { event_type: "slack#/events/channel_created" },
  inputs: {
    channel_id: { value: "{{data.channel_id}}" },
    channel_name: { value: "{{data.channel_name}}" },
    channel_type: { value: "{{data.channel_type}}" },
    creator_id: { value: "{{data.creator_id}}" },
    created: { value: "{{data.created}}" },
  },
};
export default trigger;

여기서 한가지, event.event_type 은 반드시 “slack#/events/channel_created” 여야만 합니다. 트리거로부터 넘어오는 입력값은 5개가 있는데요, 자세한 내용은 공식문서의 data 프로퍼티를 참고하시기 바랍니다. (참고로 event_type, channel_id, channel_name, creator_id, created 입니다.)

manifest.ts 에 워크플로를 추가합니다.

import { Manifest } from "deno-slack-sdk/mod.ts";
import { workflow as DemoWorkflow } from "./workflow_and_trigger.ts";

export default Manifest({
  name: "distracted-bison-253",
  description: "Demo workflow",
  icon: "assets/default_new_app_icon.png",
  workflows: [DemoWorkflow],
  outgoingDomains: [],
  botScopes: [
    "commands",
    "chat:write",
    "chat:write.public",
    "channels:read", // required for the "channel_created" event trigger
  ],
});

워크플로를 추가하는 것 외에도 botScope“channels:read” 권한을 추가하셔야 합니다. 다른 이벤트 트리거를 사용할때 필요한 스코프는 이 링크를 참조하세요.

Create an Event Trigger

다음으로 두개의 윈도우 터미널을 열어주세요. 하나는 slack run 을 실행하고, 다른 하나에서는 slack trigger create 명령어를 실행할 것입니다.

워크플로를 등록하기 위해서, 첫번째 터미널에서 slack run 명령어를 실행주시고, 그 다음 slack triggers create –trigger-def workflow_and_trigger.ts 를 다른 터미널에서 실행해주십시요. 다음과 같은 결과물을 보실 수 있습니다.

$ slack triggers create --trigger-def ./workflow_and_trigger.ts
? Choose an app  seratch (dev)  T03E*****
   distracted-bison-253 (dev) A04FNE*****

Trigger created
   Trigger ID:   Ft04EJ8*****
   Trigger Type: event
   Trigger Name: Trigger the example workflow

Create a New Public Channel

자 이제 워크플로가 준비되었고, 한번 확인해보죠. 퍼블릭 채널을 하나 만들어 보겠습니다. (현 시점에서는 오픈베타에서 퍼블릭 채널만 지원합니다. 그렇지만 프라이빗 채널도 결국은 지원될 것입니다)

다음과 같은 결과물을 보실 수 있습니다.

$ slack run
? Choose a workspace  seratch  T03E94MJU
   distracted-bison-253 A04FACHPQ5R

Updating dev app install for workspace "Acme Corp"

⚠️  Outgoing domains
   No allowed outgoing domains are configured
   If your function makes network requests, you will need to allow the outgoing domains
   Learn more about upcoming changes to outgoing domains: https://api.slack.com/future/changelog
seratch of Acme Corp
Connected, awaiting events

2022-12-15 14:10:28 [info] [Fn04FCVD67J8] (Trace=Tr04F4HN8XQW) Function execution started for workflow function 'Example Workflow'
2022-12-15 14:10:29 [info] [Wf04FP576X3K] (Trace=Tr04G0SD63EC) Execution started for workflow 'Example Workflow'
2022-12-15 14:10:29 [info] [Wf04FP576X3K] (Trace=Tr04G0SD63EC) Executing workflow step 1 of 1
2022-12-15 14:10:30 [info] [Fn0102] (Trace=Tr04G0SD63EC) Function execution started for builtin function 'Send a message'
2022-12-15 14:10:31 [info] [Fn0102] (Trace=Tr04G0SD63EC) Function execution completed for function 'Send a message'
2022-12-15 14:10:31 [info] [Wf04FP576X3K] (Trace=Tr04G0SD63EC) Execution completed for workflow step 'Send a message'
2022-12-15 14:10:32 [info] [Fn04FCVD67J8] (Trace=Tr04F4HN8XQW) Function execution completed for function 'Example Workflow'
2022-12-15 14:10:32 [info] [Wf04FP576X3K] (Trace=Tr04G0SD63EC) Execution completed for workflow 'Example Workflow'

그리고, 방금 만든 채널에서 다음과 같은 메세지를 볼 수 있습니다.

워크플로 자체는 별로 유용하진 않을 겁니다. 그렇지만 채널 owner 들을 위해서 어떤 팁이나 규칙등을 공유하는 의미로 써보실 수 있을 것 입니다.

A Few Things To Know

만약 기존의 Events API 가 익숙하신 분이라면, 차세대 플랫폼의 event 트리거와 Events API 가 좀 해깔리실 겁니다.

Events API 는 채널에서 앱의 멤버쉽을 필요로 합니다. 따라서 앱이 어떤 이벤트를 받았다 라는 의미는, 이 앱은 항상 채널의 컨텐츠에 접근할 수 있다는 의미입니다.

반대로 차세대플랫폼의 event 트리거는, 앱의 봇유저가 채널에 초대되어있지 않더라도 이벤트가 발생했을 때 워크플로를 실행할 수 있습니다.

위의 워크플로로 앱의 봇유저를 채널에 초대할 필요없이 동작합니다. chat:write.public scope 가 있으면 채널에 조인할 필요 없이 앱이 채널로 메세지를 보낼 수 있습니다. 그러나 만약 채널의 메세지를 가져와야 한다면, 이 앱은 반드시 채널의 멤버여야만 하고, channels:history scope 도 가지고 있어야 합니다.

Wrapping Up

이번 튜토리얼에서는 다음과 같은 내용을 배워보았습니다.

  • 워크스페이스 레벨의 이벤트 트리거를 정의하고 사용하는 방법

이 프로젝트는 다음 주소에서도 확인하실 수 있습니다. https://github.com/seratch/slack-next-generation-platform-tutorials/tree/main/08_channel_created_Event_Trigger

이번 튜토리얼도 즐거우셨으면 좋겠네요. 마찬가지로 피드백이나 코멘트가 있으시다면 트위터 (@seratch) 로 연락주시거나, 여기 남겨주세요.

Happy hacking with Slack’s next-generation platform 🚀

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다