안녕하세요. 오랜만이군요.
지난 강좌에서 메신저봇 r의 Api들의 종류에 대해 알아보았습니다.
이번 강좌에서는 입문자에게 자주 쓰이는 Api들의 예제를 보여드리도록 하겠습니다.
이번 강좌에서 풀이할 Api들은 아래와 같습니다.
이름 | 설명 |
Api.reload("스크립트이름.js") 또는 Api.compile("스크립트이름.js") |
해당 스크립트를 컴파일합니다. 참고로 소괄호 안을 비워놓을 시 모든 스크립트들을 컴파일합니다. |
Api.unload("스크립트이름.js") | 해당 스크립트를 컴파일되지 않은 상태로 만듭니다. |
Api.off("스크립트이름.js") | 해당 스크립트의 전원을 끕니다. 소괄호 안을 비울 시 모든 스크립트의 전원을 끕니다. |
Api.on("스크립트이름.js") | 해당 스크립트의 전원을 켭니다. 소괄호 안을 비울 시 모든 스크립트의 전원을 켭니다. |
Api.isOn("스크립트이름.js") |
해당 스크립트의 전원이 켜져 있는지 확인하여 반환합니다. 켜져 있다면 true 를, 꺼져 있다면 false를 반환합니다. |
Api.isCompiled("스크립트이름.js") |
해당 스크립트의 컴파일 상태를 확인하여 반환합니다. 켜져있다면 true를, 꺼져있다면 false를 반환합니다. |
Api.getScriptNames() | 모든 스크립트들의 이름을 반환합니다. |
Api.replyRoom("방이름","내용") |
해당 방에 내용을 전송합니다. 사실 그냥 replier.reply("방이름","내용") 을 쓰는 걸 추천합니다. (안정성 문제) |
Api.canReply("방이름") | 해당 방에 메시지를 보낼 수 있는지 확인하여 가능하다면 true 를, 불가능하다면 false를 반환합니다. |
Api.showToast("제목","내용") | 화면에 토스트 메시지를 띄웁니다. |
Api.makeNoti("제목","내용","id값") |
알림 창에 알림을 띄웁니다. id값을 안 쓰고 그냥 Api.makeNoti("제목", "내용") 만 해도 상관없지만, id값이 계속 달라지게 하면 새 알림이 이전의 알림을 대체하지 않고, 여러 개가 같이 나타납니다. |
Api.papagoTranslate("번역할 언어코드","번역결과의 언어코드", "내용") |
파파고 번역을 합니다. 모든 메신저봇 유저들의 총합 사용 횟수가 10000회로 제한되어 있기에 남발하는 것은 심한 민폐입니다. 언어코드에 관해서는 https://developers.naver.com/docs/papago/papago-nmt-api-reference.md 을 참고하시면 되겠습니다. |
(스크립트 이름 뒤에. js를 붙일 필요는 없습니다.)
위 표는 입문자들이 자주 쓰는 Api들의 목록입니다.
우선 Api.reload()의 경우 봇의 모든 스크립트들을 컴파일합니다.
이는 봇을 리셋(?)하는 용도로 쓰이기도 하고, 에러가 났을 때 스크립트를 재 컴파일하는데 자주 사용됩니다.
const scriptName = "테스트.js";
function response(~~){
try{
//코드가 들어갈 자리
}catch(e){
Api.reload(scriptName);
}
}
소괄호 안에 있었어야 할 것들은 편의상 ~~으로 대체하였으나 실제 소스에서는 다 넣으셔야 합니다.
여기서
try {} catch(){}
이라는 처음 보는 것이 튀어나왔습니다.
이것은 try뒤에 나오는 중괄호 안의 코드를 실행하고, 그 코드에서 throw 된 값이 catch의 소괄호와 일치하다면 catch의 중괄호 안의 코드를 실행합니다. 일치하지 않거나 throw 된 값이 없다면 catch의 중괄호는 건너뜁니다.
이해하시기 힘들 겁니다. throw는 또 뭔지 궁금하실 테죠. 괜찮습니다. 지금 다룰 내용은 아니니 말이죠.
그냥
try{
}catch(e){
}
로 생각하고, try의 코드에서 에러(e)가 나면 catch의 코드를 실행하고, 에러가 안 나면 catch는 건너뛴다고 생각하시면 됩니다.
다시 본론으로 돌아가서, 처음의 예제에서는 try안의 코드에서 에러가 난다면 catch문을 실행하여 scriptName이라는 스크립트를, 즉 테스트.js를 재 컴파일합니다. 이는 나중에 자주 쓰이게 되니 알고 넘어가면 좋습니다.
물론 간단하게
if(msg=="/전체 컴파일") Api.reload();
처럼 쓰일 수도 있습니다.
다음으로 Api.unload()는 Api.reload()와 정 반대입니다. 바로 스크립트를 컴파일되지 않은 상태로 바꾸는 거죠.
자주 쓰이진 않지만 사용법은 Api.reload()와 비슷합니다.
Api.off()는 소괄호 안의 이름을 가진 스크립트의 전원을 꺼버립니다. 여기엔 자기 자신도 포함됩니다.
봇의 전원을 끄는 용도로 사용되지만, 다시 켤 수도 있어야 하기에 바로 뒤에 설명할 Api.on()이 있는 스크립트는 설정에서 Api.off() 무시하기 를 켜 놓아야 합니다.
예제는 다음과 같습니다.
if(msg=="/끄기") Api.off();
위는 모든 스크립트의 전원을 꺼버리는 것입니다.
아래는 특정 스크립트의 전원을 끄는 예제입니다.
if(msg.startsWith("/끄기 ")) Api.off(msg.replace("/끄기 ",""));
/끄기 스크립트 이름을 하면 스크립트 이름 을 끕니다.
예를 들어
/끄기 테스트.js
를 한다면 테스트.js가 꺼집니다.
참고로 .startsWith()는 앞의 문자열이 소괄호 안의 문자열로 시작하는지 검사하여 맞다면 true를, 아니라면 false를 반환합니다.
Api.on()은 소괄호 안의 이름을 가진 스크립트의 전원을 켭니다. 보통 봇의 전원을 켤 때 사용되죠.
off와 on은 봇의 전원 관리에 사용될 때는 다음과 같이 쓰일 수 있습니다.
if(msg.startsWith("/끄기 ")) Api.off(msg.replace("/끄기 ",""));
if(msg.startsWith("/켜기 ")) Api.on(msg.replace("/켜기 ",""));
if(msg=="/모두 끄기") Api.off();
if(msg=="/모두 켜기") Api.on();
(간단)
Api.isOn()은 소괄호 안의 스크립트가 켜져 있는지 검사하여 true나 false를 반환합니다.
이를 써서 봇이 켜져있는지 검사할 수 있습니다. 물론 다른 응용법들도 뒤에서 풀이하겠습니다.
Api.isCompiled()는 소괄호 안의 스크립트가 컴파일되어 있는지 검사하여 true나 false를 반환합니다.
매우 긴(수백 줄에서 수천 줄 이상) 스크립트들의 경우 컴파일하는데 많은 시간이 걸리는데,
이것을 이용하여 컴파일되지 않은 스크립트들만 선택적으로 컴파일하여 시간을 절약할 수 있습니다.
위를 하려면 한 Api를 더 사용해야 하기에 그것과 함께 다루겠습니다.
Api.getScriptNames()는 모든 스크립트들의 이름들을 , 로 이어 붙여서 반환합니다.
이때 이름에서 .js는 빠집니다.
당장에 어디다가 쓰는지 모르실 테니 응용법을 알려드리죠.
Api.getScriptNames().split(",").length
를 하면 스크립트가 총 몇 개인지 알 수 있습니다.
또, 이를 응용하면 앞에서 말했던 선택적인 컴파일도 가능하며,
켜져 있는 스크립트의 이름만 반환하게 할 수도 있습니다.
예제로 보여드리죠.
var scripts = Api.getScriptNames().split(","); //스크립트들을 배열로 하나씩 나눈다.
var scriptamount = scripts.length; //스크립트들의 개수
if(msg=="/전부 컴파일"){
for(var i = 0 ; i < scriptamount ; i++){
if(Api.isCompiled(scripts[i])==false) Api.reload(scripts[i]);
}
replier.reply("완료");
}
위 예제는 msg가 /전부 컴파일 일 시 for문으로 스크립트의 컴파일 여부를 확인하고 안 되어 있다면 컴파일 한 뒤 다음 스크립트를 검사하는 것을 반복하다가 모든 스크립트들을 검사했을 때 채팅방에 완료를 보내고 종료합니다.
저기서 scripts[i] 는 배열에 담긴 스크립트들의 이름에서 앞에서부터 하나씩 빼오는 용도입니다.
배열 객체의 응용이라고 보면 되겠습니다.
변수 i는 for문이 반복되면서 0, 1, 2, 3 이렇게 증가하므로
1번째 검사대상은 scripts[0], 2번째는 scripts[1] 이런 식입니다.
다음 예제는 켜져 있는 스크립트의 이름만 반환하는 겁니다.
var scripts = Api.getScriptNames().split(","); //스크립트들을 배열로 하나씩 나눈다.
var scriptamount = scripts.length; //스크립트들의 개수
var onscripts = [];
if(msg=="/켜져있는 스크립트 목록"){
for(var i = 0 ; i < scriptamount ; i++){
if(Api.isOn(scripts[i])) onscripts.push(scripts[i]);
}
replier.reply(onscripts.join("\n"));
}
위 예제는 msg가 /켜져있는 스크립트 목록 일 시 for문으로 스크립트가 켜져 있는지 확인하고 켜져 있다면 onscripts 배열에 추가합니다.
모든 스크립트들을 검사했다면 마지막에 엔터로 이어 붙여서 채팅방에 전송합니다.
예를 들어
a, b, c, d 이렇게 4개의 스크립트들이 있고, 그중 a, b 만 켜져 있다고 하면
채팅방에는
a
b
라는 메시지가 전송됩니다.
Api.replyRoom("", "") 은 사실 쓰는 것을 비추천합니다.
오류가 자주 나고, 아예 작동하지 않는 경우도 있기에 그냥 replier.reply() 쓰세요. 사용법도 replier.reply와 같습니다.
Api.canReply()는 소괄호 안의 이름을 가진 방이 존재하는지, 존재한다면 메시지를 보낼 수 있는지 확인합니다.
이것은 봇이 방에서 강퇴되는 등의 이유로 메시지를 보낼 수 없는 상황에서 에러가 나는 것을 막을 때 쓸 수 있습니다.
if(Api.canReply(room)){
//코드가 들어갈 자리
}
이렇게 해주면 해당 방에 메시지를 보낼 수 있을 때만 봇이 작동하기에 메시지를 보내는데 실패하여 에러가 나는 상황을 줄일 수 있습니다.
Api.showToast()의 주요 쓰임은 개발자 호출입니다.
메신저봇 r 앱에서 화면에 토스트 메시지를 띄웁니다.
호출이 많아지면 짜증이 납니다.
if(msg=="@내 이름") Api.showToast(room+"에서 "+sender+" 님의 호출","");
함정은 필자의 경우 제목만 뜨고 내용은 사라졌다는 것.
이것의 경우 다음으로 설명할 Api.makeNoti()와 함께 사용하면 완벽한 호출 어그로가 됩니다.
Api.makeNoti()는 개발자 호출이나 개발자가 알아야 할 정보들(예 : 오류 메시지)을 알림 창에 띄울 때 사용됩니다.
if(msg=="@내 이름") Api.makeNoti(room+" 에서",sender+" 님의 호출");
위의 Api.showToast()와 같이 쓰면 환상적인 어그로 콤비가 됩니다.
아래의 예제는 오류 발생 시 그 내용을 알림 창에 띄웁니다.
try{
//코드가 들어갈 자리
}catch(e){
Api.makeNoti("오류 발생!", "내용 : "+e);
}
Api.papagoTranslate()는 되도록이면 쓰지 않는 것을 추천합니다. 메신저봇 유저들 모두가 10000회라는 사용제한을 공유하고 있기에 누군가 실수로 반복문을 잘못 돌린다거나 해서 10000회를 다 써버린다면 다른 유저들은 못 쓰게 되기 때문이죠.
그래도 초보자가 papago의 공식 번역 Api를 쓰기엔 난이도가 심하니 한영 번역 정도만 알려드리겠습니다.
if(msg.startsWith("/한영 번역 ")){
var a = msg.replace("/한영 번역 ","");
replier.reply(Api.papagoTranslate("ko","en",a));
}
if(msg.startsWith("/영한 번역 ")){
var b = msg.replace("/영한 번역 ","");
replier.reply(Api.papagoTranslate("en","ko",b));
}
위쪽의 if문은 /한영 번역 뒤에 한글을 적을 시 그것을 영어로 번역합니다.
아래의 경우 /영한 번역 뒤에 영어를 적을 시 그것을 한글로 번역합니다.
이번 강좌는 여기까지입니다. 이해 안 되는 부분도 많겠지만, 하다 보면 나중에 다시 봤을 때 이해가 될 겁니다.
궁금한 점은 댓글로 질문해 주시면 되겠습니다.
(혹시나 예제에 오류가 있을 시 댓글로 알려 주시면 감사하겠습니다.)
다음 강좌에선 Utils에 대해 풀이하도록 하겠습니다.
모두 다음 강좌에서 봅시다.
'메봇 강좌' 카테고리의 다른 글
5.1.메신저봇r의 Api 설명 (7) | 2020.05.03 |
---|---|
5.메신저봇r이 지원하는 기능들 (0) | 2020.05.03 |
3.4.switch문의 사용법 (0) | 2020.05.03 |
4.4.문자열 객체의 사용법 (2) | 2020.04.19 |
4.3.배열 객체의 사용법 (0) | 2020.04.05 |