]> git.somenet.org - irc/bugbot.git/blob - BotModules/Spell.bm
some old base
[irc/bugbot.git] / BotModules / Spell.bm
1 # -*- Mode: perl; tab-width: 4; indent-tabs-mode: nil; -*-
2 ################################
3 # Spell Checker Module         #
4 ################################
5
6 package BotModules::Spell;
7 use vars qw(@ISA);
8 @ISA = qw(BotModules);
9 1;
10
11 # XXX Ideally we should move to using www.dict.org
12
13 sub Help {
14     my $self = shift;
15     my ($event) = @_;
16     return {
17         '' => 'This module checks for spelling errors.',
18         'sp' => 'If you aren\'t sure of the spelling of a word, append \'(sp)\' to the word, and it will be checked for you. '.
19             'For example: \'My speling (sp?) is awful!\''
20     };
21 }
22
23 sub Told {
24     my $self = shift;
25     my ($event, $message) = @_;
26     if ($self->checkSpelling($event, $message)) {
27         # we checked the spelling, abort
28         return 0;
29     }
30     return $self->SUPER::Heard(@_);
31 }
32
33 sub Heard {
34     my $self = shift;
35     my ($event, $text) = @_;
36     $self->checkSpelling($event, $text);
37     return $self->SUPER::Heard(@_);
38 }
39
40 sub checkSpelling {
41     my $self = shift;
42     my ($event, $text) = @_;
43     while ($text =~ s/^.*?  # take everything up to the first word to check
44                        \b   # look for a word break
45                       (\w+) # take the word to spell
46                        \s*  # look for whitespace following it
47                   \(sp\??\) # followed by (sp) or (sp?)
48                   //isox) { # and remove everything up to here so we can do another check in a minute
49         my $word = $1;
50         # XXX escape $word
51         $self->getURI($event, "http://www.merriam-webster.com/dictionary/$word", 'word', $1); # XXX should be configurable!
52         return 1;
53     }
54     return 0;
55 }
56
57 sub GotURI {
58     my $self = shift;
59     my ($event, $query, $result, $command, $word) = @_;
60     if ($command ne 'word') {
61         return $self->SUPER::GorURI(@_);
62     } else {
63         my $reply;
64         # Determine if page is error or not
65         if (!length($result)) {
66             $self->debug("Waah, failed utterly to get a response for '$word' from the dictionary server.");
67             $reply = "The dictionary service is not accessible right now, sorry.";
68         } elsif ($result =~ /                        # Match
69                        The\ word\ you've\ entered\   # literal string
70                        isn't\ in\ the\ dictionary\.  # (not very smart),
71                        .*?                           # anything (non-greedy),
72                        <PRE>                         # PRE tag,
73                        (.*?)                         # our suggestions,
74                        <\/PRE>                       # PRE tag
75                        /osx
76                        
77                 || $result =~ /                        # Match
78                        The\ word\ you've\ entered\   # literal string
79                        isn't\ in\ the\ dictionary\.  # (not very smart),
80                        .*?                           # anything (non-greedy),
81                        <ol.*?\">                         # OL tag,
82                        (.*?)                         # our suggestions,
83                        <\/ol>                       # OL tag
84                        /osx
85                  # XXX this is hardcoded to m-w.com!
86         ) {
87             # Strip line numbering and anchor tags
88             my $suggestions = $1;
89             $suggestions =~ s/\s+[\d]+\.\s+//go;
90             $suggestions =~ s/<a href.*?>(.*?)<\/a>/$1 /go;
91             $suggestions =~ s/<li>(.*?)<\/li>/$1 /go;
92
93             # get them in list format
94             my @suggestions = split(' ', $suggestions);
95
96             # Comma delimit suggestions
97             local $" = ', ';
98             if (@suggestions > 7) {
99                 # lots of suggestions!
100                 # 7 is not arbitrary, it's supposed to be the number
101                 # of items people can remember at once.
102                 @suggestions = @suggestions[0..6];
103                 $reply = "Suggestions for '$word': @suggestions[0..6]...";
104             } elsif (@suggestions) {
105                 # just a few suggestions
106                 $reply = "Suggestions for '$word': @suggestions";
107             } else {
108                 # eh? Weird. Some problem on the server probably.
109                 $self->debug("Didn't get any suggestions for '$word'!");
110                 $reply = "I have no idea what '$word' is supposed to be, sorry.";
111             }
112         } else {
113             # horrah!
114             $reply = "'$word' seems to be the correct spelling.";
115         }
116         $self->say($event, $reply);
117         return 0;
118     }
119 }