flush
[m6w6/btr] / bin / btr-irc-relay
1 #!/usr/bin/env php
2 <?php
3
4 require __DIR__."/../lib/btr/irc.php";
5
6 if ($argc != 3) {
7 fatal("Usage: %s <url> <fifo>\n", basename($argv[0]));
8 }
9
10 if (!($hnd = mkfifo($_SERVER["argv"][2]))) {
11 fatal("%s", error_get_last()["message"]);
12 } else {
13 pcntl_signal(SIGINT, "fatal");
14 pcntl_signal(SIGTERM, "fatal");
15 pcntl_signal(SIGQUIT, "fatal");
16 pcntl_signal(SIGHUP, function() {
17 // daemonize
18 switch (pcntl_fork()) {
19 case 0:
20 if (posix_setsid() !== -1) {
21 break;
22 }
23 case -1:
24 fatal();
25 break;
26 default:
27 $_SERVER["argv"][2] = null;
28 exit;
29 }
30 });
31 register_shutdown_function(function() {
32 if (isfifo($_SERVER["argv"][2])) {
33 @unlink($_SERVER["argv"][2]);
34 }
35 });
36 }
37
38 $rfd = $wfd = [];
39 $bot = new Client($argv[1], function() use($hnd, &$rfd) {
40 stream_set_blocking($hnd, false);
41 $rfd[] = $hnd;
42 });
43
44 do {
45 if (false === ($r = $bot->getSession()->run($rfd, $wfd))) {
46 break;
47 }
48 while ($r && $r[0] && ($message = fgets($r[0][0]))) {
49 $bot->send($message);
50 }
51 pcntl_signal_dispatch();
52 } while (!feof($hnd));
53
54 # vim: noet