14 package BarnOwl::Module::RT;
18 our $VERSION = '1.0.1';
22 "((?:set|add|del)\\s.*)", "edit ticket/\$t \$1",
23 "status\\s(deleted|resolved|rejected|open|new|waiting)", "edit ticket/\$t set status=\$1",
24 "(d|del|delete)", "edit ticket/\$t set status=deleted",
25 "(r|res|resolve)", "edit ticket/\$t set status=resolved",
26 "(rej|reject|rejected)", "edit ticket/\$t set status=rejected",
27 "show", "show -l ticket/\$t/history",
28 "show (\\d+)", "show -l ticket/\$1/history",
29 "list", 'rt list -o +Created "((Status=new or Status=stalled or Status=open) and (Queue=\'$q\'))"',
30 "list (\\w+)", 'rt list -o +Created "((Status=new or Status=stalled or Status=open) and (Queue=\'\$1\'))"',
31 "merge (\\d+)", "rt merge \$t \$1",
32 "(take|untake|steal)", "rt \$1 \$t",
33 "(?:owner|give)\\s(\\w+)", "edit ticket/\$t set owner=\$1",
38 my $cfg = BarnOwl::get_config_dir();
39 my $file_path = "$cfg/rtqueuemap";
41 open(my $fh, "<:encoding(UTF-8)", "$file_path") or die("Unable to read $file_path:$!\n");
42 while(defined(my $line = <$fh>)) {
43 next if $line =~ /^\s+#/;
44 next if $line =~ /^\s+$/;
45 my ($class, $q) = quotewords('\s+', 0, $line);
46 $queuemap{lc($class)} = $q;
51 $file_path = "$cfg/rtcommands";
53 open(my $fh, "<:encoding(UTF-8)", "$file_path") or die("Unable to read $file_path:$!\n");
54 while(defined(my $line = <$fh>)) {
55 next if $line =~ /^\s+#/;
56 next if $line =~ /^\s+$/;
57 my ($match, $command) = quotewords('\s+', 0, $line);
58 $commands{$match} = $command;
67 my $args = join(' ', @_);
68 my $m = owl::getcurmsg();
69 my ($ticket) = $m->instance =~ m/^\D*(\d{7})\D*$/;
70 my ($class) = $m->class =~ /^(?:un)*(.+?)(?:[.]d)*$/i;
71 my $queue = $queuemap{$class};
73 for my $key (keys %commands)
75 my $value = $commands{$key};
76 if($args =~ m/^\s*$key\s*$/){
79 #my $match = qr/\Q$key\E/
82 BarnOwl::error("Command 'rt " . $args . "' requires a message with ticket number selected");
85 $match =~ s/\$t/$ticket/;
89 BarnOwl::error("Command 'rt " . $args . "' requires a class in rtqueuemap selected");
92 $match =~ s/\$q/$queue/;
94 for my $digit ($value =~ m/\$(\d)/g){
95 $args =~ m/^\s*$key\s*$/;
96 my $replace = substr($args, $-[$digit], $+[$digit] - $-[$digit]);
97 $match =~ s/\$$digit/$replace/;
99 return run_rt_command( quotewords('\s+', 0, $match) );
103 BarnOwl::error("No Matching RT command found for: '" . $args . "'" );
108 my @args = ("athrun","tooltime","rt");
110 local(*IN, *OUT, *ERR);
111 my $pid = open3(*IN, *OUT, *ERR, @args) || die("RT threw $!");
113 my $out = do { local $/; <OUT> };
115 $out .= do { local $/; <ERR> };
120 if (($out =~ tr/\n//) eq 1){
123 BarnOwl::popless_text($out);
127 BarnOwl::new_command("rt",
130 summary => "rt commands in barnowl",
131 usage => "rt <args>",
132 description => <<END_DESCR
135 rt [set|add|del] <args> - runs rt (set|add|del) with relevent args - Dangerous if not careful
136 rt [d|del|delete] - mark a ticket deleted
137 rt [r|res|resolve] - mark a ticked resolved
138 rt [rej|reject|rejected] - mark a ticked rejected
139 rt status [deleted|resolved|new|open|waiting|rejected] - set status of a ticket
140 rt show - show detailed history of selected ticket
141 rt show <ticket> - show history of <ticket>
142 rt list - list open tickets of current queue
143 rt list <queue> - lists open tickets of <queue>
144 rt merge <ticket> - merges current ticket with <ticket>
145 rt [take|untake|steal] - takes, untakes, or steals ticket
146 rt [owner|give] <user> - gives selected ticket to <user>
149 Go to help.mit.edu to set you rt password
151 In ~\/.rtrc add the following lines:
157 ~\/.owl\/rtqueuemap is a list of queues in the form of
159 which is used for the queue in commands like the rt list function which select the current queue
160 help "Some Help Queue"
162 ~\/.owl\/rtcommands is a file where you can put custom
163 commands to map the barnowl rt module with the rt command
166 It is a good place to put custom queries which will be used frequently.
168 "list-owner (\\w+)" "rt list -o +Created \"((Status=new or Status=stalled or Status=open) and (Queue='\$q') and 'Owner='\$1')\""
170 \$t is the current ticket
171 \$q is the current queue
172 \$[digit] matches control groups in the first reg-exp
179 my $type = "comment";
180 if ($cmd eq "rt-reply"){
181 $type = "correspond";
184 my $m = owl::getcurmsg();
185 my ($ticket) = $m->instance =~ m/^\D*(\d{7})\D*$/;
187 BarnOwl::error("Command: '" . $cmd . "' requires a message with a ticket number selected");
192 return run_rt_command("rt", $type, "-m", join(" ", @_), $ticket);
194 return BarnOwl::start_edit_win($cmd . " ticket " . $ticket, sub {run_rt_command("rt", $type, "-m", @_, $ticket)});
198 BarnOwl::new_command("rt-reply",
201 summary => "Reply to current ticket",
202 usage => "rt-reply [message]",
203 description => <<END_DESCR
204 Replies to the currently selected ticket.
208 BarnOwl::new_command("rt-comment",
211 summary => "Comment on the current ticket",
212 usage => "rt-reply [message]",
213 description => <<END_DESCR
214 Comments on the currently selected ticket.
219 #owl::command('bindkey recv "M-r" command reply-un');