タイムラインのフィルタリング (xyttr Advent Calendar 10日目)
この記事はxyttr Advent Calendar 2011の記事です。
まだreadmeにもreferenceにも書いてないのですが、リストxyttr:*timeline-filter*に関数を追加する事でタイムラインのフィルタリングを行えます。
xyttr:*timeline-filter*に格納されている関数がツイートデータに順次適用され、最終的に返されたデータがタイムラインバッファに表示されます。
途中でフィルタ関数がnilを返した場合、ツイートデータは非表示になります。
;; フィルタリングの動作 (defun filter1 (tweet) (reduce #'(lambda (tweet f) (if tweet (funcall f tweet) nil)) xyttr:*timeline-filter* :initial-value tweet))
xyttr:*timeline-filter*がnilの場合、ツイートデータはそのまま表示されます。
NGユーザー・NGワードフィルタの例
(in-package :xyttr) (defvar *ng-users* nil) ; NGユーザー名(screen_name)のリスト (defvar *ng-words* nil) ; NGワードのリスト (defun ng-filter (tweet) (w/json (user.screen_name text) tweet (unless (or (find user.screen_name *ng-users* :test 'string-equal) (some #'(lambda (w) (string-match w text)) *ng-words*)) ; NGユーザー・NGワードに引っかからなかったらtweetをそのまま返す tweet))) ;; フィルターリストに追加 (push #'ng-filter *timeline-filter*) ;; NGワードでRTを除外 (push "^RT " *ng-words*)
ツイートデータ改変の例
全員名無しさんにします。 (reply等の動作が狂うので注意)
(defun anonymous (tweet) (setf (json-value tweet user.screen_name) "7743" (json-value tweet user.name) "名無しさん") tweet) (push #'anonymous *timeline-filter*)
データの改変はjson-valueマクロを使用して
(setf (json-value tweet key) new-value)
の形で書くのが簡単です。
以上、フィルタリング機能の解説でした。