728x90
반응형

이번에 추가할 기능은 아래와 같습니다.

 

[

로컬 노래파일 재생,

로컬 사진 전송,

상태메세지 설정,

메세지 지우기

]

 


개발환경 : UBUNTU 18.04.3

개발언어: NODE JS V8

모듈 : discord.js v11

텍스트 에디터: ATOM (편하신거 사용하시면 됩니다.)

 

 

 

 

로컬 경로에 존재하는 mp3파일을 재생하는 기능입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  if (msg.content === 'r.play') {
    // Only try to join the sender's voice channel if they are in one themselves
    if (msg.member.voiceChannel) {
      msg.member.voiceChannel.join()
        .then(connection => { // Connection is an instance of VoiceConnection
          msg.reply('playing music!');
          const dispatcher = connection.playFile('./music.mp3');
          dispatcher.on("end", end => {});
        })
        .catch(console.log);
    } else {
      msg.reply('먼저 방에 들어가');
    }
  }
  if (msg.content === 'r.leave') {
    // Only try to join the sender's voice channel if they are in one themselves
    if (msg.member.voiceChannel) {
      msg.member.voiceChannel.leave();
      msg.reply('bye!');
    } else {
      msg.reply('이미 나왔는데..');
    }
  }
 
cs

 

r.play는 내가 들어간 음성 채팅방으로 들어가서 music.mp3를 재생합니다. (7행에서 파일명, 경로를 설정할 수 있습니다.)

내가 음성채팅방에 들어가 있지 않은 경우 12행 메세지를 출력합니다.

 

r.leave로 방을 나갈 수 있습니다.

 

 

 

 

오디오 재생시 오디오가 재생되지 않고 바로 종료되는 문제

또는 Error: FFMPEG not found 에러 발생시 아래 포스트 참조

 

https://mandu-mandu.tistory.com/381

 

discord js 설치 후 catch 오류 / 오디오 재생 오류 문제 해결

1. npm으로 discord.js 설치 후 봇 실행시 발생하는 오류 해결 /Client.js:39 } catch { ^ 봇 실행시 위와 같은 오류가 발생할 경우입니다. 저같은 경우에는 discord.js github에 나와있는 설치방법으로 설치를 했..

mandu-mandu.tistory.com

 

 

 

728x90

로컬경로에 존재하는 이미지를 채팅방에 전송하는 기능입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  if (msg.content.startsWith('r.gif')) {
    const args = msg.content.split(' ').slice(1); // All arguments behind the command name with the prefix
    var no = args.join(' '); // Amount of messages which should be deleted
 
    if (!no) no = '1';
    if (isNaN(no) || no > 14return msg.reply('only number 1-14');
 
   // Create the attachment using Attachment
   var path = "./gif/";
   path = path.concat(no,".gif");
   console.log(path);
   const attachment = new Attachment(path);
   // Send the attachment in the message channel with a content
   msg.channel.send(attachment);
  }
cs

명령어는 r.gif n 입니다. n에는 정수가 들어갑니다. ex) r.gif 1

 

저는 gif 이미지를 보내도록 했습니다. 필요에 따라서 10번행의 확장자명을 gif에서 png, jpg등으로 바꾸실 수 있습니다.

저는 ./gif/ 디렉토리 안에 1.gif, 2.gif, 3.gif ... 파일을 넣어 놨습니다.

 

파일 명을 정수로 설정해주세요!

 

 

5번행은 명령어 뒤에 정수가 입력되지 않은 경우 자동으로 1로 하도록

6번행은 숫자인지 검증, 14까지만 입력되도록 한 것입니다.

 


 

상태메세지 설정은 아래 사진과 같이 별명 아래에 메세지를 표시하는 것입니다.

ready 안에 아래 코드 한줄을 추가만 해주시면 됩니다. (전체 코드는 밑에서 확인하실 수 있습니다.)

  client.user.setActivity('봇 만들자', { type: 'WATCHING' })

 

type에는 WATCHING (시청 중) 외에도 

  • PLAYING   (하는 중)
  • STREAMING
  • LISTENING

으로 설정하실 수 있습니다.

 

 

 


메세지 지우기 기능

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  if (msg.content.toLowerCase().startsWith("r.clear")) {
      const args = msg.content.split(' ').slice(1); // All arguments behind the command name with the prefix
      const amount = args.join(' '); // Amount of messages which should be deleted
 
      if (!amount) return msg.reply('You haven\'t given an amount of messages which should be deleted!'); // Checks if the `amount` parameter is given
      if (isNaN(amount)) return msg.reply('The amount parameter isn`t a number!'); // Checks if the `amount` parameter is a number. If not, the command throws an error
 
      if (amount > 10return msg.reply('You can`t delete more than 10 messages at once!'); // Checks if the `amount` integer is bigger than 100
      if (amount < 1return msg.reply('You have to delete at least 1 message!'); // Checks if the `amount` integer is smaller than 1
 
      msg.channel.fetchMessages({ limit: amount }).then(dmsg => { // Fetches the messages
      msg.channel.bulkDelete(dmsg // Bulk deletes all messages that have been fetched and are not older than 14 days (due to the Discord API)
      ).catch(console.log);});
    }
cs

 

r.clear n 과 같이 입력하면, n개의 메세지를 삭제해줍니다.

 

8행 9행에서 각각 최대 최소 개수를 설정할 수 있습니다.

 

 

 

 


전체 봇 소스코드 bot.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Extract the required classes from the discord.js module
const { Client, Attachment } = require('discord.js');
 
// Create an instance of a Discord client
const client = new Client();
 
 
client.on('ready', () => {
  console.log(`Logged in as ${client.user.tag}!`);
  client.user.setActivity('봇 만들자', { type: 'WATCHING' })
});
 
client.on('message', msg => {
  if (msg.content.startsWith('r.help')) {
    msg.reply('Powered by node.js\nMade by M4ndU');
  }
  if (msg.content.startsWith('r.gif')) {
    const args = msg.content.split(' ').slice(1); // All arguments behind the command name with the prefix
    var no = args.join(' '); // Amount of messages which should be deleted
 
    if (!no) no = '1';
    if (isNaN(no) || no > 14return msg.reply('only number 1-14');
 
   // Create the attachment using Attachment
   var path = "./gif/";
   path = path.concat(no,".gif");
   console.log(path);
   const attachment = new Attachment(path);
   // Send the attachment in the message channel with a content
   msg.channel.send(attachment);
  }
 
 
  if (msg.content === 'r.play') {
    // Only try to join the sender's voice channel if they are in one themselves
    if (msg.member.voiceChannel) {
      msg.member.voiceChannel.join()
        .then(connection => { // Connection is an instance of VoiceConnection
          msg.reply('playing music!');
          const dispatcher = connection.playFile('./music.mp3');
          dispatcher.on("end", end => {});
        })
        .catch(console.log);
    } else {
      msg.reply('먼저 방에 들어가');
    }
  }
  if (msg.content === 'r.leave') {
    // Only try to join the sender's voice channel if they are in one themselves
    if (msg.member.voiceChannel) {
      msg.member.voiceChannel.leave();
      msg.reply('bye!');
    } else {
      msg.reply('이미 나왔는데..');
    }
  }
 
  if (msg.content.toLowerCase().startsWith("r.clear")) {
      const args = msg.content.split(' ').slice(1); // All arguments behind the command name with the prefix
      const amount = args.join(' '); // Amount of messages which should be deleted
 
      if (!amount) return msg.reply('You haven\'t given an amount of messages which should be deleted!'); // Checks if the `amount` parameter is given
      if (isNaN(amount)) return msg.reply('The amount parameter isn`t a number!'); // Checks if the `amount` parameter is a number. If not, the command throws an error
 
      if (amount > 10return msg.reply('You can`t delete more than 10 messages at once!'); // Checks if the `amount` integer is bigger than 100
      if (amount < 1return msg.reply('You have to delete at least 1 message!'); // Checks if the `amount` integer is smaller than 1
 
      msg.channel.fetchMessages({ limit: amount }).then(dmsg => { // Fetches the messages
      msg.channel.bulkDelete(dmsg // Bulk deletes all messages that have been fetched and are not older than 14 days (due to the Discord API)
      ).catch(console.log);});
    }
 
  if (msg.content === 'r.whoami') {
    // Send the user's avatar URL
    msg.reply(msg.author.avatarURL);
  }
});
 
client.login('token');
 
cs

 

79행 token에 반드시 자신의 봇의 토큰값을 입력하세요

728x90
반응형
  1. 구강민 2020.09.20 09:56

    npm install --save ffmpeg-binaries
    를 치면
    Error: Cannot find module 'C:\musicbot\node_modules\lzma-native\binding-v3.0.8-node-v72-win32-x64\lzma_native.node'
    Require stack:
    - C:\musicbot\node_modules\lzma-native\index.js
    - C:\musicbot\node_modules\decompress-tarxz\index.js
    - C:\musicbot\node_modules\ffmpeg-binaries\install.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:965:15)
    at Function.Module._load (internal/modules/cjs/loader.js:841:27)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at C:\musicbot\node_modules\lzma-native\index.js:13:14
    at Object.<anonymous> (C:\musicbot\node_modules\lzma-native\index.js:597:3)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14) {
    code: 'MODULE_NOT_FOUND',
    requireStack: [
    'C:\\musicbot\\node_modules\\lzma-native\\index.js',
    'C:\\musicbot\\node_modules\\decompress-tarxz\\index.js',
    'C:\\musicbot\\node_modules\\ffmpeg-binaries\\install.js'
    ]
    }
    npm WARN discord.js@11.6.4 requires a peer of @discordjs/uws@^10.149.0 but none is installed. You must install peer dependencies yourself.
    npm WARN musicbot@1.0.0 No description
    npm WARN musicbot@1.0.0 No repository field.
    npm WARN musicbot@1.0.0 No license field.

    npm ERR! code ELIFECYCLE
    npm ERR! errno 1
    npm ERR! ffmpeg-binaries@4.0.0 install: `node install`
    npm ERR! Exit status 1
    npm ERR!
    npm ERR! Failed at the ffmpeg-binaries@4.0.0 install script.
    npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

    npm ERR! A complete log of this run can be found in:
    npm ERR! C:\Users\rnrkd\AppData\Roaming\npm-cache\_logs\2020-09-20T05_49_53_169Z-debug.log

    이러한 오류가 떠요

    • M4ndU 2020.09.20 15:20 신고

      discordjs/opus는 설치하셨나요?

      npm install discord.js @discordjs/opus

  2. 구강민 2020.09.20 19:19

    • M4ndU 2020.09.20 21:45 신고

      npm install @discordjs/uws@11.149.1

      설치해보세요.

  3. LUKE 2020.12.09 16:15

    노래 재생이 안돼고 계속 음성 서버에 들어가라고만 하네요ㅠ
    들어갔는데도 그래요ㅠㅠ 에러는 안떠요

    • M4ndU 2020.12.09 19:49 신고

      discord.js v12를 사용 중이신것으로 추정됩니다.
      본문에 있는 코드는 v11을 기반으로 작성되었습니다.

      따라서 v12에서 사용하기 위해서는
      채널접속 여부를 확인하는 36행과 50행 조건문 부분에서 msg.member.voiceChannel 을 msg.member.voice.channel로 수정하세요.

      그 다음 행 msg.member.voiceChannel.join()도 msg.member.voice.channel.join()으로 수정하시면 됩니다.
      msg.member.voice.channel.leave()

  4. ㅇㅇ 2021.03.01 14:22

    혹시 전체메세지가 아닌 본인이 작성한 메세지만 삭제하게끔 할 수 있는 방법이 있을까요?

  5. 그건막찌 2021.04.20 13:27

    댓글을 보면서 문제점을 고치고 해서 봇을 통화방에 들어오고 나가기 까지 실행을 했어요(노래 듣는 것)
    그런데 음악을 틀어주지는 않아요. 음악을 틀고 있는데 안들리는 건지 아니면 아예 안틀어주는 건지 모르겠어요
    ./music.mp3 를 뭐 어떻게 하나요?? 저는 music.mp3 라는 파일을 만들어서 거기 안에 노래를 담는 건줄 알았는데 아닌거 같아요..

    • M4ndU 2021.04.20 18:35 신고

      노래 파일명을 music.mp3로 하시면 됩니다.

    • 그건막찌 2021.04.22 09:21

      노래파일명을 music.mp3로 하면 1곡 밖에 못 넣지 않나요..?
      예를 들어서 노래 제목이 방탄소년단의 다이너마이트라고 했을떄 그 파일 이름을 music.mp3 로 하면 따른 노래를 담고 싶으면 파일명이 중복된다고 뜰텐데..

    • M4ndU 2021.04.22 11:54 신고

      명령어 여러 개로 추가 확장하시고, 개별 명령어들에 대해서 connection.playFile('./music.mp3'); 의 music.mp3부분을 수정하시면 됩니다.

    • 그건막찌 2021.04.22 12:09

      그럼 music이라는 파일 안에 다가 music1.mp3 , music2.mp3 이런식으로 넣으면 되는 건가요??

    • M4ndU 2021.04.23 18:03 신고

      그러면 코드에서 경로를
      ./music/music1.mp3 이런 식으로 수정하시면 됩니다.

  6. 어려운 코딩 2021.04.22 18:43

    음악 듣는 쪽에서 질문이 있는데요
    봇이 들어오고 나가기도 되고 멘트도 잘 치는데..
    음악을 틀어주지를 않습니다ㅠ
    TypeError: connection.playFile is not a function
    라고 뜨면서 플레이파일이 없다고 해요ㅠ
    봇 만든 폴더 안에 music파일을 만들어서 안에다가 잠시.mp3 파일(노래 이름이 잠시입니다.)을 1개 넣어두기는 했는데,,
    여러개 넣고 싶기도 한데 파일 1개 넣는 것도 안되서... 물어보려고 해요ㅠ

    if (msg.content === '//재생') {
    if (msg.member.voice.channel) {
    msg.member.voice.channel.join()
    .then(connection => {
    msg.reply('음악을 재생합니다.');
    const dispatcher = connection.playFile("./music.mp3");
    dispatcher.on("end", end => {});
    })
    .catch(console.log);
    } else {
    msg.reply('먼저 통화방에 들어가주세요.');
    }
    }

    if (msg.content === '//중지') {
    if (msg.member.voice.channel) {
    msg.member.voice.channel.leave();
    msg.reply('음악을 중지합니다.');
    } else {
    msg.reply('이미 나왔는데..');
    }
    }

    • M4ndU 2021.04.23 18:05 신고

      playFile함수는 v11에서 사용되는 함수입니다. v12에서는 https://stackoverflow.com/questions/61161044/discord-js-bot-error-typeerror-connection-playfile-is-not-a-function 를 참고하시기 바랍니다.

  7. 일린이 2021.06.27 14:50

    안녕하세요.

    디코봇으로 사진전송관련해서 의문이 있어 댓글 남겨요

    포스팅에는 로컬에 저장된 사진파일을 보내는방법이 있던데

    혹시 프린트스크린샷이 된 그림파일을 보내는 방법이 있을까요?

    제가 원하는건 봇이 1시간 단위로 프린트스크린샷을해서 계속 메세지 보내는것을 구현하고싶은데... 이런것도 가능할까요

    • M4ndU 2021.06.30 18:32 신고

      스크린샷 기능이 포함된 패키지를 찾아보셔야 할 것 같습니다.

+ Recent posts