]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/SearchSub/SearchSubPlugin.php
Merge branch '1.0.x' of gitorious.org:statusnet/mainline into prefillbookmark
[quix0rs-gnu-social.git] / plugins / SearchSub / SearchSubPlugin.php
index 59db0ffcbb8f65c5c65ccc7e534a591440e9da78..de131c2b04f161f59e13eee161910f36e3c02384 100644 (file)
@@ -78,8 +78,14 @@ class SearchSubPlugin extends Plugin
             return false;
         case 'SearchsubAction':
         case 'SearchunsubAction':
+        case 'SearchsubsAction':
         case 'SearchSubForm':
+        case 'SearchSubMenu':
         case 'SearchUnsubForm':
+        case 'SearchSubTrackCommand':
+        case 'SearchSubTrackOffCommand':
+        case 'SearchSubTrackingCommand':
+        case 'SearchSubUntrackCommand':
             include_once $dir.'/'.strtolower($cls).'.php';
             return false;
         default:
@@ -103,6 +109,9 @@ class SearchSubPlugin extends Plugin
                     array('action' => 'searchunsub'),
                     array('search' => Router::REGEX_TAG));
 
+        $m->connect(':nickname/search-subscriptions',
+                    array('action' => 'searchsubs'),
+                    array('nickname' => Nickname::DISPLAY_FMT));
         return true;
     }
 
@@ -139,31 +148,61 @@ class SearchSubPlugin extends Plugin
      */
     function onStartNoticeWhoGets(Notice $notice, array &$ni)
     {
-        foreach ($notice->getTags() as $search) {
-            $searchsub = new SearchSub();
-            $searchsub->search = $search;
-            $searchsub->find();
-
-            while ($searchsub->fetch()) {
-                // These constants are currently not actually used, iirc
-                $ni[$searchsub->profile_id] = NOTICE_INBOX_SOURCE_SUB;
+        // Warning: this is potentially very slow
+        // with a lot of searches!
+        $sub = new SearchSub();
+        $sub->groupBy('search');
+        $sub->find();
+        while ($sub->fetch()) {
+            $search = $sub->search;
+
+            if ($this->matchSearch($notice, $search)) {
+                // Match? Find all those who subscribed to this
+                // search term and get our delivery on...
+                $searchsub = new SearchSub();
+                $searchsub->search = $search;
+                $searchsub->find();
+
+                while ($searchsub->fetch()) {
+                    // These constants are currently not actually used, iirc
+                    $ni[$searchsub->profile_id] = NOTICE_INBOX_SOURCE_SUB;
+                }
             }
         }
         return true;
     }
 
     /**
+     * Does the given notice match the given fulltext search query?
      *
-     * @param SearchAction $action
+     * Warning: not guaranteed to match other search engine behavior, etc.
+     * Currently using a basic case-insensitive substring match, which
+     * probably fits with the 'LIKE' search but not the default MySQL
+     * or Sphinx search backends.
+     *
+     * @param Notice $notice
+     * @param string $search 
+     * @return boolean
+     */
+    function matchSearch(Notice $notice, $search)
+    {
+        return (mb_stripos($notice->content, $search) !== false);
+    }
+
+    /**
+     *
+     * @param NoticeSearchAction $action
+     * @param string $q
+     * @param Notice $notice
      * @return boolean hook result
      */
-    function onStartTagShowContent(SearchAction $action)
+    function onStartNoticeSearchShowResults($action, $q, $notice)
     {
         $user = common_current_user();
         if ($user) {
-            $search = $action->trimmed('search');
+            $search = $q;
             $searchsub = SearchSub::pkeyGet(array('search' => $search,
-                                            'profile_id' => $user->id));
+                                                  'profile_id' => $user->id));
             if ($searchsub) {
                 $form = new SearchUnsubForm($action, $search);
             } else {
@@ -179,4 +218,89 @@ class SearchSubPlugin extends Plugin
         }
         return true;
     }
+
+    /**
+     * Menu item for personal subscriptions/groups area
+     *
+     * @param Widget $widget Widget being executed
+     *
+     * @return boolean hook return
+     */
+
+    function onEndSubGroupNav($widget)
+    {
+        $action = $widget->out;
+        $action_name = $action->trimmed('action');
+
+        $action->menuItem(common_local_url('searchsubs', array('nickname' => $action->user->nickname)),
+                          // TRANS: SearchSub plugin menu item on user settings page.
+                          _m('MENU', 'Searches'),
+                          // TRANS: SearchSub plugin tooltip for user settings menu item.
+                          _m('Configure search subscriptions'),
+                          $action_name == 'searchsubs' && $action->arg('nickname') == $action->user->nickname);
+
+        return true;
+    }
+
+    /**
+     * Replace the built-in stub track commands with ones that control
+     * search subscriptions.
+     *
+     * @param CommandInterpreter $cmd
+     * @param string $arg
+     * @param User $user
+     * @param Command $result
+     * @return boolean hook result
+     */
+    function onEndInterpretCommand($cmd, $arg, $user, &$result)
+    {
+        if ($result instanceof TrackCommand) {
+            $result = new SearchSubTrackCommand($user, $arg);
+            return false;
+        } else if ($result instanceof TrackOffCommand) {
+            $result = new SearchSubTrackOffCommand($user);
+            return false;
+        } else if ($result instanceof TrackingCommand) {
+            $result = new SearchSubTrackingCommand($user);
+            return false;
+        } else if ($result instanceof UntrackCommand) {
+            $result = new SearchSubUntrackCommand($user, $arg);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    function onHelpCommandMessages($cmd, &$commands)
+    {
+        // TRANS: Help message for IM/SMS command "track <word>"
+        $commands["track <word>"] = _m('COMMANDHELP', "Start following notices matching the given search query.");
+        // TRANS: Help message for IM/SMS command "untrack <word>"
+        $commands["untrack <word>"] = _m('COMMANDHELP', "Stop following notices matching the given search query.");
+        // TRANS: Help message for IM/SMS command "track off"
+        $commands["track off"] = _m('COMMANDHELP', "Disable all tracked search subscriptions.");
+        // TRANS: Help message for IM/SMS command "untrack all"
+        $commands["untrack all"] = _m('COMMANDHELP', "Disable all tracked search subscriptions.");
+        // TRANS: Help message for IM/SMS command "tracks"
+        $commands["tracks"] = _m('COMMANDHELP', "List all your search subscriptions.");
+        // TRANS: Help message for IM/SMS command "tracking"
+        $commands["tracking"] = _m('COMMANDHELP', "List all your search subscriptions.");
+    }
+
+    function onEndDefaultLocalNav($menu, $user)
+    {
+        $user = common_current_user();
+
+        if (!empty($user)) {
+            $searches = SearchSub::forProfile($user->getProfile());
+
+            if (!empty($searches) && count($searches) > 0) {
+                $searchSubMenu = new SearchSubMenu($menu->out, $user, $searches);
+                $menu->submenu(_m('Searches'), $searchSubMenu);
+            }
+        }
+
+        return true;
+    }
+
 }