Skip to content

Instantly share code, notes, and snippets.

@jetbalsa
Created August 9, 2021 03:49
Show Gist options
  • Save jetbalsa/77b21b6e54f6afb8a22e05c5682a7a26 to your computer and use it in GitHub Desktop.
Save jetbalsa/77b21b6e54f6afb8a22e05c5682a7a26 to your computer and use it in GitHub Desktop.
Badge Reader DC29
<?php
/// WRITTEN BY @JRWR / HATCHAN!!!!!
// GET REKT
$mem = new Memcached();
$mem->addServer('127.0.0.1',11211);
include 'PhpSerial.php';
include 'Medoo.php';
use Medoo\Medoo;
$database = new Medoo([
'type' => 'sqlite',
'database' => '/home/pi/dc29-badge-stats/badge-data.db3',
"logging" => true
]);
$badgeInterface = "/dev/ttyDUMMY";// EDIT THIS TO MATCH YOUR INTERFACE
$collected = array();
function get_own_code(){
global $badgeInterface;
$serial = new PhpSerial;
$serial->deviceSet($badgeInterface);
$serial->confBaudRate(115200);
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 3);
$serial->sendMessage("\r\n\r\n4\r\n");
$devResponse = $serial->readPort();
$serial->deviceClose();
$toReturn = trim(str_replace("Invalid Input. Please try again:", "", $devResponse));
$toReturn = trim(str_replace("Choose an option:", "", $toReturn));
echo $toReturn; // DEBUG
$toReturn = substr($toReturn, -32);
return $toReturn;
}
function get_code($code){
global $badgeInterface;
$result = preg_replace("/[^a-zA-Z0-9]+/", "", strtoupper(substr(trim($code), 0, 32)));
$serial = new PhpSerial;
$serial->deviceSet($badgeInterface);
$serial->confBaudRate(115200);
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 3);
$serial->sendMessage("\r\n\r\n"."5"."$result"."\r\n");
$devResponse = $serial->readPort();
$serial->deviceClose();
$toReturn = trim(str_replace("Press ENTER to continue...", "", $devResponse));
$toReturn = substr($toReturn, -32);
return $toReturn;
}
function string_between_two_string($str, $starting_word, $ending_word){
$subtring_start = strpos($str, $starting_word);
$subtring_start += strlen($starting_word);
$size = strpos($str, $ending_word, $subtring_start) - $subtring_start;
return substr($str, $subtring_start, $size);
}
function get_stats_connected(){
global $badgeInterface;
$serial = new PhpSerial;
$serial->deviceSet($badgeInterface);
$serial->confBaudRate(115200);
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 3);
$serial->sendMessage("\r\n\r\n5\r\n\r\n");
$devResponse = $serial->readPort();
$serial->deviceClose();
$toReturn = trim(preg_replace('/\s+/', ' ', $devResponse));
$toReturn = trim(string_between_two_string($toReturn, 'Number of Badges Connected: ', 'Badge Types'));
return $toReturn;
}
function get_stats_ctf(){
global $badgeInterface;
$serial = new PhpSerial;
$serial->deviceSet($badgeInterface);
$serial->confBaudRate(115200);
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 3);
$serial->sendMessage("\r\n\r\n5\r\n\r\n");
$devResponse = $serial->readPort();
$serial->deviceClose();
$ctf["redpill"] = strpos($devResponse, "YourJourneyBegins");
$ctf["newsignal"] = strpos($devResponse, "WatchYourHead");
$ctf["aliens"] = strpos($devResponse, "ItWasTotallyAliens");
// $ctf["redpill"] = "23";
// $ctf["newsignal"] = "23";
// $ctf["aliens"] = "123";
return $ctf;
}
function get_badge_types_found(){
global $badgeInterface;
$serial = new PhpSerial;
$serial->deviceSet($badgeInterface);
$serial->confBaudRate(115200);
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 3);
$serial->sendMessage("\r\n\r\n5\r\n\r\n");
$devResponse = $serial->readPort();
$serial->deviceClose();
$toReturn = preg_replace('/\s+/', ' ', $devResponse);
$start = strpos($devResponse, "Badge Types Collected: ")+23;
$end = strpos($devResponse, " ", $start);
return substr($devResponse, $start, 48); // DEBUG
}
function get_gamestats(){
global $badgeInterface;
$serial = new PhpSerial;
$serial->deviceSet($badgeInterface);
$serial->confBaudRate(115200);
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 3);
$serial->sendMessage("\r\n\r\n5\r\n\r\n");
$devResponse = $serial->readPort();
$serial->deviceClose();
$start = strpos($devResponse, "Simon High Score: ");
$end = strpos($devResponse, "\r", $start);
$out["highscore"] = preg_replace('/[^0-9]/', '', trim(substr($devResponse, $start+18, 6)));
$start = strpos($devResponse, "Multiplayer Simon High Score: ");
$out["m-highscore"] = preg_replace('/[^0-9]/', '', trim(substr($devResponse, $start+30, 6)));
$start = strpos($devResponse, "Multiplayer Simon Games Played: ");
$out["m-played"] = preg_replace('/[^0-9]/', '', trim(substr($devResponse, $start+32, 6)));
$start = strpos($devResponse, "Multiplayer Simon Longest Badge Chain: ");
$out["m-longest"] = preg_replace('/[^0-9]/', '', trim(substr($devResponse, $start+39, 8)));
if(empty($out["m-longest"])){$out["m-longest"]=0;}
if(empty($out["m-played"])){$out["m-played"]=0;}
if(empty($out["m-highscore"])){$out["m-highscore"]=0;}
if(empty($out["highscore"])){$out["highscore"]=0;}
echo $devResponse;
return $out;
}
function get_stats_signal(){
global $badgeInterface;
$serial = new PhpSerial;
$serial->deviceSet($badgeInterface);
$serial->confBaudRate(115200);
$serial->deviceOpen('w+');
stream_set_timeout($serial->_dHandle, 3);
$serial->sendMessage("\r\n\r\n5\r\n\r\n");
$devResponse = $serial->readPort();
$serial->deviceClose();
$toReturn = trim(preg_replace('/\s+/', ' ', $devResponse));
if(strpos($toReturn, "Shared the Signal") !== false){ // are sharing the signal
if(strpos($toReturn, "Thank you for doing your part") !== false){ // have sent more than 20 signals
$toReturn = trim(string_between_two_string($toReturn, 'Shared the Signal: ', 'Thank you for doing your part'));
}else{
$toReturn = trim(string_between_two_string($toReturn, 'Shared the Signal: ', 'se try again'));
}
//echo $toReturn; // DEBUG
}else{ // you havent collected all badge types
$toReturn = 0;
}
return preg_replace('/[^0-9]/', '', substr($toReturn, 0, 8));
}
$out["badgetypes"] = preg_replace("/[^A-Za-z0-9 ,]/", '', get_badge_types_found());
$out["gamestats"] = get_gamestats();
$out["connected"] = get_stats_connected();
$out["signal"] = get_stats_signal();
$out["ctf"] = get_stats_ctf();
if(empty($out["connected"])){$out["connected"]=0;}
if(empty($out["signal"])){$out["signal"]=0;}
$mem->set("badgedata",json_encode($out),3600);
echo PHP_EOL."=====================".PHP_EOL;
echo json_encode($out, JSON_PRETTY_PRINT);
echo PHP_EOL."=====================".PHP_EOL;
$checksum = md5(json_encode($out));
if(!$database->has("badges", ["checksum" => "$checksum"])){
$database->insert("badges", [
"checksum" => "$checksum",
"blob" => json_encode($out)
]);
}
var_dump($database->log());
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment