-if (!defined('LACONICA')) { exit(1); }
-
-class NewmessageAction extends Action {
-
- function handle($args) {
- parent::handle($args);
-
- if (!common_logged_in()) {
- $this->client_error(_('Not logged in.'), 403);
- } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
- $this->save_new_message();
- } else {
- $this->show_form();
- }
- }
-
- function save_new_message() {
-
- $user = common_current_user();
- assert($user); # XXX: maybe an error instead...
-
- $content = $this->trimmed('content');
- $to = $this->trimmed('to');
-
- if (!$content) {
- $this->show_form(_('No content!'));
- return;
- } else if (mb_strlen($content) > 140) {
- common_debug("Content = '$content'", __FILE__);
- common_debug("mb_strlen(\$content) = " . mb_strlen($content), __FILE__);
- $this->show_form(_('That\'s too long. Max message size is 140 chars.'));
- return;
- }
-
- $other = User::staticGet('id', $to);
-
- if (!$other) {
- $this->show_form(_('No recipient specified.'));
- return;
- } else if (!$user->mutuallySubscribed($other)) {
- $this->client_error(_('You can\'t send a message to this user.'), 404);
- return;
- }
-
- $message = Message::saveNew($user->id, $other->id, $content, 'web');
-
- if (is_string($message)) {
- $this->show_form($message);
- return;
- }
-
- $this->notify($user, $to, $message);
-
- $url = common_local_url('showmessage',
- array('message' => $message->id));
-
- common_redirect($url, 303);
- }
-
- function show_top($params) {
-
- list($content, $user, $to) = $params;
-
- assert(!is_null($user));
-
- common_element_start('form', array('id' => 'message_form',
- 'method' => 'post',
- 'action' => $this->self_url()));
-
- common_element_start('p');
-
- $mutual_users = $user->mutuallySubscribedUsers();
-
- $mutual = array();
-
- while ($mutual_users->fetch()) {
- $mutual[$mutual_users->id] = $mutual_users->nickname;
- }
-
- $mutual_users->free();
- unset($mutual_users);
-
- common_dropdown('to', _('To'), $mutual,
- _('User you want to send a message to'), FALSE,
- $to->id);
-
- common_element('textarea', array('id' => 'content',
- 'cols' => 60,
- 'rows' => 3,
- 'name' => 'content'),
- ($content) ? $content : '');
-
- common_element('input', array('id' => 'message_send',
- 'name' => 'message_send',
- 'type' => 'submit',
- 'value' => _('Send')));
-
- common_element_end('p');
- common_element_end('form');
- }
-
- function show_form($msg=NULL) {
-
- $content = $this->trimmed('content');
- $user = common_current_user();
-
- $to = common_canonical_nickname($this->trimmed('to'));
-
- $other = User::staticGet('id', $to);
-
- if (!$other) {
- $this->client_error(_('No such user'), 404);
- return;
- }
-
- if (!$user->mutuallySubscribed($other)) {
- $this->client_error(_('You can\'t send a message to this user.'), 404);
- return;
- }
-
- common_show_header(_('New message'), NULL,
- array($content, $user, $to),
- array($this, 'show_top'));
-
- if ($msg) {
- common_element('p', 'error', $msg);
- }
-
- common_show_footer();
- }
-
- function notify($from, $to, $message) {
- mail_notify_message($message, $from, $to);
- # XXX: Jabber, SMS notifications... probably queued
- }
+class NewmessageAction extends Action
+{
+
+ /**
+ * Error message, if any
+ */
+
+ var $msg = null;
+
+ var $content = null;
+ var $to = null;
+ var $other = null;
+
+ /**
+ * Title of the page
+ *
+ * Note that this usually doesn't get called unless something went wrong
+ *
+ * @return string page title
+ */
+
+ function title()
+ {
+ return _('New message');
+ }
+
+ /**
+ * Handle input, produce output
+ *
+ * @param array $args $_REQUEST contents
+ *
+ * @return void
+ */
+
+ function handle($args)
+ {
+ parent::handle($args);
+
+ if (!common_logged_in()) {
+ $this->clientError(_('Not logged in.'), 403);
+ } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+ $this->saveNewMessage();
+ } else {
+ $this->showForm();
+ }
+ }
+
+ function prepare($args)
+ {
+ parent::prepare($args);
+
+ $user = common_current_user();
+
+ if (!$user) {
+ $this->clientError(_('Only logged-in users can send direct messages.'), 403);
+ return false;
+ }
+
+ $this->content = $this->trimmed('content');
+ $this->to = $this->trimmed('to');
+
+ if ($this->to) {
+
+ $this->other = User::staticGet('id', $this->to);
+
+ if (!$this->other) {
+ $this->clientError(_('No such user'), 404);
+ return false;
+ }
+
+ if (!$user->mutuallySubscribed($this->other)) {
+ $this->clientError(_('You can\'t send a message to this user.'), 404);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function saveNewMessage()
+ {
+ // CSRF protection
+
+ $token = $this->trimmed('token');
+ if (!$token || $token != common_session_token()) {
+ $this->showForm(_('There was a problem with your session token. ' .
+ 'Try again, please.'));
+ return;
+ }
+
+ $user = common_current_user();
+ assert($user); // XXX: maybe an error instead...
+
+ if (!$this->content) {
+ $this->showForm(_('No content!'));
+ return;
+ } else {
+ $content_shortened = common_shorten_links($this->content);
+
+ if (mb_strlen($content_shortened) > 140) {
+ $this->showForm(_('That\'s too long. ' .
+ 'Max message size is 140 chars.'));
+ return;
+ }
+ }
+
+ if (!$this->other) {
+ $this->showForm(_('No recipient specified.'));
+ return;
+ } else if (!$user->mutuallySubscribed($this->other)) {
+ $this->clientError(_('You can\'t send a message to this user.'), 404);
+ return;
+ } else if ($user->id == $this->other->id) {
+ $this->clientError(_('Don\'t send a message to yourself; ' .
+ 'just say it to yourself quietly instead.'), 403);
+ return;
+ }
+
+ $message = Message::saveNew($user->id, $this->other->id, $this->content, 'web');
+
+ if (is_string($message)) {
+ $this->showForm($message);
+ return;
+ }
+
+ $this->notify($user, $this->other, $message);
+
+ if ($this->boolean('ajax')) {
+ $this->startHTML('text/xml;charset=utf-8');
+ $this->elementStart('head');
+ $this->element('title', null, _('Message sent'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+ $this->element('p', array('id' => 'command_result'),
+ sprintf(_('Direct message to %s sent'),
+ $this->other->nickname));
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ } else {
+ $url = common_local_url('outbox',
+ array('nickname' => $user->nickname));
+ common_redirect($url, 303);
+ }
+ }
+
+ /**
+ * Show an Ajax-y error message
+ *
+ * Goes back to the browser, where it's shown in a popup.
+ *
+ * @param string $msg Message to show
+ *
+ * @return void
+ */
+
+ function ajaxErrorMsg($msg)
+ {
+ $this->startHTML('text/xml;charset=utf-8', true);
+ $this->elementStart('head');
+ $this->element('title', null, _('Ajax Error'));
+ $this->elementEnd('head');
+ $this->elementStart('body');
+ $this->element('p', array('id' => 'error'), $msg);
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ }
+
+ function showForm($msg = null)
+ {
+ if ($msg && $this->boolean('ajax')) {
+ $this->ajaxErrorMsg($msg);
+ return;
+ }
+
+ $this->msg = $msg;
+ $this->showPage();
+ }
+
+ function showPageNotice()
+ {
+ if ($this->msg) {
+ $this->element('p', 'error', $this->msg);
+ }
+ }
+
+ function notify($from, $to, $message)
+ {
+ mail_notify_message($message, $from, $to);
+ // XXX: Jabber, SMS notifications... probably queued
+ }
+
+ // Do nothing (override)
+
+ function showNoticeForm()
+ {
+ $message_form = new MessageForm($this, $this->other, $this->content);
+ $message_form->show();
+ }