/
parrotticketlog.pm
99 lines (84 loc) · 2.64 KB
/
parrotticketlog.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package modules::local::parrotticketlog;
use strict;
use warnings;
use utf8;
use LWP::UserAgent;
use XML::RAI;
use HTML::Entities;
use WWW::Shorten::Metamark;
use WWW::Shorten 'Metamark';
use base 'modules::local::karmalog';
# Parse RSS generated from trac's "timeline" page (filtered to show only tickets).
my $url = 'https://trac.parrot.org/parrot/timeline?ticket=on&format=rss';
my $lastrev;
my $copy_of_self;
sub init {
my $self = shift;
$copy_of_self = $self;
main::lprint("parrot ticket RSS parser loaded.");
main::create_timer("parrotticketlog_fetch_feed_timer", $self, "fetch_feed", 181);
}
sub implements {
return qw();
}
sub shutdown {
my $self = shift;
main::delete_timer("parrotticketlog_fetch_feed_timer");
}
my $lwp = LWP::UserAgent->new();
$lwp->timeout(60);
$lwp->env_proxy();
# upgrade this to an %objects_by_package if this ends up being subclassed.
my $self = bless({ seen => {}, targets => [['magnet','#parrot']] }, __PACKAGE__);
$$self{not_first_time} = 1 if exists $ENV{TEST_RSS_PARSER};
sub fetch_feed {
my $response = $lwp->get($url);
if($response->is_success) {
my $feed = XML::RAI->parse_string($response->content);
process_feed($feed);
} else {
main::lprint("parrotticketlog: fetch_feed: failure fetching $url");
}
}
sub process_feed {
my $feed = shift;
my @items = @{$feed->items};
@items = sort { $a->created cmp $b->created } @items; # ascending order
# skip the first run, to prevent new installs from flooding the channel
foreach my $item (@items) {
my $rev = $item->identifier;
if(exists($$self{not_first_time})) {
# output new entries to channel
next if exists($$self{seen}{$rev});
$$self{seen}{$rev} = 1;
$self->output_item($item);
} else {
$$self{seen}{$rev} = 1;
}
}
$$self{not_first_time} = 1;
}
sub output_item {
my ($self, $item) = @_;
my $user = $item->creator;
my $desc = $item->title;
$desc =~ s/<[^>]+>//g;
$desc =~ s|…|...|g;
decode_entities($desc);
if($desc =~ /^Ticket \#(\d+) \((.+)\) (\S+)\s*$/) {
my ($ticket, $summary, $action) = ($1, $2, $3);
$self->emit_ticket_karma(
prefix => 'TT #',
ticket => $ticket,
action => $action,
user => $user,
summary => $summary,
targets => $$self{targets},
url => "http://trac.parrot.org/parrot/ticket/$ticket"
);
main::lprint("parrotticketlog: ticket $ticket $action");
} else {
main::lprint("parrotticketlog: regex failed on $desc");
}
}
1;