123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <?php
- ///////
- // IdleIRC - 2020
- // (C) Chris Dorman, GPLv3
- // https://notabug.org/Pentium44/idleirc
- ///////
- // server.php - used to communicate between web frontend and irc client
- // Grabs from IRC client output
- // Pushes to IRC client input
- // Include PHP config file with server, title, and channel settings
- include_once("config.php");
- session_start();
- $username = $_SESSION['idleirc-user'];
- $usernick = $_SESSION['idleirc-nick'];
- $acctpass = $_SESSION['idleirc-pass'];
- $channel = $_SESSION['idleirc-channel'];
- $servaddr = $_SESSION['idleirc-servaddr'];
- $servport = $_SESSION['idleirc-servport'];
- // If we have a message; grab user and content and push to IRC client
- if (isset($_GET['msg']) && $_GET['msg']!="" && isset($_GET['nick']) && $_GET['nick']!=""){
- $nick = $usernick; // Usernick
- $msg = rawurldecode(stripslashes(trim($_GET['msg']))); // User message content
- $line = ""; // start with nothing
- $logline = ""; // start with nothing
- // Seperate message input via space
- $cmd = explode(" ", $msg);
- if($cmd[0]=="/msg") { // If using /msg, push private message
- $prvmsg = array_splice($cmd, 2); // grab private message from string
- $line .= "PRIVMSG" . " " . trim($cmd[1]) . " :"; // set for push
- $x = 0;
- $logline .= "<tr><td class='userinfo'><b>$nick</b>: " . trim($cmd[1]) . ": </td><td>";
- foreach($prvmsg as $word) {
- // Grab each word in the array after the privmsg username
- if($x == 0) {
- $line .= $word;
- $logline .= $word;
- } else {
- $line .= " " . $word;
- $logline .= " " . $word;
- }
- $x++;
- }
- $line .= "\n";
- $logline .= "</td></tr>\n";
- } else if($cmd[0]=="/me") { // If using /msg, push private message
- $prvmsg = array_splice($cmd, 1); // grab private message from string
- $line .= "PRIVMSG" . " " . $channel . " :\x01ACTION "; // set for push
- $x = 0;
- $logline .= "<tr><td class='userinfo'><b>$channel:</b></td><td> $nick ";
- foreach($prvmsg as $word) {
- // Grab each word in the array after the privmsg username
- if($x == 0) {
- $line .= $word;
- $logline .= $word;
- } else {
- $line .= " " . $word;
- $logline .= " " . $word;
- }
- $x++;
- }
- $logline .= "</td></tr>\n";
- $line .= "\x01\n";
- } else if ($cmd[0]=="/join") {
- doLog("$username: joining " . $cmd[1]);
- $line .= "JOIN " . trim($cmd[1]) . "\n"; // set for push
- //$logline .= "<tr><td class='userinfo'><b>$nick</b>:</td><td>Joining " . $cmd[1] . "</td></tr>\n"; // push to client
- $_SESSION['idleirc-channel'] = trim($cmd[1]);
- } else if ($cmd[0]=="/channel" || $cmd[0]=="/focused") {
- doLog("$username: checking focused channel: " . $channel);
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>Focused on $channel</td></tr>\n"; // push to client
- } else if ($cmd[0]=="/nick") {
- if($cmd[1]!="") {
- doLog("$username: setting nick to " . $cmd[1]);
- $line .= "NICK " . trim($cmd[1]) . "\n"; // set for push
- $_SESSION['idleirc-nick'] = trim($cmd[1]);
- } else {
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>Joining " . $cmd[1] . "</td></tr>\n";
- }
- } else if ($cmd[0]=="/usermode") {
- if($cmd[1]!="") {
- doLog("$username: setting usermode to " . $cmd[1]);
- $line .= "MODE $nick +x" . trim($cmd[1]) . "\n"; // set for push
- } else {
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>Missing User MODE flags<br /> /usermode [flag(s)]</td></tr>\n";
- }
- } else if ($cmd[0]=="/archive") {
- if(file_exists("users/$username.logcount")) {
- $archivedLogCount = file_get_contents("users/$username.logcount");
- $archivedLogCount++;
- file_put_contents("users/$username.logcount", $archivedLogCount);
- rename("users/$username.log", "users/$username.$archivedLogCount.log");
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>Logs are archived! View under 'IRC logs'</td></tr>\n";
- } else {
- file_put_contents("users/$username.logcount", "1");
- rename("users/$username.log", "users/$username.1.log");
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>Logs are archived! View under 'IRC logs'</td></tr>\n";
- }
- } else if ($cmd[0]=="/mode") {
- if($cmd[1]!="") {
- if($cmd[2]!="") {
- doLog("$username: setting nick to " . $cmd[1]);
- $line .= "MODE " . trim($cmd[1]) . " " . trim($cmd[2]) . "\n"; // set for push
- } else {
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>Missing MODE flags:<br /> /mode [channel] [flag(s)]</td></tr>\n";
- }
- } else {
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>Missing channel and flags:<br /> /mode [channel] [flag(s)]</td></tr>\n";
- }
- } else if ($cmd[0]=="/list") {
- if($cmd[1]!="") {
- doLog("$username: listing users for " . $cmd[1]);
- $line .= "NAMES " . trim($cmd[1]) . "\n"; // set for push
- } else {
- doLog("$username: listing users for $channel");
- $line .= "NAMES $channel\n"; // set for push
- }
- } else if ($cmd[0] == "/rejoin") {
- doLog("$username: rejoining channel");
- if ($cmd[1] != "") {
- $line .= "PART " . trim($cmd[1]) . " :$username leaving...\n"; // push close command to IRC
- $line .= "JOIN " . trim($cmd[1]) . "\n"; // set for push
- //$logline .= "<tr><td class='userinfo'><b>$nick</b>: </td><td>Leaving " . trim($cmd[1]) . "</td></tr>\n"; // push to client
- } else {
- $line .= "PART $channel :$username leaving...\n"; // push close command to IRC
- $line .= "JOIN $channel\n"; // set for push
- //$logline .= "<tr><td class='userinfo'><b>$nick</b>: </td><td>Leaving $channel</td></tr>\n"; // push to client
- }
- } else if ($cmd[0] == "/part") {
- doLog("$username: leaving " . trim($cmd[1]));
- if ($cmd[1] != "") {
- $line .= "PART " . trim($cmd[1]) . " :$nick leaving...\n"; // push close command to IRC
- //$logline .= "<tr><td class='userinfo'><b>$nick</b>: </td><td>Leaving " . trim($cmd[1]) . "</td></tr>\n"; // push to client
- } else {
- $line .= "PART $channel :$username leaving...\n"; // push close command to IRC
- //$logline .= "<tr><td class='userinfo'><b>$nick</b>: </td><td>Leaving $channel</td></tr>\n"; // push to client
- }
- } else if ($cmd[0] == "/focus" || $cmd[0] == "/switch" || $cmd[0] == "/query") {
- if(trim($cmd[1]) != $channel) {
- $_SESSION['idleirc-channel'] = trim($cmd[1]);
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>" . trim($cmd[1]) . " is focused, all messages will be sent to " . trim($cmd[1]) . "</td></tr>\n"; // push to client
- } else {
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version</span> ~</td><td>You're already focused on $channel</td></tr>\n";
- }
- } else if ($cmd[0] == "/help" || $cmd[0] == "/?") {
- $logline .= "<tr><td class='userinfo'><span style='color:$ipcolor;'>$title $version ~</span></td>";
- $logline .= "<td>HELP: Information about $title<br />/join [channel] : Join IRC channel [channel]<br />";
- $logline .= "/archive: Archive current log file, and clear current chat history.<br />";
- $logline .= "/focus [channel|user]: Funnel messages to specific channel or user (Alias: /switch; /query)<br />";
- $logline .= "/part (channel): Part channel, part focused channel if none specified<br />";
- $logline .= "/rejoin (channel): Part, and join a channel; focused channel if none is specified<br />";
- $logline .= "/nick [nickname]: Change your nickname<br />";
- $logline .= "/list [channel]: List users in a channel<br />";
- $logline .= "/msg [channel|user] [msg]: Message channel, or PM 'user'<br />";
- $logline .= "/usermode [flag(s): Sets MODE flag(s) to user<br />";
- $logfile .= "/mode [channel] [flag(s)]: Sets MODE flag(s) for [channel]<br />";
- $logline .= "/channel: Prints focused channel / user (Alias: /focused)</td></tr>\n";
- } else {
- // @@ This is a work in progress
- // Sends every channel message to each channel :[
- $line .= "PRIVMSG $channel :$msg\n";
- $logline .= "<tr><td class='userinfo'><b>$nick</b> to $channel:</td><td> $msg</td></tr>\n";
- }
-
- // Get original content
- $content = file_get_contents("users/$username.log");
- echo "<table>" . nl2br(stripslashes($content)) . "</table>";
- // Grab all contents, and push to socket output file.
- file_put_contents("users/$username.log", $content . $logline);
- // Grab user message and push to IRC client
- file_put_contents("users/.$username.push", $line);
- // Throw out your user message
- //echo nl2br(stripslashes($line));
- // DONE
-
- } else if (isset($_GET['userlist'])) {
- // Generate userlist
- if(file_exists("users/$username.userlist")) {
- $userListContent = file_get_contents("users/$username.userlist");
- echo $userListContent;
- } else {
- echo " ";
- }
- } else if (isset($_GET['get']) && isset($_GET['nick']) && $_GET['nick']!="") {
- $nick = stripslashes(htmlentities($_GET['nick'])); // Username
- // Grab IRC client output
- $content = file_get_contents("users/$nick.log");
- if($_GET['get']=="") {
- // Push content to the web frontend
- echo "<table>" . nl2br(stripslashes($content)) . "</table>";
- // DONE
- } else if($_GET['get']=="notificationmentionexists") {
- if(file_exists("users/.$nick.mentioned")) {
- echo "true";
- } else {
- echo "false";
- }
- } else if($_GET['get']=="notificationpmedexists") {
- if(file_exists("users/.$nick.pmed")) {
- echo "true";
- } else {
- echo "false";
- }
- } else if($_GET['get']=="notificationmention") {
- $mentionuser = file_get_contents("users/.$nick.mentioned");
- unlink("users/.$nick.mentioned");
- echo $mentionuser;
- } else if($_GET['get']=="notificationpmed") {
- $pmuser = file_get_contents("users/.$nick.pmed");
- unlink("users/.$nick.pmed");
- echo $pmuser;
- }
- } else if (isset($_GET['do']) && isset($_GET['nick']) && $_GET['nick']!="") {
- $nick = stripslashes(htmlentities($_GET['nick']));
- include("users/" . $nick . ".php");
- if ($_GET['do']=="clearlog") {
- if(file_exists("users/" . $nick . ".log") && ($acctpass == $userpass)) {
- unlink("users/$nick.log");
- }
- if(file_exists("users/" . $nick . ".logcount") && ($acctpass == $userpass)) {
- $archived = file_get_contents("users/$nick.logcount");
- for($x = 1; $x <= $archived; $x++) {
- if(file_exists("users/$nick.$x.log")) {
- unlink("users/$nick.$x.log");
- }
- }
- unlink("users/$nick.logcount");
- }
- } else if($_GET['do']=="login" && !file_exists("users/.$username.pingfile") && ($acctpass == $userpass)) { // Is user asking for login?
- // Join channel
- $isachannel = substr_count($_SESSION['idleirc-channel'],'#') > 1 ? TRUE : FALSE ;
- if(!isset($_SESSION['idleirc-channel']) || $isachannel == FALSE) {
- file_put_contents("users/.$username.push", "JOIN " . $userchannel . "\n");
- } else {
- file_put_contents("users/.$username.push", "JOIN " . $userchannel . "\n");
- }
-
- // Make sure users DB is clean, put nothing into socket read file
- if(!file_exists("users/$username.log")) {
- file_put_contents("users/$username.log", "");
- chmod("users/$username.log", 0755); // file permissions for read / write
- }
- // start pingfile - determines if webclient is active via write timestamp
- file_put_contents("users/.$username.pingfile", "pong");
- chmod("users/.$username.pingfile", 0755); // file permissions for read / write
-
- // Execute IRC client in background
- // IRC server will die when either 1) pingfile is deleted, or
- // 2) if pingfile is older than 10 seconds of current sys time
- $realpath = realpath("./irc.php"); // get full file path
-
- // Execute IRC client
- shell_exec("/usr/bin/php $realpath $username $servaddr $servport > /dev/null 2>/dev/null &");
- } else if($_GET['do']=="logout" && ($acctpass == $userpass)) { // Is user asking for logout?
- // Remove ping file if user logs out. IRC server will close
- $content = file_get_contents("users/$nick.log");
- file_put_contents("users/$nick.log", $content . "<tr><td class='userinfo'><b>$usernick</b> ~ </td><td> left the server...</td></tr>\n");
- unlink("users/.$nick.pingfile");
- }
- }
- ?>
|