* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
-
abstract class ImPlugin extends Plugin
{
//name of this IM transport
//list of screennames that should get all public notices
public $public = array();
+ protected $requires_cli = true;
+
/**
* normalize a screenname for comparison
*
*
* @return boolean success value
*/
- function sendNotice($screenname, $notice)
+ function sendNotice($screenname, Notice $notice)
{
return $this->sendMessage($screenname, $this->formatNotice($notice));
}
*/
abstract function daemonScreenname();
- /**
- * get the microid uri of a given screenname
- *
- * @param string $screenname screenname
- *
- * @return string microid uri
- */
- function microiduri($screenname)
- {
- return $this->transport . ':' . $screenname;
- }
//========================UTILITY FUNCTIONS USEFUL TO IMPLEMENTATIONS - MISC ========================\
/**
{
$user_im_prefs = $this->getUserImPrefsFromScreenname($screenname);
if($user_im_prefs){
- $user = User::staticGet('id', $user_im_prefs->user_id);
+ $user = User::getKV('id', $user_im_prefs->user_id);
$user_im_prefs->free();
return $user;
}else{
}
/**
- * send a confirmation code to a user
+ * Send a confirmation code to a user
*
* @param string $screenname screenname sending to
* @param string $code the confirmation code
- * @param User $user user sending to
+ * @param Profile $target For whom the code is valid for
*
* @return boolean success value
*/
- function sendConfirmationCode($screenname, $code, $user)
+ function sendConfirmationCode($screenname, $code, Profile $target)
{
- $body = sprintf(_('User "%s" on %s has said that your %s screenname belongs to them. ' .
- 'If that\'s true, you can confirm by clicking on this URL: ' .
- '%s' .
+ // TRANS: Body text for confirmation code e-mail.
+ // TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename,
+ // TRANS: %3$s is the display name of an IM plugin.
+ $body = sprintf(_('User "%1$s" on %2$s has said that your %3$s screenname belongs to them. ' .
+ 'If that is true, you can confirm by clicking on this URL: ' .
+ '%4$s' .
' . (If you cannot click it, copy-and-paste it into the ' .
- 'address bar of your browser). If that user isn\'t you, ' .
- 'or if you didn\'t request this confirmation, just ignore this message.'),
- $user->nickname, common_config('site', 'name'), $this->getDisplayName(), common_local_url('confirmaddress', array('code' => $code)));
+ 'address bar of your browser). If that user is not you, ' .
+ 'or if you did not request this confirmation, just ignore this message.'),
+ $target->getNickname(), common_config('site', 'name'), $this->getDisplayName(), common_local_url('confirmaddress', null, array('code' => $code)));
return $this->sendMessage($screenname, $body);
}
function broadcastNotice($notice)
{
-
$ni = $notice->whoGets();
foreach ($ni as $user_id => $reason) {
- $user = User::staticGet($user_id);
+ $user = User::getKV($user_id);
if (empty($user)) {
// either not a local user, or just not found
continue;
case NOTICE_INBOX_SOURCE_GROUP:
break;
default:
- throw new Exception(sprintf(_("Unknown inbox source %d."), $reason));
+ // TRANS: Exception thrown when trying to deliver a notice to an unknown inbox.
+ // TRANS: %d is the unknown inbox ID (number).
+ throw new Exception(sprintf(_('Unknown inbox source %d.'), $reason));
}
common_log(LOG_INFO,
* @return string plain-text version of the notice, with user nickname prefixed
*/
- function formatNotice($notice)
+ protected function formatNotice(Notice $notice)
{
$profile = $notice->getProfile();
- return $profile->nickname . ': ' . $notice->content . ' [' . $notice->id . ']';
+ $nicknames = $profile->getNickname();
+
+ try {
+ $parent = $notice->getParent();
+ $orig_profile = $parent->getProfile();
+ $nicknames = sprintf('%1$s => %2$s', $profile->getNickname(), $orig_profile->getNickname());
+ } catch (NoParentNoticeException $e) {
+ // Not a reply, no parent notice stored
+ } catch (NoResultException $e) {
+ // Parent notice was probably deleted
+ }
+
+ return sprintf('%1$s: %2$s [%3$u]', $nicknames, $notice->content, $notice->id);
}
//========================UTILITY FUNCTIONS USEFUL TO IMPLEMENTATIONS - RECEIVING ========================\
$chan = new IMChannel($this);
$cmd->execute($chan);
return true;
- } else {
- return false;
}
+ return false;
}
/**
$body = trim(strip_tags($body));
$content_shortened = common_shorten_links($body);
if (Notice::contentTooLong($content_shortened)) {
- $this->sendFromSite($screenname, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'),
- Notice::maxContent(),
- mb_strlen($content_shortened)));
+ $this->sendFromSite($screenname,
+ // TRANS: Message given when a status is too long. %1$s is the maximum number of characters,
+ // TRANS: %2$s is the number of characters sent (used for plural).
+ sprintf(_m('Message too long - maximum is %1$d character, you sent %2$d.',
+ 'Message too long - maximum is %1$d characters, you sent %2$d.',
+ Notice::maxContent()),
+ Notice::maxContent(),
+ mb_strlen($content_shortened)));
return;
}
*/
function onEndInitializeQueueManager($manager)
{
- $manager->connect($this->transport . '-in', new ImReceiverQueueHandler($this), 'im');
- $manager->connect($this->transport, new ImQueueHandler($this));
- $manager->connect($this->transport . '-out', new ImSenderQueueHandler($this), 'im');
+ // If we don't require CLI mode, or if we do and GNUSOCIAL_CLI _is_ set, then connect the transports
+ // This check is made mostly because some IM plugins can't deliver to transports unless they
+ // have continously running daemons (such as XMPP) and we can't have that over HTTP requests.
+ if (!$this->requires_cli || defined('GNUSOCIAL_CLI')) {
+ $manager->connect($this->transport . '-in', new ImReceiverQueueHandler($this), 'im');
+ $manager->connect($this->transport, new ImQueueHandler($this));
+ $manager->connect($this->transport . '-out', new ImSenderQueueHandler($this), 'im');
+ }
return true;
}
function onStartEnqueueNotice($notice, &$transports)
{
- $profile = Profile::staticGet($notice->profile_id);
+ $profile = Profile::getKV($notice->profile_id);
if (!$profile) {
common_log(LOG_WARNING, 'Refusing to broadcast notice with ' .
return true;
}
- function onEndShowHeadElements($action)
+ function onEndShowHeadElements(Action $action)
{
- $aname = $action->trimmed('action');
-
- if ($aname == 'shownotice') {
+ if ($action instanceof ShownoticeAction) {
$user_im_prefs = new User_im_prefs();
- $user_im_prefs->user_id = $action->profile->id;
+ $user_im_prefs->user_id = $action->notice->getProfile()->getID();
$user_im_prefs->transport = $this->transport;
- if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->notice->uri) {
- $id = new Microid($this->microiduri($user_im_prefs->screenname),
- $action->notice->uri);
- $action->element('meta', array('name' => 'microid',
- 'content' => $id->toString()));
- }
-
- } else if ($aname == 'showstream') {
+ } elseif ($action instanceof ShowstreamAction) {
$user_im_prefs = new User_im_prefs();
- $user_im_prefs->user_id = $action->user->id;
+ $user_im_prefs->user_id = $action->getTarget()->getID();
$user_im_prefs->transport = $this->transport;
- if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->profile->profileurl) {
- $id = new Microid($this->microiduri($user_im_prefs->screenname),
- $action->selfUrl());
- $action->element('meta', array('name' => 'microid',
- 'content' => $id->toString()));
- }
}
}
'daemonScreenname' => $this->daemonScreenname());
}
- function onSendImConfirmationCode($transport, $screenname, $code, $user)
+ function onSendImConfirmationCode($transport, $screenname, $code, Profile $target)
{
if($transport == $this->transport)
{
- $this->sendConfirmationCode($screenname, $code, $user);
+ $this->sendConfirmationCode($screenname, $code, $target);
return false;
}
}
return true;
}
+ function onHaveImPlugin(&$haveImPlugin) {
+ $haveImPlugin = true; // set flag true (we're loaded, after all!)
+ return false; // stop looking
+ }
+
function initialize()
{
if( ! common_config('queue', 'enabled'))
{
- throw new ServerException("Queueing must be enabled to use IM plugins");
+ // TRANS: Server exception thrown trying to initialise an IM plugin without meeting all prerequisites.
+ throw new ServerException(_('Queueing must be enabled to use IM plugins.'));
}
if(is_null($this->transport)){
- throw new ServerException('transport cannot be null');
+ // TRANS: Server exception thrown trying to initialise an IM plugin without a transport method.
+ throw new ServerException(_('Transport cannot be null.'));
}
}
}