디스코드 봇, 천애명월봇은 어떻게 제작되었을까?

안녕하세요!
오늘은 제가 제작했던 천애명월봇! 그중에서 핵심 기능인 문답족보 시스템이 어떻게 구현되어있는지 알려드리고자 합니다.
 
제가 디스코드용 Bot인 천애명월봇을 처음 만들고자 했을때, 
구현하고자 하는 시스템을 참고하거나 참조할만한 자료가 없었습니다.
 
이 글을 보는 누군가가 나중에 다른게임이 됐든 아니면 비슷한 봇을 제작해보고자 할때 참고할만한 자료가 됐으면 하는 바람으로 글을 써보려고합니다.
사실 천애명월봇의 문답시스템은 사용하는것 만큼 제작 또한 심플하게 되어있습니다.
 
1. 문제 데이터베이스와 모듈 불러오기
const api = "문답 데이터베이스"; //문답 데이타베이스 불러오기
const snekfetch = require("snekfetch"); //모듈 불러오기
const Discord = require("discord.js"); //모듈 불러오기

우선 가장 중요한 문답 데이터베이스를 불러와야합니다.  
저는 속도와 관리의 편의성을 위해 문답 데이터베이스를 json파일형식의 포맷으로 서버에 업로드해두고 불러왔습니다. 
그리고 봇의 핵심 모듈인 snekfetch 라는 모듈을 이용하기로 했습니다. 
snekfetch는 파일의 내용을 읽어드리는 모듈이라고 이해하시면됩니다. 
즉 snekfetch라는 모듈을 통해 문답데이터 베이스를 읽어드린것입니다. 

module.exports.run = async (bot, message, args) => {
    snekfetch.get(api).then(r => {  // snekfetch를 통해 최상단 api변수에 저장된
                                       데이터베이스를 불러오라는 명령을 합니다.
        let body = r.body;

        let quiz = args.join("");  //join 명령어를 통해 quiz내용을 입력받습니다.
        if (quiz.length < 1) return message.channel.send("퀴즈내용을 입력해주세요..") 
        //quiz.length <1 이라는 것은 만약 입력받은 글자의 길이가 1미만. 
          즉 1글자도 입력되지 않았다면.. 
          메시지 채널에 퀴즈 내용을 입력해달라는 멘트를 보내겠다는 뜻입니다. 
 
          실제 !퀴즈 입력후 아무런 내용도 입력하지 않을 경우, 
          위 사진처럼 채널에는 퀴즈내용을 입력해달라는 멘트가 출력됩니다.

        let entry = body.find(post => post.quiz.includes(quiz)); 
        //find 명령어로 데이터베이스내에 입력한 값을 조회하고 입력한 값이 
          incldues 즉 DB의 quiz에 포함되어있다면 entry라는 변수에 담아둡니다.
        if(!entry) return message.channel.send("검색결과가 없습니다."); 
        //프로그래밍에서 !는 반대의 뜻을 갖습니다. 
          조건식인 if문을 통해 !entry (entry변수와 반대되는 경우)
          만약 entry변수와 반대되는 상황.. 
          즉 "검색내용이 데이터베이스에 포함되어있지 않다면"을 의미합니다.
          채널에 검색결과가 없다는 멘트가 출력됩니다.
 
**사전 정의된 데이터베이스 구조는 quiz부분과 answer부분으로 나뉘어있습니다.**
               ex) quiz : "문제 내용",
                   answer : "문제에 대한 정답",

             .addField("문제",entry.quiz) 
             //addfield는 사용자정의로 출력값을 보여주는 기능을합니다.
               위에 entry 설명을 보시면 find명령어로 문제를 검색하고 해당값을 저장해둔다고
               설명드렸습니다. 그 저장된 값을 가지고 출력하는 것입니다.
               "저장된 entry에서 quiz값만 보여주세요"

            .addField("정답",entry.answer);
               "저장된 entry에서 answer값만 보여주세요" 

        message.channel.send({embed: embed}); //위의 종합된 정보를 메세지 채널로 보냅니다. 
    });
}

module.exports.help = {
    name: "퀴즈" //명령어를 지정합니다. 즉 !퀴즈 라는 명령어를 사용하도록 지정하는 것입니다.
}
결과값입니다.
위의 설명이 조금 어렵게 적힌것 같긴하지만.. 최종 결과값과 함께보시면 어느정도 이해하는데 도움이 되리라 생각됩니다.
 
 
핵심은!!
파일형태로 문답 데이터베이스를 정의해두고,
모듈을 통해 해당 문답파일을 불러오는 것입니다.
 
그런후 조건식을 이용해서 해당 문제를 찾은 후 변수에 저장!
저장된 변수값을 출력! 하는 것 입니다.
 
 
생각보다 심플한 코딩이라고 저는 생각합니다.
이걸 응용해서 다른게임을 하실때 한번 직접 만들어보시는것도 좋은 경험이 되리라 생각됩니다.!!
 
Avatar for 로스트

생각을 글로 쓰는 것을 좋아합니다. 이것 저것 호기심이 많기 때문에, 다양한 주제로 글을 씁니다. (물론 전문성은 1도 없습니다.)

    No Comment.