(*****************************************************************************) (*> <*) (*> SYSOP3 .PAS - Written by Eric Oman <*) (*> <*) (*> SysOp functions: User Editor. <*) (*> <*) (*****************************************************************************) {$A+,B+,E+,F+,I+,L+,N-,O+,R-,S+,V-} unit sysop3; interface uses crt, dos, {rcg11172000 no overlay under Linux.} {overlay,} common; procedure restric_list; procedure uedit1; procedure autoval(var u:userrec; un:integer); procedure showuserinfo(typ,usern:integer; user1:userrec); procedure uedit(usern:integer); implementation uses mail0, misc3, misc4, miscx, cuser; procedure uedit1; begin uedit(usernum); end; procedure restric_list; begin begin nl; sprint(#3#3+'Restrictions:'); nl; lcmds(27,3,'LCan logon ONLY once/day','CCan''t page SysOp'); lcmds(27,3,'VPosts marked unvalidated','Back/downspacing restricted'); lcmds(27,3,'ACan''t add to BBS list','*Can''t post/send anon.'); lcmds(27,3,'PCan''t post at all','ECan''t send email'); lcmds(27,3,'KCan''t vote','MAutomatic mail deletion'); nl; sprint(#3#3+'Special:'); nl; lcmds(27,3,'1No UL/DL ratio check','2No post/call ratio check'); lcmds(27,3,'3No file points check','4Protection from deletion'); nl; end; end; function spflags(u:userrec):astr; var r:uflags; s:astr; begin s:=''; for r:=rlogon to rmsg do if r in u.ac then s:=s+copy('LCVBA*PEKM',ord(r)+1,1) else s:=s+'-'; s:=s+'/'; for r:=fnodlratio to fnodeletion do if r in u.ac then s:=s+copy('1234',ord(r)-19,1) else s:=s+'-'; spflags:=s; end; procedure autoval(var u:userrec; un:integer); begin autovalidate(u,un); print('User Validated.'); end; procedure showuserinfo(typ,usern:integer; user1:userrec); var ii:array[1..12] of astr; i:integer; abort,next:boolean; procedure shi1(var i:integer); var c:char; r:uflags; a,b:integer; begin with user1 do case i of 1:begin ii[1]:=#3#5+mln('User #'+cstr(usern)+' of '+cstr(filesize(uf)-1),19)+#3#1+'Status:'; if (deleted) then ii[1]:=ii[1]+#3#8+'Deleted' else if (trapactivity) and ((usern<>usernum) or (usernum=1)) then if (trapseperate) then ii[1]:=ii[1]+#3#8+'Trapping (seperate)' else ii[1]:=ii[1]+#3#8+'Trapping (common)' else if (lockedout) then ii[1]:=ii[1]+#3#8+'Locked out' else if (alert in ac) then ii[1]:=ii[1]+#3#8+'Alert!' else ii[1]:=ii[1]+#3#3+'Normal'; ii[1]:=mln(ii[1],49)+#3#1+'SL:'+#3#3+mn(sl,3)+#3#1+' DSL:'+#3#3+mn(dsl,3); end; 2:begin ii[2]:='User name:'+#3#3+mln(name,36)+#3#1+' AR:'+#3#3; for c:='A' to 'Z' do if c in ar then ii[2]:=ii[2]+c else ii[2]:=ii[2]+'-'; end; 3:ii[3]:='Real name:'+#3#3+mln(realname,36)+#3#1+' AC:'+#3#3+spflags(user1); 4:ii[4]:='Address :'+#3#3+mln(street,30)+#3#1+' Sex/Age :'+ #3#3+sex+cstr(ageuser(bday))+' ('+bday+')'; 5:ii[5]:='City / State :'+#3#3+mln(citystate,30)+#3#1+' Zip-code:'+#3#3+zipcode; 6:ii[6]:='Computer type:'+#3#3+mln(computer,30)+#3#1+' Phone # :'+#3#3+ph; 7:ii[7]:='SysOp note :'+#3#3+mln(note,35)+#3#1+'Last/1st:'+#3#3+laston+' ('+firston+')'; 8:begin ii[8]:='Occupation :'+#3#3+mln(occupation,35)+#3#1+'Lockfile:'; if lockedout then ii[8]:=ii[8]+#3#7+lockedfile+'.MSG' else ii[8]:=ii[8]+'inactive.'; end; 9:begin ii[9]:='BBS reference:'+#3#3+mln(wherebbs,35)+#3#1+'Password:'+#3#3; if (realsl=255) or ((spd='KB') and (so)) then ii[9]:=ii[9]+mln(pw,20) else ii[9]:=ii[9]+#3#7+'xxxxxxxxxxxxxxxxxxxx'; end; 10:ii[10]:='Call records- TC:'+#3#3+mn(loggedon,7)+#3#1+ ' TT:'+#3#3+mln(cstrl(ttimeon),8)+#3#1+ ' CT:'+#3#3+mn(ontoday,9)+#3#1+ ' TL:'+#3#3+mn(tltoday,6)+#3#1+ ' Tbank:'+#3#3+mn(timebank,6); 11:ii[11]:='Mail records- Pub:'+#3#3+mn(msgpost,6)+#3#1+ ' Priv:'+#3#3+mn(emailsent,6)+#3#1+ ' Fback:'+#3#3+mn(feedback,6)+#3#1+ ' Wait:'+#3#3+mn(waiting,6); 12:ii[12]:='File records- DL:'+#3#3+mln(cstr(downloads)+'-'+cstrl(dk)+'k',19)+#3#1+ ' UL:'+#3#3+mln(cstr(uploads)+'-'+cstrl(uk)+'k',19)+#3#1+ ' Pts:'+#3#3+mn(filepoints,6); end; printacr(ii[i],abort,next); inc(i); end; procedure shi2(var i:integer); begin shi1(i); end; begin abort:=FALSE; i:=1; case typ of 1:while (i<=12) and (not abort) do shi1(i); 2:while (i<=3) and (not abort) do shi2(i); end; end; (* [ Locked out ] [ Alert ] [ Deleted ] [ Normal ] User #1 of 105 Status:Locked out SL:255 DSL:255 User name:123456789012345678901234567890123456 AR:ABCDEFG Real name:123456789012345678901234567890123456 AC:LEKMC*KDJF/1234 Address :123456789012345678901234567890 Sex/Age :Female / xxx City / State :123456789012345678901234567890 Zip-code:xxxxx-xxxx Computer type:123456789012345678901234567890 Phone # :xxx-xxx-xxxx SysOp note :123456789012345678901234567890 Last on :xx/xx/xx Occupation :1234567890123456789012345678901234 Lockfile:xxxxxxxx.MSG BBS reference:1234567890123456789012345678901234 Password:12345678901234567890 Call records> TC:xxxxx TT:xxxxx CT:xxxxx TL:xxxxx Tbank:xxxxx Mail records> Pub:xxxxx Priv:xxxxx Fback:xxxxx Wait:xxxxx File records> DL:xxxxx-xxxxxxxxxxxk UL:xxxxx-xxxxxxxxxxxk Pts:xxxxx User #1 of 105 Status:Locked out SL:255 DSL:255 User name:123456789012345678901234567890123456 AR:ABCDEFGHIJKLMNOPQRSTUVWXYZ Real name:123456789012345678901234567890123456 AC:LEKMC*KDJF-------------- *) procedure uedit(usern:integer); type f_statusflagsrec=(fs_deleted,fs_trapping,fs_chatbuffer, fs_lockedout,fs_alert,fs_slogging); const autolist:boolean=TRUE; userinfotyp:byte=1; f_state:array[0..14] of boolean= (FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE); f_gentext:string[30]=''; f_acs:string[50]=''; f_sl1:word=0; f_sl2:word=255; f_dsl1:word=0; f_dsl2:word=255; f_ar:set of acrq=[]; f_ac:set of uflags=[]; f_status:set of f_statusflagsrec=[]; f_laston1:word=0; f_laston2:word=65535; f_firston1:word=0; f_firston2:word=65535; f_numcalls1:word=0; f_numcalls2:word=65535; f_age1:word=0; f_age2:word=65535; f_gender:char='M'; f_postratio1:word=0; f_postratio2:word=65535; f_dlkratio1:word=0; f_dlkratio2:word=65535; f_dlratio1:word=0; f_dlratio2:word=65535; var user,user1:userrec; r:uflags; f:file; ii,is,s:astr; i,i1,x,oldusern:integer; byt:byte; c:char; save,save1,abort,next:boolean; function unam:astr; begin unam:=caps(user.name)+' #'+cstr(usern); end; function searchtype(i:integer):string; var s:string; begin case i of 0:s:='General text'; 1:s:='Search ACS'; 2:s:='User SL'; 3:s:='User DSL'; 4:s:='User AR flags'; 5:s:='User AC flags'; 6:s:='User status'; 7:s:='Days since last on'; 8:s:='Days since first on'; 9:s:='Number of calls'; 10:s:='User age'; 11:s:='User gender'; 12:s:='# 1/10''s call/post'; 13:s:='#k DL/1k UL'; 14:s:='# DLs/1 UL'; end; searchtype:=s; end; function find_fs:string; var fsf:f_statusflagsrec; s:string; begin s:=''; for fsf:=fs_deleted to fs_slogging do if (fsf in f_status) then case fsf of fs_deleted :s:=s+'deleted,'; fs_trapping :s:=s+'trapping,'; fs_chatbuffer:s:=s+'chat buffering,'; fs_lockedout :s:=s+'locked out,'; fs_alert :s:=s+'alert,'; fs_slogging :s:=s+'sep. SysOp Log,'; end; if (s<>'') then s:=copy(s,1,length(s)-1) else s:='None.'; find_fs:=s; end; procedure pcuropt; var r:uflags; s:string; i:integer; c:char; abort,next:boolean; begin nl; sprint(#3#5+'--(< Search limiting options >)--'); i:=-1; abort:=FALSE; next:=FALSE; while ((i<14) and (not abort) and (not hangup)) do begin inc(i); if (i in [0..9]) then c:=chr(i+48) else case i of 10:c:='A'; 11:c:='G'; 12:c:='P'; 13:c:='K'; 14:c:='N'; end; if (i=1) then cl(3); sprompt(c+'. '+#3#1+mln(searchtype(i),19)+': '); s:=''; if (not f_state[i]) then s:='Inactive!' else begin case i of 0:s:='"'+f_gentext+'"'; 1:s:='"'+f_acs+'"'; 2:s:=cstr(f_sl1)+' SL ... '+cstr(f_sl2)+' SL'; 3:s:=cstr(f_dsl1)+' DSL ... '+cstr(f_dsl2)+' DSL'; 4:for c:='A' to 'Z' do if (c in f_ar) then s:=s+c else s:=s+'-'; 5:begin for r:=rlogon to rmsg do if (r in f_ac) then s:=s+copy('LCVBA*PEKM',ord(r)+1,1) else s:=s+'-'; s:=s+'/'; for r:=fnodlratio to fnodeletion do begin if (r in f_ac) then s:=s+copy('1234',ord(r)-19,1) else s:=s+'-'; end; end; 6:s:=find_fs; 7:s:=cstr(f_laston1)+' days ... '+cstr(f_laston2)+' days'; 8:s:=cstr(f_firston1)+' days ... '+cstr(f_firston2)+' days'; 9:s:=cstr(f_numcalls1)+' calls ... '+cstr(f_numcalls2)+' calls'; 10:s:=cstr(f_age1)+' years ... '+cstr(f_age2)+' years'; 11:s:=aonoff(f_gender='M','Male','Female'); 12:s:=cstr(f_postratio1)+' ... '+cstr(f_postratio2); 13:s:=cstr(f_dlkratio1)+' ... '+cstr(f_dlkratio2); 14:s:=cstr(f_dlratio1)+' ... '+cstr(f_dlratio2); end; cl(3); end; sprint(s); wkey(abort,next); end; nl; end; function okusr(x:integer):boolean; var fsf:f_statusflagsrec; u:userrec; i,j:longint; ok:boolean; function nofindit(s:string):boolean; begin nofindit:=(pos(allcaps(f_gentext),allcaps(s))=0); end; begin with u do begin seek(uf,x); read(uf,u); ok:=TRUE; i:=-1; while ((ok) and (i<14)) do begin inc(i); if (f_state[i]) then case i of 0:if ((nofindit(name)) and (nofindit(realname)) and (nofindit(street)) and (nofindit(citystate)) and (nofindit(zipcode)) and (nofindit(computer)) and (nofindit(ph)) and (nofindit(note)) and (nofindit(occupation)) and (nofindit(wherebbs))) then ok:=FALSE; 1:if (not aacs1(u,x,f_acs)) then ok:=FALSE; 2:if ((slf_sl2)) then ok:=FALSE; 3:if ((dslf_dsl2)) then ok:=FALSE; 4:if (not (ar>=f_ar)) then ok:=FALSE; 5:if (not (ac>=f_ac)) then ok:=FALSE; 6:for fsf:=fs_deleted to fs_slogging do if (fsf in f_status) then case fsf of fs_deleted :if (not deleted) then ok:=FALSE; fs_trapping :if (not trapactivity) then ok:=FALSE; fs_chatbuffer:if (not chatauto) then ok:=FALSE; fs_lockedout :if (not lockedout) then ok:=FALSE; fs_alert :if (not (alert in ac)) then ok:=FALSE; fs_slogging :if (not slogseperate) then ok:=FALSE; end; 7:if ((daynum(laston)>daynum(date)-f_laston1) or (daynum(laston)daynum(date)-f_firston1) or (daynum(firston)f_numcalls2)) then ok:=FALSE; 10:if (((ageuser(bday)f_age2)) and (ageuser(bday)<>0)) then ok:=FALSE; 11:if (sex<>f_gender) then ok:=FALSE; 12:begin j:=msgpost; if (j=0) then j:=1; j:=loggedon div j; if ((jf_postratio2)) then ok:=FALSE; end; 13:begin j:=uk; if (j=0) then j:=1; j:=dk div j; if ((jf_dlkratio2)) then ok:=FALSE; end; 14:begin j:=uploads; if (j=0) then j:=1; j:=downloads div j; if ((jf_dlratio2)) then ok:=FALSE; end; end; end; end; okusr:=ok; end; procedure search(i:integer); var u:userrec; n:integer; c:char; begin n:=usern; repeat inc(usern,i); if (usern<=0) then usern:=filesize(uf)-1; if (usern>=filesize(uf)) then usern:=1; until ((okusr(usern)) or (usern=n)); end; procedure clear_f; var i:integer; begin for i:=0 to 14 do f_state[i]:=FALSE; f_gentext:=''; f_acs:=''; f_sl1:=0; f_sl2:=255; f_dsl1:=0; f_dsl2:=255; f_ar:=[]; f_ac:=[]; f_status:=[]; f_laston1:=0; f_laston2:=65535; f_firston1:=0; f_firston2:=65535; f_numcalls1:=0; f_numcalls2:=65535; f_age1:=0; f_age2:=65535; f_gender:='M'; f_postratio1:=0; f_postratio2:=65535; f_dlkratio1:=0; f_dlkratio2:=65535; f_dlratio1:=0; f_dlratio2:=65535; end; procedure stopt; var fsf:f_statusflagsrec; i,usercount:integer; c,ch:char; done:boolean; s:astr; procedure chbyte(var x:integer); var s:astr; i:integer; begin input(s,3); i:=x; if (s<>'') then i:=value(s); if ((i>=0) and (i<=255)) then x:=i; end; procedure chword(var x:word); var s:astr; w:word; begin input(s,5); if (s<>'') then begin w:=value(s); if ((w>=0) and (w<=65535)) then x:=w; end; end; procedure inp_range(var w1,w2:word; r1,r2:word); begin print('Range: '+cstr(r1)+'..'+cstr(r2)); prt('Lower limit ['+cstr(w1)+'] : '); chword(w1); prt('Upper limit ['+cstr(w2)+'] : '); chword(w2); end; function get_f_ac:string; var r:uflags; s:string; begin for r:=rlogon to rmsg do if (r in f_ac) then s:=s+copy('LCVBA*PEKM',ord(r)+1,1) else s:=s+'-'; s:=s+'/'; for r:=fnodlratio to fnodeletion do begin if (r in f_ac) then s:=s+copy('1234',ord(r)-19,1) else s:=s+'-'; end; get_f_ac:=s; end; begin done:=FALSE; pcuropt; repeat prt('Change (?=help) : '); onek(c,'Q0123456789AGPKN?CLTU'^M); nl; case c of '0'..'9':i:=ord(c)-48; 'A':i:=10; 'G':i:=11; 'P':i:=12; 'K':i:=13; 'N':i:=14; else i:=-1; end; if (i<>-1) then begin sprompt(#3#5+'[> '+#3#0); if (f_state[i]) then sprint(searchtype(i)) else begin f_state[i]:=TRUE; sprint(searchtype(i)+' is now *ON*'); end; { nl;} end; case c of '0':begin print('General text ["'+f_gentext+'"]'); prt(':'); input(s,30); if (s<>'') then f_gentext:=s; end; '1':begin prt('Search ACS ["'+f_acs+'"]'); prt(':'); inputl(s,50); if (s<>'') then f_acs:=s; end; '2':begin prt('Lower limit ['+cstr(f_sl1)+'] : '); chword(f_sl1); prt('Upper limit ['+cstr(f_sl2)+'] : '); chword(f_sl2); end; '3':inp_range(f_dsl1,f_dsl2,0,255); '4':repeat prt('Which AR flag? =Quit : '); onek(ch,^M'ABCDEFGHIJKLMNOPQRSTUVWXYZ'); if (ch<>^M) then if (ch in ['A'..'Z']) then if (ch in f_ar) then f_ar:=f_ar-[ch] else f_ar:=f_ar+[ch]; until ((ch=^M) or (hangup)); '5':begin repeat prt('Restrictions ['+get_f_ac+'] [?]Help [Q]uit :'); onek(c,'Q LCVBA*PEKM1234?'^M); case c of ^M,' ','Q': ; '?':restric_list; else if (tacch(c) in f_ac) then f_ac:=f_ac-[tacch(c)] else f_ac:=f_ac+[tacch(c)]; end; until ((c in [^M,' ','Q']) or (hangup)); end; '6':repeat s:=find_fs; sprint(#3#4+'Current flags: '+#3#3+s); prt('Toggle (?=help) : '); onek(ch,'QACDLST? '^M); if (pos(ch,'ACDLST')<>0) then begin case ch of 'A':fsf:=fs_alert; 'C':fsf:=fs_chatbuffer; 'D':fsf:=fs_deleted; 'L':fsf:=fs_lockedout; 'S':fsf:=fs_slogging; 'T':fsf:=fs_trapping; end; if (fsf in f_status) then f_status:=f_status-[fsf] else f_status:=f_status+[fsf]; end else if (ch='?') then begin nl; lcmds(15,3,'Alert','Chat-buffering'); lcmds(15,3,'Deleted','Locked-out'); lcmds(15,3,'Seperate SysOp logging','Trapping'); nl; end; until ((ch in ['Q',' ',^M]) or (hangup)); '7':inp_range(f_laston1,f_laston2,0,65535); '8':inp_range(f_firston1,f_firston2,0,65535); '9':inp_range(f_numcalls1,f_numcalls2,0,65535); 'A':inp_range(f_age1,f_age2,0,65535); 'G':begin prt('Gender ['+f_gender+'] : '); onek(c,'QMF'^M); nl; if (c in ['F','M']) then f_gender:=c; end; 'P':inp_range(f_postratio1,f_postratio2,0,65535); 'K':inp_range(f_dlkratio1,f_dlkratio2,0,65535); 'N':inp_range(f_dlratio1,f_dlratio2,0,65535); 'C':if pynq('Are you sure? ') then clear_f; ^M,'L':pcuropt; 'T':begin prt('Which? '); onek(ch,'Q0123456789AGPKN'^M); case ch of '0'..'9':i:=ord(ch)-48; 'A':i:=10; 'G':i:=11; 'P':i:=12; 'K':i:=13; 'N':i:=14; else i:=-1; end; if (i<>-1) then begin f_state[i]:=not f_state[i]; sprompt(#3#5+'[> '+#3#0+searchtype(i)+' is now *'); if (f_state[i]) then print('ON*') else print('OFF*'); end; nl; end; 'U':begin abort:=FALSE; usercount:=0; for i:=1 to filesize(uf)-1 do begin if (okusr(i)) then begin seek(uf,i); read(uf,user1); printacr(#3#3+caps(user1.name)+' #'+cstr(i),abort,next); inc(usercount); end; if (abort) then i:=filesize(uf)-1; end; if (not abort) then sprint('@M^7 ** '+#3#5+cstr(usercount)+' Users.@M'); end; 'Q':done:=TRUE; '?':begin sprint(#3#3+'0-9,AGPKN'+#3#1+': Change option'); lcmds(14,3,'List options','Toggle options on/off'); lcmds(14,3,'Clear options','User''s who match'); lcmds(14,3,'Quit',''); nl; end; end; if (pos(c,'C0123456789AGPKN')<>0) then nl; until ((done) or (hangup)); end; procedure killusermail; var u:userrec; pinfo:pinforec; mixr:msgindexrec; i,j:longint; begin savepinfo(pinfo); initbrd(-1); for i:=0 to himsg do begin seek(mixf,i); blockread(mixf,mixr,1); j:=mixr.messagenum; if ((miexist in mixr.msgindexstat) and (j=usern)) then s:=rmail(i); (* begin mixr.msgindexstat:=mixr.msgindexstat-[miexist]; seek(mixf,filepos(mixf)-1); write(mixf,mixr); if ((j>=1) and (j<=filesize(uf)-1)) then begin seek(uf,j); read(uf,u); dec(u.waiting); seek(uf,j); write(uf,u); end; end;*) end; loadpinfo(pinfo); end; procedure killuservotes; var vdata:file of vdatar; vd:vdatar; i:integer; begin assign(vdata,systat.gfilepath+'voting.dat'); {$I-} reset(vdata); {$I+} if (ioresult=0) then begin for i:=1 to filesize(vdata) do if (user.vote[i]>0) then begin seek(vdata,i-1); read(vdata,vd); dec(vd.answ[user.vote[i]].numres); seek(vdata,i-1); write(vdata,vd); user.vote[i]:=0; end; close(vdata); end; end; procedure delusr; var i:integer; begin if (not user.deleted) then begin save:=TRUE; user.deleted:=TRUE; dsr(user.name); sysoplog('* Deleted user: '+caps(user.name)+' #'+cstr(usern)); i:=usernum; usernum:=usern; rsm; usernum:=i; user.waiting:=0; killusermail; killuservotes; end; end; procedure renusr; begin if (user.deleted) then print('Can''t rename deleted users.') else begin nl; prt('Enter new name: '); input(ii,36); if (ii<>'') and (ii[1] in ['A'..'Z','?']) then begin dsr(user.name); isr(ii,usern); user.name:=ii; save:=TRUE; if (usern=usernum) then thisuser.name:=ii; end; end; end; procedure chhflags; var done:boolean; c:char; begin nl; done:=FALSE; repeat prt('Restrictions ['+spflags(user)+'] [?]Help [Q]uit :'); onek(c,'Q LCVBA*PEKM1234?'^M); case c of ^M,' ','Q':done:=TRUE; '?':restric_list; else begin if (c='4') and (not so) then print('You can''t change that!') else begin acch(c,user); save:=TRUE; end; end; end; until (done) or (hangup); save:=TRUE; end; procedure chhsl; begin prt('Enter new SL: '); ini(byt); if (not badini) then begin save:=TRUE; if (byt'') then s:=s+#3#1+'('+#3+chr(c)+c2[1]+#3#1+')'+mln(copy(c2,2,lenn(c2)-1),len-1); if (c3<>'') then s:=s+#3#1+'('+#3+chr(c)+c3[1]+#3#1+')'+copy(c3,2,lenn(c3)-1); printacr(s,abort,next); end; begin reset(uf); if ((usern<1) or (usern>filesize(uf)-1)) then begin close(uf); exit; end; if (usern=usernum) then begin user:=thisuser; seek(uf,usern); write(uf,user); end; seek(uf,usern); read(uf,user); clear_f; oldusern:=0; save:=FALSE; repeat abort:=FALSE; if (autolist) or (usern<>oldusern) or (c=^M) then begin nl; nl; showuserinfo(userinfotyp,usern,user); oldusern:=usern; end; nl; sprompt(#3#5+'Option :'+#3#9); onek(c,'Q?[]={}*^@!ACDEFGIKLMNOPRSTUWYZ$123''#&-_;:\~'^M); case c of '?':begin nl; sprint(#3#5+'User-list command help'); nl; print('Redisplay user'); lcmds3(21,3,';New list mode',':Autolist mode toggle',''); lcmds3(21,3,'[Back one user',']Forward one user','=Ooops (reload old data)'); lcmds3(21,3,'{Search backward','}Search forward','*Auto-validate user'); lcmds3(21,3,'~Trap/chat logging','@Lockout/Unlockout','!Toggle alert status'); lcmds3(21,3,'Address','City and state','DSL'); lcmds3(21,3,'ERestrictions','FAR flags','GSex/Age'); lcmds3(21,3,'IOccupation','KSysOp comments','Laston date'); lcmds3(21,3,'Mailbox','Name or handle','OSearch options'); lcmds3(21,3,'Phone number','Real user name','SL'); lcmds3(21,3,'Type of computer','UGoto user name/#','WBBS reference'); lcmds3(21,3,'YMessage SysOp bases','Zip code','$Password'); lcmds3(21,3,'1Call records','2Mail records','3File records'); lcmds3(21,3,'''User colors','#File points','&Time bank'); lcmds3(21,3,'^Delete/Restore user','-New user answers','_Other Q. answers'); lcmds3(21,3,'\Show SysOp Log','',''); lcmds3(21,3,'Quit editor','',''); pausescr; save:=FALSE; end; '[',']','{','}','U','Q':begin if save then begin seek(uf,usern); write(uf,user); if usern=usernum then thisuser:=user; save:=FALSE; end; case c of '[':begin dec(usern); if (usern<=0) then usern:=filesize(uf)-1; end; ']':begin inc(usern); if (usern>=filesize(uf)) then usern:=1; end; '{':begin nl; prompt('Searching ... '); search(-1); nl; end; '}':begin nl; prompt('Searching ... '); search(1); nl; end; 'U':begin prt('Enter user name, #, or partial search string: '); finduserws(i); if (i>0) then begin seek(uf,i); read(uf,user); usern:=i; end; end; end; seek(uf,usern); read(uf,user); if (usern=usernum) then thisuser:=user; end; '=':if pynq('@M'+#3#7+'Reload old user data? ') then begin seek(uf,usern); read(uf,user); if (usern=usernum) then thisuser:=user; save:=FALSE; sprint(#3#7+'Old data reloaded.'); end; 'O','-','_',';',':','\': begin case c of 'O':stopt; '-':begin readasw(usern,systat.afilepath+'newuser'); pausescr; end; '_':begin nl; prt('Print questionairre file: '); mpl(8); input(s,8); nl; readasw(usern,systat.afilepath+s); pausescr; end; ';':begin nl; prt('(L)ong or (S)hort list mode : '); onek(c,'QSL '^M); case c of 'S':userinfotyp:=2; 'L':userinfotyp:=1; end; end; ':':autolist:=not autolist; '\':begin s:=systat.trappath+'slog'+cstr(usern)+'.log'; printf(s); if (nofile) then print('"'+s+'": file not found.'); pausescr; end; end; end; '*','^','@','!','A','C','D','E','F','G','I','K','L','M', 'N','P','R','S','T','W','Y','Z','$','1','2','3','''','#','&','~': begin if ((thisuser.sl<=user.sl) or (thisuser.dsl<=user.dsl)) and (usernum<>1) and (usernum<>usern) then begin sysoplog('UEDIT: Tried to modify '+ caps(user.name)+' #'+cstr(usern)); print('Access denied.'); end else begin save1:=save; save:=TRUE; case c of '*':begin autoval(user,usern); ssm(abs(usern),^G'You were validated on '+date+' '+time+'.'^G); end; '^':if (user.deleted) then begin print('User is currently deleted.'); nl; if pynq('Restore this user? ') then begin isr(user.name,usern); user.deleted:=FALSE; end else save:=save1; end else if (fnodeletion in user.ac) then begin print('Access denied - This user is protected from deletion.'); sysoplog('* Attempt to delete user: '+caps(user.name)+ ' #'+cstr(usern)); nl; pausescr; save:=save1; end else begin print('User is not currently deleted.'); nl; print('NOTE: If this user is deleted, ALL VOTING RECORDS,'); print('AND ANY EMAIL TO OR FROM THIS USER WILL BE DELETED.'); nl; if pynq('*DELETE* this user? ') then delusr else save:=save1; end; '@':begin nl; user.lockedout:=not user.lockedout; if (user.lockedout) then begin print('User is now LOCKED out.'); nl; print('Each time the user logs on from now on, a text file will'); print('be displayed before connection is terminated.'); nl; prt('Enter lockout filename: '); mpl(8); input(ii,8); if (ii='') then user.lockedout:=FALSE else begin user.lockedfile:=ii; sysoplog('UEDIT: Locked '+unam+' out: Lockfile "'+ii+'"'); end; end; if (not user.lockedout) then print('User is no longer locked out of system.'); nl; pausescr; end; '!':if (alert in user.ac) then user.ac:=user.ac-[alert] else user.ac:=user.ac+[alert]; 'A':cstuff(1,3,user); 'C':cstuff(4,3,user); 'D':chhdsl; 'E':chhflags; 'F':begin nl; repeat prt('Which AR flag? =Quit : '); onek(c,'ABCDEFGHIJKLMNOPQRSTUVWXYZ'^M); if (c<>^M) then if (not (c in thisuser.ar)) and (usernum<>1) then begin sysoplog('UEDIT: Tried to give '+caps(user.name)+ ' #'+cstr(usern)+' AR flag "'+c+'"'); print('Access denied.'^G) end else if (c in ['A'..'Z']) then if (c in user.ar) then user.ar:=user.ar-[c] else user.ar:=user.ar+[c]; until (c=^M) or (hangup); c:=#0; end; 'G':begin cstuff(2,3,user); cstuff(12,3,user); end; 'I':cstuff(6,3,user); 'K':begin nl; print('New SysOp Note: '); prt(':'); mpl(39); inputl(s,39); if (s<>'') then user.note:=s; end; 'L':begin nl; print('New Laston date, in the form MM/DD/YY:'); prt(':'); mpl(8); inputl(s,8); if (s<>'') and (daynum(s)<>0) then user.laston:=s; end; 'M':cstuff(15,3,user); 'N':renusr; 'P':cstuff(8,3,user); 'R':cstuff(10,3,user); 'S':chhsl; 'T':cstuff(5,3,user); 'W':cstuff(13,3,user); 'Y':begin nl; prt('Message base SysOp:'); nl; nl; for i:=1 to 5 do prompt(cstr(i)+') '+cstr(user.boardsysop[i])+' '); nl; print('(-1 is inactive)'); nl; prt('Which number? (1-5) :'); ini(byt); i:=byt; if (not badini) then begin prt('Which message base? (1-'+cstr(numboards)+') :'); ini(byt); if (not badini) then if ((byt>=1) and (byt<=numboards)) or (byt=-1) then user.boardsysop[i]:=byt; end; end; 'Z':cstuff(14,3,user); '$':cstuff(9,3,user); '1'..'3':chrecords(value(c)); '''':cstuff(21,3,user); '#':begin nl; prt('Enter new amount of file points.'); nl; prt(':'); mpl(5); inu(i); if (not badini) then user.filepoints:=i; end; '&':begin nl; prt('Enter new amount of time in time bank.'); nl; prt(':'); mpl(5); inu(i); if (not badini) then user.timebank:=i; end; '~':begin repeat nl; sprint('1. Trapping status: '+ onoff(user.trapactivity, #3#7+onoff(user.trapseperate, 'Trapping to TRAP'+cstr(usern)+'.MSG', 'Trapping to TRAP.MSG'), 'Off')+onoff(systat.globaltrap,#3#8+' ','')); sprint('2. Auto-chat state: '+onoff(user.chatauto, onoff(user.chatseperate, #3#7+'Output to CHAT'+cstr(usern)+'.MSG', #3#7+'Output to CHAT.MSG'),'Off')+ onoff(systat.autochatopen,#3#8+' ','')); sprint('3. SysOp Log state: '+onoff(user.slogseperate, #3#7+'Logging to SLOG'+cstr(usern)+'.LOG', #3#3+'Normal output')); nl; prt('Select (1-3,Q=Quit) : '); onek(c,'Q123'^M); if (c in ['1'..'3']) then begin nl; case c of '1':begin dyny:=user.trapactivity; user.trapactivity:= pynq('Trap user activity? ['+ syn(user.trapactivity)+'] : '); if (user.trapactivity) then begin dyny:=user.trapseperate; user.trapseperate:= pynq('Log to seperate file? ['+ syn(user.trapseperate)+'] : '); end else user.trapseperate:=FALSE; end; '2':begin dyny:=user.chatauto; user.chatauto:= pynq('Auto-chat buffer open? ['+ syn(user.chatauto)+'] : '); if (user.chatauto) then begin dyny:=user.chatseperate; user.chatseperate:= pynq('Seperate buffer file? ['+ syn(user.chatseperate)+'] : '); end else user.chatseperate:=FALSE; end; '3':begin dyny:=user.slogseperate; user.slogseperate:= pynq('Output SysOp Log seperately? ['+ syn(user.slogseperate)+'] : '); end; end; end; until ((not (c in ['1'..'3'])) or (hangup)); c:=#0; end; else save:=save1; end; end; end; end; if (usern=usernum) then thisuser:=user; until (c='Q') or hangup; close(uf); topscr; end; end.