238 lines
11 KiB
PHP
Executable File
238 lines
11 KiB
PHP
Executable File
<?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]=="/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 .= "/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 .= "/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['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");
|
|
}
|
|
} 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");
|
|
}
|
|
}
|
|
?>
|