ЧТМ:Расширения/AutoMarkAdmins/AutoMarkAdminsHooks.php
Перейти к навигации
Перейти к поиску
<?php
class AutoMarkAdminsHooks {
// Вспомогательная функция для получения единого ключа кэша
private static function getCacheKey( $cache ) {
return $cache->makeKey( 'automarkadmins', 'user_rights_data' );
}
// 1. Выдача данных во frontend (JS)
public static function onResourceLoaderGetConfigVars( array &$vars ) {
$cache = ObjectCache::getLocalClusterInstance();
$key = self::getCacheKey( $cache );
$data = $cache->get( $key );
if ( $data === false ) {
$data = self::fetchDataFromDB();
// Ставим время кэширования
$cache->set( $key, $data, 3600 );
}
$vars['wgAutoMarkAdminsData'] = $data;
return true;
}
// 2. НОВЫЙ ХУК: Срабатывает, когда кому-то меняют права
public static function onUserGroupsChanged( $user, array $added, array $removed, $performer, $reason, $oldUGMs, $newUGMs ) {
// Подключаемся к кэшу
$cache = ObjectCache::getLocalClusterInstance();
$key = self::getCacheKey( $cache );
// Мгновенно удаляем кэш!
// При следующей загрузке страницы onResourceLoaderGetConfigVars не найдет кэш и сделает свежий запрос к БД.
$cache->delete( $key );
return true;
}
private static function fetchDataFromDB() {
// Маппинг: системное название группы в БД => буква для гаджета
$groupMap = [
'sysop' => 'A',
'bureaucrat' => 'B',
'checkuser' => 'C',
'deletebatch' => 'D',
'engineer' => 'E',
'filemanager' => 'F',
'global-bot' => 'G',
'editmaxprotected' => 'H',
'eliminator' => 'I',
'reviewer' => 'J',
'moduleeditor' => 'M',
'interface-admin' => 'N',
'suppress' => 'O',
'protector' => 'P',
'moderator' => 'R',
'abusefilter' => 'S',
'edittemplates' => 'T',
'batchuploader' => 'U',
'validator' => 'V',
'importer' => 'X',
'blockbatch' => 'BB',
'cleaner' => 'CL',
'creator' => 'CR',
'deleteusers' => 'DU',
'extendedpermission' => 'EP',
'fulledit' => 'FE',
'fullpermission' => 'FP',
'staff' => 'ST',
'steward' => 'SW',
'autoreview' => 'ap',
'bot' => 'b',
'redirectcreator' => 'c',
'ipblock-exempt' => 'i',
'editor' => 'p',
'rollback' => 'r',
'suppressredirect' => 's',
'upload' => 'u'
// Добавьте сюда любые другие группы вашей вики
];
$userSet = [];
foreach ( $groupMap as $flag ) {
$userSet[$flag] = [];
}
$dbr = wfGetDB( DB_REPLICA );
$res = $dbr->select(
[ 'user_groups', 'user' ],
[ 'ug_group', 'user_name' ],
[],
__METHOD__,
[],
[ 'user' => [ 'JOIN', 'ug_user = user_id' ] ]
);
foreach ( $res as $row ) {
$dbGroup = $row->ug_group;
if ( isset( $groupMap[$dbGroup] ) ) {
$flag = $groupMap[$dbGroup];
$userSet[$flag][] = $row->user_name;
}
}
return [
'userSet' => $userSet,
'users_talkLinkOnly' => []
];
}
}