This repository has been archived on 2024-07-18. You can view files and clone it, but cannot push or open issues or pull requests.
lwb5/scripts/ticks.php

113 lines
3 KiB
PHP

<?php
/********************************
* LEGACY WORLDS - TICK MANAGER *
********************************/
/* Checks for fork() */
if (!(function_exists('pcntl_fork') || $__runFromAdmin)) {
die("This script may not be called from the web server.\n");
}
/* If we're running from an administration script, go to the appropriate directory */
if ($__runFromAdmin) {
$oldDir = getcwd();
chdir(dirname(__FILE__));
}
/* Load the required libraries */
$__logPrefix = "lwTicks";
$__loader = array(
'log', 'classloader',
'version', 'game', 'tick', 'config',
'db_connection', 'db_accessor', 'db_copy', 'db',
'pcheck', 'library', 'tick_manager',
);
require_once("loader.inc");
if ($__runFromAdmin) {
/* If we're being executed from an administration script,
* we need to manually run a tick on a game.
*/
list($gName, $tName) = $__adminParams;
l::setSyslogPrefix("lwControl");
function __adminFatalError($errno, $errorText, $information) {
foreach ($information as $it) {
$errorText .= "<br/>$it";
}
$bt = debug_backtrace();
array_shift($bt); // Remove this function
array_shift($bt); // Remove eval in lib/log.inc
$errorText .= "<br/><u>Backtrace to the error:</u><pre>";
$base = dirname(config::$main['scriptdir']);
foreach ($bt as $data) {
$str = "... " . str_repeat(' ', strlen($data['class']) > 30 ? 1 : (31 - strlen($data['class'])))
. $data['class'] . " :: " . $data['function'];
if (!is_null($data['file'])) {
$str .= str_repeat(' ', strlen($data['function']) > 25 ? 1 : (26 - strlen($data['function'])));
$fn = preg_replace("#^$base/#", "", $data['file']);
$str .= " (line {$data['line']}, file '$fn')";
}
$errorText .= "$str\n";
}
$errorText .= "</pre>";
throw new Exception($errorText);
}
l::setFatalHandler('__adminFatalError');
try {
dbConnect();
$game = config::getGame($gName);
if (is_null($game)) {
throw new Exception("Game '$gName' not found");
}
l::notice("administration script executing tick {$gName}::{$tName}");
$game->getDBAccess();
$game->runTick($tName, true);
l::notice("tick {$gName}::{$tName} executed");
dbClose();
} catch (Exception $e) {
$argh = $e->getMessage();
}
chdir($oldDir);
return;
} else {
l::setSyslogPrefix("lwTicks");
if (count($argv) > 1) {
/* Checks for command line arguments */
if ($argv[1] == "-r" && count($argv) == 4) {
$game = $argv[2];
$tick = $argv[3];
dbConnect();
$game = config::getGame($argv[2]);
if (is_null($game)) {
die("Error: game {$argv[2]} not found");
}
l::notice("manually executing {$argv[2]}::{$argv[3]}");
$game->getDBAccess();
$game->runTick($argv[3], true);
l::notice("{$argv[2]}::{$argv[3]} executed");
dbClose();
exit(0);
} elseif ($argv[1] != "-d") {
die("Syntax: {$argv[0]}\n\t -> to run as a daemon\n\t{$argv[0]} -d\n\t -> to run in debugging mode\n\t{$argv[0]} -r <game> <tick>\n\t -> to run a tick manually\n");
}
} else {
/* Starts the main thread */
new tick_manager($argv[1] == "-d");
}
}
?>