From 119885d964f6f5402471f4874c7482c4d6a22fc0 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 15 Mar 2011 12:57:11 -0700 Subject: [PATCH] Stub TagSubPlugin: plugin guts with no UI to setup subs --- plugins/TagSub/TagSub.php | 109 ++++++++++++++++++++++ plugins/TagSub/TagSubPlugin.php | 156 ++++++++++++++++++++++++++++++++ 2 files changed, 265 insertions(+) create mode 100644 plugins/TagSub/TagSub.php create mode 100644 plugins/TagSub/TagSubPlugin.php diff --git a/plugins/TagSub/TagSub.php b/plugins/TagSub/TagSub.php new file mode 100644 index 0000000000..fdae3e2db0 --- /dev/null +++ b/plugins/TagSub/TagSub.php @@ -0,0 +1,109 @@ + + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2011, StatusNet, Inc. + * + * 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 . + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * For storing the tag subscriptions + * + * @category PollPlugin + * @package StatusNet + * @author Brion Vibber + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * @see DB_DataObject + */ + +class TagSub extends Managed_DataObject +{ + public $__table = 'tagsub'; // table name + public $tag; // text + public $profile_id; // int -> profile.id + public $created; // datetime + + /** + * Get an instance by key + * + * This is a utility method to get a single instance with a given key value. + * + * @param string $k Key to use to lookup (usually 'user_id' for this class) + * @param mixed $v Value to lookup + * + * @return TagSub object found, or null for no hits + * + */ + function staticGet($k, $v=null) + { + return Memcached_DataObject::staticGet('TagSub', $k, $v); + } + + /** + * Get an instance by compound key + * + * This is a utility method to get a single instance with a given set of + * key-value pairs. Usually used for the primary key for a compound key; thus + * the name. + * + * @param array $kv array of key-value mappings + * + * @return TagSub object found, or null for no hits + * + */ + function pkeyGet($kv) + { + return Memcached_DataObject::pkeyGet('TagSub', $kv); + } + + /** + * The One True Thingy that must be defined and declared. + */ + public static function schemaDef() + { + return array( + 'description' => 'TagSubPlugin tag subscription records', + 'fields' => array( + 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'hash tag associated with this subscription'), + 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'profile ID of subscribing user'), + 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + ), + 'primary key' => array('tag', 'profile_id'), + 'foreign keys' => array( + 'tagsub_profile_id_fkey' => array('profile', array('profile_id' => 'id')), + ), + 'indexes' => array( + 'tagsub_created_idx' => array('created'), + 'tagsub_profile_id_tag_idx' => array('profile_id', 'tag'), + ), + ); + } + +} diff --git a/plugins/TagSub/TagSubPlugin.php b/plugins/TagSub/TagSubPlugin.php new file mode 100644 index 0000000000..b43fcf32ba --- /dev/null +++ b/plugins/TagSub/TagSubPlugin.php @@ -0,0 +1,156 @@ +. + * + * @category TagSubPlugin + * @package StatusNet + * @author Brion Vibber + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * TagSub plugin main class + * + * @category TagSubPlugin + * @package StatusNet + * @author Brion Vibber + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ +class TagSubPlugin extends Plugin +{ + const VERSION = '0.1'; + + /** + * Database schema setup + * + * @see Schema + * + * @return boolean hook value; true means continue processing, false means stop. + */ + function onCheckSchema() + { + $schema = Schema::get(); + $schema->ensureTable('tagsub', TagSub::schemaDef()); + return true; + } + + /** + * Load related modules when needed + * + * @param string $cls Name of the class to be loaded + * + * @return boolean hook value; true means continue processing, false means stop. + */ + function onAutoload($cls) + { + $dir = dirname(__FILE__); + + switch ($cls) + { + case 'TagsubAction': + case 'TagunsubAction': + include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; + return false; + case 'TagSub': + include_once $dir.'/'.$cls.'.php'; + return false; + case 'TagSubForm': + case 'TagUnsubForm': + include_once $dir.'/'.strtolower($cls).'.php'; + return false; + default: + return true; + } + } + + /** + * Map URLs to actions + * + * @param Net_URL_Mapper $m path-to-action mapper + * + * @return boolean hook value; true means continue processing, false means stop. + */ + function onRouterInitialized($m) + { + $m->connect('tag/:tag/subscribe', + array('action' => 'tagsub'), + array('tag' => Router::REGEX_TAG)); + $m->connect('tag/:tag/unsubscribe', + array('action' => 'tagunsub'), + array('tag' => Router::REGEX_TAG)); + + return true; + } + + /** + * Plugin version data + * + * @param array &$versions array of version data + * + * @return value + */ + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'TagSub', + 'version' => self::VERSION, + 'author' => 'Brion Vibber', + 'homepage' => 'http://status.net/wiki/Plugin:TagSub', + 'rawdescription' => + // TRANS: Plugin description. + _m('Plugin to allow following all messages with a given tag.')); + return true; + } + + /** + * Hook inbox delivery setup so tag subscribers receive all + * notices with that tag in their inbox. + * + * Currently makes no distinction between local messages and + * remote ones which happen to come in to the system. Remote + * notices that don't come in at all won't ever reach this. + * + * @param Notice $notice + * @param array $ni in/out map of profile IDs to inbox constants + * @return boolean hook result + */ + function onStartNoticeWhoGets(Notice $notice, array &$ni) + { + foreach ($notice->getTags() as $tag) { + $tagsub = new TagSub(); + $tagsub->tag = $tag; + $tagsub->find(); + + while ($tagsub->fetch()) { + // These constants are currently not actually used, iirc + $ni[$tagsub->profile_id] = NOTICE_INBOX_SOURCE_SUB; + } + } + return true; + } +} -- 2.39.5