前(AOJの毎日solved数投稿bot作った)に作ったAOJのsolved数投稿botをちょっと更新しました。
毎日のsolved数を投稿するのは、最初の予定通りなんですが、毎日あまりsolved数に変化が無いので面白みがなくなってきたため、連続投稿が続いている日時や各種ranking順位のdiffなどを投稿するのを追加してみました。
twitter上での表示としては上のような表示から下のような表示に変わりました。
ik11235: Aizu Online Judgeでの昨日のsolved数は"3"です。
— ik-fib@全部雪のせいだ、おのれデ… (@ik11235) 2013, 11月 11
[自動] ik11235: Aizu Online Judgeでの昨日のsolved数は"1"です。 submit連続7日目 solved-rank-diff:-1 rating-rank-diff:0
— ik-fib (@ik11235) 2014, 3月 1
GASのコードの追加・変更点としては以下の箇所です。
//bot用データ更新関数
function updateRankData(){
var solvedrank;
var ratingrank;
var response = UrlFetchApp.fetch("http://judge.u-aizu.ac.jp/onlinejudge/webservice/user_list");
var xml = Xml.parse(response.getContentText(), false);
var els = xml.getElement().getElements("user");
for(var i = 0;i < els.length;i++)
{
if(els[i].getElement("id").getText().replace(/\n/g, "") == "ik11235")
{
solvedrank=els[i].getElement("rank").getText().replace(/\n/g, "");
break;
}
}
response = UrlFetchApp.fetch("http://judge.u-aizu.ac.jp/onlinejudge/webservice/user_list?criteria=1");
xml = Xml.parse(response.getContentText(), false);
els = xml.getElement().getElements("user");
for(var i = 0;i < els.length;i++)
{
if(els[i].getElement("id").getText().replace(/\n/g, "") == "ik11235")
{
ratingrank=els[i].getElement("rank").getText().replace(/\n/g, "");
break;
}
}
var sheet = ss.getSheetByName('bot_data');
sheet.getRange(3,2).setValue(solvedrank);
sheet.getRange(4,2).setValue(ratingrank);
}
///毎日実行のtwitter投稿用関数
///基本的にこの関数を毎日実行のトリガーに指定して動作させる
///[user_list]シートに記載されているidについて実行前のsolvedと
///現在のsolvedの値を比較してその値をtwitterに投稿する
function DailyDiff(){
var Users = getUserList();
for (var i = 0; i < Users.length; i++) {
var yesterdaySubmit=getSubmit(Users[i]);
setUserData(Users[i]);
var todaySubmit=getSubmit(Users[i]);
var sheet = ss.getSheetByName('bot_data');
//連続submit日数の更新
var straightSubmit=sheet.getRange(2,2).getValue();
if(todaySubmit-yesterdaySubmit==0)
straightSubmit=Math.min(straightSubmit-1,-1);
else
straightSubmit=Math.max(straightSubmit+1,1);
sheet.getRange(2,2).setValue(straightSubmit);
if(yesterdaySubmit!=-1 && todaySubmit!=-1)
{
var text = '[自動] '+Users[i]+': Aizu Online Judgeでの昨日のsolved数は"'+(todaySubmit-yesterdaySubmit)+'"です。 ';
if(straightSubmit<0)
text+='未';
text+='submit連続'+Math.max(straightSubmit,-straightSubmit)+'日目 ';
var oldsolvedrank=sheet.getRange(3,2).getValue();
var oldratingrank=sheet.getRange(4,2).getValue();
updateRankData();
var newsolvedrank=sheet.getRange(3,2).getValue();
var newratingrank=sheet.getRange(4,2).getValue();
var solvedDiff = oldsolvedrank-newsolvedrank;
var ratingDiff = oldratingrank-newratingrank;
text+='solved-rank-diff:'+(solvedDiff>0?'+':'')+(solvedDiff)+' rating-rank-diff:'+(ratingDiff>0?'+':'')+(ratingDiff);
tweetInitialize();
tweetPost(text);
}
Logger.log(yesterdaySubmit+":"+todaySubmit);
}
}
連続投稿日数、昨日までのranking順位をスプレッドシート上に保管し、毎日の更新時に今日投稿したか否かで投稿日時の更新、rankingの新しい順位をAOJのAPIから取得して更新、差分を出力しています。