home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / UEDIT.C < prev    next >
Text File  |  1992-08-25  |  20KB  |  839 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. *****************************************************************************/
  7.  
  8. #include "vars.h"
  9.  
  10. #pragma hdrstop
  11.  
  12. void deluser(int un)
  13. {
  14.   userrec u;
  15.   int i,i1,f,n;
  16.   mailrec m;
  17.   char fn[81];
  18.   votingrec v;
  19.   voting_response vr;
  20.  
  21.   read_user(un,&u);
  22.   if ((u.inact & inact_deleted)==0) {
  23.     rsm(un,&u);
  24.     dsr(u.name);
  25.     u.inact |= inact_deleted;
  26.     u.waiting=0;
  27.     write_user(un,&u);
  28.     sprintf(fn,"%sEMAIL.DAT",syscfg.datadir);
  29.     f=open(fn,O_RDWR | O_BINARY, S_IREAD | S_IWRITE);
  30.     if (f>0) {
  31.       i1=filelength(f)/sizeof(mailrec);
  32.       for (i=0; i<i1; i++) {
  33.         lseek(f,((long) i) * sizeof(mailrec), SEEK_SET);
  34.         read(f,(void *)(&m),sizeof(mailrec));
  35.         if (((m.tosys==0) && (m.touser==un)) ||
  36.             ((m.fromsys==0) && (m.fromuser==un))) {
  37.           delmail(f,i);
  38.         }
  39.       }
  40.     }
  41.     close(f);
  42.     sprintf(fn,"%sVOTING.DAT",syscfg.datadir);
  43.     f=open(fn,O_RDWR | O_BINARY, S_IREAD | S_IWRITE);
  44.     n=(int) (filelength(f) / sizeof(votingrec)) -1;
  45.     for (i=0; i<20; i++)
  46.       if (u.votes[i]) {
  47.         if (i<=n) {
  48.           lseek(f,((long) i) * sizeof(votingrec), SEEK_SET);
  49.           read(f,(void *)&v,sizeof(votingrec));
  50.           vr=v.responses[u.votes[i]-1];
  51.           vr.numresponses--;
  52.           v.responses[u.votes[i]-1]=vr;
  53.           lseek(f,((long) i) * sizeof(votingrec), SEEK_SET);
  54.           write(f,(void *)&v,sizeof(votingrec));
  55.         }
  56.         u.votes[i]=0;
  57.       }
  58.     write_user(un,&u);
  59.     close(f);
  60.   }
  61. }
  62.  
  63. void print_data(int un, userrec *u, int lng)
  64. {
  65.   char s[81],s1[81],s2[81],s3[81],s4[81];
  66.   int i;
  67.  
  68.   outchr(12);
  69.   if ((u->inact) & inact_deleted) {
  70.     pl(">>> DELETED <<<");
  71.     nl(); }
  72.   npr("1[7A1] fName1: f%-30s 1[7B1] fRN  1: f%s %s\r\n",nam(u,un),(u->realname),u->lastname);
  73.   npr("1[7C1] fAdd 1: f%-30s 1[7D1] fCity1: f%s\r\n",u->stretadd,u->citstate);
  74.   npr("1[7E1] fZip 1: f%-30ld 1[7F1] fPH  1: f%s\r\n",u->wwiv_regnum,(u->phone));
  75.   npr("1[7G1] fAge 1: f%d %c 1(7%02d1/7%02d1/7%02d1)\r\n", u->age, u->sex,u->month, u->day, u->year);
  76.   nl();
  77.   if (u->forwardsys)
  78.     npr("f[eHf] eCompf: e%-30s f[ ] eForwf: #e%d f@e%d\r\n",&(ctypes[u->comp_type][0]),u->forwardusr, u->forwardsys);
  79.   else
  80.     npr("f[eHf] eCompf: e%-30s f[ ] eForwf: #e%d\r\n",&(ctypes[u->comp_type][0]),u->forwardusr);
  81.   if (thisuser.sl==255)
  82.   npr("f[eIf] ePW  f: e%-30s f[eJf] eLastf: e%s   %s\r\n",u->pw,(u->laston),(u->firston));
  83.   else
  84.   npr("f[eIf] ePW  f: e■■■■■■■■■                      f[eJf] eLastf: e%s   %s\r\n",(u->laston),(u->firston));
  85.   if (u->emailnet)
  86.     npr("f[eKf] eMsgsf: ePostedf=e%d Ef-emailf=e%d Feedbackf=e%d Waitingf=e%d Net Mailf=e%d\r\n",u->msgpost, u->emailsent,u->feedbacksent, u->waiting, u->emailnet);
  87.   else
  88.     npr("f[eKf] eMsgsf: ePostedf=e%d Ef-emailf=e%d Feedbackf=e%d Waitingf=e%d\r\n",u->msgpost, u->emailsent,u->feedbacksent, u->waiting);
  89.   npr("f[eLf] eLog f: eTotal Logonsf:e%d  On Todayf:e%d  Illegal Logonsf:e%d\r\n",u->logons,(strcmp(u->laston,date()))?0:u->ontoday,u->illegal);
  90.   npr("f[eMf] eUpDnf: eFiles Uploadedf=e%df-e%ldk   Files Downloadedf=e%df-e%ldk\r\n",u->uploaded,u->uk,u->downloaded, u->dk);
  91.   npr("f[eNf] eBaudf: e%u\r\n", u->lastrate);
  92.   nl();
  93.   npr("2[cO2] cAss 2: c%-30d 2[cP2] cGold 2: c%d\r\n",u->ass_pts,(int) u->gold);
  94.   npr("2[cR2] cSL  2: c%-30d 2[cS2] cDSL 2: c%d\r\n",u->sl,u->dsl);
  95.   npr("2[cT2] cSub 2: c%-30d 2[cU2] cExemption 2: c%d\r\n",u->sysopsub,u->exempt);
  96.   npr("2[cV2] cUser's Tag2: c%s\r\n",(u->note));
  97.   strcpy(s3,restrict_string);
  98.   for (i=0; i<=15; i++) {
  99.     if (u->ar & (1 << i))
  100.       s[i]='A'+i;
  101.     else
  102.       s[i]=32;
  103.     if (u->dar & (1 << i))
  104.       s1[i]='A'+i;
  105.     else
  106.       s1[i]=32;
  107.     if (u->restrict & (1 << i))
  108.       s2[i]=s3[i];
  109.     else
  110.       s2[i]=32; }
  111.   s[16]=0;
  112.   s1[16]=0;
  113.   s2[16]=0;
  114.   npr("2[cW2] cAR  2: c%-30s",s);
  115.   npr(" 2[cX2] cDAR 2: c%s\r\n",s1);
  116.   npr("2[cY2] cRest2: c%-30s",s2);
  117.   npr(" 2[cZ2] cVoiced2: c%s\r\n", u->zipcode);
  118.   nl();
  119.   if (lng) {
  120.   pl("5[7,5]7>5Up7/5Down 1 User {7,5}7>5Search Up7/5Down .7>5Toggle Menu /7>5Search Specs");
  121.   pl("  5:7>5Clear B7-5Date     17>5Delete User    27>5Restore     37>5Go To User");
  122.   }
  123. }
  124.  
  125.  
  126. #ifdef OLD_SEARCH
  127.  
  128. int matchuser(int un)
  129. {
  130.   userrec u;
  131.   int ok;
  132.   long l;
  133.   unsigned int d;
  134.  
  135.   read_user(un,&u);
  136.   ok=1;
  137.  
  138.   if ((u.age>agemax) || (u.age<agemin))
  139.     ok=0;
  140.   if ((u.sl>slmax) || (u.sl<slmin))
  141.     ok=0;
  142.   if ((u.dsl>dslmax) || (u.dsl<dslmin))
  143.     ok=0;
  144.   if (ressex)
  145.     if (u.sex!=ressex)
  146.       ok=0;
  147.   if (arres)
  148.     if ((u.ar & arres)==0)
  149.       ok=0;
  150.   if (darres)
  151.     if ((u.dar & darres)==0)
  152.       ok=0;
  153.   time(&l);
  154.   d=(unsigned int)( (l-u.daten)/24.0/3600.0 );
  155.   if ((d>daysmax) || (d<daysmin))
  156.     ok=0;
  157.  
  158.   return(ok);
  159. }
  160.  
  161.  
  162. void changeopt()
  163. {
  164.   int done,i,i1;
  165.   char s[81],s1[81],s2[81],s3[81],ch;
  166.  
  167.   done=0;
  168.   do {
  169.     outchr(12);
  170.     npr("1. SL     : %d to %d\r\n",slmin, slmax);
  171.     npr("2. DSL    : %d to %d\r\n",dslmin, dslmax);
  172.     npr("3. AGE    : %d to %d\r\n",agemin, agemax);
  173.     npr("4. Last On: %d to %d days ago\r\n",daysmin, daysmax);
  174.     if (ressex) {
  175.       npr("5. Sex    : %c\r\n",ressex);
  176.     } else
  177.       pl("5. Sex    : Inactive");
  178.     s[0]=0;
  179.     s[1]=0;
  180.     s1[0]=0;
  181.     s1[1]=0;
  182.     for (i=0; i<16; i++) {
  183.       if ((1 << i) & arres)
  184.         s[0]='A'+i;
  185.       if ((1 << i) & darres)
  186.         s1[0]='A'+i;
  187.     }
  188.     if (s[0])
  189.       npr("6. AR     : %s\r\n",s);
  190.     else
  191.       pl("6. AR     : Inactive");
  192.     if (s1[0])
  193.       npr("7. DAR    : %s\r\n",s1);
  194.     else
  195.       pl("7. DAR    : Inactive");
  196.     nl();
  197.     prt(2,"Search Options (1-7,Q) : ");
  198.     ch=onek("Q1234567");
  199.     nl();
  200.     switch(ch) {
  201.       case 'Q':
  202.         done=1;
  203.         break;
  204.       case '1':
  205.         prt(2,"Min SL? ");
  206.         input(s,3);
  207.         if (s[0])
  208.           slmin=atoi(s);
  209.         prt(2,"Max SL? ");
  210.         input(s,3);
  211.         if (s[0])
  212.           slmax=atoi(s);
  213.         break;
  214.       case '2':
  215.         prt(2,"Min DSL? ");
  216.         input(s,3);
  217.         if (s[0])
  218.           dslmin=atoi(s);
  219.         prt(2,"Max DSL? ");
  220.         input(s,3);
  221.         if (s[0])
  222.           dslmax=atoi(s);
  223.         break;
  224.       case '3':
  225.         prt(2,"Min age? ");
  226.         input(s,3);
  227.         if (s[0])
  228.           agemin=atoi(s);
  229.         prt(2,"Max age? ");
  230.         input(s,3);
  231.         if (s[0])
  232.           agemax=atoi(s);
  233.         break;
  234.       case '4':
  235.         prt(2,"Min days since logon? ");
  236.         input(s,4);
  237.         if (s[0])
  238.           daysmin=atoi(s);
  239.         prt(2,"Max days since logon? ");
  240.         input(s,4);
  241.         if (s[0])
  242.           daysmax=atoi(s);
  243.         break;
  244.       case '5':
  245.         prt(2,"Sex restrict (spc=none) ? ");
  246.         ressex=onek(" MF");
  247.         if (ressex==32)
  248.           ressex=0;
  249.         break;
  250.       case '6':
  251.         prt(2,"AR restrict (spc=none) ? ");
  252.         s[0]=onek("ABCDEFGHIJKLMNOP ");
  253.         if (s[0])
  254.           arres=1 << (s[0]-'A');
  255.         else
  256.           arres=0;
  257.         break;
  258.       case '7':
  259.         prt(2,"DAR restrict (spc=none) ? ");
  260.         s[0]=onek("ABCDEFGHIJKLMNOP ");
  261.         if (s[0])
  262.           darres=1 << (s[0]-'A');
  263.         else
  264.           darres=0;
  265.         break;
  266.     }
  267.   } while ((!done) && (!hangup));
  268. }
  269.  
  270.  
  271. #else
  272. /****************************************************************************/
  273.  
  274.  
  275.  
  276. int matchuser(int un)
  277. {
  278.   userrec u;
  279.  
  280.   read_user(un,&u);
  281.   sp=search_pattern;
  282.   return(match_user(&u));
  283. }
  284.  
  285.  
  286. int match_user(userrec *u)
  287. {
  288.   int ok=1,not=0,done=0,less=0,cpf=0,cpp=0,and=1,gotfcn=0,evalit=0,tmp,tmp1,tmp2;
  289.   char fcn[12],parm[12];
  290.   long l;
  291.  
  292.   do {
  293.     if (*sp==0)
  294.       done=1;
  295.     else {
  296.       if (strchr("()|&!<>",*sp)) {
  297.         switch(*sp++) {
  298.           case '(':
  299.             evalit=2;
  300.             break;
  301.           case ')':
  302.             done=1;
  303.             break;
  304.           case '|':
  305.             and=0;
  306.             break;
  307.           case '&':
  308.             and=1;
  309.             break;
  310.           case '!':
  311.             not=1;
  312.             break;
  313.           case '<':
  314.             less=1;
  315.             break;
  316.           case '>':
  317.             less=0;
  318.             break;
  319.         }
  320.       } else if (*sp=='[') {
  321.         gotfcn=1;
  322.         sp++;
  323.       } else if (*sp==']') {
  324.         evalit=1;
  325.         ++sp;
  326.       } else if (*sp!=' ') {
  327.         if (gotfcn) {
  328.           if (cpp<10)
  329.             parm[cpp++]=*sp++;
  330.         } else {
  331.           if (cpf<10)
  332.             fcn[cpf++]=*sp++;
  333.         }
  334.       } else
  335.         ++sp;
  336.       if (evalit) {
  337.         if (evalit==1) {
  338.           fcn[cpf]=0;
  339.           parm[cpp]=0;
  340.           tmp=1;
  341.           tmp1=atoi(parm);
  342.  
  343.           if (!strcmp(fcn,"SL")) {
  344.             if (less)
  345.               tmp=(tmp1>u->sl);
  346.             else
  347.               tmp=(tmp1<u->sl);
  348.           } else if (!strcmp(fcn,"DSL")) {
  349.             if (less)
  350.               tmp=(tmp1>u->dsl);
  351.             else
  352.               tmp=(tmp1<u->dsl);
  353.           } else if (!strcmp(fcn,"AR")) {
  354.             if ((parm[0]>='A') && (parm[0]<='P')) {
  355.               tmp1=1 << (parm[0]-'A');
  356.               if (u->ar & tmp1)
  357.                 tmp=1;
  358.               else
  359.                 tmp=0;
  360.             } else
  361.               tmp=0;
  362.           } else if (!strcmp(fcn,"DAR")) {
  363.             if ((parm[0]>='A') && (parm[0]<='P')) {
  364.               tmp1=1 << (parm[0]-'A');
  365.               if (u->dar & tmp1)
  366.                 tmp=1;
  367.               else
  368.                 tmp=0;
  369.             } else
  370.               tmp=0;
  371.           } else if (!strcmp(fcn,"SEX")) {
  372.             tmp=parm[0]==u->sex;
  373.           } else if (!strcmp(fcn,"AGE")) {
  374.             if (less)
  375.               tmp=(tmp1>u->age);
  376.             else
  377.               tmp=(tmp1<u->age);
  378.           } else if (!strcmp(fcn,"LASTON")) {
  379.             time(&l);
  380.             tmp2=(unsigned int)( (l-u->daten)/24.0/3600.0 );
  381.             if (less)
  382.               tmp=tmp2<tmp1;
  383.             else
  384.               tmp=tmp2>tmp1;
  385.           } else if (!strcmp(fcn,"AREACODE")) {
  386.             tmp=(!strncmp(parm,u->phone,3));
  387.           } else if (!strcmp(fcn,"RESTRICT")) {
  388.             ;
  389.           } else if (!strcmp(fcn,"LOGONS")) {
  390.             if (less)
  391.               tmp=thisuser.logons<tmp1;
  392.             else
  393.               tmp=thisuser.logons>tmp1;
  394.           }
  395.  
  396.         } else
  397.           tmp=match_user(u);
  398.  
  399.         if (not)
  400.           tmp=!tmp;
  401.         if (and)
  402.           ok = ok && tmp;
  403.         else
  404.           ok = ok || tmp;
  405.  
  406.         not=less=cpf=cpp=gotfcn=evalit=0;
  407.         and=1;
  408.       }
  409.     }
  410.   } while (!done);
  411.   return(ok);
  412. }
  413.  
  414. /****************************************************************************/
  415.  
  416. void changeopt()
  417. {
  418.   helpl=42;
  419.   outchr(12);
  420.   pl("Current search string:");
  421.   if (search_pattern[0])
  422.     pl(search_pattern);
  423.   else
  424.     pl("-NONE-");
  425.   nl();
  426.   nl();
  427.   prt(5,"Change it? ");
  428.   if (yn()) {
  429.     pl("Enter new search pattern:");
  430.     prt(2,":");
  431.     input(search_pattern,75);
  432.   }
  433.   helpl=0;
  434. }
  435.  
  436.  
  437. /****************************************************************************/
  438.  
  439. #endif
  440.  
  441. #pragma warn -par
  442.  
  443. void uedit(int usern, int other)
  444. {
  445.  char s[81],s1[81],s2[81],ch,ch1;
  446.  int i,i1,i2,i3,l,un,done,nu,done1,full,temp_full,tempu;
  447.  userrec u;
  448.  
  449.  nl();
  450.  prt(2,"PW: ");
  451.  echo=0;
  452.  input(s,20);
  453.  echo=1;
  454.  if (strcmp(s,("PASSWORD"))==0) {
  455.   if (incom)
  456.     full=0;
  457.   else
  458.     full=1;
  459.   un=usern;
  460.   done=0;
  461.   read_user(un,&u);
  462.   nu=number_userrecs();
  463.   do {
  464.     read_user(un,&u);
  465.     done1=0;
  466.     temp_full=0;
  467.     do {
  468.       print_data(un,&u, ((full) || (temp_full)));
  469.       nl();
  470.       prt(2,"Uedit : ");
  471.       if ((thisuser.sl==255) || (wfc))
  472.     ch=onek("[]{}/,.:123ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  473.       else
  474.     ch=onek("[]{}/,.:123ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  475.       switch(ch) {
  476.         case ']':
  477.           ++un;
  478.           if (un>nu)
  479.             un=1;
  480.           done1=1;
  481.           break;
  482.         case '[':
  483.           --un;
  484.           if (un==0)
  485.             un=nu;
  486.           done1=1;
  487.       break;
  488.         case '}':
  489.           tempu=un;
  490.           ++un;
  491.           if (un>nu)
  492.             un=1;
  493.           while ((un!=tempu) && (!matchuser(un))) {
  494.             ++un;
  495.             if (un>nu)
  496.               un=1;
  497.           }
  498.           done1=1;
  499.           break;
  500.         case '{':
  501.           tempu=un;
  502.           --un;
  503.           if (un<1)
  504.             un=nu;
  505.           while ((un!=tempu) && (!matchuser(un))) {
  506.             --un;
  507.             if (un<1)
  508.               un=nu;
  509.           }
  510.           done1=1;
  511.       break;
  512.     case '/':
  513.           changeopt();
  514.           break;
  515.     case ',':
  516.           temp_full=(!temp_full);
  517.       break;
  518.         case '.':
  519.           full=(!full);
  520.           temp_full=full;
  521.       break;
  522.     case ':':
  523.       u.year=0;
  524.       write_user(un,&u);
  525.       break;
  526.     case '1':
  527.       if (((u.inact & inact_deleted)==0) && (actsl>u.sl)) {
  528.         prt(5,"Delete? ");
  529.         if (yn()) {
  530.           deluser(un);
  531.           read_user(un,&u);
  532.         }
  533.       }
  534.       break;
  535.     case '2':
  536.       if (u.inact & inact_deleted) {
  537.         u.inact ^= inact_deleted;
  538.         isr(un,u.name);
  539.             write_user(un,&u);
  540.           }
  541.           break;
  542.     case '3':
  543.       nl();
  544.       prt(2,"User name/number: ");
  545.       input(s,30);
  546.       i=finduser1(s);
  547.       if (i>0) {
  548.         un=i;
  549.         done1=1;
  550.       }
  551.       break;
  552.     case 'A':
  553.       nl();
  554.       prt(2,"New Alias? ");
  555.           input(s,30);
  556.           if (s[0]) {
  557.             if (finduser(s)<1) {
  558.               dsr(u.name);
  559.               strcpy(u.name,s);
  560.               isr(un,u.name);
  561.               write_user(un,&u);
  562.             }
  563.           }
  564.           break;
  565.     case 'B':
  566.           nl();
  567.       prt(2,"New first name? ");
  568.       inputf(s,20);
  569.       if (s[0]) {
  570.         strcpy(u.realname,s);
  571.         write_user(un,&u);
  572.       }
  573.       nl();
  574.       prt(2,"New last name?");
  575.       inputf(s,20);
  576.       if (s[0]) {
  577.         strcpy(u.lastname,s);
  578.         write_user(un,&u);
  579.       }
  580.       break;
  581.     case 'C':
  582.       nl();
  583.       prt(2,"New address? ");
  584.       inputf(s,37);
  585.       if (s[0]) {
  586.         strcpy(u.stretadd,s);
  587.         write_user(un,&u);
  588.       }
  589.       break;
  590.     case 'D':
  591.       nl();
  592.       prt(2,"New city? ");
  593.       inputf(s,20);
  594.       if (s[0]) {
  595.         strcpy(u.citstate,s);
  596.         write_user(un,&u);
  597.       }
  598.       break;
  599.     case 'E':
  600.       nl();
  601.       prt(1,"New zipcode? ");
  602.       inputf(s,5);
  603.       l=atol(s);
  604.       if ((s[0]) && (l>=0))
  605.         u.wwiv_regnum = l;
  606.       write_user(un,&u);
  607.       break;
  608.     case 'F':
  609.       nl();
  610.       prt(2,"New phone number? ");
  611.       input(s,12);
  612.       if (s[0]) {
  613.         strcpy(u.phone,s);
  614.         write_user(un,&u);
  615.       }
  616.       break;
  617.     case 'G':
  618.       nl();
  619.       outstr("Gender (M,F) :");
  620.       u.sex=onek("MF");
  621.       sprintf(s,"Current birthdate: %02d/%02d/%02d",(int) u.month,
  622.          (int) u.day,
  623.          (int) u.year);
  624.       pl(s);
  625.       input_age(&u);
  626.       write_user(un,&u);
  627.       break;
  628.     case 'H':
  629.       nl();
  630.       pl("Known computer types:");
  631.       nl();
  632.       for (i=0; ctypes[i]; i++)
  633.         npr("%d. %s\r\n",i+1,ctypes[i]);
  634.       nl();
  635.       prt(2,"Enter new computer type: ");
  636.       input(s,2);
  637.       i1=atoi(s);
  638.       if ((i1>0) && (i1<=i)) {
  639.         u.comp_type=i1-1;
  640.         if (checkcomp("Ami"))
  641.           u.colors[0]=4;
  642.         else
  643.           u.colors[0]=7;
  644.         write_user(un,&u);
  645.       }
  646.       break;
  647.     case 'I':
  648.       nl();
  649.       prt(5,"Change password? ");
  650.       if (yn()) {
  651.         nl();
  652.         prt(1,"Enter new password :");
  653.         input(s,8);
  654.         strcpy(u.pw,s);
  655.         write_user(un,&u);
  656.         }
  657.       break;
  658.     case 'K':
  659.       nl();
  660.       prt(1,"Enter Messages Posted :");
  661.       input(s,4);
  662.       i=atoi(s);
  663.         u.msgpost=i;
  664.         write_user(un,&u);
  665.       break;
  666.     case 'L':
  667.       nl();
  668.       prt(1,"Enter new total logons :");
  669.       input(s,4);
  670.       i=atoi(s);
  671.         u.logons=i;
  672.         write_user(un,&u);
  673.       break;
  674.     case 'N':
  675.       nl();
  676.       prt(1,"Enter New Baud Rate :");
  677.       input(s,4);
  678.       i=atoi(s);
  679.       u.lastrate=i;
  680.       write_user(un,&u);
  681.       break;
  682.     case 'O':
  683.       nl();
  684.       prt(1,"Enter new ass points :");
  685.       input(s,3);
  686.       i=atoi(s);
  687.         u.ass_pts=i;
  688.         write_user(un,&u);
  689.       break;
  690.     case 'P':
  691.       nl();
  692.       npr("1Amount of gold in account2?\r\n5[7Current1=2%d5]\r\n", (int) u.gold);
  693.       mpl(5);
  694.       input(s,5);
  695.       i=atoi(s);
  696.       if (s[0]) {
  697.         u.gold=i;
  698.         write_user(un,&u);
  699.       }
  700.       break;
  701.     case 'Q':
  702.           done=1;
  703.           done1=1;
  704.           break;
  705.     case 'R':
  706.       if (u.sl==255)
  707.         break;
  708.       if (u.sl>=actsl)
  709.         break;
  710.       nl();
  711.       prt(2,"New SL? ");
  712.       input(s,3);
  713.       i=atoi(s);
  714.       if ((!wfc) && (i>=actsl))
  715.         i=-1;
  716.       if ((i>=0) && (i<255) && (s[0])) {
  717.         u.sl=i;
  718.         write_user(un,&u);
  719.         if (un==usernum)
  720.           actsl=i;
  721.       }
  722.       break;
  723.     case 'S':
  724.       if (u.dsl==255)
  725.         break;
  726.       if (u.dsl>=thisuser.dsl)
  727.         break;
  728.           nl();
  729.           prt(2,"New DSL? ");
  730.           input(s,3);
  731.           i=atoi(s);
  732.           if ((!wfc) && (i>=thisuser.dsl))
  733.             i=-1;
  734.           if ((i>=0) && (i<255) && (s[0])) {
  735.             u.dsl=i;
  736.             write_user(un,&u);
  737.           }
  738.       break;
  739.     case 'T':
  740.       nl();
  741.       prt(2,"New sysop sub? ");
  742.       input(s,3);
  743.       i=atoi(s);
  744.       if ((i>=0) && (i<=255) && (s[0])) {
  745.         u.sysopsub=i;
  746.         write_user(un,&u);
  747.       }
  748.       break;
  749.     case 'U':
  750.       nl();
  751.       prt(2,"New Exemption? ");
  752.       input(s,3);
  753.       i=atoi(s);
  754.       if ((i>=0) && (i<=255) && (s[0])) {
  755.         u.exempt=i;
  756.         write_user(un,&u);
  757.       }
  758.       break;
  759.     case 'V':
  760.       nl();
  761.       prt(1,"New Tag? ");
  762.           inputl(s,39);
  763.           strcpy(u.note,s);
  764.           write_user(un,&u);
  765.       break;
  766.     case 'W':
  767.       nl();
  768.       prt(2,"Toggle which AR? ");
  769.       ch1=onek("\rABCDEFGHIJKLMNOP");
  770.       if (ch1!=13) {
  771.         ch1-='A';
  772.         if ((wfc) || (thisuser.ar & (1 << ch1))) {
  773.           u.ar ^= (1 << ch1);
  774.           write_user(un,&u);
  775.         }
  776.       }
  777.       break;
  778.     case 'X':
  779.       nl();
  780.       prt(2,"Toggle which DAR? ");
  781.       ch1=onek("\rABCDEFGHIJKLMNOP");
  782.       if (ch1!=13) {
  783.         ch1-='A';
  784.         if ((wfc) || (thisuser.dar & (1 << ch1))) {
  785.           u.dar ^= (1 << ch1);
  786.           write_user(un,&u);
  787.         }
  788.       }
  789.       break;
  790.     case 'Y':
  791.       nl();
  792.       npr("        %s\r\n",restrict_string);
  793.       do {
  794.             prt(2,"Toggle? ");
  795.             s[0]=13;
  796.         s[1]='?';
  797.             strcpy(&(s[2]),restrict_string);
  798.             ch1=onek(s);
  799.             if (ch1==32)
  800.               ch1=13;
  801.         if (ch1=='?')
  802.           printmenu(10);
  803.             if ((ch1!=13) && (ch1!='?')) {
  804.               i=-1;
  805.               for (i1=0; i1<16; i1++)
  806.                 if (ch1==s[i1+2])
  807.                   i=i1;
  808.               if (i>-1) {
  809.                 u.restrict ^= (1 << i);
  810.                 write_user(un,&u);
  811.               }
  812.             }
  813.       } while ((!hangup) && (ch1=='?'));
  814.       break;
  815.     case 'Z':
  816.       nl();
  817.       prt(2,"Has the user been voiced? ");
  818.       input(s,6);
  819.       if (s[0]) {
  820.         strcpy(u.zipcode,s);
  821.         write_user(un,&u);
  822.       } else {
  823.         prt(5,"Delete answer? ");
  824.         if (yn()) {
  825.           u.zipcode[0]=0;
  826.           write_user(un,&u);
  827.         }
  828.       }
  829.       break;
  830.       }
  831.     } while ((!done1) && (!hangup));
  832.   } while ((!done) && (!hangup));
  833.   close_user();
  834.   if (!wfc)
  835.     topscreen();
  836.  }
  837. }
  838.  
  839. #pragma warn +par