[개발] discord 봇 만들기steemCreated with Sketch.

in hive-101145 •  2 years ago 

안녕하세요 @realmankwon 입니다.

discord 봇을 만들기 위해서 discord.js 를 설치하고 예제 코드를 실행하였더니 다음과 같이 에러가 발생하였습니다.

  return () => defaultValue ??= cb();
                            ^^^

SyntaxError: Unexpected token '??='
    at wrapSafe (internal/modules/cjs/loader.js:1001:16)
    at Module._compile (internal/modules/cjs/loader.js:1049:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Module.require (internal/modules/cjs/loader.js:974:19)
    at require (internal/modules/cjs/helpers.js:93:18)
    at Object.<anonymous> (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/@discordjs/rest/dist/index.js:276:19)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)

딱히 잘못된 부분을 찾기가 어려워서 설정 문제가 아닌가 생각했는데 찾아보니 node.js 버전이 16 이상이어야 한다는군요.

nvm 으로 16버전 설치 후 변경하였더니 다른 에러가 발생하였습니다.

    throw new DiscordjsRangeError(ErrorCodes.BitFieldInvalid, bit);
    ^

RangeError [BitFieldInvalid]: Invalid bitfield flag or number: GUILDS.
    at Function.resolve (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/discord.js/src/util/BitField.js:168:11)
    at /Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/discord.js/src/util/BitField.js:163:54
    at Array.map (<anonymous>)
    at Function.resolve (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/discord.js/src/util/BitField.js:163:40)
    at new BitField (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/discord.js/src/util/BitField.js:33:38)
    at new IntentsBitField (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/discord.js/src/util/IntentsBitField.js:9:1)
    at Client._validateOptions (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/discord.js/src/client/Client.js:491:25)
    at new Client (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/node_modules/discord.js/src/client/Client.js:78:10)
    at Object.<anonymous> (/Users/realman/Documents/project/4_blockarchivelabs/uncommonlab/discord/bot.js:5:16)
    at Module._compile (node:internal/modules/cjs/loader:1165:14) {
  code: 'BitFieldInvalid'
}

기존 소스는 다음과 같습니다.

const Discord = require('discord.js');  // discord.js 라이브러리 호출
const client = new Discord.Client({ intents: ["GUILDS", "GUILD_MESSAGES"] })    // Client 객체 생성

// discord 봇이 실행될 때 딱 한 번 실행할 코드를 적는 부분
client.on('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
  
  });
  
client.on('message', msg => {

      
    try { 
    // !ping 
        if (msg.content === '!ping') msg.channel.send(`pong!`); // 채팅에서 메세지가 들어왔을 때 실행할 콜백함수입니다.

        if (msg.content === '!avatar') msg.channel.send(msg.author.displayAvatarURL()); // 메세지를 보낸 유저의 프로필 사진을 받아옵니다.
        
         if(msg.content === '!help') {
        // 저희는 MessageEmbed 생성자로 embed를 생성할 수 있습니다.
        const embed = new Discord.MessageEmbed()
        .setTitle("이것은 blockchain service bot입니다!") // 1 - embed의 제목을 담당합니다.
        .setColor('0f4c81') // 2 - embed 사이드 바의 색을 정합니다.
        .setDescription('안녕하세요! 이곳은 추후에 설명할 공간입니다.'); // 3 - 실제로 설명을 담당하는 곳입니다.
        console.log(embed);

        msg.reply({ embeds: [embed] })
    }
        //console.log(msg.author); 사용자 정보가 발생합니다.
    }catch (e) {
        console.log(e);
    }
    
    });
  
// 봇과 서버를 연결해주는 부분
client.login(token);

구글링을 해보니 client 선언시 다음과 같이 해주면 된다고 하는군요.

const { Client, GatewayIntentBits } = require("discord.js"); // discord.js 라이브러리 호출
const client = new Client({
  intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages],
}); // Client 객체 생성

실행을 하니 에러는 발생하지 않았습니다.
하지만 메세지를 수신해도 아무런 동작을 하지 않는군요...ㅜㅜ
다시 열심히 검색을 해봐야겠습니다!!!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

우오오! 디스코드봇! 저도 열심히 요즘 해보고 있습니다. 전문인이 아닌저에겐 너무나 힘든데 이래저래 도전중입니다!

디스코드 봇을 만들수가 있군요. 정보 감사합니다.

안피곤님이라면 하루만에 뚝딱 하실 겁니다 ㅎㅎㅎ

요즘은 뚝딱이 잘 안됩니다.ㅠ 리얼맨권님 블로그 보면서 열심히 배우겠습니다. 디스코드는 한번도 안써봤어용