From f8948a99bc398985b45683079045fe162561d3ba Mon Sep 17 00:00:00 2001 From: timriker Date: Tue, 1 Mar 2005 02:23:35 +0000 Subject: [PATCH] nickometer external git-svn-id: https://svn.code.sf.net/p/infobot/code/trunk/blootbot@1197 c11ca15a-4712-0410-83d8-924469b57eb5 --- src/CommandStubs.pl | 65 +------------------- src/Modules/nickometer.pl | 122 ++++++++++++++++++++++++++++---------- 2 files changed, 95 insertions(+), 92 deletions(-) diff --git a/src/CommandStubs.pl b/src/CommandStubs.pl index d7fe611..cc05a35 100644 --- a/src/CommandStubs.pl +++ b/src/CommandStubs.pl @@ -228,68 +228,6 @@ sub Modules { return; } - # Nickometer. Adam Spiers++ - if ($message =~ /^(?:lame|nick)ometer(?: for)? (\S+)/i) { - return unless (&IsChanConfOrWarn("nickometer")); - - my $term = (lc $1 eq 'me') ? $who : $1; - - &loadMyModule('nickometer'); - - if ($term =~ /^$mask{chan}$/) { - &status("Doing nickometer for chan $term."); - - if (!&validChan($term)) { - &msg($who, "error: channel is invalid."); - return; - } - - # step 1. - my %nickometer; - foreach (keys %{ $channels{lc $term}{''} }) { - my $str = $_; - if (!defined $str) { - &WARN("nickometer: nick in chan $term undefined?"); - next; - } - - my $value = &nickometer($str); - $nickometer{$value}{$str} = 1; - } - - # step 2. - ### TODO: compact with map? - my @list; - foreach (sort {$b <=> $a} keys %nickometer) { - my $str = join(", ", sort keys %{ $nickometer{$_} }); - push(@list, "$str ($_%)"); - } - - &performStrictReply( &formListReply(0, "Nickometer list for $term ", @list) ); - &DEBUG("test."); - - return; - } - - my $percentage = &nickometer($term); - - if ($percentage =~ /NaN/) { - $percentage = "off the scale"; - } else { - $percentage = sprintf("%0.4f", $percentage); - $percentage =~ s/(\.\d+)0+$/$1/; - $percentage .= '%'; - } - - if ($msgType eq 'public') { - &say("'$term' is $percentage lame, $who"); - } else { - &msg($who, "the 'lame nick-o-meter' reading for $term is $percentage, $who"); - } - - return; - } - # Topic management. xk++ # may want to add a userflags for topic. -xk if ($message =~ /^topic(\s+(.*))?$/i) { @@ -1052,6 +990,9 @@ sub nullski { &addCmdHook('piglatin', ('CODEREF' => 'piglatin::piglatin', 'Identifier' => 'piglatin', 'Cmdstats' => 'piglatin', 'Forker' => 1) ); +&addCmdHook('(?:lame|nick)ometer(?: for)?', ('CODEREF' => 'nickometer::query', + 'Identifier' => 'nickometer', 'Cmdstats' => 'nickometer', + 'Forker' => 1) ); ### ### END OF ADDING HOOKS. ### diff --git a/src/Modules/nickometer.pl b/src/Modules/nickometer.pl index 7ddda54..6a2eb56 100644 --- a/src/Modules/nickometer.pl +++ b/src/Modules/nickometer.pl @@ -8,53 +8,115 @@ # $Id$ # +package nickometer; + use strict; my $pi = 3.14159265; my $score = 0; -my $verbose = 0; +my $verbose = 1; -sub nickometer ($) { -# return unless &loadPerlModule("Getopt::Std"); - return unless &loadPerlModule("Math::Trig"); +sub query { + my ($message) = @_; + + my $term = (lc $message eq 'me') ? $::who : $message; + &::DEBUG("nickometer $_:$term:$message"); + + if ($term =~ /^$::mask{chan}$/) { + &::status("Doing nickometer for chan $term."); + + if (!&::validChan($term)) { + &::msg($::who, "error: channel is invalid."); + return; + } - local $_ = shift; + # step 1. + my %nickometer; + foreach (keys %{ $::channels{lc $term}{''} }) { + my $str = $_; + if (!defined $str) { + &WARN("nickometer: nick in chan $term undefined?"); + next; + } + + my $value = &nickometer($str); + $nickometer{$value}{$str} = 1; + } + + # step 2. + ### TODO: compact with map? + my @list; + foreach (sort {$b <=> $a} keys %nickometer) { + my $str = join(", ", sort keys %{ $nickometer{$_} }); + push(@list, "$str ($_%)"); + } + + &::performStrictReply( &::formListReply(0, "Nickometer list for $term ", @list) ); + &::DEBUG("test."); + + return; + } + + my $percentage = &nickometer($term); + + if ($percentage =~ /NaN/) { + $percentage = "off the scale"; + } else { + $percentage = sprintf("%0.4f", $percentage); + $percentage =~ s/(\.\d+)0+$/$1/; + $percentage .= '%'; + } + + if ($::msgType eq 'public') { + &::say("'$term' is $percentage lame, $::who"); + } else { + &::msg($::who, "the 'lame nick-o-meter' reading for $term is $percentage, $::who"); + } + + return; +} + +sub nickometer ($) { + my ($text) = @_; $score = 0; - if (!defined) { - &DEBUG("nickometer: arg == NULL."); +# return unless &loadPerlModule("Getopt::Std"); + return unless &::loadPerlModule("Math::Trig"); + + if (!defined $text) { + &::DEBUG("nickometer: arg == NULL. $text"); return; } # Deal with special cases (precede with \ to prevent de-k3wlt0k) my %special_cost = ( - '69' => 500, - 'dea?th' => 500, - 'dark' => 400, - 'n[i1]ght' => 300, - 'n[i1]te' => 500, - 'fuck' => 500, - 'sh[i1]t' => 500, - 'coo[l1]' => 500, - 'kew[l1]' => 500, - 'lame' => 500, - 'dood' => 500, - 'dude' => 500, - '[l1](oo?|u)[sz]er' => 500, - '[l1]eet' => 500, - 'e[l1]ite' => 500, - '[l1]ord' => 500, - 'pron' => 1000, - 'warez' => 1000, - 'xx' => 100, - '\[rkx]0' => 1000, - '\0[rkx]' => 1000, + '69' => 500, + 'dea?th' => 500, + 'dark' => 400, + 'n[i1]ght' => 300, + 'n[i1]te' => 500, + 'fuck' => 500, + 'sh[i1]t' => 500, + 'coo[l1]' => 500, + 'kew[l1]' => 500, + 'lame' => 500, + 'dood' => 500, + 'dude' => 500, + '[l1](oo?|u)[sz]er' => 500, + '[l1]eet' => 500, + 'e[l1]ite' => 500, + '[l1]ord' => 500, + 'pron' => 1000, + 'warez' => 1000, + 'xx' => 100, + '\[rkx]0' => 1000, + '\0[rkx]' => 1000, ); foreach my $special (keys %special_cost) { my $special_pattern = $special; my $raw = ($special_pattern =~ s/^\\//); - my $nick = $_; + my $nick = $text; unless (defined $raw) { $nick =~ tr/023457+8/ozeasttb/; } @@ -149,7 +211,7 @@ sub nickometer ($) { # Use an appropriate function to map [0, +inf) to [0, 100) my $percentage = 100 * - (1 + tanh(($score-400)/400)) * + (1 + &Math::Trig::tanh(($score-400)/400)) * (1 - 1/(1+$score/5)) / 2; my $digits = 2 * (2 - &round_up(log(100 - $percentage) / log(10))); -- 2.39.2