Initial commit
This commit is contained in:
commit
80503205b0
5 changed files with 288 additions and 0 deletions
48
main.php
Normal file
48
main.php
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
declare(ticks = 1);
|
||||
|
||||
const PLUGIN_DIR = 'plugins';
|
||||
|
||||
// All IO streams
|
||||
$_iostreams = [];
|
||||
|
||||
// All activated plugins
|
||||
$_plugins = [];
|
||||
|
||||
$_started = false;
|
||||
|
||||
$_reload = function()
|
||||
{
|
||||
static $require_reload = false;
|
||||
if (!func_num_args())
|
||||
{
|
||||
$ret = $require_reload;
|
||||
$require_reload = false;
|
||||
return $ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
$require_reload = $require_reload || func_get_arg(0);
|
||||
}
|
||||
};
|
||||
|
||||
// Available plugin hooks:
|
||||
// onconnect
|
||||
// oninput
|
||||
// onoutput
|
||||
// ondisconnect
|
||||
// onload
|
||||
// onforget
|
||||
|
||||
require 'utils.php';
|
||||
$_load_code();
|
||||
$_started = true;
|
||||
while (true)
|
||||
{
|
||||
$_loop();
|
||||
|
||||
echo 'Executing scheduled reload...', PHP_EOL;
|
||||
$_forget_code();
|
||||
$_load_code();
|
||||
}
|
31
plugins/0001_echoer.php
Normal file
31
plugins/0001_echoer.php
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
$_plugins['onload'][] = function()
|
||||
{
|
||||
echo 'Echoer loaded!', PHP_EOL;
|
||||
};
|
||||
|
||||
$_plugins['onforget'][] = function()
|
||||
{
|
||||
echo 'Echoer being forgotten!', PHP_EOL;
|
||||
};
|
||||
|
||||
$_plugins['oninput'][] = function($id, $input)
|
||||
{
|
||||
echo '[', $id, '] -> ', $input, PHP_EOL;
|
||||
};
|
||||
|
||||
$_plugins['onoutput'][] = function($id, $output)
|
||||
{
|
||||
echo '[', $id, '] <- ', rtrim($output), PHP_EOL;
|
||||
};
|
||||
|
||||
$_plugins['onconnect'][] = function($id, $host, $port)
|
||||
{
|
||||
echo 'Connected to ', $host, ':', $port, ' as ', $id, '.', PHP_EOL;
|
||||
};
|
||||
|
||||
$_plugins['ondisconnect'][] = function($id)
|
||||
{
|
||||
echo 'Disconnecting from ', $id, '...', PHP_EOL;
|
||||
};
|
34
plugins/0020_autojoin.php
Normal file
34
plugins/0020_autojoin.php
Normal file
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
$_autojoin_servers =
|
||||
[
|
||||
['irc.quakenet.org', 6667],
|
||||
//['irc.cc.tut.fi', 6667]
|
||||
];
|
||||
|
||||
$_user_info =
|
||||
[
|
||||
'nick' => 'BaseT',
|
||||
'altnick' => 'AltBase',
|
||||
'username' => 'baset',
|
||||
'realname' => '10/100Base-T Ports'
|
||||
];
|
||||
|
||||
// No need for & since this will only be run at start
|
||||
$_plugins['onload'][] = function() use ($_autojoin_servers, $_started, $_connect)
|
||||
{
|
||||
if (!$_started)
|
||||
{
|
||||
foreach ($_autojoin_servers as $server)
|
||||
{
|
||||
$_connect($server[0], $server[1]);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$_plugins['onconnect'][] = function($id, $host, $port) use (&$_write, &$_user_info)
|
||||
{
|
||||
$_write($id, sprintf("NICK %s\r\n", $_user_info['nick']));
|
||||
$_write($id, sprintf("USER %s 8 * :%s\r\n", $_user_info['username'],
|
||||
$_user_info['realname']));
|
||||
};
|
9
plugins/9998_pingresponse.php
Normal file
9
plugins/9998_pingresponse.php
Normal file
|
@ -0,0 +1,9 @@
|
|||
<?php
|
||||
|
||||
$_plugins['oninput'][] = function($id, $input) use (&$_write)
|
||||
{
|
||||
if (substr($input, 0, 4) === 'PING')
|
||||
{
|
||||
$_write($id, 'PONG :' . substr($input, 6) . "\r\n");
|
||||
}
|
||||
};
|
166
utils.php
Normal file
166
utils.php
Normal file
|
@ -0,0 +1,166 @@
|
|||
<?php
|
||||
|
||||
$_stream_fwrite = function($fp, $string) {
|
||||
for ($written = 0; $written < strlen($string); $written += $fwrite) {
|
||||
$fwrite = fwrite($fp, substr($string, $written));
|
||||
if ($fwrite === false) {
|
||||
return $written;
|
||||
}
|
||||
}
|
||||
return $written;
|
||||
};
|
||||
|
||||
$_trigger = function($type, $args) use (&$_plugins)
|
||||
{
|
||||
if (!isset($_plugins[$type])) return;
|
||||
|
||||
foreach ($_plugins[$type] as $plugin)
|
||||
{
|
||||
call_user_func_array($plugin, $args);
|
||||
}
|
||||
};
|
||||
|
||||
// Events
|
||||
$_on_connect = function($id, $host, $port) use (&$_trigger)
|
||||
{
|
||||
$_trigger('onconnect', [$id, $host, $port]);
|
||||
};
|
||||
|
||||
$_on_disconnect = function($id) use (&$_trigger)
|
||||
{
|
||||
$_trigger('ondisconnect', [$id]);
|
||||
};
|
||||
|
||||
$_on_input = function($id, $input) use (&$_trigger)
|
||||
{
|
||||
$_trigger('oninput', [$id, $input]);
|
||||
};
|
||||
|
||||
$_on_output = function($id, $output) use (&$_trigger)
|
||||
{
|
||||
$_trigger('onoutput', [$id, $output]);
|
||||
};
|
||||
|
||||
$_on_load = function() use (&$_trigger)
|
||||
{
|
||||
$_trigger('onload', []);
|
||||
};
|
||||
|
||||
$_on_forget = function() use (&$_trigger)
|
||||
{
|
||||
$_trigger('onforget', []);
|
||||
};
|
||||
|
||||
|
||||
|
||||
$_load_code = function() use (&$_iostreams, &$_plugins, &$_on_connect,
|
||||
&$_on_disconnect, &$_on_input, &$_on_load,
|
||||
&$_on_forget, &$_started, &$_reload)
|
||||
{
|
||||
// Reload functions from utils.php
|
||||
require 'utils.php';
|
||||
|
||||
$files = scandir(PLUGIN_DIR, SCANDIR_SORT_ASCENDING);
|
||||
foreach ($files as $file)
|
||||
{
|
||||
if ($file != '.' && $file != '..')
|
||||
include PLUGIN_DIR . '/' . $file;
|
||||
}
|
||||
|
||||
$_on_load();
|
||||
};
|
||||
|
||||
$_forget_code = function() use (&$_plugins, &$_on_forget)
|
||||
{
|
||||
$_on_forget();
|
||||
|
||||
$_plugins = [];
|
||||
};
|
||||
|
||||
$_connect = function($host, $port) use (&$_iostreams, &$_on_connect)
|
||||
{
|
||||
$sock = fsockopen($host, $port);
|
||||
stream_set_blocking($sock, 0);
|
||||
$_iostreams[] = $sock;
|
||||
|
||||
$newid = 0;
|
||||
foreach ($_iostreams as $id => $stream)
|
||||
{
|
||||
if ($stream === $sock)
|
||||
{
|
||||
$newid = $id;
|
||||
}
|
||||
}
|
||||
|
||||
$_on_connect($newid, $host, $port);
|
||||
};
|
||||
|
||||
$_disconnect = function($id) use (&$_iostreams, &$_on_disconnect)
|
||||
{
|
||||
$_on_disconnect($id);
|
||||
fclose($_iostreams[$id]);
|
||||
unset($_iostreams[$id]);
|
||||
};
|
||||
|
||||
$_write = function($id, $output) use (&$_iostreams, &$_stream_fwrite, &$_on_output)
|
||||
{
|
||||
$_on_output($id, $output);
|
||||
$_stream_fwrite($_iostreams[$id], $output);
|
||||
};
|
||||
|
||||
|
||||
|
||||
$_loop = function() use (&$_iostreams, &$_plugins, &$_disconnect, &$_on_input, &$_reload)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
if ($_reload()) return;
|
||||
if (count($_iostreams) == 0) exit;
|
||||
|
||||
$r = $_iostreams;
|
||||
$w = [];
|
||||
$e = [];
|
||||
@stream_select($r, $w, $e, null);
|
||||
|
||||
foreach ($r as $instream)
|
||||
{
|
||||
$inid = 0;
|
||||
foreach ($_iostreams as $id => $stream)
|
||||
{
|
||||
if ($stream === $instream)
|
||||
{
|
||||
$inid = $id;
|
||||
}
|
||||
}
|
||||
|
||||
if (feof($instream))
|
||||
{
|
||||
$_disconnect($inid);
|
||||
}
|
||||
else
|
||||
{
|
||||
$read = [];
|
||||
while (true)
|
||||
{
|
||||
$line = rtrim(fgets($instream));
|
||||
if ($line == '') break;
|
||||
$read[] = $line;
|
||||
}
|
||||
|
||||
foreach ($read as $line)
|
||||
{
|
||||
$_on_input($inid, $line);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Reload code when appropriate signal is received
|
||||
$_sig_handler = function($signo) use (&$_reload)
|
||||
{
|
||||
echo 'Got SIGUSR1, scheduling reload...', PHP_EOL;
|
||||
$_reload(true);
|
||||
};
|
||||
|
||||
pcntl_signal(SIGUSR1, $_sig_handler);
|
Loading…
Reference in a new issue