Annotation of capa/capa51/Discuss/Ver1.2/capadiscuss, revision 1.1.1.1

1.1       albertel    1: #!/usr/ucb/perl
                      2: #
                      3: # CAPA Discussion Forum
                      4: # version 1.2c
                      5: #
                      6: # Michigan State University
                      7: # Department of Physics and Astronomy
                      8: #
                      9: # Ryan J. Shaltry
                     10: # tech4@msue.msu.edu
                     11: 
                     12: require "capadiscuss.setup";
                     13: require "capadiscuss_html";
                     14: 
                     15: ################################################
                     16: ## Configuration - Change these appropriately ##
                     17: ################################################
                     18: 
                     19: # capadiscuss.setup
                     20: 
                     21: ################################################
                     22: ## End Configuration ###########################
                     23: ################################################
                     24: 
                     25: print "Content-type: text/html\n\n";
                     26: 
                     27: &form_info;
                     28: 
                     29: $yp = "19";
                     30: 
                     31:   # define variables
                     32:   $class    = $form{'CLASS'};
                     33:   $snum     = $form{'SNUM'};
                     34:   $capaid   = $form{'CAPAID'};
                     35:   $setid    = $form{'SETID'};
                     36:   $action   = $form{'ACTION'};
                     37:   $file     = $form{'FILE'};
                     38:   $probnum  = $form{'PROBNUM'};
                     39:   $replynum = $form{'REPLYNUM'};
                     40:   $psetid   = $form{'PSETID'};
                     41:  
                     42:   if($psetid eq "") { $psetid = $setid; }
                     43:  
                     44:   &GetTeacherInfo;
                     45: 
                     46:   # check for valid studentnumber/capaid
                     47:   &ValidateUser;
                     48: 
                     49:   # grab username from student number
                     50:   &UserInfo($snum);
                     51:   &GetDateTime;
                     52: 
                     53:   # call appropriate sr
                     54:   if($action eq "newset"                   ) { &NewSet;                }
                     55:   if($action eq "viewset" || $action eq "" ) { &ViewSet;               }
                     56:   if($action eq "viewproblem"              ) { &ViewProblem;           }
                     57:   if($action eq "post"                     ) { &Post;                  }
                     58:   if($action eq "postsubmit"               ) { &PostSubmit;            }
                     59:   if($action eq "delmsgpre"                ) { &DelMsgPre;             }
                     60:   if($action eq "delmsg"                   ) { &DelMsg;                }
                     61:   if($action eq "hidemsgpre"               ) { &HideMsgPre;            }
                     62:   if($action eq "hidemsg"                  ) { &HideMsg;               }
                     63:   if($action eq "unhidemsgpre"             ) { &UnHideMsgPre;          }
                     64:   if($action eq "unhidemsg"                ) { &UnHideMsg;             }
                     65: 
                     66:   if($action eq "admin"                    ) { &AdminMain;             }
                     67:   if($action eq "adminusersearch"          ) { &AdminUserSearch;       }
                     68:   if($action eq "adminusersearchsubmit"    ) { &AdminUserSearchSubmit; }
                     69: 
                     70:   if($action eq "viewinfofile"             ) { &ViewInfoFile;          }
                     71: 
                     72:   if($action eq "topmsg"                   ) { &TopMsg("top");        }
                     73:   if($action eq "untopmsg"                 ) { &TopMsg("");            }
                     74: 
                     75: exit;
                     76: 
                     77: #######################
                     78: ## Begin Subroutines ##
                     79: #######################
                     80: 
                     81: sub NewSet {
                     82:   &Log("NewSet");
                     83: 
                     84:   if($setid <= $psetid) {   #grab capaid
                     85:     @allcapaid = `allcapaid -s $setid -e $setid -stu $snum -c $capadir/$class -i`;
                     86: 
                     87:     $capaid = $allcapaid[2];
                     88:     chop $capaid;
                     89:     chop $capaid;
                     90:     &ViewSet;
                     91:   }
                     92: 
                     93:   opendir(DDIR,"$capadir/$class/discussion");
                     94:     @sets = grep(/[0-9]/,sort(readdir(DDIR)));
                     95:   closedir(DDIR);
                     96: 
                     97:   $pdset = "<select name=\"SETID\">\n";
                     98:   foreach $setnum(@sets) {
                     99:     $selected = "";
                    100:     if($setnum eq $setid) { $selected = "selected"; }
                    101:     $pdset .= "<option value=\"$setnum\" $selected>$setnum\n";
                    102:   }
                    103:   $pdset .= "</select>\n";
                    104: 
                    105:   &NewSetHTML;
                    106:   exit;
                    107: }
                    108: 
                    109: sub ViewSet {
                    110:   &Log("ViewSet");
                    111: 
                    112:   &CheckAdmin;
                    113: 
                    114:   $adminbutton = "";
                    115:   if($validadmin eq "yes") {
                    116:     $adminbutton = &AdminButtonHTML;
                    117:   }
                    118: 
                    119:   $capasbin = "$capasbin/$teachdir/capasbin";
                    120:   &SetJumpBox;
                    121: 
                    122:   opendir(FORUM,"$capadir/$class/discussion/$setid");
                    123:     @dir = sort(readdir(FORUM));
                    124:   closedir(FORUM);
                    125: 
                    126:   @infofiles = grep(/.info/,@dir);
                    127:   $infostring = "";
                    128:   $backfunction = "viewset";
                    129:   foreach $infofile(@infofiles) {
                    130:     $infodesc = $infofile;
                    131:     $infodesc =~ s/.info//g;
                    132:     $infodesc =~ s/_/ /g;
                    133:     $infostring .= &InfoButtonHTML;
                    134:   }
                    135: 
                    136: 
                    137:   foreach $i(@dir) {
                    138:     $probnum = &RemZero(substr($i,0,6));
                    139:     if($found[$probnum] eq "") { $found[$probnum] = "0"; }
                    140:     $found[$probnum] = $found[$probnum] + 1;
                    141:   }
                    142: 
                    143:   $maxprobs = &MaxProbs($setid);
                    144: 
                    145:   # split table (if more than 15 problems)
                    146:   $bigtable = "no";
                    147:   if($maxprobs > 5) {
                    148:     $bigtable = "yes";
                    149:     $col1size = int ($maxprobs / 2);
                    150:     $col2size = $maxprobs - $col1size;
                    151:     if($col1size < $col2size) {
                    152:       $t = $col1size;
                    153:       $col1size = $col2size;
                    154:       $col2size = $t;
                    155:     }
                    156:   }
                    157: 
                    158:   &ViewSetTitleHTML;
                    159: 
                    160:   if($bigtable eq "no") { &ViewSetTopSmallHTML; }
                    161:   else                  { &ViewSetTopBigHTML; }
                    162: 
                    163:   $col = 1;
                    164:   for($probnum=1; $probnum<=$maxprobs; $probnum++) {
                    165:     if($col eq "1" && $probnum > $col1size && $bigtable eq "yes") {
                    166:       $col = 2;
                    167:       &ViewSetEndColHTML;
                    168:       &ViewSetTopSmallHTML;
                    169:     }
                    170:     if($found[$probnum] ne "") {
                    171:       opendir(MSG,"$capadir/$class/discussion/$setid");
                    172:         @msgs = grep(/.msg/,sort(readdir(MSG)));
                    173:       closedir(MSG);
                    174:       foreach $msg(@msgs) {
                    175:         if(&RemZero(substr($msg,0,6)) eq $probnum) {
                    176:           push(@good,$msg);
                    177:         }
                    178:       }
                    179: 
                    180:       &OpenMsg("$capadir/$class/discussion/$setid/$good[$#good]");
                    181:       $lastpost = "$date at $time";
                    182:       $posts = $found[$probnum];
                    183:     }
                    184:     else {
                    185:       $lastpost = "--";
                    186:       $posts = "0"; }
                    187:     &ViewSetGutsHTML;
                    188:   }
                    189:   &ViewSetBotHTML;
                    190:   exit;
                    191: }
                    192: 
                    193: sub ViewProblem {
                    194:   &Log("ViewProblem");
                    195: 
                    196:   # check if user is administrator (for admin button)
                    197:   &CheckAdmin;
                    198:   if($validadmin eq "yes") {
                    199:     $adminbutton = &AdminButtonHTML;
                    200:   }
                    201:   else {
                    202:     $adminbutton = "";
                    203:   }
                    204: 
                    205:   opendir (MSGS,"$capadir/$class/discussion/$setid");
                    206:     @msgs = sort(readdir(MSGS));
                    207:   closedir(MSGS);
                    208: 
                    209:   # search for top message
                    210:   @top = grep (/top/, @msgs);
                    211:   $topmsg = "";
                    212:   print "$#top";
                    213:   if($#top ne "0") {
                    214:     $pnum = &AddZero($probnum);
                    215:     foreach $entry(@top) {
                    216:       $find = $entry =~ s/\A$pnum/$pnum/o;
                    217:       if($find eq "1") {
                    218:         $topmsg = $entry;
                    219:         @msgs = grep(!/$topmsg/,@msgs);
                    220:         unshift(@msgs,$topmsg);
                    221:         print "$topmsg";
                    222:       }
                    223:     }
                    224:   }
                    225: 
                    226:   $msgfind = "no";
                    227:   $msgcount = 0;
                    228: 
                    229:   $capasbin = "$capasbin/$teachdir/capasbin";
                    230: 
                    231:   foreach $i(@msgs) {
                    232:     $pn = &RemZero(substr($i,0,6));
                    233:     if($pn eq $probnum) {
                    234:       $msgcount++;
                    235:       $msgfind = "yes";
                    236:       &OpenMsg("$capadir/$class/discussion/$setid/$i");
                    237: 
                    238:       if($status eq "hidden" && $validadmin ne "yes") {
                    239:         $msgcount--;
                    240:         $msgfind = "no";
                    241:       }
                    242: 
                    243:       if($msgcount eq "1") {
                    244:         $postbutton = &ReplyButtonHTML;
                    245:         &ProblemJumpBox;
                    246:         &ViewProblemTopHTML;
                    247:       }
                    248: 
                    249:       ($token1,$token2) = split(/\|/,$poster);
                    250:       chop $token2;
                    251:       if($token1 eq "Anonymous") {
                    252:          if($validadmin eq "yes") {
                    253:            $poster = "$token2 (anonymously)";
                    254:          }
                    255:          else {
                    256:            $poster = "$token1";
                    257:            $email = "";
                    258:          }
                    259:       }
                    260:       $topfind = grep(/-top.msg/,$i);
                    261:       if($validadmin eq "yes") {
                    262:         $file = "$i";
                    263:         $delbutton = &DelButtonHTML;
                    264:         $hidebutton = &HideButtonHTML;
                    265:         $topbutton = &TopButtonHTML;
                    266:         if($topfind eq "1") { $topbutton = &UnTopButtonHTML; }
                    267:       }
                    268:       $subjectbgcolor = "#92D1D0";
                    269:       if($topfind eq "1") { $subjectbgcolor = "blue"; }
                    270:       $messagenote = "";
                    271:       if($validadmin eq "yes" || $status eq "public") {
                    272:         if($status eq "hidden") {
                    273:           $subjectbgcolor = "red";
                    274:           $hidebutton = &UnHideButtonHTML;
                    275:           $messagenote = "Hidden by $hiddenuser on $hiddendate at $hiddentime from $hiddenaddr";
                    276:         }
                    277:         &ViewProblemGutsHTML;
                    278:       }
                    279:     }
                    280:   }
                    281:   &ViewProblemBotHTML;
                    282: 
                    283:   if($msgfind eq "no") {
                    284:     $postbutton = &PostNewButtonHTML;
                    285:     &ProblemJumpBox;
                    286:     &ViewProblemTopHTML;
                    287:     &ViewProblemNoneHTML;
                    288:     &ViewProblemBotHTML;
                    289:   }
                    290:   
                    291:   exit;
                    292: }
                    293: 
                    294: sub ViewInfoFile {
                    295:   open(INFOFILE,"$capadir/$class/discussion/$setid/$file");
                    296:     @file = <INFOFILE>;
                    297:   closedir(INFOFILE);
                    298: 
                    299:   print "<html><head></head><body bgcolor=\"#ffffff\">";
                    300:   $backfunction = $form{'BACKFUNCTION'};
                    301:   &InfoBackButtonHTML;
                    302:   foreach $line(@file) {
                    303:     print "$line";
                    304:   }
                    305: 
                    306:   exit;
                    307: }
                    308: 
                    309: sub Post {
                    310:   local(@msgs,$pn,$msg);
                    311: 
                    312:   # grab last message in thread
                    313:   opendir(MSGS,"$capadir/$class/discussion/$setid");
                    314:     @msgs = grep(/.msg/,sort(readdir(MSGS)));
                    315:   closedir(MSGS); 
                    316: 
                    317:   foreach $msg(@msgs) {
                    318:     $pn = &RemZero(substr($msg,0,6));
                    319:     if($pn eq $probnum) {
                    320:       $lastfile = $msg;
                    321:     }
                    322:   }
                    323: 
                    324:   $PostType = "New Message";
                    325:   if($lastfile ne "") {
                    326:     &OpenMsg("$capadir/$class/discussion/$setid/$lastfile");
                    327:     if($status eq "public" || $validadmin eq "yes") {
                    328:       ($poster,$rposter) = split(/\|/,$poster);
                    329:       $inreplyto = &InReplyToHTML;
                    330:       $PostType = "Reply";
                    331:     }
                    332:   }
                    333: 
                    334:   &PostHTML;
                    335:   exit;
                    336: }
                    337: 
                    338: sub PostSubmit {
                    339:   local($message,$subject,$date);
                    340: 
                    341:   $message = $form{'message'};
                    342:   $subject = $form{'subject'};
                    343:   
                    344:   if($message eq "" || $subject eq "") { &MFPostReplyHTML; }
                    345: 
                    346:   &Log("Post");
                    347: 
                    348:   # find last message in thread
                    349:   opendir(FORUM,"$capadir/$class/discussion/$setid");
                    350:     @dir = sort(readdir(FORUM));
                    351:   closedir(FORUM);
                    352: 
                    353:   $probnum = &AddZero($probnum);
                    354:   $replynum = "000000";
                    355:   foreach $msg(@dir) {
                    356:     if(substr($msg,0,6) eq $probnum) {
                    357:         $replynum = &AddZero(&RemZero(substr($msg,7,6)) + 1);
                    358:     }
                    359:   }
                    360: 
                    361:   $date = substr($RunonDate,0,4) . $yp . substr($RunonDate,4,2);
                    362:   &WriteMsg("$capadir/$class/discussion/$setid/$probnum-$replynum-$date-000000.msg");
                    363: 
                    364:   $probnum = &RemZero($probnum);
                    365:   &PostDoneHTML;
                    366:   exit;
                    367: }
                    368: 
                    369: sub DelMsgPre {
                    370:   &CheckAdmin('kill');
                    371:   &OpenMsg("$capadir/$class/discussion/$setid/$file");
                    372:   &DelMsgPreHTML;
                    373:   exit;
                    374: }
                    375: 
                    376: sub DelMsg {
                    377:   &CheckAdmin('kill');
                    378:   unlink("$capadir/$class/discussion/$setid/$file");
                    379:   &DelMsgDoneHTML;
                    380:   exit;
                    381: }
                    382: 
                    383: sub HideMsgPre {
                    384:   &CheckAdmin('kill');
                    385:   &OpenMsg("$capadir/$class/discussion/$setid/$file");
                    386:   &HideMsgPreHTML;
                    387:   exit;
                    388: }
                    389: 
                    390: sub HideMsg {
                    391:   &CheckAdmin('kill');
                    392:   open(MSG,"$capadir/$class/discussion/$setid/$file");
                    393:     @msg = <MSG>;
                    394:   close(MSG);
                    395: 
                    396:   unlink("$capadir/$class/discussion/$setid/$file");
                    397: 
                    398:   open(MSG,">$capadir/$class/discussion/$setid/$file");
                    399:     for($i=0;$i<=5;$i++) {
                    400:       print MSG "$msg[$i]";
                    401:     }
                    402:     print MSG "hidden|$username|$HyphenDate|$Time|$ENV{'REMOTE_ADDR'}\n";
                    403:   close(MSG);
                    404: 
                    405:   &HideMsgDoneHTML;
                    406: }
                    407: 
                    408: sub UnHideMsgPre {
                    409:   &CheckAdmin('kill');
                    410:   &OpenMsg("$capadir/$class/discussion/$setid/$file");
                    411:   &UnHideMsgPreHTML;
                    412:   exit;
                    413: }
                    414: 
                    415: sub UnHideMsg {
                    416:   &CheckAdmin('kill');
                    417:   open(MSG,"$capadir/$class/discussion/$setid/$file");
                    418:     @msg = <MSG>;
                    419:   close(MSG);
                    420: 
                    421:   unlink("$capadir/$class/discussion/$setid/$file");
                    422: 
                    423:   open(MSG,">$capadir/$class/discussion/$setid/$file");
                    424:     for($i=0;$i<=5;$i++) {
                    425:       print MSG "$msg[$i]";
                    426:     }
                    427:     print MSG "public||||}\n";
                    428:   close(MSG);
                    429: 
                    430:   &UnHideMsgDoneHTML;
                    431: }
                    432: 
                    433: 
                    434: sub TopMsg {
                    435:   &CheckAdmin('kill');
                    436: 
                    437:   $ext = shift(@_);
                    438:   
                    439:   open(MSG,"$capadir/$class/discussion/$setid/$file");
                    440:     @msg = <MSG>;
                    441:   close(MSG);
                    442:   
                    443:   unlink("$capadir/$class/discussion/$setid/$file");
                    444:   
                    445:   ($filename, $extension) = split(/\./,$file);
                    446:   $filename = "$filename-$ext.msg";
                    447:   open(MSG,">$capadir/$class/discussion/$setid/$filename");
                    448:     for($i=0;$i<=6;$i++) {
                    449:       print MSG "$msg[$i]";
                    450:     }
                    451:   close(MSG);
                    452:   
                    453:   if($ext eq "") {
                    454:     $function = "restored to its original position in the thread.";
                    455:   }
                    456:   else {
                    457:     $function = "moved to the top of the thread list.";
                    458:   }
                    459: 
                    460:   &TopMsgDoneHTML;
                    461: }
                    462: 
                    463: ###############################
                    464: ## Administrator Subroutines ##
                    465: ###############################
                    466: 
                    467: sub AdminMain {
                    468:   &CheckAdmin('kill');
                    469:   &AdminMainHTML;
                    470:   exit;
                    471: }
                    472: 
                    473: 
                    474: sub AdminUserSearch {
                    475:   &CheckAdmin('kill');
                    476:   &AdminUserSearchHTML;
                    477:   exit;
                    478: }
                    479: 
                    480: 
                    481: sub AdminUserSearchSubmit {
                    482:   local($sname,$semail,$saction,$sset,$sprob,$sdate,$stime);
                    483:   &CheckAdmin('kill');
                    484: 
                    485:   $query = $form{'usersearch'};
                    486:   open(LOG,"$capadir/$class/discussion/logs/access.log");
                    487:     @log = <LOG>;
                    488:   close(LOG);
                    489: 
                    490:   @linematches = grep /$query/, @log;
                    491:   
                    492:   foreach $line(@linematches) { print $line; }
                    493: 
                    494:   exit;
                    495: }
                    496: 
                    497: ######################
                    498: ## Misc Subroutines ##
                    499: ######################
                    500: 
                    501: sub OpenMsg {
                    502:   local($filename,$statusl);
                    503: 
                    504:   $filename = shift(@_);
                    505:   
                    506:   open (MSG,"$filename");
                    507:     @msg = <MSG>;
                    508:   close(MSG);
                    509: 
                    510:   $poster   = $msg[0];
                    511:   $date     = $msg[1];
                    512:   $time     = $msg[2];
                    513:   $subject  = $msg[3];
                    514:   $email    = $msg[4];
                    515:   $message  = $msg[5];
                    516:   $statusl  = $msg[6];
                    517: 
                    518:   ($status, $hiddenuser, $hiddendate, $hiddentime, $hiddenaddr) = split(/\|/,$statusl);
                    519: }
                    520: 
                    521: sub WriteMsg {
                    522:   local($filename,$message);
                    523: 
                    524:   $filename = shift(@_);
                    525:   # add sr to grab e-mail address of user
                    526: 
                    527:   $message = $form{'message'};
                    528:   $message =~ s/\n\r\n/<p>/g;
                    529:   $message =~ s/\n/<br>/g;
                    530: 
                    531:   # check if posted anonymously
                    532:   if($form{'ANONYMOUS'} eq "yes") {
                    533:     $username = "Anonymous|$username";
                    534:   }
                    535: 
                    536:   open (MSG,">$filename");
                    537:     print MSG "$username\n";
                    538:     print MSG "$HyphenDate\n";
                    539:     print MSG "$Time\n";
                    540:     print MSG "$subject\n";
                    541:     print MSG "$email\n";
                    542:     print MSG "$message\n";
                    543:     print MSG "public||||\n";
                    544:   close(MSG);
                    545: }
                    546: 
                    547: sub GetTeacherInfo {
                    548:   local($capa5dir,$classname,$tdir,@classconf);
                    549: 
                    550:   # open/read class.conf file
                    551:   open (CLASSCONF,"$capabin/class.conf");
                    552:     @classconf = <CLASSCONF>;
                    553:   close(CLASSCONF);
                    554: 
                    555:   $found eq "no";
                    556:   foreach $line(@classconf) {
                    557:     ($classname,$capa5dir,$tdir) = split(/[\t\ ]+/,$line);
                    558: 
                    559:     if($classname eq $class) {
                    560:       $teachdir = $tdir;
                    561:       $capadir  = $capa5dir;
                    562:       $found    = "yes";
                    563:     }
                    564:   }
                    565:   if($found eq "no") { &InvalidVarsHTML; }
                    566:   chop $teachdir;
                    567: }
                    568: 
                    569: sub CheckAdmin {
                    570:   local($asection,@adminsections,$line,@capaconfig,$command,$value,
                    571:         $adminsection,@classl,$course,$coursenum,$section,$stunum,$a);
                    572: 
                    573:   $validadmin = "no";
                    574:   $mode = shift(@_);
                    575: 
                    576:   # open 'capa.config' file (for admin section read)
                    577:   open(CAPACONFIG,"$capadir/$class/capa.config");
                    578:     @capaconfig = <CAPACONFIG>;
                    579:   close(CAPACONFIG);
                    580:   foreach $line(@capaconfig) {
                    581:     chop $line;
                    582:     ($command,$value) = split(/\ =\ /,$line);
                    583:     if($command eq "admin_section") {
                    584:       $adminsection = $value;
                    585:     }
                    586:   }
                    587: 
                    588:   @adminsections = split(/\,/,$adminsection);
                    589: 
                    590:   # open 'classl' file
                    591:   open(CLASSL,"$capadir/$class/classl");
                    592:     @classl = <CLASSL>;
                    593:   close(CLASSL);
                    594: 
                    595:   foreach $line(@classl) {
                    596:     chop $line;
                    597:     ($course,$coursenum,$section,$stunum,$a) = split(/\ +/,$line);
                    598:     $snum =~ tr/a-z/A-Z/;
                    599:     $stunum =~ tr/a-z/A-Z/;
                    600:     $section = &RemZero($section);
                    601:     foreach $asection(@adminsections) {
                    602:       if(&RemZero($section) eq &RemZero($asection) && $stunum eq $snum) {
                    603:         $validadmin = "yes";
                    604:       }
                    605:     }
                    606:   }
                    607:   if($validadmin eq "no" && $mode eq "kill") { &NotAdminHTML; }
                    608: }
                    609: 
                    610: sub ValidateUser {
                    611:   local(@allcapaid,@classl,$line);
                    612: 
                    613:   open (CLASSL,"$capadir/$class/classl");
                    614:     @classl = <CLASSL>;
                    615:   close(CLASSL);
                    616: 
                    617:   $valid = "no";
                    618:   foreach $line(@classl) {
                    619:     if(substr($line,15,8) eq substr($snum,1,8)) {
                    620:       $valid = yes;
                    621:     }
                    622:   }
                    623:   if($valid eq "no") { &InvalidVarsHTML; }
                    624: 
                    625:   # check w/ allcapaid program
                    626:   @allcapaid = `allcapaid -s $setid -e $setid -stu $snum -c $capadir/$class -i`;
                    627: 
                    628:   chop $allcapaid[2];
                    629:   chop $allcapaid[2];
                    630:   if($allcapaid[2] ne $capaid) {
                    631:     if($action ne "newset") { &BadPassHTML; }
                    632:     &NewSet;
                    633:   }
                    634: }
                    635: 
                    636: sub UserInfo {
                    637:   local($line,@classl,$last,$first,$middle);
                    638: 
                    639:   open (CLASSL,"$capadir/$class/classl");
                    640:     @classl = <CLASSL>;
                    641:   close(CLASSL);
                    642: 
                    643:   foreach $line(@classl) {
                    644:     if(substr($line,15,8) eq substr($snum,1,8)) {
                    645:       $username = substr($line,24,36);
                    646:       $email    = substr($line,60,45);
                    647:     }
                    648:   }
                    649:   ($last, $first, $middle) = split(/\ +/,$username);
                    650: 
                    651:   chop $last;
                    652:   $username = "$first $last";
                    653:   $email    =~ s/\ //g;
                    654:   chop $email;
                    655: }
                    656: 
                    657: sub MaxProbs {
                    658:   open (SETRECORD,"$capadir/$class/records/set$setid.db");
                    659:     @setrecord = <SETRECORD>;
                    660:   close(SETRECORD);
                    661:   chop $setrecord[0];
                    662:   return $setrecord[0];
                    663: }
                    664: 
                    665: sub ProblemJumpBox {
                    666:   $pdprob = "<select name=\"PROBNUM\">\n";
                    667:   for($jumpnum=1;$jumpnum<=&MaxProbs;$jumpnum++) {
                    668:     $selected = "";
                    669:     if($jumpnum eq $probnum) { $selected = " selected"; }
                    670:     $pdprob .= "  <option value=$jumpnum$selected>$jumpnum\n";
                    671:   }
                    672:   $pdprob .= "</select>";
                    673: }
                    674: 
                    675: sub SetJumpBox {
                    676:   opendir(DDIR,"$capadir/$class/discussion");
                    677:     @sets = grep(/[0-9]/,sort(readdir(DDIR)));
                    678:   closedir(DDIR);
                    679: 
                    680:   $pdset = "<select name=\"SETID\">\n";
                    681:   foreach $set(@sets) {
                    682:     $selected = "";
                    683:     if($set eq $setid) { $selected = " selected"; }
                    684:     $pdset .= "  <option value=\"$set\"$selected>$set\n";
                    685:   }
                    686:   $pdset .= "</select>";
                    687: }
                    688: 
                    689: sub AddZero {
                    690:   $string = shift(@_);
                    691:   
                    692:   while(length($string) < 6) {
                    693:     $string = "0$string";
                    694:   }
                    695:   return $string;
                    696: }
                    697: 
                    698: sub RemZero {
                    699:   $string = shift(@_);
                    700:   
                    701:   $fc = substr($string,0,1);
                    702:   while($fc eq "0") {
                    703:     $string =~ s/.//;
                    704:     $fc = substr($string,0,1);
                    705:   }
                    706:   return $string;
                    707: }
                    708: 
                    709: sub FormatDate {
                    710:   $string = shift(@_);
                    711:   
                    712:   $month = substr($string,0,2);
                    713:   $day   = substr($string,2,2);
                    714:   $year  = substr($string,4,4);
                    715: 
                    716:   $string = "$month-$day-$year";
                    717: 
                    718:   return $string;
                    719: }
                    720: 
                    721: ####################
                    722: ## Get SubRoutine ##
                    723: ####################
                    724: sub form_info {
                    725:   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
                    726: 
                    727:   # Split the name-value pairs
                    728:   @pairs = split(/&/, $buffer);
                    729: 
                    730:   foreach $pair (@pairs) {
                    731:      ($name, $value) = split(/=/, $pair);
                    732: 
                    733:      # Un-Webify plus signs and %-encoding
                    734:      $value =~ tr/+/ /;
                    735:      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                    736:      $value =~ s/<!--(.|\n)*-->//g;
                    737: 
                    738:      if ($allow_html != 1) {
                    739:         $value =~ s/<([^>]|\n)*>//g;
                    740:      }
                    741:      $form{$name} = $value;
                    742:   }
                    743: }
                    744: 
                    745: ##################
                    746: ## Date/Time sr ##
                    747: ##################
                    748: sub GetDateTime  {
                    749:   ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime (time);
                    750:   $mon++;
                    751: 
                    752:   if ($hour < 12) {
                    753:   $AMPM = "AM";
                    754:   }
                    755: 
                    756:   if ($hour > 12) {
                    757:   $hour = $hour - 12;
                    758:     $AMPM = "PM";
                    759:   }  	
                    760:   if ($hour == 12) {
                    761:     $AMPM = "PM";
                    762:   }  	
                    763: 	
                    764:   if ($hour == 0) {
                    765:     $hour = "12";
                    766:   }
                    767: 
                    768:   $min = sprintf ("%2d", $min);
                    769:   $min =~tr/ /0/;
                    770:   $mon = sprintf ("%2d", $mon);
                    771:   $mon =~tr/ /0/;
                    772:   $mday = sprintf ("%2d", $mday);
                    773:   $mday =~tr/ /0/;
                    774:   $HyphenDate = ("$mon" . "-" . "$mday" . "-" . "$year");
                    775:   $RunonDate = ("$mon$mday$year");
                    776:   $Time = ("$hour" . ":" . "$min" . " " . "$AMPM");
                    777: }
                    778: 
                    779: ########################
                    780: ## Logging Subroutine ##
                    781: ########################
                    782: sub Log {
                    783:   $logmsg = shift(@_);
                    784:   
                    785:   &GetDateTime;
                    786: 
                    787:   &Lock("lock.file");
                    788:   open(LOG,">>$capadir/$class/discussion/logs/access.log");
                    789:     print LOG "$snum|$capaid|$username|$email|$logmsg|$setid|$probnum|$HyphenDate|$Time\n";
                    790:   close(LOG);
                    791:   &Unlock("lock.file");
                    792: }
                    793: 
                    794: ############################
                    795: ## Lock/Unlock Subroutine ##
                    796: ############################
                    797: sub Lock {
                    798:   local ($lockname) = @_;
                    799:   local ($endtime);
                    800:   $endtime = 15;
                    801:   $endtime = time + $endtime;
                    802:   
                    803:   while (-e $lockname && time < $endtime) {
                    804:     open (LOCKFILE, ">$lockname");
                    805:   }
                    806:   
                    807: sub Unlock {
                    808:   local ($lockname) = @_;
                    809:   close (LOCKFILE);
                    810:   unlink ($lockname);
                    811:   }
                    812: }
                    813: 
                    814: 
                    815: ######################
                    816: ## HTML Subroutines ##
                    817: ######################
                    818: 
                    819: ## CapaDiscuss HTML Subroutines
                    820: 
                    821: # capadiscuss_html
                    822: 
                    823: ## end capadiscuss

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>