]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
New actions for direct messaging through the API
authorZach Copley <zach@status.net>
Sat, 3 Oct 2009 00:23:48 +0000 (17:23 -0700)
committerZach Copley <zach@status.net>
Sat, 3 Oct 2009 00:23:48 +0000 (17:23 -0700)
actions/apidirectmessage.php [new file with mode: 0644]
actions/apidirectmessagenew.php [new file with mode: 0644]
actions/twitapidirect_messages.php [deleted file]
lib/router.php
lib/twitterapi.php

diff --git a/actions/apidirectmessage.php b/actions/apidirectmessage.php
new file mode 100644 (file)
index 0000000..87ae44d
--- /dev/null
@@ -0,0 +1,389 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Show a the direct messages from or to a user
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  API
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/apiauth.php';
+
+/**
+ * Show a list of direct messages from or to the authenticating user
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class ApiDirectMessageAction extends ApiAuthAction
+{
+    var $format       = null;
+    var $messages     = null;
+    var $page         = null;
+    var $count        = null;
+    var $max_id       = null;
+    var $since_id     = null;
+    var $since        = null;
+    var $title        = null;
+    var $subtitle     = null;
+    var $link         = null;
+    var $selfuri_base = null;
+    var $id           = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     *
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        if ($this->requiresAuth()) {
+            if ($this->checkBasicAuthUser() == false) {
+                return;
+            }
+        }
+
+        $this->user = $this->auth_user;
+
+        if (empty($this->user)) {
+            $this->clientError(_('No such user!'), 404, $this->format);
+            return;
+        }
+
+        $this->page     = (int)$this->arg('page', 1);
+        $this->count    = (int)$this->arg('count', 20);
+        $this->max_id   = (int)$this->arg('max_id', 0);
+        $this->since_id = (int)$this->arg('since_id', 0);
+        $this->since    = $this->arg('since');
+
+        $server   = common_root_url();
+        $taguribase = common_config('integration', 'taguri');
+
+        if ($this->arg('sent')) {
+
+            // Action was called by /api/direct_messages/sent.format
+
+            $this->title = sprintf(
+                _("Direct messages from %s"),
+                $this->user->nickname
+            );
+            $this->subtitle = sprintf(
+                _("All the direct messages sent from %s"),
+                $this->user->nickname
+            );
+            $this->link = $server . $this->user->nickname . '/outbox';
+            $this->selfuri_base = common_root_url() . 'api/direct_messages/sent';
+            $this->id = "tag:$taguribase:SentDirectMessages:" . $this->user->id;
+        } else {
+            $this->title = sprintf(
+                _("Direct messages to %s"),
+                $this->user->nickname
+            );
+            $this->subtitle = sprintf(
+                _("All the direct messages sent to %s"),
+                $this->user->nickname
+            );
+            $this->link = $server . $this->user->nickname . '/inbox';
+            $this->selfuri_base = common_root_url() . 'api/direct_messages';
+            $this->id = "tag:$taguribase:DirectMessages:" . $this->user->id;
+        }
+
+        $this->format = $this->arg('format');
+
+        $this->messages = $this->getMessages();
+
+        return true;
+    }
+
+    /**
+     * Handle the request
+     *
+     * Show the messages
+     *
+     * @param array $args $_REQUEST data (unused)
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+        $this->showMessages();
+    }
+
+    /**
+     * Show the messages
+     *
+     * @return void
+     */
+
+    function showMessages()
+    {
+        switch($this->format) {
+        case 'xml':
+            $this->showXmlDirectMessages();
+            break;
+        case 'rss':
+            $this->showRssDirectMessages();
+            break;
+        case 'atom':
+            $this->showAtomDirectMessages();
+            break;
+        case 'json':
+            $this->showJsonDirectMessages();
+            break;
+        default:
+            $this->clientError(_('API method not found!'), $code = 404);
+            break;
+        }
+    }
+
+    /**
+     * Get notices
+     *
+     * @return array notices
+     */
+
+    function getMessages()
+    {
+        $message  = new Message();
+
+        if ($this->arg('sent')) {
+            $message->from_profile = $this->user->id;
+        } else {
+            $message->to_profile = $this->user->id;
+        }
+
+        if (!empty($this->max_id)) {
+            $message->whereAdd('id <= ' . $this->max_id);
+        }
+
+        if (!empty($this->since_id)) {
+            $message->whereAdd('id > ' . $this->since_id);
+        }
+
+        if (!empty($since)) {
+            $d = date('Y-m-d H:i:s', $this->since);
+            $message->whereAdd("created > '$d'");
+        }
+
+        $message->orderBy('created DESC, id DESC');
+        $message->limit((($this->page - 1) * $this->count), $this->count);
+        $message->find();
+
+        $messages = array();
+
+        while ($message->fetch()) {
+            $messages[] = clone($message);
+        }
+
+        return $messages;
+    }
+
+    /**
+     * Is this action read only?
+     *
+     * @param array $args other arguments
+     *
+     * @return boolean true
+     */
+
+    function isReadOnly($args)
+    {
+        return true;
+    }
+
+    /**
+     * When was this notice last modified?
+     *
+     * @return string datestamp of the latest notice in the stream
+     */
+
+    function lastModified()
+    {
+        if (!empty($this->messages)) {
+            return strtotime($this->messages[0]->created);
+        }
+
+        return null;
+    }
+
+    /**
+     * Shows a list of direct messages as Twitter-style XML array
+     *
+     * @return void
+     */
+
+    function showXmlDirectMessages()
+    {
+        $this->init_document('xml');
+        $this->elementStart('direct-messages', array('type' => 'array'));
+
+        foreach ($this->messages as $m) {
+            $dm_array = $this->directMessageArray($m);
+            $this->showXmlDirectMessage($dm_array);
+        }
+
+        $this->elementEnd('direct-messages');
+        $this->end_document('xml');
+    }
+
+    /**
+     * Shows a list of direct messages as a JSON encoded array
+     *
+     * @return void
+     */
+
+    function showJsonDirectMessages()
+    {
+        $this->init_document('json');
+
+        $dmsgs = array();
+
+        foreach ($this->messages as $m) {
+            $dm_array = $this->directMessageArray($m);
+            array_push($dmsgs, $dm_array);
+        }
+
+        $this->show_json_objects($dmsgs);
+        $this->end_document('json');
+    }
+
+    /**
+     * Shows a list of direct messages as RSS items
+     *
+     * @return void
+     */
+
+    function showRssDirectMessages()
+    {
+        $this->init_document('rss');
+
+        $this->element('title', null, $this->title);
+
+        $this->element('link', null, $this->link);
+        $this->element('description', null, $this->subtitle);
+        $this->element('language', null, 'en-us');
+
+        $this->element(
+            'atom:link',
+            array(
+                'type' => 'application/rss+xml',
+                'href' => $this->selfuri_base . '.rss',
+                'rel' => self
+                ),
+            null
+        );
+        $this->element('ttl', null, '40');
+
+        foreach ($this->messages as $m) {
+            $entry = $this->rssDirectMessageArray($m);
+            $this->show_twitter_rss_item($entry);
+        }
+
+        $this->end_twitter_rss();
+    }
+
+    /**
+     * Shows a list of direct messages as Atom entries
+     *
+     * @return void
+     */
+
+    function showAtomDirectMessages()
+    {
+        $this->init_document('atom');
+
+        $this->element('title', null, $this->title);
+        $this->element('id', null, $this->id);
+
+        $selfuri = common_root_url() . 'api/direct_messages.atom';
+
+        $this->element(
+            'link', array(
+            'href' => $this->link,
+            'rel' => 'alternate',
+            'type' => 'text/html'),
+            null
+        );
+        $this->element(
+            'link', array(
+            'href' => $this->selfuri_base . '.atom', 'rel' => 'self',
+            'type' => 'application/atom+xml'),
+            null
+        );
+        $this->element('updated', null, common_date_iso8601('now'));
+        $this->element('subtitle', null, $this->subtitle);
+
+        foreach ($this->messages as $m) {
+            $entry = $this->rssDirectMessageArray($m);
+            $this->showTwitterAtomEntry($entry);
+        }
+
+        $this->end_document('atom');
+    }
+
+    /**
+     * An entity tag for this notice
+     *
+     * Returns an Etag based on the action name, language, and
+     * timestamps of the notice
+     *
+     * @return string etag
+     */
+
+    function etag()
+    {
+        if (!empty($this->messages)) {
+
+            $last = count($this->messages) - 1;
+
+            return '"' . implode(
+                ':',
+                array($this->arg('action'),
+                      common_language(),
+                      strtotime($this->messages[0]->created),
+                      strtotime($this->messages[$last]->created)
+                )
+            )
+            . '"';
+        }
+
+        return null;
+    }
+
+}
diff --git a/actions/apidirectmessagenew.php b/actions/apidirectmessagenew.php
new file mode 100644 (file)
index 0000000..d836409
--- /dev/null
@@ -0,0 +1,192 @@
+<?php
+/**
+ * StatusNet, the distributed open-source microblogging tool
+ *
+ * Send a direct message via the API
+ *
+ * PHP version 5
+ *
+ * LICENCE: This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category  API
+ * @package   StatusNet
+ * @author    Zach Copley <zach@status.net>
+ * @copyright 2009 StatusNet, Inc.
+ * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link      http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+    exit(1);
+}
+
+require_once INSTALLDIR.'/lib/apiauth.php';
+
+/**
+ * Creates a new direct message from the authenticating user to
+ * the user specified by id.
+ *
+ * @category API
+ * @package  StatusNet
+ * @author   Zach Copley <zach@status.net>
+ * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link     http://status.net/
+ */
+
+class ApiDirectMessageNewAction extends ApiAuthAction
+{
+    var $format  = null;
+    var $source  = null;
+    var $user    = null;
+    var $other   = null;
+    var $content = null;
+
+    /**
+     * Take arguments for running
+     *
+     * @param array $args $_REQUEST args
+     *
+     * @return boolean success flag
+     *
+     */
+
+    function prepare($args)
+    {
+        parent::prepare($args);
+
+        if ($this->requiresAuth()) {
+            if ($this->checkBasicAuthUser() == false) {
+                return;
+            }
+        }
+
+        $this->user = $this->auth_user;
+
+        if (empty($this->user)) {
+            $this->clientError(_('No such user!'), 404, $this->format);
+            return;
+        }
+
+        $this->source = $this->trimmed('source'); // Not supported by Twitter.
+
+        $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api');
+        if (empty($thtis->source) || in_array($this->source, $reserved_sources)) {
+            $source = 'api';
+        }
+
+        $this->content = $this->trimmed('text');
+
+        $this->user  = $this->auth_user;
+
+        $user_param  = $this->trimmed('user');
+        $user_id     = $this->arg('user_id');
+        $screen_name = $this->trimmed('screen_name');
+
+        if (isset($user_param) || isset($user_id) || isset($screen_name)) {
+            $this->other = $this->getTargetUser($user_param);
+        }
+
+        $this->format = $this->arg('format');
+
+        return true;
+    }
+
+    /**
+     * Handle the request
+     *
+     * Save the new message
+     *
+     * @param array $args $_REQUEST data (unused)
+     *
+     * @return void
+     */
+
+    function handle($args)
+    {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->clientError(
+                _('This method requires a POST.'),
+                400,
+                $this->format
+            );
+            return;
+        }
+
+        if (empty($this->content)) {
+            $this->clientError(
+                _('No message text!'),
+                406,
+                $this->format
+            );
+        } else {
+            $content_shortened = common_shorten_links($this->content);
+            if (Message::contentTooLong($content_shortened)) {
+                $this->clientError(
+                    sprintf(
+                        _('That\'s too long. Max message size is %d chars.'),
+                        Message::maxContent()
+                    ),
+                    406,
+                    $this->format
+                );
+                return;
+            }
+        }
+
+        if (empty($this->other)) {
+            $this->clientError(_('Recipient user not found.'), 403, $this->format);
+            return;
+        } else if (!$this->user->mutuallySubscribed($this->other)) {
+            $this->clientError(
+                _('Can\'t send direct messages to users who aren\'t your friend.'),
+                403,
+                $this->format
+            );
+            return;
+        } else if ($this->user->id == $this->other->id) {
+
+            // Note: sending msgs to yourself is allowed by Twitter
+
+            $errmsg = 'Don\'t send a message to yourself; ' . 
+                   'just say it to yourself quietly instead.'
+
+            $this->clientError(_($errmsg), 403, $this->format);
+            return;
+        }
+
+        $message = Message::saveNew(
+            $this->user->id,
+            $this->other->id,
+            html_entity_decode($this->content, ENT_NOQUOTES, 'UTF-8'),
+            $this->source
+        );
+
+        if (is_string($message)) {
+            $this->serverError($message);
+            return;
+        }
+
+        mail_notify_message($message, $this->user, $this->other);
+
+        if ($this->format == 'xml') {
+            $this->showSingleXmlDirectMessage($message);
+        } elseif ($this->format == 'json') {
+            $this->showSingleJsondirectMessage($message);
+        }
+    }
+
+}
+
diff --git a/actions/twitapidirect_messages.php b/actions/twitapidirect_messages.php
deleted file mode 100644 (file)
index 08b8f4e..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-if (!defined('STATUSNET') && !defined('LACONICA')) {
-    exit(1);
-}
-
-require_once(INSTALLDIR.'/lib/twitterapi.php');
-
-class Twitapidirect_messagesAction extends TwitterapiAction
-{
-
-    function direct_messages($args, $apidata)
-    {
-        parent::handle($args);
-        return $this->show_messages($args, $apidata, 'received');
-    }
-
-    function sent($args, $apidata)
-    {
-        parent::handle($args);
-        return $this->show_messages($args, $apidata, 'sent');
-    }
-
-    function show_messages($args, $apidata, $type)
-    {
-        $user = $apidata['user']; // Always the auth user
-
-        $message  = new Message();
-        $title    = null;
-        $subtitle = null;
-        $link     = null;
-        $server   = common_root_url();
-
-        if ($type == 'received') {
-            $message->to_profile = $user->id;
-            $title = sprintf(_("Direct messages to %s"), $user->nickname);
-            $subtitle = sprintf(_("All the direct messages sent to %s"),
-                $user->nickname);
-            $link = $server . $user->nickname . '/inbox';
-        } else {
-            $message->from_profile = $user->id;
-            $title = _('Direct Messages You\'ve Sent');
-            $subtitle = sprintf(_("All the direct messages sent from %s"),
-                $user->nickname);
-            $link = $server . $user->nickname . '/outbox';
-        }
-
-        $page     = (int)$this->arg('page', 1);
-        $count    = (int)$this->arg('count', 20);
-        $max_id   = (int)$this->arg('max_id', 0);
-        $since_id = (int)$this->arg('since_id', 0);
-        $since    = $this->arg('since');
-
-        if ($max_id) {
-            $message->whereAdd("id <= $max_id");
-        }
-
-        if ($since_id) {
-            $message->whereAdd("id > $since_id");
-        }
-
-        if ($since) {
-            $d = date('Y-m-d H:i:s', $since);
-            $message->whereAdd("created > '$d'");
-        }
-
-        $message->orderBy('created DESC, id DESC');
-        $message->limit((($page-1)*$count), $count);
-        $message->find();
-
-        switch($apidata['content-type']) {
-        case 'xml':
-            $this->show_xml_dmsgs($message);
-            break;
-        case 'rss':
-            $this->show_rss_dmsgs($message, $title, $link, $subtitle);
-            break;
-        case 'atom':
-            $selfuri = common_root_url() . 'api/direct_messages';
-            $selfuri .= ($type == 'received') ? '.atom' : '/sent.atom';
-            $taguribase = common_config('integration', 'taguri');
-
-            if ($type == 'sent') {
-                $id = "tag:$taguribase:SentDirectMessages:" . $user->id;
-            } else {
-                $id = "tag:$taguribase:DirectMessages:" . $user->id;
-            }
-
-            $this->show_atom_dmsgs($message, $title, $link, $subtitle,
-                $selfuri, $id);
-            break;
-        case 'json':
-            $this->show_json_dmsgs($message);
-            break;
-        default:
-            $this->clientError(_('API method not found!'), $code = 404);
-        }
-
-    }
-
-    // had to change this from "new" to "create" to avoid PHP reserved word
-    function create($args, $apidata)
-    {
-        parent::handle($args);
-
-        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-            $this->clientError(_('This method requires a POST.'),
-                400, $apidata['content-type']);
-            return;
-        }
-
-        $user = $apidata['user'];
-        $source = $this->trimmed('source'); // Not supported by Twitter.
-
-        $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api');
-        if (empty($source) || in_array($source, $reserved_sources)) {
-            $source = 'api';
-        }
-
-        $content = $this->trimmed('text');
-
-        if (empty($content)) {
-            $this->clientError(_('No message text!'),
-                $code = 406, $apidata['content-type']);
-        } else {
-            $content_shortened = common_shorten_links($content);
-            if (Message::contentTooLong($content_shortened)) {
-                $this->clientError(sprintf(_('That\'s too long. Max message size is %d chars.'),
-                                           Message::maxContent()),
-                                   $code = 406, $apidata['content-type']);
-                return;
-            }
-        }
-
-        $other = $this->get_user($this->trimmed('user'));
-
-        if (empty($other)) {
-            $this->clientError(_('Recipient user not found.'),
-                $code = 403, $apidata['content-type']);
-            return;
-        } else if (!$user->mutuallySubscribed($other)) {
-            $this->clientError(_('Can\'t send direct messages to users who aren\'t your friend.'),
-                $code = 403, $apidata['content-type']);
-            return;
-        } else if ($user->id == $other->id) {
-            // Sending msgs to yourself is allowed by Twitter
-            $this->clientError(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'),
-                $code = 403, $apidata['content-type']);
-            return;
-        }
-
-        $message = Message::saveNew($user->id, $other->id,
-            html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source);
-
-        if (is_string($message)) {
-            $this->serverError($message);
-            return;
-        }
-
-        $this->notify($user, $other, $message);
-
-        if ($apidata['content-type'] == 'xml') {
-            $this->show_single_xml_dmsg($message);
-        } elseif ($apidata['content-type'] == 'json') {
-            $this->show_single_json_dmsg($message);
-        }
-
-    }
-
-    function destroy($args, $apidata)
-    {
-        parent::handle($args);
-        $this->serverError(_('API method under construction.'), $code=501);
-    }
-
-    function show_xml_dmsgs($message)
-    {
-
-        $this->init_document('xml');
-        $this->elementStart('direct-messages', array('type' => 'array'));
-
-        if (is_array($message)) {
-            foreach ($message as $m) {
-                $twitter_dm = $this->twitter_dmsg_array($m);
-                $this->show_twitter_xml_dmsg($twitter_dm);
-            }
-        } else {
-            while ($message->fetch()) {
-                $twitter_dm = $this->twitter_dmsg_array($message);
-                $this->show_twitter_xml_dmsg($twitter_dm);
-            }
-        }
-
-        $this->elementEnd('direct-messages');
-        $this->end_document('xml');
-
-    }
-
-    function show_json_dmsgs($message)
-    {
-
-        $this->init_document('json');
-
-        $dmsgs = array();
-
-        if (is_array($message)) {
-            foreach ($message as $m) {
-                $twitter_dm = $this->twitter_dmsg_array($m);
-                array_push($dmsgs, $twitter_dm);
-            }
-        } else {
-            while ($message->fetch()) {
-                $twitter_dm = $this->twitter_dmsg_array($message);
-                array_push($dmsgs, $twitter_dm);
-            }
-        }
-
-        $this->show_json_objects($dmsgs);
-        $this->end_document('json');
-
-    }
-
-    function show_rss_dmsgs($message, $title, $link, $subtitle)
-    {
-
-        $this->init_document('rss');
-
-        $this->elementStart('channel');
-        $this->element('title', null, $title);
-
-        $this->element('link', null, $link);
-        $this->element('description', null, $subtitle);
-        $this->element('language', null, 'en-us');
-        $this->element('ttl', null, '40');
-
-        if (is_array($message)) {
-            foreach ($message as $m) {
-                $entry = $this->twitter_rss_dmsg_array($m);
-                $this->show_twitter_rss_item($entry);
-            }
-        } else {
-            while ($message->fetch()) {
-                $entry = $this->twitter_rss_dmsg_array($message);
-                $this->show_twitter_rss_item($entry);
-            }
-        }
-
-        $this->elementEnd('channel');
-        $this->end_twitter_rss();
-
-    }
-
-    function show_atom_dmsgs($message, $title, $link, $subtitle, $selfuri, $id)
-    {
-
-        $this->init_document('atom');
-
-        $this->element('title', null, $title);
-        $this->element('id', null, $id);
-        $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null);
-        $this->element('link', array('href' => $selfuri, 'rel' => 'self',
-            'type' => 'application/atom+xml'), null);
-        $this->element('updated', null, common_date_iso8601('now'));
-        $this->element('subtitle', null, $subtitle);
-
-        if (is_array($message)) {
-            foreach ($message as $m) {
-                $entry = $this->twitter_rss_dmsg_array($m);
-                $this->show_twitter_atom_entry($entry);
-            }
-        } else {
-            while ($message->fetch()) {
-                $entry = $this->twitter_rss_dmsg_array($message);
-                $this->show_twitter_atom_entry($entry);
-            }
-        }
-
-        $this->end_document('atom');
-    }
-
-    // swiped from MessageAction. Should it be place in util.php?
-    function notify($from, $to, $message)
-    {
-        mail_notify_message($message, $from, $to);
-        # XXX: Jabber, SMS notifications... probably queued
-    }
-
-}
index 57f9864bc55324653d00a4de42c87be253e596fc..75abf58ab89a40f8f65009cc28879d9c0215cebb 100644 (file)
@@ -358,7 +358,6 @@ class Router
                         'id' => '[0-9]+',
                         'format' => '(xml|json)'));
 
-
         // users
 
         $m->connect('api/users/show/:id.:format',
@@ -373,30 +372,19 @@ class Router
 
         // direct messages
 
-        foreach (array('xml', 'json') as $e) {
-            $m->connect('api/direct_messages/new.'.$e,
-                        array('action' => 'api',
-                              'apiaction' => 'direct_messages',
-                              'method' => 'create.'.$e));
-        }
 
-        foreach (array('xml', 'json', 'rss', 'atom') as $e) {
-            $m->connect('api/direct_messages.'.$e,
-                        array('action' => 'api',
-                              'apiaction' => 'direct_messages',
-                              'method' => 'direct_messages.'.$e));
-        }
+        $m->connect('api/direct_messages.:format',
+                    array('action' => 'ApiDirectMessage',
+                          'format' => '(xml|json|rss|atom)'));
 
-        foreach (array('xml', 'json', 'rss', 'atom') as $e) {
-            $m->connect('api/direct_messages/sent.'.$e,
-                        array('action' => 'api',
-                              'apiaction' => 'direct_messages',
-                              'method' => 'sent.'.$e));
-        }
+        $m->connect('api/direct_messages/sent.:format',
+                    array('action' => 'ApiDirectMessage',
+                          'format' => '(xml|json|rss|atom)',
+                          'sent' => true));
 
-        $m->connect('api/direct_messages/destroy/:argument',
-                    array('action' => 'api',
-                          'apiaction' => 'direct_messages'));
+        $m->connect('api/direct_messages/new.:format',
+                     array('action' => 'ApiDirectMessageNew',
+                           'format' => '(xml|json)'));
 
         // friendships
 
@@ -410,7 +398,7 @@ class Router
                           'apiaction' => 'friendships'),
                     array('method' => '(show|exists)(\.(xml|json))'));
 
-        // Social graph
+       // Social graph
 
         $m->connect('api/friends/ids/:id.:format',
                     array('action' => 'apiFriends',
index 708738832baa20e3880e53c06170d10190b30c3b..b2104fddd62311cf4df4528788186cf0f77352d1 100644 (file)
@@ -322,51 +322,6 @@ class TwitterapiAction extends Action
         return $entry;
     }
 
-    function twitter_rss_dmsg_array($message)
-    {
-
-        $entry = array();
-
-        $entry['title'] = sprintf('Message from %s to %s',
-            $message->getFrom()->nickname, $message->getTo()->nickname);
-
-        $entry['content'] = common_xml_safe_str(trim($message->content));
-        $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
-        $entry['published'] = common_date_iso8601($message->created);
-
-        $taguribase = common_config('integration', 'taguri');
-
-        $entry['id'] = "tag:$taguribase,:$entry[link]";
-        $entry['updated'] = $entry['published'];
-        $entry['author'] = $message->getFrom()->getBestName();
-
-        # RSS Item specific
-        $entry['description'] = $entry['content'];
-        $entry['pubDate'] = common_date_rfc2822($message->created);
-        $entry['guid'] = $entry['link'];
-
-        return $entry;
-    }
-
-    function twitter_dmsg_array($message)
-    {
-        $twitter_dm = array();
-
-        $from_profile = $message->getFrom();
-        $to_profile = $message->getTo();
-
-        $twitter_dm['id'] = $message->id;
-        $twitter_dm['sender_id'] = $message->from_profile;
-        $twitter_dm['text'] = trim($message->content);
-        $twitter_dm['recipient_id'] = $message->to_profile;
-        $twitter_dm['created_at'] = $this->date_twitter($message->created);
-        $twitter_dm['sender_screen_name'] = $from_profile->nickname;
-        $twitter_dm['recipient_screen_name'] = $to_profile->nickname;
-        $twitter_dm['sender'] = $this->twitter_user_array($from_profile, false);
-        $twitter_dm['recipient'] = $this->twitter_user_array($to_profile, false);
-
-        return $twitter_dm;
-    }
 
     function twitter_relationship_array($source, $target)
     {
@@ -531,40 +486,6 @@ class TwitterapiAction extends Action
         $this->end_document('json');
     }
 
-    function show_single_xml_dmsg($message)
-    {
-        $this->init_document('xml');
-        $dmsg = $this->twitter_dmsg_array($message);
-        $this->show_twitter_xml_dmsg($dmsg);
-        $this->end_document('xml');
-    }
-
-    function show_single_json_dmsg($message)
-    {
-        $this->init_document('json');
-        $dmsg = $this->twitter_dmsg_array($message);
-        $this->show_json_objects($dmsg);
-        $this->end_document('json');
-    }
-
-    function show_twitter_xml_dmsg($twitter_dm)
-    {
-        $this->elementStart('direct_message');
-        foreach($twitter_dm as $element => $value) {
-            switch ($element) {
-            case 'sender':
-            case 'recipient':
-                $this->show_twitter_xml_user($value, $element);
-                break;
-            case 'text':
-                $this->element($element, null, common_xml_safe_str($value));
-                break;
-            default:
-                $this->element($element, null, $value);
-            }
-        }
-        $this->elementEnd('direct_message');
-    }
 
     function show_xml_timeline($notice)
     {
@@ -685,6 +606,121 @@ class TwitterapiAction extends Action
         $this->end_twitter_rss();
     }
 
+
+    function showTwitterAtomEntry($entry)
+    {
+        $this->elementStart('entry');
+        $this->element('title', null, $entry['title']);
+        $this->element('content', array('type' => 'html'), $entry['content']);
+        $this->element('id', null, $entry['id']);
+        $this->element('published', null, $entry['published']);
+        $this->element('updated', null, $entry['updated']);
+        $this->element('link', array('type' => 'text/html',
+                                     'href' => $entry['link'],
+                                     'rel' => 'alternate'));
+        $this->element('link', array('type' => $entry['avatar-type'],
+                                     'href' => $entry['avatar'],
+                                     'rel' => 'image'));
+        $this->elementStart('author');
+
+        $this->element('name', null, $entry['author-name']);
+        $this->element('uri', null, $entry['author-uri']);
+
+        $this->elementEnd('author');
+        $this->elementEnd('entry');
+    }
+
+    function showXmlDirectMessage($dm)
+    {
+        $this->elementStart('direct_message');
+        foreach($dm as $element => $value) {
+            switch ($element) {
+            case 'sender':
+            case 'recipient':
+                $this->show_twitter_xml_user($value, $element);
+                break;
+            case 'text':
+                $this->element($element, null, common_xml_safe_str($value));
+                break;
+            default:
+                $this->element($element, null, $value);
+                break;
+            }
+        }
+        $this->elementEnd('direct_message');
+    }
+
+    function directMessageArray($message)
+    {
+        $dmsg = array();
+
+        $from_profile = $message->getFrom();
+        $to_profile = $message->getTo();
+
+        $dmsg['id'] = $message->id;
+        $dmsg['sender_id'] = $message->from_profile;
+        $dmsg['text'] = trim($message->content);
+        $dmsg['recipient_id'] = $message->to_profile;
+        $dmsg['created_at'] = $this->date_twitter($message->created);
+        $dmsg['sender_screen_name'] = $from_profile->nickname;
+        $dmsg['recipient_screen_name'] = $to_profile->nickname;
+        $dmsg['sender'] = $this->twitter_user_array($from_profile, false);
+        $dmsg['recipient'] = $this->twitter_user_array($to_profile, false);
+
+        return $dmsg;
+    }
+
+    function rssDirectMessageArray($message)
+    {
+        $entry = array();
+
+        $from = $message->getFrom();
+
+        $entry['title'] = sprintf('Message from %s to %s',
+            $from->nickname, $message->getTo()->nickname);
+
+        $entry['content'] = common_xml_safe_str($message->rendered);
+        $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
+        $entry['published'] = common_date_iso8601($message->created);
+
+        $taguribase = common_config('integration', 'taguri');
+
+        $entry['id'] = "tag:$taguribase:$entry[link]";
+        $entry['updated'] = $entry['published'];
+
+        $entry['author-name'] = $from->getBestName();
+        $entry['author-uri'] = $from->homepage;
+
+        $avatar = $from->getAvatar(AVATAR_STREAM_SIZE);
+
+        $entry['avatar']      = (!empty($avatar)) ? $avatar->url : Avatar::defaultImage(AVATAR_STREAM_SIZE);
+        $entry['avatar-type'] = (!empty($avatar)) ? $avatar->mediatype : 'image/png';
+
+        // RSS item specific
+
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($message->created);
+        $entry['guid'] = $entry['link'];
+
+        return $entry;
+    }
+
+    function showSingleXmlDirectMessage($message)
+    {
+        $this->init_document('xml');
+        $dmsg = $this->directMessageArray($message);
+        $this->showXmlDirectMessage($dmsg);
+        $this->end_document('xml');
+    }
+
+    function showSingleJsonDirectMessage($message)
+    {
+        $this->init_document('json');
+        $dmsg = $this->directMessageArray($message);
+        $this->show_json_objects($dmsg);
+        $this->end_document('json');
+    }
+
     function show_atom_groups($group, $title, $id, $link, $subtitle=null, $selfuri=null)
     {