home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MISCCMD.C < prev    next >
Text File  |  1992-06-16  |  15KB  |  642 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. void read_automessage()
  23. {
  24.   int i,i1,i2,i3,f,len,ptrbeg[10],ptrend[10];
  25.   char s[81],l[6][81],anon,buf[512];
  26.   slrec ss;
  27.  
  28.   sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  29.   f=open(s,O_RDWR | O_BINARY);
  30.   nl();
  31.   anon=status.amsganon;
  32.   if (f<1) {
  33.     pl("6No auto-message.");
  34.   } else {
  35.     len=read(f,(void *)buf,512);
  36.     close(f);
  37.     for (i=0; i<10; i++) {
  38.       ptrbeg[i]=0;
  39.       ptrend[i]=0;
  40.     }
  41.     i=0;
  42.     i1=0;
  43.     i2=0;
  44.     for(i=0; i<len; i++) {
  45.       if (i1) {
  46.         if (buf[i]==10) {
  47.           ptrbeg[i2]=i+1;
  48.           i1=0;
  49.         }
  50.       } else {
  51.         if (buf[i]==13) {
  52.           ptrend[i2]=i-1;
  53.           if (i2<6) {
  54.             for (i3=ptrbeg[i2]; i3<=ptrend[i2]; i3++)
  55.               l[i2][i3-ptrbeg[i2]]=buf[i3];
  56.               l[i2][ptrend[i2]-ptrbeg[i2]+1]=0;
  57.           }
  58.           ++i2;
  59.           i1=1;
  60.         }
  61.       }
  62.     }
  63.     ss=syscfg.sl[actsl];
  64.     if (anon)
  65.       if (ss.ability & ability_read_post_anony) {
  66.         sprintf(s,"<<< %s >>>",&(l[0][0]));
  67.       } else
  68.     strcpy(s,"1>7UNKNOWN1<");
  69.     else
  70.       strcpy(s,&(l[0][0]));
  71.     nl();
  72.     npr("1Auto message by3:7 %s\r\n",s);
  73.     pl("7═══════════════");
  74.     nl();
  75.     i=1;
  76.     while ((ptrend[i]) && (i<6)) {
  77.       pl(&(l[i][0]));
  78.       ++i;
  79.     }
  80.   }
  81.   nl();
  82. }
  83.  
  84. void write_automessage1()
  85. {
  86.   int i,i1,f;
  87.   char s[81],l[4][81];
  88.   slrec ss;
  89.  
  90.   nl();
  91.   pl("1Enter auto-message7,1 3 lines7:");
  92.   nl();
  93.   for (i=0; i<3; i++) {
  94.     npr("7[1%d7]3:5",i+1);
  95.     inputl(&(l[i][0]),39);
  96.     strcat(&(l[i][0]),"\r\n");
  97.   }
  98.   nl();
  99.   ss=syscfg.sl[actsl];
  100.   if (ss.ability & ability_post_anony) {
  101.     prt(7,"Anonymous? ");
  102.     if (yn())
  103.       i1=anony_sender;
  104.     else
  105.       i1=0;
  106.   } else
  107.     i1=0;
  108.   prt(1,"Is this OK? ");
  109.   if (yn()) {
  110.     status.amsganon=i1;
  111.     status.amsguser=usernum;
  112.     save_status();
  113.     sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  114.     f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  115.     strcpy(s,nam(&thisuser,usernum));
  116.     strcat(s,"\r\n");
  117.     write(f,(void *)s,strlen(s));
  118.     for (i=0; i<3; i++)
  119.       write(f,(void *)&(l[i][0]),strlen(&(l[i][0])));
  120.     sysoplog("Changed Auto-message");
  121.     for (i=0; i<3; i++) {
  122.       strcpy(s,"   ");
  123.       l[i][strlen(&(l[i][0]))-2]=0;
  124.       strcat(s,&(l[i][0]));
  125.       sysoplog(s);
  126.     }
  127.     nl();
  128.     pl("6Auto-message saved.");
  129.     nl();
  130.     close(f);
  131.   }
  132.  
  133. }
  134.  
  135. void write_automessage()
  136. {
  137.   char ch;
  138.   int done,okwrite;
  139.   slrec ss;
  140.  
  141.   ss=syscfg.sl[actsl];
  142.   if (ss.posts)
  143.     okwrite=1;
  144.   else
  145.     okwrite=0;
  146.   if (thisuser.restrict & restrict_automessage)
  147.     okwrite=0;
  148.   done=0;
  149.   do {
  150.     nl();
  151.     if (okwrite) {
  152.       prt(1,"A-msg:7 R1:ead,7 W1:rite,7 A1:uto-reply,7 Q1:uit  : ");
  153.       ch=onek("QRWA");
  154.     } else {
  155.       prt(1,"A-msg:7 R1:ead,7 A1:uto-reply,7 Q1:uit  : ");
  156.       ch=onek("QRA");
  157.     }
  158.     switch(ch) {
  159.       case 'Q':
  160.         done=1;
  161.         break;
  162.       case 'R':
  163.         read_automessage();
  164.         break;
  165.       case 'W':
  166.         write_automessage1();
  167.         break;
  168.       case 'A':
  169.         if (status.amsguser)
  170.           email(status.amsguser,0,0,status.amsganon);
  171.         break;
  172.     }
  173.   } while ((!done) && (!hangup));
  174.  
  175. }
  176.  
  177.  
  178. void bbslist()
  179. {
  180.   int i,i1,i2,f,done,ok;
  181.   char s[150],s1[150],s2[150],ch,ch1,*ss;
  182.   char phone[13], name[51], speed[5], type[5];
  183.   long l,l1;
  184.  
  185.   done=0;
  186.   do {
  187.     nl();
  188.     prt(1,"BBS list:7 R1:ead,7 A1:dd,7 N1:et,7 Q1:uit  : ");
  189.     ch=onek("QRNA");
  190.     switch(ch) {
  191.       case 'Q':
  192.         done=1;
  193.         break;
  194.       case 'R':
  195.     pl("7╔════════════════════════════════════════════════════════════════════════════╗");
  196.     pl("7║3   Number                    2BBS Name                           7Baud   1Type7 ║");
  197.     pl("7╚════════════════════════════════════════════════════════════════════════════╝");
  198.     pl("7══════════════════════════════════════════════════════════════════════════════");
  199.     printfile("BBSLIST.MSG");
  200.     pl("7══════════════════════════════════════════════════════════════════════════════");
  201.     break;
  202.       case 'N':
  203.         print_net_listing(0);
  204.     break;
  205.       case 'A':
  206.     if ((actsl<=10)) {
  207.       nl();
  208.       nl();
  209.       pl("6You must be a validated user to add to the BBS list.");
  210.       nl();
  211.       break;
  212.     }
  213.     if (thisuser.restrict & restrict_automessage) {
  214.       nl();
  215.       nl();
  216.       pl("3You can not add to the BBS list.");
  217.       nl();
  218.       break;
  219.     }
  220.     nl();
  221.     pl("1Please enter phone number:");
  222.     pl("2 ###-###-####");
  223.     outstr(":");
  224.     mpl(12);
  225.     input(phone,12);
  226.     if ((phone[3]!='-') || (phone[7]!='-'))
  227.       phone[0]=0;
  228.     if (strlen(phone)==12) {
  229.       ok=1;
  230.       sprintf(s1,"%sBBSLIST.MSG",syscfg.gfilesdir);
  231.       f=open(s1,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  232.       if (f>0) {
  233.         lseek(f,0L,SEEK_SET);
  234.         l=filelength(f);
  235.         if ((ss=malloca(l+500L))==NULL) {
  236.           close(f);
  237.           return;
  238.         }
  239.         read(f,ss,(int)l);
  240.         l1=0L;
  241.         while ((l1<l) && (ok)) {
  242.           i=0;
  243.           do {
  244.         ch=ss[l1++];
  245.         s1[i]=ch;
  246.         if (ch==13)
  247.           s1[i]=0;
  248.         ++i;
  249.           } while ((ch!=10) && (i<120) && (l1<l));
  250.           if (strstr(s1,phone)!=NULL)
  251.         ok=0;
  252.           if (strncmp(s1,phone,12)==0)
  253.         ok=0;
  254.             }
  255.             farfree(ss);
  256.             close(f);
  257.           }
  258.           if (ok) {
  259.         pl("3Number not yet in BBS list.");
  260.         nl();
  261.         nl();
  262.         pl("5Enter BBS name and comments (incl. V.32/HST) :");
  263.         outstr(":");
  264.         mpl(47);
  265.         inputl(name,47);
  266.         nl();
  267.         pl("7Enter maximum speed of the BBS:");
  268.         pl("1ie, 300,1200,2400,9600,14.4,19.2");
  269.         outstr(":");
  270.         mpl(4);
  271.         input(speed,4);
  272.         nl();
  273.         pl("2Enter BBS type (ie, WWIV):");
  274.         outstr(":");
  275.         mpl(4);
  276.         input(type,4);
  277.         sprintf(s,"1*3%12s  2%-47s  7[1%4s7] (1%4s7)1*\r\n",
  278.           phone, name, speed, type);
  279.         nl();
  280.         nl();
  281.         pl(s);
  282.         nl();
  283.         prt(5,"3Is this correct? ");
  284.         if (yn()) {
  285.           sprintf(s1,"%sBBSLIST.MSG",syscfg.gfilesdir);
  286.           f=open(s1,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  287.           if (filelength(f)) {
  288.                 lseek(f,-1L,SEEK_END);
  289.                 read(f,((void *)&ch1),1);
  290.                 if (ch1==26)
  291.                   lseek(f,-1L,SEEK_END);
  292.           }
  293.               write(f,(void *)s,strlen(s));
  294.               close(f);
  295.               nl();
  296.           pl("5Added to BBS list.");
  297.         }
  298.       } else {
  299.         pl("6It's already in the BBS list.");
  300.         nl();
  301.         nl();
  302.       }
  303.     } else {
  304.       nl();
  305.       pl("6Please enter number in correct format.");
  306.       nl();
  307.     }
  308.         break;
  309.     }
  310.   } while ((!done) && (!hangup));
  311. }
  312.  
  313.  
  314. void kill_old_email()
  315. {
  316.   int cur,max,i,i1,f,done,done1,forward;
  317.   char s[81],s1[81],ch;
  318.   long l;
  319.   mailrec m;
  320.   userrec u;
  321.   slrec ss;
  322.  
  323.   prt(1,"List mail starting at most recent? ");
  324.   forward=(yn());
  325.   ss=syscfg.sl[actsl];
  326.   sprintf(s,"%sEMAIL.DAT",syscfg.datadir);
  327.   f=open(s,O_RDWR | O_BINARY);
  328.   if (f==-1) {
  329.     nl();
  330.     pl("6No mail.");
  331.     return;
  332.   }
  333.   max=(int) (filelength(f) / sizeof(mailrec));
  334.   if (forward)
  335.     cur=max-1;
  336.   else
  337.     cur=0;
  338.   done=0;
  339.   do {
  340.     lseek(f,((long) cur) * sizeof(mailrec), SEEK_SET);
  341.     read(f,(void *)&m,sizeof(mailrec));
  342.     while (((m.fromsys!=0) || (m.fromuser!=usernum) || (m.touser==0)) && (cur<max) && (cur>=0)) {
  343.       if (forward)
  344.         --cur;
  345.       else
  346.         ++cur;
  347.       if ((cur<max) && (cur>=0)) {
  348.         lseek(f,((long) cur) * sizeof(mailrec), SEEK_SET);
  349.         read(f,(void *)&m,sizeof(mailrec));
  350.       }
  351.     }
  352.     if ((m.fromsys!=0) || (m.fromuser!=usernum) || (m.touser==0) || (cur>=max) || (cur<0))
  353.       done=1;
  354.     else {
  355.       do {
  356.         done1=0;
  357.         nl();
  358.         if (m.tosys==0) {
  359.           read_user(m.touser,&u);
  360.           strcpy(s1,nam(&u,m.touser));
  361.           if ((m.anony & (anony_receiver | anony_receiver_pp | anony_receiver_da))
  362.               && ((ss.ability & ability_read_email_anony)==0))
  363.         strcpy(s1,"1>7UNKNOWN1<");
  364.       npr("7[1To7]1   :3 %s\r\n",s1);
  365.     } else {
  366.       npr("7[1To7]1   :3 User %d, system %d\r\n", m.touser, m.tosys);
  367.     }
  368.     npr("7[1Title7]1:3 %s\r\n",m.title);
  369.     time(&l);
  370.     i=(int) ((l-m.daten)/24.0/3600.0);
  371.     npr("7[1Sent7]1 :3 %d days ago\r\n",i);
  372.     nl();
  373.     prt(7,"R1:ead,7 D1:elete,7 N1:ext,7 Q1:uit : ");
  374.     ch=onek("QRDN");
  375.     switch(ch) {
  376.       case 'Q':
  377.         done1=1;
  378.         done=1;
  379.         break;
  380.       case 'N':
  381.         done1=1;
  382.         if (forward)
  383.           --cur;
  384.         else
  385.           ++cur;
  386.         if ((cur>=max) || (cur<0))
  387.           done=1;
  388.         break;
  389.       case 'D':
  390.         done1=1;
  391.         delmail(f,cur);
  392.         nl();
  393.         pl("6Mail deleted.");
  394.         nl();
  395.             sysoplog("Deleted mail.");
  396.             break;
  397.           case 'R':
  398.             nl();
  399.             nl();
  400.         npr("7[1Title7]1:3 %s\r\n",m.title);
  401.         setorigin(0,0);
  402.         read_message1(&m.msg,(m.anony & 0x0f), 0, &i1,"EMAIL");
  403.         break;
  404.     }
  405.       } while ((!hangup) && (!done1));
  406.     }
  407.   } while ((!done) && (!hangup));
  408.   close(f);
  409. }
  410.  
  411. void list_users()
  412. {
  413.   subboardrec s;
  414.   userrec u;
  415.   int i,nu,abort,ok,num;
  416.   char st[81];
  417.  
  418.   if (usub[cursub].subnum==-1) {
  419.     nl();
  420.     pl("No sub!");
  421.     nl();
  422.     return;
  423.   }
  424.   s=subboards[usub[cursub].subnum];
  425.   nl();
  426.   pl("1Users with access to current sub:");
  427.   pl("7═════════════════════════════════");
  428.   nl();
  429.   abort=0;
  430.   num=0;
  431.   for (i=0; (i<status.users) && (!abort) && (!hangup); i++) {
  432.     read_user(smallist[i].number,&u);
  433.     ok=1;
  434.     if (u.sl<s.readsl)
  435.       ok=0;
  436.     if (u.age<s.age)
  437.       ok=0;
  438.     if ((s.ar!=0) && ((u.ar & s.ar)==0))
  439.       ok=0;
  440.     if (ok) {
  441.       pla(nam(&u,smallist[i].number),&abort);
  442.       ++num;
  443.     }
  444.   }
  445.   if (!abort) {
  446.     nl();
  447.     npr("1%d users.\r\n",num);
  448.     pl("7══════════");
  449.     nl();
  450.   }
  451. }
  452.  
  453. void print_quest(int f, int mapp, int map[21])
  454. {
  455.   char s[100];
  456.   int i,abort;
  457.   votingrec v;
  458.  
  459.   outchr(12);
  460.   abort=0;
  461.   for (i=1; (i<=mapp) && (abort==0); i++) {
  462.     lseek(f,((long) (map[i])) * sizeof(votingrec), SEEK_SET);
  463.     read(f,(void *)&v,sizeof(votingrec));
  464.     sprintf(s,"1%c2 %2d3:5 %s",
  465.       thisuser.votes[map[i]]?' ':'*',i, v.question);
  466.     pla(s,&abort);
  467.   }
  468.   nl();
  469.   if (abort)
  470.     nl();
  471. }
  472.  
  473.  
  474. int print_question(int f, int i, int ii)
  475. {
  476.   char s[81],s1[81],s2[81];
  477.   int i1,i2,i3,t,t1,abort;
  478.   votingrec v;
  479.   voting_response vr;
  480.  
  481.   lseek(f,((long) ii)*sizeof(votingrec),SEEK_SET);
  482.   read(f,(void *)&v,sizeof(votingrec));
  483.   abort=0;
  484.  
  485.   outchr(12);
  486.   sprintf(s,"c│                          7Voting question 1#%-2d                              c│",i);
  487.   pl("c╒═══════════════════════════════════════════════════════════════════════════╕");
  488.   pla(s,&abort);
  489.  /* pla(v.question,&abort);*/
  490.   npr("c│ 1%-73s c│\r\n",v.question);
  491.   pl("c╘═══════════════════════════════════════════════════════════════════════════╛");
  492.   nl();
  493.   t=0;
  494.   for (i1=0; i1<v.numanswers; i1++) {
  495.     vr=v.responses[i1];
  496.     t+=vr.numresponses;
  497.   }
  498.  
  499.   sprintf(s,"7Users voting1:3 %4.1f%%\r\n",
  500.     ((double) t) / ((double) status.users) * 100.0);
  501.   pla(s,&abort);
  502.   nl();
  503.   if (t)
  504.     t1=t;
  505.   else
  506.     t1=1;
  507.   pla("1 0: No Comment",&abort);
  508.   for (i1=0; i1<5; i1++)
  509.     odc[i1]=0;
  510.   for (i1=0; (i1<v.numanswers) && (!abort); i1++) {
  511.     vr=v.responses[i1];
  512.     if (((i1+1) % 10)==0)
  513.       odc[((i1+1)/10)-1]='0'+((i1+1)/10);
  514.     sprintf(s,"1%2d: %-60s : %4d  %5.1f%%",
  515.       i1+1, vr.response, vr.numresponses,
  516.       ((float)vr.numresponses)/((float)t1)*100.0);
  517.     pla(s,&abort);
  518.   }
  519.   nl();
  520.   if (abort)
  521.     nl();
  522.   return(!abort);
  523. }
  524.  
  525.  
  526. void vote_question(int f, int i, int ii)
  527. {
  528.   int ok,pqo,i1,i2;
  529.   char s[81],*ss;
  530.   votingrec v;
  531.   voting_response vr;
  532.  
  533.   pqo=print_question(f,i,ii);
  534.   ok=pqo;
  535.   ok=1;
  536.   if (restrict_vote & thisuser.restrict)
  537.     ok=0;
  538.   if (actsl<=10)
  539.     ok=0;
  540.   if (!ok)
  541.     return;
  542.  
  543.   lseek(f,((long) ii)*sizeof(votingrec),SEEK_SET);
  544.   read(f,(void *)&v,sizeof(votingrec));
  545.  
  546.   strcpy(s,"3Your vote:7 ");
  547.   vr=v.responses[thisuser.votes[ii]-1];
  548.   if (thisuser.votes[ii])
  549.     strcat(s,vr.response);
  550.   else
  551.     strcat(s,"1No Comment");
  552.   pl(s);
  553.   nl();
  554.   prt(5,"Change it? ");
  555.   if (!yn())
  556.     return;
  557.  
  558.   prt(3,"Which? ");
  559.   ss=mmkey(2);
  560.   i1=atoi(ss);
  561.   if (i1>v.numanswers)
  562.     i1=0;
  563.   if ((i1==0) && (strcmp(ss,"0")))
  564.     return;
  565.  
  566.   if (thisuser.votes[ii]) {
  567.     vr=v.responses[thisuser.votes[ii]-1];
  568.     --vr.numresponses;
  569.     v.responses[thisuser.votes[ii]-1]=vr;
  570.   }
  571.   thisuser.votes[ii]=i1;
  572.   if (i1) {
  573.     vr=v.responses[thisuser.votes[ii]-1];
  574.     ++vr.numresponses;
  575.     v.responses[thisuser.votes[ii]-1]=vr;
  576.   }
  577.   lseek(f,((long) ii)*sizeof(votingrec),SEEK_SET);
  578.   write(f,(void *)&v,sizeof(votingrec));
  579.   nl();
  580.   nl();
  581. }
  582.  
  583.  
  584. void vote()
  585. {
  586.   int i,i1,i2,f,map[21],mapp,abort,n,done;
  587.   char s[81],s1[81],s2[81],sodc[10],*ss;
  588.   votingrec v;
  589.  
  590.   sprintf(s,"%sVOTING.DAT",syscfg.datadir);
  591.   f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  592.   n=(int) (filelength(f) / sizeof(votingrec)) -1;
  593.   if (n<20) {
  594.     v.question[0]=0;
  595.     v.numanswers=0;
  596.     for (i=n; i<20; i++)
  597.       write(f,(void *)&v,sizeof(votingrec));
  598.   }
  599.   mapp=0;
  600.   for (i=0; i<5; i++)
  601.     odc[i]=0;
  602.   for (i=0; i<20; i++) {
  603.     lseek(f,((long) i) * sizeof(votingrec),SEEK_SET);
  604.     read(f,(void *)&v,sizeof(votingrec));
  605.     if (v.numanswers) {
  606.       map[++mapp]=i;
  607.       if ((mapp % 10)==0)
  608.         odc[(mapp/10)-1]='0'+(mapp/10);
  609.     }
  610.   }
  611.   strcpy(sodc,odc);
  612.   if (mapp==0) {
  613.     nl();
  614.     nl();
  615.     pl("7No voting questions currently.");
  616.     nl();
  617.     close(f);
  618.     return;
  619.   }
  620.   print_quest(f,mapp,&map[0]);
  621.   done=0;
  622.   do {
  623.     nl();
  624.     nl();
  625.     prt(1,"Voting:7 Number,Q,? 3: ");
  626.     strcpy(odc,sodc);
  627.     ss=mmkey(2);
  628.     i=atoi(ss);
  629.     if ((i>0) && (i<=mapp))
  630.       vote_question(f,i,map[i]);
  631.     else
  632.       if (strcmp(ss,"Q")==0)
  633.         done=1;
  634.       else
  635.         if (strcmp(ss,"?")==0)
  636.           print_quest(f,mapp,&map[0]);
  637.   } while ((!done) && (!hangup));
  638.   close(f);
  639. }
  640.  
  641.  
  642.