diff --git a/includes/SmartLine/ZedCommands.php b/includes/SmartLine/ZedCommands.php --- a/includes/SmartLine/ZedCommands.php +++ b/includes/SmartLine/ZedCommands.php @@ -1,464 +1,463 @@ <?php /** * Zed SmartLine commands. * * Zed. The immensity of stars. The HyperShip. The people. * * (c) 2010, Dereckson, some rights reserved. * Released under BSD license. * * This is the SmartLine subcontroller. * * The SmartLine is a widget allowing to add some basic CLI capability. * * It executes any command given in GET or POST request (parameter C). * * This files also provides SmartLine history helper: a method log_C to log * a SmartLine command and some procedural code assigning a SmartLineHistory. * * This code is inspired from Viper, a corporate PHP intranet I wrote in 2004. * There, the SmartLine allowed to change color theme or to find quickly user, * account, order or server information in a CRM context. * * @package Zed * @subpackage SmartLine * @author Sébastien Santoro aka Dereckson <dereckson@espace-win.org> * @copyright 2010 Sébastien Santoro aka Dereckson * @license http://www.opensource.org/licenses/bsd-license.php BSD * @version 0.1 * @link http://scherzo.dereckson.be/doc/zed * @link http://zed.dereckson.be/ * @filesource * * @todo SettingsSmartLineCommand - understand why dojo floating pane isn't rendered if we est $controller instead to redirect */ /// /// Register commands /// $smartLine->register_object('goto', 'GotoSmartLineCommand'); $smartLine->register_object('guid', 'GUIDSmartLineCommand'); $smartLine->register_object('invite', 'InviteSmartLineCommand'); $smartLine->register_object('invites', 'InviteSmartLineCommand'); $smartLine->register_object('list', 'ListSmartLineCommand'); $smartLine->register_object('requests', 'RequestsSmartLineCommand'); $smartLine->register_object('settings', 'SettingsSmartLineCommand'); $smartLine->register_object('unixtime', 'UnixTimeSmartLineCommand'); $smartLine->register_object('version', 'VersionSmartLineCommand'); $smartLine->register_object('whereami', 'WhereAmISmartLineCommand'); /// /// Help (todo: move $lang array in lang folder) /// $lang['Help']['goto'] = "Go to a location"; $lang['Help']['guid'] = "Generate a GUID"; $lang['Help']['invite'] = "Generate an invite. To see the generated invites, invite list."; $lang['Help']['list'] = "Lists specified objects (bodies, locations or places)"; $lang['Help']['requests'] = "Checks if there are waiting requests"; $lang['Help']['settings'] = 'Go to settings page'; $lang['Help']['unixtime'] = "Prints current unixtime (seconds elapsed since 1970-01-01 00:00, UTC) or the specified unixtime date."; $lang['Help']['version'] = "Gets Zed's software version info (Mercurial repository version, node id and if you're on the dev or prod site)"; $lang['Help']['whereami'] = "Where am I?"; /** * The goto command * * Moves to the current perso to the specified location. */ class GotoSmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { global $CurrentPerso; if ($argc == 1) { $this->SmartLine->puts("Where do you want to go?", STDERR); return; } require_once("includes/geo/location.php"); $here = new GeoLocation($CurrentPerso->location_global, $CurrentPerso->location_local); try { $place = new GeoLocation($argv[1]); if ($place->equals($CurrentPerso->location_global)) { $this->SmartLine->puts("You're already there."); return; } } catch (Exception $ex) { //Global location failed, trying local location try { $place = new GeoLocation($CurrentPerso->location_global, $argv[1]); } catch (Exception $ex) { $this->SmartLine->puts($ex->getMessage(), STDERR); return; } if ($place->equals($here)) { $this->SmartLine->puts("You're already there."); return; } } //Determines if the place exists if (!$place->exists()) { $this->SmartLine->puts("This place doesn't seem to exist."); return; } //Could we really go there? require_once("includes/travel/travel.php"); $travel = Travel::load(); if (!$travel->can_travel($here, $place)) { $this->SmartLine->puts("You can't reach that location."); return; } $CurrentPerso->move_to($place->global, $place->local); $this->SmartLine->puts("You travel to that location."); return; } } /** * The GUID command * * Prints a new GUID. * * guid 8 will print 8 guid */ class GUIDSmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { if ($argc > 1 && is_numeric($argv[1])) { for ($i = 0 ; $i < $argv[1] ; $i++) { $this->SmartLine->puts(new_guid()); } return; } $this->SmartLine->puts(new_guid()); } } /** * The invite command * * Manages invites. * * invite [add] * creates a new invite code * * invite del <invite code> * deletes the specified invite * * invite list * prints current invite codes */ class InviteSmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { require_once('includes/objects/invite.php'); global $CurrentUser, $CurrentPerso; $command = ($argc > 1) ? strtolower($argv[1]) : ''; switch ($command) { case 'list': $codes = Invite::get_invites_from($CurrentPerso->id); if (!count($codes)) { $this->SmartLine->puts("No invite code."); } else { foreach ($codes as $code) { $this->SmartLine->puts($code); } } break; case 'add': case '': $code = Invite::create($CurrentUser->id, $CurrentPerso->id); $url = get_server_url() . get_url('invite', $code); $this->SmartLine->puts("New invite code created: $code<br />Invite URL: $url"); break; case 'del': $code = $argv[2]; if (!preg_match("/^([A-Z]){3}([0-9]){3}$/i", $code)) { $this->SmartLine->puts("Invalid code format. Use invite list to get all your invite codes.", STDERR); } else { $invite = new Invite($code); if ($CurrentPerso->id == $invite->from_perso_id) { $invite->delete(); $this->SmartLine->puts("Deleted"); } else { $this->SmartLine->puts("Invalid code. Use invite list to get all your invite codes.", STDERR); } } break; default: $this->SmartLine->puts("Usage: invite [add|list|del <code>]", STDERR); break; } } } /** * The list command * * Prints a list of bodies, locations or places. * * This can easily be extended to output any list from any table. */ class ListSmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { if ($argc == 1) { $this->SmartLine->puts("Available lists: bodies, locations, places"); return; } switch ($objects = $argv[1]) { case 'bodies': $list = $this->get_list(TABLE_BODIES, "CONCAT('B', body_code)", "body_name"); $this->SmartLine->puts($list); break; case 'locations': $list = $this->get_list(TABLE_LOCATIONS, "location_code", "location_name"); $this->SmartLine->puts($list); break; case 'places': if ($argv[2] == "-a" || $argv[2] == "--all") { //Global bodies places list $list = $this->get_list(TABLE_PLACES, "CONCAT('B', body_code, place_code)", "place_name"); } else { //Local places (or equivalent) list global $CurrentPerso; switch ($CurrentPerso->location_global[0]) { case 'B': $body_code = substr($CurrentPerso->location_global, 1, 5); $list = $this->get_list(TABLE_PLACES, "CONCAT('B', body_code, place_code)", "place_name", "body_code = $body_code"); break; case 'S': $this->SmartLine->puts("I don't have a map of the spaceship.", STDERR); return; default: $this->SmartLine->puts("Unknown location type. Can only handle B or S.", STDERR); return; } } $this->SmartLine->puts($list); break; default: $this->SmartLine->puts("Unknown objects to list: $objects", STDERR); } } /** * Gets a custom list from the specified table and fields. * * The list will ascendingly ordered by the specified key. * * @param $table the table to query from the database * @param $key the first field to fetch, as key * @param $value the second field to fetch, as value * @param $where the WHERE clause, without the WHERE keyword (optionnal) */ public function get_list ($table, $key, $value, $where = null) { global $db; $sql = "SELECT $key as `key`, $value as value FROM $table "; if ($where) $sql .= "WHERE $where "; $sql .= "ORDER BY `key` ASC"; if (!$result = $db->sql_query($sql)) { message_die(SQL_ERROR, "Unable to fetch list", '', __LINE__, __FILE__, $sql); } while ($row = $db->sql_fetchrow($result)) { $rows .= "<tr><td>$row[key]</td><td>$row[value]</td></tr>"; } $this->SmartLine->truncate(STDERR); //kludge return "<table cellspacing=\"8\"><thead style=\"color: white\" scope=\"row\"><tr><th>Key</th><th>Value</th></thead><tbody>$rows</tbody></table>"; } } /** * The requests command * * Redirects user the the requests page. * * By default only redirect if a flag indicates there's a new request. * * To forcefully goes to the request page, requests --force */ class RequestsSmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { global $CurrentPerso; $force = ($argc > 1) && ($argv[1] == "-f" || $argv[1] == "--force"); if ($force || (array_key_exists('site.requests', $CurrentPerso->flags) && $CurrentPerso->flags['site.requests'])) { global $controller; $controller = 'controllers/persorequest.php'; } else { $this->SmartLine->puts("No request waiting."); } } } /** * The settings command * * Redirects user the the settings page. */ class SettingsSmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { if (headers_sent()) { global $controller; $controller = 'controllers/settings.php'; } else { header('location: ' . get_url('settings')); } } } /** * The unixtime command * * Prints current unixtime (seconds elapsed since 1970-01-01 00:00, UTC) * or if an unixtime is specified as argument, the matching date. */ class UnixTimeSmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { date_default_timezone_set('UTC'); if ($argc == 1) { $this->SmartLine->puts(time()); } elseif ($argc == 2 && is_numeric($argv[1])) { $this->SmartLine->puts(strftime("%Y-%m-%d %X", $argv[1])); $this->SmartLine->puts(get_hypership_time($argv[1])); } else { array_shift($argv); $date = implode(' ', $argv); if ($time = strtotime($date) !== false) { $this->SmartLine->puts("Unixtime from $date: <span class=\"highlight\">$time</span>"); } else { $this->SmartLine->puts("$date isn't a unixtime nor a valid date strtotime is able to parse.", STDERR); } } } } /** * The version command * * Prints current hg revision, if we're in prod or dev environement and * the current revision's hash. * * The version and env information is extracted from * .hg/tags.cache (indicating we're in a Mercurial repo and so in a dev environment), or from - * .hg_archival.txt file (indicating we've deployed code in a production environement) - * + * version.txt file (indicating we've deployed code in a production environement) + * * e.g. r130 (development environment) - * Hash: 057bf394741706fd2136541e3bb07c9e60b4963d + * Hash: 057bf394741706fd2136541e3bb07c9e60b4963d */ class VersionSmartLineCommand extends SmartLineCommand { /** * Runs the command - * + * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { //Gets .hg revision if (file_exists('.hg/tags.cache')) { $content = file_get_contents('.hg/tags.cache'); $info = explode(' ', $content, 2); $info[] = "development environment"; - } else if (file_exists('.hg_archival.txt')) { - $content = file('.hg_archival.txt'); - foreach ($content as $line) { - $items = explode(' ', $line, 2); - if ($items[0] == 'node:') $info[1] = trim($items[1]); - if ($items[0] == 'latesttagdistance:') $info[0] = trim($items[1]); - $info[2] = 'production environment'; - } + + $this->SmartLine->puts("r$info[0] ($info[2])"); + $this->SmartLine->puts("Hash: $info[1]"); + } else if (file_exists('version.txt')) { + $content = file('version.txt'); + foreach ($content as $line) { + $this->SmartLine->puts($line); + } } else { $this->SmartLine->puts("No version information available.", STDERR); return false; } - - $this->SmartLine->puts("r$info[0] ($info[2])"); - $this->SmartLine->puts("Hash: $info[1]"); + + return true; } } /** * The whereami (Where am I?) command * * Prints current position, e.g. B00001001 - Tour, Hypership */ class WhereAmISmartLineCommand extends SmartLineCommand { /** * Runs the command * * @param array $argv an array of string, each item a command argument * @param int $argc the number of arguments */ public function run ($argv, $argc) { global $CurrentPerso; require_once("includes/geo/location.php"); $place = new GeoLocation($CurrentPerso->location_global); $this->SmartLine->puts($CurrentPerso->location_global . ' - ' . $place); } } -?> \ No newline at end of file +?>