add comment to ticket in RT
[ILL-Zotero-RT] / zotero.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use LWP::Simple;
6 use XML::Simple;
7 use JSON;
8 use Data::Dump qw(dump);
9 use RT::Client::REST;
10
11 my $UserID = $ENV{UserID} || die "usage: UserID=1234 key=abcd $0";
12 my $key    = $ENV{key}    || die "key required";
13
14 my $FETCH  = $ENV{FETCH}  || 0;
15
16 my $url = "https://api.zotero.org/users/$UserID/items?key=$key&format=atom&content=json&order=dateModified&sort=desc";
17
18 my $file = "$UserID.atom";
19
20 warn "# $url\n";
21 if ( $FETCH && mirror( $url => $file ) == RC_NOT_MODIFIED ) {
22         warn "not modified";
23 #       exit 0;
24 }
25
26 my $feed = XMLin( $file );
27 #warn "# feed ",dump($feed);
28
29 my $tree;
30 my $ticket_items;
31
32 my $items;
33
34 foreach my $entry ( keys %{ $feed->{entry} } ) {
35         warn "# entry $entry ",dump($entry);
36         my $id = $entry;
37         $id =~ s{.+/items/}{}; # leave just ID
38
39         my $item = $feed->{entry}->{$entry};
40
41         foreach my $link ( @{ $item->{link} } ) {
42                 warn "# link $id ",dump($link);
43                 if ( $link->{rel} eq 'up' ) {
44                         my $up = $link->{href};
45                         $up =~ s{.+/items/}{};
46                         $up =~ s{\?.+}{};
47                         push @{ $tree->{$up} }, $id;
48                 }
49         }
50
51         if ( $item->{content}->{'zapi:type'} eq 'json' ) {
52                 my $json = $item->{content}->{content};
53                 warn "# $json\n";
54                 $json = $item->{content} = decode_json $json;
55                 warn "# json $id ", dump $json;
56
57                 foreach my $tag ( @{ $json->{tags} } ) {
58                         $tag = $tag->{tag};
59                         warn "# tag $id $tag\n";
60                         next unless $tag =~ m/#(\d+)/;
61                         push @{ $ticket_items->{$1} }, $id;
62                 }
63         }
64
65         $items->{$id} = $item;
66
67 }
68
69 warn "# tree ",dump( $tree );
70
71 warn "# ticket_items ",dump( $ticket_items );
72
73
74 my $rt = RT::Client::REST->new(
75         server => 'http://rt.rot13.org/rt',
76         timeout => 30,
77 );
78
79 $rt->login(username => $ENV{RT_USER}, password => $ENV{RT_PASSWORD});
80
81 foreach my $nr ( keys %$ticket_items ) {
82
83         my $ticket = $rt->show(type => 'ticket', id => $nr);
84         warn "# ticket $nr ",dump($ticket);
85
86         if ( $ticket->{Queue} !~ m/ILL/i ) {
87                 warn "SKIP $ticket not in ILL queue!";
88                 next;
89         }
90
91         foreach my $id ( @{ $ticket_items->{$nr} } ) {
92                 warn "# item $id ",dump( $items->{$id} );
93
94                 $rt->comment( ticket_id => $nr, message => dump( $items->{$id} ) );
95
96                 last; # FIXME just first
97
98         }
99
100 }