読者です 読者をやめる 読者になる 読者になる

タイムラインのフィルタリング (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)

の形で書くのが簡単です。



以上、フィルタリング機能の解説でした。