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

  1. {$R-,S-,I-,D-,V-,B-,N-,L- }
  2. {$O+}
  3.  
  4. unit userret;
  5.  
  6.  
  7. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  8.  
  9. interface
  10.  
  11. uses gentypes,gensubs,subs1,configrt,textret,mailret,DOS;
  12.  
  13. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  14.  
  15.  
  16. Procedure writeurec;
  17. Procedure readurec;
  18. Function validuname (m:mstr):boolean;
  19. Function lookupuname (n:integer):mstr;
  20. Function lookupuser (VAR uname:mstr):integer;
  21. Function adduser (VAR u:userrec):integer;
  22. Procedure delallmail (n:integer);
  23. Procedure deleteuser (n:integer);
  24. Procedure updateuserstats (disconnecting:boolean);
  25. Function postcallratio (VAR u:userrec):real;
  26. Function fitsspecs (VAR u:userrec; VAR us:userspecsrec):boolean;
  27.  
  28.  
  29. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  30.  
  31. implementation
  32.  
  33. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  34.  
  35.  
  36. Procedure writeurec;
  37. begin
  38.   if unum<1 then exit;
  39.   urec.level:=ulvl;
  40.   urec.handle:=unam;
  41.   seek (ufile,unum);
  42.   write (ufile,urec)
  43. end;
  44.  
  45. Procedure readurec;
  46. begin
  47.   seek (ufile,unum);
  48.   read (ufile,urec);
  49.   ulvl:=urec.level;
  50.   unam:=urec.handle
  51. end;
  52.  
  53. Function validuname (m:mstr):boolean;
  54. VAR n:integer;
  55. begin
  56.   if length(m)>0
  57.     then if (m<>'?') and (m[1]<>'#') and (m[1]<>'/') and (m[length(m)]<>'*')
  58.                      and (not match(m,'new')) and (not match(m,'q'))
  59.       then if valu(m)=0
  60.         then validuname:=true
  61.         else begin
  62.           validuname:=false;
  63.           writeln (^B'Invalid user name!')
  64.         end
  65. end;
  66.  
  67. Function lookupuname (n:integer):mstr;
  68. VAR u:userrec;
  69. begin
  70.   if (n<1) or (n>numusers) then u.handle:='* Unknown *' else begin
  71.     seek (ufile,n);
  72.     read (ufile,u)
  73.   end;
  74.   if length(u.handle)=0 then u.handle:='User Disappeared';
  75.   lookupuname:=u.handle;
  76. end;
  77.  
  78. Function lookupuser (VAR uname:mstr):integer;
  79. VAR u:userrec;
  80.     cnt,s:integer;
  81.     wildcarding:boolean;
  82.     k:char;
  83. begin
  84.   lookupuser:=0;
  85.   if length(uname)=0 then exit;
  86.   if uname[1]='/' then exit;
  87.   if uname[1]='#' then delete (uname,1,1);
  88.   wildcarding:=uname[length(uname)]='*';
  89.   if wildcarding then uname[0]:=pred(uname[0]);
  90.   val (uname,cnt,s);
  91.   if (s=0) and (cnt>0) and (cnt<=numusers) then begin
  92.     seek (ufile,cnt);
  93.     read (ufile,u);
  94.     if length (u.handle)>0 then begin
  95.       lookupuser:=cnt;
  96.       uname:=u.handle
  97.     end;
  98.     exit
  99.   end;
  100.   seek (ufile,1);
  101.   for cnt:=1 to numusers do
  102.     begin
  103.       read (ufile,u);
  104.       if wildcarding and (u.handle<>'')
  105.         then if match(copy(u.handle,1,length(uname)),uname)
  106.           then
  107.             begin
  108.               write (^B,u.handle,' (Y/N/X): ');
  109.               repeat
  110.                 read (k);
  111.                 k:=upcase(k)
  112.               until hungupon or (k in ['Y','N','X']);
  113.               writeln (k);
  114.               case upcase(k) of
  115.                 'Y':begin
  116.                       lookupuser:=cnt;
  117.                       uname:=u.handle;
  118.                       exit
  119.                     end;
  120.                  'X':exit
  121.               end
  122.             end
  123.           else
  124.         else if match (u.handle,uname)
  125.           then
  126.             begin
  127.               lookupuser := cnt;
  128.               uname := u.handle;
  129.               exit
  130.             end
  131.     end
  132. end;
  133.  
  134. Function adduser (VAR u:userrec):integer;
  135. VAR un:userrec;
  136.     num,cnt:integer;
  137.     level:integer;
  138.     handle:mstr;
  139.     password:sstr;
  140. label found;
  141. begin
  142.   num:=numusers+1;
  143.   for cnt:=1 to numusers do begin
  144.     seek (ufile,cnt);
  145.     read (ufile,un);
  146.     if length(un.handle)=0 then
  147.       begin
  148.         num:=cnt;
  149.         goto found
  150.       end
  151.   end;
  152.   if num>maxusers then begin
  153.     adduser:=-1;
  154.     exit
  155.   end;
  156.   numusers:=num;
  157.   found:
  158.   handle:=u.handle;
  159.   level:=u.level;
  160.   password:=u.password;
  161.   fillchar (u,sizeof(u),0);
  162.   u.config:=[lowercase,eightycols,linefeeds,postprompts];
  163.   u.udlevel:=defudlevel;
  164.   u.udpoints:=defudpoints;
  165.   u.emailannounce:=-1;
  166.   u.infoform:=-1;
  167.   u.displaylen:=25;
  168.   u.handle:=handle;
  169.   u.level:=level;
  170.   u.password:=password;
  171.   seek (ufile,num);
  172.   write (ufile,u);
  173.   adduser:=num
  174. end;
  175.  
  176. Procedure delallmail (n:integer);
  177. VAR cnt,delled:integer;
  178.     m:mailrec;
  179.     u:userrec;
  180. begin
  181.   cnt:=-1;
  182.   delled:=0;
  183.   repeat
  184.     cnt:=searchmail(cnt,n);
  185.     if cnt>0 then begin
  186.       delmail(cnt);
  187.       cnt:=cnt-1;
  188.       delled:=delled+1
  189.     end
  190.   until cnt=0;
  191.   if delled>0 then writeln (^B'Mail deleted: ',delled);
  192.   writeurec;
  193.   seek (ufile,n);
  194.   read (ufile,u);
  195.   deletetext (u.infoform);
  196.   deletetext (u.emailannounce);
  197.   u.infoform:=-1;
  198.   u.emailannounce:=-1;
  199.   seek (ufile,n);
  200.   write (ufile,u);
  201.   readurec
  202. end;
  203.  
  204. Procedure deleteuser (n:integer);
  205. VAR u:userrec;
  206. begin
  207.   delallmail (n);
  208.   fillchar (u,sizeof(u),0);
  209.   u.infoform:=-1;
  210.   u.emailannounce:=-1;
  211.   seek (ufile,n);
  212.   write (ufile,u)
  213. end;
  214.  
  215. Procedure updateuserstats (disconnecting:boolean);
  216. VAR timeon:integer;
  217. begin
  218.   with urec do begin
  219.     timeon:=timeontoday;
  220.     timetoday:=timetoday-timeon;
  221.     if timetoday<0 then timetoday:=0;
  222.     totaltime:=totaltime+timeon;
  223.     if tempsysop then begin
  224.       ulvl:=regularlevel;
  225.       writeln (usr,'(Disabling temporary sysop powers)');
  226.       writeurec
  227.     end;
  228.     if disconnecting and (numon=1) then begin
  229.       if (ulvl=1) and (level2nd<>0) then ulvl:=level2nd;
  230.       if (udlevel=defudlevel) and (udlevel2nd<>0) then udlevel:=udlevel2nd;
  231.       if (udpoints=defudpoints) and (udpoints2nd<>0)
  232.         then udpoints:=udpoints2nd
  233.     end;
  234.     if not disconnecting then writedataarea
  235.   end;
  236.   writeurec
  237. end;
  238.  
  239. Function postcallratio (VAR u:userrec):real;
  240. begin
  241.   if u.numon=0
  242.     then postcallratio:=0
  243.     else postcallratio:=u.nbu/u.numon
  244. end;
  245.  
  246.  
  247. function fitsspecs (var u:userrec; var us:userspecsrec):boolean;
  248. var days:integer;
  249.     pcr:real;
  250.     thisyear,thismonth,thisday,t:word;
  251.     lastcall:datetime;
  252.  
  253.   function inrange (n,min,max:integer):boolean;
  254.   begin
  255.     inrange:=(n>=min) and (n<=max)
  256.   end;
  257.  
  258. begin
  259.   unpacktime (u.laston,lastcall);
  260.   getdate (thisyear,thismonth,thisday,t);
  261.   days:=(thisyear-lastcall.year)*365+(thismonth-lastcall.month)*30+
  262.         (thisday-lastcall.day);
  263.   pcr:=postcallratio (u);
  264.   fitsspecs:=inrange (u.level,us.minlevel,us.maxlevel) and
  265.              inrange (days,us.minlaston,us.maxlaston) and
  266.              (pcr>=us.minpcr) and (pcr<=us.maxpcr)
  267. end;
  268.  
  269. Begin
  270. End.
  271.