From ccdd47bdb47e5208f5775ec3efed09ef2b008977 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 17 Feb 2011 10:51:00 -0500 Subject: [PATCH 1/5] use fallback URIs for groups when filling in attention in Notice::asActivity() --- classes/Notice.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/Notice.php b/classes/Notice.php index 4522d1fc38..c9cca8a969 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1333,7 +1333,7 @@ class Notice extends Memcached_DataObject $groups = $this->getGroups(); foreach ($groups as $group) { - $ctx->attention[] = $group->uri; + $ctx->attention[] = $group->getUri(); } // XXX: deprecated; use ActivityVerb::SHARE instead From 98b1fe07c65339ce8fe92659b8a4aee92a0e1e22 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 17 Feb 2011 16:46:08 -0800 Subject: [PATCH 2/5] Blow user:site_owner cache when granting/revoking 'owner' role --- classes/Profile.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/classes/Profile.php b/classes/Profile.php index bdac3ba453..fd41c6139a 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -752,6 +752,10 @@ class Profile extends Memcached_DataObject throw new Exception("Can't save role '$name' for profile '{$this->id}'"); } + if ($name == 'owner') { + User::blow('user:site_owner'); + } + Event::handle('EndGrantRole', array($this, $name)); } @@ -780,6 +784,10 @@ class Profile extends Memcached_DataObject throw new Exception(sprintf(_('Cannot revoke role "%1$s" for user #%2$d; database error.'),$name, $this->id)); } + if ($name == 'owner') { + User::blow('user:site_owner'); + } + Event::handle('EndRevokeRole', array($this, $name)); return true; From 6b18f86e011fb4a15187177c55ea37cec9fe4773 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 21 Feb 2011 11:23:07 -0800 Subject: [PATCH 3/5] Issue #3049 - resync doc/im with the help command text (various additions since doc was last edited) --- doc-src/im | 53 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/doc-src/im b/doc-src/im index 896c121879..9932632188 100644 --- a/doc-src/im +++ b/doc-src/im @@ -32,19 +32,40 @@ Commands You can do some minor management of your account through Jabber. These are the currently-implemented commands: -* **on**: Turn on notifications. You'll receive copies of messages by people - you subscribe to. -* **off**: Turn off notifications. You'll no longer receive Jabber - notifications. -* **stop**: Same as 'off' -* **quit**: Same as 'off' -* **help**: Show this help. List available Jabber/XMPP commands -* **follow <nickname>**: Subscribe to <nickname> -* **sub <nickname>**: Same as follow -* **leave <nickname>**: Unsubscribe from <nickname> -* **unsub <nickname>**: Same as leave -* **d <nickname> <text>**: Send direct message to <nickname> with message body <text> -* **get <nickname>**: Get last notice from <nickname> -* **last <nickname>**: Same as 'get' -* **whois <nickname>**: Get Profile info on <nickname> -* **fav <nickname>**: Add user's last notice as a favorite +* **on** - turn on notifications +* **off** - turn off notifications +* **help** - show this help +* **follow <nickname>** - subscribe to user +* **groups** - lists the groups you have joined +* **subscriptions** - list the people you follow +* **subscribers** - list the people that follow you +* **leave <nickname>** - unsubscribe from user +* **d <nickname> <text>** - direct message to user +* **get <nickname>** - get last notice from user +* **whois <nickname>** - get profile info on user +* **lose <nickname>** - force user to stop following you +* **fav <nickname>** - add user's last notice as a 'fave' +* **fav #<notice_id>** - add notice with the given id as a 'fave' +* **repeat #<notice_id>** - repeat a notice with a given id +* **repeat <nickname>** - repeat the last notice from user +* **reply #<notice_id>** - reply to notice with a given id +* **reply <nickname>** - reply to the last notice from user +* **join <group>** - join group +* **login** - Get a link to login to the web interface +* **drop <group>** - leave group +* **stats** - get your stats +* **stop** - same as 'off' +* **quit** - same as 'off' +* **sub <nickname>** - same as 'follow' +* **unsub <nickname>** - same as 'leave' +* **last <nickname>** - same as 'get' +* **on <nickname>** - not yet implemented. +* **off <nickname>** - not yet implemented. +* **nudge <nickname>** - remind a user to update. +* **invite <phone number>** - not yet implemented. +* **track <word>** - not yet implemented. +* **untrack <word>** - not yet implemented. +* **track off** - not yet implemented. +* **untrack all** - not yet implemented. +* **tracks** - not yet implemented. +* **tracking** - not yet implemented. From 11e033f05cd174e8e21a61aec28ed44da91ebe78 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 21 Feb 2011 12:09:54 -0800 Subject: [PATCH 4/5] CommandInterpreter test cases to guard against regressions --- tests/CommandInterperterTest.php | 174 +++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 tests/CommandInterperterTest.php diff --git a/tests/CommandInterperterTest.php b/tests/CommandInterperterTest.php new file mode 100644 index 0000000000..3ce1cc2821 --- /dev/null +++ b/tests/CommandInterperterTest.php @@ -0,0 +1,174 @@ +limit(1); + $user->find(); + $cmd = $inter->handle_command($user, $input); + + $type = $cmd ? get_class($cmd) : null; + $this->assertEquals(strtolower($expectedType), strtolower($type), $comment); + } + + static public function commandInterpreterCases() + { + $sets = array( + array('help', 'HelpCommand'), + array('help me bro', null, 'help does not accept multiple params'), + array('HeLP', 'HelpCommand', 'case check'), + array('HeLP Me BRO!', null, 'case & non-params check'), + + array('login', 'LoginCommand'), + array('login to savings!', null, 'login does not accept params'), + + array('lose', null, 'lose must have at least 1 parameter'), + array('lose foobar', 'LoseCommand', 'lose requires 1 parameter'), + array('lose foobar', 'LoseCommand', 'check for space norm'), + array('lose more weight', null, 'lose does not accept multiple params'), + + array('subscribers', 'SubscribersCommand'), + array('subscribers foo', null, 'subscribers does not take params'), + + array('subscriptions', 'SubscriptionsCommand'), + array('subscriptions foo', null, 'subscriptions does not take params'), + + array('groups', 'GroupsCommand'), + array('groups foo', null, 'groups does not take params'), + + array('off', 'OffCommand', 'off accepts 0 or 1 params'), + array('off foo', 'OffCommand', 'off accepts 0 or 1 params'), + array('off foo bar', null, 'off accepts 0 or 1 params'), + + array('stop', 'OffCommand', 'stop accepts 0 params'), + array('stop foo', null, 'stop accepts 0 params'), + + array('quit', 'OffCommand', 'quit accepts 0 params'), + array('quit foo', null, 'quit accepts 0 params'), + + array('on', 'OnCommand', 'on accepts 0 or 1 params'), + array('on foo', 'OnCommand', 'on accepts 0 or 1 params'), + array('on foo bar', null, 'on accepts 0 or 1 params'), + + array('join', null), + array('join foo', 'JoinCommand'), + array('join foo bar', null), + + array('drop', null), + array('drop foo', 'DropCommand'), + array('drop foo bar', null), + + array('follow', null), + array('follow foo', 'SubCommand'), + array('follow foo bar', null), + + array('sub', null), + array('sub foo', 'SubCommand'), + array('sub foo bar', null), + + array('leave', null), + array('leave foo', 'UnsubCommand'), + array('leave foo bar', null), + + array('unsub', null), + array('unsub foo', 'UnsubCommand'), + array('unsub foo bar', null), + + array('leave', null), + array('leave foo', 'UnsubCommand'), + array('leave foo bar', null), + + array('d', null), + array('d foo', null), + array('d foo bar', 'MessageCommand'), + + array('dm', null), + array('dm foo', null), + array('dm foo bar', 'MessageCommand'), + + array('r', null), + array('r foo', null), + array('r foo bar', 'ReplyCommand'), + + array('reply', null), + array('reply foo', null), + array('reply foo bar', 'ReplyCommand'), + + array('repeat', null), + array('repeat foo', 'RepeatCommand'), + array('repeat foo bar', null), + + array('rp', null), + array('rp foo', 'RepeatCommand'), + array('rp foo bar', null), + + array('rt', null), + array('rt foo', 'RepeatCommand'), + array('rt foo bar', null), + + array('rd', null), + array('rd foo', 'RepeatCommand'), + array('rd foo bar', null), + + array('whois', null), + array('whois foo', 'WhoisCommand'), + array('whois foo bar', null), + + array('fav', null), + array('fav foo', 'FavCommand'), + array('fav foo bar', null), + + array('nudge', null), + array('nudge foo', 'NudgeCommand'), + array('nudge foo bar', null), + + array('stats', 'StatsCommand'), + array('stats foo', null), + + array('invite', null), + array('invite foo', 'InviteCommand'), + array('invite foo bar', null), + + array('track', null), + array('track foo', 'TrackCommand'), + array('track off', 'TrackOffCommand'), + array('track foo bar', null), + array('track off foo', null), + + array('untrack', null), + array('untrack foo', 'UntrackCommand'), + array('untrack all', 'TrackOffCommand'), + array('untrack foo bar', null), + array('untrack all foo', null), + + array('tracking', 'TrackingCommand'), + array('tracking foo', null), + + array('tracks', 'TrackingCommand'), + array('tracks foo', null), + + ); + return $sets; + } + +} + From eb7e3ee528e6276f5b7a1a090286130c30beb150 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 21 Feb 2011 11:42:32 -0800 Subject: [PATCH 5/5] Fixes for ticket #3052: some commands started triggering when extra text is supposed to suppress them Regressions caused by bad refactoring in commit 21feac3bea72b0ecd88a3. Test cases in tests/CommandInterpreterTest.php were made against the pre-refactoring code, and now check out with the fixed code. Failures were caused by not changing logic structure when moving from multiple exit points (each if point would return directly with a null or an object) to setting a result variable and then falling through to a common exit point. Without the if statements being restructured, the result variable would just get overridden by the next case. --- lib/commandinterpreter.php | 140 ++++++++++++++++++++----------------- 1 file changed, 76 insertions(+), 64 deletions(-) diff --git a/lib/commandinterpreter.php b/lib/commandinterpreter.php index f2caf48bdb..fe426f1fcd 100644 --- a/lib/commandinterpreter.php +++ b/lib/commandinterpreter.php @@ -42,8 +42,9 @@ class CommandInterpreter case 'help': if ($arg) { $result = null; + } else { + $result = new HelpCommand($user); } - $result = new HelpCommand($user); break; case 'login': if ($arg) { @@ -120,49 +121,51 @@ class CommandInterpreter case 'join': if (!$arg) { $result = null; - } - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new JoinCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new JoinCommand($user, $other); + } } break; case 'drop': if (!$arg) { $result = null; - } - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new DropCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new DropCommand($user, $other); + } } break; case 'follow': case 'sub': if (!$arg) { $result = null; - } - - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new SubCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new SubCommand($user, $other); + } } break; case 'leave': case 'unsub': if (!$arg) { $result = null; - } - - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new UnsubCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new UnsubCommand($user, $other); + } } break; case 'get': @@ -207,96 +210,105 @@ class CommandInterpreter case 'rd': if (!$arg) { $result = null; - } - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new RepeatCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new RepeatCommand($user, $other); + } } break; case 'whois': if (!$arg) { $result = null; - } - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new WhoisCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new WhoisCommand($user, $other); + } } break; case 'fav': if (!$arg) { $result = null; - } - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new FavCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new FavCommand($user, $other); + } } break; case 'nudge': if (!$arg) { $result = null; - } - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new NudgeCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new NudgeCommand($user, $other); + } } break; case 'stats': if ($arg) { $result = null; + } else { + $result = new StatsCommand($user); } - $result = new StatsCommand($user); break; case 'invite': if (!$arg) { $result = null; - } - list($other, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; } else { - $result = new InviteCommand($user, $other); + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else { + $result = new InviteCommand($user, $other); + } } break; case 'track': if (!$arg) { $result = null; - } - list($word, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; - } else if ($word == 'off') { - $result = new TrackOffCommand($user); } else { - $result = new TrackCommand($user, $word); + list($word, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else if ($word == 'off') { + $result = new TrackOffCommand($user); + } else { + $result = new TrackCommand($user, $word); + } } break; case 'untrack': if (!$arg) { $result = null; - } - list($word, $extra) = $this->split_arg($arg); - if ($extra) { - $result = null; - } else if ($word == 'all') { - $result = new TrackOffCommand($user); } else { - $result = new UntrackCommand($user, $word); + list($word, $extra) = $this->split_arg($arg); + if ($extra) { + $result = null; + } else if ($word == 'all') { + $result = new TrackOffCommand($user); + } else { + $result = new UntrackCommand($user, $word); + } } break; case 'tracks': case 'tracking': if ($arg) { $result = null; + } else { + $result = new TrackingCommand($user); } - $result = new TrackingCommand($user); break; default: $result = false;