* mixi.el (mixi-new-bbs-comment-list-page): New macro.
[elisp/mixi.git] / sb-mixi.el
index 8b2e77b..248929b 100644 (file)
@@ -1,6 +1,6 @@
 ;;; sb-mixi.el --- shimbun backend for mixi
 
 ;;; sb-mixi.el --- shimbun backend for mixi
 
-;; Copyright (C) 2006 OHASHI Akira
+;; Copyright (C) 2006, 2007 OHASHI Akira
 
 ;; Author: OHASHI Akira <bg66@koka-in.org>
 ;; Keywords: news
 
 ;; Author: OHASHI Akira <bg66@koka-in.org>
 ;; Keywords: news
 ;;; Code:
 
 (require 'mixi)
 ;;; Code:
 
 (require 'mixi)
+(require 'mixi-utils)
 (require 'shimbun)
 
 (require 'shimbun)
 
+(defconst shimbun-mixi-revision "$Revision: 1.58 $")
+
 (eval-and-compile
   (luna-define-class shimbun-mixi (shimbun) (comment-cache))
   (luna-define-internal-accessors 'shimbun-mixi))
 
 (eval-and-compile
   (luna-define-class shimbun-mixi (shimbun) (comment-cache))
   (luna-define-internal-accessors 'shimbun-mixi))
 
-(defcustom shimbun-mixi-group-alist
+(defconst shimbun-mixi-default-group-alist
   '(("new-diaries" . mixi-get-new-diaries)
     ("new-comments" . mixi-get-new-comments)
     ("new-bbses" . mixi-get-new-bbses)
   '(("new-diaries" . mixi-get-new-diaries)
     ("new-comments" . mixi-get-new-comments)
     ("new-bbses" . mixi-get-new-bbses)
+    ("new-bbs-comments" . mixi-get-new-bbs-comments)
     ("messages" . mixi-get-messages)
     ("messages.sent" .
      (lambda (range)
        (mixi-get-messages 'outbox range)))
     ("messages" . mixi-get-messages)
     ("messages.sent" .
      (lambda (range)
        (mixi-get-messages 'outbox range)))
+    ("logs" . mixi-get-logs)
     ("my-diaries" . "/home.pl")
     ("mixi-el" . "/view_community.pl?id=1596390")
     ("news.newest.domestic" .
     ("my-diaries" . "/home.pl")
     ("mixi-el" . "/view_community.pl?id=1596390")
     ("news.newest.domestic" .
     ("news.pickup.it" .
      (lambda (range)
        (mixi-get-news 'IT 'pickup range))))
     ("news.pickup.it" .
      (lambda (range)
        (mixi-get-news 'IT 'pickup range))))
+  "An alist of mixi shimbun group default definition.")
+
+(defcustom shimbun-mixi-group-alist nil
   "*An alist of mixi shimbun group definition.
 Each element looks like (NAME . URL) or (NAME . FUNCTION).
   "*An alist of mixi shimbun group definition.
 Each element looks like (NAME . URL) or (NAME . FUNCTION).
-NAME is a shimbun group name.
+NAME is a shimbun group name that you can name it as you like.
 URL is the URL for mixi access point of the group.  If URL is friend's, get
 his/her diaries as article.  If community's, get its BBSes.  If diary's or
 BBS's, get its comments.
 URL is the URL for mixi access point of the group.  If URL is friend's, get
 his/her diaries as article.  If community's, get its BBSes.  If diary's or
 BBS's, get its comments.
@@ -106,11 +114,12 @@ of mixi object."
   :type '(repeat (cons :fromat "%v"
                       (string :tag "Group name")
                       (radio (string :tag "URL")
   :type '(repeat (cons :fromat "%v"
                       (string :tag "Group name")
                       (radio (string :tag "URL")
-                             (const :tag "New diaries" mixi-get-new-diaries)
-                             (const :tag "New comments" mixi-get-new-comments)
-                             (const :tag "New BBSes" mixi-get-new-bbses)
-                             (const :tag "Messages" mixi-get-messages)
-                             (function :tag "Other function")))))
+                             (function :tag "Function")))))
+
+(defcustom shimbun-mixi-get-profile-with-diary t
+  "*If non-nil, get his/her profile together with diaries."
+  :group 'shimbun
+  :type 'boolean)
 
 ;; FIXME: Don't use this user option.
 (defcustom shimbun-mixi-page-articles 10
 
 ;; FIXME: Don't use this user option.
 (defcustom shimbun-mixi-page-articles 10
@@ -123,7 +132,9 @@ of mixi object."
  h.d+'g\\I{D>Ocy?Rc4uYUyOZj2%2Kl>,x-!MCSsyi3!L}psrrC1jlF,O?Ui>qf)X;sBz`/}\\066X%$
  siG'|4K!2?==|oB&#E'5GGH\\#z[muyQ")))
 
  h.d+'g\\I{D>Ocy?Rc4uYUyOZj2%2Kl>,x-!MCSsyi3!L}psrrC1jlF,O?Ui>qf)X;sBz`/}\\066X%$
  siG'|4K!2?==|oB&#E'5GGH\\#z[muyQ")))
 
-(defvar shimbun-mixi-reply-to nil)
+(defun shimbun-mixi-group-alist ()
+  (append shimbun-mixi-default-group-alist
+         shimbun-mixi-group-alist))
 
 (luna-define-method initialize-instance :after ((shimbun shimbun-mixi)
                                                &rest init-args)
 
 (luna-define-method initialize-instance :after ((shimbun shimbun-mixi)
                                                &rest init-args)
@@ -136,194 +147,81 @@ of mixi object."
   (mixi-logout))
 
 (luna-define-method shimbun-groups ((shimbun shimbun-mixi))
   (mixi-logout))
 
 (luna-define-method shimbun-groups ((shimbun shimbun-mixi))
-  (mapcar 'car shimbun-mixi-group-alist))
+  (mapcar 'car (shimbun-mixi-group-alist)))
 
 (luna-define-method shimbun-reply-to ((shimbun shimbun-mixi))
 
 (luna-define-method shimbun-reply-to ((shimbun shimbun-mixi))
-  shimbun-mixi-reply-to)
-
-(defun shimbun-mixi-make-subject (shimbun object)
-  (let ((class (mixi-object-class object)))
-    (if (eq class 'mixi-comment)
-        (concat "Re: " (shimbun-mixi-make-subject
-                       shimbun (mixi-comment-parent object)))
-      (let ((prefix (when (eq class 'mixi-event) "[¥¤¥Ù¥ó¥È]"))
-           (subject (mixi-object-title object))
-           (suffix (when (string-match
-                          "^new-" (shimbun-current-group-internal shimbun))
-                     (concat " ("
-                             (if (eq class 'mixi-diary)
-                                 (mixi-friend-nick
-                                  (mixi-diary-owner object))
-                               (mixi-community-name
-                                (mixi-bbs-community object)))
-                             ")"))))
-       (concat prefix subject suffix)))))
-
-(defun shimbun-mixi-make-from (object)
-  (let ((class (mixi-object-class object)))
-    (if (eq class 'mixi-news)
-       (mixi-news-media object)
-      (let ((owner (mixi-object-owner object)))
-       (mixi-friend-nick owner)))))
-
-(defun shimbun-mixi-make-date (object)
-  (let* ((time (mixi-object-time object))
-        (cts (current-time-string time))
-        (day-of-week (substring cts 0 3))
-        (month (substring cts 4 7)))
-    (concat day-of-week ", "
-           (format-time-string "%d" time) " "
-           month " "
-           (format-time-string "%Y %H:%M:%S %z" time))))
-
-(defun shimbun-mixi-make-message-id (object)
-  (let ((class (mixi-object-class object)))
-    (concat "<"
-           (format-time-string "%Y%m%d%H%M" (mixi-object-time object)) "."
-           (if (eq class 'mixi-comment)
-               (concat (mixi-friend-id (mixi-comment-owner object)) "@"
-                       (mixi-object-id (mixi-comment-parent object)) "."
-                       (mixi-friend-id (mixi-object-owner
-                                        (mixi-comment-parent object))) ".")
-             (concat (mixi-object-id object) "@"
-                     (if (eq class 'mixi-news)
-                         (mixi-news-media-id object)
-                       (mixi-object-id (mixi-object-owner object))) "."))
-           (mixi-object-name object) ".mixi.jp"
-           ">")))
-
-(defun shimbun-mixi-make-xref (object)
-  (let ((class (mixi-object-class object)))
-    (cond ((eq class 'mixi-diary)
-          (mixi-expand-url (mixi-diary-page object)))
-         ((eq class 'mixi-topic)
-          (mixi-expand-url (mixi-topic-page object)))
-         ((eq class 'mixi-event)
-          (mixi-expand-url (mixi-event-page object)))
-         ((eq class 'mixi-comment)
-          (concat (shimbun-mixi-make-xref (mixi-comment-parent object))
-                  "#comment"))
-         ((eq class 'mixi-message)
-          (mixi-expand-url (mixi-message-page object)))
-         ((eq class 'mixi-news)
-          (mixi-news-page object)))))
-
-(defun shimbun-mixi-make-body (object)
-  (let ((class (mixi-object-class object)))
-    (cond ((eq class 'mixi-event)
-          (let ((limit (mixi-event-limit object)))
-            (setq limit (if limit
-                            (format-time-string "%Yǯ%m·î%dÆü" limit)
-                          "»ØÄê¤Ê¤·"))
-            (concat "<dl><dt>³«ºÅÆü»þ¡§</dt>"
-                    "<dd>" (mixi-event-date object) "</dd>"
-                    "<dt>³«ºÅ¾ì½ê¡§</dt>"
-                    "<dd>" (mixi-event-place object) "</dd>"
-                    "<dt>¾ÜºÙ¡§</dt>"
-                    "<dd>" (mixi-event-detail object) "</dd>"
-                    "<dt>Ê罸´ü¸Â¡§</dt>"
-                    "<dd>" limit "</dd>"
-                    "<dt>»²²Ã¼Ô¡§</dt>"
-                    "<dd>" (mixi-event-members object) "</dd></dl>")))
-         (t (mixi-object-content object)))))
-
-(defun shimbun-mixi-make-reply-to (object)
-  (setq shimbun-mixi-reply-to "mixi;")
-  (let ((class (mixi-object-class object)))
-    (setq shimbun-mixi-reply-to
-         (concat
-          (cond ((eq class 'mixi-diary)
-                 (concat shimbun-mixi-reply-to "comment;diary;"
-                         (mixi-friend-id (mixi-diary-owner object)) ";"
-                         (mixi-diary-id object)))
-                ((mixi-bbs-p object)
-                 (concat shimbun-mixi-reply-to "comment;"
-                         (mixi-object-name object) ";"
-                         (mixi-community-id (mixi-bbs-community object)) ";"
-                         (mixi-bbs-id object)))
-                ((eq class 'mixi-community)
-                 (concat shimbun-mixi-reply-to "topic;"
-                         (mixi-community-id object)))
-                ((or (eq class 'mixi-news) (eq object (mixi-make-me)))
-                 (concat shimbun-mixi-reply-to "diary"))
-                ((eq class 'mixi-message)
-                 (concat shimbun-mixi-reply-to "message;"
-                         (mixi-friend-id (mixi-message-owner object))))
-                ((or (eq class 'mixi-friend) (eq class 'mixi-log))
-                 (concat shimbun-mixi-reply-to "message;"
-                         (mixi-friend-id object))))))))
+  mixi-reply-to)
 
 (defun shimbun-mixi-get-headers (shimbun objects &optional range)
 
 (defun shimbun-mixi-get-headers (shimbun objects &optional range)
-  (when objects
-    (let (headers)
-      (catch 'stop
-       (mapc (lambda (object)
-               (when (mixi-object-p object)
-                 (let ((class (mixi-object-class object)))
-                   (when (mixi-parent-p object)
-                     (let ((comments (mixi-get-comments object range)))
-                       (mapc (lambda (header)
-                               (push header headers))
-                             (shimbun-mixi-get-headers shimbun
-                                                       comments))))
-                   (let ((id (shimbun-mixi-make-message-id object)))
-                     (when (and (eq class 'mixi-comment)
-                                (shimbun-search-id shimbun id))
-                       (throw 'stop nil))
-                     (push
-                      (shimbun-create-header
-                       0
-                       (shimbun-mixi-make-subject shimbun object)
-                       (shimbun-mixi-make-from object)
-                       (shimbun-mixi-make-date object)
-                       id
-                       (if (eq class 'mixi-comment)
-                           (shimbun-mixi-make-message-id
-                            (mixi-comment-parent object))
-                         "")
-                       0 0
-                       (shimbun-mixi-make-xref object))
-                      headers)
-                     (when (eq class 'mixi-comment)
-                       (puthash id (mixi-comment-content object)
-                                (shimbun-mixi-comment-cache-internal
-                                 shimbun)))))))
-             objects))
-      headers)))
+  (let (headers)
+    (catch 'stop
+      (while objects
+       (let ((object (car objects)))
+         (when (and shimbun-mixi-get-profile-with-diary
+                    (mixi-diary-p object))
+           (let ((owner (mixi-diary-owner object)))
+             (unless (mixi-object-realized-p owner)
+               (mixi-realize-friend owner))))
+         (when (mixi-parent-p object)
+           (let* ((comments (mixi-get-comments object range))
+                  (comment-headers (shimbun-mixi-get-headers shimbun
+                                                             comments)))
+             (while comment-headers
+               (push (car comment-headers) headers)
+               (setq comment-headers (cdr comment-headers)))))
+         (let ((class (mixi-object-class object))
+               (id (mixi-make-message-id object)))
+           (when (and (eq class 'mixi-comment)
+                      (shimbun-search-id shimbun id))
+             (throw 'stop nil))
+           (push
+            (shimbun-create-header
+             0
+             (mixi-make-title object (string-match
+                                      "^new-"
+                                      (shimbun-current-group-internal
+                                       shimbun)))
+             (mixi-make-author object)
+             (mixi-make-date object)
+             id
+             (if (eq class 'mixi-comment)
+                 (mixi-make-message-id (mixi-comment-parent object))
+               "")
+             0 0
+             (mixi-make-url object))
+            headers)
+           (when (eq class 'mixi-comment)
+             (puthash id (mixi-comment-content object)
+                      (shimbun-mixi-comment-cache-internal shimbun)))))
+       (setq objects (cdr objects))))
+    headers))
 
 (luna-define-method shimbun-get-headers ((shimbun shimbun-mixi)
                                         &optional range)
   (let ((url-or-function (cdr (assoc (shimbun-current-group-internal shimbun)
 
 (luna-define-method shimbun-get-headers ((shimbun shimbun-mixi)
                                         &optional range)
   (let ((url-or-function (cdr (assoc (shimbun-current-group-internal shimbun)
-                                    shimbun-mixi-group-alist)))
-       (range (when (integerp range) (* range shimbun-mixi-page-articles)))
-       objects)
-    (if (stringp url-or-function)
-       (let* ((object (mixi-make-object-from-url url-or-function))
-              (class (mixi-object-class object)))
-         (cond ((eq class 'mixi-friend)
-                (setq objects (mixi-get-diaries object range)))
-               ((eq class 'mixi-community)
-                (setq objects (mixi-get-bbses object range)))
-               ((mixi-parent-p object)
-                (setq objects (mixi-get-comments object range)))
-               (t (error (concat (symbol-name class)
-                                 " is not supported yet.")))))
-      (setq objects (funcall url-or-function range)))
-    (shimbun-sort-headers (shimbun-mixi-get-headers shimbun objects range))))
+                                    (shimbun-mixi-group-alist))))
+       (range (shimbun-header-index-pages range)))
+    (when (integerp range)
+      (setq range (* range shimbun-mixi-page-articles)))
+    (shimbun-sort-headers
+     (shimbun-mixi-get-headers shimbun
+                              (mixi-make-objects url-or-function range)
+                              range))))
 
 (defun shimbun-mixi-comment-article (url shimbun header)
   (let* ((message-id (shimbun-header-id header))
         (cache (shimbun-mixi-comment-cache-internal shimbun))
         (article (gethash message-id cache)))
     (unless (stringp article)
 
 (defun shimbun-mixi-comment-article (url shimbun header)
   (let* ((message-id (shimbun-header-id header))
         (cache (shimbun-mixi-comment-cache-internal shimbun))
         (article (gethash message-id cache)))
     (unless (stringp article)
-      (let ((parent (mixi-make-object-from-url url)))
-       (mapc (lambda (comment)
-               (let ((id (shimbun-mixi-make-message-id comment))
-                     (content (mixi-comment-content comment)))
-                 (puthash id content cache)
-                 (when (string= id message-id)
-                   (setq article content))))
-             (mixi-get-comments parent))))
+      (let* ((parent (mixi-make-object-from-url url))
+            (comments (mixi-get-comments parent)))
+       (while comments
+         (let ((id (mixi-make-message-id (car comments)))
+               (content (mixi-comment-content (car comments))))
+           (puthash id content cache)
+           (when (string= id message-id)
+             (setq article content)))
+         (setq comments (cdr comments)))))
     article))
 
 (luna-define-method shimbun-article ((shimbun shimbun-mixi)
     article))
 
 (luna-define-method shimbun-article ((shimbun shimbun-mixi)
@@ -337,8 +235,8 @@ of mixi object."
                    (article (if (string-match "#comment$" url)
                                 (shimbun-mixi-comment-article
                                  url shimbun header)
                    (article (if (string-match "#comment$" url)
                                 (shimbun-mixi-comment-article
                                  url shimbun header)
-                              (shimbun-mixi-make-body object))))
-              (shimbun-mixi-make-reply-to object)
+                              (mixi-make-content object))))
+              (mixi-make-reply-to object)
               (when (stringp article)
                 (insert article)))
             (shimbun-message shimbun "shimbun: Make contents...")
               (when (stringp article)
                 (insert article)))
             (shimbun-message shimbun "shimbun: Make contents...")
@@ -347,33 +245,6 @@ of mixi object."
               (shimbun-message shimbun "shimbun: Make contents...done")))
           "")))))
 
               (shimbun-message shimbun "shimbun: Make contents...done")))
           "")))))
 
-(defconst shimbun-mixi-to-regexp
-  "^mixi;\\([a-z]+\\);?\\([a-z0-9]+\\)?;?\\([0-9]+\\)?;?\\([0-9]+\\)?")
-
-(defun shimbun-mixi-send-mail (to title content)
-  (when (string-match shimbun-mixi-to-regexp to)
-    (let ((method (match-string 1 to)))
-      (cond ((string= method "comment")
-            (let ((parent (match-string 2 to))
-                  (owner-id (match-string 3 to))
-                  (id (match-string 4 to)))
-              (if (string= parent "diary")
-                  (mixi-post-comment
-                   (mixi-make-diary (mixi-make-friend owner-id) id) content)
-                (let ((func (intern
-                             (concat mixi-object-prefix "make-" parent))))
-                  (mixi-post-comment
-                   (funcall func (mixi-make-community owner-id) id)
-                   content)))))
-           ((string= method "topic")
-            (mixi-post-topic (mixi-make-community (match-string 2 to))
-                             title content))
-           ((string= method "diary")
-            (mixi-post-diary title content))
-           ((string= method "message")
-            (mixi-post-message (mixi-make-friend (match-string 2 to))
-                               title content))))))
-
 (provide 'sb-mixi)
 
 ;;; sb-mixi.el ends here
 (provide 'sb-mixi)
 
 ;;; sb-mixi.el ends here