html/nocaps.pl


   1 # nocaps.pl
   2 #
   3 # Stops people SHOUTING ON IRC
   4 #
   5 # Settings:
   6 #    caps_replace: How to notify you something was changed. Default is 
   7 #                  "<caps>text</caps>". 'text' is replaced with what they said.
   8 #    caps_sensitivity: If the line is this shorter than this, all caps is
   9 #                      allowed. Default = 6
  10 #    caps_percent: If the line has more than this percent caps in it, it's
  11 #                  transformed to lowercase. Default = 80.
  12 #
  13 # Thanks to Johan "Ion" Kiviniemi from #irssi for some of the stuff
  14 #
  15 # Example output (all these lines were all caps originally):
  16 #  [@NoTopic] Boomskdfhh£$(&* [caps]
  17 #  [@NoTopic] Boomfdkjh. Kdfhkdf. Kddkh. [caps]
  18 #  [@NoTopic] Jamesoff: Boom*£&$&*£hdfjkhjfksdfljdksjgfkj*&^£* [caps]
  19 #
  20 
  21 use strict;
  22 use vars qw($VERSION %IRSSI);
  23 
  24 use Irssi;
  25 
  26 $VERSION = '1.01';
  27 %IRSSI = (
  28     authors	=> 'JamesOff, Ion',
  29     contact	=> 'james@jamesoff.net',
  30     name	=> 'nocaps',
  31     description	=> 'Replaces lines in ALL CAPS with something easier on the eyes',
  32     license	=> 'Public Domain',
  33     url		=> 'http://www.jamesoff.net',
  34     changed	=> '22 March 2002 12:34:38',
  35 );
  36 
  37 
  38 sub isAllCaps {
  39 	my ($msg) = @_;
  40 	#strip out everything that's not letters
  41 	$msg =~ s/[^A-Za-z]+//g;
  42 
  43 	#msgs with no letters in are a waste of time
  44 	return 0 if (!length($msg));
  45 	my $capsonly = $msg;
  46 	
  47 	#only caps
  48 	$capsonly =~ s/[^A-Z]+//g;
  49 
  50 	#if it's all caps and less than caps_sensitivity, return 0
  51 	my $minimum = Irssi::settings_get_str('caps_sensitivity');
  52 	return 0 if ((length($capsonly) < $minimum));
  53 	
  54 	#check percentage
  55 	my $percentage = Irssi::settings_get_str('caps_percent');
  56 	if (((length($capsonly) / length($msg)) * 100) > $percentage) {
  57 		#too many caps!
  58 		return 1;
  59 	}
  60 
  61 	return 0;
  62 }
  63 
  64 #main event handler
  65 sub caps_message {
  66 	my ($server, $data, $nick, $address) = @_;
  67 	my ($target, $msg) = split(/ :/, $data,2);
  68 
  69 	if (isAllCaps($msg)) {
  70 		#bleh, a line in ALL CAPS£*$&(*(£$&
  71 		$msg =~ tr/A-Z/a-z/;
  72 
  73 		# foo bar biz. blah quux. -> Foo bar biz. Blah quux.
  74 		$msg =~ s/(^\s*|[.!?]\s+)(\w)/$1 . uc $2/eg;
  75 
  76 		# Nick: hello -> Nick: Hello.
  77 		$msg =~ s/^(\S+:\s*)(\w)/$1 . uc $2/e;
  78 
  79 		#:<d|p|o> --> capital letter (for |Saruman| )
  80 		$msg =~ s/([=:;][dpo])/uc $1/eg;
  81 
  82 		my $replacement = Irssi::settings_get_str('caps_replace');
  83 		$replacement =~ s/text/$msg/;
  84 
  85 		#re-emit the signal to make Irssi display it
  86 		Irssi::signal_emit('event privmsg', ($server, "$target :$replacement", $nick, $address));
  87 		#and stop
  88 		Irssi::signal_stop();
  89 	}
  90 }
  91 
  92 Irssi::signal_add('event privmsg', 'caps_message');
  93 
  94 Irssi::settings_add_str('misc', 'caps_replace', "<caps>text</caps>");
  95 Irssi::settings_add_str('misc', 'caps_sensitivity', "6");
  96 Irssi::settings_add_str('misc', 'caps_percent', "80");