--- loncom/interface/lonmsg.pm 2000/10/31 22:31:37 1.5
+++ loncom/interface/lonmsg.pm 2001/08/03 18:47:18 1.15
@@ -10,7 +10,10 @@
#
# 10/05 Gerd Kortemeyer)
#
-# 10/19,10/20,10/30 Gerd Kortemeyer
+# 10/19,10/20,10/30,
+# 02/06/01 Gerd Kortemeyer
+# 07/27 Guy Albertelli
+# 07/27,07/28,07/30,08/03 Gerd Kortemeyer
package Apache::lonmsg;
@@ -23,15 +26,21 @@ use Apache::Constants qw(:common);
# ===================================================================== Package
sub packagemsg {
- my ($subject,$message)=@_;
+ my ($subject,$message,$citation)=@_;
$message=~s/\\<\;/g;
$message=~s/\>/\>\;/g;
+ $citation=~s/\\<\;/g;
+ $citation=~s/\>/\>\;/g;
$subject=~s/\\<\;/g;
$subject=~s/\>/\>\;/g;
my $now=time;
$msgcount++;
- my $msgid=$now.'_'.$ENV{'user.name'}.'_'.
- $ENV{'user.domain'}.'_'.$msgcount.'_'.$$;
+ my $partsubj=$subject;
+ $partsubj=&Apache::lonnet::escape($partsubj);
+ $partsubj=substr($partsubj,0,50);
+ my $msgid=&Apache::lonnet::escape(
+ $now.':'.$partsubj.':'.$ENV{'user.name'}.':'.
+ $ENV{'user.domain'}.':'.$msgcount.':'.$$);
return $msgid,
''.$ENV{'user.name'}.''.
''.$ENV{'user.domain'}.''.
@@ -49,7 +58,8 @@ sub packagemsg {
''.$ENV{'request.role'}.''.
''.$ENV{'request.filename'}.''.
''.$msgid.''.
- ''.$message.'';
+ ''.$message.''.
+ ''.$citation.'';
}
# ================================================== Unpack message into a hash
@@ -69,6 +79,18 @@ sub unpackagemsg {
return %content;
}
+# ======================================================= Get info out of msgid
+
+sub unpackmsgid {
+ my $msgid=&Apache::lonnet::unescape(shift);
+ my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/,
+ &Apache::lonnet::unescape($msgid));
+ my %status=&Apache::lonnet::get('email_status',[$msgid]);
+ if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
+ unless ($status{$msgid}) { $status{$msgid}='new'; }
+ return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid});
+}
+
# =============================== Automated message to the author of a resource
sub author_res_msg {
@@ -121,8 +143,9 @@ sub user_crit_msg {
# =================================================== Critical message received
sub user_crit_received {
- my $message=shift;
- my %contents=&unpackagemsg($message);
+ my $msgid=shift;
+ my %message=&Apache::lonnet::get('critical',[$msgid]);
+ my %contents=&unpackagemsg($message{$msgid});
my $status='rec: '.
&user_normal_msg($contents{'sendername'},$contents{'senderdomain'},
'Receipt: '.$ENV{'user.name'}.' at '.$ENV{'user.domain'},
@@ -131,19 +154,21 @@ sub user_crit_received {
$contents{'subject'}.'" dated '.$contents{'time'}.".\n\n"
.'Message ID: '.$contents{'msgid'});
$status.=' trans: '.
- &Apache::lonnet::put('nohist_email',$contents{'msgid'} => $message);
+ &Apache::lonnet::put(
+ 'nohist_email',{$contents{'msgid'} => $message{$msgid}});
$status.=' del: '.
- &Apache::lonnet::del('critical',$contents{'msgid'});
+ &Apache::lonnet::del('critical',[$contents{'msgid'}]);
&Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},
$ENV{'user.home'},'Received critical message '.
$contents{'msgid'}.
', '.$status);
+ return $status;
}
# ======================================================== Normal communication
sub user_normal_msg {
- my ($user,$domain,$subject,$message)=@_;
+ my ($user,$domain,$subject,$message,$citation)=@_;
# Check if allowed missing
my $status='';
my $msgid='undefined';
@@ -151,7 +176,7 @@ sub user_normal_msg {
my $homeserver=&Apache::lonnet::homeserver($user,$domain);
if ($homeserver ne 'no_host') {
my $msgid;
- ($msgid,$message)=&packagemsg($subject,$message);
+ ($msgid,$message)=&packagemsg($subject,$message,$citation);
$status=&Apache::lonnet::critical(
'put:'.$domain.':'.$user.':nohist_email:'.
&Apache::lonnet::escape($msgid).'='.
@@ -165,6 +190,146 @@ sub user_normal_msg {
return $status;
}
+# =============================================================== Status Change
+
+sub statuschange {
+ my ($msgid,$newstatus)=@_;
+ my %status=&Apache::lonnet::get('email_status',[$msgid]);
+ if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
+ unless ($status{$msgid}) { $status{$msgid}='new'; }
+ unless (($status{$msgid} eq 'replied') ||
+ ($status{$msgid} eq 'forwarded')) {
+ &Apache::lonnet::put('email_status',{$msgid => $newstatus});
+ }
+ if (($newstatus eq 'deleted') || ($newstatus eq 'new')) {
+ &Apache::lonnet::put('email_status',{$msgid => $newstatus});
+ }
+}
+
+# ==================================================== Display Critical Message
+
+sub discrit {
+ my $r=shift;
+ $r->print('
Critical Messages
'.
+ '');
+}
+
+# =============================================================== Compose reply
+
+sub comprep {
+ my ($r,$msgid)=@_;
+ my %message=&Apache::lonnet::get('nohist_email',[$msgid]);
+ my %content=&unpackagemsg($message{$msgid});
+ my $quotemsg='> '.$content{'message'};
+ $quotemsg=~s/\r/\n/g;
+ $quotemsg=~s/\f/\n/g;
+ $quotemsg=~s/\n+/\n\> /g;
+ my $subject='Re: '.$content{'subject'};
+ my $dispcrit='';
+ if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
+ $dispcrit=
+ ' Send as critical message';
+ }
+ $r->print(<<"ENDREPLY");
+
+ENDREPLY
+}
+
+# ======================================================== Display all messages
+
+sub disall {
+ my $r=shift;
+ $r->print('Display All Messages
'.
+ '  | Date | '.
+ 'Username | Domain | Subject | Status |
');
+ map {
+ my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)=
+ &Apache::lonmsg::unpackmsgid($_);
+ unless ($status eq 'deleted') {
+ if ($status eq 'new') {
+ $r->print('');
+ } elsif ($status eq 'read') {
+ $r->print('
');
+ } elsif ($status eq 'replied') {
+ $r->print('
');
+ } else {
+ $r->print('
');
+ }
+ $r->print('Open | Delete | '.localtime($sendtime).' | '.
+ $fromname.' | '.$fromdomain.' | '.
+ &Apache::lonnet::unescape($shortsubj).' | '.
+ $status.' |
');
+ }
+ } sort split(/\&/,&Apache::lonnet::reply('keys:'.
+ $ENV{'user.domain'}.':'.
+ $ENV{'user.name'}.':nohist_email',
+ $ENV{'user.home'}));
+ $r->print('