. * * @category Activity * @package StatusNet * @author Evan Prodromou * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ if (!defined('STATUSNET')) { // This check helps protect against security problems; // your code file can't be executed directly from the web. exit(1); } /** * Activity plugin main class * * @category Activity * @package StatusNet * @author Evan Prodromou * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class ActivityPlugin extends Plugin { const VERSION = '0.1'; /** * Database schema setup * * @see Schema * @see ColumnDef * * @return boolean hook value; true means continue processing, false means stop. */ function onCheckSchema() { $schema = Schema::get(); // For storing the activity part of a notice $schema->ensureTable('notice_activity', array(new ColumnDef('notice_id', 'integer', null, false, 'PRI'), new ColumnDef('verb', 'varchar', 255, false, 'MUL'), new ColumnDef('object', 'varchar', 255, true, 'MUL'))); return true; } function onAutoload($cls) { $dir = dirname(__FILE__); switch ($cls) { case 'Notice_activity': include_once $dir . '/'.$cls.'.php'; return false; default: return true; } } function onEndSubscribe($subscriber, $other) { $user = User::staticGet('id', $subscriber->id); if (!empty($user)) { $rendered = sprintf(_m('Started following %s.'), $other->profileurl, $other->getBestName()); $content = sprintf(_m('Started following %s.'), $other->getBestName()); $notice = Notice::saveNew($user->id, $content, 'activity', array('rendered' => $rendered)); Notice_activity::setActivity($notice->id, ActivityVerb::FOLLOW, $other->getUri()); } return true; } function onEndUnsubscribe($subscriber, $other) { $user = User::staticGet('id', $subscriber->id); if (!empty($user)) { $rendered = sprintf(_m('Stopped following %s.'), $other->profileurl, $other->getBestName()); $content = sprintf(_m('Stopped following %s.'), $other->getBestName()); $notice = Notice::saveNew($user->id, $content, 'activity', array('rendered' => $rendered)); Notice_activity::setActivity($notice->id, ActivityVerb::UNFOLLOW, $other->getUri()); } return true; } function onEndFavorNotice($profile, $notice) { $user = User::staticGet('id', $profile->id); if (!empty($user)) { $author = Profile::staticGet('id', $notice->profile_id); $rendered = sprintf(_m('Liked %s\'s status.'), $notice->bestUrl(), $author->getBestName()); $content = sprintf(_m('Liked %s\'s status.'), $author->getBestName()); $notice = Notice::saveNew($user->id, $content, 'activity', array('rendered' => $rendered)); Notice_activity::setActivity($notice->id, ActivityVerb::FAVORITE, $notice->uri); } return true; } function onEndDisfavorNotice($profile, $notice) { $user = User::staticGet('id', $profile->id); if (!empty($user)) { $author = Profile::staticGet('id', $notice->profile_id); $rendered = sprintf(_m('Stopped liking %s\'s status.'), $notice->bestUrl(), $author->getBestName()); $content = sprintf(_m('Stopped liking %s\'s status.'), $author->getBestName()); $notice = Notice::saveNew($user->id, $content, 'activity', array('rendered' => $rendered)); Notice_activity::setActivity($notice->id, ActivityVerb::UNFAVORITE, $notice->uri); } return true; } function onEndJoinGroup($group, $user) { $rendered = sprintf(_m('Joined the group "%s".'), $group->homeUrl(), $group->getBestName()); $content = sprintf(_m('Joined the group %s.'), $group->getBestName()); $notice = Notice::saveNew($user->id, $content, 'activity', array('rendered' => $rendered)); Notice_activity::setActivity($notice->id, ActivityVerb::JOIN, $group->getUri()); return true; } function onEndLeaveGroup($group, $user) { $rendered = sprintf(_m('Left the group "%s".'), $group->homeUrl(), $group->getBestName()); $content = sprintf(_m('Left the group "%s".'), $group->getBestName()); $notice = Notice::saveNew($user->id, $content, 'activity', array('rendered' => $rendered)); Notice_activity::setActivity($notice->id, ActivityVerb::LEAVE, $group->getUri()); return true; } function onStartActivityVerb(&$notice, &$xs, &$verb) { $act = Notice_activity::staticGet('notice_id', $notice->id); if (!empty($act)) { $verb = $act->verb; } return true; } function onStartActivityDefaultObjectType(&$notice, &$xs, &$type) { $act = Notice_activity::staticGet('notice_id', $notice->id); if (!empty($act)) { // no default object return false; } return true; } function onStartActivityObjects(&$notice, &$xs, &$objects) { $act = Notice_activity::staticGet('notice_id', $notice->id); if (!empty($act)) { switch ($act->verb) { case ActivityVerb::FOLLOW: case ActivityVerb::UNFOLLOW: $profile = Profile::fromURI($act->object); if (!empty($profile)) { $objects[] = ActivityObject::fromProfile($profile); } break; case ActivityVerb::FAVORITE: case ActivityVerb::UNFAVORITE: $notice = Notice::staticGet('uri', $act->object); if (!empty($notice)) { $objects[] = $notice->asActivity(); } break; case ActivityVerb::JOIN: case ActivityVerb::LEAVE: $group = User_group::staticGet('uri', $act->object); if (!empty($notice)) { $objects[] = ActivityObject::fromGroup($group); } break; default: break; } } return true; } function onPluginVersion(&$versions) { $versions[] = array('name' => 'Activity', 'version' => self::VERSION, 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:Activity', 'rawdescription' => _m('Emits notices when social activities happen.')); return true; } }