diff options
Diffstat (limited to 'quit-notify/notifyquit.pl')
-rw-r--r-- | quit-notify/notifyquit.pl | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/quit-notify/notifyquit.pl b/quit-notify/notifyquit.pl new file mode 100644 index 0000000..0a9132a --- /dev/null +++ b/quit-notify/notifyquit.pl @@ -0,0 +1,169 @@ +### +# +# Parts of the script pertaining to uberprompt borrowed from +# shabble (shabble!#irssi/@Freenode), thanks for letting me steal from you :P +# +### + +use strict; +use warnings; + +our $VERSION = "0.2"; +our %IRSSI = ( + authors => "Jari Matilainen", + contact => 'vague!#irssi@freenode', + name => "notifyquit", + description => "Notify if user has left the channel", + license => "Public Domain", + url => "http://vague.se" + ); + +my $active = 0; +my $permit_pending = 0; +my $pending_input = {}; + + +sub script_is_loaded { + return exists($Irssi::Script::{shift . '::'}) ; +} + +if (not script_is_loaded('uberprompt')) { + + print "This script requires 'uberprompt.pl' in order to work. " + . "Attempting to load it now..."; + + Irssi::signal_add('script error', 'load_uberprompt_failed'); + Irssi::command("script load uberprompt.pl"); + + unless(script_is_loaded('uberprompt')) { + load_uberprompt_failed("File does not exist"); + } + app_init(); +} else { + app_init(); +} + +sub load_uberprompt_failed { + Irssi::signal_remove('script error', 'load_prompt_failed'); + + print "Script could not be loaded. Script cannot continue. " + . "Check you have uberprompt.pl installed in your scripts directory and " + . "try again. Otherwise, it can be fetched from: "; + print "https://github.com/shabble/irssi-scripts/raw/master/" + . "prompt_info/uberprompt.pl"; + + die "Script Load Failed: " . join(" ", @_); +} + +sub extract_nick { + my ($str) = @_; + + my $completion_char + = quotemeta(Irssi::settings_get_str("completion_char")); + + # from BNF grammar at http://www.irchelp.org/irchelp/rfc/chapter2.html + # special := '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}' + + my $pattern = qr/^( [[:alpha:]] # starts with a letter + (?: [[:alpha:]] # then letter + | \d # or number + | [\[\]\\`^\{\}-]) # or special char + *? ) # any number of times + $completion_char/x; # followed by completion char. + + if ($str =~ m/$pattern/) { + print "Matched: $1"; + return $1; + } else { + return undef; + } + +} + +sub sig_send_text { + my ($data, $server, $witem) = @_; + + return unless($witem); + + return unless $witem->{type} eq 'CHANNEL'; + + # shouldn't need escaping, but it doesn't hurt to be paranoid. + my $target_nick = extract_nick($data); + + if ($target_nick) { + if (not $witem->nick_find($target_nick)) { + + return if $target_nick =~ m/^https?/i + + if ($permit_pending) { + + $pending_input = {}; + $permit_pending = 0; + Irssi::signal_continue(@_); + + } else { + my $text + = "$target_nick isn't in this channel, send anyway? [Y/n]"; + $pending_input + = { + text => $data, + server => $server, + win_item => $witem, + }; + + Irssi::signal_stop; + require_confirmation($text) + } + } + } +} + +sub sig_gui_keypress { + my ($key) = @_; + + return if not $active; + + my $char = chr($key); + + # Enter, y, or Y. + if ($char =~ m/^y?$/i) { + $permit_pending = 1; + Irssi::signal_stop; + Irssi::signal_emit('send text', + $pending_input->{text}, + $pending_input->{server}, + $pending_input->{win_item}); + $active = 0; + set_prompt(''); + + } elsif ($char =~ m/^n?$/i or $key == 3 or $key == 7) { + # we support n, N, Ctrl-C, and Ctrl-G for no. + + Irssi::signal_stop; + set_prompt(''); + + $permit_pending = 0; + $active = 0; + $pending_input = {}; + + } else { + Irssi::signal_stop; + return; + } +} + +sub app_init { + Irssi::signal_add_first("send text" => \&sig_send_text); + Irssi::signal_add_first('gui key pressed' => \&sig_gui_keypress); +} + +sub require_confirmation { + $active = 1; + set_prompt(shift); +} + +sub set_prompt { + my $msg = shift; + $msg = ': ' . $msg if length $msg; + Irssi::signal_emit('change prompt', $msg, 'UP_INNER'); +} |