우린 이제 기능을 만들 것이다.
client.on(EVENT,(param) => {
//my code
});
이는 client.on을 주로사용한다.
client.on은 once와 마찬가지로 param으로 event handler의 종류와 콜백함수를 넘겨준다.
대표적으로 다음과 같은 것들이 있다.
- ready: 클라이언트가 Discord 서버와 연결되고 준비 상태가 되었을 때 호출됩니다.
message: 메시지가 보내졌을 때 호출됩니다. 채팅 메시지를 읽고 처리하는 데 사용됩니다.- messageCreate: Discord에서 새로운 메시지가 만들어질 때 호출됩니다. 일반적으로 message 이벤트와 동일한 용도로 사용됩니다.
- messageUpdate: 기존 메시지가 수정될 때 호출됩니다.
- messageDelete: 메시지가 삭제될 때 호출됩니다.
- interactionCreate: 사용자와의 상호작용(슬래시 커맨드, 버튼, 선택 메뉴 등)이 생성될 때 호출됩니다.
- guildCreate: 봇이 서버에 가입되었을 때 호출됩니다.
- guildDelete: 봇이 서버에서 탈퇴했을 때 호출됩니다.
- guildMemberAdd: 새로운 멤버가 서버에 가입했을 때 호출됩니다.
- guildMemberRemove: 멤버가 서버에서 탈퇴했을 때 호출됩니다.
- voiceStateUpdate: 사용자가 음성 채널에 참여하거나 나갈 때 호출됩니다.
- error: Discord API에서 오류가 발생했을 때 호출됩니다.
최근에 V!4로 discord js가 업데이트됐고, 2번은 쓰이지 않는다.
우리가 개발할 것은 간단한 것이다.
1. 사용자가 명령을 한다.
2. 봇이 명령을 받고 처리한 다음 대답한다.
이 경우 우리가 사용할 수 있는 것은
3번과 6번이다.
이것을 이해하기 위해선 명령어의 종류에 대해 알아야한다.
일반 명령어
디스코드에서 기본적으로 명령어는 /를 이용해서 한다.
/kick /ban 과 같은 것들.
하지만 우리는 명령어를 !hello ?bye asdfgjfjdj 그냥 앞에오는 특수문자도 마음대로 써도되고, 굳이 특수문자없는 명령어를 써도 된다.
디스코드에서 이런 명령어를 처리하는 방식은
1. 봇이 유저의 메시지를 앞에서부터 읽음
2. 메시지가 S글자 string이라하자. 1번째~i번째 부분 부분문자열이 봇에 등록된 명령과 같다면 명령이 작동한다.
이걸 가능하기 하는건 이런 코드이다.
client.on('messageCreate', (message) => {
if (message.content.startsWith('!help')) { // 메시지를 시작부터 잘랐을때 !help인 모든 메시지
message.author.send('hello'); // hello라는 개인 메시지를 보냄
}
})
즉 조건문으로 만약 조건에 걸린다면, 그 조건에 해당하는 코드를 작동시키는 방식이다.
슬래시 명령어
기본적으로, discord는 명령어를 /로 처리한다.
난 슬래시 명령어가 더 좋은 것 같은데, 그 이유는 다음과 같다.
1. 디스코드 서버내에서 깔끔하다.
일반 명령어는 명령을 보내면 메시지가 2개가 필요하다: 사용자가 보낸 명령, 봇이 명령에 답한 결과
하지만 슬래시 명령어는 메시지하나에서 유저가 사용한 명령과 그 결과를 보여줄 수 있다.
2. 사용자 입장에서 더 편리하다.
명령에 인수를 줄때, 인수의 개수와 각각의 자료형을 디스코드가 알아서 처리해서 보여준다.
메시지 자체를 처리할땐 위의 이벤트 헨들러가 더 이용법이 많겠지만, 명령어 형식은 슬래시를 사용하는 것이 어떤 단점이 있을진 모르겠다. (테스트를할때, 명령어를 복붙할 상황이 많을 때 등 특정 케이스는 일반 명령어를 사용하시는 분이 있다고 말씀주셨다.)
이걸 가능하게 하는건 이런 코드이다.
client.on('interactionCreate', async (interaction) => {
if (!interaction.isCommand()) return; // 명령어에 없는 경우
const { commandName } = interaction;
if (commandName == 'hello') { // 명령어 이름과 대응되면
await interaction.reply('hello');
}
})
즉 우리는 상황에 따라
interactionCreate와 messageCreate 이벤트를 이용해 명령어를 처리해 줄 것이다.
'개발' 카테고리의 다른 글
React로 스크롤 기반 인터랙티브 웹 만들기 2 인터랙션 (2) | 2023.10.17 |
---|---|
React로 스크롤 기반 인터랙티브 웹 만들기 1 목적, 레이아웃 (0) | 2023.10.15 |
Redux와 Redux ToolKit사용하기 (1) | 2023.08.17 |
discord js 로 간단한 봇 개발하기 1. 초기 설정 (1) | 2023.06.09 |
discord js로 간단한 봇 개발하기.0 개요 (0) | 2023.06.09 |