diff options
Diffstat (limited to 'archive/.irssi/scripts/autorun/format_identify.pl')
-rw-r--r-- | archive/.irssi/scripts/autorun/format_identify.pl | 440 |
1 files changed, 440 insertions, 0 deletions
diff --git a/archive/.irssi/scripts/autorun/format_identify.pl b/archive/.irssi/scripts/autorun/format_identify.pl new file mode 100644 index 00000000..0b19c445 --- /dev/null +++ b/archive/.irssi/scripts/autorun/format_identify.pl @@ -0,0 +1,440 @@ + +#!/usr/bin/perl +# ^ to make vim know this is a perl script so I get syntax hilighting. + +##################################################################### +### WARNING: This version was restored from google cache ### +### by Wouter Coekaerts <coekie@irssi.org>. ### +### Syntax might not be exactly the same as the original ### +##################################################################### + +# $Id$ +use strict; +use vars qw($VERSION %IRSSI); +use Irssi qw(signal_stop signal_emit signal_remove + signal_add signal_add_first + settings_add_str settings_get_str settings_add_bool + settings_get_bool + print ); +$VERSION = '1.5-dev-coekie'; +%IRSSI = ( + authors => 'ResDev (Ben Reser)', + contact => 'ben@reser.org', + name => 'format_identify', + description => 'Formats msgs and notices when the identify-msg and/or ' . + 'identify-ctcp capability is available.', + license => 'GPL2', + url => 'http://ben.reser.org/irssi/', +); + +# Additional credit to ch for his wash-imsg script which was a starting place +# for this; coekie for pointing me towards the nickcolor script and its +# technique for doing this; Timo Sirainen and Ian Peters for writing nickcolor. + +# This script takes advantage of the identify-msg and identify-ctcp +# capabilities of the new dancer ircd. The identify-msg capability causes the +# first character of a msg or notice to be set to a + if the user is identified +# with nickserve and a - if not. identify-ctcp does similar for CTCP messages. +# This script removes the tagging and then allows you to configure a +# modification to the formating of the nickname. + +# Installation instructions: Drop this in ~/.irssi/scripts and run +# /script load format_identify. To make it autorun on startup place it in +# ~/.irssi/scripts/autorun. This script will detect if the IRC server has +# the identify-msg and identify-ctcp capability. If it is available it will +# use it. Messages on servers without support for these capabilities will +# be tagged as unknown. +# +# While you can unload this script. Any servers that you are connected to +# with identify-msg/identify-ctcp turned on will continue to send data +# encoded that way. This means messages and notices will have a + or - +# appended to the front of them. CTCPs will be broken. Unfortunately, there +# is no way to turn off a capability once it is turned on. You will have to +# disconnect and reconnect to these servers. This script will warn you when +# unloading the script of this situation. + +# +# Configuration: You can control the formating of the nickname with the +# format_identified_nick, format_unidentified_nick, and format_unknown_nick +# variables. The default is to do nothing to identified nicks and unknown +# nicks. while unidentified nicks have a ~ to the beginning of nick. An +# unknown nick means anytime a message or notice doesn't start with a + or -, +# which will occur when identify-msg isn't enabled. The format_unknown_nick +# can be really handy to alert you that you don't have identify-msg or +# identify-ctcp set, but is set by default to do nothing since most servers do +# not have identify-msg yet. In these variables $0 stands for the nick. You +# can use the standard formating codes or just text in it. See formats.txt for +# more information on the codes you can use. Warning about colors. Using +# colors in this formating will likely break other formating scripts and +# features, in particular the hilight feature of irssi or vice versa. Remember +# that %n has a different meaning here as explamined in the default.theme file +# that comes with irssi. +# +# Some examples: +# +# Make unidentified nicks have a ? after the nick: /set +# format_unidentified_nick $0? +# +# Make unidentified nicks red and identified nicks green: /set +# format_identified_nick %G$0 /set format_unidentified_nick %R$0 Note that the +# above will not do the tagging if a message gets hilighted. Since a hilight +# (line or nick) will override the colors. +# +# So I recommend doing something like this: /set format_identified_nick %G$0 +# /set format_unidentified_nick %R~$0 +# +# Make unidentified nicks be unmodified but add a * before identified nicks: +# /set format_identified_nick *$0 /set format_unidentified_nick $0 +# +# This script works by modifying the formats irssi uses to display various +# things. Therefore it is highly recommended that you do not change any of the +# following format variables except through this script: pubmsg pubmsg_channel +# msg_private msg_private_query pubmsg_hilight pubmsg_hilight_channel pubmsg_me +# pubmsg_me_channel action_private action_private_query action_public +# action_public_channel ctcp_requested ctcp_requested_unknown notice_public +# notice_private ctcp_reply ctcp_reply_channel ctcp_ping_reply + +# +# To change these formats you need to set the variable (with the set command +# not the format command as usual) of the same name as the format but with +# _identify on the end. This format has an additional special purpose +# "abstract" that is only used by this script and is parsed and replaced before +# setting the format and giving it to irssi. It is called format_identify. +# Any format you use with this script should have a {format_identify $0} in it +# to replace where the $0 usually is in the format. Sometimes it will be $1 +# for the nick in the format, in which case you should replace the $1 with +# {format_identify $1}. For more examples take a look at the defaults at the +# bottom of this script. +# +# +# If you wish to disable the module from applying a change to the nickname in a +# particular place the best way to do it is to simply remove the +# {format_identify $0} from the format that applies. E.G. to disable the +# format change for a CTCP reply one would do: /set ctcp_reply_identify CTCP +# {hilight $0} reply from {nick $1}: $2 +# + +# TODO +# * Implement DCC formats, which means figuring out which ones are appropriate +# to try and format. +# * Allow different formating on the nick for different types of messages. I'm +# not sure if this is useful... +# +# It should not be necessary to modify anything in this script. Everything +# should be able to be modified via the variables it exports as described +# above. +# + +my(@format_identify_message_formats) = qw(pubmsg pubmsg_channel msg_private + msg_private_query pubmsg_hilight + pubmsg_hilight_channel action_private + action_private_query action_public + action_public_channel ctcp_requested + ctcp_requested_unknown pubmsg_me + pubmsg_me_channel + ); + +my(@format_identify_notice_formats) = qw(notice_public notice_private ctcp_reply + ctcp_reply_channel ctcp_ping_reply); + + +my %servers; + +# Replace the {format_identify $0} place holder with +# whatever the user has setup for their nick formats... +sub replace_format_identify { + my ($format, $entry) = @_; + + my ($nickarg) = $format =~ /{\s*format_identify\s+?([^\s]+?)\s*}/; + $entry =~ s/\$0/$nickarg/; + $format =~ s/{\s*format_identify\s+?[^\s]+?\s*}/$entry/g; + return $format; +} + +# rewrite the message now that we've updated the formats +sub format_identify_rewrite { + my $signal = shift; + my $proc = shift; + + signal_stop(); + signal_remove($signal,$proc); + signal_emit($signal, @_); + signal_add($signal,$proc); +} + + +# Issue the format update after generating the new format. +sub update_format_identify { + my ($server,$entry,$nick) = @_; + + my $identify_format = settings_get_str("${entry}_identify"); + my $replaced_format = replace_format_identify($identify_format,$nick); + $server->command("^format $entry " . $replaced_format); +} + +my %saved_colors; +my %session_colors = {}; +my @colors = qw/2 3 4 5 6 7 9 10 11 12 13/; + +sub simple_hash { + my ($string) = @_; + chomp $string; + my @chars = split //, $string; + my $counter; + + foreach my $char (@chars) { + $counter += ord $char; + } + + $counter = $colors[($counter % @colors)]; + return $counter; +} + +sub colourise { + return if(!settings_get_bool('format_colour')); + my ($nick) = @_; + my $color = $saved_colors{$nick}; + if (!$color) { + $color = $session_colors{$nick}; + } + if (!$color) { + $color = simple_hash $nick; + $session_colors{$nick} = $color; + } + $color = "0".$color if ($color < 10); + return chr(3).$color; +} + + +# catches the signal for a message removes the + or -, updates the +# formats and then resends the message event. +sub format_identify_message { + my ($server, $data, $nick, $address) = @_; + my ($channel, $msg) = split(/ :/, $data,2); + + if (!$servers{$server->{'real_address'}}->{'IDENTIFY-CTCP'} && + !$servers{$server->{'real_address'}}->{'IDENTIFY-MSG'}) { + my $unknown_nick = settings_get_str('format_unknown_nick'); + foreach my $format (@format_identify_message_formats) { + update_format_identify($server,$format,colourise($nick).$unknown_nick); + } + } elsif(($msg =~ /^\+(.*)/)){ + my $newdata = "$channel :$1"; + my $identified_nick = settings_get_str('format_identified_nick'); + foreach my $format (@format_identify_message_formats) { + update_format_identify($server,$format,colourise($nick).$identified_nick); + } + format_identify_rewrite('event privmsg','format_identify_message', $server,$newdata,$nick,$address); + } elsif(($msg =~ /^-(.*)/)){ + my $newdata = "$channel :$1"; + my $unidentified_nick = settings_get_str('format_unidentified_nick'); + foreach my $format (@format_identify_message_formats) { + update_format_identify($server,$format,colourise($nick).$unidentified_nick); + } + format_identify_rewrite('event privmsg','format_identify_message', $server,$newdata,$nick,$address); + } else { + my $unknown_nick = settings_get_str('format_unknown_nick'); + foreach my $format (@format_identify_message_formats) { + update_format_identify($server,$format,colourise($nick).$unknown_nick); + } + } +} + +# catches the signal for a notice removes the + or -, updates the +# formats and resends the notice event. +sub format_identify_notice { + my ($server, $data, $nick, $address) = @_; + my ($channel, $msg) = split(/ :/, $data,2); + + if (!$servers{$server->{'real_address'}}->{'IDENTIFY-CTCP'} && + !$servers{$server->{'real_address'}}->{'IDENTIFY-MSG'}) { + my $unknown_nick = settings_get_str('format_unknown_nick'); + foreach my $format (@format_identify_notice_formats) { + update_format_identify($server,$format,colourise($nick).$unknown_nick); + } + } elsif(($msg =~ /^\+(.*)/)){ + my $newdata = "$channel :$1"; + my $identified_nick = settings_get_str('format_identified_nick'); + foreach my $format (@format_identify_notice_formats) { + update_format_identify($server,$format,colourise($nick).$identified_nick); + } + format_identify_rewrite('event notice','format_identify_notice', $server,$newdata,$nick,$address); + } elsif(($msg =~ /^-(.*)/)){ + my $newdata = "$channel :$1"; + my $unidentified_nick = settings_get_str('format_unidentified_nick'); + foreach my $format (@format_identify_notice_formats) { + update_format_identify($server,$format,colourise($nick).$unidentified_nick); + } + format_identify_rewrite('event notice','format_identify_notice', $server,$newdata,$nick,$address); + } else { + my $unknown_nick = settings_get_str('format_unknown_nick'); + foreach my $format (@format_identify_notice_formats) { + update_format_identify($server,$format,colourise($nick).$unknown_nick); + } + } +} + +# Handle CTCP messages. Note that messages tagged with identify-ctcp will +# not be seen as CTCPs and will go through event privmsg first. This script +# will generate new events and send them on through to here. However CTCPs +# that are not tagged at all will go here first. So we need to test here +# to see if the message is from a server that does not support identify-ctcp +# and update the format accordingly. +sub format_identify_ctcp_msg { + my ($server) = @_; + + if (!$servers{$server->{'real_address'}}->{'IDENTIFY-CTCP'}) { + my $unknown_nick = settings_get_str('format_unknown_nick'); + foreach my $format (@format_identify_message_formats) { + update_format_identify($server,$format,$unknown_nick); + } + } +} + +# Handle CTCP replies. Note that messages tagged with identify-ctcp will +# not be seen as CTCPs and will go through event notice first. This script +# will generate new events and send them on through to here. However CTCPs +# that are not tagged at all will go here first. So we need to test here +# to see if the message is from a server that does not support identify-ctcp +# and update the format accordingly. +sub format_identify_ctcp_reply { + my ($server) = @_; + + if (!$servers{$server->{'real_address'}}->{'IDENTIFY-CTCP'}) { + my $unknown_nick = settings_get_str('format_unknown_nick'); + foreach my $format (@format_identify_notice_formats) { + update_format_identify($server,$format,$unknown_nick); + } + } +} + +# If we're getting unloaded reset the formats back to their defaults +# so that it doesn't wrongly show people being unidentifed or vice versa. +# Also issue a warning about CTCPs etc being broken. +sub format_identify_unload { + my ($script,$server,$witem) = @_; + my @warning_servers = (); + + if ($script =~ /^format_identify(?:\.pl|\.perl)?$/) { + foreach my $format (@format_identify_message_formats, + @format_identify_notice_formats) { + $server->command("^format -reset $format"); + } + foreach my $server_name (keys %servers) { + if ( $servers{$server_name}->{'IDENTIFY-MSG'} + || $servers{$server_name}->{'IDENTIFY-CTCP'}) + { + if($servers{$server_name}->{'USES-CAP'}) { + $server->command("^quote cap req :-identify-msg"); + } else { + push @warning_servers, $server_name; + } + } + } + print('Warning: Unloading format_identify will leave your messages '. + 'and notices modified and will break CTCPs on the following '. + 'servers: ' . join (',',@warning_servers)); + } +} + +# Server responded to capab request. We want to capture the reply +# and mark it in a hash so we can keep track of which servers have +# the capabilities. This style of reply will come from dancer or +# hyperion. +sub format_identify_capab_reply { + my ($server, $data, $server_name) = @_; + unless (ref($servers{$server_name}) eq 'HASH') { + $servers{$server_name} = {}; + $servers{$server_name}->{'IDENTIFY-MSG'} = 0; + $servers{$server_name}->{'IDENTIFY-CTCP'} = 0; + $servers{$server_name}->{'USES-CAP'} = 0; + } + if ($data =~ /:IDENTIFY-MSG$/) { + $servers{$server_name}->{'IDENTIFY-MSG'} = 1; + $servers{$server_name}->{'USES-CAP'} = 0; + Irssi::signal_stop(); + return; + } + if ($data =~ /:IDENTIFY-CTCP$/) { + $servers{$server_name}->{'IDENTIFY-CTCP'} = 1; + $servers{$server_name}->{'USES-CAP'} = 0; + Irssi::signal_stop(); + return; + } +} + +# The same as above. This style of reply comes from ircd-seven. +sub format_identify_cap_reply { + my ($server, $data, $server_name) = @_; + unless (ref($servers{$server_name}) eq 'HASH') { + $servers{$server_name} = {}; + $servers{$server_name}->{'IDENTIFY-MSG'} = 0; + $servers{$server_name}->{'IDENTIFY-CTCP'} = 0; + $servers{$server_name}->{'USES-CAP'} = 0; + } + if ($data =~ /ACK :.*identify-msg/) { + $servers{$server_name}->{'IDENTIFY-MSG'} = 1; + $servers{$server_name}->{'IDENTIFY-CTCP'} = 1; + $servers{$server_name}->{'USES-CAP'} = 1; + return; + } +} + +# Handles connections to new (to this script) servers and +# attempts to turn on the capabilities it supports. +# We send the request in both formats, for hyperion and ircd-seven. +sub format_identify_connected { + my $server = shift; + $server->command("^quote capab IDENTIFY-MSG"); + $server->command("^quote capab IDENTIFY-CTCP"); + $server->command("^quote cap req :identify-msg"); +} + +# signals to handle the events we need to intercept. +signal_add('event privmsg', 'format_identify_message'); +signal_add('event notice', 'format_identify_notice'); +signal_add('ctcp msg', 'format_identify_ctcp_msg'); +signal_add('ctcp reply', 'format_identify_ctcp_reply'); +signal_add('event 290', 'format_identify_capab_reply'); +signal_add('event cap', 'format_identify_cap_reply'); +signal_add('event connected', 'format_identify_connected'); + +# On load enumerate the servers and try to turn on +# IDENTIFY-MSG and IDENTIFY-CTCP +foreach my $server (Irssi::servers()) { + %servers = (); + format_identify_connected($server); +} + +# signal needed to catch the unload... Be sure to be the first to +# get it too... +signal_add_first('command script unload', 'format_identify_unload'); + +settings_add_bool('format_identify', 'format_colour', 1); + +# How we format the nick. $0 is the nick we'll be formating. +settings_add_str('format_identify','format_identified_nick','$0'); +settings_add_str('format_identify','format_unidentified_nick','~$0'); +settings_add_str('format_identify','format_unknown_nick','$0'); + +# What we use for the formats... +# Don't modify here, use the /set command or modify in the ~/.irssi/config file. +settings_add_str('format_identify','pubmsg_identify','{pubmsgnick $2 {pubnick {format_identify $0}}}$1'); +settings_add_str('format_identify','pubmsg_channel_identify','{pubmsgnick $3 {pubnick {format_identify $0}}{msgchannel $1}}$2'); +settings_add_str('format_identify','msg_private_identify','{privmsg {format_identify $0} $1 }$2'); +settings_add_str('format_identify','msg_private_query_identify','{privmsgnick {format_identify $0}}$2'); +settings_add_str('format_identify','pubmsg_hilight_identify','{pubmsghinick {format_identify $0} $3 $1}$2'); +settings_add_str('format_identify','pubmsg_hilight_channel_identify','{pubmsghinick {format_identify $0} $4 $1{msgchannel $2}$3'); +settings_add_str('format_identify','action_private_identify','{pvtaction {format_identify $0}}$2'); +settings_add_str('format_identify','action_private_query_identify','{pvtaction_query {format_identify $0}}$2'); +settings_add_str('format_identify','action_public_identify','{pubaction {format_identify $0}}$1'); +settings_add_str('format_identify','action_public_channel_identify', '{pubaction {format_identify $0}{msgchannel $1}}$2'); +settings_add_str('format_identify','ctcp_requested_identify','{ctcp {hilight {format_identify $0}} {comment $1} requested CTCP {hilight $2} from {nick $4}}: $3'); +settings_add_str('format_identify','ctcp_requested_unknown_identify','{ctcp {hilight {format_identify $0}} {comment $1} requested unknown CTCP {hilight $2} from {nick $4}}: $3'); +settings_add_str('format_identify','pubmsg_me_identify','{pubmsgmenick $2 {menick {format_identify $0}}}$1'); +settings_add_str('format_identify','pubmsg_me_channel_identify','{pubmsgmenick $3 {menick {format_identify $0}}{msgchannel $1}}$2'); +settings_add_str('format_identify','notice_public_identify','{notice {format_identify $0}{pubnotice_channel $1}}$2'); +settings_add_str('format_identify','notice_private_identify','{notice {format_identify $0}{pvtnotice_host $1}}$2'); +settings_add_str('format_identify','ctcp_reply_identify','CTCP {hilight $0} reply from {nick {format_identify $1}}: $2'); +settings_add_str('format_identify','ctcp_reply_channel_identify','CTCP {hilight $0} reply from {nick {format_identify $1}} in channel {channel $3}: $2'); +settings_add_str('format_identify','ctcp_ping_reply_identify','CTCP {hilight PING} reply from {nick {format_identify $0}}: $1.$[-3.0]2 seconds'); |