<?php set_time_limit(0); include 'php_serial.class.php'; $badgeInterface = "/dev/ttyACM0";// EDIT THIS TO MATCH YOUR INTERFACE $collected = array(); 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(9600); $serial->deviceOpen('w+'); stream_set_timeout($serial->_dHandle, 3); $serial->sendMessage("\r\n\r\n"."5"."$result"."\r\n"); $devResponse = $serial->readPort(); $serial->deviceClose(); //echo "DEBUG: ".$devResponse."\n"; $toReturn = trim(str_replace("Press ENTER to continue...", "", $devResponse)); $toReturn = substr($toReturn, -32); return $toReturn; } function get_code_rsp($code){ global $badgeInterface; $result = preg_replace("/[^a-zA-Z0-9]+/", "", strtoupper(substr(trim($code), 0, 32))); $serial = new PhpSerial; $serial->deviceSet($badgeInterface); $serial->confBaudRate(9600); $serial->deviceOpen('w+'); stream_set_timeout($serial->_dHandle, 3); $serial->sendMessage("\r\n\r\n"."5"."$result"."\r\n"); $devResponse = $serial->readPort(); $serial->deviceClose(); //echo "DEBUG: ".$devResponse."\n"; if(strpos($devResponse, "Already connected to this badge") !== false){ // already connected $toReturn = "alreadyConnected"; }else{ $toReturn = trim(str_replace("Press ENTER to continue...", "", $devResponse)); $toReturn = substr($toReturn, -32); } return $toReturn; } function get_own_code(){ global $badgeInterface; $serial = new PhpSerial; $serial->deviceSet($badgeInterface); $serial->confBaudRate(9600); $serial->deviceOpen('w+'); stream_set_timeout($serial->_dHandle, 3); $serial->sendMessage("\r\n\r\n4\r\n"); $devResponse = $serial->readPort(); $serial->deviceClose(); //echo "DEBUG: ".$devResponse."\n"; $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 short_code($code){ $fixedCode = substr($code, 0, 2); $fixedCode .= "0"; $fixedCode .= substr($code, 2,1); $fixedCode .= substr($code, 4, 4); $fixedCode .= substr($code, 3,1); $fixedCode .= substr($code, 8,1); $fixedCode .= substr($code, 10, 6); $fixedCode .= substr($code, 9,1); $fixedCode .= substr($code, 16, 16); return $fixedCode; } function get_stats_connected(){ global $badgeInterface; $serial = new PhpSerial; $serial->deviceSet($badgeInterface); $serial->confBaudRate(9600); $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')); //echo $toReturn; // DEBUG return $toReturn; } function get_stats_signal(){ global $badgeInterface; $serial = new PhpSerial; $serial->deviceSet($badgeInterface); $serial->confBaudRate(9600); $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 $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); } $rand = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil(8/strlen($x)) )),1,8); // announce self to channel $myCode = get_own_code(); $myCode = (strlen($myCode) == 31) ? "".short_code($myCode) : $myCode; if(!isset($myCode) || $myCode == "") die("Please contact 0xRoM on discord for help fixing this issue!"); $badgeConn = get_stats_connected(); $badgeSig = get_stats_signal(); echo "[+] connected: $badgeConn, Sig shared: $badgeSig\n"; $socket = fsockopen("ice.uplinkcorp.net", 6667); // Send auth info // fputs($socket, "PASS " . $password . "\n"); fputs($socket, "NICK Badge-" . $rand . "\n"); fputs($socket, "USER Badge-" . $rand . " 0 * :DC29 Badge Bot\n"); fputs($socket, "JOIN #theSignal\n"); // Join channel fputs($socket, "PRIVMSG #theSignal :!req " . $rand . " " . $myCode . "\n"); echo "[+] announced arrival: ".$rand."\n"; // Force an endless while while (1) { // Continue the rest of the script here while ($data = fgets($socket, 256)) { echo $data; flush(); // Separate all data $ex = explode(' ', $data); // Send PONG back to the server if ($ex[0] == "PING") { fputs($socket, "PONG " . $ex[1] . "\n"); } // executes chat command if ($ex[0] != 'PING' && ISSET($ex[3])) { $command = str_replace(array( chr(10), chr(13) ), '', $ex[3]); if ($command == ":!req") { if(isset($ex[4]) && $ex[4] <> ""){ // bot name if(isset($ex[5]) && $ex[5] <> ""){ // code if(!in_array($ex[4], $collected)){ // not already added this bot $response = get_code($ex[5]); $response = (strlen($response) == 31) ? "".short_code($response) : $response; if(preg_match("/^[0-9A-Fa-f]{32}/", $response)){ // valid code back echo "[+] computing for ".$ex[4]."\n"; fputs($socket, "PRIVMSG #theSignal :!rsp " . $ex[4] . " " . $response . "\n"); array_push($collected, $ex[4]); // add to replied array $myCode = get_own_code(); $myCode = (strlen($myCode) == 31) ? "".short_code($myCode) : $myCode; fputs($socket, "PRIVMSG #theSignal :!req " . $rand . " " . $myCode . "\n"); echo "[+] replied to ".$ex[4]."\n"; }else{ echo "[-] invalid code\n"; } }else{ echo "[-] already exchanged\n"; } }else{ echo "[-] no code\n"; } }else{ echo "[-] no name\n"; } } if ($command == ":!rsp") { if ($ex[4] == $rand){ // response is for this bot if(isset($ex[5]) && $ex[5] <> ""){ // code for me echo "[+] got response from ".$ex[4]."\n"; if(get_code_rsp($ex[5]) == "alreadyConnected"){ echo "[-] already connected (rsp code)\n"; }else{ echo "[+] new connection (rsp code)\n"; } }else{ echo "[-] no code set\n"; } }else{ echo "[-] not for me\n"; } } if ($command == ":!stats") { if (trim($ex[4]) === $rand){ // response is for this bot $badgeConn = get_stats_connected(); $badgeSig = get_stats_signal(); echo "[+] connected: $badgeConn, Sig shared: $badgeSig\n"; fputs($socket, "PRIVMSG #theSignal :Connected = $badgeConn, Sig shared = $badgeSig\n"); }else{ echo "[-] not for me\n"; } } } } } ?>