home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / SYSOPF.C < prev    next >
Text File  |  1992-01-14  |  16KB  |  678 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21.  
  22.  
  23. void isr1(int un, char *name)
  24. {
  25.   int cp,i;
  26.   char s[81];
  27.   smalrec sr;
  28.  
  29.   cp=0;
  30.   while ((cp<status.users) && (strcmp(name,(smallist[cp].name))>0))
  31.     ++cp;
  32.   memmove(&(smallist[cp+1]),&(smallist[cp]),sizeof(smalrec)*(status.users-cp));
  33.   strcpy(sr.name,name);
  34.   sr.number=un;
  35.   smallist[cp]=sr;
  36.   ++status.users;
  37. }
  38.  
  39.  
  40.  
  41. void reset_files()
  42. {
  43.   int i,i1;
  44.   userrec u;
  45.   char s[81];
  46.  
  47.   status.users=0;
  48.  
  49.   read_user(1,&u);
  50.   i1=number_userrecs();
  51.   for (i=1; i<=i1; i++) {
  52.     read_user(i,&u);
  53.     if ((u.inact & inact_deleted)==0)
  54.       isr1(i,u.name);
  55.     if ((i % 10)==0) {
  56.       itoa(i,s,10);
  57.       pl(s);
  58.     }
  59.   }
  60.  
  61.   sprintf(s,"%sNAMES.LST",syscfg.datadir);
  62.   i=open(s,O_RDWR | O_BINARY | O_TRUNC);
  63.   if (i<0) {
  64.     printf("%s NOT FOUND.\n",s);
  65.     abort();
  66.   }
  67.   write(i,(void *) (smallist), (sizeof(smalrec) * status.users));
  68.   close(i);
  69.  
  70.   save_status();
  71.   close_user();
  72. }
  73.  
  74.  
  75. void check_top()
  76. {
  77.   FILE *tpusers;
  78.   int count,count2,count3,count4,number,true;
  79.   char topnames[5][10][30],title[55];
  80.   long topk[5][10],cur;
  81.   userrec u;
  82.  
  83.   for(count=0;count<=4;count++)
  84.   {
  85.      for(count2=0;count2<=9;count2++)
  86.      {
  87.     strcpy(topnames[count][count2],"7>1NOBODY7<");
  88.     topk[count][count2]=0;
  89.      }
  90.   }
  91.  
  92.   number=(int)(filelength(userfile)/sizeof(userrec))-1;
  93.  
  94.   for(count=2;count<=number;count++)
  95.   {
  96.       read_user(count,&u);
  97.       if(!((u.inact) & inact_deleted))
  98.       {
  99.         for(count2=0;count2<=4;count2++)
  100.         {
  101.            switch(count2)
  102.            {
  103.                case 0:
  104.                cur=u.uk;
  105.                break;
  106.  
  107.                case 1:
  108.                cur=u.dk;
  109.                break;
  110.  
  111.                case 2:
  112.                cur=u.logons;
  113.                break;
  114.  
  115.                case 3:
  116.                cur=u.msgpost;
  117.                break;
  118.  
  119.                case 4:
  120.                if(u.dk!=0)
  121.                cur=((float) u.uk)/((float) u.dk);
  122.                if(cur>=100) cur=99.998;
  123.                break;
  124.  
  125.            }
  126.            true=0;
  127.            for(count3=9;((count3>=0) && (true==0));count3--)
  128.            {
  129.                 if(cur>topk[count2][count3])
  130.                 {
  131.                    for(count4=0;(count4<count3);count4++)
  132.                    {
  133.                    topk[count2][count4]=topk[count2][count4+1];
  134.                   
  135.            strcpy(topnames[count2][count4],topnames[count2][count4+1]);
  136.            }
  137.          topk[count2][count3]=cur;
  138.          if(strcmp(thisuser.name,u.name)==0)
  139.          {
  140.  
  141.             strcpy(topnames[count2][count3],"\x1b[1;31m");
  142.             strcat(topnames[count2][count3],u.name);
  143.             strcat(topnames[count2][count3],"\x1b[1;36m");
  144.          }
  145.          else
  146.          strcpy(topnames[count2][count3],u.name);
  147.          true=1;
  148.         }
  149.        }
  150.      }
  151.      close_user();
  152.     }
  153.       }
  154.       tpusers=fopen("GFILES\\TEXT\\TOPUSERS.MSG","w"); /* <----*/
  155.       fprintf(tpusers,"2The Devil's Doorknob Top Ten User List.\n");/* Put your own name! */
  156.       fprintf(tpusers,"\n");
  157.  
  158.       for(count=0;count<=4;count++)
  159.       {
  160.         switch(count) {
  161.  
  162.         case 0:
  163.     strcpy(title,"3Most Upload k\n\n");
  164.     break;
  165.  
  166.         case 1:
  167.     strcpy(title,"3Most Download k\n\n");
  168.     break;
  169.  
  170.         case 2:
  171.     strcpy(title,"3Most Logons\n\n");
  172.     break;
  173.  
  174.         case 3:
  175.     strcpy(title,"3Most Posts\n\n");
  176.     break;
  177.  
  178.         case 4:
  179.     strcpy(title,"3Best U/D Ratio\n\n");
  180.     break;
  181.  
  182.         }
  183.  
  184.         fprintf(tpusers,title);
  185.         for(count2=9;count2>=0;count2--)
  186.         {
  187.       fprintf(tpusers,"1%s",topnames[count][count2]);
  188.          
  189.       for(count3=0;count3<(50-strlen(topnames[count][count2]));count3++)
  190.       {
  191.         fprintf(tpusers,"7.");
  192.       }
  193.       if(strchr(topnames[count][count2],'[')!=NULL)
  194.       {
  195.         for(count4=0;count4<11;count4++)
  196.          fprintf(tpusers,"7.");
  197.       }
  198.       fprintf(tpusers,"3%d",topk[count][count2]);
  199.       fprintf(tpusers,"\n");
  200.       }
  201.     fprintf(tpusers,"\n");
  202.       }
  203.       fclose(tpusers);
  204. }
  205.  
  206.  
  207. void get_status()
  208. {
  209.   char s[81];
  210.   int statusfile;
  211.  
  212.   sprintf(s,"%sSTATUS.DAT",syscfg.datadir);
  213.   statusfile=open(s,O_RDWR | O_BINARY);
  214.   if (statusfile>=0) {
  215.     read(statusfile,(void *)(&status), sizeof(statusrec));
  216.     close(statusfile);
  217.   } else
  218.     save_status();
  219. }
  220.  
  221.  
  222.  
  223.  
  224. void prstatus()
  225. {
  226.   int i;
  227.   long l;
  228.  
  229.   outchr(12);
  230.   npr("New User Pass   : %s\r\n",syscfg.newuserpw);
  231.   npr("Board is        : %s\r\n",syscfg.closedsystem?"Closed":"Open");
  232.   npr("Number Users    : %d\r\n",status.users);
  233.   npr("Number Calls    : %ld\r\n",status.callernum1);
  234.   npr("Last Date       : %s\r\n",status.date1);
  235.   npr("Time            : %s\r\n",times());
  236.   npr("Active Today    : %d\r\n",status.activetoday);
  237.   npr("Calls Today     : %d\r\n",status.callstoday);
  238.   npr("M Posted Today  : %d\r\n",status.msgposttoday);
  239.   npr("E Sent Today    : %d\r\n",status.emailtoday);
  240.   npr("F Sent Today    : %d\r\n",status.fbacktoday);
  241.   npr("Uploads Today   : %d\r\n",status.uptoday);
  242.   npr("Feedback Waiting: %d\r\n",fwaiting);
  243.   i=3;
  244.   l=(long) freek(3);
  245.   while ((l>0) && ((i+'@')<=cdir[0])) {
  246.     npr("%c: Free Space   : %ldk\r\n",i+'@',l);
  247.     i++;
  248.     if ((i+'@')<=cdir[0])
  249.       l=(long) freek(i);
  250.   }
  251.   npr("Sysop           : %s7Watching\r\n",sysop2()?"":"6NOT ");
  252. }
  253.  
  254. void valuser(int un)
  255. {
  256.   userrec u;
  257.   char s[81],s1[81],s2[81],s3[81],ar1[20],dar1[20],ch1;
  258.   int i,i1,ar2,dar2;
  259.  
  260.   read_user(un,&u);
  261.   if ((u.inact & inact_deleted)==0) {
  262.     nl();
  263.     npr("Name: %s\r\n",nam(&u,un));
  264.     npr("RN  : %s\r\n",(u.realname));
  265.     npr("PH  : %s\r\n",(u.phone));
  266.     npr("Age : %d %c\r\n", u.age, u.sex);
  267.     npr("Comp: %s\r\n",&(ctypes[u.comp_type][0]));
  268.     if (u.note[0])
  269.       npr("Note: %s\r\n",u.note);
  270.     nl();
  271.     npr("SL  : %d\r\n",u.sl);
  272.     if ((u.sl!=255) && (u.sl<actsl)) {
  273.       outstr("New ? ");
  274.       input(s,3);
  275.       if (s[0]) {
  276.         i=atoi(s);
  277.         if ((!wfc) && (i>=actsl))
  278.           i=-2;
  279.         if ((i>=0) && (i<255))
  280.           u.sl=i;
  281.     if (i==-1) {
  282.       nl();
  283.       prt(5,"Delete? ");
  284.       if (yn()) {
  285.             deluser(un);
  286.         nl();
  287.         pl("Deleted.");
  288.         nl();
  289.       } else {
  290.         nl();
  291.         pl("NOT deleted.");
  292.       }
  293.       return;
  294.     }
  295.       }
  296.     }
  297.     nl();
  298.     npr("DSL : %d\r\n",u.dsl);
  299.     if ((u.dsl!=255) && (u.dsl<thisuser.dsl)) {
  300.       outstr("New ? ");
  301.       input(s,3);
  302.       if (s[0]) {
  303.         i=atoi(s);
  304.         if ((!wfc) && (i>=thisuser.dsl))
  305.           i=-1;
  306.         if ((i>=0) && (i<255))
  307.           u.dsl=i;
  308.       }
  309.     }
  310.     strcpy(s3,restrict_string);
  311.     ar2=1;
  312.     dar2=1;
  313.     ar1[0]=13;
  314.     dar1[0]=13;
  315.     for (i=0; i<=15; i++) {
  316.       if (u.ar & (1 << i))
  317.         s[i]='A'+i;
  318.       else
  319.         s[i]=32;
  320.       if (thisuser.ar & (1 << i))
  321.         ar1[ar2++]='A'+i;
  322.       if (u.dar & (1 << i))
  323.         s1[i]='A'+i;
  324.       else
  325.         s1[i]=32;
  326.       if (thisuser.dar & (1 << i))
  327.         dar1[dar2++]='A'+i;
  328.       if (u.restrict & (1 << i))
  329.         s2[i]=s3[i];
  330.       else
  331.         s2[i]=32;
  332.     }
  333.     s[16]=0;
  334.     s1[16]=0;
  335.     s2[16]=0;
  336.     ar1[ar2]=0;
  337.     dar1[dar2]=0;
  338.     nl();
  339.     ch1=0;
  340.     if (ar2>1)
  341.       do {
  342.         npr("AR  : %s\r\n",s);
  343.         prt(2,"Togl? ");
  344.         ch1=onek(ar1);
  345.         if (ch1!=13) {
  346.           ch1-='A';
  347.           if (s[ch1]==32)
  348.             s[ch1]=ch1+'A';
  349.           else
  350.             s[ch1]=32;
  351.           u.ar ^= (1 << ch1);
  352.           ch1=0;
  353.         }
  354.       } while ((!hangup) && (ch1!=13));
  355.     nl();
  356.     ch1=0;
  357.     if (dar2>1)
  358.       do {
  359.         npr("DAR : %s\r\n",s1);
  360.         prt(2,"Togl? ");
  361.         ch1=onek(dar1);
  362.         if (ch1!=13) {
  363.           ch1-='A';
  364.           if (s1[ch1]==32)
  365.             s1[ch1]=ch1+'A';
  366.           else
  367.             s1[ch1]=32;
  368.           u.dar ^= (1 << ch1);
  369.           ch1=0;
  370.         }
  371.       } while ((!hangup) && (ch1!=13));
  372.     nl();
  373.     ch1=0;
  374.     s[0]=13;
  375.     s[1]='?';
  376.     strcpy(&(s[2]),restrict_string);
  377.     do {
  378.       npr("      %s\r\n",s3);
  379.       npr("Rstr: %s\r\n",s2);
  380.       prt(2,"Togl? ");
  381.       ch1=onek(s);
  382.       if ((ch1!=13) && (ch1!=32) && (ch1!='?')) {
  383.         i=-1;
  384.         for (i1=0; i1<16; i1++)
  385.           if (ch1==s[i1+2])
  386.             i=i1;
  387.         if (i>-1) {
  388.           u.restrict ^= (1 << i);
  389.           if (s2[i]==32)
  390.             s2[i]=s3[i];
  391.           else
  392.             s2[i]=32;
  393.         }
  394.         ch1=0;
  395.       }
  396.       if (ch1=='?') {
  397.         ch1=0;
  398.         printmenu(10);
  399.       }
  400.     } while ((!hangup) && (ch1==0));
  401.     write_user(un,&u);
  402.     close_user();
  403.     nl();
  404.   } else {
  405.     nl();
  406.     pl("No Such User.");
  407.     nl();
  408.   }
  409. }
  410.  
  411.  
  412. void print_net_listing(unsigned int ss)
  413. {
  414.   int i,i1,i2,abort,f;
  415.   char s[161],ch;
  416.   net_system_list_rec csne;
  417.  
  418.   ss = ss%10000;
  419.  
  420.   abort=0;
  421.   nl();
  422.   pla(" 3Node  Phone         Name                                     Hop  Next Grp",&abort);
  423.   pla("7══════════════════════════════════════════════════════════════════════════",&abort);
  424.   sprintf(s,"%sBBSDATA.NET",syscfg.datadir);
  425.   f=open(s,O_RDONLY | O_BINARY);
  426.   for (i=0; (i<num_sys_list) && (!abort); i++) {
  427.     read(f,&csne,sizeof(net_system_list_rec));
  428.     if ((csne.forsys!=65535) && ((csne.sysnum%10000)>=ss)){
  429.       if (csne.other & other_net_coord)
  430.         ch='&';
  431.       else if (csne.other & other_group_coord)
  432.         ch='%';
  433.       else if (csne.other & other_coordinator)
  434.         ch='^';
  435.       else
  436.         ch=' ';
  437.       sprintf(s,"%5d%c %12s  %-40s %3d %5d %3d",
  438.         csne.sysnum,ch,csne.phone,csne.name,csne.numhops,
  439.         csne.forsys, csne.group);
  440.       pla(s,&abort);
  441.       ss=0;
  442.     }
  443.   }
  444.   close(f);
  445. }
  446.  
  447.  
  448. void read_new_stuff()
  449. {
  450.   int i;
  451.   char s[81];
  452.  
  453.   if (ncn!=NULL)
  454.     farfree(ncn);
  455.   if (cnn!=NULL)
  456.     farfree(cnn);
  457.   if (csn!=NULL)
  458.     farfree((void far *) csn);
  459.   if (con!=NULL)
  460.     farfree(con);
  461.   ncn=NULL;
  462.   cnn=NULL;
  463.   csn=NULL;
  464.   con=NULL;
  465.   read_in_file("MENUS.MSG",(menus),30);
  466.   read_in_file("HELP.MSG",(helps),50);
  467.   for (i=0; i<30; i++) {
  468.     menus1[i].stored_as=0L;
  469.     menus1[i].storage_type=255;
  470.     menus2[i].stored_as=0L;
  471.     menus2[i].storage_type=255;
  472.   }
  473.   sprintf(s,"%sMENUSANS.MSG",syscfg.gfilesdir);
  474.   if (exist(s))
  475.     read_in_file("MENUSANS.MSG",(menus1),30);
  476.   sprintf(s,"%sMENUS40.MSG",syscfg.gfilesdir);
  477.   if (exist(s))
  478.     read_in_file("MENUS40.MSG",(menus2),30);
  479.  
  480.   if (csn!=NULL)
  481.     farfree((void far *)csn);
  482.   if (cnn!=NULL)
  483.     farfree(cnn);
  484.   if (con!=NULL)
  485.     farfree(con);
  486.   read_bbs_list_index();
  487.   read_contacts();
  488. }
  489.  
  490.  
  491. void mailr()
  492. {
  493.   int i,abort,a,f,next;
  494.   mailrec m;
  495.   char c,s[81];
  496.   userrec u;
  497.  
  498.   sprintf(s,"%sEMAIL.DAT",syscfg.datadir);
  499.   f=open(s,O_BINARY | O_RDWR);
  500.   if (f!=-1) {
  501.     i=filelength(f)/sizeof(mailrec)-1;
  502.     c=' ';
  503.     while ((i>=0) && (c!='Q') && (!hangup)) {
  504.       lseek(f,((long) (i)) * ((long) sizeof(mailrec)),SEEK_SET);
  505.       read(f,(void *)&m,sizeof(mailrec));
  506.       if (m.touser!=0) {
  507.         do {
  508.           if (m.tosys!=0) {
  509.         outstr("7[1To7] 3  : System #");
  510.         itoa(m.tosys,s,10);
  511.         pl(s);
  512.       } else {
  513.         read_user(m.touser,&u);
  514.         npr("7[1To7]3   : %s\r\n",nam(&u,m.touser));
  515.       }
  516.       npr("7[1Title7]3: %s\r\n",m.title);
  517.       setorigin(m.fromsys, m.fromuser);
  518.       read_message1(&(m.msg),m.anony & 0x0f,1,&next,"EMAIL");
  519.       prt(2,"3R,D,Q,<space>  : ");
  520.       if (next)
  521.         c=' ';
  522.       else
  523.         c=onek("QRD ");
  524.           if (c=='D') {
  525.             delmail(f,i);
  526.         if ((!useron) && (m.touser==1) && (m.tosys==0))
  527.           --thisuser.waiting;
  528.           }
  529.           nl();
  530.       nl();
  531.         } while ((c=='R') && (!hangup));
  532.       }
  533.       i-=1;
  534.     }
  535.     close(f);
  536.     close_user();
  537.   }
  538. }
  539.  
  540.  
  541. void chuser()
  542. {
  543.   char s[81];
  544.   int i;
  545.  
  546.   if (!checkpw())
  547.     return;
  548.   if (!so())
  549.     return;
  550.   prt(1,"User to change to? ");
  551.   input(s,30);
  552.   i=finduser1(s);
  553.   if (i>0) {
  554.     write_user(usernum,&thisuser);
  555.     read_user(i,&thisuser);
  556.     usernum=i;
  557.     close_user();
  558.     actsl=255;
  559.     sprintf(s,"#*#*#* Changed to %s",nam(&thisuser,usernum));
  560.     topscreen();
  561.     sysoplog(s);
  562.   } else
  563.     pl("3Don't know 'em.");
  564. }
  565.  
  566. void zlog()
  567. {
  568.   zlogrec z;
  569.   char s[81];
  570.   int abort,f,i,i1;
  571.  
  572.   sprintf(s,"%sZLOG.DAT",syscfg.datadir);
  573.   f=open(s,O_RDWR | O_BINARY);
  574.   if (f<0)
  575.     return;
  576.   i=0;
  577.   abort=0;
  578.   read(f,(void *)&z,sizeof(zlogrec));
  579.   pla(" 3 Date     Calls  Active   Posts   Email   Fback    U/L    %Act   T/user",&abort);
  580.   pla("7 --------   -----  ------   -----   -----   -----    ---    ----   ------",&abort);
  581.   while ((i<97) && (!abort) && (!hangup) && (z.date[0]!=0)) {
  582.     if (z.calls)
  583.       i1=z.active/z.calls;
  584.     else
  585.       i1=0;
  586.     sprintf(s,"1%s    %4d    %4d     %3d     %3d     %3d    %3d     %3d      %3d",
  587.      z.date,z.calls,z.active,z.posts,z.email,z.fback,z.up,10*z.active/144,i1);
  588.     pla(s,&abort);
  589.     ++i;
  590.     if (i<97) {
  591.       lseek(f,((long) i) * sizeof(zlogrec),SEEK_SET);
  592.       read(f,(void *)&z,sizeof(zlogrec));
  593.     }
  594.   }
  595.   close(f);
  596. }
  597.  
  598.  
  599. void beginday()
  600. {
  601.   char s[255];
  602.   zlogrec z,z1;
  603.   int f,i,i1;
  604.  
  605.   double fk;
  606.   int    nus;
  607.  
  608.   strcpy(z.date,status.date1);
  609.   z.active=status.activetoday;
  610.   z.calls=status.callstoday;
  611.   z.posts=status.msgposttoday;
  612.   z.email=status.emailtoday;
  613.   z.fback=status.fbacktoday;
  614.   z.up=status.uptoday;
  615.   status.callstoday=0;
  616.   status.msgposttoday=0;
  617.   status.emailtoday=0;
  618.   status.fbacktoday=0;
  619.   status.uptoday=0;
  620.   status.activetoday=0;
  621.   strcpy(status.date3,status.date2);
  622.   strcpy(status.date2,status.date1);
  623.   strcpy(status.date1,date());
  624.   strcpy(status.log2,status.log1);
  625.   sl1(3,status.log1);
  626.   sl1(2,date());
  627.   if (1) {
  628.     sprintf(s,"%s%s",syscfg.gfilesdir, status.log2);
  629.     unlink(s);
  630.   }
  631.   sprintf(s,"%sUSER.LOG",syscfg.gfilesdir);
  632.   unlink(s);
  633.   save_status();
  634.   sprintf(s,"%sZLOG.DAT",syscfg.datadir);
  635.   f=open(s,O_RDWR | O_BINARY);
  636.   if (f<0) {
  637.     f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  638.     z1.date[0]=0;
  639.     z1.active=0;
  640.     z1.calls=0;
  641.     z1.posts=0;
  642.     z1.email=0;
  643.     z1.fback=0;
  644.     z1.up=0;
  645.     for (i=0; i<97; i++)
  646.       write(f,(void *)&z1,sizeof(zlogrec));
  647.   } else {
  648.     for (i=96; i>=1; i--) {
  649.       lseek(f,(long) ((i-1) * sizeof(zlogrec)),SEEK_SET);
  650.       read(f,(void *)&z1,sizeof(zlogrec));
  651.       lseek(f,(long) (i * sizeof(zlogrec)),SEEK_SET);
  652.       write(f,(void *)&z1,sizeof(zlogrec));
  653.     }
  654.   }
  655.   lseek(f,0L,SEEK_SET);
  656.   write(f,(void *)&z,sizeof(zlogrec));
  657.   close(f);
  658.   if (syscfg.beginday_c[0]) {
  659.     stuff_in(s,syscfg.beginday_c,create_chain_file("CHAIN.TXT"),"","","","");
  660.     full_external(s,0,1);
  661.   }
  662.  
  663.   fk=freek1(syscfg.datadir);
  664.   nus=syscfg.maxusers-status.users;
  665.  
  666.   if (fk<512.0) {
  667.     sprintf(s,"Only %dk free in data directory.",(int) fk);
  668.     ssm(1,0,s);
  669.   }
  670.  
  671.   if ((!syscfg.closedsystem) && (nus<15)){
  672.     sprintf(s,"Only %d new user slots left.",nus);
  673.     ssm(1,0,s);
  674.   }
  675. }
  676.  
  677.  
  678.