HyunJun 기술 블로그

스프링 프레임워크 Discord Bot 만들기 본문

Spring Framework

스프링 프레임워크 Discord Bot 만들기

공부 좋아 2023. 5. 16. 20:15
728x90
반응형

1. 디스코드 봇이란?


채팅방에서의 사용자가 명령어를 입력하면 프로그래밍된 특정한 출력 결과를 제공할 수 있는 계정입니다.


2. Discord 서버 생성

+ 버튼 (서버 추가하기) 클릭 -> 직접 만들기

 

서버 이름 설정 후 만들기 클릭

 

 

3. Discord App(Bot) 설정

링크 접속 후 로그인을 합니다.

 

 

New Application 클릭

 

Crate!

 

MESSAGE CONTENT INTENT를 허용해 주시고 Save Changes 클릭

이것을 허용해 주어야 디스코드 봇이 입력한 메시지를 받을 수 있습니다.

 

이제 토큰 값을 받기 위해 Reset Token을 클릭해 주세요.

Yes, do it!

 

 

토큰 값을 Copy 한 후 메모장에 따로 잘 저장해 주세요.

매우 중요한 값으로써 현재 창에서 벗어나면 다시 못 봅니다!

 

 

 

APPLICATION ID, PUBLIC KEY

 

CLIENT ID

 

 

아래처럼 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