home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVSOR / MISCCMD.C < prev    next >
Text File  |  1996-12-04  |  25KB  |  1,058 lines

  1. #include "vars.h"
  2.  
  3. #pragma hdrstop
  4.  
  5. #define DOTS 5
  6. #define FRAME 7
  7.  
  8. void read_automessage(void)
  9. {
  10.   int i,i1,i2,i3,f,len,ptrbeg[10],ptrend[10];
  11.   char s[81],l[6][81],anon,buf[512];
  12.   slrec ss;
  13.  
  14.   sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  15.   f=sh_open1(s,O_RDONLY | O_BINARY);
  16.   nl();
  17.   read_status();
  18.   anon=status.amsganon;
  19.   if (f<1) {
  20.     pl(get_string(481));
  21.   } else {
  22.     len=sh_read(f,(void *)buf,512);
  23.     sh_close(f);
  24.     for (i=0; i<10; i++) {
  25.       ptrbeg[i]=0;
  26.       ptrend[i]=0;
  27.     }
  28.     i=0;
  29.     i1=0;
  30.     i2=0;
  31.     for(i=0; i<len; i++) {
  32.       if (i1) {
  33.         if (buf[i]==10) {
  34.           ptrbeg[i2]=i+1;
  35.           i1=0;
  36.         }
  37.       } else {
  38.         if (buf[i]==13) {
  39.           ptrend[i2]=i-1;
  40.           if (i2<6) {
  41.             for (i3=ptrbeg[i2]; i3<=ptrend[i2]; i3++)
  42.               l[i2][i3-ptrbeg[i2]]=buf[i3];
  43.               l[i2][ptrend[i2]-ptrbeg[i2]+1]=0;
  44.           }
  45.           ++i2;
  46.           i1=1;
  47.         }
  48.       }
  49.     }
  50.     ss=syscfg.sl[actsl];
  51.     if (anon)
  52.       if (ss.ability & ability_read_post_anony) {
  53.         sprintf(s,"<<< %s >>>",&(l[0][0]));
  54.       } else
  55.         strcpy(s,get_string(482));
  56.     else
  57.       strcpy(s,&(l[0][0]));
  58.     nl();
  59.     pl("7┌─────────────────────────────────────────∙∙∙··");
  60.     outstr("7│5Auto Message by3:5 "); pl(s);
  61.     pl("7├─────────────────────────────────────────∙∙∙··");
  62.     i=1;
  63.     while ((ptrend[i]) && (i<6)) {
  64.       outstr("7│5");
  65.       pl(&(l[i][0]));
  66.       ++i;
  67.     }
  68.     pl("7└─────────────────────────────────────────∙∙∙··");
  69.   }
  70.   nl();
  71. }
  72.  
  73. void write_automessage1(void)
  74. {
  75.   int i,i1,f;
  76.   char s[81],l[4][81];
  77.   slrec ss;
  78.  
  79.   nl();
  80.   pl(get_string(484));
  81.   nl();
  82.   for (i=0; i<3; i++) {
  83.     npr("%d:",i+1);
  84.     inputl(&(l[i][0]),39);
  85.     strcat(&(l[i][0]),"\r\n");
  86.   }
  87.   nl();
  88.   ss=syscfg.sl[actsl];
  89.   if (ss.ability & ability_post_anony) {
  90.     prt(5,get_string(485));
  91.     if (yn())
  92.       i1=anony_sender;
  93.     else
  94.       i1=0;
  95.   } else
  96.     i1=0;
  97.   prt(5,get_string(438));
  98.   if (yn()) {
  99.     lock_status();
  100.     status.amsganon=i1;
  101.     status.amsguser=usernum;
  102.     save_status();
  103.     sprintf(s,"%sAUTO.MSG",syscfg.gfilesdir);
  104.     f=sh_open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  105.     strcpy(s,nam(&thisuser,usernum));
  106.     strcat(s,"\r\n");
  107.     sh_write(f,(void *)s,strlen(s));
  108.     for (i=0; i<3; i++)
  109.       sh_write(f,(void *)&(l[i][0]),strlen(&(l[i][0])));
  110.     sysoplog(get_stringx(1,24));
  111.     for (i=0; i<3; i++) {
  112.       strcpy(s,"   ");
  113.       l[i][strlen(&(l[i][0]))-2]=0;
  114.       strcat(s,&(l[i][0]));
  115.       sysoplog(s);
  116.     }
  117.     nl();
  118.     pl(get_string(486));
  119.     nl();
  120.     sh_close(f);
  121.   }
  122.  
  123. }
  124.  
  125. void write_automessage(void)
  126. {
  127.   char ch;
  128.   int done,okwrite;
  129.   slrec ss;
  130.  
  131.   ss=syscfg.sl[actsl];
  132.   if (ss.posts)
  133.     okwrite=1;
  134.   else
  135.     okwrite=0;
  136.   if (thisuser.restrict & restrict_automessage)
  137.     okwrite=0;
  138.   done=0;
  139.   do {
  140.     nl();
  141.     if (okwrite) {
  142.       prt(2,get_string(487));
  143.       ch=onek("QRWA");
  144.     } else {
  145.       prt(2,get_string(488));
  146.       ch=onek("QRA");
  147.     }
  148.     switch(ch) {
  149.       case 'Q':
  150.         done=1;
  151.         break;
  152.       case 'R':
  153.         read_automessage();
  154.         break;
  155.       case 'W':
  156.         write_automessage1();
  157.         break;
  158.       case 'A':
  159.         irt[0]=0;
  160.         irt_name[0]=0;
  161.         grab_quotes(NULL, NULL);
  162.         read_status();
  163.         if (status.amsguser)
  164.           email(status.amsguser,0,0,status.amsganon);
  165.         break;
  166.     }
  167.   } while ((!done) && (!hangup));
  168.  
  169. }
  170.  
  171.  
  172. void bbslist(void)
  173. {
  174.   int i,f,done,ok;
  175.   char s[150],s1[150],ch,ch1,*ss;
  176.   char phone[13], name[51], speed[5], type[5];
  177.   long l,l1;
  178.  
  179.   done=0;
  180.   do {
  181.     helpl=0;
  182.     nl();
  183.     prt(2,get_string(489));
  184.     ch=onek("QRNA");
  185.     switch(ch) {
  186.       case 'Q':
  187.         done=1;
  188.         break;
  189.       case 'R':
  190.         printfile("BBSLIST.MSG");
  191.         break;
  192.       case 'N':
  193.         print_net_listing(0);
  194.         break;
  195.       case 'A':
  196.         helpl=25;
  197.         if ((actsl<=10)) {
  198.           nln(2);
  199.           pl(get_string(490));
  200.           nl();
  201.           break;
  202.         }
  203.         if (thisuser.restrict & restrict_automessage) {
  204.           nln(2);
  205.           pl(get_string(491));
  206.           nl();
  207.           break;
  208.         }
  209.         nl();
  210.         pl(get_string(492));
  211.         pl(get_string(493));
  212.         outstr(":");
  213.         mpl(12);
  214.         input(phone,12);
  215.         if ((phone[3]!='-') || (phone[7]!='-'))
  216.           phone[0]=0;
  217.         for (i=0; i<12; i++) {
  218.           if (strchr("0123456789-",phone[i])==0)
  219.             phone[0]=0;
  220.         }
  221.         if (strlen(phone)==12) {
  222.           ok=1;
  223.           sprintf(s1,"%sBBSLIST.MSG",syscfg.gfilesdir);
  224.           f=sh_open1(s1,O_RDONLY | O_BINARY);
  225.           if (f>0) {
  226.             sh_lseek(f,0L,SEEK_SET);
  227.             l=filelength(f);
  228.             if ((ss=malloca(l+500L))==NULL) {
  229.               sh_close(f);
  230.               return;
  231.             }
  232.             sh_read(f,ss,(int)l);
  233.             l1=0L;
  234.             while ((l1<l) && (ok)) {
  235.               i=0;
  236.               do {
  237.                 ch=ss[l1++];
  238.                 s1[i]=ch;
  239.                 if (ch==13)
  240.                   s1[i]=0;
  241.                 ++i;
  242.               } while ((ch!=10) && (i<120) && (l1<l));
  243.               if (strstr(s1,phone)!=NULL)
  244.                 ok=0;
  245.               if (strncmp(s1,phone,12)==0)
  246.                 ok=0;
  247.             }
  248.             bbsfree(ss);
  249.             sh_close(f);
  250.           }
  251.           if (ok) {
  252.             pl(get_string(494));
  253.             nln(2);
  254.             pl(get_string(495));
  255.             outstr(":");
  256.             mpl(50);
  257.             inputl(name,50);
  258.             nl();
  259.             pl(get_string(496));
  260.             pl(get_string(497));
  261.             outstr(":");
  262.             mpl(4);
  263.             input(speed,4);
  264.             nl();
  265.             pl(get_string(498));
  266.             outstr(":");
  267.             mpl(4);
  268.             input(type,4);
  269.             sprintf(s,"%12s  %-50s  [%4s] (%4s)\r\n",
  270.               phone, name, speed, type);
  271.             nln(2);
  272.             pl(s);
  273.             nl();
  274.             prt(5,get_string(499));
  275.             if (yn()) {
  276.               sprintf(s1,"%sBBSLIST.MSG",syscfg.gfilesdir);
  277.               f=sh_open(s1,O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
  278.               if (filelength(f)) {
  279.                 sh_lseek(f,-1L,SEEK_END);
  280.                 sh_read(f,((void *)&ch1),1);
  281.                 if (ch1==26)
  282.                   sh_lseek(f,-1L,SEEK_END);
  283.               }
  284.               sh_write(f,(void *)s,strlen(s));
  285.               sh_close(f);
  286.               nl();
  287.               pl(get_string(500));
  288.             }
  289.           } else {
  290.             pl(get_string(501));
  291.             nln(2);
  292.           }
  293.         } else {
  294.           nl();
  295.           pl(get_string(502));
  296.           nl();
  297.         }
  298.         break;
  299.     }
  300.   } while ((!done) && (!hangup));
  301. }
  302.  
  303.  
  304. void kill_old_email(void)
  305. {
  306.   int cur,max,i,i1,f,done,done1,forward;
  307.   char s1[81],ch;
  308.   long l;
  309.   mailrec m, m1;
  310.   userrec u;
  311.   slrec ss;
  312.  
  313.   if (rip_on()) {
  314.     cleared = -1;
  315.     setmsgview(0);
  316.     smally = formery;
  317.   }
  318.   prt(5,get_string(503));
  319.   forward=(yn());
  320.   ss=syscfg.sl[actsl];
  321.   f=open_email(0);
  322.   if (f==-1) {
  323.     nl();
  324.     pl(get_string(504));
  325.     return;
  326.   }
  327.   max=(int) (filelength(f) / sizeof(mailrec));
  328.   if (forward)
  329.     cur=max-1;
  330.   else
  331.     cur=0;
  332.   done=0;
  333.   do {
  334.     sh_lseek(f,((long) cur) * sizeof(mailrec), SEEK_SET);
  335.     sh_read(f,(void *)&m,sizeof(mailrec));
  336.     while (((m.fromsys!=0) || (m.fromuser!=usernum) || (m.touser==0)) && (cur<max) && (cur>=0)) {
  337.       if (forward)
  338.         --cur;
  339.       else
  340.         ++cur;
  341.       if ((cur<max) && (cur>=0)) {
  342.         sh_lseek(f,((long) cur) * sizeof(mailrec), SEEK_SET);
  343.         sh_read(f,(void *)&m,sizeof(mailrec));
  344.       }
  345.     }
  346.     if ((m.fromsys!=0) || (m.fromuser!=usernum) || (m.touser==0) || (cur>=max) || (cur<0))
  347.       done=1;
  348.     else {
  349.       f=sh_close(f);
  350.       do {
  351.         done1=0;
  352.         nl();
  353.         if (E_C) {
  354.           outstr(get_string(325));
  355.         } else {
  356.           outstr(get_string(1371));
  357.         }
  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,get_string(482));
  364.           pl(s1);
  365.         } else {
  366.           npr("#%u @%u\r\n",m.touser, m.tosys);
  367.         }
  368.         if (E_C) {
  369.           outstr(get_string(326));
  370.         } else {
  371.           outstr(get_string(1372));
  372.         }
  373.         pl(m.title);
  374.         time(&l);
  375.         i=(int) ((l-m.daten)/24.0/3600.0);
  376.         if (E_C) {
  377.           outstr(get_string(505));
  378.         } else {
  379.           outstr(get_string(1373));
  380.         }
  381.         npr("%d ",i);
  382.         pl(get_string(506));
  383.         nl();
  384.         prt(2,get_string(507));
  385.         ch=onek("QRDN");
  386.         switch(ch) {
  387.           case 'Q':
  388.             done1=1;
  389.             done=1;
  390.             break;
  391.           case 'N':
  392.             done1=1;
  393.             if (forward)
  394.               --cur;
  395.             else
  396.               ++cur;
  397.             if ((cur>=max) || (cur<0))
  398.               done=1;
  399.             break;
  400.           case 'D':
  401.             done1=1;
  402.             f=open_email(1);
  403.             sh_lseek(f,((long) cur) * sizeof(mailrec), SEEK_SET);
  404.             sh_read(f,(void *)&m1,sizeof(mailrec));
  405.             if (memcmp(&m, &m1, sizeof(mailrec))==0) {
  406.               delmail(f,cur);
  407.               nl();
  408.               pl(get_string(508));
  409.               nl();
  410.               sprintf(s1,get_stringx(1, 100),nam(&u,m1.touser));
  411.               sysoplog(s1);
  412.             } else {
  413.               pl(get_string(1174));
  414.             }
  415.             f=sh_close(f);
  416.             break;
  417.           case 'R':
  418.             nln(2);
  419.             if (E_C) {
  420.               outstr(get_string(326));
  421.             } else {
  422.               outstr(get_string(1372));
  423.             }
  424.             pl(m.title);
  425.             setorigin(0,0);
  426.             read_message1(&m.msg,(m.anony & 0x0f), 0, &i1,"EMAIL");
  427.             break;
  428.         }
  429.       } while ((!hangup) && (!done1));
  430.       f=open_email(0);
  431.       if (f<0)
  432.         break;
  433.     }
  434.   } while ((!done) && (!hangup));
  435.   f=sh_close(f);
  436. }
  437.  
  438.  
  439. void list_users(int mode)
  440. {
  441.   subboardrec s;
  442.   directoryrec d;
  443.   userrec u;
  444.   int i,abort,ok,num, count, color, next=0, ncnm=0;
  445.   char s1[121],s2[121];
  446.  
  447.   if ((usub[cursub].subnum==-1) && (mode==0)) {
  448.     nl();
  449.     pl(get_string(510));
  450.     nl();
  451.     return;
  452.   }
  453.   if ((udir[curdir].subnum==-1) && (mode==1)) {
  454.     nl();
  455.     pl(get_string(32));
  456.     nl();
  457.     return;
  458.   }
  459.   abort=0;
  460.   num=0;
  461.   strcpy(s1,get_string(1175));
  462.   if (mode==0) {
  463.     s=subboards[usub[cursub].subnum];
  464.     npr("\r\n2%s 1%s 2%s.\r\n", s1, subboards[usub[cursub].subnum].name,
  465.         get_string(1628));
  466.   }
  467.   if (mode==1) {
  468.     d=directories[udir[curdir].subnum];
  469.     npr("\r\n2%s 1%s 2%s.\r\n", s1, directories[udir[curdir].subnum].name,
  470.         get_string(1629));
  471.   }
  472.   nl();
  473.   if (okansi()) {
  474.     if (syscfg.sysconfig & sysconfig_extended_info) {
  475.       pla(get_string(1176),&abort);
  476.       sprintf(s1,"%d%s",FRAME,get_string(1177));
  477.       pla(s1,&abort);
  478.     } else {
  479.       pla(get_string(1178),&abort);
  480.       sprintf(s1,"%d%s",FRAME,get_string(1179));
  481.       pla(s1,&abort);
  482.     }
  483.   } else {
  484.     if (syscfg.sysconfig & sysconfig_extended_info) {
  485.       pla(get_string(1180),&abort);
  486.       pla(get_string(1181),&abort);
  487.     } else {
  488.       pla(get_string(1182),&abort);
  489.       pla(get_string(1183),&abort);
  490.     }
  491.   }
  492.   count=0;
  493.   color=3;
  494.   outstr("\r");
  495.   outstr(get_string(1184));
  496.   read_status();
  497.   for (i=0; (i<status.users) && (!abort) && (!hangup); i++) {
  498.     if (ncnm>5) {
  499.       count++;
  500.       npr("%d.",color);
  501.       if (count==DOTS) {
  502.         osan("\r", &abort, &next);
  503.         osan(get_string(1184), &abort, &next);
  504.         color++;
  505.         count=0;
  506.         if (color==4)
  507.           color++;
  508.         if (color==7)
  509.           color=0;
  510.       }
  511.     }
  512.     read_user(smallist[i].number,&u);
  513.     ok=1;
  514.     if (mode==0) {
  515.       if (u.sl<s.readsl)
  516.         ok=0;
  517.       if (u.age < (s.age&0x7f))
  518.         ok=0;
  519.       if ((s.ar!=0) && ((u.ar & s.ar)==0))
  520.         ok=0;
  521.     }
  522.     if (mode==1) {
  523.       if (u.dsl<d.dsl)
  524.         ok=0;
  525.       if (u.age<d.age)
  526.         ok=0;
  527.       if ((d.dar!=0) && ((u.dar & d.dar)==0))
  528.         ok=0;
  529.     }
  530.     if (ok) {
  531.       ncnm=0;
  532.       sprintf(s2,"%s, %s",u.city,u.state);
  533.       if (okansi()) {
  534.         if (syscfg.sysconfig & sysconfig_extended_info) {
  535.           sprintf(s1,"\r%d║7%-4d%d║1%-30.30s%d║2%-30.30s%d║",
  536.             FRAME, smallist[i].number, FRAME, u.name, FRAME, s2, FRAME );
  537.         } else {
  538.           sprintf(s1,"\r%d║7%-4d%d║1%-30.30s%d║",
  539.             FRAME, smallist[i].number, FRAME, u.name, FRAME);
  540.         }
  541.       } else {
  542.         if (syscfg.sysconfig & sysconfig_extended_info) {
  543.           sprintf(s1,"\r:%-4d:%-30s:%-30s:",
  544.             smallist[i].number,u.name,s2);
  545.         } else {
  546.           sprintf(s1,"\r:%-4d:%-30s:",
  547.             smallist[i].number,u.name);
  548.         }
  549.       }
  550.       pla(s1,&abort);
  551.       ++num;
  552.     } else
  553.       ncnm++;
  554.   }
  555.   if (okansi()) {
  556.     if (syscfg.sysconfig & sysconfig_extended_info) {
  557.       sprintf(s1,"\r%d%s",FRAME,get_string(1185));
  558.     } else {
  559.       sprintf(s1,"\r%d%s",FRAME,get_string(1186));
  560.     }
  561.   } else {
  562.     if (syscfg.sysconfig & sysconfig_extended_info) {
  563.       sprintf(s1,"\r%s",get_string(1187));
  564.     } else {
  565.       sprintf(s1,"\r%s",get_string(1188));
  566.     }
  567.   }
  568.   pla(s1,&abort);
  569.   if (abort)
  570.     if (num>0)
  571.       num--;
  572.   npr("1%d 2%s.\r\n",num,(num==1) ? get_string(1630) : get_string(1631));
  573. }
  574.  
  575.  
  576. void print_quest(int mapp, int map[21])
  577. {
  578.   char s[100];
  579.   int i,abort,f;
  580.   votingrec v;
  581.  
  582.   outchr(12);
  583.   abort=0;
  584.   sprintf(s,"%sVOTING.DAT",syscfg.datadir);
  585.   f=sh_open1(s,O_RDONLY | O_BINARY);
  586.   if (f<0)
  587.     return;
  588.  
  589.   for (i=1; (i<=mapp) && (abort==0); i++) {
  590.     sh_lseek(f,((long) (map[i])) * sizeof(votingrec), SEEK_SET);
  591.     sh_read(f,(void *)&v,sizeof(votingrec));
  592.     sprintf(s,"1%c %2d7:1 %s",
  593.       thisuser.votes[map[i]]?' ':'*',i, v.question);
  594.     pla(s,&abort);
  595.   }
  596.   f=sh_close(f);
  597.   nl();
  598.   if (abort)
  599.     nl();
  600. }
  601.  
  602.  
  603. int print_question(int i, int ii)
  604. {
  605.   char s[81];
  606.   int i1,t,t1,abort, f;
  607.   votingrec v;
  608.   voting_response vr;
  609.  
  610.   sprintf(s,"%sVOTING.DAT",syscfg.datadir);
  611.   f=sh_open1(s,O_RDONLY | O_BINARY);
  612.   if (f<0)
  613.     return(0);
  614.   sh_lseek(f,((long) ii)*sizeof(votingrec),SEEK_SET);
  615.   sh_read(f,(void *)&v,sizeof(votingrec));
  616.   f=sh_close(f);
  617.   abort=0;
  618.  
  619.   if (!v.numanswers)
  620.     return(0);
  621.  
  622.   outchr(12);
  623.   pl("7──────────────────────────────────────────────────────────────────────────────");
  624.   sprintf(s,"1Voting Question3:1%-2d                                                               ",i);
  625.   pla(s,&abort);
  626.   ansic(3);
  627.   pla(v.question,&abort);
  628.   pl("7──────────────────────────────────────────────────────────────────────────────");
  629.   nl();
  630.   t=0;
  631.   for (i1=0; i1<v.numanswers; i1++) {
  632.     vr=v.responses[i1];
  633.     t+=vr.numresponses;
  634.   }
  635.  
  636.   read_status();
  637.   sprintf(s,"1%s7: 1%4.1f%%\r\n",get_string(514),
  638.     ((double) t) / ((double) status.users) * 100.0);
  639.   pla(s,&abort);
  640.   nl();
  641.   if (t)
  642.     t1=t;
  643.   else
  644.     t1=1;
  645.   pla(" 10: No Comment",&abort);
  646.   for (i1=0; i1<5; i1++)
  647.     odc[i1]=0;
  648.   for (i1=0; (i1<v.numanswers) && (!abort); i1++) {
  649.     vr=v.responses[i1];
  650.     if (((i1+1) % 10)==0)
  651.       odc[((i1+1)/10)-1]='0'+((i1+1)/10);
  652.     sprintf(s,"1%2d: %-60s : %4d  %5.1f%%",
  653.       i1+1, vr.response, vr.numresponses,
  654.       ((float)vr.numresponses)/((float)t1)*100.0);
  655.     pla(s,&abort);
  656.   }
  657.   nl();
  658.   if (abort)
  659.     nl();
  660.   return(!abort);
  661. }
  662.  
  663.  
  664. void vote_question(int i, int ii)
  665. {
  666.   int ok,pqo,i1, f;
  667.   char s[81],*ss, fn[81];
  668.   votingrec v;
  669.  
  670.   sprintf(fn,"%sVOTING.DAT",syscfg.datadir);
  671.  
  672.   pqo=print_question(i,ii);
  673.   ok=pqo;
  674.   ok=1;
  675.   if (restrict_vote & thisuser.restrict)
  676.     ok=0;
  677.   if (actsl<=10)
  678.     ok=0;
  679.   if (!ok)
  680.     return;
  681.  
  682.   f=sh_open1(fn,O_RDONLY| O_BINARY);
  683.   if (f<0)
  684.     return;
  685.   sh_lseek(f,((long) ii)*sizeof(votingrec),SEEK_SET);
  686.   sh_read(f,(void *)&v,sizeof(votingrec));
  687.   f=sh_close(f);
  688.  
  689.   if (!v.numanswers)
  690.     return;
  691.  
  692.   strcpy(s,"5Your Vote3: 5");
  693.   if (thisuser.votes[ii])
  694.     strcat(s,v.responses[thisuser.votes[ii]-1].response);
  695.   else
  696.     strcat(s,get_string(517));
  697.   pl(s);
  698.   nl();
  699.   prt(5,get_string(264));
  700.   if (!yn())
  701.     return;
  702.  
  703.   prt(1,get_string(297));
  704.   ss=mmkey(2);
  705.   i1=atoi(ss);
  706.   if (i1>v.numanswers)
  707.     i1=0;
  708.   if ((i1==0) && (strcmp(ss,"0")))
  709.     return;
  710.  
  711.   f=sh_open1(fn,O_RDWR | O_BINARY);
  712.   if (f<0)
  713.     return;
  714.   sh_lseek(f,((long) ii)*sizeof(votingrec),SEEK_SET);
  715.   sh_read(f,(void *)&v,sizeof(votingrec));
  716.  
  717.   if (!v.numanswers) {
  718.     f=sh_close(f);
  719.     return;
  720.   }
  721.  
  722.   if (thisuser.votes[ii]) {
  723.     v.responses[thisuser.votes[ii]-1].numresponses--;
  724.   }
  725.   thisuser.votes[ii]=i1;
  726.   if (i1) {
  727.     v.responses[thisuser.votes[ii]-1].numresponses++;
  728.   }
  729.   sh_lseek(f,((long) ii)*sizeof(votingrec),SEEK_SET);
  730.   sh_write(f,(void *)&v,sizeof(votingrec));
  731.   f=sh_close(f);
  732.   nln(2);
  733. }
  734.  
  735.  
  736. void vote(void)
  737. {
  738.   int i,f,map[21],mapp,n,done;
  739.   char s[81],sodc[10],*ss;
  740.   votingrec v;
  741.  
  742.   sprintf(s,"%sVOTING.DAT",syscfg.datadir);
  743.   f=sh_open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  744.   if (f<0)
  745.     return;
  746.   n=(int) (filelength(f) / sizeof(votingrec)) -1;
  747.   if (n<20) {
  748.     v.question[0]=0;
  749.     v.numanswers=0;
  750.     for (i=n; i<20; i++)
  751.       sh_write(f,(void *)&v,sizeof(votingrec));
  752.   }
  753.   mapp=0;
  754.   for (i=0; i<5; i++)
  755.     odc[i]=0;
  756.   for (i=0; i<20; i++) {
  757.     sh_lseek(f,((long) i) * sizeof(votingrec),SEEK_SET);
  758.     sh_read(f,(void *)&v,sizeof(votingrec));
  759.     if (v.numanswers) {
  760.       map[++mapp]=i;
  761.       if ((mapp % 10)==0)
  762.         odc[(mapp/10)-1]='0'+(mapp/10);
  763.     }
  764.   }
  765.   f=sh_close(f);
  766.  
  767.   strcpy(sodc,odc);
  768.   if (mapp==0) {
  769.     nln(2);
  770.     pl(get_string(518));
  771.     nl();
  772.     return;
  773.   }
  774.   print_quest(mapp,&map[0]);
  775.   done=0;
  776.   do {
  777.     nln(2);
  778.     prt(2,"1Voting7: 1Number7,1Q7,1? 7:1");
  779.     strcpy(odc,sodc);
  780.     ss=mmkey(2);
  781.     i=atoi(ss);
  782.     if ((i>0) && (i<=mapp))
  783.       vote_question(i,map[i]);
  784.     else
  785.       if (strcmp(ss,"Q")==0)
  786.         done=1;
  787.       else
  788.         if (strcmp(ss,"?")==0)
  789.           print_quest(mapp,&map[0]);
  790.   } while ((!done) && (!hangup));
  791. }
  792.  
  793.  
  794. void time_bank(void)
  795. {
  796.   char s[81],bc[11],c;
  797.   int i,done=0;
  798.   double nsln;
  799.  
  800.   nl();
  801.   if (thisuser.sl<=syscfg.newusersl) {
  802.     ansic(6);
  803.     pl(get_string(981));
  804.     return;
  805.   }
  806.  
  807.   if (thisuser.banktime>syscfg.sl[thisuser.sl].time_per_logon)
  808.     thisuser.banktime=syscfg.sl[thisuser.sl].time_per_logon;
  809.  
  810.   if (menu_on()) {
  811.     rip_timebank();
  812.     return;
  813.   }
  814.  
  815.   if (okansi())
  816.     strcpy(bc,get_string(982));
  817.   else
  818.     strcpy(bc,get_string(983));
  819.  
  820.   do {
  821.     outchr(12);
  822.     sprintf(s,"%c%s%c",bc[0],charstr(25,bc[4]),bc[1]);
  823.     prt(4,s); nl();
  824.     sprintf(s,"%c%-25.25s%c",bc[5],get_string(984),bc[5]);
  825.     prt(4,s); nl();
  826.     sprintf(s,"%c%s%c",bc[7],charstr(25,bc[4]),bc[9]);
  827.     prt(4,s); nl();
  828.     sprintf(s,"%c%-25.25s%c",bc[5],get_string(985),bc[5]);
  829.     prt(4,s); nl();
  830.     sprintf(s,"%c%-25.25s%c",bc[5],get_string(986),bc[5]);
  831.     prt(4,s); nl();
  832.     sprintf(s,"%c%-25.25s%c",bc[5],get_string(987),bc[5]);
  833.     prt(4,s); nl();
  834.     sprintf(s,"%c%s%c",bc[7],charstr(25,bc[4]),bc[9]);
  835.     prt(4,s); nl();
  836.     sprintf(s,"%c%-17.17s%-6d  %c",bc[5],get_string(988),thisuser.banktime,bc[5]);
  837.     prt(4,s); nl();
  838.     sprintf(s,"%c%-17.17s%-6d  %c",bc[5],get_string(1430),(int)(nsl()/60),bc[5]);
  839.     prt(4,s); nl();
  840.     sprintf(s,"%c%s%c",bc[2],charstr(25,bc[4]),bc[3]);
  841.     prt(4,s);
  842.     nln(2);
  843.     prt(1,get_string(989));
  844.     ansic(2);
  845.     c=onek("QDW");
  846.     switch(c) {
  847.       case 'D':
  848.         nl();
  849.         prt(1,get_string(990));
  850.         mpl(3);
  851.         input(s,3);
  852.         i=atoi(s);
  853.         if (i>0) {
  854.           nsln=nsl();
  855.           if ((i+thisuser.banktime)>syscfg.sl[thisuser.sl].time_per_logon)
  856.             i=syscfg.sl[thisuser.sl].time_per_logon-thisuser.banktime;
  857.           if (i>(nsln/60.0))
  858.             i=(nsln/60.0);
  859.           thisuser.banktime+=i;
  860.           thisuser.extratime-=i*60.0;
  861.           tleft(0);
  862.         }
  863.         break;
  864.       case 'W':
  865.         nl();
  866.         if (!thisuser.banktime)
  867.           break;
  868.         prt(1,get_string(991));
  869.         mpl(3);
  870.         input(s,3);
  871.         i=atoi(s);
  872.         if (i>0) {
  873.           nsln=nsl();
  874.           if (i>thisuser.banktime)
  875.             i=thisuser.banktime;
  876.           thisuser.banktime-=i;
  877.           thisuser.extratime+=(i*60.0);
  878.           tleft(0);
  879.         }
  880.         break;
  881.       case 'Q':
  882.         done=1;
  883.         break;
  884.     }
  885.   } while (!done && !hangup);
  886. }
  887.  
  888.  
  889. void remotenotify(char *name, char *desc)
  890. {
  891.   char s[161],s1[81],s2[161];
  892.   int f,i,rnnet,rndest,rnuser;
  893.   long p,l;
  894.  
  895.   sprintf(s1,"%s%s",syscfg.datadir,get_string(1060));
  896.   f=sh_open1(s1,O_RDWR | O_BINARY);
  897.   if (f<0) {
  898.     return;
  899.   }
  900.   sh_lseek(f,0L,SEEK_SET);
  901.   l=filelength(f);
  902.   p=0;
  903.   nl();
  904.   while (p<l) {
  905.     sh_lseek(f,p,SEEK_SET);
  906.     sh_read(f,(void *)s,150);
  907.     i=0;
  908.     while ((i<150) && (s[i])) {
  909.       if (s[i]==13)
  910.         s[i]=0;
  911.       else
  912.         ++i;
  913.     }
  914.     s[150]=0;
  915.  
  916.     p += (long) (i+2);
  917.     strncpy(s2,extractword(1,s,","),sizeof(s2));
  918.     if(strlen(s2) < 17) {
  919.       rnnet=getnetnum(s2);
  920.       strncpy(s2,extractword(2,s,","),sizeof(s2));
  921.       rnuser=atoi(s2);
  922.       strncpy(s2,extractword(3,s,","),sizeof(s2));
  923.       rndest=atoi(s2);
  924.       sprintf(s,"2@%d UPL:1 %s 2DESC:1 %s",
  925.         net_networks[rnnet].sysnum,name,desc);
  926.       if ((rnuser==0) || (rndest==0))
  927.         return;
  928.       if (so()) {
  929.         npr("1SSM:7%s %d@%d %s",net_networks[rnnet].name,rnuser,rndest,s);
  930.         npr("2 (y/N) ");
  931.         if (yn()) {
  932.           set_net_num(rnnet);
  933.           ssm(rnuser,rndest,s);
  934.         }
  935.       } else {
  936.         set_net_num(rnnet);
  937.         ssm(rnuser,rndest,s);
  938.         nl();
  939.       }
  940.     }
  941.   }
  942.   f=sh_close(f);
  943. }
  944.  
  945.  
  946. int remoteupload(char *message)
  947. {
  948.   char s[81],s1[81],s2[81],s3[81],ch,msg[81];
  949.   int i,done,brd,network;
  950.  
  951.   strncpy(msg,stripcolors(message),80);
  952.   if ((strlen(msg)<20) || (msg[0]!='@'))
  953.     return(1);
  954.   strcpy(s1,&msg[1]);
  955.   for (i=0;i<strlen(s1);i++) {
  956.     if (s1[i]==' ') {
  957.       break;
  958.     }
  959.   }
  960.   s1[i]=0;
  961.   itoa(net_networks[net_num].sysnum,s3,10);
  962.   if (strcmp(s1,s3)==NULL)
  963.     return(1);
  964.   for (i=0;i<strlen(msg);i++) {
  965.     if (msg[i]==':') {
  966.       strcpy(s,&msg[++i]);
  967.       break;
  968.     }
  969.   }
  970.   for (i=0;i<strlen(s);i++) {
  971.     if (s[i]==' ') {
  972.       strcpy(s,&s[i+1]);
  973.       break;
  974.     }
  975.   }
  976.   for (i=0;i<strlen(s);i++) {
  977.     if (s[i]=='.') {
  978.       s[i+4]=0;
  979.       break;
  980.     }
  981.   }
  982.   strcpy(s2,stripfn(s));
  983.   done=0;
  984.  
  985.   do {
  986.     nl();
  987.     pl(get_string(1061));
  988.     pl(get_string(1062));
  989.     pl(get_string(1063));
  990.     pl(get_string(1064));
  991.     nl();
  992.     prt(2,get_string(1065));
  993.     ch=onek(" ADRS\r");
  994.     switch(ch) {
  995.       case 'A':
  996.         if (sysinfo.flags & OP_FLAGS_FAST_SEARCH) {
  997.           modify_database(s2,1);
  998.           done=1;
  999.         }
  1000.         break;
  1001.       case 'R':
  1002.         nl();
  1003.         npr(get_string(1066),s2,s1);
  1004.         if (yn()) {
  1005.           nl();
  1006.           for (brd=0; brd<net_num_max; brd++) {
  1007.             if (net_networks[brd].name != 0) {
  1008.               npr(" 2%d7)1 %s\r\n",
  1009.                 brd+1,net_networks[brd].name);
  1010.             }
  1011.           }
  1012.           nl();
  1013.           npr(get_string(1068));
  1014.           mpl(5);
  1015.           input(s3,5);
  1016.           network=atoi(s3);
  1017.  
  1018.           if ((network-1) < net_num_max) {
  1019. /* Packscan freq.  Others would also go here. */
  1020.             nl();
  1021.             sprintf(s3,"FILEREQ /F:%s /C:1 /A:%s /N:%d",s2,s1,network-1);
  1022.             extern_prog(s3, EFLAG_SHRINK);
  1023.             topscreen();
  1024.             nl();
  1025.             done=1;
  1026.           }
  1027.         } else
  1028.           done=2;
  1029.         break;
  1030.       case 'S':
  1031.         done=2;
  1032.         break;
  1033.       case 13:
  1034.       case ' ':
  1035.       case 'D':
  1036.         done=1;
  1037.         break;
  1038.     }
  1039.   } while (!done);
  1040.   return(done);
  1041. }
  1042.  
  1043.  
  1044. int getnetnum(char *netnam)
  1045. {
  1046.   int i,matched=0;
  1047.  
  1048.   for (i=0; i<net_num_max; i++) {
  1049.     if (stricmp(net_networks[i].name, netnam)==0) {
  1050.       matched=1;
  1051.       break;
  1052.     }
  1053.   }
  1054.   if (!matched)
  1055.     i=atoi(netnam);
  1056.   return(i);
  1057. }
  1058.