gas로 약간의 discord bot 만들기

16992 단어 디스코드gas
내 빠져있다 게임 (FPS)에는 연습 모드가 있었고,
그 모드를 아무래도 나는 많이 하고 있는 것 같고,
하루가 얼마나 되는지, 친구와 얼마나 차이가 있는지

알고 싶어졌습니다.

그래서 이번에는 게임의 매칭 대기 시간을 이용하여 discord의 bot를 작성해 보았습니다.
gas로 간단하게 스케줄 실행이 가능하다고 들었으므로, gas로 했습니다.

메커니즘



htps : // r6 b. 코m/
↑는 그 게임의 통계를 보는 사이트입니다(비공식)

API 를 이용하여 통계를 얻고 있습니다.
  • 스프레드 시트에서 사용자 이름 가져 오기
  • 사용자의 플레이어 ID를 얻고 연습 모드의 킬 수를 얻습니다
  • 스프레드 시트의 값과 비교하여 차이를 계산합니다
  • 다양한 텍스트로 Discord에 게시

  • 같은 흐름을 스케줄 실행하고 있습니다.

    실행 결과




    자신의 유저명 이외는 일단 숨기고 있습니다.

    사용자 이름과 총 킬 수, 어제와의 차이를 표시합니다.

    스프레드시트




    자신의 유저명 이외는 일단 숨기고 있습니다.

    A 열의 사용자 이름
    B열에 킬수(초회 등록시는 0)
    설정합니다.

    소스 코드


    function main() {
      // チェックするユーザー, キル数を取得
      var sheet = SpreadsheetApp.getActiveSheet();
      var users = sheet.getRange('A:A').getValues();
      var count = users.filter(String).length;  // ユーザー数
      var beforeKills = sheet.getRange('B:B').getValues();
    
      var messages = [];
    
      for (var i = 0; i < count; i++) {
        var id = getPlayerId(users[i]);
        if (!id) {
          messages.push('このユーザー名は存在しません。');
          continue;
        }
        var currentKills = getThuntKills(id);
    
        // 差分計算
        var diff = Number(currentKills) - Number(beforeKills[i]);
        diff = Math.floor(diff);
    
        messages.push('総キル数: `' + currentKills + '`\n 前回との差分: `' + diff + '`');
        // スプレッドシートの更新
        sheet.getRange('B' + (i + 1)).setValue(currentKills);
      }
    
      // キル数でソート
      sort();
    
      var text = createText(count, users, messages);
      postDiscord(text);
    }
    
    
    /**
     * プレイヤーIDを取得する
     *
     * @param {String} username - ユーザー名
     * 
     * @returns String プレイヤーID
     */
    function getPlayerId(username) {
      var url = 'https://r6.apitab.com/search/uplay/' + username;
      var response = UrlFetchApp.fetch(url);
      var content = JSON.parse(response.getContentText('UTF-8'));
      // 存在しないユーザーを確認
      if (content['foundmatch'] === false) { return false; }
      var p_id = Object.keys(content['players'])[0];
    
      return p_id;
    }
    
    
    /**
     * テロハントのキル数を取得する
     *
     * @param {String} id - プレイヤーID
     * 
     * @returns Number キル数
     */
    function getThuntKills(id) {
      var url = 'https://r6.apitab.com/player/' + id;
      var response = UrlFetchApp.fetch(url);
      var content = JSON.parse(response.getContentText('UTF-8'));
      var kills = content['stats']['generalpve_kills']
    
      return kills;
    }
    
    
    /**
     * 投稿するメッセージを作成する
     *
     * @param {Int} count - ユーザー数
     * @param {Array} users - ユーザー
     * @param {Array} messages - メッセージ
     * 
     * @returns Object - 投稿するメッセージ
     */
    function createText(count, users, messages) {
      var results = [];
    
      for (i = 0; i < count; i++) {
        results[i] = {
          'name': users[i][0],
          'value': messages[i],
          'inline': true
        };
      }
    
      var text = {
        "embeds": [
          {
            "color": 15105570, // orange
            "fields": results
          }
        ]
      };
    
      return text;
    }
    
    
    /**
     * Discordに投稿する
     *
     * @param {Object} text - 投稿するメッセージ
     */
    function postDiscord(text) {
      var url = 'https://discordapp.com/api/webhooks/000000000000/xxxxxxxxxxxxxxxxxx';
    
      var params = {
        'method': 'POST',
        'headers': { 'Content-type': 'application/json' },
        'payload': JSON.stringify(text)
      };
    
      UrlFetchApp.fetch(url, params);
    }
    
    
    /**
     * キル数でソートをする
     */
    function sort() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet();
      var range = sheet.getRange("A:B");
      range.sort([{ column: 2, ascending: false }]);
    }
    
    

    실행 트리거





    선택만 합니다만 아침 9시 정도에 투고되도록 했습니다.

    감상


  • 쉽게 bot?를 만들 수 있었다.
  • 확실히 친구보다 많이 하고 있는 것을 알았다.
  • 이 모드를 많이 하고 있다고 해서 강해지는 것은 아님을 알았다.

  • 미래의 자신에게


  • 다른 사바에서 사용할 수 있도록 시트 추가 지원
  • 보안적으로 webhook url 숨기기
  • 정렬 타이밍이 하루 느린 수정

  • 해주세요.

    링크



    rainbow six siege
    사용한 API
    discord webhook document

    좋은 웹페이지 즐겨찾기