twitterのtimelineを読み上げる。

xyzzyには服部氏のtwitter-modeがあるので、せっかくだからsoftalkに読み上げさせようと思う。


というわけで、まずは準備。素数を読み上げる。 - 象徴ヶ淵の*softalk*とcall-softalkは流用する。ちなみに、softalkの設定でファイル/オプションを使ってる場合は、適宜"/S:60 /T:0 /W:"とか適当に追加して欲しい。twitter-modeを読み込んでおく。起動しなくても、多分以下を実行すればよい。もちろん、idとpassは設定しておく。

(require "twitter/api")
(junk::load-config-file twitter::*config-file*)

で、適当に作ったのがこちら。

(let (last-updates)
  (defun twit-get-last-updates ()
    (multiple-value-bind (result status statuses)
        (twitter::statuses-friends_timeline twitter::*username* twitter::*password* t)
      (when result
        (if last-updates
            (let ((latest (#1=twitter::twstatus-id (car (last last-updates))))
                  it new)
              (if (loop
                    (if (and (car statuses) (< latest (#1# (setq it (pop statuses)))))
                        (push it new) (return new)))
                  (setq last-updates new) nil))
          (push (pop statuses) last-updates)))))
  (defun twit-talk-text ()
    (format nil "~{~A。~}" (mapcar 'twit-shape-up last-updates)))
  (defun twit-softalk ()
    (interactive)
    (let (txt)
      (if (twit-get-last-updates)
          (call-softalk (setq txt (twit-talk-text))))
      (max 60 (* (length txt) 0.25)))))

(defun twit-shape-up (x)
  (#1=substitute-string
   (#1#
    (#1#
     (concat (twitter::twuser-name (twitter::twstatus-user x)) "、" (twitter::twstatus-text x))
     "http[^ ]+" "かっこリンク") "\\[.+\\]" "") "\\(@[^ ]+\\|…+\\|・・+\\)" "、"))

1回目の(twit-softalk)で自分のTLの最新の発言を発音し、2回目からは前回以降の発言を発音する。発言はtwit-shape-upで加工する。


で、定期的に発音させるために、また関数を作るのだが、若干使い回せるようにしてみる。次も多分作り直すけど・・・。

(defvar *softalk-func* 'twit-softalk)

(defun softalk-loop ()
  (start-timer (funcall *softalk-func*) 'softalk-loop t))

(defun toggle-softalk-timer ()
  (interactive)
  (and (not (stop-timer 'softalk-loop))
       *softalk-func*
       (softalk-loop)))

これで(toggle-softalk-timer)すれば良い。・・・あーうるさい。ゆっくりすぎて追いついてないしw

おまけ

updateだけ使いたい場合はtwitter-modeを読み込んでtwitter::summary-update