# hipchat_complete.pl - (c) 2013 John Morrissey # (c) 2014 Brock Wilcox # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # About # ===== # # Adds Hipchat tab completion support. # # By default, Hipchat's XMPP interface sets user nicks to their full names, # not their "mention names," so you always have to recall and manually type # a user's mention name so Hipchat highlights the message, sends them e-mail # if they're away, etc. # # This plugin tab-completes mention names and tab-translates name-based # nicks to their corresponding "mention names." # # For example, if JohnMorrissey has a mention name of @jwm, all of these # tab complete to @jwm: # # John # @John # @jw # # # To use # ====== # # 1. Install the WebService::HipChat module from CPAN. # # 2. /script load hipchat_completion.pl # # 3. Get a Hipchat auth v2 token (hipchat.com -> Account settings -> API # access). In irssi: # # /set hipchat_auth_token some-hex-value # # 4. If your Hipchat server isn't in the "bitlbee" chatnet (the 'chatnet' # parameter in your irssi server list for the IRC server you use to # connect to Hipchat), specify the name of the chatnet: # # /set hipchat_chatnet some-chatnet-name use strict; use Irssi; use WebService::HipChat; our $VERSION = '2.0'; our %IRSSI = ( authors => 'John Morrissey', contact => '[email protected]', name => 'hipchat_complete', description => 'Translate nicks to HipChat "mention names"', license => 'BSD', ); my %NICK_TO_MENTION; my $LAST_MAP_UPDATED = 0; sub get_hipchat_people { my $auth_token = Irssi::settings_get_str('hipchat_auth_token'); if (!$auth_token) { return; } my $hc = WebService::HipChat->new(auth_token => $auth_token); my $hipchat_users = $hc->get_users->{items}; foreach my $user (@{$hipchat_users}) { my $name = $user->{name}; $name =~ s/[^A-Za-z]//g; $NICK_TO_MENTION{$name} = $user->{mention_name}; } $LAST_MAP_UPDATED = time(); } sub sig_complete_hipchat_nick { my ($complist, $window, $word, $linestart, $want_space) = @_; my $wi = Irssi::active_win()->{active}; return unless ref $wi and $wi->{type} eq 'CHANNEL'; return unless $wi->{server}->{chatnet} eq Irssi::settings_get_str('hipchat_chatnet'); # Reload the nick -> mention name map periodically, # so we pick up new users. if (($LAST_MAP_UPDATED + 4 * 60 * 60) < time()) { get_hipchat_people(); } if ($word =~ /^@/) { $word =~ s/^@//; } foreach my $nick ($wi->nicks()) { if ($nick->{nick} =~ /^\Q$word\E/i) { push(@$complist, "\@$NICK_TO_MENTION{$nick->{nick}}"); } } foreach my $mention (values %NICK_TO_MENTION) { if ($mention =~ /^\Q$word\E/i) { push(@$complist, "\@$mention"); } } # If there's a mention name completion that begins with $word, # prefer that over a channel nick/fullname. @$complist = sort { return $a =~ /^\@\Q$word\E(.*)$/i ? 0 : 1; } @$complist; } Irssi::settings_add_str('hipchat_complete', 'hipchat_auth_token', ''); Irssi::settings_add_str('hipchat_complete', 'hipchat_chatnet', 'bitlbee'); get_hipchat_people(); Irssi::signal_add('complete word', \&sig_complete_hipchat_nick);