home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / MULTMAIL.C < prev    next >
C/C++ Source or Header  |  1993-04-28  |  7KB  |  344 lines

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