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

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. *****************************************************************************/
  7. #include "vars.h"
  8. #pragma hdrstop
  9. #include <dir.h>
  10. #define ALLOW_FULLSCREEN 1
  11. #define EMAIL_STORAGE 2
  12.  
  13. void multimail(int *un, int numu)
  14. {
  15.   int i,i1,f,len,an,cv,ok;
  16.   mailrec m,m1;
  17.   char s[81],s1[81],t[81];
  18.   userrec ur;
  19.   slrec ss;
  20.  
  21.   if (freek1(syscfg.msgsdir)<10.0) {
  22.     nl();
  23.     pl("Sorry, not enough disk space left.");
  24.     nl();
  25.     return;
  26.   }
  27.   nl();
  28.   sprintf(s,"%sEMAIL.DAT",syscfg.datadir);
  29.   ss=syscfg.sl[actsl];
  30.   if (ss.ability & ability_email_anony)
  31.     i=anony_enable_anony;
  32.   else
  33.     i=0;
  34.   m.msg.storage_type=EMAIL_STORAGE;
  35.   strcpy(irt,"Multi-Mail");
  36.   irt_name[0]=0;
  37.   inmsg(&m.msg,t,&i,1,"EMAIL",ALLOW_FULLSCREEN);
  38.   if (m.msg.stored_as==0xffffffff)
  39.     return;
  40.   strcpy(m.title,t);
  41.   m.anony=i;
  42.   m.fromsys=0;
  43.   m.fromuser=usernum;
  44.   m.tosys=0;
  45.   m.touser=0;
  46.   m.status=status_multimail;
  47.   time((long *)&(m.daten));
  48.   f=open(s,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE);
  49.   len=(int) filelength(f)/sizeof(mailrec);
  50.   if (len==0)
  51.     i=0;
  52.   else {
  53.     i=len-1;
  54.     lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  55.     read(f,(void *)&m1,sizeof(mailrec));
  56.     while ((i>0) && (m1.tosys==0) && (m1.touser==0)) {
  57.       --i;
  58.       lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  59.       i1=read(f,(void *)&m1,sizeof(mailrec));
  60.       if (i1==-1)
  61.         pl("DIDN'T READ RIGHT.");
  62.     }
  63.     if ((m1.tosys) || (m1.touser))
  64.       ++i;
  65.   }
  66.   lseek(f,((long) (i))*(sizeof(mailrec)), SEEK_SET);
  67.   pl("Mail sent to:");
  68.   sysoplog("Multi-Mail to:");
  69.   for (cv=0; cv<numu; cv++) {
  70.     read_user(un[cv],&ur);
  71.     ok=1;
  72.     if (((ur.sl==255) && (ur.waiting>(syscfg.maxwaiting * 5))) ||
  73.         ((ur.sl!=255) && (ur.waiting>syscfg.maxwaiting)) ||
  74.         (ur.waiting>200)) {
  75.       npr("%s  mailbox full, not sent.\r\n",nam(&ur,un[cv]));
  76.       ok=0;
  77.     }
  78.     if (ur.inact & inact_deleted) {
  79.       npr("User #%d deleted, not sent.\r\n",un[cv]);
  80.       ok=0;
  81.     }
  82.     if (ok) {
  83.       m.touser=un[cv];
  84.       write(f,(void *)&m,sizeof(mailrec));
  85.       strcpy(s,"   ");
  86.       ++ur.waiting;
  87.       write_user(un[cv],&ur);
  88.       if (un[cv]==1)
  89.         ++fwaiting;
  90.       strcat(s,nam(&ur,un[cv]));
  91.       if (un[cv]==1)  {
  92.         ++status.fbacktoday;
  93.         ++thisuser.feedbacksent;
  94.     ++thisuser.fsenttoday1;
  95.     ++fsenttoday;
  96.       } else {
  97.         ++status.emailtoday;
  98.         ++thisuser.etoday;
  99.         ++thisuser.emailsent;
  100.       }
  101.       sysoplog(s);
  102.       pl(s);
  103.     }
  104.   }
  105.   close_user();
  106.   close(f);
  107.   save_status();
  108.   if (!wfc)
  109.     topscreen();
  110. }
  111.  
  112. char *mml_s;
  113. int mml_started;
  114.  
  115. int oneuser()
  116. {
  117.   char s[81],*ss;
  118.   unsigned short un,sn,i;
  119.   userrec u;
  120.  
  121.   if (mml_s) {
  122.     if (mml_started)
  123.       ss=strtok(NULL,"\r\n");
  124.     else
  125.       ss=strtok(mml_s,"\r\n");
  126.     mml_started=1;
  127.     if (ss==NULL) {
  128.       farfree(mml_s);
  129.       mml_s=NULL;
  130.       return(-1);
  131.     }
  132.     strcpy(s,ss);
  133.     for (i=0; s[i]!=0; i++)
  134.       s[i]=upcase(s[i]);
  135.   } else {
  136.     prt(2,">");
  137.     input(s,40);
  138.   }
  139.   un=finduser(s);
  140.   if (un==65535)
  141.     return(-1);
  142.   if (s[0]==0)
  143.     return(-1);
  144.   if (un<=0) {
  145.     nl();
  146.     pl("Unknown user.");
  147.     nl();
  148.     return(0);
  149.   }
  150.   sn=0;
  151.   if (forwardm(&un,&sn)) {
  152.     nl();
  153.     pl("Forwarded.");
  154.     nl();
  155.     if (sn) {
  156.       pl("Forwarded to another system.");
  157.       pl("Can't send multi-mail to another system.");
  158.       nl();
  159.       return(0);
  160.     }
  161.   }
  162.   if (un==0) {
  163.     nl();
  164.     pl("Unknown user.");
  165.     nl();
  166.     return(0);
  167.   }
  168.   read_user(un,&u);
  169.   if (((u.sl==255) && (u.waiting>(syscfg.maxwaiting * 5))) ||
  170.       ((u.sl!=255) && (u.waiting>syscfg.maxwaiting)) ||
  171.       (u.waiting>200)) {
  172.     nl();
  173.     pl("Mailbox full.");
  174.     nl();
  175.     return(0);
  176.   }
  177.   if (u.inact & inact_deleted) {
  178.     nl();
  179.     pl("Deleted user.");
  180.     nl();
  181.     return(0);
  182.   }
  183.   sprintf(s,"     -> %s",nam(&u,un));
  184.   pl(s);
  185.   return(un);
  186. }
  187.  
  188. void add_list(int *un, int *numu, int maxu, int allowdup)
  189. {
  190.   int i,i1,i2,done, mml;
  191.  
  192.   done=0;
  193.   mml=(mml_s!=NULL);
  194.   mml_started=0;
  195.   while ((!done) && (!hangup) && (*numu<maxu)) {
  196.     i=oneuser();
  197.     if (mml && (!mml_s))
  198.       done=1;
  199.     if (i==-1)
  200.       done=1;
  201.     else
  202.       if (i) {
  203.         if (!allowdup)
  204.           for (i1=0; i1<*numu; i1++)
  205.             if (un[i1]==i) {
  206.               nl();
  207.               pl("Already in list, not added.");
  208.               nl();
  209.               i=0;
  210.             }
  211.         if (i)
  212.           un[(*numu)++]=i;
  213.       }
  214.   }
  215.   if (*numu==maxu) {
  216.     nl();
  217.     pl("List full.");
  218.     nl();
  219.   }
  220. }
  221.  
  222. #define MAX_LIST 40
  223.  
  224. void slash_e()
  225. {
  226.   int un[MAX_LIST],numu,done,i,i1,f1;
  227.   char s[81],s1[81],ch,*sss;
  228.   slrec ss;
  229.   userrec u;
  230.   struct ffblk ff;
  231.  
  232.   mml_s=NULL;
  233.   mml_started=0;
  234.   ss=syscfg.sl[actsl];
  235.   if (freek1(syscfg.msgsdir)<10.0) {
  236.     nl();
  237.     pl("Sorry, not enough disk space left.");
  238.     nl();
  239.     return;
  240.   }
  241.   if (((fsenttoday>=5) || (thisuser.fsenttoday1>=10) ||
  242.     (thisuser.etoday>=ss.emails)) && (!cs())) {
  243.     pl("Too much mail sent today.");
  244.     return;
  245.   }
  246.   if (restrict_email & thisuser.restrict) {
  247.     pl("You can't send mail.");
  248.     return;
  249.   }
  250.   done=0;
  251.   numu=0;
  252.   do {
  253.     nl();
  254.     nl();
  255.     prt(2,"Multi-Mail: A,M,D,L,E,Q,? : ");
  256.     ch=onek("QAMDEL?");
  257.     switch(ch) {
  258.       case '?':
  259.         printmenu(12);
  260.         break;
  261.       case 'Q':
  262.         done=1;
  263.         break;
  264.       case 'A':
  265.         nl();
  266.         pl("Enter names/numbers for users, one per line, max 20.");
  267.         nl();
  268.         helpl=5;
  269.         mml_s=NULL;
  270.         add_list(un,&numu,MAX_LIST,so());
  271.         break;
  272.       case 'M':
  273.         sprintf(s,"%s*.MML",syscfg.datadir);
  274.         f1=findfirst(s,&ff,0);
  275.         if (f1) {
  276.           nl();
  277.           pl("No mailing lists available.");
  278.           nl();
  279.           break;
  280.         }
  281.         nl();
  282.         pl("Available mailing lists:");
  283.         nl();
  284.         while (f1==0) {
  285.           strcpy(s,ff.ff_name);
  286.           sss=strchr(s,'.');
  287.           if (sss)
  288.             *sss=0;
  289.           pl(s);
  290.  
  291.           f1=findnext(&ff);
  292.         }
  293.     nl();
  294.     prt(2,"Which? ");
  295.     input(s,8);
  296.     sprintf(s1,"%s%s.MML",syscfg.datadir,s);
  297.     i=open(s1,O_RDONLY | O_BINARY);
  298.     if (i<0) {
  299.       nl();
  300.       pl("Unknown mailing list.");
  301.       nl();
  302.     } else {
  303.       i1=filelength(i);
  304.       mml_s=malloca(i1+10L);
  305.       read(i,mml_s,i1);
  306.       mml_s[i1]='\n';
  307.       mml_s[i1+1]=0;
  308.       close(i);
  309.       mml_started=0;
  310.       add_list(un,&numu,MAX_LIST,so());
  311.       if (mml_s) {
  312.         farfree(mml_s);
  313.         mml_s=NULL;
  314.       }
  315.     }
  316.     break;
  317.       case 'E':
  318.         if (!numu) {
  319.           nl();
  320.           pl("Need to specify some users first - use A or M");
  321.           nl();
  322.         } else {
  323.           multimail(un,numu);
  324.           done=1;
  325.         }
  326.         break;
  327.       case 'D':
  328.         if (numu) {
  329.           nl();
  330.           prt(2,"Delete which? ");
  331.           input(s,2);
  332.           i=atoi(s);
  333.           if ((i>0) && (i<=numu)) {
  334.             --numu;
  335.             for (i1=i-1; i1<numu; i1++)
  336.               un[i1]=un[i1+1];
  337.           }
  338.         }
  339.         break;
  340.       case 'L':
  341.         for (i=0; i<numu; i++) {
  342.           read_user(un[i],&u);
  343.           npr("%d. %s\r\n",i+1,nam(&u,un[i]));
  344.         }
  345.         break;
  346.     }
  347.   } while ((!done) && (!hangup));
  348. }
  349.