Files
SLikeNet/Samples/PHPDirectoryServer2/lib/RecordManager.class.php
2025-11-24 14:19:51 +05:30

207 lines
5.7 KiB
PHP

<?php
// This file was taken from RakNet 4.082 without any modifications.
// Please see licenses/RakNet license.txt for the underlying license and related copyright.
class RecordManager{
//Constructor just creates the RecordFile.data.php
function RecordManager(){
if(!file_exists(RECORD_FILE)){
$fp = fopen(RECORD_FILE, "w");
fclose($fp);
}
}
//Called everytime you run DirectoryServer.php to expire record values.
function expireRecords(){
//IMPORTANT
//Include the var_export of the variable $records
include("RecordFile.data.php");
if(!empty($records)){
foreach($records as $index => $game){
$secs = time() - $game["__SEC_AFTER_EPOCH_SINCE_LAST_UPDATE"];
if($secs > TIMEOUT){
unset($records[$index]);
}
}
//Save the file
$fp = fopen(RECORD_FILE, "w");
fwrite($fp, '<?php $records = ');
fwrite($fp, var_export($records, true));
fwrite($fp, '; ?>');
fclose($fp);
}
}
function uploadRecords($post_body){
//IMPORTANT
//Include the var_export of the variable $records
include("RecordFile.data.php");
$output = "";
$post_array = array();
//Modified code to handle multiple rows separated by \002
$post_body_rows = explode("\002", $post_body);
foreach($post_body_rows as $row_num => $post_body_row){
//row columns and values are separated by \001
//Even indexes are columns, the following odd value is the column_value
$post_body_array = explode("\001", $post_body_row);
foreach($post_body_array as $index => $post_body_item){
if($index % 2 == 0){
$post_array[$row_num][$post_body_item] = $post_body_array[$index+1];
}
}
}
//This places each value pair into a PHP array to be outputted to the Recordfile
foreach($post_array as $post_item){
if(isset($post_item["__GAME_PORT"]) && isset($post_item["__GAME_NAME"]) ){
$record = array();
foreach($post_item as $key => $value){
//Decode because post values are send with url encoded symbols like %20
$record[$key] = rawurldecode($value);
}
//Store the IP address if not included in the POST
if(!isset($record["__System_Address"])){
$record["__System_Address"] = $_SERVER["REMOTE_ADDR"];
}
$record["__SEC_AFTER_EPOCH_SINCE_LAST_UPDATE"] = time();
//Search the $records for a matching record. If the GAME_PORT, GAME_NAME, and System Address match replace it
//Otherwise just add the record to the $records array.
$record_found = false;
if(!empty($records)){
foreach($records as $index => $save_record){
if($save_record["__GAME_PORT"] == $record["__GAME_PORT"]
&& $save_record["__GAME_NAME"] == $record["__GAME_NAME"]
&& $save_record["__System_Address"] == $record["__System_Address"]){
//We found the record so replace it here.
$records[$index] = $record;
$record_found = true;
break;
}
}
}
//Record couldn't be found simply add a new record
if(!$record_found){
$records[] = $record;
}
//Save the file
$fp = fopen(RECORD_FILE, "w");
fwrite($fp, '<?php $records = ');
fwrite($fp, var_export($records, true));
fwrite($fp, '; ?>');
fclose($fp);
}
else{
$output .= "\003".microtime(true)."\003";
$output .= "__GAME_PORT and __GAME_NAME must be provided";
}
}
return $output;
}
function downloadRecords(){
//IMPORTANT
//Include the var_export of the variable $records
include("RecordFile.data.php");
//Comment prefix
$output = "\003".microtime(true)."\003";
//Output the records. Traverse and output rows separated by \002 and values seperated by \001
if(!empty($records)){
$row_count = 0;
foreach($records as $game){
if(!empty($game)){
if($row_count > 0){
$output .= "\002";
}
$count = 0;
foreach($game as $key => $value){
if($count > 0){
$output .= "\001";
}
$output .= "$key"."\001"."$value";
$count++;
}
}
$row_count++;
}
}
return $output;
}
function generateCss(){
$output = "<html>
<head>
<style type='text/css' media='all'>
.game{
border:1px solid #1E3C64;
background:#4A8AD1;
padding:5px 10px;
color:#EFF7FF;
margin-bottom:5px;
}
</style>
</head>
<body>";
return $output;
}
function viewRecords(){
$output = "";
//IMPORTANT
//Include the var_export of the variable $records
include("RecordFile.data.php");
if(!empty($records)){
foreach($records as $game){
$vars = "";
$secs = $game["__SEC_AFTER_EPOCH_SINCE_LAST_UPDATE"] + TIMEOUT - time();
$output .= "<div class='game' >
<p>Game Port: {$game["__GAME_PORT"]}</p>
<p>Game Name: {$game["__GAME_NAME"]}</p>
<p>System Address: {$game["__System_Address"]}</p>
<p>Time Until Expiration: $secs secs</p>
";
foreach($game as $key => $value){
if($key != "__GAME_PORT" && $key != "__GAME_NAME"
&& $key != "__System_Address" && $key != "__SEC_AFTER_EPOCH_SINCE_LAST_UPDATE" ){
$vars .= "<li>".$key.": $value</li>";
}
elseif($key == "0"){
$vars .= "<li>".$key.": $value</li>";
}
}
if(!empty($vars)){
$output .= "<ul>$vars</ul>";
}
$output .= "</div>";
}
}
else{
$output .= "<div class='game' >
<p>Record Table is Empty.</p>
</div>";
}
$output .= "</body></html>";
return $output;
}
}
?>