LINE botを動かすところまで
Line BotをGoogle App Scriptで無料で手軽に試してみる。
今さら聞けない、雑談LINE BOTの作り方(1)「おじさんだって、ボットをつくってもいいじゃないか」
このへんを参考にGASでコードを書いた。
Line botは無料プランだと1000リプライ/月しか送れないみたいなので小規模なつくりでもよかろ
BCDice-API
肝心のダイスを振る部分は、BCDice-APIを使わせていただいた。
国内のダイスボットのデファクトスタンダードであるどどんとふで利用されているのと同じダイスボット。まあこのへんはTRPGプレイヤーなら知っている(TRPGやらない人なら知らない)だろうということで説明は割愛
利用したサーバーはどどんとふ公式鯖が公開しているもの。
しゅんしゅんひよこ(@Shunshun94 )氏が作成した、DiscordでBCDiceを使うbotが動いた!とりあえず、公開BCDice-APIのサーバーは、こちらの公式鯖にあるやつを使えば新規に立てる必要はないです>https://t.co/hDMpBUIxz5 pic.twitter.com/oecaLDxkA2
— どどんとふ公式鯖中の人 (@DoDontoF_Srv) 2017年6月30日
とりあえずダイスを振る機能のみで内輪向けに公開
個人的にはどどんとふでいうチャットパレットに似た機能とかステータス管理とかさせてみたいけど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;
}