summaryrefslogtreecommitdiff
path: root/.irssi/scripts/bitlbee_tab_completion.pl
diff options
context:
space:
mode:
authorManuel Traut <manut@ford.mecka.net>2019-08-07 22:47:19 +0200
committerManuel Traut <manut@ford.mecka.net>2019-08-07 22:47:19 +0200
commit120eccbfa839a0723f6ffeb9b80742bc960a3d41 (patch)
treecb3594a3e068fc89dc55a34a8302fb7887bc83bc /.irssi/scripts/bitlbee_tab_completion.pl
initial version from ford
Signed-off-by: Manuel Traut <manut@ford.mecka.net>
Diffstat (limited to '.irssi/scripts/bitlbee_tab_completion.pl')
-rw-r--r--.irssi/scripts/bitlbee_tab_completion.pl196
1 files changed, 196 insertions, 0 deletions
diff --git a/.irssi/scripts/bitlbee_tab_completion.pl b/.irssi/scripts/bitlbee_tab_completion.pl
new file mode 100644
index 0000000..82cbe8f
--- /dev/null
+++ b/.irssi/scripts/bitlbee_tab_completion.pl
@@ -0,0 +1,196 @@
+use strict;
+use vars qw(%topics);
+use vars qw($VERSION %IRSSI);
+use Irssi qw(signal_add_last signal_add_first settings_add_bool settings_add_str
+ settings_get_bool settings_get_str signal_stop);
+use Irssi::Irc;
+
+$VERSION = '1.00';
+
+%IRSSI = (
+ authors => 'Tijmen Ruizendaal & Wilmer van der Gaast',
+ contact => 'timing@fokdat.nl timing@OFTC',
+ name => 'BitlBee_tab_completion',
+ description => 'Intelligent Tab-completion for Bitlbee commands (for more info: http://www.bitlbee.org).',
+ license => 'GPLv2',
+ url => 'http://fokdat.nl/~tijmen/software/index.html',
+ changed => '05-18-2004',
+);
+
+my $debug = 0; ## change this into 1 if you want to see some output in your control panel, it's not much, so don't be scared.
+
+## Hardcoded defaults, most of these will be auto-guessed when the BitlBee server supports this.
+
+my $root_nick = 'root';
+my $bitlbee_channel = '#bitlbee';
+my $getting_completions = '0';
+
+my @commands = ('account','allow','block','blist','help','identify','info','nick','qlist','register','remove','rename','save','set');
+my @setlist = ('auto_connect','auto_reconnect','auto_reconnect_delay','away_devoice','buddy_sendbuffer','buddy_sendbuffer_delay','charset','debug','handle_unknown','html','ops','private','save_on_quit','typing_notice','to_char');
+my @helplist = ('away','commands','groupchats','groupchats2','groupchats3','index','quickstart','quickstart2','quickstart3','quickstart4','quickstart5','smileys');
+
+my @accountlist = ('add','del','list','on','off');
+my @blist = ('all','away','offline','online');
+my @boolean = ('true', 'false');
+my @handle_unknown = ('root', 'add', 'add_private', 'add_channel', 'ignore');
+my @ops = ('both', 'root', 'user', 'none');
+my @html = ('strip', 'nostrip');
+
+##pfft, done with that...
+
+my $i;
+
+for $i ( @commands )
+{
+ @helplist = ( @helplist, $i );
+}
+
+signal_add_last 'channel sync' => sub {
+ my( $channel ) = @_;
+ my( $server ) = $channel->{server};
+
+ if( $channel->{topic} eq "Welcome to the control channel. Type \x02help\x02 for help information." )
+ {
+ $bitlbee_channel = $channel->{name};
+ $getting_completions = 1;
+ $server->send_raw( 'COMPLETIONS' );
+ if($debug == 1){
+ print( 'Detected a #bitlbee: ' . $channel->{name} );
+ }
+ }
+};
+
+signal_add_last 'message irc notice' => sub {
+ my( $server, $msg, $from, $address, $target ) = @_;
+
+ ## Ignore the notice if we have the completions already.
+ return unless $getting_completions;
+
+ if( $msg =~ s/^COMPLETIONS // )
+ {
+ $root_nick = $from;
+ if( $msg eq 'OK' )
+ {
+ ## We're sure that the server supports the COMPLETIONS
+ ## command now, so let's flush our hardcoded stuff.
+ @commands = @setlist = @helplist = ();
+ if($debug == 1)
+ {
+ print( 'COMPLETIONS fetching supported!' );
+ }
+ }
+ elsif( $msg eq 'END' )
+ {
+ ## Ignore further notices.
+ $getting_completions = 0;
+ if($debug == 1)
+ {
+ print( 'COMPLETIONS fetching finished!' );
+ }
+ }
+ elsif( $msg =~ s/^help // )
+ {
+ @helplist = ( @helplist, $msg );
+ }
+ elsif( $msg =~ s/^set // )
+ {
+ @setlist = ( @setlist, $msg );
+ }
+ else
+ {
+ @commands = ( @commands, $msg );
+ }
+
+ signal_stop();
+ }
+};
+
+signal_add_last 'complete word' => sub {
+ my ($complist, $window, $word, $linestart, $want_space) = @_;
+ my $channel = $window->get_active_name();
+ if ($channel eq $bitlbee_channel or $channel eq $root_nick or $linestart =~ /^\/(msg|query) \Q$root_nick\E */i){
+ $linestart =~ s/^\/(msg|query) \Q$root_nick\E *//i;
+ $linestart =~ s/^\Q$root_nick\E[:,] *//i;
+ if ($linestart eq ""){
+ foreach my $command(@commands)
+ {
+ if ($command =~ /^$word/i)
+ {
+ push @$complist, $command;
+ }
+ }
+ }elsif ($linestart eq "set" or $linestart eq "help set")
+ {
+ foreach my $set(@setlist)
+ {
+ if ($set =~ /^$word/i)
+ {
+ push @$complist, $set;
+ }
+ }
+ }elsif ($linestart eq "help")
+ {
+ foreach my $help(@helplist)
+ {
+ if ($help =~ /^$word/i)
+ {
+ push @$complist, $help;
+ }
+ }
+ }elsif ($linestart eq "blist")
+ {
+ foreach my $list(@blist)
+ {
+ if ($list =~ /^$word/i)
+ {
+ push @$complist, $list;
+ }
+ }
+ }elsif ($linestart eq "account" || $linestart eq "help account")
+ {
+ foreach my $account(@accountlist)
+ {
+ if ($account =~ /^$word/i)
+ {
+ push @$complist, $account;
+ }
+ }
+ }elsif($linestart eq 'set away_devoice' || $linestart eq 'set auto_connect' || $linestart eq 'set auto_reconnect' || $linestart eq 'set buddy_sendbuffer' || $linestart eq 'set debug' || $linestart eq 'set private' || $linestart eq 'set save_on_quit' || $linestart eq 'set typing_notice')
+ {
+ foreach my $bool(@boolean)
+ {
+ if ($bool =~ /^$word/i)
+ {
+ push @$complist, $bool;
+ }
+ }
+ }elsif($linestart eq 'set handle_unknown')
+ {
+ foreach my $handle(@handle_unknown)
+ {
+ if ($handle =~ /^$word/i)
+ {
+ push @$complist, $handle;
+ }
+ }
+ }elsif($linestart eq 'set ops')
+ {
+ foreach my $op(@ops)
+ {
+ if ($op =~ /^$word/i)
+ {
+ push @$complist, $op;
+ }
+ }
+ }elsif($linestart eq 'set html')
+ {
+ foreach my $strip(@html)
+ {
+ if ($strip =~ /^$word/i)
+ {
+ push @$complist, $strip;
+ }
+ }
+ }
+ }
+};