Foppe Hemminga 5 лет назад
Родитель
Сommit
7c24ed2406
5 измененных файлов с 250 добавлено и 16 удалено
  1. 86 1
      functions.php
  2. 26 1
      index.php
  3. 2 2
      properties.php
  4. 122 10
      snippets.php
  5. 14 2
      sqlite.php

+ 86 - 1
functions.php

@@ -32,6 +32,7 @@ function add_maintainer( $api ) {
 		$maintainer[0] = $response->player_id;
 		$maintainer[1] = $response->name;
 	}
+	$pdo = null;
 	return $maintainer;
 }
 
@@ -51,10 +52,50 @@ function get_maintainer( $id ) {
 	$stmt = $pdo->prepare( $query );
 	$stmt->execute( [$id, $id] );
 	$maintainer = [0, '?'];
-	$row = $stmt->fetchAll();
+	$row = $stmt->fetch();
 	$maintainer[0] = $id;
 	$maintainer[1] = $row['value'];
+	$pdo = null;
+	return $maintainer;
+}
 
+function add_player( $maintainer, $player ) {
+	$pdo = null;
+	try {
+		$pdo = new PDO("sqlite:" . './slork.sqlite');
+	} catch (PDOException $e) {
+		// handle the exception here
+	}
+	$query = <<<QUERY
+	INSERT INTO player_properties (maintainer, player, property)
+	VALUES (?, ?, ?)
+QUERY;
+	$stmt = $pdo->prepare( $query );
+	$properties = '["name"]';
+	$stmt->execute( [$maintainer, $player, $properties] );
+	// For starters add player's name
+	$query = "SELECT api FROM maintainer WHERE maintainer = ?;";
+	$stmt = $pdo->prepare( $query );
+	$stmt->execute( [$maintainer] );
+	$api = $stmt->fetch()['api'];
+	$url = "https://api.torn.com/user/${player}?key=";
+	$url .= $api;
+
+	$response = json_decode( file_get_contents( $url ) );
+	if ( property_exists( $response, "error" ) ) {
+		print "ERROR " . $response->error->code . ": " . $response->error->error . "\n";
+		$maintainer[0] = $response->error->code;
+		$maintainer[1] = $response->error->error;
+	} else {
+		$name = $response->name;
+		$query = <<<QUERY
+		INSERT INTO player (maintainer, player, property, value)
+		VALUES (?, ?, 'name', ?);
+QUERY;
+		$stmt = $pdo->prepare($query);
+		$stmt->execute([$maintainer, $player, $name]);
+		$maintainer = get_maintainer( $maintainer );
+	}
 	return $maintainer;
 }
 
@@ -81,5 +122,49 @@ function delete_player( $player ) {
 		unset( $_REQUEST['player'] );
 		$maintainer = [0, '?'];
 	}
+	$pdo = null;
 	return $maintainer;
+}
+
+function store_player_properties( $player, $maintainer, $properties ) {
+	$pdo = null;
+	try {
+		$pdo = new PDO("sqlite:" . './slork.sqlite');
+	} catch (PDOException $e) {
+		// handle the exception here
+	}
+	$query = "INSERT OR REPLACE INTO player_properties (maintainer, player, property) VALUES (?, ?, ?);";
+	$stmt = $pdo->prepare( $query );
+	$json = json_encode( $properties );
+	$stmt->execute( [$maintainer[0], $player, $json] );
+	// Next remove all properties that are in player
+	// but not in the new list
+	$query = "SELECT property FROM player WHERE maintainer = ? AND player = ?";
+	$stmt = $pdo->prepare( $query );
+	$stmt->execute( [$maintainer[0], $player] );
+	$rows = $stmt->fetchAll();
+	$properties_delete = [];
+	foreach ( $rows as $row ) {
+		if ( ! in_array( $row['property'], $properties ) ) {
+			$properties_delete[] = $row['property'];
+		}
+	}
+	$query = "DELETE FROM player WHERE maintainer = ? AND player = ? AND property = ?;";
+	$stmt = $pdo->prepare( $query );
+	foreach ( $properties_delete as $property ) {
+		$stmt->execute( [$maintainer[0], $player, $property] );
+	}
+}
+
+function get_property( $maintainer, $player, $property ) {
+	$pdo = null;
+	try {
+		$pdo = new PDO("sqlite:" . './slork.sqlite');
+	} catch (PDOException $e) {
+		// handle the exception here
+	}
+	$query = "SELECT value FROM player WHERE maintainer = ? AND player = ? and property = ?;";
+	$stmt = $pdo->prepare( $query );
+	$stmt->execute( [$maintainer, $player, $property] );
+	return $stmt->fetch()['value'];
 }

+ 26 - 1
index.php

@@ -46,11 +46,31 @@ if ( $action == 'm' ) {
     $maintainer = get_maintainer( $_REQUEST['maintainer'] );
 	$screen = 2;
 }
+if ( $action == 'p' ) {
+    // New player
+    $maintainer = add_player( $_REQUEST['maintainer'], $_REQUEST['player'] );
+    if ( $maintainer[0] < 100 ) {
+        print( "<pre>" );
+        print("ERROR ${maintainer[0]}: ${maintainer[1]}" );
+        print("</pre>" );
+        $maintainer = get_maintainer( $_REQUEST['maintainer'] );
+    }
+    $screen = 2;
+}
 if ( $action == 'e' ) {
     // Request for edit screen
 	$maintainer = get_maintainer( $_REQUEST['maintainer'] );
     $screen = 3;
 }
+if ( $action == 's' ) {
+    // Getting the Edit array back from the maintainer
+    // Store preferences and return to Edit screen
+    $maintainer = get_maintainer( $_REQUEST['maintainer'] );
+    $player = $_REQUEST['player'];
+    $properties = $_REQUEST['properties'];
+    store_player_properties( $player, $maintainer, $properties );
+    $screen = 3;
+}
 if ( $action == 'x' ) {
     // Request to remove player
     $maintainer = delete_player( $_REQUEST['player'] );
@@ -72,6 +92,8 @@ assert( '$screen >= 0', "By now \$screen should be set to a value >= 0." );
 
     <!-- Bootstrap CSS -->
     <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
+    <!-- Latest compiled and minified CSS -->
+    <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/bootstrap-select@1.13.14/dist/css/bootstrap-select.min.css">
 
     <title>Slork</title>
   </head>
@@ -111,4 +133,7 @@ assert( '$screen >= 0', "By now \$screen should be set to a value >= 0." );
     <script src="//code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
     <script src="//cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
     <script src="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
-  </body>
+    <!-- Latest compiled and minified JavaScript -->
+    <script src="//cdn.jsdelivr.net/npm/bootstrap-select@1.13.14/dist/js/bootstrap-select.min.js"></script>
+  </body>
+</html>

+ 2 - 2
properties.php

@@ -2,8 +2,8 @@
 $properties = json_decode( '{
 	"level": 95,
 	"gender": "Female",
-	"player_id": 1889531,
-	"name": "thelovelymoon",
+	"player_id": 12345,
+	"name": "Unknown",
 	"personalstats": {
 		"useractivity": 26817266,
 		"logins": 4361,

+ 122 - 10
snippets.php

@@ -28,19 +28,18 @@ QUERY;
 		<form>
 				<!-- This form adds a new maintainer -->
 			<div class="form-group">
-				<label for="newAPIKey">New maintainer</label>
+				<label for="newAPIKey">Add a new maintainer ...</label>
 				<input type="hidden" name="action" value="i">
 				<input type="password" class="form-control" name="api" id="newAPIKey" aria-describedby="newAPIKey" placeholder="Enter API key">
 				<small id="newAPIKey" class="form-text text-muted">Assuming you are new here, add your Torn API key</small>
 			</div>
 			<button type="submit" class="btn btn-primary">Submit</button>
 		</form>
-		<div><p>&nbsp;</p></div>
-		<h4>OR</h4>
+		<div><p>&nbsp;</p><hr><p>&nbsp;</p></div>
 		<!-- This part selects an existing maintainer -->
 		<form>
 			<div class="form-group">
-				<label for="existingMaintainer">Existing maintainer</label>
+				<label for="existingMaintainer">... or select an existing maintainer</label>
 				<input type="hidden" name="action" value="m">
 				<select class="form-control" name="maintainer" id="existingMaintainer">
 					<option></option><!-- Empty option -->
@@ -59,6 +58,21 @@ HTML;
 }
 
 if ( $screen == 2 ) {
+	// New player
+	$snippets[2] = <<<HTML
+	<form id="player-new">
+		<div class="form-group">
+			<label for="player-new">Add new player ...</label>
+			<input type="hidden" name="maintainer" value="$maintainer[0]" form="player-new">
+			<input type="number" name="player" form="player-new">
+			<button class="btn btn-primary" name="action" value="p" form="player-new">New</button>
+		</div>	
+	</form>
+	<div>
+	<p>&nbsp;</p><hr><p>&nbsp;</p>
+	</div>
+HTML;
+
 	// Let maintainer select (or delete) a player
 	$query = <<<SQL
 		SELECT player, value FROM player 
@@ -69,17 +83,21 @@ SQL;
 	$stmt = $pdo->prepare($query);
 	$stmt->execute([$maintainer[0]]);
 	$rows = $stmt->fetchAll();
+	/*
 	print("<pre>");
+	print( "\$rows:\n" );
 	print_r($rows);
 	print("</pre>");
+	*/
 	$players_id = array();
 	foreach ($rows as $row) {
 		$players_id[] = array($row['player'], $row['value'] . " [" . $row['player'] . "]");
 	}
 
-	$snippets[2] = <<<HTML
-		<form id="player">
+	$snippets[2] .= <<<HTML
+		<form id="player-edit">
 			<div class="form-group">
+				<label for="player-edit">... or edit existing player</label>
 				<table class="table">
 					<thead>
 						<tr>
@@ -92,10 +110,10 @@ HTML;
 	foreach ($players_id as $player) {
 		$snippets[2] .= "\n\t\t\t\t\t<tr>";
 		$snippets[2] .= "\n\t\t\t\t\t\t<td>$player[1]";
-		$snippets[2] .= "<input type=\"hidden\" name=\"player\" value=\"$player[0]\" form=\"player\"></td><td>";
-		$snippets[2] .= "<input type=\"hidden\" name=\"maintainer\" value=\"$maintainer[0]\" form=\"player\">";
-		$snippets[2] .= "<button class=\"btn btn-primary\" name=\"action\" value=\"e\" form=\"player\">Edit</button></td>";
-		$snippets[2] .= "<td><button class=\"btn btn-danger\" name=\"action\" value=\"x\" form=\"player\">Remove</button></td>\n\t\t\t\t\t</tr>";
+		$snippets[2] .= "<input type=\"hidden\" name=\"player\" value=\"$player[0]\" form=\"player-edit\"></td><td>";
+		$snippets[2] .= "<input type=\"hidden\" name=\"maintainer\" value=\"$maintainer[0]\" form=\"player-edit\">";
+		$snippets[2] .= "<button class=\"btn btn-primary\" name=\"action\" value=\"e\" form=\"player-edit\">Edit</button></td>";
+		$snippets[2] .= "<td><button class=\"btn btn-danger\" name=\"action\" value=\"x\" form=\"player-edit\">Remove</button></td>\n\t\t\t\t\t</tr>";
 	}
 
 	$snippets[2] .= <<<HTML
@@ -103,5 +121,99 @@ HTML;
 				</table>
 			</div>
 		</form>
+		<div>
+			<p>&nbsp;</p>
+			<a href="./index.php"><button class="btn btn-info">Ready</button></a>
+		</div>
 HTML;
 }
+
+if ( $screen == 3 ) {
+	// Edit properties of player
+	// Provided is $_REQUEST['player']
+	// $maintainer[id, 'name'] is also available in this section
+	$player = $_REQUEST['player'];
+	$query = <<<QUERY
+	SELECT player_properties.property, player.value 
+		FROM player_properties
+		JOIN player ON player_properties.player = player.player
+		WHERE player_properties.player = ? 
+		AND player_properties.maintainer = ?
+		AND player.property = 'name';
+QUERY;
+	$stmt = $pdo->prepare( $query );
+	$stmt->execute( [$player, $maintainer[0]] );
+	//$rows = $stmt->fetchAll();
+	$player_properties = [];
+	$name = '?';
+	foreach ($stmt as $key => $value) {
+		// @TODO This is one row now since we store it in a JSON string
+		/*
+		print( "<pre>" );
+		print( "[\$key, \$value]" );
+		print_r( [$key, $value] );
+		print( "</pre>" );
+		*/
+		$player_properties[] = json_decode( $value['property'] );
+		if ($key == 'name') {
+			$name = $value['value'];
+		}
+	}
+	$query = <<<QUERY
+	SELECT property, parent FROM properties;
+QUERY;
+	$stmt = $pdo->query( $query );
+	$properties = [];
+	foreach ($stmt as $row) {
+		$properties[] = $row['property'];
+	}
+	$snippets[3] = '';
+	/*
+	print("<pre>");
+	print_r($player_properties);
+	print_r($properties);
+	print_r( [$player, $maintainer[0]] );
+	print("</pre>\n");
+	*/
+	$snippets[3] = <<<HTML
+	<!--
+	<div>
+		<p>&nbsp;</p>
+		<hr>
+		<p>&nbsp;</p>	
+	</div>
+	-->
+	<form id="player-edit">
+		<div class="form-group">
+			<label for="player-edit">Select properties for player ${name} [${player}]</label>
+			<select class="selectpicker" multiple form="player-edit" name="properties[]">
+HTML;
+	$snippets[3] .= "\n";
+	/*
+	print("<pre>" );
+	print("\$player_properties:\n");
+	print_r( $player_properties );
+	print( "</pre>" );
+	*/
+	foreach ( $properties as $property ) {
+		$selected = '';
+		if ( in_array( $property, $player_properties[0] ) ) {
+			$selected = ' selected';
+		}
+		$snippets[3] .= "\t\t\t\t<option${selected}>${property}</option>\n";
+	};
+	$snippets[3] .= <<<HTML
+			</select>
+			<input type="hidden" name="action" value="s">
+			<input type="hidden" name="maintainer" value="${maintainer[0]}">
+			<input type="hidden" name="player" value="${player}">
+		</div>
+		<button class="btn-save btn btn-primary btn-sm">Save</button>
+	</form>
+	<div>
+		<p>&nbsp;</p>
+		<a href="./index.php?action=m&maintainer=${maintainer[0]}"><button class="btn btn-info">Ready</button></a>
+	</div>
+HTML;
+
+}

+ 14 - 2
sqlite.php

@@ -11,7 +11,7 @@ if ( !$pdo ) {
 }
 
 // Create maintainer database
-$pdo->exec("DROP TABLE IF EXISTS maintainer;");
+$pdo->exec( "DROP TABLE IF EXISTS maintainer;" );
 $query = <<<QUERY
 CREATE TABLE IF NOT EXISTS maintainer (
 		id INTEGER PRIMARY KEY, maintainer INTEGER, api TEXT, 
@@ -22,7 +22,7 @@ $stmt = $pdo->exec( $query );
 //$stmt->execute();
 
 // Create user/player database
-$pdo->exec("DROP TABLE IF EXISTS player;");
+$pdo->exec( "DROP TABLE IF EXISTS player;" );
 $query = <<<QUERY
 CREATE TABLE IF NOT EXISTS player (
 		id INTEGER PRIMARY KEY, maintainer INTEGER,
@@ -32,6 +32,18 @@ QUERY;
 $stmt = $pdo->exec( $query );
 //$stmt->execute();
 
+// Create player preferences table (properties)
+$pdo->exec( "DROP TABLE IF EXISTS player_properties;" );
+$query = <<<QUERY
+	CREATE TABLE player_properties (
+	    id INTEGER PRIMARY KEY, 
+	    maintainer INTEGER, 
+	    player INTEGER, 
+	    property TEXT,
+	    UNIQUE( maintainer, player));
+QUERY;
+$pdo->exec( $query );
+
 // properties.php contains queries for a subsequent
 // table properties containing default property names.
 require_once "properties.php";