c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Cosense で公表中です。

Programming は GitHub で開發中です。

Twitter定期post用拡張 #AzureaScript

Azureaと云う、JScriptで拡張を書けるtwitter clientをずっと使っています。久方ぶりにAzureaScriptを書きました。
半手動の定期ポストです。OPTIONを弄ってください。
twitterbot.netに頼らなくて済みますし、自分がtime lineにいない時に定期postされたりしません。古い情報を延々とpostし続ける間抜けなことも減ると思います。


追記: 2012-08-17
最新版は、Azurea Wikiにて管理します。
[Scripts/regularPost.js - Azurea Wiki http://azurea.info/ja/wiki/index.php?Scripts%2FregularPost.js ]

/**
 * @fileOverview Regular post AzureaScript.
 * @author ne_Sachirou
 * @version 20120817
 * @license Public Domain
 */

OPTION = {
  /** @type boolean */
  isEnabled: true,

  /** @type boolean */
  isFooter: false,

  /** @type number */
  duration: 1000 * 60 * 60,

  /** @type Array.<string> */
  texts: []
};
OPTION.texts = OPTION.texts.concat(constractTweet(
  'SpinorNetwork 16曲無料公開中。58曲を千円で販売中',
  [
    'ヾ(〃l _ l)ノ゙「ホットミルク、ミルク無しで。」本当に解けるのか?',
    '(〃l _ l)b☆我々は失敗を悟った。出来上がったcpVineは、スピノール振動として最早ネットワークを成さなかったのだ。',
    'トテチタ(((〃l _ l)KrmAkxlI2はわたしたちがSpinorNetworkへ放った音響楽譜が反射して集まり、像を成したものである。',
    'ヾ(〃l _ l)ノ゙あなたにも作れる音楽♪',
    'カスヾ(〃l _ l)ノ゙! やった!カス!'
  ],
  ' j.mp/OwoOIa #Crainの所業'));
OPTION.texts = OPTION.texts.concat(constractTweet(
  '新曲:',
  [
    'いっしょに作るヾ(〃l _ l)ノ゙♪お天気雨とおもちゃのパレード/He-puni Perty/選択花を替える園',
    '選択花を替える園では、赤い花と青い花が咲きます。それぞれの花は、日毎に色を変えます。ランダムではありません。',
    '選択花を替える園でないている蝉は、選択花の色を目から、音へ変えています。ド・モルガン蝉、と呼んでください。'
  ],
  ' j.mp/NohgvG #c4se'));

/**
 * Helper for set `OPTION.texts`.
 * @param {string} header
 * @param {Array.<string>} middles
 * @param {string} footer
 * @return {Array.<string>}
 */
function constractTweet (header, middles, footer) {
  var i = iz = 0,
      texts = [];

  for (i = 0, iz = middles.length; i < iz; ++i) {
    texts[i] = header + middles[i] + footer;
  }
  return texts;
}

(function () {

/** @const */
var FOOTER_SECTION = 'Misc',
    FOOTER_KEY = 'FooterText';
var Footer,
    lastTimeToPost = 0;

/**
 * @param {string} text
 * @return {Object}
 */
function _log (text) {
  text = text.toString();
  return System.showMessage(text, text.slice(0, 10), 0);
}

/**
 * @param {Array.<Object>} arr
 * @return {Object}
 */
function Array_random (arr) {
  return arr[Math.floor(Math.random() * arr.length)];
}

/**
 * @return {boolean}
 */
function isTimeToPost () {
  if (!OPTION.isEnabled) { return false; }
  if (lastTimeToPost + OPTION.duration < new Date().getTime()) { return true; }
  return false;
}

Footer = {
  isRestored: true,
  isDesabled: true,
  backup: '',

  /**
   * @return {string}
   */
  get: function () {
    return System.settings.getValue(FOOTER_SECTION, FOOTER_KEY);
  },

  /**
   * @param {string} footerText
   */
  set: function (footerText) {
    System.settings.setValue(FOOTER_SECTION, FOOTER_KEY, footerText);
  },

  /**
   * @param {string} status_text
   * @return {string}
   */
  remove: function (status_text) {
    return status_text.replace(new RegExp(Footer.get() + '$'), '');
  },

  /**
   * @param {string} footerText
   */
  cover: function (footerText) {
    if (Footer.isRestored) {
      Footer.isDesabled = TextArea.disableFooterText;
      Footer.backup = Footer.get();
    }
    Footer.set(footerText);
    TextArea.disableFooterText = false;
    Footer.isRestored = false;
  },

  /**
   */
  restore: function () {
    Footer.set(Footer.backup);
    TextArea.disableFooterText = Footer.isDesabled;
    Footer.isRestored = true;
  }
};

TwitterService.addEventListener('preSendUpdateStatus', function (status) {
  var text = Array_random(OPTION.texts);

  if (!isTimeToPost()) { return false; }
  if (OPTION.isFooter) {
    if (status.in_reply_to_status_id !== '0') { return false; }
    status.text = Footer.remove(status.text);
    Footer.cover(text);
    System.setTimeout(function () {
      lastTimeToPost = new Date().getTime();
      TwitterService.status.update(status.text + Footer.get(), 0);
      Footer.restore();
    }, 100);
    return true;
  } else {
    System.setTimeout(function () {
      lastTimeToPost = new Date().getTime();
      TwitterService.status.update(text, 0);
    }, 1000);
  }
});

}());