From 08d23c7b70275dfbdee02d7dd1053d22ebb9e000 Mon Sep 17 00:00:00 2001 From: Tadashi MATSUO Date: Sat, 27 Aug 2011 00:53:32 +0900 Subject: [PATCH] Update the service configuration periodically. * twittering-mode.el: Update the service configuration with the 'help/configuration' API periodically. (twittering-call-api): add `get-service-configuration' as a new command. (twittering-service-configuration-default): new constant. (twittering-service-configuration): new variable. (twittering-service-configuration-queried): new variable. (twittering-service-configuration-update-interval): new variable. (twittering-get-service-configuration): new function. (twittering-update-service-configuration): new function. (twittering-update-service-configuration-sentinel): new function. (twittering-update-service-configuration-clean-up-sentinel): new function. (twittering-update-active-buffers): invoke `twittering-update-service-configuration'. --- ChangeLog | 16 ++++++++ twittering-mode.el | 91 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 584a3b10..c26cf685 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,22 @@ (twittering-call-api): retrieve a list timeline with native retweets. + * twittering-mode.el: Update the service configuration with the + 'help/configuration' API periodically. + (twittering-call-api): add `get-service-configuration' as a new + command. + (twittering-service-configuration-default): new constant. + (twittering-service-configuration): new variable. + (twittering-service-configuration-queried): new variable. + (twittering-service-configuration-update-interval): new variable. + (twittering-get-service-configuration): new function. + (twittering-update-service-configuration): new function. + (twittering-update-service-configuration-sentinel): new function. + (twittering-update-service-configuration-clean-up-sentinel): new + function. + (twittering-update-active-buffers): invoke + `twittering-update-service-configuration'. + 2011-08-18 Tadashi MATSUO * twittering-mode.el: Display the requested URI if a HTTP request diff --git a/twittering-mode.el b/twittering-mode.el index d6a42cf1..b8df76a2 100644 --- a/twittering-mode.el +++ b/twittering-mode.el @@ -4077,7 +4077,14 @@ block-and-report-as-spammer -- Block a user and report him or her as a spammer. user-id -- the user-id that will be blocked. username -- the username who will be blocked. This command requires either of the above key. If both are given, `user-id' - will be used in REST API." + will be used in REST API. +get-service-configuration -- Get the configuration of the server. + Valid key symbols in ARGS-ALIST: + sentinel -- the sentinel that processes retrieved strings. This is used + as an argument SENTINEL of `twittering-send-http-request'. + clean-up-sentinel -- (optional) the clean-up sentinel that post-processes + the buffer associated to the process. This is used as an argument + CLEAN-UP-SENTINEL of `twittering-send-http-request'." (cond ((eq command 'retrieve-timeline) ;; Retrieve a timeline. @@ -4286,9 +4293,90 @@ block-and-report-as-spammer -- Block a user and report him or her as a spammer. (twittering-http-post twittering-api-host (twittering-api-path "report_spam") parameters nil additional-info))) + ((eq command 'get-service-configuration) + (let ((request + (twittering-make-http-request-from-uri + "GET" nil + (concat (if twittering-use-ssl + "https" + "http") + "://" twittering-api-host + "/" (twittering-api-path "help/configuration.xml")))) + (additional-info nil) + (sentinel (cdr (assq 'sentinel args-alist))) + (clean-up-sentinel (cdr (assq 'clean-up-sentinel args-alist)))) + (twittering-send-http-request request additional-info + sentinel clean-up-sentinel))) (t nil))) +;;;; +;;;; Service configuration +;;;; + +(defconst twittering-service-configuration-default + '((short_url_length . 19) + (short_url_length_https . 20)) + "Default value of `twittering-service-configuration'.") +(defvar twittering-service-configuration nil + "Current server configuration.") +(defvar twittering-service-configuration-queried nil) +(defvar twittering-service-configuration-update-interval 86400 + "*Interval of updating `twittering-service-configuration'.") + +(defun twittering-get-service-configuration (entry) + (let ((pair (assq entry twittering-service-configuration))) + (if (null pair) + (cdr (assq entry twittering-service-configuration-default)) + (cdr pair)))) + +(defun twittering-update-service-configuration (&optional ignore-time) + "Update `twittering-service-configuration' if necessary." + (when (and + (eq twittering-service-method 'twitter) + (null twittering-service-configuration-queried) + (or ignore-time + (let ((current (twittering-get-service-configuration 'time)) + (interval + (seconds-to-time + twittering-service-configuration-update-interval))) + (if (null current) + t + ;; If time passed more than `interval', + ;; update the configuration. + (time-less-p interval (time-since current)))))) + (setq twittering-service-configuration-queried t) + (twittering-call-api + 'get-service-configuration + '((sentinel . twittering-update-service-configuration-sentinel) + (clean-up-sentinel + . twittering-update-service-configuration-clean-up-sentinel))))) + +(defun twittering-update-service-configuration-sentinel (proc status connection-info header-info) + (let ((status-line (cdr (assq 'status-line header-info))) + (status-code (cdr (assq 'status-code header-info)))) + (case-string + status-code + (("200") + (let* ((xml (twittering-xml-parse-region (point-min) (point-max))) + (conf-alist (cddr (assq 'configuration xml))) + (entries '(short_url_length short_url_length_https))) + (setq twittering-service-configuration + `((time . ,(current-time)) + ,@(mapcar (lambda (entry) + (let ((value (elt (assq entry conf-alist) 2))) + (cons entry (string-to-number value)))) + entries))) + (setq twittering-service-configuration-queried nil) + nil)) + (t + (setq twittering-service-configuration-queried nil) + (format "Response: %s" status-line))))) + +(defun twittering-update-service-configuration-clean-up-sentinel (proc status connection-info) + (when (not (twittering-process-alive-p proc)) + (setq twittering-service-configuration-queried nil))) + ;;;; ;;;; Account authorization ;;;; @@ -6855,6 +6943,7 @@ FUNC is called as (apply FUNC ARGS)." "Invoke `twittering-get-and-render-timeline' for each active buffer managed by `twittering-mode'." (when (twittering-account-authorized-p) + (twittering-update-service-configuration) (let ((buffer-list (twittering-get-active-buffer-list))) (mapc (lambda (buffer) (with-current-buffer buffer