/** * получение данных по модераторам и запись их в 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); }
/** * настройка на использование базы */ public function SetDatabase($db = '') { // если указана база, используем ее if (is_object($db)) { $this->db = $db; } else { // и база еще не была настроена, настраиваем ее if (!isset($this->db)) { $this->db = GetDb(); } } }
function getPager($sql_count, $sql_query, $page, $pagesize, $isall = true) { if (!$db) { $db = GetDb(); } $querycount = $db->query($sql_count); $num = mysql_num_rows($querycount); $result = array(); if (isall) { $startindex = ($page - 1) * $pagesize; //开始位置 $sql_query = $sql_query . " limit " . $startindex . "," . $pagesize; $query = $db->query($sql_query); while ($rows = $db->fetch_array($query)) { $result[] = $rows; } } $db->close(); return array("count" => $num, "list" => $result, "range" => $startindex . "-" . ($startindex + $pagesize)); }
<?php require_once 'core.php'; header('Content-Type: application/javascript'); $db = GetDb(); $smilesResult = $db->Query('SELECT * FROM chat_smile ORDER BY `page` ASC, `sid` ASC'); if ($smilesResult === FALSE) { SaveForDebug('Fetching smiles failed'); return; } $smiles = array(); while ($smile = $smilesResult->fetch_assoc()) { $smile['roles'] = array(); $smiles[$smile['code']] = $smile; } $rolesResult = $db->Query('SELECT * FROM role_smiles'); if ($rolesResult === FALSE) { SaveForDebug('Fetching role smiles failed'); return; } $smile_roles = array(); while ($role = $rolesResult->fetch_assoc()) { $rid = intval($role['rid']); foreach (explode(',', $role['smiles']) as $smile) { if (array_key_exists($smile, $smiles)) { $smiles[$smile]['roles'][] = $rid; } } } $public = array(); $private = array();
function OnGetBussionessSubItem() { ShowMsg("OnGetBussionessSubItem"); $industyid = $_GET['id']; //global $db; //global $dbaddr, $dbuser, $dbpwd, $dbname; $db = GetDb(); if (null == $db) { ShowMsg("db created new in fun ."); $db = new db_sql(); $db->connect($dbaddr, $dbuser, $dbpwd, $dbname); } $sql = "select * from tb_bussinesssub where businessid='" . $industyid . "'"; ShowMsg("query db width ." . $sql); $query = $db->query($sql); if (!$query) { echo GetErrorResult("GET_BU_SUB_ITEM", 2); return; } $count = $db->num_rows($query); if ($count < 0) { echo GetErrorResult("GET_BU_SUB_ITEM", 3); return; } ShowMsg("sql return count " . $count); $writer = new DhcXmlWriter(); if (!$writer) { echo GetErrorResult("GET_BU_SUB_ITEM", 4); return TRUE; } $writer->AddXmlMsg("GET_BU_SUB_ITEM"); $writer->AddXmlNode("RESULT"); $writer->AddXmlAttribute("Code", 0); ShowMsg("begin to send result\r\n"); while ($rows = $db->fetch_array($query)) { $writer->AddXmlNode("CHECK_ITEM"); $writer->AddXmlAttribute("bussinesssubid", $rows['bussinesssubid']); $writer->AddXmlAttribute("bussinesssubname", $rows['bussinesssubname']); ////iconv("utf-8", "gbk",$rows['businessname'])); } $xml = $writer->GetXmlData(); unset($writer); if (!$xml) { SShowMsg("xml data error."); return 13; } if (strlen($xml) < 10) { ShowMsg("xml data length error." . strlen($xml)); return 14; } ShowMsg("begin to send result\r\n"); $db->close(); echo $xml; return TRUE; }
/** * получение истории * @param channelId id канала * @param startDate дата начала * @param endDate дата конца * @param userNames имена пользователей, разделенные ; * @param boolean isModeratorRequest флаг true, если запрос от модератора, иначе false * @param historyCache имя файла для сохранения кэша, если не задано, будет * использоваться */ public function Get($channelId, $startDate, $endDate, $userNames = '', $isModeratorRequest = false, $historyCache = '') { if ($isModeratorRequest == true) { $timeDifference = CHAT_HISTORY_MAX_TIME_DIFFERENCE_MODERATOR; } else { $timeDifference = CHAT_HISTORY_MAX_TIME_DIFFERENCE; } $startDate = $this->PrepareDate($startDate); $endDate = $this->PrepareDate($endDate); $startTime = strtotime($startDate); $endTime = strtotime($endDate); if ($startTime === FALSE || $endTime === FALSE || $endTime - $startTime > $timeDifference) { $result = array('messages' => '', 'error' => CHAT_HISTORY_CHECK_PARAMS); return $result; } $options = ''; $userNamesCopy = ''; if ($userNames != '') { $userNames = $this->PrepareUserNames($userNames); $userNamesCopy = $userNames; $userNames = explode(';', $userNames); if (count($userNames) > 0) { $options = '('; $operator = ''; $this->db = GetDb(); foreach ($userNames as $userName) { list($userName) = $this->db->PrepareParams($userName); // если длина логина больше максимальной, прислали что-то не то if (mb_strlen($userName) > CHAT_MAX_USERNAME_LENGTH) { SaveForDebug($userNamesCopy . "\n\n" . $userName); $result = array('messages' => '', 'error' => CHAT_USERNAME_TOO_LONG); return $result; } $options .= $operator . 'name="' . $userName . '"'; if ($operator === '') { $operator = ' OR '; } } $options .= ') AND '; } } if (!($channelId == '' || $channelId == 'all')) { $channelId = (int) $channelId; $options .= 'channelId = "' . $channelId . '" AND '; } $queryString = ' SELECT id, chat_message.uid, name, message, date, channelId, ( SELECT IFNULL(( SELECT min(rid) FROM users_roles WHERE users_roles.uid = chat_message.uid), 2 ) ) as rid FROM chat_message INNER JOIN users using(uid) WHERE ' . $options . ' date BETWEEN STR_TO_DATE("' . $startDate . '", "%Y-%m-%d %H:%i:%s") AND STR_TO_DATE("' . $endDate . '", "%Y-%m-%d %H:%i:%s") AND deletedBy is NULL'; //echo '<!--' . $queryString . '-->';exit; $this->db = GetDb(); $queryResult = $this->db->Query($queryString); if ($queryResult === false) { SaveForDebug($queryResult); $result = array('messages' => '', 'error' => CHAT_RUNTIME_ERROR . ' history 1'); return $result; } $messages = array(); while ($msg = $queryResult->fetch_assoc()) { $messages[] = $msg; } $dataJson = json_encode(array('messages' => $messages)); if ($historyCache == '') { $historyCache = $channelId . '_' . $startDate . '_' . $endDate . '_' . $userNamesCopy . '.json'; $historyCache = preg_replace('#[\\s]+#uis', '_', $historyCache); } $historyCache = CHAT_HISTORY_MEMFS_DIR . '/' . $historyCache; file_put_contents($historyCache, $dataJson); $historyCacheGz = $historyCache . '.gz'; $historyCacheGzFile = gzopen($historyCacheGz, 'w'); gzwrite($historyCacheGzFile, $dataJson); gzclose($historyCacheGzFile); $result = array('messages' => $messages, 'error' => ''); return $result; }
/** * получение истории автомодерации * @param int channelId id канала * @param string startDate дата начала * @param string endDate дата конца * @param string userNames имена модераторов, разделенные ; * @param string bannedNickNames имена забаненных пользователей, разделенные ; * @param boolean isModeratorRequest флаг true, если запрос от модератора, иначе false * @param string historyCache имя файла для сохранения кэша, если не задано, будет * использоваться last.json */ public function Get($channelId, $startDate, $endDate, $userNames = '', $bannedNickNames = '', $isModeratorRequest = false, $historyCache = '') { if ($isModeratorRequest == true) { $timeDifference = CHAT_HISTORY_MAX_TIME_DIFFERENCE_MODERATOR; } else { $timeDifference = CHAT_HISTORY_MAX_TIME_DIFFERENCE; } $startDate = $this->PrepareDate($startDate); $endDate = $this->PrepareDate($endDate); $startTime = strtotime($startDate); $endTime = strtotime($endDate); if ($startTime === FALSE || $endTime === FALSE || $endTime - $startTime > $timeDifference) { $result = array('messages' => '', 'error' => CHAT_HISTORY_CHECK_PARAMS); return $result; } $options = ''; $userNamesCopy = ''; if ($userNames != '') { $userNames = $this->PrepareNickNames($userNames); $userNamesCopy = $userNames; $userNames = explode(';', $userNames); if (count($userNames) > 0) { $options = '('; $operator = ''; $this->db = GetDb(); foreach ($userNames as $currentNick) { list($currentNick) = $this->db->PrepareParams($currentNick); // если длина логина больше максимальной, прислали что-то не то if (mb_strlen($currentNick) > CHAT_MAX_USERNAME_LENGTH) { SaveForDebug($userNamesCopy . "\n\n" . $currentNick); $result = array('messages' => '', 'error' => CHAT_USERNAME_TOO_LONG); return $result; } $options .= $operator . ' mu.name = "' . $currentNick . '"'; if ($operator === '') { $operator = ' OR '; } } $options .= ') AND '; } } $bannedNickNamesCopy = ''; if ($bannedNickNames != '') { $bannedNickNames = $this->PrepareNickNames($bannedNickNames); $bannedNickNamesCopy = $bannedNickNames; $bannedNickNames = explode(';', $bannedNickNames); if (count($bannedNickNames) > 0) { $options .= '('; $operator = ''; $this->db = GetDb(); foreach ($bannedNickNames as $currentNick) { list($currentNick) = $this->db->PrepareParams($currentNick); // если длина логина больше максимальной, прислали что-то не то if (mb_strlen($currentNick) > CHAT_MAX_USERNAME_LENGTH) { SaveForDebug($userNamesCopy . "\n\n" . $currentNick); $result = array('messages' => '', 'error' => CHAT_USERNAME_TOO_LONG); return $result; } $options .= $operator . ' ru.name = "' . $currentNick . '"'; if ($operator === '') { $operator = ' OR '; } } $options .= ') AND '; } } $channelOptions = ''; if (!($channelId == '' || $channelId == 'all')) { $channelId = (int) $channelId; $options .= 'channelId = "' . $channelId . '" AND '; } $queryString = ' SELECT chat_ban.id, ru.uid as bannedUserId, ru.name as userName, chat_ban.banExpirationTime, chat_ban.banMessageId, chat_ban.banTime, chat_ban.banDuration, chat_ban.banModificationUserId, chat_message.message as bannedForMessage, chat_ban.status as chatBanStatus, chat_ban.banReasonId, mu.name as moderatorName, banModificationReason FROM chat_ban INNER JOIN users AS ru ON ru.uid = chat_ban.uid INNER JOIN users AS mu ON mu.uid = chat_ban. moderatorId LEFT OUTER JOIN chat_message on chat_message.id = banMessageId WHERE ' . $options . ' banTime BETWEEN "' . strtotime($startDate) . '" AND "' . strtotime($endDate) . '"'; //echo '<!--' . $queryString . '-->'; $this->db = GetDb(); $queryResult = $this->db->Query($queryString); if ($queryResult === false) { SaveForDebug($queryResult); $result = array('messages' => '', 'error' => CHAT_RUNTIME_ERROR . ' am history 1'); return $result; } $messages = array(); while ($msg = $queryResult->fetch_assoc()) { $messages[] = $msg; } $dataJson = json_encode(array('messages' => $messages)); if ($historyCache == '') { $historyCache = $channelId . '_' . $startDate . '_' . $endDate . '_' . $userNamesCopy . '_' . $bannedNickNamesCopy . '.json'; $historyCache = preg_replace('#[\\s]+#uis', '_', $historyCache); } $historyCache = CHAT_AUTOMODERATION_HISTORY_MEMFS_DIR . '/' . $historyCache; file_put_contents($historyCache, $dataJson); $historyCacheGz = $historyCache . '.gz'; $historyCacheGzFile = gzopen($historyCacheGz, 'w'); gzwrite($historyCacheGzFile, $dataJson); gzclose($historyCacheGzFile); $result = array('messages' => $messages, 'error' => ''); return $result; }