Skip to content

Instantly share code, notes, and snippets.

@miyamuko
Forked from youz/xyttr-streaming-api.l
Created February 1, 2012 11:05
Show Gist options
  • Save miyamuko/1716558 to your computer and use it in GitHub Desktop.
Save miyamuko/1716558 to your computer and use it in GitHub Desktop.
http-client版、xyttrでstreaming-apiを使用 (とりあえずfilter.jsonのtrackのみ)
;;; -*- mode: lisp; package: xyttr -*-
(eval-when (:compile-toplevel :load-toplevel :execute)
(require "cmu_loop")
(require "json")
(require "http-client")
(require "xyttr")
(use-package :http-client :xyttr))
(in-package :xyttr)
(defconstant *stream-api-host* "stream.twitter.com")
(defconstant *stream-api-method* "/1/statuses/filter.json")
(defconstant *stream-api-verb* 'post)
(defvar *streaming-client* nil)
(defvar *streaming-buffer* nil)
;; ref. https://dev.twitter.com/docs/streaming-api/methods
(defun streaming-connect (params &key user callback)
(let* ((path *stream-api-method*)
(cred (list :consumer-key *consumer-key* :consumer-secret *consumer-secret*
:token *token* :token-secret *token-secret*))
(auth-url (format nil "https://~A~A" *stream-api-host* *stream-api-method*))
(auth (oauth:auth-header cred *stream-api-verb* auth-url params)))
(setq *streaming-client*
(http-post auth-url
(list params)
:encoding *encoding-utf8n*
:headers `(:Authorization ,auth)
:receiver (http-cond-receiver (status headers content-length)
((= status 200)
(http-general-receiver #'streaming-write :line t))
(t
(http-string-receiver)))
:oncomplete #'streaming-complete
:onerror #'streaming-error
:onabort #'streaming-close
))
))
(defun streaming-write (line)
(if (deleted-buffer-p *streaming-buffer*)
(http-request-abort req)
(whenlet res (json:json-decode line)
(with-set-buffer
(timeline-draw-statuses *streaming-buffer* (list res)))
(refresh-screen))))
(defun streaming-complete (body status headers uri)
(unless (= 200 status)
(message-box (format nil "~{~A~%~}~%~A"
(mapcar #'(lambda (kv) (format nil "~A: ~A" (car kv) (cdr kv))) headers)
body)
(format nil "接続失敗: ~A" status)
(list :ok :exclamation)))
(streaming-close))
(defun streaming-error (error)
(message-box (format nil "~A" error)
"エラー"
(list :ok :exclamation))
(streaming-close))
(defun streaming-close (&optional error)
(when *streaming-client*
(http-request-abort *streaming-client*)
(setq *streaming-client* nil)))
(defun streaming-start (params buf &key (user *default-user*))
(labels ((closer (b)
(when (eq b buf)
(delete-hook '*before-delete-buffer-hook* #'closer)
(streaming-close)
(setq *streaming-buffer* nil))
t))
(set-buffer buf)
(make-local-variable '*before-delete-buffer-hook*)
(add-hook '*before-delete-buffer-hook* #'closer)
(setq *streaming-buffer* buf)
(streaming-connect params :user user)
))
;;; command
(defun user::xyttr-stream-track (track)
(interactive "sTrack: ")
(when *streaming-client*
(if (eq (message-box (format nil "~Aでのストリーミングを終了しますか?"
(buffer-name *streaming-buffer*))
"確認" (list :question :yes-no)) :yes)
(streaming-close)
(quit)))
(setq *streaming-client* nil
*streaming-buffer* nil)
(let ((buf (get-buffer-create (format nil "*tws*: ~A" track))))
(when *use-frame*
(select-pseudo-frame
(or (find-pseudo-frame *frame-name*)
(new-pseudo-frame *frame-name*))))
(set-buffer buf)
(xyttr-timeline-mode)
; (setf (modeconf-mode buffer-modeconf) :xyttr-stream-track)
(streaming-start `(:track ,track) buf :user *default-user*)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment