From 23a313499c07a1266f88265641befe28b836f9d2 Mon Sep 17 00:00:00 2001 From: bg66 Date: Tue, 5 Aug 2008 04:22:30 +0000 Subject: [PATCH] (mixi-echo-cache): New variable. (mixi-make-echo): New function. (mixi-echo-url-regexp): New constant. (mixi-make-echo-from-url): New function. (mixi-echo-p): New macro. (mixi-echo-page): Ditto. (mixi-echo-owner-nick-regexp): New constant. (mixi-echo-content-regexp): Ditto. (mixi-realize-echo): New function. (mixi-echo-owner): New accessor method. (mixi-echo-post-time): Ditto. (mixi-echo-content): Ditto. (mixi-echo-set-content): Ditto. (mixi-echo-list-page): New macro. (mixi-echo-list-regexp): New constant. (mixi-get-echoes): New function. (mixi-new-echo-list-page): New macro. (mixi-new-echo-list-regexp): New constant. (mixi-get-new-echoes): New function. (mixi-post-echo-page): New macro. (mixi-echo-post-succeed-regexp): New constant. (mixi-post-echo): New function. --- ChangeLog | 25 +++++++++ mixi-ja.texi | 91 +++++++++++++++++++++++++++++++++ mixi.el | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 270 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index a4b51b6..286fb9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2008-08-05 OHASHI Akira + + * mixi.el (mixi-echo-cache): New variable. + (mixi-make-echo): New function. + (mixi-echo-url-regexp): New constant. + (mixi-make-echo-from-url): New function. + (mixi-echo-p): New macro. + (mixi-echo-page): Ditto. + (mixi-echo-owner-nick-regexp): New constant. + (mixi-echo-content-regexp): Ditto. + (mixi-realize-echo): New function. + (mixi-echo-owner): New accessor method. + (mixi-echo-post-time): Ditto. + (mixi-echo-content): Ditto. + (mixi-echo-set-content): Ditto. + (mixi-echo-list-page): New macro. + (mixi-echo-list-regexp): New constant. + (mixi-get-echoes): New function. + (mixi-new-echo-list-page): New macro. + (mixi-new-echo-list-regexp): New constant. + (mixi-get-new-echoes): New function. + (mixi-post-echo-page): New macro. + (mixi-echo-post-succeed-regexp): New constant. + (mixi-post-echo): New function. + 2008-07-31 OHASHI Akira * mixi-gnus.el (mixi-gnus-setup): Avoid matching with bogus addresses diff --git a/mixi-ja.texi b/mixi-ja.texi index 475c0ff..a43de02 100755 --- a/mixi-ja.texi +++ b/mixi-ja.texi @@ -715,6 +715,37 @@ release オブジェクトの各種情報を取得するためのアクセサメソッドの一覧を以下 @ref{mixi-remove-markup} を使用することができます。 @end defun +@subsection echo オブジェクト +@cindex echo オブジェクト + +エコーを表すオブジェクトです。 +以下の関数を使用することにより echo オブジェクトを生成することができます。 + +@defun mixi-make-echo owner post-time +echo オブジェクトを生成します。 +引数には作成者を表す friend オブジェクトとエコーの日時を表す文字列を指定 +してください。 +@end defun + +@subsubsection アクセサメソッド + +echo オブジェクトの各種情報を取得するためのアクセサメソッドの一覧を以下 +に解説します。 + +@defun mixi-echo-owner echo +作成者を返却します。 +@end defun + +@defun mixi-echo-post-time echo +日時を表す文字列を返却します。 +@end defun + +@defun mixi-echo-content echo +本文を返却します。 +本文には HTML タグが含まれている可能性があります。それらを取り除くために +@ref{mixi-remove-markup} を使用することができます。 +@end defun + @node 一覧取得関数 @section 一覧取得関数 @@ -1147,6 +1178,49 @@ IT・テクノロジー @end cartouche @end defun +@defun mixi-get-echoes &rest friend-or-range +エコー一覧を取得します。 +@var{friend-or-range} は friend オブジェクトまたは数値を指定することがで +きます。 +friend オブジェクトを指定した場合はそのオブジェクトで指定した人のエコー +一覧を取得します。friend オブジェクトを指定しなかった場合は@emph{自分}の +エコー一覧を取得します。 +数値を指定した場合は最大でこの数のエコーのみを取得します。 +friend オブジェクトと数値は同時に指定することもできます。 + +@cartouche +@example +(mixi-get-echoes) + @result{} 自分のエコーすべて + +(mixi-get-echoes 5) + @result{} 自分のエコー最大で 5 件分のみ + +(mixi-get-echoes friend) + @result{} friend さんのエコーすべて + +(mixi-get-echoes friend 10) + @result{} friend さんのエコー最大で 10 件分のみ +@end example +@end cartouche +@end defun + +@defun mixi-get-new-echoes &optional range +みんなのエコー一覧を取得します。 +@var{range} は数値を指定することができます。 +@var{range} を指定した場合は最大でこの数のみんなのエコーのみを取得します。 + +@cartouche +@example +(mixi-get-new-echoes) + @result{} みんなのエコーすべて + +(mixi-get-new-echoes 5) + @result{} みんなのエコー最大で 5 件分のみ +@end example +@end cartouche +@end defun + @node 投稿用関数 @section 投稿用関数 @@ -1203,6 +1277,23 @@ IT・テクノロジー @end cartouche @end defun +@defun mixi-post-echo content &optional parent +エコーを投稿します。 +引数には本文を指定してください。 +@var{parent} には返信先を表す echo オブジェクトを指定することができます。 +@var{parent} を指定した場合はこのエコーへの返信として投稿します。 + +@cartouche +@example +(mixi-post-echo "本文") + @result{} 不定 + +(mixi-post-echo "本文" echo) + @result{} 不定 +@end example +@end cartouche +@end defun + @node その他の関数 @section その他の関数 diff --git a/mixi.el b/mixi.el index f379efb..4d9566a 100644 --- a/mixi.el +++ b/mixi.el @@ -46,6 +46,7 @@ ;; * mixi-get-introductions (broken) ;; * mixi-get-news ;; * mixi-get-releases +;; * mixi-get-echoes (limited) ;; ;; APIs for posting: ;; @@ -53,6 +54,7 @@ ;; * mixi-post-topic ;; * mixi-post-comment ;; * mixi-post-message +;; * mixi-post-echo (limited) ;; ;; Utilities: ;; @@ -139,7 +141,7 @@ (autoload 'w3m-retrieve "w3m") (autoload 'url-retrieve-synchronously "url")) -(defconst mixi-revision "$Revision: 1.189 $") +(defconst mixi-revision "$Revision: 1.190 $") (defgroup mixi nil "API library for accessing to mixi." @@ -858,7 +860,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-friend (friend) "Realize a FRIEND." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p friend) (with-mixi-retrieve (mixi-friend-page friend) (let ((case-fold-search t)) @@ -1214,7 +1216,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-diary (diary &optional page) "Realize a DIARY." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p diary) (with-mixi-retrieve (or page (mixi-diary-page diary)) (let ((case-fold-search t)) @@ -1516,7 +1518,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-community (community) "Realize a COMMUNITY." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p community) (with-mixi-retrieve (mixi-community-page community) (let ((case-fold-search t)) @@ -1785,7 +1787,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-topic (topic &optional page) "Realize a TOPIC." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p topic) (with-mixi-retrieve (or page (mixi-topic-page topic)) (if (re-search-forward mixi-topic-community-regexp nil t) @@ -1977,7 +1979,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-event (event &optional page) "Realize a EVENT." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p event) (with-mixi-retrieve (or page (mixi-event-page event)) (let ((case-fold-search t)) @@ -2857,7 +2859,7 @@ Increase this value when unexpected error frequently occurs." (defun mixi-realize-news (news) "Realize a NEWS." - ;; FIXME: Check a expiration of cache? + ;; FIXME: Check an expiration of cache? (unless (mixi-object-realized-p news) (with-mixi-retrieve (mixi-news-page news) (if (re-search-forward mixi-news-finished-regexp nil t) @@ -3079,6 +3081,151 @@ Increase this value when unexpected error frequently occurs." (nth 4 item))) items))) +;; Echo object. +(defvar mixi-echo-cache (make-hash-table :test 'equal)) +;; FIXME: Support parent. +(defun mixi-make-echo (owner post-time &optional content) + "Return an echo object." + (let ((owner (or owner (mixi-make-me)))) + (mixi-make-cache (list (mixi-friend-id owner) post-time) + (cons 'mixi-echo (vector nil owner post-time content)) + mixi-echo-cache))) + +(defconst mixi-echo-url-regexp + "view_echo\\.pl\\?id=\\([0-9]+\\)&post_time=\\([0-9]+\\)") + +(defun mixi-make-echo-from-url (url) + "Return an echo object from URL." + (when (string-match mixi-echo-url-regexp url) + (let ((owner-id (match-string 1 url)) + (post-time (match-string 2 url))) + (mixi-make-echo (mixi-make-friend owner-id) post-time)))) + +(defmacro mixi-echo-p (echo) + `(eq (mixi-object-class ,echo) 'mixi-echo)) + +(defmacro mixi-echo-page (echo) + `(concat "/view_echo.pl?id=" (mixi-friend-id (mixi-echo-owner ,echo)) + "&post_time=" (mixi-echo-post-time ,echo))) + +(defconst mixi-echo-owner-nick-regexp + "
\\(.*\\)
") +(defconst mixi-echo-content-regexp + "
\\(.+\\)
") + +(defun mixi-realize-echo (echo) + "Realize an ECHO." + ;; FIXME: Check an expiration of cache? + (unless (mixi-object-realized-p echo) + (with-mixi-retrieve (mixi-echo-page echo) + (let ((case-fold-search t)) + (if (re-search-forward mixi-echo-owner-nick-regexp nil t) + (mixi-friend-set-nick (mixi-echo-owner echo) + (match-string 1)) + (mixi-realization-error 'cannot-find-owner-nick echo)) + (if (re-search-forward mixi-echo-content-regexp nil t) + (mixi-echo-set-content echo (match-string 1)) + (mixi-realization-error 'cannot-find-owner-nick echo)))) + (mixi-object-touch echo))) + +(defun mixi-echo-owner (echo) + "Return the owner of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (aref (cdr echo) 1)) + +(defun mixi-echo-post-time (echo) + "Return the post-time of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (aref (cdr echo) 2)) + +(defun mixi-echo-content (echo) + "Return the content of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (mixi-realize-echo echo) + (aref (cdr echo) 3)) + +(defun mixi-echo-set-content (echo content) + "Set the content of ECHO." + (unless (mixi-echo-p echo) + (signal 'wrong-type-argument (list 'mixi-echo-p echo))) + (aset (cdr echo) 3 content)) + +(defmacro mixi-echo-list-page (&optional friend) + `(concat "/list_echo.pl?page=%d" + (when ,friend (concat "&id=" (mixi-friend-id ,friend))))) + +(defconst mixi-echo-list-regexp + "") + +;;;###autoload +(defun mixi-get-echoes (&rest friend-or-range) + "Get echoes of FRIEND." + (when (> (length friend-or-range) 2) + (signal 'wrong-number-of-arguments + (list 'mixi-get-echoes (length friend-or-range)))) + (let ((friend (nth 0 friend-or-range)) + (range (nth 1 friend-or-range))) + (when (or (not (mixi-friend-p friend)) (mixi-friend-p range)) + (setq friend (nth 1 friend-or-range)) + (setq range (nth 0 friend-or-range))) + (unless (or (null friend) (mixi-friend-p friend)) + (signal 'wrong-type-argument (list 'mixi-friend-p friend))) + (let ((items (mixi-get-matched-items (mixi-echo-list-page friend) + mixi-echo-list-regexp + range))) + (mapcar (lambda (item) + (mixi-make-echo friend (nth 1 item))) + items)))) + +(defmacro mixi-new-echo-list-page () + `(concat "/recent_echo.pl?page=%d")) + +(defconst mixi-new-echo-list-regexp + "") + +;;;###autoload +(defun mixi-get-new-echoes (&optional range) + "Get new echoes." + (let ((items (mixi-get-matched-items (mixi-new-echo-list-page) + mixi-new-echo-list-regexp + range))) + (mapcar (lambda (item) + (mixi-make-echo (mixi-make-friend (nth 0 item)) (nth 1 item))) + items))) + +(defmacro mixi-post-echo-page () + `(concat "/add_echo.pl")) + +(defconst mixi-echo-post-succeed-regexp mixi-my-id-regexp) + +;;;###autoload +(defun mixi-post-echo (content &optional parent) + "Post an echo." + (unless (stringp content) + (signal 'wrong-type-argument (list 'stringp content))) + (unless (or (null parent) (mixi-echo-p parent)) + (signal 'wrong-type-argument (list 'mixi-echo-p parent))) + (let (fields post-key) + (with-mixi-retrieve (mixi-post-echo-page) + (if (re-search-forward mixi-post-key-regexp nil t) + (setq post-key (match-string 1)) + (mixi-post-error 'cannot-find-key))) + (setq fields `(("post_key" . ,post-key) + ("redirect" . "home") + ("body" . ,content))) + (when (mixi-echo-p parent) + (setq fields (cons `("parent_member_id" . ,(mixi-friend-id + (mixi-echo-owner parent))) + fields)) + (setq fields (cons `("parent_post_time" . ,(mixi-echo-post-time parent)) + fields))) + (with-mixi-post-form (mixi-post-echo-page) fields + (unless (re-search-forward mixi-echo-post-succeed-regexp nil t) + (mixi-post-error 'cannot-find-succeed))))) + (provide 'mixi) ;;; mixi.el ends here -- 1.7.10.4