* mixi.el (mixi-friend-nick-regexp): Follow the change of mixi.
[elisp/mixi.git] / sb-mixi.el
1 ;;; sb-mixi.el --- shimbun backend for mixi
2
3 ;; Copyright (C) 2006, 2007, 2008, 2009 OHASHI Akira
4
5 ;; Author: OHASHI Akira <bg66@koka-in.org>
6 ;; Keywords: news
7
8 ;; This file is *NOT* a part of shimbun.
9
10 ;; This program is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
13 ;; any later version.
14
15 ;; This program is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 ;; GNU General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
22 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 ;; Boston, MA 02110-1301, USA.
24
25 ;;; Commentary:
26
27 ;; If you have bug reports and/or suggestions for improvement, please
28 ;; send them via <URL:http://mixi.jp/view_community.pl?id=1596390>.
29
30 ;;; Code:
31
32 (require 'mixi)
33 (require 'mixi-utils)
34 (require 'shimbun)
35
36 (defconst shimbun-mixi-revision "$Revision: 1.66 $")
37
38 (eval-and-compile
39   (luna-define-class shimbun-mixi (shimbun) (comment-cache release-cache))
40   (luna-define-internal-accessors 'shimbun-mixi))
41
42 (defconst shimbun-mixi-default-group-alist
43   '(("new-diaries" . mixi-get-new-diaries)
44     ("new-echoes" . mixi-get-new-echoes)
45     ("new-comments" . mixi-get-new-comments)
46     ("new-bbses" . mixi-get-new-bbses)
47     ("new-bbs-comments" . mixi-get-new-bbs-comments)
48     ("messages" . mixi-get-messages)
49     ("messages.sent" .
50      (lambda (range)
51        (mixi-get-messages 'outbox range)))
52     ("messages.notice" .
53      (lambda (range)
54        (mixi-get-messages 'noticebox range)))
55     ("logs" . mixi-get-logs)
56     ("logs.self" . mixi-get-self-logs)
57     ("my-diaries" . "/home.pl")
58     ("mixi-el" . "/view_community.pl?id=1596390")
59     ("news.newest.domestic" .
60      (lambda (range)
61        (mixi-get-news 'domestic 'newest range)))
62     ("news.newest.politics" .
63      (lambda (range)
64        (mixi-get-news 'politics 'newest range)))
65     ("news.newest.economy" .
66      (lambda (range)
67        (mixi-get-news 'economy 'newest range)))
68     ("news.newest.area" .
69      (lambda (range)
70        (mixi-get-news 'area 'newest range)))
71     ("news.newest.abroad" .
72      (lambda (range)
73        (mixi-get-news 'abroad 'newest range)))
74     ("news.newest.sports" .
75      (lambda (range)
76        (mixi-get-news 'sports 'newest range)))
77     ("news.newest.entertainment" .
78      (lambda (range)
79        (mixi-get-news 'entertainment 'newest range)))
80     ("news.newest.it" .
81      (lambda (range)
82        (mixi-get-news 'IT 'newest range)))
83     ("news.newest.game-anime" .
84      (lambda (range)
85        (mixi-get-news 'game-anime 'newest range)))
86     ("news.newest.column" .
87      (lambda (range)
88        (mixi-get-news 'column 'newest range)))
89     ("news.pickup.domestic" .
90      (lambda (range)
91        (mixi-get-news 'domestic 'pickup range)))
92     ("news.pickup.politics" .
93      (lambda (range)
94        (mixi-get-news 'politics 'pickup range)))
95     ("news.pickup.economy" .
96      (lambda (range)
97        (mixi-get-news 'economy 'pickup range)))
98     ("news.pickup.area" .
99      (lambda (range)
100        (mixi-get-news 'area 'pickup range)))
101     ("news.pickup.abroad" .
102      (lambda (range)
103        (mixi-get-news 'abroad 'pickup range)))
104     ("news.pickup.sports" .
105      (lambda (range)
106        (mixi-get-news 'sports 'pickup range)))
107     ("news.pickup.entertainment" .
108      (lambda (range)
109        (mixi-get-news 'entertainment 'pickup range)))
110     ("news.pickup.it" .
111      (lambda (range)
112        (mixi-get-news 'IT 'pickup range)))
113     ("news.pickup.game-anime" .
114      (lambda (range)
115        (mixi-get-news 'game-anime 'pickup range)))
116     ("news.pickup.column" .
117      (lambda (range)
118        (mixi-get-news 'column 'pickup range)))
119     ("releases" . mixi-get-releases))
120   "An alist of mixi shimbun group default definition.")
121
122 (defcustom shimbun-mixi-group-alist nil
123   "*An alist of mixi shimbun group definition.
124 Each element looks like (NAME . URL) or (NAME . FUNCTION).
125 NAME is a shimbun group name that you can name it as you like.
126 URL is the URL for mixi access point of the group.  If URL is friend's, get
127 his/her diaries as article.  If community's, get its BBSes.  If diary's or
128 BBS's, get its comments.
129 FUNCTION is the function which has one `range' argument and returns the list
130 of mixi object."
131   :group 'shimbun
132   :type '(repeat (cons :fromat "%v"
133                        (string :tag "Group name")
134                        (radio (string :tag "URL")
135                               (function :tag "Function")))))
136
137 (defcustom shimbun-mixi-get-profile-with-diary t
138   "*If non-nil, get his/her profile together with diaries."
139   :group 'shimbun
140   :type 'boolean)
141
142 (defcustom shimbun-mixi-add-comment-count-to-author t
143   "*If non-nil, add comment count to author."
144   :group 'shimbun
145   :type 'boolean)
146
147 ;; FIXME: Don't use this user option.
148 (defcustom shimbun-mixi-page-articles 10
149   "*How many articles are there in one page."
150   :group 'shimbun
151   :type 'integer)
152
153 (defvar shimbun-mixi-x-face-alist
154   '(("default" . "X-Face: CY;j#FoBnpK^37`-IoJvN!J^u;GciiPmMQ@T)~RP1]t8iv?v)/bVI:I\"F!JfWJvhM5{zY!=
155  h.d+'g\\I{D>Ocy?Rc4uYUyOZj2%2Kl>,x-!MCSsyi3!L}psrrC1jlF,O?Ui>qf)X;sBz`/}\\066X%$
156  siG'|4K!2?==|oB&#E'5GGH\\#z[muyQ")))
157
158 (defun shimbun-mixi-group-alist ()
159   (append shimbun-mixi-default-group-alist
160           shimbun-mixi-group-alist))
161
162 (luna-define-method initialize-instance :after ((shimbun shimbun-mixi)
163                                                 &rest init-args)
164   (shimbun-mixi-set-comment-cache-internal shimbun
165                                            (make-hash-table :test 'equal))
166   (shimbun-mixi-set-release-cache-internal shimbun
167                                            (make-hash-table :test 'equal))
168   shimbun)
169
170 (luna-define-method shimbun-close :after ((shimbun shimbun-mixi))
171   (shimbun-mixi-set-comment-cache-internal shimbun nil)
172   (shimbun-mixi-set-release-cache-internal shimbun nil)
173   (mixi-logout))
174
175 (luna-define-method shimbun-groups ((shimbun shimbun-mixi))
176   (mapcar 'car (shimbun-mixi-group-alist)))
177
178 (luna-define-method shimbun-reply-to ((shimbun shimbun-mixi))
179   mixi-reply-to)
180
181 (defun shimbun-mixi-get-headers (shimbun objects &optional range)
182   (let (headers)
183     (catch 'stop
184       (while objects
185         (let ((object (car objects)))
186           (when (and shimbun-mixi-get-profile-with-diary
187                      (mixi-diary-p object))
188             (let ((owner (mixi-diary-owner object)))
189               (unless (mixi-object-realized-p owner)
190                 (mixi-realize-friend owner))))
191           (when (mixi-parent-p object)
192             (let* ((comments (mixi-get-comments object range))
193                    (comment-headers (shimbun-mixi-get-headers shimbun
194                                                               comments)))
195               (while comment-headers
196                 (push (car comment-headers) headers)
197                 (setq comment-headers (cdr comment-headers)))))
198           (let ((class (mixi-object-class object))
199                 (id (mixi-make-message-id object)))
200             (when (and (eq class 'mixi-comment)
201                        (shimbun-search-id shimbun id))
202               (throw 'stop nil))
203             (push
204              (shimbun-create-header
205               0
206               (mixi-make-title object (string-match
207                                        "^new-"
208                                        (shimbun-current-group-internal
209                                         shimbun)))
210               (mixi-make-author object shimbun-mixi-add-comment-count-to-author)
211               (mixi-make-date object)
212               id
213               (if (eq class 'mixi-comment)
214                   (mixi-make-message-id (mixi-comment-parent object))
215                 "")
216               0 0
217               (mixi-make-url object))
218              headers)
219             (when (eq class 'mixi-comment)
220               (puthash id (mixi-comment-content object)
221                        (shimbun-mixi-comment-cache-internal shimbun)))))
222         (setq objects (cdr objects))))
223     headers))
224
225 (luna-define-method shimbun-get-headers ((shimbun shimbun-mixi)
226                                          &optional range)
227   (let ((url-or-function (cdr (assoc (shimbun-current-group-internal shimbun)
228                                      (shimbun-mixi-group-alist))))
229         (range (shimbun-header-index-pages range)))
230     (when (integerp range)
231       (setq range (* range shimbun-mixi-page-articles)))
232     (shimbun-sort-headers
233      (shimbun-mixi-get-headers shimbun
234                                (mixi-make-objects url-or-function range)
235                                range))))
236
237 (defun shimbun-mixi-comment-article (url shimbun header)
238   (let* ((message-id (shimbun-header-id header))
239          (cache (shimbun-mixi-comment-cache-internal shimbun))
240          (article (gethash message-id cache)))
241     (unless (stringp article)
242       (let* ((parent (mixi-make-object-from-url url))
243              (comments (mixi-get-comments parent)))
244         (while comments
245           (let ((id (mixi-make-message-id (car comments)))
246                 (content (mixi-comment-content (car comments))))
247             (puthash id content cache)
248             (when (string= id message-id)
249               (setq article content)))
250           (setq comments (cdr comments)))))
251     article))
252
253 (defun shimbun-mixi-release-article (shimbun header)
254   (let* ((message-id (shimbun-header-id header))
255          (cache (shimbun-mixi-release-cache-internal shimbun))
256          (article (gethash message-id cache)))
257     (unless (stringp article)
258       (let ((releases (mixi-get-releases)))
259         (while releases
260           (let ((id (mixi-make-message-id (car releases)))
261                 (content (mixi-release-content (car releases))))
262             (puthash id content cache)
263             (when (string= id message-id)
264               (setq article content)))
265           (setq releases (cdr releases)))))
266     article))
267
268 (luna-define-method shimbun-article ((shimbun shimbun-mixi)
269                                      header &optional outbuf)
270   (when (shimbun-current-group-internal shimbun)
271     (with-current-buffer (or outbuf (current-buffer))
272       (w3m-insert-string
273        (or (with-temp-buffer
274              (let* ((url (shimbun-article-url shimbun header))
275                     (object (mixi-make-object-from-url url))
276                     (article (cond ((string-match "#comment$" url)
277                                     (shimbun-mixi-comment-article
278                                      url shimbun header))
279                                    ((string-match "release_info.pl$" url)
280                                     (shimbun-mixi-release-article
281                                      shimbun header))
282                                    (t
283                                     (mixi-make-content object)))))
284                (mixi-make-reply-to object)
285                (when (stringp article)
286                  (insert article)))
287              (shimbun-message shimbun "shimbun: Make contents...")
288              (goto-char (point-min))
289              (prog1 (shimbun-make-contents shimbun header)
290                (shimbun-message shimbun "shimbun: Make contents...done")))
291            "")))))
292
293 (provide 'sb-mixi)
294
295 ;;; sb-mixi.el ends here