home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / SYSPC22.ZIP / DOORS.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-01-09  |  8.2 KB  |  338 lines

  1. overlay procedure doors;
  2.  
  3.   function numdoors:integer;
  4.   begin
  5.     numdoors:=filesize (dofile)
  6.   end;
  7.  
  8.   procedure seekdofile (n:integer);
  9.   begin
  10.     seek (dofile,n-1)
  11.   end;
  12.  
  13.   procedure opendofile;
  14.   var i:integer;
  15.   begin
  16.     assign (dofile,'Doors');
  17.     reset (dofile);
  18.     if ioresult<>0 then begin
  19.       close (dofile);
  20.       i:=ioresult;
  21.       rewrite (dofile)
  22.     end
  23.   end;
  24.  
  25.   procedure maybemakebatch (fn:lstr);
  26.   var tf:text;
  27.       d:boolean;
  28.   begin
  29.     if not issysop then exit;
  30.     writestr ('Make new batch file '+fn+'? *');
  31.     writeln (^M);
  32.     if not yes then exit;
  33.     assign (tf,fn);
  34.     rewrite (tf);
  35.     if ioresult<>0 then begin
  36.       writeln ('Couldn''t create file!');
  37.       exit
  38.     end;
  39.     writeln ('*> Enter text, blank line to end <*'^M);
  40.     repeat
  41.       writestr ('=> &');
  42.       d:=length(input)=0;
  43.       if not d then writeln (tf,input)
  44.     until d;
  45.     textclose (tf);
  46.     writeln (^M'*> Batch file created! <*');
  47.     writelog (10,4,fn)
  48.   end;
  49.  
  50.   procedure getdoorinfo (var d:doorrec);
  51.   var m:message;
  52.   begin
  53.     writeln (^B^M'Enter information about this door:'^M);
  54.     d.info:=editor (m,false)
  55.   end;
  56.  
  57.   function checkbatchname (var qq):boolean;
  58.   var i:lstr absolute qq;
  59.       p:integer;
  60.   begin
  61.     p:=pos('.',i);
  62.     if p<>0 then i[0]:=chr(p-1);
  63.     i:=i+'.BAT';
  64.     checkbatchname:=validfname(i)
  65.   end;
  66.  
  67.   procedure maybemakedoor;
  68.   var n:integer;
  69.       d:doorrec;
  70.   begin
  71.     if not issysop then exit;
  72.     n:=numdoors+1;
  73.     writestr ('Make new door #'+strr(n)+'? *');
  74.     if not yes then exit;
  75.     writestr (^M'Name:');
  76.     if length(input)=0 then exit;
  77.     d.name:=input;
  78.     writestr ('Access level:');
  79.     if length(input)=0 then exit;
  80.     d.level:=valu(input);
  81.     writestr ('Name/path of batch file:');
  82.     if length(input)=0 then exit;
  83.     if not checkbatchname(input) then begin
  84.       writeln ('Invalid filename: '^S,input);
  85.       exit
  86.     end;
  87.     d.batchname:=input;
  88.     writestr ('Ask user opening door for parameters? *');
  89.     d.getparams:=yes;
  90.     getdoorinfo (d);
  91.     if d.info<0 then exit;
  92.     d.numused:=0;
  93.     seekdofile (n);
  94.     write (dofile,d);
  95.     if not exist (d.batchname) then begin
  96.       writeln (^B'Can''t open batch file ',d.batchname);
  97.       maybemakebatch (d.batchname)
  98.     end;
  99.     writeln (^B^M'Door created!');
  100.     writelog (10,3,d.name)
  101.   end;
  102.  
  103.   function haveaccess (n:integer):boolean;
  104.   var d:doorrec;
  105.   begin
  106.     haveaccess:=false;
  107.     seekdofile (n);
  108.     read (dofile,d);
  109.     if ulvl>=d.level
  110.       then haveaccess:=true
  111.       else reqlevel (d.level)
  112.   end;
  113.  
  114.   procedure listdoors;
  115.   var d:doorrec;
  116.       cnt:integer;
  117.   begin
  118.     writehdr ('Available Doors');
  119.     seekdofile (1);
  120.     writeln ('   [Name]                       [Level] [Times used]');
  121.     for cnt:=1 to numdoors do begin
  122.       read (dofile,d);
  123.       if ulvl>=d.level then begin
  124.         write (cnt:2,'. ');
  125.         tab ('['+d.name+']',30);
  126.         writeln ('[',d.level:3,']',' [',d.numused:5,']');
  127.         if break then exit
  128.       end
  129.     end;
  130.     writeln
  131.   end;
  132.  
  133.   function getdoornum (txt:mstr):integer;
  134.   var g:boolean;
  135.       n:integer;
  136.   begin
  137.     getdoornum:=0;
  138.     g:=false;
  139.     repeat
  140.       writestr ('Door number to '+txt+' [?=list]:');
  141.       writeln;
  142.       if input='?' then listdoors else g:=true
  143.     until g;
  144.     if length(input)=0 then exit;
  145.     n:=valu(input);
  146.     if (n<1) or (n>numdoors)
  147.       then writeln ('*> Door number out of range! <*')
  148.       else if haveaccess(n)
  149.         then getdoornum:=n
  150.   end;
  151.  
  152.  procedure opendoor;
  153.   var n,bd:integer;
  154.       d:doorrec;
  155.       batchf,outf:text;
  156.       q:boolean;
  157.       tmp,params:lstr;
  158.       nigger:text;
  159.       bro:lstr;
  160.   begin
  161.     n:=getdoornum ('open');
  162.     if n=0 then exit;
  163.     seekdofile (n);
  164.     read (dofile,d);
  165.     printtext (d.info);
  166.     params:='';
  167.     writeln (^M'Press [Space to Use]  [X to Abort]');
  168.     if upcase(waitforchar)='X' then exit;
  169.     q:=true;
  170.     repeat
  171.       assign (batchf,d.batchname);
  172.       reset (batchf);
  173.       if ioresult<>0 then begin
  174.         q:=false;
  175.         close (batchf);
  176.         iocode:=ioresult;
  177.         if not issysop
  178.           then
  179.             begin
  180.               fileerror ('Opendoor',d.batchname);
  181.               exit
  182.             end
  183.           else
  184.             begin
  185.               maybemakebatch (d.batchname);
  186.               if not exist (d.batchname) then exit
  187.             end
  188.       end
  189.     until q;
  190.     writeln ('Opening door: [',d.name,']');
  191.  
  192.     d.numused:=d.numused+1;
  193.     updateuserstats;
  194.     seekdofile (n);
  195.     write (dofile,d);
  196.     writeurec;
  197.     writestatus;
  198.     ensureclosed;
  199.     bro:='Pcboard.sys';
  200.     assign (nigger,bro);       { This Ensures Some Pc-Board Compatibility }
  201.     rewrite (nigger);
  202.     if baudrate<1200 then
  203.     writeln (nigger,'          '+strr(baudrate)+' '+urec.handle+'                               ') ELSE
  204.     writeln (nigger,'          '+strr(baudrate)+urec.handle+'                               ');
  205.     textclose(nigger);
  206.     dos_Shell(d.batchname);
  207.     setparam (usecom,baudrate,parity);
  208.   end;
  209.  
  210.   procedure getinfo;
  211.   var n:integer;
  212.       d:doorrec;
  213.   begin
  214.     n:=getdoornum ('get information on');
  215.     if n=0 then exit;
  216.     seekdofile (n);
  217.     read (dofile,d);
  218.     writeln;
  219.     printtext (d.info)
  220.   end;
  221.  
  222.   procedure changedoor;
  223.   var n:integer;
  224.       d:doorrec;
  225.   begin
  226.     n:=getdoornum ('Change');
  227.     if n=0 then exit;
  228.     seekdofile (n);
  229.     read (dofile,d);
  230.     writeln ('Name: ',d.name);
  231.     writestr ('New name:');
  232.     if length(input)>0 then d.name:=input;
  233.     writeln (^M'Level: ',d.level);
  234.     writestr ('New level:');
  235.     if length(input)>0 then d.level:=valu(input);
  236.     writeln (^M'Batch file name: ',d.batchname);
  237.     writestr ('New batch file name:');
  238.     if length(input)>0 then
  239.       if checkbatchname (input)
  240.         then d.batchname:=input
  241.         else writeln ('Invalid filename: '^S,input);
  242.     maybemakebatch (d.batchname);
  243.     writeln;
  244.     printtext (d.info);
  245.     writestr (^M'Replace text [y/n]:');
  246.     if yes then
  247.       repeat
  248.         deletetext (d.info);
  249.         getdoorinfo (d);
  250.         if d.info<0 then writeln (^M'*> You must enter some information <*')
  251.       until d.info>=0;
  252.     seekdofile (n);
  253.     write (dofile,d);
  254.     writelog (10,1,d.name)
  255.   end;
  256.  
  257.   procedure deletedoor;
  258.   var n,cnt:integer;
  259.       td,d:doorrec;
  260.       f:file;
  261.   begin
  262.     n:=getdoornum ('delete');
  263.     if n=0 then exit;
  264.     seekdofile (n);
  265.     read (dofile,d);
  266.     writestr ('Delete '+d.name+': Confirm:');
  267.     if not yes then exit;
  268.     writeln ('Deleting...');
  269.     seekdofile (n+1);
  270.     for cnt:=n to filesize(dofile)-1 do begin
  271.       read (dofile,td);
  272.       seekdofile (cnt);
  273.       write (dofile,td)
  274.     end;
  275.     seek (dofile,filesize(dofile)-1);
  276.     truncate (dofile);
  277.     deletetext (d.info);
  278.     writestr (^M'Erase disk file '+d.batchname+'? *');
  279.     if yes then begin
  280.       assign (f,d.batchname);
  281.       erase (f);
  282.       if ioresult<>0 then writeln ('(File not found)')
  283.     end;
  284.     writelog (10,2,d.name)
  285.   end;
  286.  
  287.   procedure sysopdoors;
  288.   var q:integer;
  289.   begin
  290.     if (not remotedoors) and carrier then begin
  291.       writestr ('Sorry, remote door maintenance is not allowed!');
  292.       writestr ('(Please re-configure to change this setting)');
  293.       exit
  294.     end;
  295.     repeat
  296.       q:=menu('Sysop door','SDOORS','QCAD');
  297.       case q of
  298.         2:changedoor;
  299.         3:maybemakedoor;
  300.         4:deletedoor
  301.       end
  302.     until hungupon or (q=1) or (filesize(dofile)=0)
  303.   end;
  304.  
  305. var q:integer;
  306. begin
  307.   if not allowdoors then begin
  308.     writeln ('*> All doors are locked <*');
  309.     if issysop then writestr ('(Please re-configure to change this setting)');
  310.     exit
  311.   end;
  312.   if fromdoor then begin
  313.     fromdoor:=false;
  314.     writestr (^M^M^M'Welcome back!')
  315.   end;
  316.   cursection:=doorssysop;
  317.   opendofile;
  318.   if numdoors=0 then begin
  319.     writestr ('No doors exist!');
  320.     maybemakedoor;
  321.     if numdoors=0 then begin
  322.       close (dofile);
  323.       exit
  324.     end
  325.   end;
  326.   repeat
  327.     q:=menu('Doors','DOORS','QLOIH%@');
  328.     case q of
  329.       2:listdoors;
  330.       3:opendoor;
  331.       4:getinfo;
  332.       5:;
  333.       6:sysopdoors
  334.     end
  335.   until hungupon or (q=1) or (filesize(dofile)=0);
  336.   close (dofile)
  337. end;
  338.