일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Linux 디렉터리 명령어
- Linux oh my zsh
- 서버의 서비스 방식
- EC2 oh my zsh
- 자바스크립트 이벤트 루프
- Linux pwd
- JavaScript 실행 디버깅
- linux foreground
- EC2 Apache2
- Linux apt
- javascript scope
- EC2 zsh
- 자바스크립트 런타임
- Logback
- HTTP Web Server
- Linux cat
- Linux apt-get
- AWS EC2 서버 만들기
- Linux cd
- Linux rmdir
- Linux mkdir
- Navigation Pattern
- Linux 파일 관리 명령어
- linux background
- JavaScript EventLoop
- Linux ls
- Linux 디렉터리 역할
- javascript 정렬
- EC2 HTTP 호스팅
- Linux 디렉터리 구조
Archives
- Today
- Total
HyunJun 기술 블로그
스프링 프레임워크 Discord Bot 만들기 본문
728x90
반응형
1. 디스코드 봇이란?
채팅방에서의 사용자가 명령어를 입력하면 프로그래밍된 특정한 출력 결과를 제공할 수 있는 계정입니다.
2. Discord 서버 생성
3. Discord App(Bot) 설정
링크 접속 후 로그인을 합니다.
New Application 클릭
MESSAGE CONTENT INTENT를 허용해 주시고 Save Changes 클릭
이것을 허용해 주어야 디스코드 봇이 입력한 메시지를 받을 수 있습니다.
이제 토큰 값을 받기 위해 Reset Token을 클릭해 주세요.
토큰 값을 Copy 한 후 메모장에 따로 잘 저장해 주세요.
매우 중요한 값으로써 현재 창에서 벗어나면 다시 못 봅니다!
아래처럼 Bot에 권한 설정을 해주세요.
아래쪽에 보면 아래와 같이 URL이 생성됩니다. 해당 URL을 브라우저에 입력해 줍니다.
아래와 같은 창이 나오게 되는데요, 처음에 생성한 서버 선택 후 계속하기 클릭
승인!
서버에 들어가 보면 아래처럼 bot이 서버에 접속했습니다!
4. Spring 구현하기
JDA(Java Discord API)를 이용하여 자바에서 디스코드로 접근해 보도록 할게요~
build.gradle
// Slf4j
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// Discord
implementation 'net.dv8tion:JDA:5.0.0-beta.5'
application.yml
discord:
bot:
token: 토큰값기입
- Login이 안 되었을 때 예외 처리를 위한 LoginException을 처리해 주었습니다.
- JDA 객체를 만들고 가지고 온 토큰 값과, 메시지 콘텐츠 적용, 이벤트 리스너 등록을 해주었습니다.
package com.example.discordbot;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
import net.dv8tion.jda.api.entities.Activity;
import net.dv8tion.jda.api.requests.GatewayIntent;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import javax.security.auth.login.LoginException;
@SpringBootApplication
public class DiscordBotApplication {
public static void main(String[] args) throws LoginException {
ApplicationContext context = SpringApplication.run(DiscordBotApplication.class, args);
DiscordBotToken discordBotTokenEntity = context.getBean(DiscordBotToken.class);
String discordBotToken = discordBotTokenEntity.getDiscordBotToken();
JDA jda = JDABuilder.createDefault(discordBotToken)
.setActivity(Activity.playing("메시지 대기 중"))
.enableIntents(GatewayIntent.MESSAGE_CONTENT)
.addEventListeners(new DiscordListener())
.build();
}
}
DiscordBotToken.Java
package com.example.discordbot;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class DiscordBotToken {
@Value("${discord.bot.token}")
private String discordBotToken;
public String getDiscordBotToken() {
return discordBotToken;
}
}
DiscordListener.Java
package com.example.discordbot;
import lombok.extern.slf4j.Slf4j;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;
import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import java.util.Arrays;
@Slf4j
public class DiscordListener extends ListenerAdapter {
@Override
public void onMessageReceived(MessageReceivedEvent event) {
User user = event.getAuthor();
TextChannel textChannel = event.getChannel().asTextChannel();
Message message = event.getMessage();
log.info("get message : " + message.getContentDisplay());
if (user.isBot()) {
return;
} else if (message.getContentDisplay().equals("")) {
log.info("디스코드 Message 문자열 값 공백");
}
String[] messageArray = message.getContentDisplay().split("/");
if (messageArray[0].equalsIgnoreCase("!bot")) {
String[] messageArgs = Arrays.copyOfRange(messageArray, 1, messageArray.length);
for (String msg : messageArgs) {
String returnMessage = sendMessage(event, msg);
textChannel.sendMessage(returnMessage).queue();
}
}
}
private String sendMessage(MessageReceivedEvent event, String message) {
User user = event.getAuthor();
String returnMessage = "";
switch (message) {
case "안녕하세요" : returnMessage = user.getName() + "님 안녕하세요! 좋은 하루 되세요";
break;
case "hi" : returnMessage = "Hello " + user.getAsTag();
break;
case "정보 확인" : returnMessage = user.getAsMention() + "님 저는 Discord Bot 입니다.";
break;
case "1" : returnMessage = user.getName() + " / 1번 옵션";
break;
case "2" : returnMessage = user.getName() + " / 2번 옵션";
break;
default: returnMessage = "못 알아 듣겠어요 죄송합니다.";
break;
}
return returnMessage;
}
}
- onMessageReceived 메서드는 봇이 속한 채팅방에서 누군가가 채팅을 입력한다면, 동작하게 됩니다.
- MessageReceivedEvent 타입이라는 객체로 전달됩니다.
- 이 객체 안에는 어떤 채널의 메시지인지, 메시지 내용, 메시지 작성자 등을 확인할 수 있습니다.
- 유저가 봇이거나 메시지가 공백일 경우 로직을 더 이상 진행하지 않습니다.
- 배열이나 switch 관련 로직은 그다지 어렵지 않으니 직접 한번 커스텀 해보세요!
5. 결과 확인
해당 채팅방에서 !bot을 입력한 뒤 /를 구분자 삼아 명령어를 입력하면 됩니다.
(당연히 스프링 프로젝트가 실행되어 있어야 합니다!)
728x90
반응형
Comments