diff --git a/README.md b/README.md index 3b48864..7e59c26 100755 --- a/README.md +++ b/README.md @@ -60,6 +60,12 @@ Read-Write access for working directory #### Changelog +* v1.5.0: + * Polishing up, adding some last minute fixes. + * Tweaks on irc.php + * Reconstruct socket chunk parsing, allows for more thorough IRC parsing capability + * Fix /help missing /msg command. + * v1.4.1: * Fix usleep bug where irc.php sleeps for less than a millisecond (lol) diff --git a/dark.css b/dark.css index 177e0fe..2d9a91b 100755 --- a/dark.css +++ b/dark.css @@ -141,17 +141,17 @@ input, button, select, textarea{ overflow-x: auto; } -#msgs tr:nth-child(even) { background-color: #454545; } -#msgs tr:nth-child(odd) { background-color: #323232; } -#msgs td:nth-child(even) { width: 80%; } -#msgs td:nth-child(odd) { width: 20%; min-width: 120px; max-width: 210px; } -#msgs td { padding: 4px; border-radius: 4px; } +#msgs tr:nth-child(even) { background-color: #333333; } +#msgs tr:nth-child(odd) { background-color: #262626; } +#msgs td:nth-child(even) { width: 100%; } +#msgs td:nth-child(odd) { min-width: 120px; } +#msgs td { padding: 0px 4px 0px 4px; border-radius: 3px; } -#logmsgs tr:nth-child(even) { background-color: #454545; } -#logmsgs tr:nth-child(odd) { background-color: #323232; } -#logmsgs td:nth-child(even) { width: 80%; } -#logmsgs td:nth-child(odd) { width: 20%; min-width: 120px; max-width: 180px; } -#logmsgs td { padding: 4px; border-radius: 4px; } +#logmsgs tr:nth-child(even) { background-color: #333333; } +#logmsgs tr:nth-child(odd) { background-color: #262626; } +#logmsgs td:nth-child(even) { width: 100%; } +#logmsgs td:nth-child(odd) { min-width: 120px; } +#logmsgs td { padding: 0px 4px 0px 4px; border-radius: 3px; } #footer { text-align: center; diff --git a/irc.php b/irc.php index 65116a1..c571f9c 100755 --- a/irc.php +++ b/irc.php @@ -54,25 +54,35 @@ if(!isset($username) || $username == "") { // Create a socket to use $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); +// Send first packets to client to inform connection +$socketFileContents = file_get_contents("users/$username.log"); // get current log contents +$msgline = "" . $server_address . " ~ Connecting to $server_address:$server_port... please wait a few\n"; +file_put_contents("users/$username.log", $socketFileContents . $msgline); + // Connect to IRC server via socket above socket_connect($socket, $server_address, $server_port); +sleep(2); + // NICK and USER calls to IRC $nickline = "NICK " . $usernickname . "\n"; $userline = "USER " . $usernickname . " 0 * :" . $username . "'s $title $version client\n"; // Pass NICK and USER back to IRC server over socket socket_write($socket, $nickline, strlen($nickline)); +// Sleep for a second before sending USER lineage +sleep(1); +// SEND IT socket_write($socket, $userline, strlen($userline)); -sleep(1); +//sleep(1); // Continue the rest of the script here // While script will continue as long as socket continues to be active -while($bytes = socket_recv($socket, $r_data, 3068, MSG_DONTWAIT) !== '') { +while($bytes = socket_recv($socket, $r_data, 3096, MSG_DONTWAIT) !== '') { if($bytes !== FALSE) { //$data = socket_read($socket, 2048, PHP_NORMAL_READ); - $data = $r_data; + $packetdata = $r_data; } // If client sent something, push it to the IRC server! @@ -89,7 +99,7 @@ while($bytes = socket_recv($socket, $r_data, 3068, MSG_DONTWAIT) !== '') { if(!file_exists("users/.$username.pingfile")) { // If file is missing, quit // Debug logging, check if IRC is exiting properly doLog("Exiting, $username logged out..."); - $quitline = "QUIT :$username toggled disconnect; webirc\n"; // IRC QUIT line + $quitline = "QUIT :$username toggled disconnect; $title $version\n"; // IRC QUIT line socket_write($socket, $quitline, strlen($quitline)); // Push to socket socket_close($socket); // Close the socket exit(0); // Exit the script, nothing to do. @@ -97,76 +107,86 @@ while($bytes = socket_recv($socket, $r_data, 3068, MSG_DONTWAIT) !== '') { // If data variable is set and buffer has data to recieve // RECIEVE IT! - if(isset($data)) { // If data variable is set, there's data from socket - $stringMsg = explode('PRIVMSG', $data); // Strip IRC commands - // Get original contents from socket - $socketFileContents = file_get_contents("users/$username.log"); - $ex = explode(' ', $data); - $data = htmlentities($data); + if(isset($packetdata)) { // If data variable is set, there's data from socket + doLog("Server received chunk: $packetdata"); - // Send PONG back to the server - if ($ex[0] == "PING") { - // Log pong - doLog("PONG, $username response..."); - $pongline = "PONG " . $ex[1] . "\n"; // PONG IRC CMD - // Push to IRC server via socket. - socket_write($socket, $pongline, strlen($pongline)); - } else if ($ex[1] == "PART") { - $senderNick = get_string_between($data, ":", "!"); - $senderIp = get_string_between($data, "@", " "); - $exitMsg = explode('PART', $data); - $msgline = "$senderNick
$senderIp left " . stripslashes(trim($exitMsg[1])) . ""; - file_put_contents("users/$username.log", $socketFileContents . $msgline); - } else if ($ex[1] == "JOIN") { - $senderNick = get_string_between($data, ":", "!"); - $senderIp = get_string_between($data, "@", " "); - if($senderNick != $usernickname) { - $msgline = "$senderNick
$senderIp joined the channel\n"; - file_put_contents("users/$username.log", $socketFileContents . $msgline); - } else { - $msgline = "" . $server_address . " ~ " . $data . "\n"; - file_put_contents("users/$username.log", $socketFileContents . $msgline); - } - } else if ($ex[1] == "NICK") { - $senderNick = get_string_between($data, ":", "!"); - $senderIp = get_string_between($data, "@", " "); - $nickMsg = explode('NICK', $data); - $msgline = "$senderNick
$senderIp $senderNick is now known as" . trim($nickMsg[1]) . "\n"; - file_put_contents("users/$username.log", $socketFileContents . $msgline); - } else if ($ex[1] == "QUIT") { - $senderNick = get_string_between($data, ":", "!"); - $senderIp = get_string_between($data, "@", " "); - $quitMsg = explode('QUIT :', $data); - $msgline = "$server_address ~ $senderNick left: " . trim($quitMsg[1]) . "\n"; - file_put_contents("users/$username.log", $socketFileContents . $msgline); - } else if ($ex[2] == $usernickname && $ex[1] == "PRIVMSG") { - $senderNick = get_string_between($data, ":", "!"); - $senderIp = get_string_between($data, "@", " "); - $privMsg = explode($usernickname . " :", $stringMsg[1]); - file_put_contents("users/.$username.pmed", "$senderNick"); - $msgline = "PM from: $senderNick
$senderIp " . htmlentities(stripslashes(trim($privMsg[1]))) . "\n"; - file_put_contents("users/$username.log", $socketFileContents . $msgline); - $msg = ""; - } else if ($stringMsg[1] != "") { - $senderNick = get_string_between($data, ":", "!"); - $senderIp = get_string_between($data, "@", " "); - $channel = explode(" :", $stringMsg[1]); - $msg = explode($channel[0] . " :", $stringMsg[1]); + $lines = explode("\r\n", $packetdata); - $msgline = "$senderNick:" . $channel[0] . "
$senderIp " . htmlentities(stripslashes(trim($msg[1]))) . ""; - if(usernameInMsg($usernickname, $msg[1])==true) { - file_put_contents("users/.$username.mentioned", "$senderNick"); - } + foreach($lines as $data) { + if($data == "") { continue; } - file_put_contents("users/$username.log", $socketFileContents . $msgline); - } else if ($ex[0] != "PING") { - $msgline = "" . $server_address . " ~ " . $data . "\n"; - file_put_contents("users/$username.log", $socketFileContents . $msgline); - } + doLog("Line: $data"); + + $socketFileContents = file_get_contents("users/$username.log"); + $stringMsg = explode('PRIVMSG', $data); // Strip IRC commands + $ex = explode(' ', $data); + $data = htmlentities($data); + + // Send PONG back to the server + if ($ex[0] == "PING") { + // Log pong + doLog("PONG, $username response..."); + $pongline = "PONG " . $ex[1] . "\n"; // PONG IRC CMD + // Push to IRC server via socket. + socket_write($socket, $pongline, strlen($pongline)); + } else if ($ex[1] == "PART") { + $senderNick = get_string_between($data, ":", "!"); + $senderIp = get_string_between($data, "@", " "); + $exitMsg = explode('PART', $data); + $msgline = "$senderNick
$senderIp left " . stripslashes(trim($exitMsg[1])) . ""; + file_put_contents("users/$username.log", $socketFileContents . $msgline); + } else if ($ex[1] == "JOIN") { + $senderNick = get_string_between($data, ":", "!"); + $senderIp = get_string_between($data, "@", " "); + $joinChannel = explode("JOIN :", $data); + if($senderNick != $usernickname) { + $msgline = "$senderNick
$senderIp joined " . $joinChannel[1] . "\n"; + file_put_contents("users/$username.log", $socketFileContents . $msgline); + } else { + $msgline = "" . $server_address . " ~ Joining " . $joinChannel[1] . "\n"; + file_put_contents("users/$username.log", $socketFileContents . $msgline); + } + } else if ($ex[1] == "NICK") { + $senderNick = get_string_between($data, ":", "!"); + $senderIp = get_string_between($data, "@", " "); + $nickMsg = explode('NICK', $data); + $msgline = "$senderNick
$senderIp $senderNick is now known as" . trim($nickMsg[1]) . "\n"; + file_put_contents("users/$username.log", $socketFileContents . $msgline); + } else if ($ex[1] == "QUIT") { + $senderNick = get_string_between($data, ":", "!"); + $senderIp = get_string_between($data, "@", " "); + $quitMsg = explode('QUIT :', $data); + $msgline = "$server_address ~ $senderNick left: " . trim($quitMsg[1]) . "\n"; + file_put_contents("users/$username.log", $socketFileContents . $msgline); + } else if ($ex[2] == $usernickname && $ex[1] == "PRIVMSG") { + $senderNick = get_string_between($data, ":", "!"); + $senderIp = get_string_between($data, "@", " "); + $privMsg = explode($usernickname . " :", $stringMsg[1]); + file_put_contents("users/.$username.pmed", "$senderNick"); + $msgline = "PM from: $senderNick
$senderIp " . htmlentities(stripslashes(trim($privMsg[1]))) . "\n"; + file_put_contents("users/$username.log", $socketFileContents . $msgline); + $msg = ""; + } else if ($stringMsg[1] != "") { + $senderNick = get_string_between($data, ":", "!"); + $senderIp = get_string_between($data, "@", " "); + $channel = explode(" :", $stringMsg[1]); + $msg = explode($channel[0] . " :", $stringMsg[1]); + + $msgline = "$senderNick:" . $channel[0] . "$senderIp " . htmlentities(stripslashes(trim($msg[1]))) . ""; + if(usernameInMsg($usernickname, $msg[1])==true) { + file_put_contents("users/.$username.mentioned", "$senderNick"); + } + + file_put_contents("users/$username.log", $socketFileContents . $msgline); + } else if ($ex[0] == ":$server_address") { + $msgline = "" . $server_address . " ~ " . $data . "\n"; + file_put_contents("users/$username.log", $socketFileContents . $msgline); + } + } } // second sleep to prevent insane CPU load - usleep(500000); + usleep(250000); } ?> diff --git a/light.css b/light.css index 3303af8..597a9e0 100755 --- a/light.css +++ b/light.css @@ -142,15 +142,15 @@ input, button, select, textarea{ #msgs tr:nth-child(even) { background-color: #bbbbbb; } #msgs tr:nth-child(odd) { background-color: #b1b1b1; } -#msgs td:nth-child(even) { width: 80%; } -#msgs td:nth-child(odd) { width: 20%; min-width: 120px; max-width: 210px; } -#msgs td { padding: 4px; border-radius: 4px; } +#msgs td:nth-child(even) { width: 100%; } +#msgs td:nth-child(odd) { min-width: 120px; } +#msgs td { padding: 0px 4px 0px 4px; border-radius: 3px; } #logmsgs tr:nth-child(even) { background-color: #bbbbbb; } #logmsgs tr:nth-child(odd) { background-color: #b1b1b1; } #logmsgs td:nth-child(even) { width: 80%; } -#logmsgs td:nth-child(odd) { width: 20%; min-width: 120px; max-width: 180px; } -#logmsgs td { padding: 4px; border-radius: 4px; } +#logmsgs td:nth-child(odd) { min-width: 120px;} +#logmsgs td { padding: 0px 4px 0px 4px; border-radius: 3px; } #footer { text-align: center; diff --git a/server.php b/server.php index a0816c2..b5686f7 100755 --- a/server.php +++ b/server.php @@ -143,6 +143,7 @@ if (isset($_GET['msg']) && $_GET['msg']!="" && isset($_GET['nick']) && $_GET['ni $logline .= "/rejoin (channel): Part, and join a channel; focused channel if none is specified
"; $logline .= "/nick [nickname]: Change your nickname
"; $logline .= "/list [channel]: List users in a channel
"; + $logline .= "/msg [channel|user] [msg]: Message channel, or PM 'user'
"; $logline .= "/usermode [flag(s): Sets MODE flag(s) to user
"; $logfile .= "/mode [channel] [flag(s)]: Sets MODE flag(s) for [channel]
"; $logline .= "/channel: Prints focused channel / user (Alias: /focused)\n"; diff --git a/version.php b/version.php old mode 100644 new mode 100755 index 0f5c851..576b1b3 --- a/version.php +++ b/version.php @@ -5,6 +5,6 @@ // https://github.com/Pentium44/idleirc /////// -$version = "1.4.1"; // IdleIRC version +$version = "1.5.0"; // IdleIRC version ?>