From b2285dcb56540431142c268970122e823ce67f32 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 21 Nov 2008 23:31:45 -0500 Subject: [PATCH] EXPERIMENTAL PATCH #3 - ajax response for newnotice.php darcs-hash:20081122043145-7b5ce-0fc4b2ed06e29437c54e3c2f1a64b6d0fbeb9058.gz --- actions/newnotice.php | 198 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 185 insertions(+), 13 deletions(-) diff --git a/actions/newnotice.php b/actions/newnotice.php index c8a321b917..875e862504 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -10,11 +10,11 @@ * * 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 + * 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 . + * along with this program. If not, see . */ if (!defined('LACONICA')) { exit(1); } @@ -23,12 +23,23 @@ class NewnoticeAction extends Action { function handle($args) { parent::handle($args); - # XXX: Ajax! if (!common_logged_in()) { common_user_error(_('Not logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { - $this->save_new_notice(); + + # CSRF protection - token set in common_notice_form() + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->client_error(_('There was a problem with your session token. Try again, please.')); + return; + } + + if ($this->boolean('ajax')) { + $this->ajax_save_new_notice(); + } else { + $this->save_new_notice(); + } } else { $this->show_form(); } @@ -36,13 +47,6 @@ class NewnoticeAction extends Action { function save_new_notice() { - # CSRF protection - token set in common_notice_form() - $token = $this->trimmed('token'); - if (!$token || $token != common_session_token()) { - $this->client_error(_('There was a problem with your session token. Try again, please.')); - return; - } - $user = common_current_user(); assert($user); # XXX: maybe an error instead... $content = $this->trimmed('status_textarea'); @@ -53,7 +57,7 @@ class NewnoticeAction extends Action { // } else if (mb_strlen($content) > 140) { } else { $content = common_shorten_links($content); - + if (mb_strlen($content) > 140) { common_debug("Content = '$content'", __FILE__); common_debug("mb_strlen(\$content) = " . mb_strlen($content), __FILE__); @@ -96,6 +100,68 @@ class NewnoticeAction extends Action { common_redirect($url, 303); } + function ajax_save_new_notice() { + + $user = common_current_user(); + assert($user); # XXX: maybe an error instead... + $content = $this->trimmed('status_textarea'); + + if (!$content) { + $this->ajax_error_msg(_('No content!')); + return; + } else { + $content = common_shorten_links($content); + + if (mb_strlen($content) > 140) { + common_debug("Content = '$content'", __FILE__); + common_debug("mb_strlen(\$content) = " . mb_strlen($content), __FILE__); + $this->ajax_error_msg(_('That\'s too long. Max notice size is 140 chars.')); + return; + } + } + + $inter = new CommandInterpreter(); + + $cmd = $inter->handle_command($user, $content); + + if ($cmd) { + $cmd->execute(new WebChannel()); + return; + } + + $replyto = $this->trimmed('inreplyto'); + + $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto); + + if (is_string($notice)) { + $this->ajax_error_msg($notice); + return; + } + + common_broadcast_notice($notice); + + common_start_html('text/xml'); + common_element_start('head'); + common_element('title', null, _('Notice posted')); + common_element_end('head'); + common_element_start('body'); + $this->show_notice($notice); + common_element_end('body'); + common_element_end('html'); + + } + + function ajax_error_msg($msg) { + common_start_html('text/xml'); + common_element_start('head'); + common_element('title', null, _('Ajax Error')); + common_element_end('head'); + common_element_start('body'); + common_element('p', array('class' => 'error'), $msg); + common_element_end('body'); + common_element_end('html'); + } + function show_top($content=NULL) { common_notice_form(NULL, $content); } @@ -110,10 +176,116 @@ class NewnoticeAction extends Action { } } common_show_header(_('New notice'), NULL, $content, - array($this, 'show_top')); + array($this, 'show_top')); if ($msg) { common_element('p', 'error', $msg); } common_show_footer(); } + + function show_notice($notice) { + global $config; + $profile = $notice->getProfile(); + $user = common_current_user(); + + # XXX: RDFa + common_element_start('li', array('class' => 'notice_single', + 'id' => 'notice-' . $notice->id)); + if ($user) { + if ($user->hasFave($notice)) { + common_disfavor_form($notice); + } else { + common_favor_form($notice); + } + } + $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); + common_element_start('a', array('href' => $profile->profileurl)); + common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE), + 'class' => 'avatar stream', + 'width' => AVATAR_STREAM_SIZE, + 'height' => AVATAR_STREAM_SIZE, + 'alt' => + ($profile->fullname) ? $profile->fullname : + $profile->nickname)); + common_element_end('a'); + common_element('a', array('href' => $profile->profileurl, + 'class' => 'nickname'), + $profile->nickname); + # FIXME: URL, image, video, audio + common_element_start('p', array('class' => 'content')); + if ($notice->rendered) { + common_raw($notice->rendered); + } else { + # XXX: may be some uncooked notices in the DB, + # we cook them right now. This should probably disappear in future + # versions (>> 0.4.x) + common_raw(common_render_content($notice->content, $notice)); + } + common_element_end('p'); + $noticeurl = common_local_url('shownotice', array('notice' => $notice->id)); + # XXX: we need to figure this out better. Is this right? + if (strcmp($notice->uri, $noticeurl) != 0 && preg_match('/^http/', $notice->uri)) { + $noticeurl = $notice->uri; + } + common_element_start('p', 'time'); + common_element('a', array('class' => 'permalink', + 'href' => $noticeurl, + 'title' => common_exact_date($notice->created)), + common_date_string($notice->created)); + if ($notice->source) { + common_text(_(' from ')); + $this->source_link($notice->source); + } + if ($notice->reply_to) { + $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to)); + common_text(' ('); + common_element('a', array('class' => 'inreplyto', + 'href' => $replyurl), + _('in reply to...')); + common_text(')'); + } + common_element_start('a', + array('href' => common_local_url('newnotice', + array('replyto' => $profile->nickname)), + 'onclick' => 'return doreply("'.$profile->nickname.'", '.$notice->id.');', + 'title' => _('reply'), + 'class' => 'replybutton')); + common_raw('→'); + common_element_end('a'); + if ($user && $notice->profile_id == $user->id) { + $deleteurl = common_local_url('deletenotice', array('notice' => $notice->id)); + common_element_start('a', array('class' => 'deletenotice', + 'href' => $deleteurl, + 'title' => _('delete'))); + common_raw('×'); + common_element_end('a'); + } + common_element_end('p'); + common_element_end('li'); + } + + function source_link($source) { + $source_name = _($source); + switch ($source) { + case 'web': + case 'xmpp': + case 'mail': + case 'omb': + case 'api': + common_element('span', 'noticesource', $source_name); + break; + default: + $ns = Notice_source::staticGet($source); + if ($ns) { + common_element('a', array('href' => $ns->url), + $ns->name); + } else { + common_element('span', 'noticesource', $source_name); + } + break; + } + return; + } + + }