-
-
Save miyamuko/1716558 to your computer and use it in GitHub Desktop.
http-client版、xyttrでstreaming-apiを使用 (とりあえずfilter.jsonのtrackのみ)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;;; -*- 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