ЧТМ:Расширения/AutoMarkAdmins/AutoMarkAdminsHooks.php

Материал из ЧТМ
Версия от 05:47, 5 июня 2026; Ышастыч (обсуждение | вклад) (Изменил настройки защиты для «ЧТМ:Расширения/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' => []
		];
	}
}