커맨드란 무엇인가


commanduser 혹은 manager가 채팅 위즈윅을 통해 연동을 원하시는 개발 서버의 기능을 이용할 수 있도록 만들어진 인터페이스입니다. command 가 호출되면, 채널톡 API 서버는function 프로토콜을 통해 연동을 원하시는 서버로 요청을 전송하게 됩니다.


커맨드 등록방법



{
	"name" : "commandName",
	"scope" : "desk",
	"description": "this is test command",
	"nameDescI18nMap": {
			"en": {
				"description": "test command en",
				"name": "test"
			},
			"ko": {
				"description": "테스트 커맨드",
				"name": "테스트"
			}
		},
	"actionFunctionName": "testFunction",
	"autoCompleteFunctionName": "autoCompleteFunctionName",
	"paramDefinitions" : [
		{
			"autoComplete": true,
			"name": "parameterName",
			"nameDescI18nMap": {
				"en": {
					"name": "parameterEn"
				},
				"ko": {
					"name": "한국어파라미터"
				}
			},
			"required": false,
			"type": "string"
		}
	],
	"enabledByDefault": true,
  "alfMode": "disable"
}

Command

fieldtypeexamplerequirednotes
namestring"testCommand"true
scopestring"desk"truedesk or front
descriptionstring"test description"false
nameDescI18nMapmapcheck example abovetrue각 언어 객체는 반드시 name과 description을 포함해야합니다.
actionFunctionNamestring"writeMessage"true앱스토어가 호출할 함수의 이름입니다.
autoCompleteFunctionNamestring"autoComplete"falseautoComplete시에 호출할 함수의 이름입니다.
paramDefinitionsarraycheck example belowtruefunction call에 사용되는 파라미터 입니다.
enabledByDefaultbooltruefalse이 옵션이 꺼져있으면 command를 노출하지 않습니다.

ParamDefinition

fieldtypeexamplerequirednotes
namestringuserIdtrue파라미터 이름
typestringstringrequiredstring, float, int, bool 중에 하나여야합니다.
requiredbooltruetrue
descriptionstring"사용자 ID"false
choicesarraycheck example belowfalse정적인 선택지가 필요할 때 사용됩니다.
nameDescI18nMapmapsame as abovefalse
autoCompletebooltruefalse이 값이 true라면 해당 param은 autoComplete를 사용할 수 있습니다.

choice

fieldtypeexamplerequirednotes
namestringcountrytrue
valuestringKRtrue
nameDescI18nMapmapcheck example abovefalse


Register API


Request

요청하기전 issueToken 을 통해 발급된 x-access-token 이 필요합니다. 커맨드 등록을 위한 issueToken 시에는 channelId 를 기입하지 않으셔야 한다는 점에 유의해주세요. secret 필드를 통해 발급하신 app-token 을 이용해 요청해 주셔야 합니다. appId 의 경우 개발자 페이지에서 확인하실 수 있습니다. 자세한 내용은 [인증 및 권한] 탭을 참조해 주세요.

PUT https://app-store-api.channel.io/general/v1/native/functions

fieldtypeexamplerequirednotes
appIdstring"app-123"true커맨드를 등록할 app의 id
commandsarraylist of commandstrue

cURL

curl -X PUT \\
'<https://app-store-api.channel.io/general/v1/native/functions>' \\
-H 'x-access-token: {x-access-token}' \\
-H 'Content-Type: application/json' \\
-d '{
  "method": "registerCommands",
  "params": {
    "appId": "{appID}",
    "commands": [
      {
        "name": "commandName",
        "scope": "desk",
        "description": "this is test command",
        "nameDescI18nMap": {
          "en": {
            "description": "test command en",
            "name": "test"
          },
          "ko": {
            "description": "테스트 커맨드",
            "name": "테스트"
          }
        },
        "actionFunctionName": "testFunction",
        "autoCompleteFunctionName": "autoCompleteFunctionName",
        "paramDefinitions": [
          {
            "autoComplete": true,
            "name": "parameterName",
            "nameDescI18nMap": {
              "en": {
                "name": "parameterEn"
              },
              "ko": {
                "name": "한국어파라미터"
              }
            },
            "required": false,
            "type": "string"
          }
        ],
        "enabledByDefault": true,
        "alfMode": "disable"
      }
    ]
  }
}'



Command Handling


엔드 유저가 command 를 호출하게 되면 개발하신 서버의 functionEndpoint url 을 통해 요청이 전송됩니다. 개발하시는 서버에서 해당 요청을 스펙에 맞게 핸들링하고 반환하셔야 합니다. 요청과 응답 스펙은 아래와 같습니다. functionEndpoint 등록은 이 문서를 참고해주세요.


Request Body

fieldtypeexamplerequirednotes
methodstring"getOrders"true
paramsobject아래 예시 참고true
contextobject아래 예시 참고true

호출되는 function 의 method 는 커맨드 등록시 actionFunctionName 을 통해 지정하실 수 있습니다

commandname 이 아닌 actionFunctionNamemethod 로 하여 요청을 핸들링해야 한다는 점을 유의해 주세요.


Params

호출자 정보를 제외한 커맨드 호출 정보를 담고 있습니다.

fieldtypeexamplerequirednotes
chatchat아래 예시 참고true커맨드를 호출한 채팅방 정
inputobject아래 예시 참고true호출자의 파라미터 입력값
languagestring"ko"false호출자의 언어

chat

fieldtypeexamplerequirednotes
typestringgrouptruegroupChat, userChat, directChat이 올 수 있습니다.
idstring123truechat의 id

input

input은 유저/매니저가 커맨드 실행에 입력한 파라미터 값입니다. 커맨드 등록 시 ParamDefinition에 매핑되는 값으로 이해하시면 됩니다. 키-값 형태의 맵으로 제공되며, ParamDefinition 에 따라 복수개의 키-값 쌍이 존재할 수 있습니다.

fieldtypenotes
{key}stringcommand 등록시 ParamDefinition 에 기입한 name
{value}ParamDefinitiontype유저 / 매니저가 커맨드 실행시 기입한 파라미터

Context

커맨드를 누가 호출헀는지에 대한 정보를 담고 있습니다.

fieldtypeexamplerequirednotes
callerobjectcheck example belowtrue
channelobjectcheck example belowtrue

caller

fieldtypeexamplerequirednotes
idstring1423false호출자의 아이디
typestringmanagerrequired호출자의 타입: manager, user

chanel

fieldtypeexamplerequirednotes
idstring1432true커맨드가 호출된 채널의 아이디

Request Example

PUT {등록된 functionEndpoint}

{
	"method" : "some_function_name",
	"params" : {
		"chat" : {
			"id" : "{chat_id}",
			"type" : "{groupChat or userChat or directChat}"
		},
		"input" : {
			"param_name" : "param_value"
		},
		"language": "ko"
	},
	"context" : {
		"caller" : {
			"id" : "{manager_or_user_id}",
			"type": "manager"
		},
		"channel" : {
			"id" : "{some_channel_id}"
		}
	}
}


Response Body

command 의 응답 스펙은 function 프로토콜 위에 구현되어 있습니다. 따라서 성공 여부에 따라 error 또는 result 중 하나를 반환해야 합니다. error 스펙은 Function 문서를 참조해 주세요. command 의 성공 응답으로 result 를 반환하는 스펙은 아래 [WAM 을 활용한 Command] 부분을 참조해 주시면 됩니다.

fieldnotes
error에러 구조체
result성공시 응답값


WAM을 활용한 Command


WAM(Web Application Module)을 활용하는 command인 경우 result 아래의 응답값을 아래와 같이 보내야 합니다. typewam인 응답인 경우, 클라이언트에서 WAM Controller를 호출하고 응답으로 명시한 WAM을 표시합니다.

{
  "result": {
    "type": "wam",
    "attributes": {
        "appId": "app_id",
        "clientId": "client_it",
        "name": "wam_name",
        "wamArgs": {
	        ...
        }
    }
  }
}
fieldtyperequirednotes
typestringtrue“wam” 으로 고정
appIdstringtrue앱 아이디
namestringtrueWAM 이름
wamArgsobjectfalseWAM Controller로 넘겨줄 데이터


AutoComplete of Command


	{
	  ...
		"autoCompleteFunctionName": "autoCompleteFunctionName",
		"paramDefinitions" : [
			{
				"autoComplete": true,
				"name": "parameterName",
				"required": true,
				"type": "string"
			}
		]
		...
	}

autoComplete 을 포함한 커맨드 등록 페이로드의 예시

paramDefinition 에서 위와 같이 “autoComplete”: true 를 지정하는 경우 사용자가 해당 파라미터를 입력할 때 자동완성 기능을 사용할 수 있습니다. 앱 서버는 자동완성 요청을 받아 선택지를 반환해야 합니다. 자동완성 기능을 사용하는 경우 autoCompleteFunctionName 을 반드시 지정해야 합니다. 요청/응답 스펙은 아래와 같습니다.

  • autoComplete 을 포함해 앱 서버로 오는 모든 요청은 Function 스키마를 따라갑니다.
  • 아래 표의 methodFunctionmethod 를 의미합니다
fieldvaluenotes
method{register 시에 등록한 autoCompleteFunctionName}앱 서버로 보내지는 커맨드의 자동완성 요청입니다
Request

Function 스펙의 params 만을 기술합니다.

{ "chat": { "type": "userChat" "id": "userChat-123" }, "input": [ { "name": "param1" "value": "val" "focused": false }, { "name": "param2" "value": "val2" "focused": true }, ] }
fieldtyperequirednotes
chatobject ( 후술 )true자동완성이 트리거된 채팅방 아이디, 타입
inputarray ( 후술)true입력된 파라미터 목록

chat

fieldtyperequirednotes
typestringtrueenum - groupChat, userChat, directChat
idstringtrue채팅방 아이디

input

fieldtyperequirednotes
namestringtrueparamDefinition 에 기입한 파라미터 name
value해당 parameter 의 type 과 동일true현재 입력된 값
focusedbooltrue포커싱 여부. true 일 경우 현재 사용자가 입력중인 값. array 중 하나만 true 이고 나머지는 false.

Response

Function 스펙의 result 만을 기술합니다.

{ "choices": [ { "name": "option1" "value": "value1" }, { "name": "option2" "value": "value2" }, ... ] }
fieldtyperequirednotes
choicesarray ( 후술 )true자동완성 결과로 내려줄 선택지 목록

choices

fieldtyperequirednotes
namestringtrue자동완성 선택지의 표기용 값
value해당 parameter 의 type 과 동일true선택시 자동완성될 값. 파라미터의 type 과 일치해야 함.