From 30d33b414893290c55b585e40c8085abd2d1556f Mon Sep 17 00:00:00 2001 From: Panagiotis Koutsourakis Date: Fri, 16 Mar 2012 01:22:13 +0100 Subject: [PATCH] Several improvements. Added code to autoload drakma and cl-json (requires quicklisp). Added documentation strings to functions. Added white and black list support. Added a function to pick parts of the tweets. --- twitter-filter.lisp | 59 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/twitter-filter.lisp b/twitter-filter.lisp index e0bd888..1b91daf 100644 --- a/twitter-filter.lisp +++ b/twitter-filter.lisp @@ -1,17 +1,22 @@ +(ql:quickload "drakma") +(ql:quickload "cl-json") + (defpackage :twitter-filter - (:use :cl :drakma :json)) + (:use :cl :drakma :json) + (:export :parse-query)) (in-package :twitter-filter) -(defun convert-response-to-string (resp) - (coerce (mapcar #'code-char (coerce resp 'list)) 'string)) - (defparameter *search-url* "http://search.twitter.com/search.json?q=") -(defun make-query (search-term) - (http-request (concatenate 'string *search-url* (percent-encode search-term)))) +(defun convert-response-to-string (resp) + "The server response is an array of integers. This function converts +it to a string." + (coerce (mapcar #'code-char (coerce resp 'list)) 'string)) (defun percent-encode (str) + "Make the string percent encoded in order to be compatible with +URLs." (labels ((percent-encode-char-list (char-list) (let ((curr (car char-list)) (rest (cdr char-list))) @@ -23,8 +28,50 @@ (t (cons curr (percent-encode-char-list rest))))))) (coerce (percent-encode-char-list (coerce str 'list)) 'string))) +(defun make-query (search-term) + "Make the actual search query to the twitter API." + (http-request (concatenate 'string *search-url* (percent-encode search-term)))) + (defun parse-query (search-term) + "Convert the response to Lisp objects using cl-json library." (with-input-from-string (s (convert-response-to-string (make-query search-term))) (decode-json s))) + +(defparameter *white-list-mode* nil) +(defparameter *black-list-mode* nil) + +(defvar *white-list* nil) +(defvar *black-list* nil) + +;TODO: explore if these two can be written with a macro. +(defun black-list (lisp-tweets) + "Remove a tweet if the user is a member of *black-list*" + (if *black-list-mode* + (remove-if (lambda (x) + (member (cdr (assoc :from--user x)) + *black-list* :test #'equal)) + lisp-tweets) + lisp-tweets)) + +(defun white-list (lisp-tweets) + "Remove a tweet if the user is NOT a member of *white-list*" + (if *white-list-mode* + (remove-if (lambda (x) + (not (member (cdr (assoc :from--user x)) + *white-list* :test #'equal))) + lisp-tweets) + lisp-tweets)) + +(defun get-tweet-element-list (lisp-tweets element) + "Make a list with one element from each tweet from lisp-tweets." + (mapcar (lambda (x) (cdr (assoc element x))) lisp-tweets)) + +(defun apply-lists (lisp-tweets) + "Apply the functions white-list and black-list" + (black-list (white-list lisp-tweets))) + +;Not strictly necessary... Just a reminder. +(defun convert-tweets-to-json (lisp-tweets) + (encode-json lisp-tweets)) -- 2.11.4.GIT