-
Notifications
You must be signed in to change notification settings - Fork 0
/
webif_irssi.pl
146 lines (128 loc) · 3.86 KB
/
webif_irssi.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# read and write fifos to read from and control irssi
#
our $VERSION = '0.1';
our %IRSSI = (
authors => 'Mistakes Consortium',
contact => 'ksnieck@alum.wpi.edu',
name => 'web_if',
description => 'Hacky web interface to irssi, requires other external scripts',
license => 'GPLv3',
url => 'http://github.com/ksnieck/irssi-web_if/',
);
use strict;
use Irssi;
use Irssi::TextUI;
use Fcntl;
our ( $WR_FIFO, $WR_FIFO_HANDLE );
our ( $RD_FIFO, $RD_FIFO_HANDLE, $RD_FIFO_TAG );
sub create_fifo {
my ($new_fifo) = @_;
if (not -p $new_fifo) {
if (system "mkfifo '$new_fifo' &>/dev/null" and
system "mknod '$new_fifo' &>/dev/null") {
print CLIENTERROR "'mkfifo' failed, could not create named pipe";
return "";
}
}
return 1;
}
sub open_rd_fifo {
if (not sysopen $RD_FIFO_HANDLE, $RD_FIFO,
O_NONBLOCK | O_RDONLY) {
print CLIENTERROR "could not open named pipe for read";
return "";
}
Irssi::input_remove($RD_FIFO_TAG) if defined $RD_FIFO_TAG;
$RD_FIFO_TAG = Irssi::input_add fileno($RD_FIFO_HANDLE), INPUT_WRITE, \&read_fifo, '';
return 1;
}
# hooked via Irssi::input_add
sub read_fifo {
foreach (<$RD_FIFO_HANDLE>) {
chomp;
if (substr($_, 0, 1) eq "/") {
Irssi::active_win->command(substr($_,1));
} else {
my $window = Irssi::active_win()->get_active_name();
if ($window ne "(status)" or $window ne '') { # can't /msg into '(status)' or ''
Irssi::active_win->command("msg $window $_");
}
}
}
open_rd_fifo();
}
sub open_wr_fifo {
if (not sysopen $WR_FIFO_HANDLE, $WR_FIFO, O_NONBLOCK | O_RDWR) {
print CLIENTERROR "could not open named pipe for write";
return "";
}
}
sub destroy_rd_fifo {
if (define $RD_FIFO_TAG) {
Irssi::input_remove($RD_FIFO_TAG);
undef $RD_FIFO_TAG;
}
if (defined $RD_FIFO_HANDLE) {
close $RD_FIFO_HANDLE;
undef $RD_FIFO_HANDLE;
}
if (define $WR_FIFO_HANDLE) {
close $WR_FIFO_HANDLE;
undef $WR_FIFO_HANDLE;
}
if (-p $RD_FIFO) {
unlink $RD_FIFO;
undef $RD_FIFO;
}
if (-p $WR_FIFO) {
unlink $WR_FIFO;
undef $WR_FIFO;
}
return 1;
}
# cleanup fifo on unload
Irssi::signal_add_first 'command script unload', sub {
my ($script) = @_;
return unless $script =~
/(?:^|\s) $IRSSI{name}
(?:\.[^. ]*)? (?:\s|$) /x;
destroy_fifos(); # destroy old fifo
Irssi::print("%B>>%n $IRSSI{name} $VERSION unloaded", MSGLEVEL_CLIENTCRAP);
};
#not sure which ones are actually useful, but together it's pretty seamless
Irssi::signal_add_last 'gui print text finished', 'write_screen';
Irssi::signal_add_last 'window item changed', 'write_screen';
Irssi::signal_add_last 'window changed', 'write_screen';
Irssi::signal_add_last 'window changed automatic', 'write_screen';
sub write_screen() {
#my ($text_dest, $str, $stripped_str) = @_;
my $fh;
open($fh, "+>", Irssi::get_irssi_dir().'/web_if_screen');
my $line = Irssi::active_win->view->get_lines;
my $lines = 1;
if (defined $line) {
{
print $fh Irssi::strip_codes($line->get_text(1) . "<br />");
$line = $line->next;
$lines++;
redo if defined $line;
}
}
close $fh;
};
sub setup() {
my $new_fifo = Irssi::get_irssi_dir().'/web_if_fifo';
if (not -p $RD_FIFO) {
create_fifo($new_fifo."_rd");
$RD_FIFO = $new_fifo."_rd";
}
open_rd_fifo();
if (not -p $WR_FIFO) {
create_fifo($new_fifo."_wr");
$WR_FIFO = $new_fifo."_wr";
}
open_wr_fifo();
}
setup();
print CLIENTCRAP "%B>>%n $IRSSI{name} $VERSION (by $IRSSI{authors}) loaded";
print CLIENTCRAP " (Fifo names: $RD_FIFO $WR_FIFO)";