$user->nickname));
}
- $gps = Group_privacy_settings::staticGet('group_id', $group->id);
+ Group_privacy_settings::ensurePost($user, $group);
- if (empty($gps)) {
- // make a fake one with defaults
- $gps = new Group_privacy_settings();
- $gps->allow_privacy = Group_privacy_settings::SOMETIMES;
- $gps->allow_sender = Group_privacy_settings::MEMBER;
- }
-
- if ($gps->allow_privacy == Group_privacy_settings::NEVER) {
- throw new Exception(sprintf(_('Group %s does not allow private messages.'),
- $group->nickname));
- }
-
- switch ($gps->allow_sender) {
- case Group_privacy_settings::EVERYONE:
- $profile = $user->getProfile();
- if (Group_block::isBlocked($group, $profile)) {
- throw new Exception(sprintf(_('User %s is blocked from group %s.'),
- $user->nickname,
- $group->nickname));
- }
- break;
- case Group_privacy_settings::MEMBER:
- if (!$user->isMember($group)) {
- throw new Exception(sprintf(_('User %s is not a member of group %s.'),
- $user->nickname,
- $group->nickname));
- }
- break;
- case Group_privacy_settings::ADMIN:
- if (!$user->isAdmin($group)) {
- throw new Exception(sprintf(_('User %s is not an administrator of group %s.'),
- $user->nickname,
- $group->nickname));
- }
- break;
- default:
- throw new Exception(sprintf(_('Unknown privacy settings for group %s.'),
- $group->nickname));
- }
-
$text = $user->shortenLinks($text);
// We use the same limits as for 'regular' private messages.
return $gm;
}
+
}
{
return array(false, false, false);
}
+
+ function ensurePost($user, $group)
+ {
+ $gps = Group_privacy_settings::staticGet('group_id', $group->id);
+
+ if (empty($gps)) {
+ // make a fake one with defaults
+ $gps = new Group_privacy_settings();
+ $gps->allow_privacy = Group_privacy_settings::SOMETIMES;
+ $gps->allow_sender = Group_privacy_settings::MEMBER;
+ }
+
+ if ($gps->allow_privacy == Group_privacy_settings::NEVER) {
+ throw new Exception(sprintf(_('Group %s does not allow private messages.'),
+ $group->nickname));
+ }
+
+ switch ($gps->allow_sender) {
+ case Group_privacy_settings::EVERYONE:
+ $profile = $user->getProfile();
+ if (Group_block::isBlocked($group, $profile)) {
+ throw new Exception(sprintf(_('User %s is blocked from group %s.'),
+ $user->nickname,
+ $group->nickname));
+ }
+ break;
+ case Group_privacy_settings::MEMBER:
+ if (!$user->isMember($group)) {
+ throw new Exception(sprintf(_('User %s is not a member of group %s.'),
+ $user->nickname,
+ $group->nickname));
+ }
+ break;
+ case Group_privacy_settings::ADMIN:
+ if (!$user->isAdmin($group)) {
+ throw new Exception(sprintf(_('User %s is not an administrator of group %s.'),
+ $user->nickname,
+ $group->nickname));
+ }
+ break;
+ default:
+ throw new Exception(sprintf(_('Unknown privacy settings for group %s.'),
+ $group->nickname));
+ }
+
+ return true;
+ }
}
{
case 'GroupinboxAction':
case 'ShowgroupmessageAction':
+ case 'NewgroupmessageAction':
include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
return false;
case 'Group_privacy_settings':
case 'GroupMessageCommand':
case 'GroupMessageList':
case 'GroupMessageListItem':
+ case 'GroupMessageForm':
include_once $dir . '/'.strtolower($cls).'.php';
return false;
default:
array('action' => 'showgroupmessage'),
array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'));
+ $m->connect('group/:nickname/message/new',
+ array('action' => 'newgroupmessage'),
+ array('nickname' => Nickname::DISPLAY_FMT));
+
return true;
}
$nav->show();
}
+ function showNoticeForm()
+ {
+ $form = new GroupMessageForm($this, $this->group);
+ $form->show();
+ }
+
function showContent()
{
$gml = new GroupMessageList($this, $this->gm);
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2011, StatusNet, Inc.
+ *
+ * Form for posting a group message
+ *
+ * PHP version 5
+ *
+ * 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 PrivateGroup
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2011 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ // This check helps protect against security problems;
+ // your code file can't be executed directly from the web.
+ exit(1);
+}
+
+/**
+ * Form for posting a group message
+ *
+ * @category PrivateGroup
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2011 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class GroupMessageForm extends Form
+{
+ var $group;
+ var $content;
+
+ /**
+ * Constructor
+ *
+ * @param HTMLOutputter $out Output context
+ * @param User_group $group Group to post to
+ *
+ * @todo add a drop-down list to post to any group
+ */
+
+ function __construct($out, $group, $content=null)
+ {
+ parent::__construct($out);
+
+ $this->group = $group;
+ $this->content = $content;
+ }
+
+ /**
+ * Action for the form
+ */
+ function action()
+ {
+ return common_local_url('newgroupmessage',
+ array('nickname' => $this->group->nickname));
+ }
+
+ /**
+ * Legend for the form
+ *
+ * @param
+ *
+ * @return
+ */
+ function formLegend()
+ {
+ $this->out->element('legend',
+ null,
+ sprintf(_('Message to %s'), $this->group->nickname));
+ }
+
+ /**
+ * id for the form
+ *
+ * @param
+ *
+ * @return
+ */
+
+ function id()
+ {
+ return 'form_notice-group-message';
+ }
+
+ /**
+ * class for the form
+ *
+ * @param
+ *
+ * @return
+ */
+
+ function formClass()
+ {
+ return 'form_notice';
+ }
+
+ /**
+ * Entry data
+ *
+ * @param
+ *
+ * @return
+ */
+
+ function formData()
+ {
+ $this->out->element('label', array('for' => 'notice_data-text',
+ 'id' => 'notice_data-text-label'),
+ sprintf(_('Direct message to %s'), $this->group->nickname));
+
+ $this->out->element('textarea', array('id' => 'notice_data-text',
+ 'cols' => 35,
+ 'rows' => 4,
+ 'name' => 'content'),
+ ($this->content) ? $this->content : '');
+
+ $contentLimit = Message::maxContent();
+
+ if ($contentLimit > 0) {
+ $this->out->elementStart('dl', 'form_note');
+ $this->out->element('dt', null, _('Available characters'));
+ $this->out->element('dd', array('id' => 'notice_text-count'),
+ $contentLimit);
+ $this->out->elementEnd('dl');
+ }
+ }
+
+ /**
+ * Legend for the form
+ *
+ * @param
+ *
+ * @return
+ */
+
+ function formActions()
+ {
+ $this->out->element('input', array('id' => 'notice_action-submit',
+ 'class' => 'submit',
+ 'name' => 'message_send',
+ 'type' => 'submit',
+ 'value' => _m('Send button for sending notice', 'Send')));
+ }
+}
--- /dev/null
+<?php
+/**
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, StatusNet, Inc.
+ *
+ * Action for adding a new group message
+ *
+ * PHP version 5
+ *
+ * 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 Cache
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+if (!defined('STATUSNET')) {
+ // This check helps protect against security problems;
+ // your code file can't be executed directly from the web.
+ exit(1);
+}
+
+/**
+ * Action for adding a new group message
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Evan Prodromou <evan@status.net>
+ * @copyright 2010 StatusNet, Inc.
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
+ * @link http://status.net/
+ */
+
+class NewgroupmessageAction extends Action
+{
+ var $group;
+ var $user;
+ var $text;
+
+ /**
+ * For initializing members of the class.
+ *
+ * @param array $argarray misc. arguments
+ *
+ * @return boolean true
+ */
+
+ function prepare($argarray)
+ {
+ parent::prepare($argarray);
+
+ $this->user = common_current_user();
+
+ if (empty($this->user)) {
+ throw new ClientException(_('Must be logged in.'), 403);
+ }
+
+ if (!$this->user->hasRight(Right::NEWMESSAGE)) {
+ throw new Exception(sprintf(_('User %s not allowed to send private messages.'),
+ $this->user->nickname));
+ }
+
+ $nicknameArg = $this->trimmed('nickname');
+
+ $nickname = common_canonical_nickname($nicknameArg);
+
+ if ($nickname != $nicknameArg) {
+ $url = common_local_url('newgroupmessage', array('nickname' => $nickname));
+ common_redirect($url, 301);
+ return false;
+ }
+
+ $localGroup = Local_group::staticGet('nickname', $nickname);
+
+ if (empty($localGroup)) {
+ throw new ClientException(_('No such group'), 404);
+ }
+
+ $this->group = User_group::staticGet('id', $localGroup->group_id);
+
+ if (empty($this->group)) {
+ throw new ClientException(_('No such group'), 404);
+ }
+
+ // This throws an exception on error
+
+ Group_privacy_settings::ensurePost($this->user, $this->group);
+
+ // If we're posted to, check session token and get text
+
+ if ($this->isPost()) {
+ $this->checkSessionToken();
+ $this->text = $this->trimmed('content');
+ }
+
+ return true;
+ }
+
+ /**
+ * Handler method
+ *
+ * @param array $argarray is ignored since it's now passed in in prepare()
+ *
+ * @return void
+ */
+
+ function handle($argarray=null)
+ {
+ if ($this->isPost()) {
+ $this->sendNewMessage();
+ } else {
+ $this->showPage();
+ }
+ }
+
+ function sendNewMessage()
+ {
+ $gm = Group_message::send($this->user, $this->group, $this->text);
+
+ 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->group->nickname));
+ $this->elementEnd('body');
+ $this->elementEnd('html');
+ } else {
+ common_redirect($gm->url, 303);
+ }
+ }
+
+ function title()
+ {
+ return sprintf(_('New message to group %s'), $this->group->nickname);
+ }
+}