home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / bbs / tpbbs10.ark / TPBS10.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-09-14  |  13.3 KB  |  591 lines

  1. program TPBBS {BBS system in Pascal};
  2.  
  3. label
  4.   loop10,loop;
  5.  
  6. type
  7.   AllStrings=string[80];
  8.   tagline=string[10];
  9.   msgline=string[65];
  10.   username=string[25];
  11.   citystate=string[15];
  12.   password=string[10];
  13.   date=string[8];
  14.   pswd=string[10];
  15.   about=string[25];
  16.   nameto=string[25];
  17.   charset=set of char;
  18.   datetime=string[18];
  19.  
  20.   userlist=record
  21.       name:username;
  22.       address:citystate;
  23.       userpassword:password;
  24.       lastmessage:integer;
  25.       lastdate:datetime;
  26.   end;
  27.  
  28.   stat_list=record
  29.       msgs:integer;
  30.       calls:integer;
  31.       mstart:integer;
  32.       mnum:integer;
  33.   end;
  34.  
  35.   caller_list=record
  36.       caller:username;
  37.       cfrom:citystate;
  38.       cdate:date;
  39.       ctime:date;
  40.   end;
  41.  
  42.   comment_list=record
  43.       comment:msgline;
  44.       end;
  45.  
  46.   summary_list=record
  47.       msgnum:integer;
  48.       person_from:username;
  49.       person_to:nameto;
  50.       subject:about;
  51.       mdate:date;
  52.       mpassword:pswd;
  53.       no_of_lines:integer;
  54.       msg_loc:integer;
  55.   end;
  56.  
  57.   message_list=record
  58.       msgtext:msgline;
  59.   end;
  60.  
  61. const
  62.  
  63. {*************************************************}
  64.  
  65. { User defined options }
  66.  
  67.   system='Osborne TPBBS';     {System name}
  68.   drive1='A:';                {BYE.COM on this drive}
  69.   drive2='A:';                {text,BBS stat files on this drive}
  70.   drive3='A:';                {message system files on this drive}
  71.   ext='';                     {Extension for BBS system files}
  72.   syspass1='BOSACK';          {Immediate system access}
  73.   syspass2='DRAWOH';          {Sysop's password}
  74.   opencpm=false;              {CP/M access open or queried?}
  75.   query='What is the CP/M access code?';
  76.                               {CP/M access question}
  77.   answer='BOSACK';               {CP/M access answer}
  78.   clock=false;                 {Real-time clock/calendar avail.}
  79.  
  80. {*************************************************}
  81.  
  82.   version='TurboPascal BBS v1.0  c1984';
  83.   date1='Original 30 APR 1984';
  84.   alphaset:charset = [' '..'}'];  {Printable chars}
  85.  
  86. var
  87.   summary_file:file of summary_list;
  88.   summary_rec:summary_list;
  89.   user_file:file of userlist;
  90.   user_rec:userlist;
  91.   stat_file:file of stat_list;
  92.   stat_rec:stat_list;
  93.   message_file:file of message_list;
  94.   message_rec:message_list;
  95.   caller_file:file of caller_list;
  96.   caller_rec:caller_list;
  97.   comment_file:file of comment_list;
  98.   comment_rec:comment_list;
  99.   comfile:file;
  100.   chainfile:file;
  101.   f1,f:text;
  102.   laston,temp,temp2,pass1,pass2,city,pword,frtemp,qqstring,bstring,line1,pp,line:allstrings;
  103.   pdate,ptime:string[8];
  104.   save,temp3:msgline;
  105.   filename:string[14];
  106.   messbuff: array[1..15] of msgline;
  107.   msghead: array[1..5] of msgline;
  108.   lastname,firstname,whoto,subto,passto:allstrings;
  109.   mfirst,mlast,message_pointer,rnum,knum,ls,gg,lmsgs,code,message,zz,flag,d,ff,sp,c,a,b,n,bi,bk,i,x,y,z,lento,lc,ln:integer;
  110.   eflag:integer;
  111.   timer:real;
  112.   ok,page,brk,uppercase,xpr,bel,fflag:boolean;
  113.   dd,option,aa: char;
  114.  
  115. procedure get_command; forward;
  116. {$I TPFUNC.INC}
  117. {$I TPMESG.INC}
  118.  
  119. procedure list_stats;
  120. label skip;
  121. begin
  122.   assign(stat_file,drive2+'COUNTERS'+ext);
  123.   reset(stat_file);
  124.   read(stat_file,stat_rec);
  125.   with stat_rec do
  126.   begin
  127.     if flag=4 then
  128.       begin
  129.         seek(stat_file,filepos(stat_file)-1);
  130.         message_pointer:=msgs;
  131.         msgs:=message_pointer;
  132.         calls:=calls+1;
  133.         mfirst:=mstart;
  134.         mlast:=mnum;
  135.         mstart:=mfirst;
  136.         mnum:=mlast;
  137.         write(stat_file,stat_rec);
  138.         goto skip;
  139.       end;
  140.     if ls<>1 then
  141.     begin
  142.       line:='You were last on ='+laston;
  143.       printstring;
  144.       str(lmsgs,temp);
  145.       line:='Last high message='+temp;
  146.       printstring;
  147.       end;
  148.     str(msgs,temp);
  149.     line:='Active # of msgs ='+temp;
  150.     printstring;
  151.     str(calls,temp);
  152.     line:='You are caller # ='+temp;
  153.     printstring;
  154.     str(mnum+1,temp);
  155.     line:='Next msg number  ='+temp;
  156.     printstring;
  157.   end;
  158. skip:close(Stat_file);
  159. end;
  160.  
  161. procedure do_command;
  162. begin
  163. case ff of
  164.  
  165.  1: begin
  166.       uppercase:=not uppercase;
  167.      end;
  168.  
  169.  2: begin
  170.      filename:=drive2+'BULLETIN';
  171.      prnttext;
  172.     end;
  173.  
  174.  3: begin
  175.      eflag:=1;
  176.     end;
  177.  
  178.  4: begin
  179.      filename:=drive2+'WELCOME';
  180.      prnttext;
  181.     end;
  182.  
  183.  5: begin
  184.      goodbye;
  185.     end;
  186.  
  187.  6: begin
  188.      exit_to_cpm;
  189.     end;
  190.  
  191.  7: begin
  192.       prntuser;
  193.      end;
  194.  8: begin
  195.       bel:=not bel;
  196.      end;
  197.  
  198.  9: begin
  199.       xpr:=not xpr;
  200.      end;
  201.  
  202.  10: begin
  203.       filename:=drive2+'OTHERSYS.LST';
  204.       prnttext;
  205.      end;
  206.  
  207.  11: begin
  208.       list_stats;
  209.      end;
  210.  
  211.  12: begin
  212.       filename:=drive2+'TPMENU';
  213.       prnttext;
  214.      end;
  215.  
  216. end;
  217. end;
  218.  
  219. procedure get_command;
  220. label start;
  221. begin
  222.   start:line1:='Function:';
  223.   if not xpr then
  224.     line1:=line1+'A,B,M,W,G,C,U,P,X,O,(? for HELP)';
  225.   line1:=line1+'?';
  226.   n:=1;
  227.   printstring;
  228.   n:=0;
  229.   ff:=0;
  230.   c:=1;
  231.   getstring;
  232.   c:=0;
  233.   if bstring='' then
  234.     goto start;
  235.   ff:=pos(bstring,'ABMWGCUPXOL?');
  236.   if ff=0 then
  237.     begin
  238.       line:='I don'+''''+'t understand '+''''+bstring+''''+', '+firstname+'.';
  239.       printstring;
  240.       printstring;
  241.       save:='';
  242.       goto start;
  243.     end;
  244. end;
  245.  
  246. procedure login;
  247. label loop,logcal,msgchk,match,skip,stop;
  248. begin
  249.   if not clock then
  250.    begin
  251.     line:='Date format example=>05/28/84';
  252.     printstring;
  253.     loop:line1:='Enter today''s date  (MM/DD/YY) =>';
  254.     n:=1;printstring;n:=0;
  255.     getstring;
  256.     if bstring='' then goto loop;
  257.     if length(bstring)<>8 then goto loop;
  258.     if pos('/',bstring)=0 then goto loop;
  259.     pdate:=bstring;
  260.     ptime:=' ';
  261.    end;
  262.   if clock then
  263.    begin
  264.     getdate;
  265.     gettime;
  266.     line:='On at: '+ptime+'  '+pdate;
  267.     printstring;
  268.    end;
  269.   line:='Logging your call to the disk, '+firstname+'....';
  270.   printstring;
  271.  
  272. {Make a new LASTCALR file}
  273. assign(f,drive2+'LASTCALR');
  274. rewrite(f);
  275. temp:=pdate+','+ptime+','+firstname+','+lastname;
  276. writeln(f,temp);
  277. close(f);
  278.  
  279. {Get user info and log his use}
  280.  assign(user_file,drive2+'USER'+ext);
  281.   reset(user_file);
  282.   while not eof(user_file) do
  283.    begin
  284.     read(user_file,user_rec);
  285.     with user_rec do
  286.     begin
  287.       if name=firstname+' '+lastname then
  288.         begin
  289.           seek(user_file,filepos(user_file)-1);
  290.           name:=firstname+' '+lastname;
  291.           address:=city;
  292.           userpassword:=pword;
  293.           laston:=lastdate;
  294.           lastdate:=pdate+'  '+ptime;
  295.           lmsgs:=lastmessage;
  296.           lastmessage:=mlast;
  297.           write(user_file,user_rec);
  298.           goto logcal;
  299.         end;
  300.     end;
  301.    end;
  302.    seek(user_file,filesize(user_file));
  303.    with user_rec do
  304.    begin
  305.      name:=firstname+' '+lastname;
  306.      address:=city;
  307.      userpassword:=pword;
  308.      laston:=lastdate;
  309.      lastdate:=pdate;
  310.      lmsgs:=lastmessage;
  311.      lastmessage:=mlast;
  312.      write(user_file,user_rec);
  313.    end;
  314.  
  315. {Log the caller}
  316. logcal:
  317.   close(user_file);
  318.   assign(caller_file,drive2+'CALLERS'+ext);
  319.   reset(caller_file);
  320.   read(caller_file,caller_rec);
  321.   with caller_rec do
  322.    begin
  323.     bstring:=caller;
  324.     makenum;
  325.     i:=x;
  326.     seek(caller_file,filepos(caller_file)-1);
  327.     x:=x+1;
  328.     str(x,temp);
  329.     caller:=temp;
  330.     write(caller_file,caller_rec);
  331.     seek(caller_file,i);
  332.     caller:=firstname+' '+lastname;
  333.     cfrom:=city;
  334.     cdate:=pdate;
  335.     ctime:=ptime;
  336.     write(caller_file,caller_rec);
  337.    end;
  338.   close(caller_file);
  339.  
  340. {Check for messages}
  341. msgchk:
  342. fflag:=false;
  343. close(user_file);
  344. line:='Checking for messages...';
  345. printstring;
  346. assign(summary_file,drive3+'SUMMARY'+ext);
  347. {$I-}
  348. reset(summary_file);
  349. {$I+}
  350. if ioresult<>0 then goto stop;
  351. while not eof(summary_file) do
  352.  begin
  353.   read(summary_file,summary_rec);
  354.   with summary_rec do
  355.    begin
  356.     if msgnum<>0 then
  357.      begin
  358.       temp:=stupcase(person_to);
  359.       if (firstname='SYSOP') and (pos('SYSOP',temp)<>0) then goto match;
  360.       if temp<>firstname+' '+lastname then goto skip;
  361.       match:
  362.       str(msgnum,temp);
  363.       pad(temp,4);
  364.       line:=temp+': '+mdate+'  From >> '+person_from;
  365.       printstring;
  366.       fflag:=true;
  367.       skip:
  368.      end;
  369.    end;
  370.  end;
  371. writeln;
  372. if fflag then
  373.  begin
  374.   writeln;
  375.   line:='Please Retrieve and Kill these messages.'+chr(7);
  376.   printstring;
  377.  end;
  378. if not fflag then
  379.  begin
  380.   line:='No messages found.';
  381.   printstring;
  382.  end;
  383. writeln;
  384. close(summary_file);
  385.  
  386. stop:
  387. end;
  388.  
  389. procedure newuser;
  390.   label start,stop,passloop;
  391.   begin
  392. start:flag:=1;
  393.     line:='Enter your City and State =>';
  394.     n:=1;
  395.     printstring;
  396.     n:=0;
  397.     getstring;
  398.     city:=bstring;
  399.     line:='You are '+firstname+' '+lastname+' from '+city;
  400.     printstring;
  401.     line:='Is that correct?';n:=1;
  402.     printstring;
  403.     getstring;
  404.     bstring:=copy(bstring,1,1);
  405.     bstring:=stupcase(bstring);
  406.     if bstring<>'Y' then goto start;
  407.     line:='As a new user of '+system+' you must enter';
  408.     printstring;
  409.     line:='a password of 4-10 characters. This is to ensure';
  410.     printstring;
  411.     line:='that no one else uses your name on the system.';
  412.     printstring;
  413.     passloop:
  414.     line:='Please enter YOUR password now =>';
  415.     n:=1;
  416.     printstring;
  417.     n:=0;
  418.     c:=1;getstring;c:=0;
  419.     temp2:=bstring;
  420.     if (length(temp2)<4) or (length(temp2)>10) then
  421.       begin
  422.        line:='Invalid password entered!';
  423.        printstring;
  424.        line:='Please re-enter...';
  425.        goto passloop;
  426.       end;
  427.     writeln(chr(12));
  428.     line:='Now enter it again =>';n:=1;
  429.     printstring;
  430.     n:=0;
  431.     c:=1;getstring;c:=0;
  432.     if bstring<>temp2 then
  433.      begin
  434.       line:='No match. Try again.';
  435.       printstring;
  436.       goto passloop;
  437.      end;
  438.     pword:=bstring;
  439.     filename:=drive2+'NEWUSER';
  440.     prnttext;
  441.     stop:if flag=1 then login;
  442.   end;
  443.  
  444. procedure signon;
  445.   label stop2,stop1,stop,getpassword,badpassword,loop1;
  446.   begin
  447.     firstname:='';save:='';
  448.     loop1:line1:='Enter your FIRST name =>';n:=1;
  449.     printstring;
  450.     bstring:='';n:=1;
  451.     getstring;
  452.     firstname:=StUpCase(bstring);
  453.     if firstname=pass1 then
  454.       getcpm;
  455.     if (length(firstname)<2) or (firstname<'A') then
  456.       goto loop1;
  457.     line:='   And your LAST name =>';n:=1;
  458.     printstring;
  459.     getstring;
  460.     lastname:=StUpCase(bstring);
  461.     if (firstname='SYSOP') and (lastname=pass2) then
  462.       begin
  463.         lastname:='';
  464.         city:='';
  465.         goto stop;
  466.       end;
  467.     if firstname='SYSOP' then goto loop1;
  468.     if (length(lastname)<2) or (lastname<'A') then
  469.       goto loop1;
  470.     line:='Checking user file...';
  471.     printstring;
  472.     assign(user_file,drive2+'USER'+ext);
  473.     reset(user_file);
  474.     while not eof(user_file) do
  475.       begin
  476.         read(user_file,user_rec);
  477.         with user_rec do
  478.           begin
  479.             if name<>firstname+' '+lastname then goto stop1;
  480.             zz:=0;
  481.             getpassword:line1:='Enter your password =>';
  482.             n:=1;
  483.             printstring;
  484.             n:=0;
  485.             c:=1;getstring;c:=0;
  486.             if bstring<>userpassword then
  487.               begin
  488.                 zz:=zz+1;
  489.                 if zz>2 then
  490.                   begin
  491.                     flag:=0;
  492.                     goto badpassword;
  493.                   end;
  494.                 goto getpassword;
  495.               end;{if}
  496.             pword:=bstring;
  497.             city:=address;
  498.           end;{with}
  499.         goto stop;
  500.       stop1:end; {WHILE}
  501.   line:='Are you a new user ?';n:=1;
  502.   printstring;
  503.   getstring;
  504.   bstring:=copy(bstring,1,1);
  505.   bstring:=stupcase(bstring);
  506.   if bstring<>'Y' then
  507.     begin
  508.       line:='OK let'+''''+'s try it again!';
  509.       printstring;
  510.       goto loop1;
  511.     end;
  512.   ls:=1;
  513.   newuser;
  514.   if flag=2 then goto loop1;
  515.   goto stop;
  516.   badpassword:line:='You have only three attempts to get the correct';
  517.   close(user_file);
  518.   printstring;
  519.   line:='password. Since you have not been able to enter the';
  520.   printstring;
  521.   line:='proper password, your call is being terminated.';
  522.   printstring;
  523.   line:='Please try again later.';
  524.   printstring;
  525.   byebye;
  526.   stop:close(user_file);
  527.   if flag=1 then goto stop2;
  528.  
  529. login;
  530. stop2:end;
  531.  
  532.  
  533.  
  534. begin
  535.  
  536.       {KILL CTRL-C}
  537.   if mem[$80]=$FF then goto loop10;
  538.  
  539.   mem[0]:=$CD;
  540.  
  541.       {SET USER PARAMETERS}
  542.   ln:=62;             {Line input length}
  543.   page:=true;         {Paged output option}
  544.   uppercase:=false;   {upper and lowercase on}
  545.   xpr:=false;         {novice mode on}
  546.   bel:=true;          {prompt bell on}
  547.   pass1:=syspass1;
  548.   pass2:=syspass2;
  549.       {GET SYSOP'S PASSWORDS}
  550.   filename:=drive2+'PASSWORD'+ext;
  551.   assign(f,filename);
  552.   {$I-}
  553.   reset(f);
  554.   {$I+}
  555.   if ioresult=0 then  {if no file will skip this routine}
  556.     begin
  557.      readln(f,pass1,pass2);
  558.      close(f);
  559.     end;
  560.  
  561.       {BEGIN COMMUNICATING WITH REMOTE}
  562.   writeln;
  563.   writeln(version);
  564.   writeln;
  565.   writeln(system);
  566.   writeln;
  567.   filename:=drive2+'WELCOME'; {print WELCOME file}
  568.   prnttext;
  569.   flag:=4;
  570.   list_stats;
  571.   flag:=0;
  572.   signon;                     {get user's name,etc}
  573.   list_stats;                 {show status of messages}
  574.   eflag:=0;  
  575.   loop10:
  576.   while eflag=0 do
  577.   begin 
  578.     get_command;              {goto function prompt}
  579.     do_command;               {do that function until}
  580.   end;
  581.   while eflag>0 do
  582.   begin
  583.     get_mcommand;
  584.     do_mcommand;
  585.   end;
  586.   goto loop10;                {user leaves the BBS}
  587.  
  588. end.
  589. eflag>0 do
  590.   begin
  591.