home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Jason Aller Floppy Collection
/
276.img
/
FORUM21S.ZIP
/
CHATSTUF.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1988-02-13
|
11KB
|
437 lines
{$R-,S-,I-,D-,T-,F-,V-,B-,N-,L+ }
{$M 65500,0,0 }
unit chatstuf;
interface
uses crt,
gentypes,gensubs,subs1,userret,flags,mainr1,modem,windows,statret,configrt;
function specialcommand:boolean;
procedure specialseries;
procedure chat (gotospecial:boolean);
implementation
function specialcommand:boolean;
procedure getnewtime;
var q:sstr;
n:integer;
begin
n:=timeleft;
writeln (usr,'The user has ',n,' minutes left.');
write (usr,'New time left for today? ');
readline (q);
if length(q)>0 then begin
urec.timetoday:=urec.timetoday+(valu(q)-n);
writeurec;
writeln ('You have been granted ',timeleft,' minutes for today.')
end
end;
procedure getnewlevel;
var q:sstr;
n:integer;
begin
writeln (usr,'Current level: ',ulvl);
write (usr,'New level [-1 to trash]: ');
readline (q);
if length (q)>0 then begin
n:=valu(q);
ulvl:=n;
urec.level:=n;
writeurec;
writeln ('You have been granted level ',n,' access.');
if n=-1 then writeln ('That means you''ve been thrown off this system.')
end
end;
procedure getnewaccess;
var q,bname:sstr;
bn:integer;
ac:accesstype;
wasopen:boolean;
k:char;
function inputaccess (q:sstr):accesstype;
begin
inputaccess:=invalid;
if length(q)=0 then exit;
case upcase(q[1]) of
'L':inputaccess:=letin;
'B':inputaccess:=bylevel;
'K':inputaccess:=keepout
end
end;
procedure getallaccess;
procedure setallaccess (ac:accesstype);
var cnt:integer;
begin
setalluserflags (urec,ac);
writeln ('Your access to all sub-boards: ',accessstr[ac]);
writeurec
end;
begin
write (usr,'Grant ALL access ([B]y level, [L]et in, [K]eep out, or CR): ');
readline (q);
ac:=inputaccess(q);
if ac<>invalid then setallaccess(ac)
end;
var bd:boardrec;
begin
write (usr,'Which board for which to change access [*=all]: ');
readline (bname);
if length(bname)=0 then exit;
if bname='*' then
begin
getallaccess;
exit
end;
opentempbdfile;
bn:=searchboard(bname);
if bn=-1 then
begin
closetempbdfile;
writeln (usr,'No such board! Press any key..');
k:=bioskey;
exit
end;
writeln (usr,'Board ',bname,'... Current access: ',
accessstr[getuseraccflag(urec,bn)]);
write (usr,'Grant access ([B]y level, [L]et in, [K]eep out, or CR: ');
readline (q);
ac:=inputaccess(q);
if ac=invalid then begin
closetempbdfile;
exit
end;
setuseraccflag (urec,bn,ac);
writeurec;
closetempbdfile;
writeln ('New access for board ',bname,': ',accessstr[ac])
end;
procedure hangupyn;
var q:sstr;
begin
write (usr,'Hang up on him (Y/N)? ');
readline (q);
if length(q)>0 then if upcase(q[1])='Y' then
begin
writeln ('*** System going down *** '^M^M);
hangup;
forcehangup:=true;
specialcommand:=true
end
end;
procedure getnewname;
var m:mstr;
n:integer;
t:string[1];
begin
writeln (usr,'Current name: ',unam);
write (usr,'New name: ');
readline (m);
if length(m)<>0 then begin
if not validuname(m) then begin
writeln (usr,'Invalid name!');
exit
end;
n:=lookupuser(m);
if n<>0 then begin
write (usr,'Name already exists! Are you sure? ');
buflen:=1;
readline (t);
if upcase(t[1])<>'Y' then exit
end;
unam:=m;
urec.handle:=m;
writeurec;
writeln ('Your name is changed to ',unam,'.')
end
end;
procedure getnewpassword;
var m:mstr;
begin
writeln (usr,'Current password: ',urec.password);
write (usr,'New password: ');
readline (m);
if length(m)<>0 then begin
urec.password:=m;
writeurec;
writeln ('Your password has been changed.')
end
end;
procedure getnewud;
var m:mstr;
procedure getnewud1 (var i:integer; q:sstr);
begin
if length(m)>1
then i:=valu(copy(m,2,255))
else begin
writeln (usr,'New file transfer '+q+'? ');
readline (m);
if length(m)=0
then exit
else i:=valu(m)
end;
writeln ('New file transfer ',q,': ',i);
writeurec
end;
begin
writeln (usr,'Current upload L)evel: ',urec.udlevel);
writeln (usr,'Current upload P)oints: ',urec.udpoints);
write (usr,'Enter L, P, or CR for neither: ');
readline (m);
if length(m)>0 then begin
case upcase(m[1]) of
'L':getnewud1 (urec.udlevel,'level');
'P':getnewud1 (urec.udpoints,'points')
end
end
end;
procedure snoopmode;
begin
writeln (usr,'All I/O to the modem is locked.');
modeminlock:=true;
setoutlock (true)
end;
procedure unsnoop;
begin
writeln (usr,'I/O to the modem is re-enabled.');
modeminlock:=false;
setoutlock (false)
end;
procedure gotodos;
begin
writeln ('The sysop has dropped into DOS; please wait...');
window (1,1,80,25);
gotoxy (1,25);
writeln (usr,^M^J^J^J);
updateuserstats (false);
writereturnbat;
ensureclosed;
halt (4)
end;
procedure getsysopaccess;
const sysopstr:array [false..true] of string[6]=('Normal','Sysop');
sectionnames:array [udsysop..databasesysop] of string[20]=
('File transfer','Bulletin section','Voting booths',
'E-mail section','Doors','Main menu','Databases');
var cnt:configtype;
x:string[10];
n,mx:integer;
v:boolean;
begin
repeat
clrscr;
mx:=1;
for cnt:=udsysop to databasesysop do begin
write (usr,mx:3,'. ',sectionnames[cnt]);
mx:=mx+1;
gotoxy (25,wherey);
writeln (usr,sysopstr[cnt in urec.config])
end;
write (usr,^M^J'Number to toggle [CR to exit]: ');
buflen:=1;
readline (x);
n:=valu(x);
v:=(n>0) and (n<mx);
if v then begin
cnt:=configtype(ord(udsysop)+n-1);
if cnt in urec.config
then
begin
urec.config:=urec.config-[cnt];
x:='denied'
end
else
begin
urec.config:=urec.config+[cnt];
x:='granted'
end;
writeln ('You have been ',x,' sysop priveleges for the ',
sectionnames[cnt],'.')
end
until not v;
writeurec
end;
var scom:sstr;
k:char;
begin
writeln (^B^M'One moment please...');
splitscreen (12);
top;
clrscr;
specialcommand:=false;
writeln (usr,'Special commands:');
writeln (usr,'N)ame, P)assword, L)evel, T)ime left, B)oard access, H)ang up, U)UD section,');
writeln (usr,'Y)Sysop access, S)noop, Z)unsnoop, D)OS, Q)uit');
write (usr,'---> ');
readline (scom);
clearbreak;
k:=' ';
if length(scom)>0 then begin
k:=upcase(scom[1]);
case k of
'L':getnewlevel;
'B':getnewaccess;
'H':hangupyn;
'N':getnewname;
'P':getnewpassword;
'L':getnewlevel;
'T':getnewtime;
'U':getnewud;
'S':snoopmode;
'Z':unsnoop;
'Y':getsysopaccess;
'D':gotodos;
end
end;
bottomline;
specialcommand:=k in ['Q','S','Z'];
unsplit
end;
procedure specialseries;
begin
repeat until specialcommand
end;
procedure chat (gotospecial:boolean);
var k:char;
cnt,displaywid:integer;
quit,carrierloss,fromkbd:boolean;
linebuffer:lstr;
l:byte absolute linebuffer;
curcolor:byte;
procedure instruct;
begin
splitscreen (3);
top;
clrscr;
write (usr,'Now in chat mode. Press <F1> to leave or <F2> for commands.');
bottom
end;
procedure wordwrap;
var cnt,wl:integer;
ww:lstr;
begin
ww:='';
cnt:=displaywid;
while (cnt>0) and (linebuffer[cnt]<>' ') do cnt:=cnt-1;
if cnt=0 then ww:=k else begin
ww:=copy(linebuffer,cnt+1,255);
wl:=length(ww)-1;
if wl>0 then begin
for cnt:=1 to wl do write (^H);
for cnt:=1 to wl do write (' ')
end
end;
writeln;
ansicolor (curcolor);
write (ww);
linebuffer:=ww
end;
procedure typedchar (k:char);
var ec:byte;
begin
l:=l+1;
linebuffer[l]:=k;
if fromkbd then ec:=urec.regularcolor else ec:=urec.inputcolor;
if curcolor<>ec then begin
curcolor:=ec;
ansicolor (curcolor)
end;
if l=displaywid then wordwrap else write(k)
end;
begin
carrierloss:=false;
chatmode:=false;
writeln (^B^M);
if wanted in urec.config then begin
specialmsg ('(No longer wanted)');
urec.config:=urec.config-[wanted];
writeurec;
end;
if eightycols in urec.config then displaywid:=80 else displaywid:=40;
if length(chatreason)>0 then specialmsg ('(Chat reason: '+chatreason+')');
chatreason:='';
if gotospecial then begin
specialseries;
exit
end;
clearbreak;
nobreak:=true;
writeln (^M^M,sysopname,' is here.'^M);
instruct;
quit:=false;
l:=0;
curcolor:=urec.regularcolor;
repeat
linecount:=0;
if (not carrierloss) and (not carrier) then begin
carrierloss:=true;
writeln (^M'No one''s here to chat with!'^M)
end;
repeat until keyhit or (carrier and (numchars>0));
fromkbd:=keyhit;
ingetstr:=true;
read (directin,k);
if k=#127 then k:=#8;
if requestchat
then if requestcom
then
begin
quit:=specialcommand;
if not quit then instruct;
clearbreak;
nobreak:=true;
l:=0
end
else
begin
unsplit;
quit:=true
end;
case ord(k) of
8:if l>0 then begin
write (k+' '+k);
l:=l-1
end;
0:;
13:begin
writeln;
bottomline;
l:=0
end;
32..126:typedchar (k);
1..31:if fromkbd and carrier then sendchar(k)
end
until quit;
clearbreak
end;
begin
end.