우선 스프링 프로젝트를 실행하기 전 내 환경은 인텔리제이다.
New Project를 눌러서 프로젝트를 생성한다.
(여기 이용해도 무방 https://start.spring.io/)
의존성 추가는 아래처럼 했는데, 원하는 기능 있으면 원하는 거 고르면 된다.
gradle로 만들면 resources에 application.properties가 있는데, yml으로 다시 만들던지 생성하던지 해서 아래처럼 추가해줬다.
참고로 토큰 값 넣어서 쓰려고 하는건데, 깃에다가 올릴거면 Edit Configurations 사용해서 해도 되고, .gitignore 추가해도 되고 상관없다. 나는 귀찮아서 여기다 넣고 .gitignore로 깃에 안 올리게끔 해놨다.
build.gradle에 discord4j 말고 net.dv8tion:JDA 추가해줬다. 재빌드도 꼭 해주자
// JDA
implementation 'net.dv8tion:JDA:5.0.0-beta.5'
그리고 DiscordBotToken 클래스를 만들었다.
여기서 토큰 값 읽어올거라서 Component 어노테이션을 추가하고 아래 코드를 추가했다.
나는 프로젝트 이름때문에 DicobotApplication이라고 생성됐는데 Application 클래스 들어가서 코드를 추가한다.
토큰이 있어야 봇이 로그인을 하고, 자기 상태나 뭐 행동이나 해주는 것.
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(DicobotApplication.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();
}
DiscordListener 클래스 생성 후 ListenerAdapter를 상속받는다. 그리고... 설명이 귀찮아서 주석 참고
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;
@Slf4j
public class DiscordListener extends ListenerAdapter {
@Override
public void onMessageReceived(MessageReceivedEvent event) {
// 각 사용자, 채팅 채널, 메세지
User user = event.getAuthor();
TextChannel channel = event.getChannel().asTextChannel();
Message message = event.getMessage();
// 유저, 메세지 로그 출력
log.info("user: " + user.getName() + ", get message: " + message.getContentDisplay());
// 사용자가 봇인지 체크하고 맞으면 아래 코드로 안 감
if (user.isBot()) return;
// "봇 {Commend}" 출력
if (message.getContentRaw().charAt(0) == '봇') {
String msg = message.getContentRaw().substring(1).split(" ")[1];
switch (msg) {
case "안녕" -> channel.sendMessage(user.getName() + "님 안녕하세요").queue();
case "태그" -> channel.sendMessage(user.getAsTag() + "는 " + user.getName() + "님의 태그입니다.").queue();
case "멘션" -> channel.sendMessage(user.getAsMention() + ": " + user.getName() + "님을 멘션했습니다.").queue();
default -> channel.sendMessage("잘못된 명령입니다.").queue();
}
}
}
}
조금만 부가 설명하자면 user는 사용자, TextChannel은 채팅치고 있는 채널, message는 말 그대로 메세지다.
MessageReceivedEvent event -> 이게 디스코드 서버에서 메세지 수신받을 때 사용하는 것
user.getName(), getAsTag(), getAsMention() 처럼 디스코드 관련해서 많은 함수가 있다.
한번 찾아봐서 사용해보길
어쨌든 결과는 아래 이미지와 같다.
다음 시간엔 음... 스프링 디스코드봇이랑 웹훅을 만들어보도록 하자. (진행한 내용까지 글 쓰려면 먼 산~)