Send a private group message with a d command
This commit is contained in:
parent
d7b2b141be
commit
842bc5708e
@ -118,4 +118,98 @@ class Group_message extends Memcached_DataObject
|
|||||||
{
|
{
|
||||||
return array('id' => 'K', 'uri' => 'U');
|
return array('id' => 'K', 'uri' => 'U');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static function send($user, $group, $text)
|
||||||
|
{
|
||||||
|
if (!$user->hasRight(Right::NEWMESSAGE)) {
|
||||||
|
// XXX: maybe break this out into a separate right
|
||||||
|
throw new Exception(sprintf(_('User %s not allowed to send private messages.'),
|
||||||
|
$user->nickname));
|
||||||
|
}
|
||||||
|
|
||||||
|
$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));
|
||||||
|
}
|
||||||
|
|
||||||
|
$text = $user->shortenLinks($text);
|
||||||
|
|
||||||
|
// We use the same limits as for 'regular' private messages.
|
||||||
|
|
||||||
|
if (Message::contentTooLong($text)) {
|
||||||
|
throw new Exception(sprintf(_m('That\'s too long. Maximum message size is %d character.',
|
||||||
|
'That\'s too long. Maximum message size is %d characters.',
|
||||||
|
Message::maxContent()),
|
||||||
|
Message::maxContent()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid! Let's do this thing!
|
||||||
|
|
||||||
|
$gm = new Group_message();
|
||||||
|
|
||||||
|
$gm->id = UUID::gen();
|
||||||
|
$gm->uri = common_local_url('showgroupmessage', array('id' => $gm->id));
|
||||||
|
$gm->from_profile = $user->id;
|
||||||
|
$gm->to_group = $group->id;
|
||||||
|
$gm->content = $text; // XXX: is this cool?!
|
||||||
|
$gm->rendered = common_render_text($text);
|
||||||
|
$gm->url = $gm->uri;
|
||||||
|
$gm->created = common_sql_now();
|
||||||
|
|
||||||
|
// This throws a conniption if there's a problem
|
||||||
|
|
||||||
|
$gm->insert();
|
||||||
|
|
||||||
|
$gm->distribute();
|
||||||
|
|
||||||
|
return $gm;
|
||||||
|
}
|
||||||
|
|
||||||
|
function distribute()
|
||||||
|
{
|
||||||
|
$group = User_group::staticGet('id', $this->to_group);
|
||||||
|
|
||||||
|
$member = $group->getMembers();
|
||||||
|
|
||||||
|
while ($member->fetch()) {
|
||||||
|
Group_message_profile::send($this, $member);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,4 +108,79 @@ class Group_message_profile extends Memcached_DataObject
|
|||||||
{
|
{
|
||||||
return array('to_profile' => 'K', 'group_message_id' => 'K');
|
return array('to_profile' => 'K', 'group_message_id' => 'K');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* No sequence keys in this table.
|
||||||
|
*/
|
||||||
|
function sequenceKey()
|
||||||
|
{
|
||||||
|
return array(false, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
function send($gm, $profile)
|
||||||
|
{
|
||||||
|
$gmp = new Group_message_profile();
|
||||||
|
|
||||||
|
$gmp->group_message_id = $gm->id;
|
||||||
|
$gmp->to_profile = $profile->id;
|
||||||
|
$gmp->created = common_sql_now();
|
||||||
|
|
||||||
|
$gmp->insert();
|
||||||
|
|
||||||
|
$gmp->notify();
|
||||||
|
|
||||||
|
return $gmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
function notify()
|
||||||
|
{
|
||||||
|
// XXX: add more here
|
||||||
|
$this->notifyByMail();
|
||||||
|
}
|
||||||
|
|
||||||
|
function notifyByMail()
|
||||||
|
{
|
||||||
|
$to = User::staticGet('id', $this->to_profile);
|
||||||
|
|
||||||
|
if (empty($to) || is_null($to->email) || !$to->emailnotifymsg) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$gm = Group_message::staticGet('id', $this->group_message_id);
|
||||||
|
|
||||||
|
$from_profile = Profile::staticGet('id', $gm->from_profile);
|
||||||
|
|
||||||
|
common_switch_locale($to->language);
|
||||||
|
|
||||||
|
// TRANS: Subject for direct-message notification email.
|
||||||
|
// TRANS: %s is the sending user's nickname.
|
||||||
|
$subject = sprintf(_('New private message from %s'), $from->nickname);
|
||||||
|
|
||||||
|
$from_profile = $from->getProfile();
|
||||||
|
|
||||||
|
// TRANS: Body for direct-message notification email.
|
||||||
|
// TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname,
|
||||||
|
// TRANS: %3$s is the message content, %4$s a URL to the message,
|
||||||
|
// TRANS: %5$s is the StatusNet sitename.
|
||||||
|
$body = sprintf(_("%1\$s (%2\$s) sent you a private message:\n\n".
|
||||||
|
"------------------------------------------------------\n".
|
||||||
|
"%3\$s\n".
|
||||||
|
"------------------------------------------------------\n\n".
|
||||||
|
"You can reply to their message here:\n\n".
|
||||||
|
"%4\$s\n\n".
|
||||||
|
"Don't reply to this email; it won't get to them.\n\n".
|
||||||
|
"With kind regards,\n".
|
||||||
|
"%5\$s\n"),
|
||||||
|
$from_profile->getBestName(),
|
||||||
|
$from->nickname,
|
||||||
|
$this->content,
|
||||||
|
common_local_url('newmessage', array('to' => $from->id)),
|
||||||
|
common_config('site', 'name'));
|
||||||
|
|
||||||
|
$headers = _mail_prepare_headers('message', $to->nickname, $from->nickname);
|
||||||
|
|
||||||
|
common_switch_locale();
|
||||||
|
|
||||||
|
return mail_to_user($to, $subject, $body, $headers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,6 +144,7 @@ class PrivateGroupPlugin extends Plugin
|
|||||||
switch ($cls)
|
switch ($cls)
|
||||||
{
|
{
|
||||||
case 'GroupinboxAction':
|
case 'GroupinboxAction':
|
||||||
|
case 'ShowgroupmessageAction':
|
||||||
include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
|
include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
|
||||||
return false;
|
return false;
|
||||||
case 'Group_privacy_settings':
|
case 'Group_privacy_settings':
|
||||||
@ -151,6 +152,9 @@ class PrivateGroupPlugin extends Plugin
|
|||||||
case 'Group_message_profile':
|
case 'Group_message_profile':
|
||||||
include_once $dir . '/'.$cls.'.php';
|
include_once $dir . '/'.$cls.'.php';
|
||||||
return false;
|
return false;
|
||||||
|
case 'GroupMessageCommand':
|
||||||
|
include_once $dir . '/'.strtolower($cls).'.php';
|
||||||
|
return false;
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -170,6 +174,10 @@ class PrivateGroupPlugin extends Plugin
|
|||||||
array('action' => 'groupinbox'),
|
array('action' => 'groupinbox'),
|
||||||
array('nickname' => Nickname::DISPLAY_FMT));
|
array('nickname' => Nickname::DISPLAY_FMT));
|
||||||
|
|
||||||
|
$m->connect('group/message/:id',
|
||||||
|
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}'));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,7 +297,46 @@ class PrivateGroupPlugin extends Plugin
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overload 'd' command to send private messages to groups.
|
||||||
|
*
|
||||||
|
* 'd !group word word word' will send the private message
|
||||||
|
* 'word word word' to the group 'group'.
|
||||||
|
*
|
||||||
|
* @param string $cmd Command being run
|
||||||
|
* @param string $arg Rest of the message (including address)
|
||||||
|
* @param User $user User sending the message
|
||||||
|
* @param Command &$result The resulting command object to be run.
|
||||||
|
*
|
||||||
|
* @return boolean hook value
|
||||||
|
*/
|
||||||
|
function onStartIntepretCommand($cmd, $arg, $user, &$result)
|
||||||
|
{
|
||||||
|
if ($cmd == 'd' || $cmd == 'dm') {
|
||||||
|
|
||||||
|
$this->debug('Got a d command');
|
||||||
|
|
||||||
|
// Break off the first word as the address
|
||||||
|
|
||||||
|
$pieces = explode(' ', $arg, 2);
|
||||||
|
|
||||||
|
if (count($pieces) == 1) {
|
||||||
|
$pieces[] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
list($addr, $msg) = $pieces;
|
||||||
|
|
||||||
|
if (!empty($addr) && $addr[0] == '!') {
|
||||||
|
$result = new GroupMessageCommand($user, substr($addr, 1), $msg);
|
||||||
|
Event::handle('EndInterpretCommand', array($cmd, $arg, $user, $result));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
function onPluginVersion(&$versions)
|
function onPluginVersion(&$versions)
|
||||||
{
|
{
|
||||||
$versions[] = array('name' => 'PrivateGroup',
|
$versions[] = array('name' => 'PrivateGroup',
|
||||||
|
85
plugins/PrivateGroup/groupmessagecommand.php
Normal file
85
plugins/PrivateGroup/groupmessagecommand.php
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* StatusNet - the distributed open-source microblogging tool
|
||||||
|
* Copyright (C) 2010, StatusNet, Inc.
|
||||||
|
*
|
||||||
|
* Command object for messages to groups
|
||||||
|
*
|
||||||
|
* 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 Command
|
||||||
|
* @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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Command object for messages to groups
|
||||||
|
*
|
||||||
|
* @category General
|
||||||
|
* @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 GroupMessageCommand extends Command
|
||||||
|
{
|
||||||
|
/** User sending the message. */
|
||||||
|
var $user;
|
||||||
|
/** Nickname of the group they're sending to. */
|
||||||
|
var $nickname;
|
||||||
|
/** Text of the message. */
|
||||||
|
var $text;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param User $user User sending the message
|
||||||
|
* @param string $nickname Nickname of the group
|
||||||
|
* @param string $text Text of message
|
||||||
|
*/
|
||||||
|
|
||||||
|
function __construct($user, $nickname, $text)
|
||||||
|
{
|
||||||
|
$this->user = $user;
|
||||||
|
$this->nickname = $nickname;
|
||||||
|
$this->text = $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handle($channel)
|
||||||
|
{
|
||||||
|
// Throws a command exception if group not found
|
||||||
|
$group = $this->getGroup($this->nickname);
|
||||||
|
|
||||||
|
$gm = Group_message::send($this->user, $group, $this->text);
|
||||||
|
|
||||||
|
$channel->output($this->user,
|
||||||
|
sprintf(_('Direct message to group %s sent.'),
|
||||||
|
$group->nickname));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user