<?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);
$fixedCode .= substr($code, 4, 4);
$fixedCode .= substr($code, 3);
$fixedCode .= substr($code, 8);
$fixedCode .= substr($code, 10, 6);
$fixedCode .= substr($code, 9);
$fixedCode .= substr($code, 16, strlen($code));
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"; }
}
}
}
}
?>