1use strict;
2use vars qw($VERSION %IRSSI);
3
4use Irssi 20020120;
5$VERSION = "0.03";
6%IRSSI = (
7    authors	=> "c0ffee",
8    contact	=> "c0ffee\@penguin-breeder.org",
9    name	=> "mIRC pager",
10    description	=> "Adds the /PAGE command to page a nick (use /page nick <text>)... to ignore pages /set pager_mode off",
11    license	=> "Public Domain",
12    url		=> "http://www.penguin-breeder.org/?page=irssi",
13    changed	=> "2017-03-12",
14);
15
16use Irssi::Irc;
17
18Irssi::theme_register(['page_received','-({channick_hilight $0})- $1',
19	'page_sending','Paging {nick $0}...',
20	'page_pageroff','Page request ignored: {nick $0}\'s pager is {hilight OFF}',
21	'page_pagersilent','Page request to {nick $0} dispatched silently',
22	'page_pageron','Page request to {nick $0} dispatched']);
23
24sub signal_ctcpmsg_reply {
25	my ($server, $data, $nick, $addr, $target) = @_;
26
27	if ($data eq "0") {
28
29		Irssi::printformat(MSGLEVEL_CRAP,'page_pageroff',$nick);
30
31	} elsif ($data eq "1") {
32
33		Irssi::printformat(MSGLEVEL_CRAP,'page_pagersilent',$nick);
34
35	} elsif ($data eq "2") {
36
37		Irssi::printformat(MSGLEVEL_CRAP,'page_pageron',$nick);
38
39	}
40
41	Irssi::signal_stop();
42}
43
44sub signal_ctcpmsg {
45	my ($server, $data, $nick, $addr, $target) = @_;
46	my $pm = Irssi::settings_get_bool('pager_mode');
47	my $cmd = Irssi::settings_get_str('pager_cmd');
48	my $answer = 0;
49	my $rnd = int(rand(65535));
50
51	if ($pm) {
52		$data = "requesting your attention" if ($data eq "");
53		Irssi::printformat(MSGLEVEL_CTCPS, 'page_received',$nick,$data);
54		$answer = 1;
55
56		$nick =~ s/\\/\\\\/g;
57		$nick =~ s/\$/\\\$/g;
58		$nick =~ s/;/\\;/g;
59
60		$data =~ s/\\/\\\\/g;
61		$data =~ s/\$/\\\$/g;
62		$data =~ s/;/\\;/g;
63
64		if ($cmd ne "") {
65
66			$answer = 2;
67			$cmd =~ s/\$r/$rnd/g;
68			$cmd =~ s/\$n/$nick/g;
69			$cmd =~ s/\$i/$server->{chatnet}/g;
70			$cmd =~ s/\$s/$server->{address}/g;
71			$cmd =~ s/\$t/scalar localtime/eg;
72			$cmd =~ s/\$m/$data/g;
73
74			Irssi::command("$cmd");
75
76		}
77	}
78
79	$server->send_raw("NOTICE $nick :\001PAGE $answer\001");
80
81	Irssi::signal_stop();
82}
83
84sub cmd_page {
85	my ($data, $server, $channel) = @_;
86	my ($nick, $what);
87
88	$nick = $data;
89	$nick =~ s/\s(.+)//;
90	$what = $1;
91	$what = " $what" if ($what ne "");
92
93	$server->send_raw("PRIVMSG $nick :\001PAGE$what\001");
94	Irssi::printformat(MSGLEVEL_CRAP,'page_sending', $nick);
95
96}
97
98Irssi::signal_add('ctcp msg page', 'signal_ctcpmsg');
99Irssi::signal_add('ctcp reply page', 'signal_ctcpmsg_reply');
100Irssi::command_bind('page','cmd_page');
101Irssi::settings_add_bool('misc','pager_mode',1);
102Irssi::settings_add_str('misc', 'pager_cmd', "");
103# ok, here for the pager_cmd syntax:
104# "command [parameters]+"
105# where the following things will be replaced:
106#  $n	the nick who paged you
107#  $m	the message
108#  $t	timestamp (format depends on locale)
109#  $i	ircnet
110#  $s	server
111#  $r   a random number
112#
113# for example:
114#   /set pager_cmd exec - play /usr/share/sounds/generic.wav
115#   /set pager_cmd beep
116#   /set pager_cmd eval exec -nosh -name wish$r wish - ; exec -in wish$r wm withdraw . ; exec -in wish$r tk_messageBox -message "$m" -icon info -type ok -title "$n paging..." ; exec -in wish$r destroy .
117