Tool for canned responses

We use RT to track feedback on our site. We often get frequently asked
questions (despite a FAQ list…) and want to quickly respond to them. I
wrote a utility to use JavaScript to insert a set of canned responses into
the reply form in RT, and thought it might be useful to others.

It will require a little configuration, which is documented in comments at
the head of the script. Basically you make a directory of canned
responses, where the first line of each file is a description, and the
rest is the response. Then run the script, and modify one line of
rt/lib/rt/ui/web/forms.pm to point to the generated JavaScript
file. That’s all it should take.

Let me know if you have suggestions or wind up using this. Enjoy.

-Marc marc@popularpower.com

     Give your computer something to dream about.    (tm)
	 Popular Power - www.popularpower.com

cannery (6.2 KB)

Great job!

Only one problem I’ve found.

When I select a response, I get the following javascript error and nothing is
written to the test area:

Line: 34
Char: 1
Error: ‘document.reply.content’ is not an object
Code: 0

I know nothing about javascript, but I assume this is supposed to be the
pre-existing content of the reply textarea, but I don’t see where you get that
data from initially. Any ideas?

We use RT to track feedback on our site. We often get frequently asked
questions (despite a FAQ list…) and want to quickly respond to them. I
wrote a utility to use JavaScript to insert a set of canned responses into
the reply form in RT, and thought it might be useful to others.

It will require a little configuration, which is documented in comments at
the head of the script. Basically you make a directory of canned
responses, where the first line of each file is a description, and the
rest is the response. Then run the script, and modify one line of
rt/lib/rt/ui/web/forms.pm to point to the generated JavaScript
file. That’s all it should take.

Let me know if you have suggestions or wind up using this. Enjoy.

-Marc marc@popularpower.com

   Give your computer something to dream about.    (tm)
   Popular Power - www.popularpower.com

Content-Description: cannery - perl RT utility

Hm, maybe I left out something. I bet I know what it is – you probably
have to add
name="reply"
to the form tag just above the place I said to put the script tag. So,
the whole part of forms.pm (lines 373-381) should look like this:

—begin—

print "<form action=\"$ScriptURL\" method=\"post\" name=\"reply\" $target>

<input type="hidden" name="serial_num" value="$serial_num">";
&UpdateOptions();

print "<input type="hidden" name="do_req_respond" value="true">

<font size="$MESSAGE_FONT">

<textarea rows=15 cols=78 name="content" WRAP=HARD>

—end—

I’ll change the script and report it so you don’t have to do that. (I’m
also adding sorted question names per another request.) Sorry about the
omission!

-Marc marc@popularpower.com

     Give your computer something to dream about.    (tm)
	 Popular Power - www.popularpower.comOn Sat, 5 Aug 2000, Wozz wrote:

Great job!

Only one problem I’ve found.

When I select a response, I get the following javascript error and nothing is
written to the test area:

Line: 34
Char: 1
Error: ‘document.reply.content’ is not an object
Code: 0

I know nothing about javascript, but I assume this is supposed to be the
pre-existing content of the reply textarea, but I don’t see where you get that
data from initially. Any ideas?

On Sat, Aug 05, 2000 at 07:30:03PM -0700, Marc Hedlund wrote:

We use RT to track feedback on our site. We often get frequently asked
questions (despite a FAQ list…) and want to quickly respond to them. I
wrote a utility to use JavaScript to insert a set of canned responses into
the reply form in RT, and thought it might be useful to others.

It will require a little configuration, which is documented in comments at
the head of the script. Basically you make a directory of canned
responses, where the first line of each file is a description, and the
rest is the response. Then run the script, and modify one line of
rt/lib/rt/ui/web/forms.pm to point to the generated JavaScript
file. That’s all it should take.

Let me know if you have suggestions or wind up using this. Enjoy.

-Marc marc@popularpower.com

   Give your computer something to dream about.    (tm)
   Popular Power - www.popularpower.com

Content-Description: cannery - perl RT utility

#!/usr/bin/perl -w

cannery - produce a JavaScript file to insert canned responses for RT

Copyright (c) 2000 Marc Hedlund marc@popularpower.com

###########

LICENSE

###########

This program is free software; you can redistribute it and/or modify

it under the terms of the GNU General Public License as published by

the Free Software Foundation; either version 2 of the License, or

(at your option) any later version.

This program is distributed in the hope that it will be useful, but

WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

General Public License for more details.

You should have received a copy of the GNU General Public License

along with this program; if not, write to the Free Software

Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307

USA

################

INSTRUCTIONS

################

This script auto-generates a JavaScript file (canned.js) to write a

‘select’ pop-up menu into the RT reply form, from which an RT queue

member can select a canned response to insert into the reply

textarea. (See http://www.fsck.com/projects/rt/ for more about

RT.) Canned responses are read from a set of plaintext files in the

firectory named by $formdir, below. These files should be written

so that the first line describes the canned response – this is the

line that will be shown in the pop-up menu. The rest of the file is

the response itself, which will be inserted into the top of the

reply textarea.

Running this script will write the JavaScript file into the $basedir

directory specified below, which should be a directory in the

document root of the Web server running RT. Once that is done,

insert the following line at line 378 rt/lib/rt/ui/web/forms.pm

(relative to the rt home directory), just above the textarea tag:

<script language="JavaScript1.1" src="/etc/rt/canned.js">

where “/etc/rt/canned.js” points to the file generated by running

this script, starting at the document root of the Web server.

That’s all you should have to do to install canned responses. When

you come up with more to add, just drop them in the ‘uncanned’

directory and re-run ‘cannery’ – they will be added immediately.

If you have comments or suggestions about this script, please let me

know. Thanks! --Marc Hedlund marc@popularpower.com

use strict;
use diagnostics;

my $basedir = “/home/www/in.popularpower.com/etc/rt”;
my $formdir = “$basedir/uncanned”;

open(INSERT, “>$basedir/canned.js”)
or die “Unable to write to canned.js: $!\n”;

print INSERT &header();

opendir(FORMS, “$formdir”)
or die “Unable to read $formdir: $!\n”;

my @formletters = grep { $_ ne ‘.’ and $_ ne ‘…’ } readdir FORMS;

closedir FORMS;

my $bodyformat = <<‘FORMAT’;
~~ "^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< " +
FORMAT

for (my $idx = 0; $idx < scalar(@formletters); $idx++) {
my $formfile = $formletters[$idx];

open(FORM, "$formdir/$formfile")
or warn "Unable to open $formfile: $!\n";

my $linecount = '';
my @formlines = map { 
if ($_ =~ /\w/) {
  $linecount++;
  chomp $_; 
  $_ =~ s/\"/\\\"/g; 
  $_ . " ";
    } elsif ($linecount > 1) {
  '\n\n';
} else {
        '';
    }
} <FORM>;

close FORM;

my $question = shift @formlines;
my $answer   = join('', @formlines);
my $formanswer = swrite($bodyformat, $answer);

$question   =~ s/\s+$//;
$formanswer =~ s/\s+\"\s\+\s*$/\ \"\ \+/mg;

print qq(Writing template "$question"...\n);

print INSERT "new template(\"$formfile\", \"$question\",\n$formanswer\n";
print INSERT '             "\n\n");' . "\n\n";

}

while (my $line = ) {
print INSERT $line;
}

sub swrite {
my $format = shift;
$^A = “”;
formline($format, @_);
return $^A;
}

sub header {
return <<‘HEADER’;
/*

  • This file is auto-generated by the “cannery” script.
  • Please don’t edit this file – edit the “cannery” script and
  • re-run it instead. If you want to enter a new template, just put a
  • new plaintext file in the “formletters” directory, where the first
  • line is the question to be answered, and the rest of the lines are
  • the answer.
  • “cannery” written by Marc Hedlund marc@popularpower.com
    */

/*

  • Set up data structures
    */

var questions = new Object();
var answers = new Object();

/*

  • Build the canned response entries. These are drawn from the
  • “uncanned” directory.
    */

HEADER
}

DATA
/*

  • This is the closing line that will be inserted at the bottom of
  • every template.
    */

var closing = “Thanks very much for taking the time to write to us!\n\n”;

/*

  • Nothing below here should be changed in the usual case – this is
  • just the ‘guts’. If you do make changes below that you think would
  • be generally useful, let me know! marc@popularpower.com
    */

// Write out the select tag and the embedded option tags.

writeMenu();

// Functions, called above or from the HTML page.

/*

  • Adds an entry to the canned response collection.
    */

function template(key, question, answer) {
questions[key] = question;
answers[key] = answer;
}

/*

  • Writes a menu of canned responses into the current HTML page
    */

function writeMenu() {
document.writeln(‘
<select name=“templates” size=“1”’ +
‘onChange=“insert(document.reply.content, ’ +
'document.reply.templates)”>’);

document.writeln(’ Select a template…');

for (var key in questions) {
document.writeln(’ ’ + questions[key]);
}

document.write(“\n\n”);
}

/*

  • Inserts a canned response selected by the user into the reply
  • textarea.
    */

function insert(textarea, select) {
for (var i = 0; i < select.options.length; i++) {
var option = select.options[i];
if (option.selected && option.value != “none”) {
textarea.value =
answers[option.value] + closing + textarea.value;
}
}
}

That did it! Thanks!On Sat, Aug 05, 2000 at 10:21:09PM -0700, Marc Hedlund wrote:

Hm, maybe I left out something. I bet I know what it is – you probably
have to add
name="reply"
to the form tag just above the place I said to put the script tag. So,
the whole part of forms.pm (lines 373-381) should look like this:

—begin—

print "<form action=\"$ScriptURL\" method=\"post\" name=\"reply\" $target>

<input type="hidden" name="serial_num" value="$serial_num">";
&UpdateOptions();

print "<input type="hidden" name="do_req_respond" value="true">

<font size="$MESSAGE_FONT">

<textarea rows=15 cols=78 name="content" WRAP=HARD>

—end—

I’ll change the script and report it so you don’t have to do that. (I’m
also adding sorted question names per another request.) Sorry about the
omission!

-Marc marc@popularpower.com

   Give your computer something to dream about.    (tm)
   Popular Power - www.popularpower.com

On Sat, 5 Aug 2000, Wozz wrote:

Great job!

Only one problem I’ve found.

When I select a response, I get the following javascript error and nothing is
written to the test area:

Line: 34
Char: 1
Error: ‘document.reply.content’ is not an object
Code: 0

I know nothing about javascript, but I assume this is supposed to be the
pre-existing content of the reply textarea, but I don’t see where you get that
data from initially. Any ideas?

On Sat, Aug 05, 2000 at 07:30:03PM -0700, Marc Hedlund wrote:

We use RT to track feedback on our site. We often get frequently asked
questions (despite a FAQ list…) and want to quickly respond to them. I
wrote a utility to use JavaScript to insert a set of canned responses into
the reply form in RT, and thought it might be useful to others.

It will require a little configuration, which is documented in comments at
the head of the script. Basically you make a directory of canned
responses, where the first line of each file is a description, and the
rest is the response. Then run the script, and modify one line of
rt/lib/rt/ui/web/forms.pm to point to the generated JavaScript
file. That’s all it should take.

Let me know if you have suggestions or wind up using this. Enjoy.

-Marc marc@popularpower.com

   Give your computer something to dream about.    (tm)
   Popular Power - www.popularpower.com

Content-Description: cannery - perl RT utility

#!/usr/bin/perl -w

cannery - produce a JavaScript file to insert canned responses for RT

Copyright (c) 2000 Marc Hedlund marc@popularpower.com

###########

LICENSE

###########

This program is free software; you can redistribute it and/or modify

it under the terms of the GNU General Public License as published by

the Free Software Foundation; either version 2 of the License, or

(at your option) any later version.

This program is distributed in the hope that it will be useful, but

WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

General Public License for more details.

You should have received a copy of the GNU General Public License

along with this program; if not, write to the Free Software

Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307

USA

################

INSTRUCTIONS

################

This script auto-generates a JavaScript file (canned.js) to write a

‘select’ pop-up menu into the RT reply form, from which an RT queue

member can select a canned response to insert into the reply

textarea. (See http://www.fsck.com/projects/rt/ for more about

RT.) Canned responses are read from a set of plaintext files in the

firectory named by $formdir, below. These files should be written

so that the first line describes the canned response – this is the

line that will be shown in the pop-up menu. The rest of the file is

the response itself, which will be inserted into the top of the

reply textarea.

Running this script will write the JavaScript file into the $basedir

directory specified below, which should be a directory in the

document root of the Web server running RT. Once that is done,

insert the following line at line 378 rt/lib/rt/ui/web/forms.pm

(relative to the rt home directory), just above the textarea tag:

<script language="JavaScript1.1" src="/etc/rt/canned.js">

where “/etc/rt/canned.js” points to the file generated by running

this script, starting at the document root of the Web server.

That’s all you should have to do to install canned responses. When

you come up with more to add, just drop them in the ‘uncanned’

directory and re-run ‘cannery’ – they will be added immediately.

If you have comments or suggestions about this script, please let me

know. Thanks! --Marc Hedlund marc@popularpower.com

use strict;
use diagnostics;

my $basedir = “/home/www/in.popularpower.com/etc/rt”;
my $formdir = “$basedir/uncanned”;

open(INSERT, “>$basedir/canned.js”)
or die “Unable to write to canned.js: $!\n”;

print INSERT &header();

opendir(FORMS, “$formdir”)
or die “Unable to read $formdir: $!\n”;

my @formletters = grep { $_ ne ‘.’ and $_ ne ‘…’ } readdir FORMS;

closedir FORMS;

my $bodyformat = <<‘FORMAT’;
~~ "^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< " +
FORMAT

for (my $idx = 0; $idx < scalar(@formletters); $idx++) {
my $formfile = $formletters[$idx];

open(FORM, "$formdir/$formfile")
or warn "Unable to open $formfile: $!\n";

my $linecount = '';
my @formlines = map { 
if ($_ =~ /\w/) {
  $linecount++;
  chomp $_; 
  $_ =~ s/\"/\\\"/g; 
  $_ . " ";
    } elsif ($linecount > 1) {
  '\n\n';
} else {
        '';
    }
} <FORM>;

close FORM;

my $question = shift @formlines;
my $answer   = join('', @formlines);
my $formanswer = swrite($bodyformat, $answer);

$question   =~ s/\s+$//;
$formanswer =~ s/\s+\"\s\+\s*$/\ \"\ \+/mg;

print qq(Writing template "$question"...\n);

print INSERT "new template(\"$formfile\", \"$question\",\n$formanswer\n";
print INSERT '             "\n\n");' . "\n\n";

}

while (my $line = ) {
print INSERT $line;
}

sub swrite {
my $format = shift;
$^A = “”;
formline($format, @_);
return $^A;
}

sub header {
return <<‘HEADER’;
/*

  • This file is auto-generated by the “cannery” script.
  • Please don’t edit this file – edit the “cannery” script and
  • re-run it instead. If you want to enter a new template, just put a
  • new plaintext file in the “formletters” directory, where the first
  • line is the question to be answered, and the rest of the lines are
  • the answer.
  • “cannery” written by Marc Hedlund marc@popularpower.com
    */

/*

  • Set up data structures
    */

var questions = new Object();
var answers = new Object();

/*

  • Build the canned response entries. These are drawn from the
  • “uncanned” directory.
    */

HEADER
}

DATA
/*

  • This is the closing line that will be inserted at the bottom of
  • every template.
    */

var closing = “Thanks very much for taking the time to write to us!\n\n”;

/*

  • Nothing below here should be changed in the usual case – this is
  • just the ‘guts’. If you do make changes below that you think would
  • be generally useful, let me know! marc@popularpower.com
    */

// Write out the select tag and the embedded option tags.

writeMenu();

// Functions, called above or from the HTML page.

/*

  • Adds an entry to the canned response collection.
    */

function template(key, question, answer) {
questions[key] = question;
answers[key] = answer;
}

/*

  • Writes a menu of canned responses into the current HTML page
    */

function writeMenu() {
document.writeln(‘
<select name=“templates” size=“1”’ +
‘onChange=“insert(document.reply.content, ’ +
'document.reply.templates)”>’);

document.writeln(’ Select a template…');

for (var key in questions) {
document.writeln(’ ’ + questions[key]);
}

document.write(“\n\n”);
}

/*

  • Inserts a canned response selected by the user into the reply
  • textarea.
    */

function insert(textarea, select) {
for (var i = 0; i < select.options.length; i++) {
var option = select.options[i];
if (option.selected && option.value != “none”) {
textarea.value =
answers[option.value] + closing + textarea.value;
}
}
}

Okay, I’m attaching a ‘version 0.2’ of cannery (see below). This version
corrects the installation instructions and removes that ‘reply’ bug, and
it sorts the list of canned responses alphabetically by title. I also
added an informational message if the script cannot find any form letters
to pull in, and more comments to the perl section. Again, let me know if
you have trouble.

Thanks,
-Marc marc@popularpower.com

     Give your computer something to dream about.    (tm)
	 Popular Power - www.popularpower.comOn Sat, 5 Aug 2000, I wrote:

We use RT to track feedback on our site. We often get frequently asked
questions (despite a FAQ list…) and want to quickly respond to them. I
wrote a utility to use JavaScript to insert a set of canned responses into
the reply form in RT, and thought it might be useful to others.

It will require a little configuration, which is documented in comments at
the head of the script. Basically you make a directory of canned
responses, where the first line of each file is a description, and the
rest is the response. Then run the script, and modify one line of
rt/lib/rt/ui/web/forms.pm to point to the generated JavaScript
file. That’s all it should take.

Let me know if you have suggestions or wind up using this. Enjoy.

-Marc marc@popularpower.com

   Give your computer something to dream about.    (tm)
   Popular Power - www.popularpower.com

cannery (8.59 KB)

Okay, I’m attaching a ‘version 0.2’ of cannery (see below). This version
corrects the installation instructions and removes that ‘reply’ bug, and
it sorts the list of canned responses alphabetically by title. I also
added an informational message if the script cannot find any form letters
to pull in, and more comments to the perl section. Again, let me know if
you have trouble.

I think I may have found another problem…

for whatever reason, replies are no longer sent out. I assume this has something
to do with changing the form ‘name’ to “reply”. Something further down the line
is confused. This is a stock rt 1.0.2 install (plus your v0.1 script with the
reply modification.) I cc’d one of the replies, and this is what the headers look
likeFrom: Matt Cable via RT abuse@isg.x.x
To:
Cc: wozz@wookie.net
Date: 6 Aug 2000 22:28:39 -0000
Subject: [HSA-ISG #3117] (incoming-abuse) This is a test

So, the To: is not being extracted correctly, but the CC: is.

Any thoughts?

Hm, that’s really weird. I made the ‘reply’ change when I installed 0.1
of cannery, but I didn’t see this problem. I am using RT 1.0.3, though.
Anyone else?

The 0.2 script no longer requires the ‘reply’ change, so maybe upgrading
would take care of things for you.

Apologies if this is the cause…

-Marc marc@popularpower.com

     Give your computer something to dream about.    (tm)
	 Popular Power - www.popularpower.comOn Sun, 6 Aug 2000, Wozz wrote:

On Sat, Aug 05, 2000 at 10:45:53PM -0700, Marc Hedlund wrote:

Okay, I’m attaching a ‘version 0.2’ of cannery (see below). This version
corrects the installation instructions and removes that ‘reply’ bug, and
it sorts the list of canned responses alphabetically by title. I also
added an informational message if the script cannot find any form letters
to pull in, and more comments to the perl section. Again, let me know if
you have trouble.

I think I may have found another problem…

for whatever reason, replies are no longer sent out. I assume this has something
to do with changing the form ‘name’ to “reply”. Something further down the line
is confused. This is a stock rt 1.0.2 install (plus your v0.1 script with the
reply modification.) I cc’d one of the replies, and this is what the headers look
like

From: Matt Cable via RT abuse@isg.x.x
To:
Cc: wozz@wookie.net
Date: 6 Aug 2000 22:28:39 -0000
Subject: [HSA-ISG #3117] (incoming-abuse) This is a test

So, the To: is not being extracted correctly, but the CC: is.

Any thoughts?