# -*- Mode: perl; tab-width: 4; indent-tabs-mode: nil; -*- ################################ # General Module # ################################ package BotModules::General; use vars qw(@ISA); @ISA = qw(BotModules); 1; my $VERSION = '2.6'; # RegisterConfig - Called when initialised, should call registerVariables sub RegisterConfig { my $self = shift; $self->SUPER::RegisterConfig(@_); $self->registerVariables( # [ name, save?, settable?, value ] ['preferredHelpLineLength', 1, 1, 90], ['helpStyle', 1, 1, 'compact'], # change this to 'tidy' to use alternate style ); } sub Help { my $self = shift; my ($event) = @_; return { '' => 'The module that provides the bot-wide services.', 'help' => 'Gives information about modules and commands. Syntax: help []', 'shutup' => 'Tells the bot to stop talking to you. Syntax: shut up', }; } # Told - Called for messages prefixed by the bot's nick sub Told { my $self = shift; my ($event, $message) = @_; if ($message =~ /^\s*(?:help|commands?)(?:\s+($variablepattern))?[ ?!.]*\s*$/osi) { if ($1) { # display help for that command # first, build the help file... my %topicList; foreach my $module (@modules) { my $commands; eval { $commands = $module->Help($event); }; if ($@) { $self->debug("Module $module is having errors reporting help:\n$@"); next; } if ($commands->{''}) { my @commands = grep { /./os } keys %$commands; $topicList{lc($module->{'_name'})} = [] unless defined($topicList{lc($module->{'_name'})}); push(@{$topicList{lc($module->{'_name'})}}, $commands->{''}); if (@commands) { local $" = ', '; push(@{$topicList{lc($module->{'_name'})}}, "The $module->{'_name'} module has the following help topics: @commands"); } } foreach (keys %$commands) { $topicList{lc($_)} = [] unless defined($topicList{lc($_)}); push(@{$topicList{lc($_)}}, $commands->{$_}); } } if (defined($topicList{lc($1)})) { foreach (@{$topicList{lc($1)}}) { $self->say($event, "$1: $_"); } } else { $self->say($event, "No help for topic '$1'."); } } else { my $helpline = $self->getHelpLine(); $self->directSay($event, "Help topics for mozbot $VERSION ($helpline):"); $self->say($event, "$event->{'from'}: help info /msg'ed") if ($event->{'channel'}); if ($self->{'helpStyle'} eq 'compact') { $self->printHelpCompact($event); } else { $self->printHelpTidy($event); } $self->directSay($event, 'For help on a particular topic, type \'help \'. Note that some commands may be disabled in certain channels.'); } } elsif ($message =~ /^\s*shut\s*up\s*$/osi) { my $queue = $self->getMessageQueue(); my @messages = @$queue; @$queue = (); my $count = 0; if ($event->{'channel'}) { foreach my $message (@messages) { if ($message->[0] eq $event->{'channel'} and ref $message->[1] eq 'SCALAR' and $message->[1] =~ m/^\Q$event->{'from'}\E:/osi) { ++$count; } else { push(@$queue, $message); } } } else { foreach my $message (@messages) { if (lc $message->[0] eq lc $event->{'from'}) { ++$count; } else { push(@$queue, $message); } } } if ($count) { $self->say($event, "$event->{'from'}: Dropped $count messages."); } else { $self->say($event, "$event->{'from'}: I wasn't talking to you."); } } else { return $self->SUPER::Told(@_); } return 0; # dealt with it, do nothing else } sub CTCPVersion { my $self = shift; my ($event, $who, $what) = @_; my @modulenames = $self->getModules(); local $" = ', '; $self->ctcpReply($event, 'VERSION', "mozbot $VERSION (@modulenames)"); } sub printHelpCompact { my $self = shift; my ($event) = @_; local $" = ', '; # to reset font-lock: " my @helplist; foreach my $module ($self->getModules()) { $module = $self->getModule($module); my %commands = %{$module->Help($event)}; my $moduleHelp = delete($commands{''}); my @commands = sort keys %commands; if (@commands) { push(@helplist, "$module->{'_name'}: @commands"); } elsif ($moduleHelp) { push(@helplist, "$module->{'_name'}"); } } foreach ($self->prettyPrint($self->{'preferredHelpLineLength'}, undef, ' ', '; ', @helplist)) { $self->directSay($event, $_); } } sub printHelpTidy { my $self = shift; my ($event) = @_; my @modules = sort $self->getModules(); my $longestTitle = 0; foreach my $module (@modules) { $longestTitle = length($module) if length($module) > $longestTitle; $module = [$module, sort keys %{$self->getModule($module)->Help($event)}]; } foreach my $module (@modules) { my $title = shift(@$module); my $topicCount = @$module; if (@$module and $module->[0] eq '') { shift(@$module); } my @topics = @$module; $module = ' ' x ($longestTitle - length($title)) . $title; if (@topics) { $self->directSay($event, $module . ': ' . join(",\n" . ' ' x ($longestTitle + 2), $self->wordWrap($self->{'preferredHelpLineLength'} - $longestTitle - 2, undef, undef, ', ', @topics))); } elsif ($topicCount) { $self->directSay($event, "$module: (no commands)"); } } }