Pastoid

OHO

The page you are looking at now is at this URL: http://pastoid.com/b0e

This paste was last updated on February 23, 2010 at 12:14 pm.

commandprocessor.phpraw

<?php
class CommandProcessor
{
	private $db;
	private $quiet = false;
	private $ancestors = array();
	private $params = array();
	private $location;
	private $msgq = array();
 
	function __construct($command, $raw = null)
	{
		$this->db = new db('sqlite:' . dirname(__FILE__) . '/oho.db');
		//$this->db = new db('mysql:host=localhost;dbname=oho');
		$this->attach_person();
		echo "{$this->params['me']}<br>";
		$result = $this->process($command, $raw);
		if($result != null) $this->msgq[$this->params['me']][] = $result;
	}
 
	private function paramprocess($a)
	{
		return ($a{0}=="$") ? $this->params[substr($a,1)] : $a;
	}
 
	private function process($cmd, $raw = null, $enforcecontext = true)
	{
		if(is_string($cmd)) {
			while(preg_match('/\\{([^{]*?)\\}/', $cmd, $match)) {
				$cmd = str_replace($match[0], $this->process($match[1]), $cmd);
			}
			preg_match_all('/".*?"|\\S+/', $cmd, $matches);
			$coms = $matches[0];
			$coms = array_map(create_function('$a', 'return trim($a, \'"\');'), $coms);
		}
		if(is_array($cmd)) {
			$coms = $cmd;
		}
		if($raw != null) array_push($coms, $raw);
 
		$coms = array_map(array(&$this, 'paramprocess'), $coms);
 
		if($coms[0]{0} == '@') {
			$com = 'cmd_' . substr(array_shift($coms) , 1);
			if(method_exists($this, $com)) {
				$output = $this->$com($coms);
			}
			else {
				$output = '?';
			}
			//if(!$this->quiet) $this->msgq[$this->params['me']][] = $output;
			return $output;
		}
		else {
			$this->quiet = true;
			$result = $this->do_action($coms, $enforcecontext);
			return null;
		}
	}
 
	private function attach_person()
	{
		$this->person = null;
		if(isset($_COOKIE['person'])) {
			$personid = $this->getthingbyhash($_COOKIE['person']);
			if($personid) {
				$this->person = $personid;
			}
		}
		if($this->person == null) {
			$newhash = md5(microtime() . $_SERVER['REMOTE_ADDR']);
			$personid = $this->cmd_create(array('person'));
			$this->cmd_set(array($personid, 'hash', $newhash));
			$this->person = $personid;
			setcookie('person', $newhash);
		}
		$this->params['me'] = $this->person;
		$this->params['location'] = $this->cmd_get(array($this->person, 'location'));
		return $this->person;
	}
 
	private function getthingbyhash($hash)
	{
		$thing = $this->db->get_row("SELECT * FROM Properties WHERE prop = 'hash' AND value = ?", array($hash));
		if($thing) return $thing->id;
		return false;
	}
 
	public function output()
	{
		$response = array_merge(
			(array)$this->msgq['global'], 
			(array)$this->msgq[$this->params['location']],
			(array)$this->msgq[$this->params['me']]
		);
 
		return implode('<br/>', $response);
	}
 
	private function cmd_put($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$destid = $this->get_thing($coms[1]);
 
		$this->cmd_set(array($thingid, 'location', $destid));
		return $thingid;
	}
 
	private function cmd_at($coms)
	{
		$thingid = $this->get_thing($coms[0]);
 
		return $this->cmd_get(array($thingid, 'location'));
	}
 
	private function cmd_tel($coms)
	{
		$thingid = $this->get_thing($coms[0]);
 
		return $this->cmd_set(array($this->params['me'], 'location', $thingid));
	}
 
	private function cmd_create($coms)
	{
		$objectname = $coms[0];
 
		$this->db->query("INSERT INTO Things (name) VALUES ('{$objectname}');");
		return $this->db->insertID();
		return "Created {$objectname} as object #" . $this->db->insertID() . ".";
	}
 
	private function cmd_emit($coms)
	{
		$output = implode(' ', $coms);
		$this->msgq[$this->params['location']][] = $output;
		return null;
	}
 
	private function cmd_whisper($coms)
	{
		$output = implode(' ', $coms);
		$this->msgq[$this->params['me']][] = $output;
		return null;
	}
 
	private function cmd_set($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$prop = $coms[1];
 
		switch(count($coms)) {
		case 2:
			$m = 'action' . md5($prop . microtime());
			$n = 'name' . md5($prop . microtime());
			$f = 'form' . md5($prop . microtime());
			$row = $this->db->get_row("SELECT * FROM Properties WHERE id = ? AND prop = ?", array($thingid, $prop));
 
			$output = '<div id="' . $f . '"><form onsubmit="saveAction(\'@set ' . $thingid . ' \'+chr(34)+\'' . $prop . '\'+chr(34), $(\'' . $m . '\').value, this);return false;" class="actionedit">
				<textarea id="' . $m .'">' . htmlspecialchars($row->value) . '</textarea>
				<p>
					<input type="hidden" id="' . $n . '" value="' . $prop . '" />
					<input type="submit" name="submit" value="Commit" />
					<input type="button" name="cancel" value="Cancel" onclick="$(\'' . $f . '\').innerHTML = \'Cancelled.\';" />
				</p>
			</form></div>';
			return $output;
		case 3:
			$value = $coms[2];
 
			if($this->db->get_row("SELECT * FROM Properties WHERE id = ? AND prop = ?", array($thingid, $prop))) {
				$this->db->query("UPDATE Properties SET value = ? WHERE id = ? AND prop = ?", array($value, $thingid, $prop));
			return "Ok, zset. {$thingid} {$prop} {$value}";
			}
			else {
				$r = $this->db->query("INSERT INTO Properties (id, prop, value) VALUES (?, ?, ?)", array($thingid, $prop, $value));
			return "Ok, set. {$thingid} {$prop} {$value} {$r}";
			}
		default:
			return "Sorry, that didn't work.\n".print_r($coms,1); 
		}
 
		return $value;
	}
 
	private function cmd_get($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$prop = $coms[1];
		$result = $this->db->get_row("SELECT * FROM Properties WHERE id = ? AND prop = ?", array($thingid, $prop));
 
		if($result) {
			return $result->value;
		}
		else {
			return '';
		}
 
	}
 
	private function cmd_delete($coms)
	{
		foreach($coms as $com) {
			$thingid = $this->get_thing($com);
			$this->db->query("DELETE FROM Things WHERE id = ?", array($thingid));
			$this->db->query("DELETE FROM Properties WHERE id = ?", array($thingid));
			$this->db->query("DELETE FROM Actions WHERE id = ?", array($thingid));
			$this->db->query("DELETE FROM Inherit WHERE childid = ? OR parentid = ?", array($thingid, $thingid));
		}
		return 'Deleted #' . $thingid;
	}
 
	private function cmd_iam($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$meid = $this->get_thing($this->params['me']);
	owd($meid);
		echo $this->cmd_set(array($thingid, 'hash', $_COOKIE['person']));
		//$this->cmd_delete(array($thingid));
	}
 
	private function cmd_rename($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$newname = $coms[1];
		$this->db->query("UPDATE Things SET name = ? WHERE id = ?", array($newname, $thingid));
		return $thingid;		
	}
 
	private function cmd_describe($coms)
	{
		$thingid = $this->get_thing($coms[0]);
 
		$thing = $this->db->get_row("SELECT * FROM Things WHERE id = ?", array($thingid));
		$output = "<h3>{$thing->name} (#{$thing->id})</h3>";
 
		$props = $this->db->get_results("SELECT * FROM Properties WHERE id = ?", array($thingid));
		$output .= '<b>Properties</b><dl>';
		foreach((array)$props as $prop) {
			$output .= "<dt>{$prop->prop}</dt><dd>" . str_replace("\n", '<br/>', $prop->value) . "</dd>\n";
		}
		$output .= '</dl>';
		$actions = $this->db->get_results("SELECT * FROM Actions WHERE id = ?", array($thingid));
		$output .= '<b>Actions</b><dl>';
		foreach((array)$actions as $action) {
			$output .= "<dt>{$action->action}</dt><dd>" . str_replace("\n", '<br/>', $action->value) . "</dd>\n";
		}
		$output .= '</dl>';
		$inherits = $this->db->get_results("SELECT * FROM Inherit WHERE childid = ?", array($thingid));
		$output .= '<b>Child Of</b><ul>';
		foreach((array)$inherits as $inherit) {
			$output .= "<li>{$inherit->parentid}</li>\n";
		}
		$output .= '</ul>';
		$inherits = $this->db->get_results("SELECT * FROM Inherit WHERE parentid = ?", array($thingid));
		$output .= '<b>Parent Of</b><ul>';
		foreach((array)$inherits as $inherit) {
			$output .= "<li>{$inherit->childid}</li>\n";
		}
		$output .= '</ul>';
		return $output;
	}
 
	private function get_thing($desc)
	{
		if(is_numeric($desc)) return intval($desc);
		$row = $this->db->get_row("SELECT * FROM Things WHERE name LIKE ?", array($desc));
		return intval($row->id);
	}
 
	private function cmd_id($coms)
	{
		return '#' . $this->get_thing($coms[0]);
	}
 
	private function cmd_listall($coms)
	{
		$things = $this->db->get_results("SELECT * FROM Things ORDER BY name ASC, id ASC");
		$output = '<ul>';			
		foreach($things as $thing) {
			$output .= "<li>#{$thing->id} - {$thing->name}</li>";
		}
		$output .= '</ul>';
		return $output;
	}
 
	private function cmd_match($coms)
	{
		$c1 = array_shift($coms);
		$c2 = array_shift($coms);
		if($c1 == $c2) {
			return $this->process($coms);
		}
		return '';
	}
 
	private function cmd_deaction($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$action = $coms[1];
 
		$this->db->query("DELETE FROM Actions WHERE id = ? AND action = ?", array($thingid, $action));
 
		return $thingid;
	}
 
	private function cmd_action($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$action = $coms[1];
		//cho "<pre>" . print_r($coms,1) . "</pre>";
 
		$row = $this->db->get_row("SELECT * FROM Actions WHERE id = ? AND action = ?", array($thingid, $action));
 
		switch(count($coms)) {
		case 3:
			$value = $coms[2];
			$parts = count(explode(' ', $action));
			if($row) {
				$this->db->query("UPDATE Actions SET value = ?, part = ? WHERE id = ? and action = ?", array($value, $parts, $thingid, $action));
			}
			else {
				$this->db->query("INSERT INTO Actions (value, part, id, action) VALUES (?, ?, ?, ?)", array($value, $parts, $thingid, $action));
			}
			//echo "<pre>" . print_r($row,1) . "</pre>";
			//echo "<pre>" . print_r($this->db->errors,1) . "</pre>";
			return "Action \"{$action}\" set on #{$thingid}.";
		case 2:
			$m = 'action' . md5($action . microtime());
			$n = 'name' . md5($action . microtime());
			$f = 'form' . md5($action . microtime());
 
			$output = '<div id="' . $f . '"><form onsubmit="saveAction(\'@action ' . $thingid . ' \'+chr(34)+\'' . $action . '\'+chr(34), $(\'' . $m . '\').value, this);return false;" class="actionedit">
				<textarea id="' . $m .'">' . htmlspecialchars($row->value) . '</textarea>
				<p>
					<input type="hidden" id="' . $n . '" value="' . $action . '" />
					<input type="submit" name="submit" value="Commit" />
					<input type="button" name="cancel" value="Cancel" onclick="$(\'' . $f . '\').innerHTML = \'Cancelled.\';" />
				</p>
			</form></div>';
			return $output;
		case 1:
			$actions = $this->db->get_results("SELECT * FROM Actions WHERE id = ?", array($thingid));
			$output = '<ul>';			
			foreach($actions as $action) {
				$output .= "<li>{$action->action}</li>";
			}
			$output .= '</ul>';
			return $output;
 
		}
	}
 
	private function cmd_inherit($coms)
	{
		$thingid = $this->get_thing($coms[0]);
		$parentid = $this->get_thing($coms[1]);
 
		$this->db->query("INSERT INTO Inherit (childid, parentid) VALUES (?, ?);", array($thingid, $parentid));
		return 'Ok.';
	}
 
	private function inherits_from($child, $parent)
	{
		if(isset($this->ancestors[$child][$parent])) return $this->ancestors[$child][$parent];
		$result = (false != $this->db->get_row("SELECT * FROM Inherit WHERE parentid = ? AND childid = ?", array($parent, $child)));
		$this->ancestors[$child][$parent] = $result;
		return $result;
	}
 
	private function do_action($coms, $enforcecontext = true)
	{
		if(false && $enforcecontext) {
			if(isset($this->params['location'])) $locations[] = $this->params['location'];
			if(isset($this->params['me'])) $locations[] = $this->params['me'];
			$location = implode(',', $locations);
 
			$qry = "SELECT actions.*, properties.* FROM actions, properties WHERE (part = " . count($coms) . ") AND (prop = 'location') AND (properties.value IN ({$this->params['location']},{$this->params['me']}))";
			$qry = "
				SELECT 
					actions.*, 
					properties.* 
				FROM 
					actions, 
					properties 
				WHERE 
					(Actions.id = Properties.id) AND
					(part = " . count($coms) . ") AND 
					(prop = 'location') AND 
					(properties.value IN ({$location}))";
		}
		else {
			$qry = "SELECT * FROM Actions WHERE part = " . count($coms);
		}
		$actions = $this->db->get_results($qry);
owd($locations,$qry, $actions);
		$fail = true;
		foreach((array)$actions as $action) {
			preg_match_all('/".*?"|\\S+/', $action->action, $matches);
			$acts = $matches[0];
			$params = array();
			$fail = false;
			for($z = 0; $z < count($coms); $z++) {
				$act = $acts[$z];
				$com = $coms[$z];
				switch(true) {
				case $act == '$$':
					$thingid = $this->get_thing($com);
					if($thingid != $action->id && !$this->inherits_from($thingid, $action->id)) {
						$fail = true;
						break 2;
					}
					$params['$'] = $thingid;
					break;					
				case $act{0} == '$':
					$params[substr($act,1)] = $com;
					break;					
				case $act == $com:
					break;
				case $act != $com:
					$fail = true;
					break 2;
				}
			}
			if(!$fail) {
				$setaction = $action;
				break; 
			}
		}
		if(!$fail) {
			if(!isset($this->params['$'])) $this->params['$'] = $action->id;
			$this->params = array_merge($this->params, $params); 
			$actions = explode("\n", $setaction->value);
			$output = '';
			foreach($actions as $action) {
				$output .= $this->process($action, null, false);
			}
		}
		return $output;
	}
 
}
 
?>
 

Toggle wordwrap

Referring DomainHits
Unknown Referer 127
pastoid.com 4
www.rockriverbar.com 1
Is this paste spam?
<Hide