LoginSignup
7

More than 5 years have passed since last update.

Line botでどどんとふのダイスを振る

Last updated at Posted at 2017-07-03

LINE botを動かすところまで

Line BotをGoogle App Scriptで無料で手軽に試してみる。
今さら聞けない、雑談LINE BOTの作り方(1)「おじさんだって、ボットをつくってもいいじゃないか」

このへんを参考にGASでコードを書いた。
Line botは無料プランだと1000リプライ/月しか送れないみたいなので小規模なつくりでもよかろ

BCDice-API

肝心のダイスを振る部分は、BCDice-APIを使わせていただいた。
国内のダイスボットのデファクトスタンダードであるどどんとふで利用されているのと同じダイスボット。まあこのへんはTRPGプレイヤーなら知っている(TRPGやらない人なら知らない)だろうということで説明は割愛
利用したサーバーはどどんとふ公式鯖が公開しているもの。


とりあえずダイスを振る機能のみで内輪向けに公開
個人的にはどどんとふでいうチャットパレットに似た機能とかステータス管理とかさせてみたいけどDB用意しないといけないのが面倒
内輪で軽いセッションやるくらいなら充分なんだろうけど
無料枠は前述の制限があるので広く公開はできないなと
だれかもっとちゃんとした設計で作りなおしてくれ~~~~

ソースコード

function doPost(e) {
  var msg = e.postData.contents;
  var events = JSON.parse(msg).events;
  events.forEach(function(event){
    if (event.type == 'message'){
      main(event);
    }
  });
}

function main(event){
  var reply_token= event.replyToken;
  var payload = JSON.stringify;
  if (typeof reply_token === 'undefined') {
    return;
  }
  //メッセージの取得
  var user_message = event.message.text;
  var Kekka = '';  

  //コマンドと合致するか
  if(/^(使い方|システム一覧)$/g.test(user_message)){
  }else if (/^\w/gi.test(user_message)){
  }else{
    return;
  }

  //ダイスを振る
  var str_command = '';
  str_command = user_message;  
  if (/^[a-z0-9]+/gi.test(str_command)){
    var bot_system = str_command.replace(/^\S+\s+(\S+).*/gi,'$1');
    if(/^\w/gi.test(bot_system) == false){
      bot_system = 'DiceBot';
    }
    var url_str = DiceBotAPI + '/v1/diceroll?system=' + bot_system + '&command=' + encodeURI(str_command);  
    var response = UrlFetchApp.fetch(url_str); //URL+cityID
    var json = JSON.parse(response.getContentText());
    if (json.ok){
      Kekka = Kekka + json.result;
    }else{
      return;
    }
  }

 //ヘルプ
  if (Kekka == ''){
    if (user_message == '使い方'){
      //使い方
      var str = 'どどんとふのダイスを振るbotの使い方' + '\n';
      str = str + 'コマンド システム名:' + '\n';
      str = str + ' 指定したシステムでダイスを振る' + '\n';
      str = str + ' システム名は大文字小文字全て一致しなければ反応しません' + '\n';
      str = str + 'システム一覧:' + '\n';
      str = str + ' 使用できるダイスボットの一覧を取得します' + '\n';
      str = str + '使い方 システム名:' + '\n';
      str = str +  '指定したシステムのコマンドなどを取得します';
      Kekka = str;
    }else if(user_message == 'システム一覧'){
      var url_str = DiceBotAPI + '/v1/systems';  
      var response = UrlFetchApp.fetch(url_str); //URL+cityID
      var json = JSON.parse(response.getContentText());
      if (json.systems.length > 0){
        for(var idx = 0; idx < json.systems.length; idx++){
          Kekka = Kekka + json.systems[idx] + '\n';
        }
      }else{
        return;
      }
    }else if (/^使い方\s+[\w!#$%&@'()*+,-.]+/gi.test(user_message)) {
      //システムごとのヘルプ
log_write(user_message);
      Kekka = get_help(user_message);
    }
  }

  //返事
  var url = 'https://api.line.me/v2/bot/message/reply';
  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': payload({
      'replyToken': reply_token,
      'messages': [{
        'type': 'text',
        'text': Kekka,
      }],
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

function get_help(user_message){
  var str_system = user_message.replace(/^使い方\s+/g,'');
  var url_str = DiceBotAPI + '/v1/systeminfo?system=' + encodeURI(str_system);  
  var response = UrlFetchApp.fetch(url_str); 
  var json = JSON.parse(response.getContentText());
  var Kekka;
  if (json.ok){
    Kekka = json.systeminfo.name + '\n' + json.systeminfo.info;
  }else{
    Kekka = '存在しないシステム名です!';
  }
  return Kekka;
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7