home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / WWIVSOR.ZIP / MULTMAIL.C < prev    next >
C/C++ Source or Header  |  1995-04-25  |  8KB  |  391 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1995 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. #include <dir.h>
  22.  
  23.  
  24.  
  25. #define ALLOW_FULLSCREEN 1
  26. #define EMAIL_STORAGE 2
  27.  
  28.  
  29. void multimail(int *un, int numu)
  30. {
  31.   int i,i1,f,len,cv;
  32.   mailrec m,m1;
  33.   char s[81],t[81];
  34.   userrec ur;
  35.   slrec ss;
  36.  
  37.   if (freek1(syscfg.msgsdir)<10.0) {
  38.     nl();
  39.     pl(get_string(332));
  40.     nl();
  41.     return;
  42.   }
  43.   nl();
  44.   ss=syscfg.sl[actsl];
  45.  
  46.   if (ss.ability & ability_email_anony)
  47.     i=anony_enable_anony;
  48.   else
  49.     i=0;
  50.   m.msg.storage_type=EMAIL_STORAGE;
  51.   strcpy(irt,get_string(333));
  52.   irt_name[0]=0;
  53.   unlink("quotes.txt");
  54.   inmsg(&m.msg,t,&i,1,"EMAIL",ALLOW_FULLSCREEN, get_string(333), 0);
  55.   if (m.msg.stored_as==0xffffffff)
  56.     return;
  57.   strcpy(m.title,t);
  58.  
  59.   pl(get_string(334));
  60.   sysoplog(get_stringx(1,20));
  61.  
  62.   for (cv=0; cv<numu; cv++) {
  63.     if (un[cv]<0)
  64.       continue;
  65.     read_user(un[cv],&ur);
  66.     if (((ur.sl==255) && (ur.waiting>(syscfg.maxwaiting * 5))) ||
  67.         ((ur.sl!=255) && (ur.waiting>syscfg.maxwaiting)) ||
  68.         (ur.waiting>200)) {
  69.       outstr(nam(&ur,un[cv]));
  70.       outstr(get_string(335));
  71.       un[cv]=-1;
  72.       continue;
  73.     }
  74.     if (ur.inact & inact_deleted) {
  75.       pl(get_string(336));
  76.       un[cv]=-1;
  77.       continue;
  78.     }
  79.  
  80.     strcpy(s,"   ");
  81.     ++ur.waiting;
  82.     write_user(un[cv],&ur);
  83.     if (un[cv]==1)
  84.       ++fwaiting;
  85.     strcat(s,nam(&ur,un[cv]));
  86.     lock_status();
  87.     if (un[cv]==1)  {
  88.       ++status.fbacktoday;
  89.       ++thisuser.feedbacksent;
  90.       ++thisuser.fsenttoday1;
  91.       ++fsenttoday;
  92.     } else {
  93.       ++status.emailtoday;
  94.       ++thisuser.etoday;
  95.       ++thisuser.emailsent;
  96.     }
  97.     save_status();
  98.     sysoplog(s);
  99.     pl(s);
  100.   }
  101.  
  102.   m.anony=i;
  103.   m.fromsys=0;
  104.   m.fromuser=usernum;
  105.   m.tosys=0;
  106.   m.touser=0;
  107.   m.status=status_multimail;
  108.   time((long *)&(m.daten));
  109.  
  110.   f=open_email(1);
  111.   len=(int) filelength(f)/sizeof(mailrec);
  112.   if (len==0)
  113.     i=0;
  114.   else {
  115.     i=len-1;
  116.     sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  117.     sh_read(f,(void *)&m1,sizeof(mailrec));
  118.     while ((i>0) && (m1.tosys==0) && (m1.touser==0)) {
  119.       --i;
  120.       sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  121.       i1=sh_read(f,(void *)&m1,sizeof(mailrec));
  122.       if (i1==-1)
  123.         pl(get_string(1193));
  124.     }
  125.     if ((m1.tosys) || (m1.touser))
  126.       ++i;
  127.   }
  128.   sh_lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  129.   for (cv=0; cv<numu; cv++) {
  130.     if (un[cv]>0) {
  131.       m.touser=un[cv];
  132.       sh_write(f,(void *)&m,sizeof(mailrec));
  133.     }
  134.   }
  135.   sh_close(f);
  136.   if (!wfc)
  137.     topscreen();
  138. }
  139.  
  140.  
  141. char *mml_s;
  142. int mml_started;
  143.  
  144.  
  145. int oneuser(void)
  146. {
  147.   char s[81],*ss;
  148.   unsigned short un,sn,i;
  149.   userrec u;
  150.  
  151.   if (mml_s) {
  152.     if (mml_started)
  153.       ss=strtok(NULL,"\r\n");
  154.     else
  155.       ss=strtok(mml_s,"\r\n");
  156.     mml_started=1;
  157.     if (ss==NULL) {
  158.       bbsfree(mml_s);
  159.       mml_s=NULL;
  160.       return(-1);
  161.     }
  162.     strcpy(s,ss);
  163.     for (i=0; s[i]!=0; i++)
  164.       s[i]=upcase(s[i]);
  165.   } else {
  166.     prt(2,">");
  167.     input(s,40);
  168.   }
  169.   un=finduser1(s);
  170.   if (un==65535)
  171.     return(-1);
  172.   if (s[0]==0)
  173.     return(-1);
  174.   if (un<=0) {
  175.     nl();
  176.     pl(get_string(8));
  177.     nl();
  178.     return(0);
  179.   }
  180.   sn=0;
  181.   if (forwardm(&un,&sn)) {
  182.     nl();
  183.     pl(get_string(337));
  184.     nl();
  185.     if (sn) {
  186.       pl(get_string(338));
  187.       pl(get_string(339));
  188.       nl();
  189.       return(0);
  190.     }
  191.   }
  192.   if (un==0) {
  193.     nl();
  194.     pl(get_string(8));
  195.     nl();
  196.     return(0);
  197.   }
  198.   read_user(un,&u);
  199.   if (((u.sl==255) && (u.waiting>(syscfg.maxwaiting * 5))) ||
  200.       ((u.sl!=255) && (u.waiting>syscfg.maxwaiting)) ||
  201.       (u.waiting>200)) {
  202.     nl();
  203.     pl(get_string(340));
  204.     nl();
  205.     return(0);
  206.   }
  207.   if (u.inact & inact_deleted) {
  208.     nl();
  209.     pl(get_string(341));
  210.     nl();
  211.     return(0);
  212.   }
  213.   sprintf(s,"     -> %s",nam(&u,un));
  214.   pl(s);
  215.   return(un);
  216. }
  217.  
  218.  
  219. void add_list(int *un, int *numu, int maxu, int allowdup)
  220. {
  221.   int i,i1,done, mml;
  222.  
  223.   done=0;
  224.   mml=(mml_s!=NULL);
  225.   mml_started=0;
  226.   while ((!done) && (!hangup) && (*numu<maxu)) {
  227.     i=oneuser();
  228.     if (mml && (!mml_s))
  229.       done=1;
  230.     if (i==-1)
  231.       done=1;
  232.     else
  233.       if (i) {
  234.         if (!allowdup)
  235.           for (i1=0; i1<*numu; i1++)
  236.             if (un[i1]==i) {
  237.               nl();
  238.               pl(get_string(342));
  239.               nl();
  240.               i=0;
  241.             }
  242.         if (i)
  243.           un[(*numu)++]=i;
  244.       }
  245.   }
  246.   if (*numu==maxu) {
  247.     nl();
  248.     pl(get_string(343));
  249.     nl();
  250.   }
  251. }
  252.  
  253.  
  254. #define MAX_LIST 40
  255.  
  256.  
  257. void slash_e(void)
  258. {
  259.   int un[MAX_LIST],numu,done,i,i1,f1;
  260.   char s[81],s1[81],ch,*sss;
  261.   slrec ss;
  262.   userrec u;
  263.   struct ffblk ff;
  264.  
  265.   mml_s=NULL;
  266.   mml_started=0;
  267.   ss=syscfg.sl[actsl];
  268.   if (freek1(syscfg.msgsdir)<10.0) {
  269.     nl();
  270.     pl(get_string(332));
  271.     nl();
  272.     return;
  273.   }
  274.   if (((fsenttoday>=5) || (thisuser.fsenttoday1>=10) ||
  275.     (thisuser.etoday>=ss.emails)) && (!cs())) {
  276.     pl(get_string(344));
  277.     return;
  278.   }
  279.   if (restrict_email & thisuser.restrict) {
  280.     pl(get_string(345));
  281.     return;
  282.   }
  283.   done=0;
  284.   numu=0;
  285.   do {
  286.     nln(2);
  287.     if (menu_on()) {
  288.       rip_saveall();
  289.       printmenu(12);
  290.     }
  291.     prt(2,get_string(346));
  292.     ch=onek("QAMDEL?");
  293.     if (menu_on())
  294.       rip_restoreall();
  295.     switch(ch) {
  296.       case '?':
  297.         printmenu(12);
  298.         break;
  299.       case 'Q':
  300.         done=1;
  301.         break;
  302.       case 'A':
  303.         nl();
  304.         pl(get_string(347));
  305.         nl();
  306.         helpl=5;
  307.         mml_s=NULL;
  308.         add_list(un,&numu,MAX_LIST,so());
  309.         break;
  310.       case 'M':
  311.         sprintf(s,"%s*.MML",syscfg.datadir);
  312.         f1=findfirst(s,&ff,0);
  313.         if (f1) {
  314.           nl();
  315.           pl(get_string(348));
  316.           nl();
  317.           break;
  318.         }
  319.         nl();
  320.         pl(get_string(349));
  321.         nl();
  322.         while (f1==0) {
  323.           strcpy(s,ff.ff_name);
  324.           sss=strchr(s,'.');
  325.           if (sss)
  326.             *sss=0;
  327.           pl(s);
  328.  
  329.           f1=findnext(&ff);
  330.         }
  331.  
  332.         nl();
  333.         prt(2,get_string(297));
  334.         input(s,8);
  335.  
  336.         sprintf(s1,"%s%s.MML",syscfg.datadir,s);
  337.         i=sh_open1(s1,O_RDONLY | O_BINARY);
  338.         if (i<0) {
  339.           nl();
  340.           pl(get_string(350));
  341.           nl();
  342.         } else {
  343.           i1=filelength(i);
  344.           mml_s=malloca(i1+10L);
  345.           sh_read(i,mml_s,i1);
  346.           mml_s[i1]='\n';
  347.           mml_s[i1+1]=0;
  348.           sh_close(i);
  349.           mml_started=0;
  350.           add_list(un,&numu,MAX_LIST,so());
  351.           if (mml_s) {
  352.             bbsfree(mml_s);
  353.             mml_s=NULL;
  354.           }
  355.         }
  356.         break;
  357.       case 'E':
  358.         if (!numu) {
  359.           nl();
  360.           pl(get_string(351));
  361.           nl();
  362.         } else {
  363.           multimail(un,numu);
  364.           done=1;
  365.         }
  366.         break;
  367.       case 'D':
  368.         if (numu) {
  369.           nl();
  370.           prt(2,get_string(352));
  371.           input(s,2);
  372.           i=atoi(s);
  373.           if ((i>0) && (i<=numu)) {
  374.             --numu;
  375.             for (i1=i-1; i1<numu; i1++)
  376.               un[i1]=un[i1+1];
  377.           }
  378.         }
  379.         break;
  380.       case 'L':
  381.         for (i=0; i<numu; i++) {
  382.           read_user(un[i],&u);
  383.           npr("%d. %s\r\n",i+1,nam(&u,un[i]));
  384.         }
  385.         break;
  386.     }
  387.   } while ((!done) && (!hangup));
  388. }
  389.  
  390.  
  391.