# nocaps.pl # # Stops people SHOUTING ON IRC # # Settings: # caps_replace: How to notify you something was changed. Default is # "text". 'text' is replaced with what they said. # caps_sensitivity: If the line is this shorter than this, all caps is # allowed. Default = 6 # caps_percent: If the line has more than this percent caps in it, it's # transformed to lowercase. Default = 80. # # Thanks to Johan "Ion" Kiviniemi from #irssi for some of the stuff # # Example output (all these lines were all caps originally): # [@NoTopic] Boomskdfhh£$(&* [caps] # [@NoTopic] Boomfdkjh. Kdfhkdf. Kddkh. [caps] # [@NoTopic] Jamesoff: Boom*£&$&*£hdfjkhjfksdfljdksjgfkj*&^£* [caps] # use strict; use vars qw($VERSION %IRSSI); use Irssi; $VERSION = '1.01'; %IRSSI = ( authors => 'JamesOff, Ion', contact => 'james@jamesoff.net', name => 'nocaps', description => 'Replaces lines in ALL CAPS with something easier on the eyes', license => 'Public Domain', url => 'http://www.jamesoff.net', changed => '22 March 2002 12:34:38', ); sub isAllCaps { my ($msg) = @_; #strip out everything that's not letters $msg =~ s/[^A-Za-z]+//g; #msgs with no letters in are a waste of time return 0 if (!length($msg)); my $capsonly = $msg; #only caps $capsonly =~ s/[^A-Z]+//g; #if it's all caps and less than caps_sensitivity, return 0 my $minimum = Irssi::settings_get_str('caps_sensitivity'); return 0 if ((length($capsonly) < $minimum)); #check percentage my $percentage = Irssi::settings_get_str('caps_percent'); if (((length($capsonly) / length($msg)) * 100) > $percentage) { #too many caps! return 1; } return 0; } #main event handler sub caps_message { my ($server, $data, $nick, $address) = @_; my ($target, $msg) = split(/ :/, $data,2); if (isAllCaps($msg)) { #bleh, a line in ALL CAPS£*$&(*(£$& $msg =~ tr/A-Z/a-z/; # foo bar biz. blah quux. -> Foo bar biz. Blah quux. $msg =~ s/(^\s*|[.!?]\s+)(\w)/$1 . uc $2/eg; # Nick: hello -> Nick: Hello. $msg =~ s/^(\S+:\s*)(\w)/$1 . uc $2/e; #: --> capital letter (for |Saruman| ) $msg =~ s/([=:;][dpo])/uc $1/eg; my $replacement = Irssi::settings_get_str('caps_replace'); $replacement =~ s/text/$msg/; #re-emit the signal to make Irssi display it Irssi::signal_emit('event privmsg', ($server, "$target :$replacement", $nick, $address)); #and stop Irssi::signal_stop(); } } Irssi::signal_add('event privmsg', 'caps_message'); Irssi::settings_add_str('misc', 'caps_replace', "text"); Irssi::settings_add_str('misc', 'caps_sensitivity', "6"); Irssi::settings_add_str('misc', 'caps_percent', "80");