Last active
May 11, 2018 17:17
-
-
Save matsubara0507/46f1ae6721d3c6571d028682ee6612e8 to your computer and use it in GitHub Desktop.
Add meshi cmd
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function doPost(e) { | |
var prop = PropertiesService.getScriptProperties().getProperties(); | |
if (prop.VERIFY_TOKEN != e.parameter.token) { | |
throw new Error('invalid token.'); | |
} | |
/* Load Spread Sheet */ | |
var ss = SpreadsheetApp.openById(prop.SPREAD_SHEET_ID) | |
var membersSheet = ss.getSheetByName(prop.MEMBERS_SHEET_NAME); | |
var members = membersSheet.getRange(1, 1, membersSheet.getLastRow(), 2).getValues(); | |
var meshiSheet = ss.getSheetByName(prop.MESHI_SHEET_NAME); | |
var meshiList = meshiSheet.getRange(2, 1, meshiSheet.getLastRow(), 3).getValues(); | |
var logSheet = ss.getSheetByName('log'); | |
var logRowNum = logSheet.getLastRow(); | |
logSheet.getRange(logRowNum + 1, 1).setValue(e.parameter.text); | |
/* for Slack */ | |
var slackApp = SlackApp.create(prop.SLACK_API_TOKEN); | |
const BOT_ICON = 'http://drive.google.com/uc?export=view&id=' + prop.ICON_ID; | |
var option = { username : prop.BOT_NAME, icon_url : BOT_ICON, link_names : 1 }; | |
var message = e.parameter.text.split(' '); | |
var channelName = e.parameter.channel_name; | |
if (message[0] != (prop.BOT_NAME)) { | |
throw new Error('invalid bot name.'); | |
} | |
var _ = Underscore.load(); | |
var subcmd = message[1]; | |
var text = ''; | |
switch(subcmd) { | |
case 'hello': | |
text = 'world!'; | |
break; | |
case 'help': | |
text = '使い方だよ\n' + ppHelp(); | |
break; | |
case 'member': | |
text = '今いるメンバーの対応表だよ\n' + ppMembers(members); | |
break; | |
case 'channels': | |
text = cmdChannels(prop, _, slackApp, message.slice(2)); | |
break; | |
case 'stock': | |
text = cmdStock(prop.COMPANY_CODE); | |
break; | |
case 'meshi': | |
case 'めし': | |
case 'メシ': | |
case '腹減った': | |
case 'はらへった': | |
text = cmdMeshi(meshiList); | |
break; | |
default: | |
text = prop.UNDEFINED_CMD; | |
break; | |
} | |
Logger.log(text); | |
Logger.log(slackApp.postMessage(channelName, text, option)); | |
} | |
function ppHelp() { | |
const help = | |
"oragon COMMAND\n" + | |
"Available commands:\n" + | |
" hello :: world!\n" + | |
" help :: this command.\n" + | |
" member :: メンバーの対応表を取得\n" + | |
" channels :: 登録してあるおススメチャンネル一覧\n" + | |
" channels set CHANNEL [COMMENT] :: おススメチャンネルとして登録\n" + | |
" channels unset :: おススメチャンネルの登録を解除\n" + | |
" channels reset :: おススメチャンネルの登録を削除\n" + | |
" stock :: 弊社の現在の株価を取得" | |
return help; | |
} | |
function ppMembers(members) { | |
var temp = ''; | |
for (var i = 0; i < members.length; i++) { | |
temp += ppMember(members[i]) + '\n'; | |
} | |
return temp; | |
} | |
function ppMember(member) { | |
const name = member[0]; | |
var temp = name + ': '; | |
for (var i = 1; i < member.length; i++) { | |
temp += '"' + member[i] + '" ' ; | |
} | |
return temp; | |
} | |
function cmdChannels(prop, _, slackApp, message) { | |
/* Load Spread Sheet */ | |
var sheet = SpreadsheetApp.openById(prop.SPREAD_SHEET_ID).getSheetByName('channels'); | |
var rowNum = sheet.getLastRow(); | |
var table = sheet.getRange(1, 1, rowNum, 3).getValues(); | |
const subcmd = message[0]; | |
const channel = message[1]; | |
var text = ''; | |
switch(subcmd) { | |
case 'set': | |
if (!existChannel(_, slackApp, channel)) { | |
text = 'そんなチャンネルないよ'; | |
} else if (channel) { | |
const comment = message.slice(2).join(' '); | |
var index = _.findIndex(table, function(row){ return row[0] == channel; }); | |
if (index == -1) { | |
index = rowNum; | |
sheet.getRange(index + 1, 1).setValue(channel); | |
} | |
sheet.getRange(index + 1, 2).setValue(1); | |
if (comment) { | |
sheet.getRange(index + 1, 3).setValue(comment); | |
} | |
text = '設定したぞいb'; | |
} else { | |
text = 'チャンネル名を入力してね'; | |
} | |
break; | |
case 'unset': | |
var index = _.findIndex(table, function(row){ return row[0] == channel; }); | |
if (index == -1) { | |
text = 'そのチャンネルはまだ登録されてないよ'; | |
} else { | |
sheet.getRange(index + 1, 2).setValue(0); | |
text = '登録を解除したよ'; | |
} | |
break; | |
case 'remove': | |
var index = _.findIndex(table, function(row){ return row[0] == channel; }); | |
if (index == -1) { | |
text = 'そのチャンネルはまだ登録されてないよ'; | |
} else { | |
sheet.getRange(index + 1, 1).setValue(''); | |
sheet.getRange(index + 1, 2).setValue(''); | |
sheet.getRange(index + 1, 3).setValue(''); | |
text = '登録を削除したよ'; | |
} | |
break; | |
default: | |
text = 'おススメのチャンネルだよ\n' + ppChannels(table); | |
break; | |
} | |
return text; | |
} | |
function existChannel(_, slackApp, channel) { | |
const channels = slackApp.fetch_('channels.list')['channels']; | |
// Logger.log(channels); | |
return _.contains(_.map(channels, function(chn){ return chn['name'] }), channel); | |
} | |
function ppChannels(channels) { | |
var temp = ''; | |
for (var i = 0; i < channels.length; i++) { | |
if (channels[i][1]) { | |
temp += ('#' + channels[i][0] + ' : ' + channels[i][2] + '\n'); | |
} | |
} | |
return temp; | |
} | |
function cmdStock(code) { | |
const url = "https://stocks.finance.yahoo.co.jp/stocks/detail/?code=" + code; | |
const response = UrlFetchApp.fetch(url); | |
const myRegexp = /<td class="stoksPrice">([\s\S]*?)<\/td>/i; | |
const match = myRegexp.exec(response.getContentText()); | |
if (match === null) { | |
return "ゴメン、うまく取得できなかった"; | |
} | |
const amount = match[1]; | |
return ("<" + url + "|現在の株価は、" + amount + "円だよ>"); | |
} | |
function cmdMeshi(meshiList) { | |
var meshi = meshiList[Math.floor(Math.random() * (meshiList.length - 1))] | |
return '適当に選んでみた!\n<' + meshi[2] + '|' + meshi[0] + '> (' + meshi[1] + 'やさん)' | |
} | |
function test() { | |
var prop = PropertiesService.getScriptProperties().getProperties(); | |
var e = { | |
parameter: { | |
token: prop.VERIFY_TOKEN, | |
text: 'oragon help', | |
channel_name: 'bot-test' | |
} | |
} | |
doPost(e); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment