discord.js + Klasa를 사용하여 Bot 만들기 기억

참고 : discord.js의 프레임 워크 Klasa가 너무 강하다.
함께 읽으십시오.

준비


  • 환경
  • Win10
  • Node.js 12.13.0
  • npm 6.12.0


  • 적절한 프로젝트 폴더를 만들고 discord.js와 Klasa를 설치하십시오.
    npm install --save discordjs/discord.js dirigeants/klasa
    

    코딩



    첫걸음


    app.js 만들기

    app.js
    const secret = require('./secret.js'); // BOTトークンはここに記述
    const token = secret.token;
    
    const {Client} = require('klasa');
    
    new Client({
      prefix: '!!', // ボットのPrefix
      language: 'ja-JP', // 言語コード
    }).login(token);
    

    이 상태에서 한 번 node app.js 에서 시작하고 위험한 로그가 나오지 않으면 우선 성공.

    명령 작성


    commands/general 아래에 다음 소스를 만듭니다. Klasa는 파일명이 그대로 명령명이 된다.
    디렉토리명은 도움말의 카테고리명이 된다.
    덧붙여 아래의 소스에 쓰여져 있다 usage 는 단순한 설명문이 아니고 인수의 매챠를 참조하기 위한 기술이므로 주의. (이것으로 30분 정도 부서졌다……)

    commands/general/hello.js
    const {Command} = require('klasa');
    
    module.exports = class extends Command {
      /**
       * @constructor
       * @param  {...any} args
       */
      constructor(...args) {
        // コマンドのオプション: https://klasa.js.org/#/docs/klasa/master/typedef/CommandOptions
        super(...args, {
          description: '挨拶を返す',
          usage: '<name:string>', // <>は必須引数、[]はオプション引数、<名前:型>のように書く
        });
      }
    
      /**
       * @param {*} message
       */
      async run(message,[name]) {
        return message.sendMessage(`${name}さんこんにちは!`);
      }
    };
    

    참고 :
    Klasa : CreatingArguments
    Klasa : CreatingCommands

    BOT의 반응은 이런 느낌





    그래서, 이때의 message 에는 아무래도 KlasaMessage 라고 하는 형태가 건네지고 있는 모양. 문서를 찾을 수 없지만. 우선
    message.author.sendMessage('hogahoga');
    

    빗질하면 그 사람에게 DM을 보낼 수 있다.

    인수가 여러 개인 명령 작성



    Klasa 공식의 ADVANCED COMMANDS Commands I: Arguments 을 핥아 읽을 뿐이라고 「usage에 복수의 인수를 지정하면 복수의 인수를 지정할 수 있다」라고 어딘지 모르게 읽을 수 있지만, 그것은 실수이다. 자세히 보면 "Repeating Arguments"섹션에

    you may want the user to write in multiple arguments, more likely with , as usageDelim to separate them.

    라고 써 있다. 이 usageDelim 파라미터를 지정하지 않으면 인수를 복수 취할 수 없기 때문에 주의한다.
    const {Command} = require('klasa');
    
    module.exports = class extends Command {
      /**
       * @constructor
       * @param  {...any} args
       */
      constructor(...args) {
        // コマンドのオプション: https://klasa.js.org/#/docs/klasa/master/typedef/CommandOptions
        super(...args, {
          description: 'n番のカードを対象に公開する、aなら全体に公開する。(opc)',
          usage: '<target:number|a> <n:number> [...]',
          usageDelim: ' ', /** これ! **/
          runIn: ['text', 'group'],
          aliases: ['opc'],
        });
        this.game = this.client.providers.get('ganparaGame');
      }
    
      /**
       * @param {Message} message
       */
      async run(message, [target, ...ns]) {
        /** 中略 **/
        return;
      }
    };
    

    데이터스토어 만들기


    providers 디렉터리에 공급자를 만듭니다. 공식 을 보면 왠지 적당하게 써 좋을 것 같았으므로 적당하게 써 본다.

    providers/datas.js
    const {Provider} = require('klasa');
    
    module.exports = class extends Provider {
      /**
       * @constructor
       * @param  {...any} args
       */
      constructor(...args) {
        super(...args, {name: 'datas'});
        this.counter = 0;
      }
    
      /**
       * init
       */
      init() {
        this.counter=1;
      }
    
      /**
       * countup
       * @return {Number} count
       */
      countup() {
        this.counter++;
        return this.counter;
      }
    };
    
    hello.js 에서 동작 확인해 봅니다.
    const {Command} = require('klasa');
    
    module.exports = class extends Command {
      /**
       * @constructor
       * @param  {...any} args
       */
      constructor(...args) {
        // コマンドのオプション: https://klasa.js.org/#/docs/klasa/master/typedef/CommandOptions
        super(...args, {
          description: '挨拶を返す',
          usage: '<name:string>',
        });
        this.data = this.client.providers.get('datas');
      }
    
      /**
       * @param {*} message
       */
      async run(message, [name]) {
        return message.sendMessage(`${name}さんこんにちは!${this.data.countup()}回めの挨拶ですね!`);
      }
    };
    



    정말 적당하게 움직여 버렸다.

    좋은 웹페이지 즐겨찾기