. */ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } require_once(INSTALLDIR.'/lib/channel.php'); class Command { var $user = null; function __construct($user=null) { $this->user = $user; } function execute($channel) { return false; } } class UnimplementedCommand extends Command { function execute($channel) { $channel->error($this->user, _("Sorry, this command is not yet implemented.")); } } class TrackingCommand extends UnimplementedCommand { } class TrackOffCommand extends UnimplementedCommand { } class TrackCommand extends UnimplementedCommand { var $word = null; function __construct($user, $word) { parent::__construct($user); $this->word = $word; } } class UntrackCommand extends UnimplementedCommand { var $word = null; function __construct($user, $word) { parent::__construct($user); $this->word = $word; } } class NudgeCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { $recipient = User::staticGet('nickname', $this->other); if(! $recipient){ $channel->error($this->user, sprintf(_('Could not find a user with nickname %s'), $this->other)); }else{ if ($recipient->id == $this->user->id) { $channel->error($this->user, _('It does not make a lot of sense to nudge yourself!')); }else{ if ($recipient->email && $recipient->emailnotifynudge) { mail_notify_nudge($this->user, $recipient); } // XXX: notify by IM // XXX: notify by SMS $channel->output($this->user, sprintf(_('Nudge sent to %s'), $recipient->nickname)); } } } } class InviteCommand extends UnimplementedCommand { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } } class StatsCommand extends Command { function execute($channel) { $profile = $this->user->getProfile(); $subs_count = $profile->subscriptionCount(); $subbed_count = $profile->subscriberCount(); $notice_count = $profile->noticeCount(); $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n". "Subscribers: %2\$s\n". "Notices: %3\$s"), $subs_count, $subbed_count, $notice_count)); } } class FavCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { if(substr($this->other,0,1)=='#'){ //favoriting a specific notice_id $notice = Notice::staticGet(substr($this->other,1)); if (!$notice) { $channel->error($this->user, _('Notice with that id does not exist')); return; } $recipient = $notice->getProfile(); }else{ //favoriting a given user's last notice $recipient = common_relative_profile($this->user, common_canonical_nickname($this->other)); if (!$recipient) { $channel->error($this->user, _('No such user.')); return; } $notice = $recipient->getCurrentNotice(); if (!$notice) { $channel->error($this->user, _('User has no last notice')); return; } } $fave = Fave::addNew($this->user, $notice); if (!$fave) { $channel->error($this->user, _('Could not create favorite.')); return; } $other = User::staticGet('id', $recipient->id); if ($other && $other->id != $user->id) { if ($other->email && $other->emailnotifyfav) { mail_notify_fave($other, $this->user, $notice); } } $this->user->blowFavesCache(); $channel->output($this->user, _('Notice marked as fave.')); } } class JoinCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { $nickname = common_canonical_nickname($this->other); $group = User_group::staticGet('nickname', $nickname); $cur = $this->user; if (!$group) { $channel->error($cur, _('No such group.')); return; } if ($cur->isMember($group)) { $channel->error($cur, _('You are already a member of that group')); return; } if (Group_block::isBlocked($group, $cur->getProfile())) { $channel->error($cur, _('You have been blocked from that group by the admin.')); return; } $member = new Group_member(); $member->group_id = $group->id; $member->profile_id = $cur->id; $member->created = common_sql_now(); $result = $member->insert(); if (!$result) { common_log_db_error($member, 'INSERT', __FILE__); $channel->error($cur, sprintf(_('Could not join user %s to group %s'), $cur->nickname, $group->nickname)); return; } $channel->output($cur, sprintf(_('%s joined group %s'), $cur->nickname, $group->nickname)); } } class DropCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { $nickname = common_canonical_nickname($this->other); $group = User_group::staticGet('nickname', $nickname); $cur = $this->user; if (!$group) { $channel->error($cur, _('No such group.')); return; } if (!$cur->isMember($group)) { $channel->error($cur, _('You are not a member of that group.')); return; } $member = new Group_member(); $member->group_id = $group->id; $member->profile_id = $cur->id; if (!$member->find(true)) { $channel->error($cur,_('Could not find membership record.')); return; } $result = $member->delete(); if (!$result) { common_log_db_error($member, 'INSERT', __FILE__); $channel->error($cur, sprintf(_('Could not remove user %s to group %s'), $cur->nickname, $group->nickname)); return; } $channel->output($cur, sprintf(_('%s left group %s'), $cur->nickname, $group->nickname)); } } class WhoisCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { $recipient = common_relative_profile($this->user, common_canonical_nickname($this->other)); if (!$recipient) { $channel->error($this->user, _('No such user.')); return; } $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname, $recipient->profileurl); if ($recipient->fullname) { $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname); } if ($recipient->location) { $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location); } if ($recipient->homepage) { $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage); } if ($recipient->bio) { $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio); } $channel->output($this->user, $whois); } } class MessageCommand extends Command { var $other = null; var $text = null; function __construct($user, $other, $text) { parent::__construct($user); $this->other = $other; $this->text = $text; } function execute($channel) { $other = User::staticGet('nickname', common_canonical_nickname($this->other)); $len = mb_strlen($this->text); if ($len == 0) { $channel->error($this->user, _('No content!')); return; } $this->text = common_shorten_links($this->text); if (Message::contentTooLong($this->text)) { $channel->error($this->user, sprintf(_('Message too long - maximum is %d characters, you sent %d'), Message::maxContent(), mb_strlen($this->text))); return; } if (!$other) { $channel->error($this->user, _('No such user.')); return; } else if (!$this->user->mutuallySubscribed($other)) { $channel->error($this->user, _('You can\'t send a message to this user.')); return; } else if ($this->user->id == $other->id) { $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.')); return; } $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source()); if ($message) { $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other)); } else { $channel->error($this->user, _('Error sending direct message.')); } } } class ReplyCommand extends Command { var $other = null; var $text = null; function __construct($user, $other, $text) { parent::__construct($user); $this->other = $other; $this->text = $text; } function execute($channel) { if(substr($this->other,0,1)=='#'){ //replying to a specific notice_id $notice = Notice::staticGet(substr($this->other,1)); if (!$notice) { $channel->error($this->user, _('Notice with that id does not exist')); return; } $recipient = $notice->getProfile(); }else{ //replying to a given user's last notice $recipient = common_relative_profile($this->user, common_canonical_nickname($this->other)); if (!$recipient) { $channel->error($this->user, _('No such user.')); return; } $notice = $recipient->getCurrentNotice(); if (!$notice) { $channel->error($this->user, _('User has no last notice')); return; } } $len = mb_strlen($this->text); if ($len == 0) { $channel->error($this->user, _('No content!')); return; } $this->text = common_shorten_links($this->text); if (Notice::contentTooLong($this->text)) { $channel->error($this->user, sprintf(_('Notice too long - maximum is %d characters, you sent %d'), Notice::maxContent(), mb_strlen($this->text))); return; } $notice = Notice::saveNew($this->user->id, $this->text, $channel->source(), 1, $notice->id); if ($notice) { $channel->output($this->user, sprintf(_('Reply to %s sent'), $recipient->nickname)); } else { $channel->error($this->user, _('Error saving notice.')); } common_broadcast_notice($notice); } } class GetCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { $target_nickname = common_canonical_nickname($this->other); $target = common_relative_profile($this->user, $target_nickname); if (!$target) { $channel->error($this->user, _('No such user.')); return; } $notice = $target->getCurrentNotice(); if (!$notice) { $channel->error($this->user, _('User has no last notice')); return; } $notice_content = $notice->content; $channel->output($this->user, $target_nickname . ": " . $notice_content); } } class SubCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { if (!$this->other) { $channel->error($this->user, _('Specify the name of the user to subscribe to')); return; } $result = subs_subscribe_user($this->user, $this->other); if ($result == 'true') { $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other)); } else { $channel->error($this->user, $result); } } } class UnsubCommand extends Command { var $other = null; function __construct($user, $other) { parent::__construct($user); $this->other = $other; } function execute($channel) { if(!$this->other) { $channel->error($this->user, _('Specify the name of the user to unsubscribe from')); return; } $result=subs_unsubscribe_user($this->user, $this->other); if ($result) { $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other)); } else { $channel->error($this->user, $result); } } } class OffCommand extends Command { var $other = null; function __construct($user, $other=null) { parent::__construct($user); $this->other = $other; } function execute($channel) { if ($other) { $channel->error($this->user, _("Command not yet implemented.")); } else { if ($channel->off($this->user)) { $channel->output($this->user, _('Notification off.')); } else { $channel->error($this->user, _('Can\'t turn off notification.')); } } } } class OnCommand extends Command { var $other = null; function __construct($user, $other=null) { parent::__construct($user); $this->other = $other; } function execute($channel) { if ($other) { $channel->error($this->user, _("Command not yet implemented.")); } else { if ($channel->on($this->user)) { $channel->output($this->user, _('Notification on.')); } else { $channel->error($this->user, _('Can\'t turn on notification.')); } } } } class LoginCommand extends Command { function execute($channel) { $disabled = common_config('logincommand','disabled'); if(isset($disabled)) { $channel->error($this->user, _('Login command is disabled')); return; } $login_token = Login_token::staticGet('user_id',$this->user->id); if($login_token){ $login_token->delete(); } $login_token = new Login_token(); $login_token->user_id = $this->user->id; $login_token->token = common_good_rand(16); $login_token->created = common_sql_now(); $result = $login_token->insert(); if (!$result) { common_log_db_error($login_token, 'INSERT', __FILE__); $channel->error($this->user, sprintf(_('Could not create login token for %s'), $this->user->nickname)); return; } $channel->output($this->user, sprintf(_('This link is useable only once, and is good for only 2 minutes: %s'), common_local_url('login', array('user_id'=>$login_token->user_id, 'token'=>$login_token->token)))); } } class SubscriptionsCommand extends Command { function execute($channel) { $profile = $this->user->getSubscriptions(0); $nicknames=array(); while ($profile->fetch()) { $nicknames[]=$profile->nickname; } if(count($nicknames)==0){ $out=_('You are not subscribed to anyone.'); }else{ $out = ngettext('You are subscribed to this person:', 'You are subscribed to these people:', count($nicknames)); $out .= ' '; $out .= implode(', ',$nicknames); } $channel->output($this->user,$out); } } class SubscribersCommand extends Command { function execute($channel) { $profile = $this->user->getSubscribers(); $nicknames=array(); while ($profile->fetch()) { $nicknames[]=$profile->nickname; } if(count($nicknames)==0){ $out=_('No one is subscribed to you.'); }else{ $out = ngettext('This person is subscribed to you:', 'These people are subscribed to you:', count($nicknames)); $out .= ' '; $out .= implode(', ',$nicknames); } $channel->output($this->user,$out); } } class GroupsCommand extends Command { function execute($channel) { $group = $this->user->getGroups(); $groups=array(); while ($group->fetch()) { $groups[]=$group->nickname; } if(count($groups)==0){ $out=_('You are not a member of any groups.'); }else{ $out = ngettext('You are a member of this group:', 'You are a member of these groups:', count($nicknames)); $out.=implode(', ',$groups); } $channel->output($this->user,$out); } } class HelpCommand extends Command { function execute($channel) { $channel->output($this->user, _("Commands:\n". "on - turn on notifications\n". "off - turn off notifications\n". "help - show this help\n". "follow - subscribe to user\n". "groups - lists the groups you have joined\n". "subscriptions - list the people you follow\n". "subscribers - list the people that follow you\n". "leave - unsubscribe from user\n". "d - direct message to user\n". "get - get last notice from user\n". "whois - get profile info on user\n". "fav - add user's last notice as a 'fave'\n". "fav # - add notice with the given id as a 'fave'\n". "reply # - reply to notice with a given id\n". "reply - reply to the last notice from user\n". "join - join group\n". "login - Get a link to login to the web interface\n". "drop - leave group\n". "stats - get your stats\n". "stop - same as 'off'\n". "quit - same as 'off'\n". "sub - same as 'follow'\n". "unsub - same as 'leave'\n". "last - same as 'get'\n". "on - not yet implemented.\n". "off - not yet implemented.\n". "nudge - remind a user to update.\n". "invite - not yet implemented.\n". "track - not yet implemented.\n". "untrack - not yet implemented.\n". "track off - not yet implemented.\n". "untrack all - not yet implemented.\n". "tracks - not yet implemented.\n". "tracking - not yet implemented.\n")); } }