home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 270.img / FORUM25C.ZIP / DOORS.PAS < prev    next >
Pascal/Delphi Source File  |  1989-02-11  |  9KB  |  374 lines

  1. {$R-,S-,I-,F+,V-,B-,L+ }
  2. {$O+}
  3. {$M 65500,0,0 }
  4.  
  5. unit doors;
  6.  
  7. interface
  8.  
  9. uses gentypes,
  10.      PCBoard,
  11.      modem,configrt,statret,gensubs,subs1,subs2,
  12.      userret,textret,overret1,mainr1,mainr2;
  13.  
  14. procedure doorsmenu;
  15.  
  16. implementation
  17.  
  18. procedure doorsmenu;
  19.  
  20.   function numdoors:integer;
  21.   begin
  22.     numdoors:=filesize (dofile)
  23.   end;
  24.  
  25.   procedure seekdofile (n:integer);
  26.   begin
  27.     seek (dofile,n-1)
  28.   end;
  29.  
  30.   procedure opendofile;
  31.   var i:integer;
  32.   begin
  33.     assign (dofile,'Door');
  34.     reset (dofile);
  35.     if ioresult<>0 then begin
  36.       close (dofile);
  37.       i:=ioresult;
  38.       rewrite (dofile)
  39.     end
  40.   end;
  41.  
  42.   procedure maybemakebatch (fn:lstr);
  43.   var tf:text;
  44.       d:boolean;
  45.   begin
  46.     if not issysop then exit;
  47.     writestr ('Make new batch file '+fn+'? *');
  48.     writeln (^M);
  49.     if not yes then exit;
  50.     assign (tf,fn);
  51.     rewrite (tf);
  52.     if ioresult<>0 then begin
  53.       writeln ('Couldn''t create file!');
  54.       exit
  55.     end;
  56.     writeln ('Enter text, blank line to end.'^M);
  57.     repeat
  58.       writestr ('=> &');
  59.       d:=length(input)=0;
  60.       if not d then writeln (tf,input)
  61.     until d;
  62.     textclose (tf);
  63.     writeln (^M'Batch file created!');
  64.     writelog (10,4,fn)
  65.   end;
  66.  
  67.   procedure getdoorinfo (var d:doorrec);
  68.   var m:message;
  69.   begin
  70.     writeln (^B^M'Enter information about this door:'^M);
  71.     d.info:=editor (m,false)
  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.     assign (outf,'DOOR.BAT');
  215.     rewrite (outf);
  216.     writeln (outf,'TEMPDOOR ',params);
  217.     textclose (outf);
  218.     assign (outf,'TEMPDOOR.BAT');
  219.     rewrite (outf);
  220.     while not eof(batchf) do begin
  221.       readln (batchf,tmp);
  222.       writeln (outf,tmp)
  223.     end;
  224.     if online then bd:=baudrate else bd:=0;
  225.     getdir (0,tmp);
  226.     writeln (outf,'cd '+tmp);
  227.     writeln (outf,'keepup ',unum,' ',bd,' ',ord(parity),' P');
  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.     DefineFiles;
  239.     halt (e_door)
  240.   end;
  241.  
  242.   procedure getinfo;
  243.   var n:integer;
  244.       d:doorrec;
  245.   begin
  246.     n:=getdoornum ('get information on');
  247.     if n=0 then exit;
  248.     seekdofile (n);
  249.     read (dofile,d);
  250.     writeln;
  251.     printtext (d.info)
  252.   end;
  253.  
  254.   procedure changedoor;
  255.   var n:integer;
  256.       d:doorrec;
  257.   begin
  258.     n:=getdoornum ('Change');
  259.     if n=0 then exit;
  260.     seekdofile (n);
  261.     read (dofile,d);
  262.     writeln ('Name: ',d.name);
  263.     writestr ('New name:');
  264.     if length(input)>0 then d.name:=input;
  265.     writeln (^M'Level: ',d.level);
  266.     writestr ('New level:');
  267.     if length(input)>0 then d.level:=valu(input);
  268.     writeln (^M'Batch file name: ',d.batchname);
  269.     writestr ('New batch file name:');
  270.     if length(input)>0 then
  271.       if checkbatchname (input)
  272.         then d.batchname:=doordir+input
  273.         else writeln ('Invalid filename: '^S,input);
  274.     maybemakebatch (d.batchname);
  275.     writeln;
  276.     printtext (d.info);
  277.     writestr (^M'Replace text [y/n]:');
  278.     if yes then
  279.       repeat
  280.         deletetext (d.info);
  281.         getdoorinfo (d);
  282.         if d.info<0 then writeln (^M'You must enter some information.')
  283.       until d.info>=0;
  284.     seekdofile (n);
  285.     write (dofile,d);
  286.     writelog (10,1,d.name)
  287.   end;
  288.  
  289.   procedure deletedoor;
  290.   var n,cnt:integer;
  291.       td,d:doorrec;
  292.       f:file;
  293.   begin
  294.     n:=getdoornum ('delete');
  295.     if n=0 then exit;
  296.     seekdofile (n);
  297.     read (dofile,d);
  298.     writestr ('Delete '+d.name+': Confirm:');
  299.     if not yes then exit;
  300.     writeln ('Deleting...');
  301.     seekdofile (n+1);
  302.     for cnt:=n to filesize(dofile)-1 do begin
  303.       read (dofile,td);
  304.       seekdofile (cnt);
  305.       write (dofile,td)
  306.     end;
  307.     seek (dofile,filesize(dofile)-1);
  308.     truncate (dofile);
  309.     deletetext (d.info);
  310.     writestr (^M'Erase disk file '+d.batchname+'? *');
  311.     if yes then begin
  312.       assign (f,d.batchname);
  313.       erase (f);
  314.       if ioresult<>0 then writeln ('(File not found)')
  315.     end;
  316.     writelog (10,2,d.name)
  317.   end;
  318.  
  319.   procedure sysopdoors;
  320.   var q:integer;
  321.   begin
  322.     if (not remotedoors) and carrier then begin
  323.       writestr ('Sorry, remote door maintenance is not allowed!');
  324.       writestr ('(Please re-configure to change this setting)');
  325.       exit
  326.     end;
  327.     repeat
  328.       q:=menu('Sysop door','SDOORS','QCAD');
  329.       case q of
  330.         2:changedoor;
  331.         3:maybemakedoor;
  332.         4:deletedoor
  333.       end
  334.     until hungupon or (q=1) or (filesize(dofile)=0)
  335.   end;
  336.  
  337. var q:integer;
  338. begin
  339.   if not allowdoors then begin
  340.     writestr ('All doors are locked.');
  341.     if issysop then writestr ('(Please re-configure to change this setting)');
  342.     exit
  343.   end;
  344.   if fromdoor then begin
  345.     fromdoor:=false;
  346.     settimeleft(urec.timetoday);
  347.     if returnto='P' then writestr (^M^M^M'Welcome back to Forum-PC!')
  348.   end;
  349.   cursection:=doorssysop;
  350.   opendofile;
  351.   if numdoors=0 then begin
  352.     writestr ('No doors exist!');
  353.     maybemakedoor;
  354.     if numdoors=0 then begin
  355.       close (dofile);
  356.       exit
  357.     end
  358.   end;
  359.   repeat
  360.     q:=menu('Doors','DOORS','QLOIH%@');
  361.     case q of
  362.       2:listdoors;
  363.       3:opendoor;
  364.       4:getinfo;
  365.       5:help ('Doors.hlp');
  366.       6:sysopdoors
  367.     end
  368.   until hungupon or (q=1) or (filesize(dofile)=0);
  369.   close (dofile)
  370. end;
  371.  
  372. begin
  373. end.
  374.