reCache = new rowEditor('caches'); $this->reCache->addPKInt('cache_id', null, false, RE_INSERT_AUTOINCREMENT); $this->reCache->addString('uuid', '', false, RE_INSERT_AUTOUUID); $this->reCache->addInt('node', 0, false); $this->reCache->addDate('date_created', time(), true, RE_INSERT_IGNORE); $this->reCache->addDate('last_modified', time(), true, RE_INSERT_IGNORE); $this->reCache->addDate('listing_last_modified', time(), true, RE_INSERT_IGNORE); $this->reCache->addInt('user_id', 0, false); $this->reCache->addString('name', '', false); $this->reCache->addDouble('longitude', 0, false); $this->reCache->addDouble('latitude', 0, false); $this->reCache->addInt('type', 1, false); $this->reCache->addInt('status', 5, false); $this->reCache->addString('country', '', false); $this->reCache->addDate('date_hidden', time(), false); $this->reCache->addInt('size', 1, false); $this->reCache->addFloat('difficulty', 1, false); $this->reCache->addFloat('terrain', 1, false); $this->reCache->addString('logpw', '', false); $this->reCache->addFloat('search_time', 0, false); $this->reCache->addFloat('way_length', 0, false); $this->reCache->addString('wp_oc', null, true); $this->reCache->addString('wp_gc', '', false); $this->reCache->addString('wp_nc', '', false); $this->reCache->addString('desc_languages', '', false, RE_INSERT_IGNORE); $this->reCache->addString('default_desclang', '', false); $this->reCache->addDate('date_activate', null, true); $this->reCache->addInt('need_npa_recalc', 1, false, RE_INSERT_IGNORE); $this->nCacheId = $nNewCacheId+0; if ($nNewCacheId == ID_NEW) { $this->reCache->addNew(null); } else { $this->reCache->load($this->nCacheId); } } function exist() { return $this->reCache->exist(); } function getCacheId() { return $this->nCacheId; } function getStatus() { return $this->reCache->getValue('status'); } function getType() { return $this->reCache->getValue('type'); } function getName() { return $this->reCache->getValue('name'); } function getLongitude() { return $this->reCache->getValue('longitude'); } function getLatitude() { return $this->reCache->getValue('latitude'); } function getUserId() { return $this->reCache->getValue('user_id'); } function getUsername() { return sql_value("SELECT `username` FROM `user` WHERE `user_id`='&1'", '', $this->getUserId()); } function getWPOC() { return $this->reCache->getValue('wp_oc'); } function getWPGC() { return $this->reCache->getValue('wp_gc'); } function getWPNC() { return $this->reCache->getValue('wp_nc'); } function getUUID() { return $this->reCache->getValue('uuid'); } function getDateCreated() { return $this->reCache->getValue('date_created'); } function getLastModified() { return $this->reCache->getValue('last_modified'); } function getListingLastModified() { return $this->reCache->getValue('listing_last_modified'); } function getNode() { return $this->reCache->getValue('node'); } function setNode($value) { return $this->reCache->setValue('node', $value); } function setStatus($value) { global $login; if (sql_value("SELECT COUNT(*) FROM `cache_status` WHERE `id`='&1'", 0, $value) == 1) { sql("SET @STATUS_CHANGE_USER_ID='&1'", $login->userid); return $this->reCache->setValue('status', $value); } else { return false; } } function getDescLanguages() { return explode($this->reCache->getValue('desc_languages'),','); } function getDefaultDescLanguage() { return $this->reCache->getValue('default_desclang'); } function getAnyChanged() { return $this->reCache->getAnyChanged(); } // return if successfull (with insert) function save() { if ($this->reCache->save()) { sql_slave_exclude(); return true; } else return false; } function requireLogPW() { return $this->reCache->getValue('logpw') != ''; } // TODO: use prepared one way hash function validateLogPW($nLogType, $sLogPW) { if ($sLogPW == '') return true; if (sql_value("SELECT `require_password` FROM `log_types` WHERE `id`='&1'", 0, $nLogType) == 0) return true; return ($sLogPW == $this->reCache->getValue('logpw')); } static function visitCounter($nVisitUserId, $sRemoteAddr, $nCacheId) { global $opt, $_SERVER; // delete cache_visits older 1 day 60*60*24 = 86400 sql("DELETE FROM `cache_visits` WHERE `cache_id`='&1' AND `user_id_ip`!='0' AND NOW()-`last_modified`>86400", $nCacheId); if ($nVisitUserId==0) { $se = explode(';',$opt['logic']['search_engines']); $ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ""; foreach ($se as $s) if (strpos($ua,$s) !== FALSE) return; // do not count search engine views $sIdentifier = $sRemoteAddr; } else $sIdentifier = $nVisitUserId; // note the visit of this user sql("INSERT INTO `cache_visits` (`cache_id`, `user_id_ip`, `count`) VALUES (&1, '&2', 1) ON DUPLICATE KEY UPDATE `count`=`count`+1", $nCacheId, $sIdentifier); // if the previous statement does an INSERT, it was the first visit for this user today if (sql_affected_rows() == 1) { if ($nVisitUserId != sql_value("SELECT `user_id` FROM `caches` WHERE `cache_id`='&1'", 0, $nCacheId)) { // increment the counter for this cache sql("INSERT INTO `cache_visits` (`cache_id`, `user_id_ip`, `count`) VALUES (&1, '0', 1) ON DUPLICATE KEY UPDATE `count`=`count`+1", $nCacheId); } } } static function getLogsCount($cacheid) { //prepare the logs $rsLogs = sql("SELECT COUNT(*) FROM `cache_logs` WHERE `cache_id`='&1'", $cacheid); $rLog = sql_fetch_assoc($rsLogs); sql_free_result($rsLogs); return $rLog; } static function getLogsArray($cacheid, $start, $count, $deleted=false) { global $login; //prepare the logs if ($deleted && ($login->admin && ADMIN_USER)>0) { // admins may view owner-deleted logs $table = 'cache_logs_archived'; $delfields = 'IFNULL(`u2`.`username`,"") AS `deleted_by_name`, `deletion_date`, "1" AS `deleted`'; $addjoin = 'LEFT JOIN `user` `u2` ON `u2`.`user_id`=`cache_logs`.`deleted_by`'; } else { $table = 'cache_logs'; $delfields = '"" AS `deleted_by_name`, NULL AS `deletion_date`, "0" AS `deleted`'; $addjoin = ''; } $rsLogs = sql(" SELECT `cache_logs`.`user_id` AS `userid`, `cache_logs`.`id` AS `id`, `cache_logs`.`uuid` AS `uuid`, `cache_logs`.`date` AS `date`, substr(`cache_logs`.`date`,12) AS `time`, /* 00:00:01 = 00:00 logged, 00:00:00 = no time */ `cache_logs`.`type` AS `type`, `cache_logs`.`oc_team_comment` AS `oc_team_comment`, `cache_logs`.`text` AS `text`, `cache_logs`.`text_html` AS `texthtml`, `cache_logs`.`picture`, ".$delfields.", `user`.`username` AS `username`, IF(ISNULL(`cache_rating`.`cache_id`), 0, `cache_logs`.`type` IN (1,7)) AS `recommended` FROM $table AS `cache_logs` INNER JOIN `user` ON `user`.`user_id` = `cache_logs`.`user_id` LEFT JOIN `cache_rating` ON `cache_logs`.`cache_id`=`cache_rating`.`cache_id` AND `cache_logs`.`user_id`=`cache_rating`.`user_id` ".$addjoin." WHERE `cache_logs`.`cache_id`='&1' ORDER BY `cache_logs`.`date` DESC, `cache_logs`.`Id` DESC LIMIT &2, &3", $cacheid, $start+0, $count+0); $logs = array(); while ($rLog = sql_fetch_assoc($rsLogs)) { $pictures = array(); $rsPictures = sql("SELECT `url`, `title`, `uuid`, `id`, `spoiler` FROM `pictures` WHERE `object_id`='&1' AND `object_type`=1", $rLog['id']); while ($rPicture = sql_fetch_assoc($rsPictures)) $pictures[] = $rPicture; sql_free_result($rsPictures); $rLog['pictures'] = $pictures; $logs[] = $rLog; } sql_free_result($rsLogs); return $logs; } function report($userid, $reportreason, $reportnote) { sql("INSERT INTO cache_reports (`cacheid`, `userid`, `reason`, `note`) VALUES(&1, &2, &3, '&4')", $this->nCacheId, $userid, $reportreason, $reportnote); return true; } function addAdoption($userid) { if ($this->allowEdit() == false) return "noaccess"; if (sql_value("SELECT COUNT(*) FROM `user` WHERE `user_id`='&1'", 0, $userid) == 0) return "userunknown"; if (sql_value("SELECT COUNT(*) FROM `user` WHERE `user_id`='&1' AND `is_active_flag`=1", 0, $userid) == 0) return "userdisabled"; // same user? if ($this->getUserId() == $userid) return "self"; sql("INSERT IGNORE INTO `cache_adoption` (`cache_id`, `user_id`) VALUES ('&1', '&2')", $this->nCacheId, $userid); return true; } function cancelAdoption($userid) { global $login; if ($this->allowEdit() == false && $login->userid != $userid) return false; sql("DELETE FROM `cache_adoption` WHERE `user_id`='&1' AND `cache_id`='&2'", $userid, $this->nCacheId); return true; } function commitAdoption($userid) { global $login; // cache_adoption exists? if (sql_value("SELECT COUNT(*) FROM `cache_adoption` WHERE `cache_id`='&1' AND `user_id`='&2'", 0, $this->nCacheId, $userid) == 0) return false; // new user active? if (sql_value("SELECT `is_active_flag` FROM `user` WHERE `user_id`='&1'", 0, $userid) != 1) return false; sql("INSERT INTO `logentries` (`module`, `eventid`, `userid`, `objectid1`, `objectid2`, `logtext`) VALUES ('cache', 5, '&1', '&2', '&3', '&4')", $login->userid, $this->nCacheId, 0, 'Cache ' . sql_escape($this->nCacheId) . ' has changed the owner from userid ' . sql_escape($this->getUserId()) . ' to ' . sql_escape($userid) . ' by ' . sql_escape($login->userid)); sql("UPDATE `caches` SET `user_id`='&1' WHERE `cache_id`='&2'", $userid, $this->nCacheId); sql("DELETE FROM `cache_adoption` WHERE `cache_id`='&1'", $this->nCacheId); $this->reCache->setValue('user_id', $userid); return true; } // true if anyone can view the cache function isPublic() { return (sql_value("SELECT `allow_user_view` FROM `cache_status` WHERE `id`='&1'", 0, $this->getStatus()) == 1); } function allowView() { global $login; if ($this->isPublic()) return true; $login->verify(); if (($login->admin & ADMIN_USER) == ADMIN_USER) return true; else if ($this->getUserId() == $login->userid) return true; return false; } function allowEdit() { global $login; $login->verify(); if ($this->getUserId() == $login->userid) return true; return false; } function allowLog() { global $login; $login->verify(); if ($this->getUserId() == $login->userid) return true; return (sql_value("SELECT `allow_user_log` FROM `cache_status` WHERE `id`='&1'", 0, $this->getStatus()) == 1); } function isRecommendedByUser($nUserId) { return (sql_value("SELECT COUNT(*) FROM `cache_rating` WHERE `cache_id`='&1' AND `user_id`='&2'", 0, $this->nCacheId, $nUserId) > 0); } function addRecommendation($nUserId) { // rating_date will be set to NOW() by Insert-trigger sql("INSERT IGNORE INTO `cache_rating` (`cache_id`, `user_id`) VALUES ('&1', '&2')", $this->nCacheId, $nUserId); } function removeRecommendation($nUserId) { sql("DELETE FROM `cache_rating` WHERE `cache_id`='&1' AND `user_id`='&2'", $this->nCacheId, $nUserId); } // retrieves admin cache history data and stores it to template variables // for display by adminhistory.tpl and adminreports.tpl function setTplHistoryData($exclude_report_id) { global $opt, $tpl; // (other) reports for this cache $rs = sql("SELECT `cr`.`id`, `cr`.`date_created`, `cr`.`lastmodified`, `cr`.`userid`, `cr`.`adminid`, `users`.`username` AS `usernick`, `admins`.`username` AS `adminnick`, IFNULL(`tt`.`text`, `crs`.`name`) AS `status`, IFNULL(`tt2`.`text`, `crr`.`name`) AS `reason` FROM `cache_reports` AS `cr` LEFT JOIN `cache_report_reasons` AS `crr` ON `cr`.`reason`=`crr`.`id` LEFT JOIN `user` AS `users` ON `users`.`user_id`=`cr`.`userid` LEFT JOIN `user` AS `admins` ON `admins`.`user_id`=`cr`.`adminid` LEFT JOIN `cache_report_status` AS `crs` ON `cr`.`status`=`crs`.`id` LEFT JOIN `sys_trans_text` AS `tt` ON `crs`.`trans_id`=`tt`.`trans_id` AND `tt`.`lang`='&2' LEFT JOIN `sys_trans_text` AS `tt2` ON `crr`.`trans_id`=`tt2`.`trans_id` AND `tt2`.`lang`='&2' WHERE `cr`.`cacheid`='&1' AND `cr`.`id`<>'&3' ORDER BY `cr`.`status`,`cr`.`id` DESC", $this->getCacheId(), $opt['template']['locale'], $exclude_report_id); $tpl->assign_rs('reports',$rs); sql_free_result($rs); // user; deleted logs $rs = sql("SELECT * FROM `caches` WHERE `cache_id`='&1'", $this->getCacheId()); $rCache = sql_fetch_array($rs); $tpl->assign('cache', $rCache); sql_free_result($rs); $tpl->assign('ownername', sql_value("SELECT `username` FROM `user` WHERE `user_id`='&1'", "", $rCache['user_id'])); $tpl->assign('deleted_logs', $this->getLogsArray($this->getCacheId(), 0, 1000, true)); // status changes $rs = sql("SELECT `csm`.`date_modified`, `csm`.`old_state` AS `old_status_id`, `csm`.`new_state` AS `new_status_id`, `user`.`username`, IFNULL(`stt_old`.`text`,`cs_old`.`name`) AS `old_status`, IFNULL(`stt_new`.`text`,`cs_new`.`name`) AS `new_status` FROM `cache_status_modified` `csm` LEFT JOIN `cache_status` `cs_old` ON `cs_old`.`id`=`csm`.`old_state` LEFT JOIN `sys_trans_text` `stt_old` ON `stt_old`.`trans_id`=`cs_old`.`trans_id` AND `stt_old`.`lang`='&2' LEFT JOIN `cache_status` `cs_new` ON `cs_new`.`id`=`csm`.`new_state` LEFT JOIN `sys_trans_text` `stt_new` ON `stt_new`.`trans_id`=`cs_new`.`trans_id` AND `stt_new`.`lang`='&2' LEFT JOIN `user` ON `user`.`user_id`=`csm`.`user_id` WHERE `cache_id`='&1' ORDER BY `date_modified` DESC", $this->getCacheId(), $opt['template']['locale']); $tpl->assign_rs('status_changes',$rs); sql_free_result($rs); } } ?>