/** * получение данных по модераторам и запись их в memfs и memcache * moderatorsDetails[ uid ] = array( name => '', bansCount => '' ) * содержит uid, имя модератора и, возможно, кол-во банов bansCount, * которое устанавливается в chat.php при бане */ function DumpModeratorsDetails() { global $memcache; //$memcache->Delete( MODERATORS_DETAILS_MEMCACHE_KEY ); $moderatorsDetails = $memcache->Get(MODERATORS_DETAILS_MEMCACHE_KEY); //SaveForDebug( 'cron dump moder details debug, get from memcache: ' . var_export( $moderatorsDetails, true ) ); // попытка считать статистику из файла, если ее нет в memcache if ($moderatorsDetails === FALSE) { $moderatorsDetails = GetModeratorDetailsFromFile(); } if ($moderatorsDetails === FALSE) { //получаем из базы $queryString = ' SELECT users.uid, name FROM users INNER JOIN users_roles using(uid) WHERE rid IN (3,4,5) AND status = 1 GROUP BY users.uid'; $db = GetDb(); $queryResult = $db->Query($queryString); if ($queryResult === FALSE) { SaveForDebug(CHAT_RUNTIME_ERROR . ' cron dump moderrators details 1'); } while ($moderatorDetail = $queryResult->fetch_assoc()) { $moderatorsDetails[$moderatorDetail['uid']]['name'] = $moderatorDetail['name']; } //SaveForDebug( 'moderatorsDetails dump from bd' ); } $memcache->Set(MODERATORS_DETAILS_MEMCACHE_KEY, $moderatorsDetails, CHAT_MODERATORS_DETAILS_TTL); //SaveForDebug( 'send to memcache: ' . var_export( $moderatorsDetails, true ) ); $dataJS = 'var moderatorsDetails = ' . json_encode($moderatorsDetails); file_put_contents(CHAT_MODERATORS_DETAILS, $dataJS); }
var_dump( $banInfo ); exit; */ global $memcache; $memcache->Set(PRIME_TIME_ADVERT_FROM_STREAMER, 'streamer test 15', 15); $memcache->Set(PRIME_TIME_ADVERT_FROM_USER, 'user 30 :s:notbad: :s:kawai: :s:joyful:', 30); $test = $memcache->Get(PRIME_TIME_ADVERT_FROM_STREAMER); var_dump($test); $test = $memcache->Get(PRIME_TIME_ADVERT_FROM_USER); var_dump($test); exit; $memcache->Delete(MODERATORS_DETAILS_MEMCACHE_KEY); $moderatorsDetails = $memcache->Get(MODERATORS_DETAILS_MEMCACHE_KEY); var_dump($moderatorsDetails); $moderatorsDetails = $memcache->Get(MODERATORS_DETAILS_MEMCACHE_KEY); var_dump(GetModeratorDetailsFromFile()); exit; if (empty($_COOKIE[DRUPAL_SESSION]) || preg_match('/[^a-z\\d]+/i', $_COOKIE[DRUPAL_SESSION])) { exit; } $drupalSession = $_COOKIE[DRUPAL_SESSION]; $chatAuthMemcacheKey = 'ChatUserInfo_' . $drupalSession; $memcacheAuthInfo = $memcache->Get($chatAuthMemcacheKey); var_dump($memcacheAuthInfo); $memcache->Delete($chatAuthMemcacheKey); $memcacheAuthInfo = $memcache->Get($chatAuthMemcacheKey); var_dump($memcacheAuthInfo); exit; // relogin banned $uid = (int) $_GET['uid']; $banInfoMemcacheKey = 'Chat_uid_' . $uid . '_BanInfo';
/** * бан пользователя * @param int banUid id пользователя, которого баним * @param string banUserName его имя * @param int banDurationInMin длительность бана в минутах * @param int banMessageId id сообщения, за которое выдается бан * @param int channelId id канала юзера * @param int banReasonId id причины бана, для модеров 0 * @param bool isAutoBan если автобан, TRUE, иначе FALSE * @return array возвращает массив вида * array( 'code' => 0,// код результата: 0 для ошибки | 1 для успеха 'error' => 'hack';// текст ошибки ) */ public function BanUser($banUid, $banUserName, $banDurationInMin, $banMessageId, $channelId, $banReasonId = 0, $isAutoBan = FALSE) { $banUid = (int) $banUid; $banMessageId = (int) $banMessageId; $banReasonId = (int) $banReasonId; $banDurationInMin = (int) $banDurationInMin; $channelId = (int) $channelId; // выдаем ошибку, если есть права, но неправильный id сообщения if ($this->user['rights'] === 1 && $banMessageId < 0 || $this->user['rights'] != 1 && $isAutoBan === FALSE || $banUid === 0 || $banUserName === '' || $banDurationInMin === 0 || $banReasonId < 0) { SaveForDebug(var_export($_REQUEST, TRUE)); $result = array('code' => 0, 'error' => CHAT_RUNTIME_ERROR . '2'); return $result; } $banDuration = $banDurationInMin * 60; $banExpirationTime = CURRENT_TIME + $banDuration; // проверяем флаг в memcache на случай бана от модератора или граждан $banInfoMemcacheKey = 'Chat_uid_' . $banUid . '_BanInfo'; // делаем через Add, чтобы одновременно проверить отсутствие флага // и установить его $isUserBanned = $this->memcache->Add($banInfoMemcacheKey, array('banTime' => CURRENT_TIME, 'banExpirationTime' => $banExpirationTime), $banDuration); if ($isUserBanned === FALSE) { $result = array('code' => 0, 'error' => 'Уже забанен'); return $result; } list($banUserName) = $this->db->PrepareParams($banUserName); $moderatorName = $this->user['name']; $moderatorId = $this->user['uid']; $queryString = ' INSERT INTO chat_ban ( uid, moderatorId, banExpirationTime, banMessageId, banReasonId, banTime, banDuration ) VALUES( "' . $banUid . '", "' . $moderatorId . '", "' . $banExpirationTime . '", "' . $banMessageId . '", "' . $banReasonId . '", "' . CURRENT_TIME . '", "' . $banDuration . '")'; $queryResult = $this->db->Query($queryString); if ($queryResult === FALSE) { // в случае ошибки с запросом удаляем флаг в мемкеше, // чтобы юзера можно было забанить в следующий раз $this->memcache->Delete($banInfoMemcacheKey); $result = array('code' => 0, 'error' => CHAT_RUNTIME_ERROR . '3'); return $result; } if (CHAT_DELETE_BANNED_USERS_MESSAGE && $isAutoBan === FALSE) { $queryString = ' UPDATE chat_message SET deletedBy = "' . $moderatorId . '" WHERE id = "' . $banMessageId . '"'; $queryResult = $this->db->Query($queryString); if ($queryResult === FALSE) { $this->memcache->Delete($banInfoMemcacheKey); $result = array('code' => 0, 'error' => CHAT_RUNTIME_ERROR . '4'); return $result; } } // сохраняем для модераторов кол-во банов if ($this->user['type'] === 'chatAdmin') { $moderatorsDetails = $this->memcache->Get(MODERATORS_DETAILS_MEMCACHE_KEY); // попытка считать статистику из файла, если ее нет в memcache if ($moderatorsDetails === FALSE) { $moderatorsDetails = GetModeratorDetailsFromFile(); } if ($moderatorsDetails !== FALSE) { if (isset($moderatorsDetails[$moderatorId])) { // TODO += ? if (isset($moderatorsDetails[$moderatorId]['bansCount'])) { $moderatorsDetails[$moderatorId]['bansCount'] = $moderatorsDetails[$moderatorId]['bansCount'] + 1; } else { $moderatorsDetails[$moderatorId]['bansCount'] = 1; } } else { $moderatorsDetails[$moderatorId] = array('name' => $moderatorName, 'bansCount' => 1); } $this->memcache->Set(MODERATORS_DETAILS_MEMCACHE_KEY, $moderatorsDetails, CHAT_MODERATORS_DETAILS_TTL); } } if (!$isAutoBan) { // кэш текущего канала $this->WriteChannelCache($channelId); // кэш модераторов $this->WriteChannelCache(-1); } $message = $moderatorName . ' забанил ' . $banUserName . ' на ' . $banDurationInMin . ' минут.'; $this->WriteSystemMessage($message); $result = array('code' => 1, 'error' => ''); return $result; }