X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FUserFlag%2FUserFlagPlugin.php;h=ae3dfe0365155983e6518046afd1def6bb1ec51d;hb=4a71753f2046a17a98c139cc308ff7f77bd4f271;hp=600ed42714f7eff93f77e0f9a56bf53b5bbb75cd;hpb=5f5413624d166a9b2116d266c7698dd6dcd2d8c4;p=quix0rs-gnu-social.git diff --git a/plugins/UserFlag/UserFlagPlugin.php b/plugins/UserFlag/UserFlagPlugin.php index 600ed42714..ae3dfe0365 100644 --- a/plugins/UserFlag/UserFlagPlugin.php +++ b/plugins/UserFlag/UserFlagPlugin.php @@ -27,7 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { +if (!defined('STATUSNET')) { exit(1); } @@ -43,82 +43,239 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { class UserFlagPlugin extends Plugin { - function onCheckSchema() - { - $schema = Schema::get(); + const REVIEWFLAGS = 'UserFlagPlugin::reviewflags'; + const CLEARFLAGS = 'UserFlagPlugin::clearflags'; - // For storing user-submitted flags on notices + public $flagOnBlock = true; - $schema->ensureTable('user_flag_notice', - array(new ColumnDef('notice_id', 'integer', null, - null, 'PRI'), - new ColumnDef('user_id', 'integer', null, - null, 'PRI'), - new ColumnDef('flag', 'varchar', '8'), - new ColumnDef('created', 'datetime', null, - null, 'MUL'))); + /** + * Hook for ensuring our tables are created + * + * Ensures that the user_flag_profile table exists + * and has the right columns. + * + * @return boolean hook return + */ - // Allowable values for user_flag_notice - - $schema->ensureTable('notice_flag', - array(new ColumnDef('flag', 'varchar', '8', null, null, 'PRI'), - new ColumnDef('display', 'varchar', '255'), - new ColumnDef('created', 'datetime', null, - null, 'MUL'))); + function onCheckSchema() + { + $schema = Schema::get(); // For storing user-submitted flags on profiles $schema->ensureTable('user_flag_profile', array(new ColumnDef('profile_id', 'integer', null, - null, 'PRI'), + false, 'PRI'), new ColumnDef('user_id', 'integer', null, - null, 'PRI'), - new ColumnDef('flag', 'varchar', '8'), + false, 'PRI'), new ColumnDef('created', 'datetime', null, - null, 'MUL'))); - - // Allowable values for user_flag_notice + false, 'MUL'), + new ColumnDef('cleared', 'datetime', null, + true, 'MUL'))); - $schema->ensureTable('profile_flag', - array(new ColumnDef('flag', 'varchar', '8', null, null, 'PRI'), - new ColumnDef('display', 'varchar', '255'), - new ColumnDef('created', 'datetime', null, - null, 'MUL'))); return true; } - function onInitializePlugin() - { - // XXX: do something here? - return true; - } + /** + * Add our actions to the URL router + * + * @param Net_URL_Mapper $m URL mapper for this hit + * + * @return boolean hook return + */ - function onRouterInitialized(&$m) { - $m->connect('main/flag/notice', array('action' => 'flagnotice')); + function onRouterInitialized($m) + { $m->connect('main/flag/profile', array('action' => 'flagprofile')); - $m->connect('admin/notice/flag', array('action' => 'adminnoticeflag')); + $m->connect('main/flag/clear', array('action' => 'clearflag')); $m->connect('admin/profile/flag', array('action' => 'adminprofileflag')); return true; } + /** + * Auto-load our classes if called + * + * @param string $cls Class to load + * + * @return boolean hook return + */ + function onAutoload($cls) { - switch ($cls) + switch (strtolower($cls)) { - case 'FlagnoticeAction': - case 'FlagprofileAction': - case 'AdminnoticeflagAction': - case 'AdminprofileflagAction': - require_once(INSTALLDIR.'/plugins/UserFlag/' . strtolower(mb_substr($cls, 0, -6)) . '.php'); + case 'flagprofileaction': + case 'adminprofileflagaction': + case 'clearflagaction': + include_once INSTALLDIR.'/plugins/UserFlag/' . + strtolower(mb_substr($cls, 0, -6)) . '.php'; + return false; + case 'flagprofileform': + case 'clearflagform': + include_once INSTALLDIR.'/plugins/UserFlag/' . strtolower($cls . '.php'); return false; - case 'User_flag_notice': - case 'Notice_flag': - case 'User_flag_profile': - case 'Profile_flag': - require_once(INSTALLDIR.'/plugins/UserFlag/'.$cls.'.php'); + case 'user_flag_profile': + include_once INSTALLDIR.'/plugins/UserFlag/'.ucfirst(strtolower($cls)).'.php'; return false; - default: + default: return true; } } + + /** + * Add a 'flag' button to profile page + * + * @param Action &$action The action being called + * @param Profile $profile Profile being shown + * + * @return boolean hook result + */ + + function onEndProfilePageActionsElements(&$action, $profile) + { + $user = common_current_user(); + + if (!empty($user) && ($user->id != $profile->id)) { + + $action->elementStart('li', 'entity_flag'); + + if (User_flag_profile::exists($profile->id, $user->id)) { + $action->element('p', 'flagged', _('Flagged')); + } else { + $form = new FlagProfileForm($action, $profile, + array('action' => 'showstream', + 'nickname' => $profile->nickname)); + $form->show(); + } + + $action->elementEnd('li'); + } + + return true; + } + + /** + * Add a 'flag' button to profiles in a list + * + * @param ProfileListItem $item item being shown + * + * @return boolean hook result + */ + + function onEndProfileListItemActionElements($item) + { + $user = common_current_user(); + + if (!empty($user)) { + + list($action, $args) = $item->action->returnToArgs(); + + $args['action'] = $action; + + $form = new FlagProfileForm($item->action, $item->profile, $args); + + $item->action->elementStart('li', 'entity_flag'); + $form->show(); + $item->action->elementEnd('li'); + } + + return true; + } + + /** + * Initialize any flagging buttons on the page + * + * @param Action $action action being shown + * + * @return boolean hook result + */ + + function onEndShowScripts($action) + { + $action->inlineScript('if ($(".form_entity_flag").length > 0) { '. + '$(".form_entity_flag").bind("click", function() {'. + 'SN.U.FormXHR($(this)); return false; }); }'); + return true; + } + + /** + * Check whether a user has one of our defined rights + * + * We define extra rights; this function checks to see if a + * user has one of them. + * + * @param User $user User being checked + * @param string $right Right we're checking + * @param boolean &$result out, result of the check + * + * @return boolean hook result + */ + + function onUserRightsCheck($user, $right, &$result) + { + switch ($right) { + case self::REVIEWFLAGS: + case self::CLEARFLAGS: + $result = $user->hasRole('moderator'); + return false; // done processing! + } + + return true; // unchanged! + } + + /** + * Optionally flag profile when a block happens + * + * We optionally add a flag when a profile has been blocked + * + * @param User $user User doing the block + * @param Profile $profile Profile being blocked + * + * @return boolean hook result + */ + + function onEndBlockProfile($user, $profile) + { + if ($this->flagOnBlock && !User_flag_profile::exists($profile->id, + $user->id)) { + + User_flag_profile::create($user->id, $profile->id); + } + return true; + } + + /** + * Ensure that flag entries for a profile are deleted + * along with the profile when deleting users. + * This prevents breakage of the admin profile flag UI. + * + * @param Profile $profile + * @param array &$related list of related tables; entries + * with matching profile_id will be deleted. + * + * @return boolean hook result + */ + + function onProfileDeleteRelated($profile, &$related) + { + $related[] = 'user_flag_profile'; + return true; + } + + /** + * Ensure that flag entries created by a user are deleted + * when that user gets deleted. + * + * @param User $user + * @param array &$related list of related tables; entries + * with matching user_id will be deleted. + * + * @return boolean hook result + */ + + function onUserDeleteRelated($user, &$related) + { + $related[] = 'user_flag_profile'; + return true; + } }