home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 341.img / TCS161S.ZIP / DOORS.PAS < prev    next >
Pascal/Delphi Source File  |  1980-10-22  |  10KB  |  406 lines

  1. {$R-,S-,I-,D-,F+,V-,B-,N-,L+,O+ }
  2. {$M 65500,0,0 }
  3.  
  4. unit doors;
  5.  
  6. interface
  7.  
  8. uses crt,overlay,
  9.      gentypes,modem,configrt,statret,gensubs,subs1,subs2,
  10.      userret,textret,overret1,mainr1,mainr2;
  11.  
  12. procedure doorsmenu;
  13.  
  14. implementation
  15.  
  16. procedure doorsmenu;
  17.  
  18.   function numdoors:integer;
  19.   begin
  20.     numdoors:=filesize (dofile)
  21.   end;
  22.  
  23.   procedure seekdofile (n:integer);
  24.   begin
  25.     seek (dofile,n-1)
  26.   end;
  27.  
  28.   procedure opendofile;
  29.   var i:integer;
  30.   begin
  31.     assign (dofile,'Doors');
  32.     reset (dofile);
  33.     if ioresult<>0 then begin
  34.       close (dofile);
  35.       i:=ioresult;
  36.       rewrite (dofile)
  37.     end
  38.   end;
  39.  
  40.   procedure maybemakebatch (fn:lstr);
  41.   var tf:text;
  42.       d:boolean;
  43.   begin
  44.     if not issysop then exit;
  45.     writestr ('Make new batch file '+fn+'? *');
  46.     writeln (^M);
  47.     if not yes then exit;
  48.     assign (tf,fn);
  49.     rewrite (tf);
  50.     if ioresult<>0 then begin
  51.       writeln ('Couldn''t create file!');
  52.       exit
  53.     end;
  54.     writeln ('Enter text, blank line to end.'^M);
  55.     repeat
  56.       writestr ('=> &');
  57.       d:=length(input)=0;
  58.       if not d then writeln (tf,input)
  59.     until d;
  60.     textclose (tf);
  61.     writeln (^M'Batch file created!');
  62.     writelog (10,4,fn)
  63.   end;
  64.  
  65.   procedure getdoorinfo (var d:doorrec);
  66.   var m:message;
  67.   begin
  68.     writeln (^B^M'Enter some Information about this Door:'^M);
  69.     delay (1000);
  70.     titlestr:='Door Information';
  71.     d.info:=editor (m,false,'Door Information')
  72.   end;
  73.  
  74.   function checkbatchname (var qq):boolean;
  75.   var i:lstr absolute qq;
  76.       p:integer;
  77.   begin
  78.     p:=pos('.',i);
  79.     if p<>0 then i[0]:=chr(p-1);
  80.     i:=i+'.BAT';
  81.     checkbatchname:=validfname(i)
  82.   end;
  83.  
  84.   procedure maybemakedoor;
  85.   var n:integer;
  86.       d:doorrec;
  87.   begin
  88.     if not issysop then exit;
  89.     n:=numdoors+1;
  90.     writestr ('Make new Door #'+strr(n)+'? *');
  91.     if not yes then exit;
  92.     writestr (^M'Name:');
  93.     if length(input)=0 then exit;
  94.     d.name:=input;
  95.     writestr ('Access Level:');
  96.     if length(input)=0 then exit;
  97.     d.level:=valu(input);
  98.     writestr ('Name/path of batch file:');
  99.     if length(input)=0 then exit;
  100.     if not checkbatchname(input) then begin
  101.       writeln ('Invalid filename: '^S,input);
  102.       exit
  103.     end;
  104.     d.batchname:=doordir+input;
  105.     writestr ('Ask user opening door for parameters? *');
  106.     d.getparams:=yes;
  107.     getdoorinfo (d);
  108.     if d.info<0 then exit;
  109.     d.numused:=0;
  110.     seekdofile (n);
  111.     write (dofile,d);
  112.     if not exist (d.batchname) then begin
  113.       writeln (^B'Can''t open batch file ',d.batchname);
  114.       maybemakebatch (d.batchname)
  115.     end;
  116.     writeln (^B^M'Door created!');
  117.     writelog (10,3,d.name)
  118.   end;
  119.  
  120.   function haveaccess (n:integer):boolean;
  121.   var d:doorrec;
  122.   begin
  123.     haveaccess:=false;
  124.     seekdofile (n);
  125.     read (dofile,d);
  126.     if ulvl>=d.level
  127.       then haveaccess:=true
  128.       else writeln ('That Door is locked.')
  129.   end;
  130.  
  131.   procedure listdoors;
  132.   var d:doorrec;
  133.       cnt:integer;
  134.   begin
  135.     writehdr ('Available Doors');
  136.     seekdofile (1);
  137.     writeln ('    Name                         Level  Times used');
  138.     for cnt:=1 to numdoors do begin
  139.       read (dofile,d);
  140.       if ulvl>=d.level then begin
  141.         write (cnt:2,'. ');
  142.         tab (d.name,30);
  143.         writeln (d.level:3,d.numused:5);
  144.         if break then exit
  145.       end
  146.     end;
  147.     writeln
  148.   end;
  149.  
  150.   function getdoornum (txt:mstr):integer;
  151.   var g:boolean;
  152.       n:integer;
  153.   begin
  154.     getdoornum:=0;
  155.     g:=false;
  156.     repeat
  157.       writestr ('Door Number to '+txt+' [?/List]:');
  158.       writeln;
  159.       if input='?' then listdoors else g:=true
  160.     until g;
  161.     if length(input)=0 then exit;
  162.     n:=valu(input);
  163.     if (n<1) or (n>numdoors)
  164.       then writeln ('Door number out of range!')
  165.       else if haveaccess(n)
  166.         then getdoornum:=n
  167.   end;
  168.  
  169.   procedure opendoor;
  170.   var n,bd,p:integer;
  171.       d:doorrec;
  172.       batchf,outf:text;
  173.       q:boolean;
  174.       tmp,params:lstr;
  175.   begin
  176.     n:=getdoornum ('open');
  177.     if n=0 then exit;
  178.     seekdofile (n);
  179.     read (dofile,d);
  180.     printtext (d.info);
  181.     if d.getparams then writestr ('Parameters:') else input:='';
  182.     params:=input;
  183.     p:=pos('>',input);
  184.     if p=0 then p:=pos('<',input);
  185.     if p=0 then p:=pos('|',input);
  186.     if p<>0 then begin
  187.       writestr ('You may not specify pipes in door parameters.');
  188.       exit
  189.     end;
  190.     writestr (^M'Press [Space] to Open the Door, or [X] to Abort');
  191.     if upcase(waitforchar)='X' then exit;
  192.     writeln ('Opening door: ',d.name);
  193.     q:=true;
  194.     repeat
  195.       assign (batchf,d.batchname);
  196.       reset (batchf);
  197.       if ioresult<>0 then begin
  198.         q:=false;
  199.         close (batchf);
  200.         iocode:=ioresult;
  201.         if not issysop
  202.           then
  203.             begin
  204.               fileerror ('Opendoor',d.batchname);
  205.               exit
  206.             end
  207.           else
  208.             begin
  209.               maybemakebatch (d.batchname);
  210.               if not exist (d.batchname) then exit
  211.             end
  212.       end
  213.     until q;
  214.     if online then bd:=baudrate else bd:=0;
  215.     assign (outf,'DOOR.BAT');
  216.     rewrite (outf);
  217.     writeln (outf,'TEMPDOOR ',unum,' ',bd);
  218.     textclose (outf);
  219.     assign (outf,'TEMPDOOR.BAT');
  220.     rewrite (outf);
  221.     while not eof(batchf) do begin
  222.       readln (batchf,tmp);
  223.       writeln (outf,tmp)
  224.     end;
  225.     getdir (0,tmp);
  226.     writeln (outf,'cd '+tmp);
  227.     writeln (outf,'main.bat ',unum,' ',bd,' ',ord(parity),' D');
  228.     textclose (batchf);
  229.     textclose (outf);
  230.     d.numused:=d.numused+1;
  231.     seekdofile (n);
  232.     write (dofile,d);
  233.     writelog (9,1,d.name);
  234.     updateuserstats (false);
  235.     writeurec;
  236.     writestatus;
  237.     ensureclosed;
  238.     halt (e_door)
  239.   end;
  240.  
  241.   procedure getinfo;
  242.   var n:integer;
  243.       d:doorrec;
  244.   begin
  245.     n:=getdoornum ('get information on');
  246.     if n=0 then exit;
  247.     seekdofile (n);
  248.     read (dofile,d);
  249.     writeln;
  250.     printtext (d.info)
  251.   end;
  252.  
  253.   procedure changedoor;
  254.   var n:integer;
  255.       d:doorrec;
  256.   begin
  257.     n:=getdoornum ('Change');
  258.     if n=0 then exit;
  259.     seekdofile (n);
  260.     read (dofile,d);
  261.     writeln ('Name: ',d.name);
  262.     writestr ('New name:');
  263.     if length(input)>0 then d.name:=input;
  264.     writeln (^M'Level: ',d.level);
  265.     writestr ('New level:');
  266.     if length(input)>0 then d.level:=valu(input);
  267.     writeln (^M'Batch file name: ',d.batchname);
  268.     writestr ('New batch file name:');
  269.     if length(input)>0 then
  270.       if checkbatchname (input)
  271.         then d.batchname:=input
  272.         else writeln ('Invalid filename: '^S,input);
  273.     maybemakebatch (d.batchname);
  274.     writeln;
  275.     printtext (d.info);
  276.     writestr (^M'Replace text [y/n]:');
  277.     if yes then
  278.       repeat
  279.         deletetext (d.info);
  280.         getdoorinfo (d);
  281.         if d.info<0 then writeln (^M'You must enter some information.')
  282.       until d.info>=0;
  283.     seekdofile (n);
  284.     write (dofile,d);
  285.     writelog (10,1,d.name)
  286.   end;
  287.  
  288.   procedure deletedoor;
  289.   var n,cnt:integer;
  290.       td,d:doorrec;
  291.       f:file;
  292.   begin
  293.     n:=getdoornum ('Delete');
  294.     if n=0 then exit;
  295.     seekdofile (n);
  296.     read (dofile,d);
  297.     writestr ('Delete '+d.name+' [y/n]:');
  298.     if not yes then exit;
  299.     writeln ('Deleting...');
  300.     seekdofile (n+1);
  301.     for cnt:=n to filesize(dofile)-1 do begin
  302.       read (dofile,td);
  303.       seekdofile (cnt);
  304.       write (dofile,td)
  305.     end;
  306.     seek (dofile,filesize(dofile)-1);
  307.     truncate (dofile);
  308.     deletetext (d.info);
  309.     writestr (^M'Erase disk file '+d.batchname+'? *');
  310.      if yes then begin
  311.       assign (f,d.batchname);
  312.       erase (f);
  313.       if ioresult<>0 then writeln ('(File not found)')
  314.     end;
  315.     writelog (10,2,d.name)
  316.   end;
  317.  
  318.   procedure sysopdoors;
  319.   var q:integer;
  320.   begin
  321.     if (not remotedoors) and carrier then begin
  322.       writestr ('Sorry, remote door maintenance is not allowed!');
  323.       writestr ('(Re-configure to change this setting)');
  324.       exit
  325.     end;
  326.     repeat
  327.       q:=menu('Doors Sysop','DSYSOP','QCAD');
  328.       case q of
  329.         2:changedoor;
  330.         3:maybemakedoor;
  331.         4:deletedoor
  332.       end
  333.     until hungupon or (q=1) or (filesize(dofile)=0)
  334.   end;
  335.  
  336. var q,x1,x2,x3,apex1,apex2:integer;
  337.     y1,y2,y3:real;
  338. begin
  339.   writehdr ('On-Line Doors');
  340.   if not allowdoors then begin
  341.     writestr ('All doors are locked.');
  342.     if issysop then writestr ('(Re-configure to change this setting)');
  343.     exit
  344.   end;
  345.   if fromdoor then begin
  346.     fromdoor:=false;
  347.     if returnto='D' then writestr (^M^M'Welcome back to TCS!');
  348.     settimeleft (urec.timetoday)
  349.   end;
  350.   x1:=urec.nbu;
  351.   x2:=urec.numon;
  352.   if x1<1 then x1:=1;
  353.   if x2<1 then x2:=1;
  354.   y1:=int(x1);
  355.   y2:=int(x2);
  356.   y1:=y1;
  357.   y2:=y2;
  358.   y3:=y1/y2;
  359.   y3:=y3*100;
  360.   x3:=trunc(y3);
  361.   write (^R'Required Post/Call Ratio: ['^S);
  362.   for apex1:=1 to 3-(length(strr(doorpcr))) do write (' ');
  363.   write (strr(doorpcr));
  364.   writeln ('%'^R']');
  365.   write (^R'Your Post/Call Ratio:     ['^S);
  366.   for apex2:=1 to 3-(length(strr(x3))) do write (' ');
  367.   write (strr(x3));
  368.   writeln ('%'^R']');
  369.   writeln;
  370.   write (^R'PCR Status: ['^S);
  371.   if ulvl>=pcrexempt then write ('Exempt from PCR.') else
  372.   if (x3<doorpcr) and (ulvl<pcrexempt) then write ('PCR too low!') else
  373.   if (x3>=doorpcr) and (ulvl<pcrexempt) then write ('Passed PCR check.');
  374.   writeln (^R']');
  375.   writeln;
  376.   if (x3<doorpcr) and (ulvl<pcrexempt) then begin
  377.    writeln (^B^R'Your Posts-per-Call Ratio is too low!');
  378.    writeln ('Go post a message or two.');
  379.    exit;
  380.   end;
  381.   cursection:=doorssysop;
  382.   opendofile;
  383.   if numdoors=0 then begin
  384.     writestr ('No doors exist!');
  385.     maybemakedoor;
  386.     if numdoors=0 then begin
  387.       close (dofile);
  388.       exit
  389.     end
  390.   end;
  391.   repeat
  392.     q:=menu('Doors Command','DOORS','QLOIH%@');
  393.     case q of
  394.       2:listdoors;
  395.       3:opendoor;
  396.       4:getinfo;
  397.       5:help ('Doors.hlp');
  398.       6:sysopdoors
  399.     end
  400.   until hungupon or (q=1) or (filesize(dofile)=0);
  401.   close (dofile)
  402. end;
  403.  
  404. begin
  405. end.
  406.