Newer
Older
DC29BadgeBot / bot.php
root on 5 Aug 2021 3 KB more error checking
<?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();

    $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();

    $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;
}

$rand = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil(8/strlen($x)) )),1,8);

$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

// announce self to channel
$myCode = get_own_code();
fputs($socket, "PRIVMSG #theSignal :!req " . $rand . " " . $myCode . "\n"); 

// Force an endless while
while (1) {
    // Continue the rest of the script here
    while ($data = fgets($socket, 128)) {
        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" && isset($ex[4]) && isset($ex[5]) && $ex[4] <> "" && $ex[5] <> "") {
                // 4 = bot name, 5 = their code
                if(!in_array($ex[4], $collected)){ // not already added their code
                    $response = get_code($ex[5]);
                    if(preg_match("/^[0-9A-Fa-f]{32}/", $response)){ // valid code back
                        fputs($socket, "PRIVMSG #theSignal :!rsp " . $ex[4] . " " . $response . "\n");
                        array_push($collected, $ex[4]); // add to replied array
                        $myCode = get_own_code();
                        fputs($socket, "PRIVMSG #theSignal :!req " . $rand . " " . $myCode . "\n");

                    }
                }
            }
            if ($command == ":!rsp") {
                if ($ex[4] == $rand && isset($ex[5]) && $ex[5] <> ""){ // response is for this bot
                    get_code($ex[5]);
                }
            }
        }
    }
}
?>