#!perl # RT query module for mozbot # Copyright 2004 Dave O'Neill # This code may be redistributed under the same terms as Perl # # To use this: # 1) If your RT libraries don't live where 'use lib' wants to look for them # below, adjust that line to where they really are. # 2) Create a 'mozbot' user in your RT installation and give it: # ShowTicket # SeeQueue # permissions. # 3) Drop this file into mozbot's BotModules directory # 4) Tell mozbot to load it with /msg botname load RT package BotModules::RT; use vars qw(@ISA); use lib ("/usr/local/rt-3.2.1//lib", "/usr/local/rt-3.2.1//local/lib"); use RT::Ticket; use RT::Template; use RT::Interface::CLI qw(CleanEnv GetCurrentUser GetMessageContent loc); @ISA = qw(BotModules); 1; sub Initialise { my $self = shift; #Clean out all the nasties from the environment CleanEnv(); # Load the config file RT::LoadConfig(); #Connect to the database and get RT::SystemUser and RT::Nobody loaded RT::Init(); $self->{'user'} = new RT::CurrentUser(); $self->{'user'}->LoadByName('mozbot'); # ARGH! Evil hack. This should be done in RegisterConfig, except that # RegisterConfig gets called after Initialize and we want these values to # be available here. $self->registerVariables( # [ name, save?, settable?, value ] ['customFields', 1, 1, [ 'Account' ] ], ); foreach my $field (@{$self->{'customFields'}}) { $self->{"_$field"."_obj"} = new RT::CustomField->new($self->{'user'}); $self->{"_$field"."_obj"}->LoadByNameAndQueue(Name => $field, Queue => 0); } } sub Help { my $self = shift; my ($event) = @_; return { '' => 'This module gets info on a given ticket from RT.', 'ticket' => 'Call this command with a ticket number to get info about that ticket.', }; } sub RegisterConfig { my $self = shift; $self->SUPER::RegisterConfig(@_); $self->registerVariables( # [ name, save?, settable?, value ] ['bugsURI', 1, 1, 'http://rt/'], ); } sub Told { my $self = shift; my ($event, $message) = @_; unless ($self->parseMessage($event, $message) ) { return $self->SUPER::Told(@_); } return 0; # we've dealt with it, no need to do anything else. } sub Heard { my $self = shift; my ($event, $message) = @_; unless ( $self->parseMessage($event, $message) ) { return $self->SUPER::Heard(@_); } return 0; # we've dealt with it, no need to do anything else. } # Return 1 if message was parsed as one of ours, 0 otherwise sub parseMessage { my $self = shift; my ($event, $message) = @_; if( $message =~ m/(?:bug|ticket)\s+(\d+)/i ) { $self->showTicketByID($event, $1 ); return 1; } return 0; } sub showTicketByID { my $self = shift; my ($event, $ticket_number) = @_; my $ticket = RT::Ticket->new( $self->{'user'} ); $ticket->Load( $ticket_number ); if( !$ticket->Id ) { $self->say($event, "Sorry, no ticket found"); } $self->showTicket($event, $ticket); } sub showTicket { my $self = shift; my ($event, $ticket) = @_; my $result = $ticket->Id . ": \"" . $ticket->Subject() . "\""; my @extras; if( $ticket->Queue ) { my $queue = new RT::Queue($self->{'user'}); $queue->Load($ticket->Queue); push @extras, $queue->Name; } else { push @extras, "no queue"; } push @extras, $ticket->Status; if( $ticket->Owner && $ticket->Owner != 10) { my $owner = new RT::User($self->{'user'}); $owner->Load( $ticket->Owner ); push @extras, $owner->Name; } else { push @extras, "unowned"; } foreach my $field (@{$self->{'customFields'}}) { my $obj = $ticket->CustomFieldValues($self->{"_$field"."_obj"}->id)->First; if( $obj ) { push @extras, $obj->Content; } else { push @extras, "no $field"; } } $result .= " (" . join(",", @extras). ")"; $result .= " $self->{'bugsURI'}Ticket/Display.html?id=". $ticket->Id; $self->say($event, $result); }