Ticket #559: hyppolit-0.5-tracdb.patch
| File hyppolit-0.5-tracdb.patch, 6.5 KB (added by getty, 4 years ago) |
|---|
-
Hyppolit/lib/Hyppolit.pm
29 29 30 30 31 31 32 our $VERSION = '0.0 4';32 our $VERSION = '0.05'; 33 33 34 34 use base 'Exporter'; 35 35 … … 38 38 use POE::Component::IRC::Plugin::AutoJoin; 39 39 use POE::Component::IRC::Plugin::Logger; 40 40 use POE::Component::IRC::Plugin::FollowTail; 41 use DBI; 41 42 43 use Data::Dumper; 42 44 43 45 use YAML::Syck qw(LoadFile DumpFile); 44 46 my $svnlook = '/usr/bin/svnlook'; … … 46 48 my @methods = qw( 47 49 _start irc_join irc_public irc_msg 48 50 irc_tail_input irc_tail_error irc_tail_reset 51 trac_check 49 52 ); 50 53 our @EXPORT = @methods; 51 54 my $config; … … 71 74 not @{ $config->{channels} }) { 72 75 die "No channels defined\n"; 73 76 } 74 use Data::Dumper; 77 75 78 print Dumper $config; 76 79 77 78 80 POE::Session->create( 79 81 package_states => [ 80 82 main => \@methods … … 84 86 $poe_kernel->run(); 85 87 } 86 88 89 # so that it is accessable outside of the PoCo::IRC 90 my $irc; 91 my $dbh; 87 92 88 93 sub _start { 89 my$irc = POE::Component::IRC::State->spawn(94 $irc = POE::Component::IRC::State->spawn( 90 95 Nick => $config->{nick}, 91 96 Server => $config->{server}, 92 97 ); … … 104 109 # Restricted => 0, #did not help 105 110 Sort_by_date => 1, 106 111 )); 112 system "chmod -R 755 $config->{logdir}"; # TODO move to a better place 107 113 } 108 system "chmod -R 755 $config->{logdir}"; # TODO move to a better place 109 if ($config->{inputfile}) { 114 if ($config->{inputfile}) { 110 115 $irc->plugin_add( 'FollowTail' => POE::Component::IRC::Plugin::FollowTail->new( 111 116 filename => $config->{inputfile}, 112 117 )); 113 118 } 114 119 115 116 120 $irc->yield(register => 'join'); 117 121 #$irc->yield(register => 'all'); 118 122 $irc->yield('connect'); 119 # irc_public 123 124 if ($config->{tracdb}) { 125 $dbh = DBI->connect("dbi:SQLite:dbname=".$config->{tracdb},"",""); 126 $_[ KERNEL ]->delay(trac_check => 5); 127 } 128 120 129 } 121 130 122 131 sub irc_public { 123 132 my $nick = (split /!/, $_[ARG0])[0]; 124 133 my $channel = $_[ARG1]; 125 my $irc = $_[SENDER]->get_heap(); 134 # now unnecessary 135 # my $irc = $_[SENDER]->get_heap(); 126 136 127 137 my $text = $_[ARG2]; 128 138 … … 166 176 } 167 177 } 168 178 179 # regexp need adjusting, i'm bad at it ;)... 180 if ($text =~ /\#(\d+)/x) { 181 if ($1+0 > 0) { 182 my $text = trac_ticket_text($1); 183 $irc->yield(privmsg => $channel, $text ) if $text; 184 } 185 } 169 186 187 # regexp need adjusting, i'm bad at it ;)... 188 if ($text =~ /r(\d+)/x) { 189 # no check at all... TODO 190 $irc->yield(privmsg => $channel, trac_changeset_text($1)) if $1+0 > 0; 191 } 192 170 193 # TODO karma only users who are around ? 171 194 # record karma 172 195 if ($text =~ /(\S+)(\+\+|--)/) { … … 188 211 sub irc_msg { 189 212 my $nick = (split /!/, $_[ARG0])[0]; 190 213 #my $channel = $_[ARG1]; 191 my $irc = $_[SENDER]->get_heap(); 214 # now unnecessary 215 # my $irc = $_[SENDER]->get_heap(); 192 216 193 217 my $text = $_[ARG2]; 194 218 … … 198 222 sub irc_join { 199 223 my $nick = (split /!/, $_[ARG0])[0]; 200 224 my $channel = $_[ARG1]; 201 my $irc = $_[SENDER]->get_heap(); 225 # now unnecessary 226 # my $irc = $_[SENDER]->get_heap(); 202 227 203 228 # only send the message if we were the one joining 204 229 if ($nick eq $irc->nick_name()) { … … 220 245 } 221 246 print "Giving op to '$nick' on '$channel' ($irc)\n"; 222 247 $irc->yield(mode => $channel => "+o $nick"); 223 system "chmod -R 755 $config->{logdir}"; # TODO move to a better place 248 # its already at another place, should be removed here? 249 # system "chmod -R 755 $config->{logdir}"; # TODO move to a better place 224 250 } 225 251 226 252 sub _default { 227 253 my $nick = (split /!/, $_[ARG0])[0]; 228 254 print "Default: $nick ", scalar(@_), "\n"; 229 255 } 256 230 257 sub irc_all { 231 258 my $nick = (split /!/, $_[ARG0])[0]; 232 259 print "All: $nick ", scalar(@_), "\n"; … … 263 290 my ($kernel, $sender, $filename, $errnum, $errstring) 264 291 = @_[KERNEL, SENDER, ARG0 .. ARG2]; 265 292 $kernel->post( $sender, 'privmsg', $_, "SVN ERROR: $errnum $errstring" ) for @{ $config->{channels} }; 266 my $irc = $sender->get_heap(); 293 # now unnecessary 294 # my $irc = $sender->get_heap(); 267 295 $irc->plugin_del( 'FollowTail' ); 268 296 return; 269 297 } … … 274 302 return; 275 303 } 276 304 305 sub trac_changeset_text { 306 my $changeset_id = shift; 307 return "Changeset #".$changeset_id." http://padre.perlide.org/trac/changeset/".$changeset_id; 308 } 277 309 310 sub trac_ticket_text { 311 return if !$config->{tracdb}; 312 my $ticket_id = shift; 313 my $ticket = $dbh->selectrow_hashref(" 314 select * from ticket 315 where id = ? 316 ", {}, $ticket_id); 317 return if !$ticket; 318 my $ticket_comment = $dbh->selectrow_hashref(" 319 select oldvalue from ticket_change 320 where ticket = ? and field = 'comment' 321 order by time desc 322 ", {}, $ticket_id); 323 my $url = "http://padre.perlide.org/trac/ticket/".$ticket_id; 324 $url .= "#comment:".$ticket_comment->{oldvalue} if $ticket_comment and $ticket_comment->{oldvalue}; 325 return "#".$ticket_id.": ".$ticket->{summary}." (".$ticket->{status}." ".$ticket->{type}.") [ ".$url." ]"; 326 } 327 328 sub trac_check { 329 my $trac_check_time = time; 330 my $last_trac_check = $config->{last_trac_check}; 331 332 my $tickets = $dbh->selectall_hashref(" 333 select id from ticket 334 where changetime > ? and changetime <= ? 335 order by changetime asc 336 ", "id", {}, $last_trac_check, $trac_check_time); 337 338 for my $ticket_id (keys %{$tickets}) { 339 my $text = trac_ticket_text($ticket_id); 340 if ($text) { 341 $irc->yield( privmsg => $_, $text) for @{ $config->{channels} }; 342 } 343 } 344 345 $config->{last_trac_check} = $trac_check_time; 346 save_config; 347 $_[KERNEL]->delay(trac_check => 30); 348 return; 349 } 350 278 351 1; 279 352 280 353 -
Hyppolit/Makefile.PL
12 12 requires 'POE::Component::IRC::State' => '2.52'; 13 13 requires 'POE::Component::IRC::Plugin::AutoJoin' => '1.2'; 14 14 requires 'YAML::Syck' => '1.0'; 15 requires 'DBD::SQLite' => '1.25'; 16 requires 'DBI' => '1.609'; 15 17 16 18 no_index 'directory' => qw{ t xt eg share inc privinc }; 17 19 #homepage 'http://padre.perlide.org/'; -
Hyppolit/Changes
1 1 Changes of Hyppolit the IRC bot 2 2 3 v0.05 2009.09.23 4 Added tracdb config parameter for parsing of tracdb 5 Added reacting on "#<ticketnumber>" on channel 6 Added (primitive) reacting on "r<changeset>" on channel 7 3 8 v0.04 2009.03.08 4 9 Fix karma regex 5 10 count commits as karma as well
