. * * @category Moderation * @package StatusNet * @author Evan Prodromou * @copyright 2012 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); } /** * Moderation logging * * Shows a history of moderation for this user in the sidebar * * @category Moderation * @package StatusNet * @author Evan Prodromou * @copyright 2012 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class ModLogPlugin extends Plugin { const VIEWMODLOG = 'ModLogPlugin::VIEWMODLOG'; /** * Database schema setup * * We keep a moderation log table * * @see Schema * @see ColumnDef * * @return boolean hook value; true means continue processing, false means stop. */ function onCheckSchema() { $schema = Schema::get(); $schema->ensureTable('mod_log', ModLog::schemaDef()); return true; } function onEndGrantRole($profile, $role) { $modlog = new ModLog(); $modlog->id = UUID::gen(); $modlog->profile_id = $profile->id; $cur = common_current_user(); if (!empty($cur)) { $modlog->moderator_id = $cur->id; } $modlog->role = $role; $modlog->is_grant = 1; $modlog->created = common_sql_now(); $modlog->insert(); return true; } function onEndRevokeRole($profile, $role) { $modlog = new ModLog(); $modlog->id = UUID::gen(); $modlog->profile_id = $profile->id; $cur = common_current_user(); if (!empty($cur)) { $modlog->moderator_id = $cur->id; } $modlog->role = $role; $modlog->is_grant = 0; $modlog->created = common_sql_now(); $modlog->insert(); return true; } function onEndShowSections(Action $action) { if ($action->arg('action') != 'showstream') { return true; } $cur = common_current_user(); if (empty($cur) || !$cur->hasRight(self::VIEWMODLOG)) { return true; } $profile = $action->profile; $ml = new ModLog(); $ml->profile_id = $profile->id; $ml->orderBy("created"); $cnt = $ml->find(); if ($cnt > 0) { $action->elementStart('div', array('id' => 'entity_mod_log', 'class' => 'section')); $action->element('h2', null, _('Moderation')); $action->elementStart('table'); while ($ml->fetch()) { $action->elementStart('tr'); $action->element('td', null, strftime('%y-%m-%d', strtotime($ml->created))); $action->element('td', null, sprintf(($ml->is_grant) ? _('+%s') : _('-%s'), $ml->role)); $action->elementStart('td'); if ($ml->moderator_id) { $mod = Profile::getKV('id', $ml->moderator_id); if (empty($mod)) { $action->text(_('[unknown]')); } else { $action->element('a', array('href' => $mod->profileurl, 'title' => $mod->fullname), $mod->nickname); } } else { $action->text(_('[unknown]')); } $action->elementEnd('td'); $action->elementEnd('tr'); } $action->elementEnd('table'); $action->elementEnd('div'); } } function onUserRightsCheck($profile, $right, &$result) { switch ($right) { case self::VIEWMODLOG: $result = ($profile->hasRole(Profile_role::MODERATOR) || $profile->hasRole('modhelper')); return false; default: return true; } } function onPluginVersion(array &$versions) { $versions[] = array('name' => 'ModLog', 'version' => GNUSOCIAL_VERSION, 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:ModLog', 'description' => _m('Show the moderation history for a profile in the sidebar')); return true; } }