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
?>