본문 바로가기

개발/discord BOT

[디스코드 봇 개발] - #3 메시지 읽기, 답장

목차


     

    메시지 읽고 답장

    이벤트 리스너 추가

    JDA jda = JDABuilder.createDefault
                    .addEventListeners(new CommandHandler())
                    .build();

    앞서 #2에서 JDA 객체를 생성할 때 작성한 코드에 addEventListeners메서드를 추가합니다.

    이벤트 리스너 메서드는 리스너에서 정의한 이벤트가 발생할 때마다 구현해놓은 동작을 실행합니다.

     

     

    CommandHandler

    명령어를 처리하고 실행할 클래스를 생성합니다.

    package santa;
    
    import net.dv8tion.jda.api.entities.Message;
    import net.dv8tion.jda.api.entities.User;
    import net.dv8tion.jda.api.entities.channel.middleman.MessageChannel;
    import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
    import net.dv8tion.jda.api.hooks.ListenerAdapter;
    
    public class CommandHandler extends ListenerAdapter {
    
        @Override
        public void onMessageReceived(MessageReceivedEvent event) {
            Message msg = event.getMessage();
            MessageChannel channel = event.getChannel();
            User user = event.getAuthor();
    
            System.out.println(event.getMessage());
    
            if(user.isBot()) return;
            if(msg.getContentRaw().equals("hi")) {
                msg.reply("ho ho ho").queue();
            }
        }
        
    }

    봇끼리 대화를 하는 상황이 벌어지면 안 되기 때문에 유저를 확인하여 봇인 경우 리턴시킵니다.

    그리고 "hi"라는 메세지가 들어올 경우 산타봇이 "ho ho ho"하고 답장을 수행하도록 하였습니다.

     

    이벤트 수신 문서

     

    GitHub - discord-jda/JDA: Java wrapper for the popular chat & VOIP service: Discord https://discord.com

    Java wrapper for the popular chat & VOIP service: Discord https://discord.com - GitHub - discord-jda/JDA: Java wrapper for the popular chat & VOIP service: Discord https://discord.com

    github.com

     

     

    그런데 이렇게 구현하고 메시지를 보내면 오류가 발생합니다.

    오류

    Discord now requires to explicitly enable access to this using the MESSAGE_CONTENT intent.
    Useful resources to learn more:
    https://support-dev.discord.com/hc/en-us/articles/4404772028055-Message-Content-Privileged-Intent-FAQ
    https://jda.wiki/using-jda/gateway-intents-and-member-cache-policy/
    https://jda.wiki/using-jda/troubleshooting/#cannot-get-message-content-attempting-to-access-message-content-without-gatewayintent
    Or suppress this warning if this is intentional with Message.suppressContentIntentWarning()
    ReceivedMessage(id=1186986956433915945, author=z_z33, content= ...)

    오류같은 경우에는 콘솔창에 자세하게 설명되어 있으니 링크를 타고 문서를 확인해줍니다.

     

    디스코드 개발자 포털

    디스코드 개발자 포털 - Bot-Privileged Gateway Intents에서

    사용하려는 기능을 활성화합니다.

     

    Gateway Intents 활성화

    JDA jda = JDABuilder.createLight(BOT_TOKEN, GatewayIntent.GUILD_MESSAGES, GatewayIntent.MESSAGE_CONTENT, GatewayIntent.GUILD_MEMBERS)
                    .addEventListeners(new CommandHandler())
                    .build();

    앞서 JDA 객체를 생성할 때 createDefault를 사용하였습니다.

    이것을 createLight로 변경해줍니다.

     

    JDA 버전 5.0.0-alpha.14부터는 intents를 명시적으로 활성화 해야 합니다.

     

    Gateway Intents 문서

     

    Message Content Privileged Intent FAQ - Discord FAQ

    As the popularity and number of Discord bots grow, it's important to keep our users and developers safe and healthy. This means from time to time, like any maturing platform, we need to update our policies to reflect the current needs of the ecosystem.

    discord.faq

     

    Gateway Intents and Member Cache Policy - JDA Wiki

    Gateway Intents In version 4.2.0, we introduced the GatewayIntent enum. This marks a change in the way bots will work in the future. Building JDA is done using one of the JDABuilder factory methods, each of which has some default intents: What Intents do I

    jda.wiki

     

    Troubleshooting - JDA Wiki

    Troubleshooting This is a collection of common issues and recommended solutions. Didn't find an answer? Try asking in our Discord server Shutdown but the process doesn't exit When you call JDA.shutdown() or JDA.shutdownNow() the JDA instance will stop all

    jda.wiki

     

    봇 동작