home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 276.img / FORUM21S.ZIP / USERRET.PAS < prev    next >
Pascal/Delphi Source File  |  1988-02-15  |  6KB  |  263 lines

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