1# (c) 2002 by Gerfried Fuchs <alfie@channel.debian.de>
2
3use Irssi qw(command_bind command signal_add_last signal_stop settings_get_bool settings_add_bool);
4use strict;
5use vars qw($VERSION %IRSSI);
6
7$VERSION = '2.3.1';
8
9%IRSSI = (
10  'authors'     => 'Gerfried Fuchs',
11  'contact'     => 'alfie@channel.debian.de',
12  'name'        => 'kenny speech',
13  'description' => 'autodekennyfies /kenny, adds /kenny, /dekenny. Based on Jan-Pieter Cornets signature version',
14  'license'     => 'BSD',
15  'url'         => 'http://alfie.ist.org/projects/irssi/scripts/kenny.pl',
16  'changed'     => '2002-06-13',
17);
18
19# Maintainer & original Author:  Gerfried Fuchs <alfie@channel.debian.de>
20# Based on signature kenny from: Jan-Pieter Cornet <johnpc@xs4all.nl>
21# Autodekenny-suggestion:        BC-bd <bd@bc-bd.org>
22
23# Sugguestions from darix: Add <$nick> to [kenny] line patch
24
25# This script offers you /kenny and /dekenny which both do the kenny-filter
26# magic on the argument you give it.  Despite it's name *both* do kenny/dekenny
27# the argument; the difference is that /kenny writes it to the channel/query
28# but /dekenny only to your screen.
29
30# Version-History:
31# ================
32# 2.3.1 -- fixed autodekenny in channels for people != yourself
33#
34# 2.3.0 -- fixed kenny in querys
35#          fixed dekenny in status window
36#
37# 2.2.3 -- fixed pattern matching for autokenny string ("\w" != "a-z" :/)
38#
39# 2.2.2 -- first version available to track history from...
40
41# TODO List
42# ... currently empty
43
44
45sub KennyIt {
46   ($_)=@_;my($p,$f);$p=3-2*/[^\W\dmpf_]/i;s.[a-z]{$p}.vec($f=join('',$p-1?chr(
47   sub{$_[0]*9+$_[1]*3+$_[2] }->(map {/p|f/i+/f/i}split//,$&)+97):('m','p','f')
48   [map{((ord$&)%32-1)/$_%3}(9, 3,1)]),5,1)='`'lt$&;$f.eig;return ($_);
49};
50
51
52sub cmd_kenny {
53   my ($msg, undef, $channel) = @_;
54   $channel->command("msg $channel->{'name'} ".KennyIt($msg));
55}
56
57
58sub cmd_dekenny {
59   my ($msg, undef, $channel) = @_;
60
61   if ($channel) {
62      $channel->print('[kenny] '.KennyIt($msg), MSGLEVEL_CRAP);
63   } else {
64      Irssi::print('[kenny] '.KennyIt($msg), MSGLEVEL_CRAP);
65   }
66}
67
68
69sub sig_kenny {
70   my ($server, $msg, $nick, $address, $target) = @_;
71   if ($msg=~m/^[^a-z]*[mfp]{3}(?:[^a-z]|[mfp]{3})+$/i) {
72      $target=$nick if $target eq "";
73
74      # the address may _never_ be emtpy, if it is its own_public
75      $nick=$server->{'nick'} if $address eq "";
76
77      $server->window_item_find($target)->print("[kenny] <$nick> " .
78                                                KennyIt($msg), MSGLEVEL_CRAP);
79      signal_stop if not settings_get_bool('show_kenny_too');
80   }
81}
82
83
84command_bind('kenny',   'cmd_kenny');
85command_bind('dekenny', 'cmd_dekenny');
86
87signal_add_last('message own_public',  'sig_kenny');
88signal_add_last('message public',      'sig_kenny');
89signal_add_last('message own_private', 'sig_kenny');
90signal_add_last('message private',     'sig_kenny');
91
92settings_add_bool('lookandfeel', 'show_kenny_too', 0);
93