Page Menu
Home
Code
Search
Configure Global Search
Log In
Files
F211119
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
16 KB
Subscribers
None
View Options
diff --git a/includes/SmartLine/ZedCommands.php b/includes/SmartLine/ZedCommands.php
--- a/includes/SmartLine/ZedCommands.php
+++ b/includes/SmartLine/ZedCommands.php
@@ -1,340 +1,464 @@
<?php
-/*
- * Zed
- * (c) 2010, Dereckson, some rights reserved
- * Released under BSD license
+/**
+ * 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).
*
- * SmartLine
+ * This files also provides SmartLine history helper: a method log_C to log
+ * a SmartLine command and some procedural code assigning a SmartLineHistory.
*
- * TODO: SettingsSmartLineCommand - understand why dojo floating pane isn't
- * rendered if we est $controller instead to redirect
+ * 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('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('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?";
-///
-/// goto
-///
+/**
+ * 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;
}
}
-///
-/// GUID
-///
-
+/**
+ * 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());
}
}
-///
-/// invite
-///
-
+/**
+ * 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;
}
}
}
-///
-/// list
-///
-
+/**
+ * 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);
+ $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>";
}
}
-///
-/// Requests
-///
-
+/**
+ * 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.");
}
}
}
-///
-/// Settings
-///
-
+/**
+ * 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'));
}
}
}
-///
-/// unixtime
-///
-
+/**
+ * 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);
}
}
}
}
-///
-/// version
-///
-
+/**
+ * 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)
+ *
+ * e.g. r130 (development environment)
+ * 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';
}
} 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]");
}
}
-///
-/// whereami
-///
-
+/**
+ * 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
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Nov 21, 12:54 (2 h, 56 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
20997
Default Alt Text
(16 KB)
Attached To
rZEDHG ZedLegacy
Event Timeline
Log In to Comment