Skip to content

Instantly share code, notes, and snippets.

@matsubara0507
Last active May 11, 2018 17:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matsubara0507/46f1ae6721d3c6571d028682ee6612e8 to your computer and use it in GitHub Desktop.
Save matsubara0507/46f1ae6721d3c6571d028682ee6612e8 to your computer and use it in GitHub Desktop.
Add meshi cmd
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