Created
August 9, 2021 03:49
-
-
Save jetbalsa/77b21b6e54f6afb8a22e05c5682a7a26 to your computer and use it in GitHub Desktop.
Badge Reader DC29
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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