home *** CD-ROM | disk | FTP | other *** search
/ The Arcade BBS / arcadebbs.zip / arcadebbs / bbstools / MODS / ALLMODS.ZIP / SPV067I.ZIP / SPV067I.MOD < prev   
Encoding:
Text File  |  1995-07-17  |  29.2 KB  |  711 lines

  1. SPV067I.MOD : Address book mod.  [Part 1 of 5]
  2. Papa Bear #1 @11579
  3.  
  4. ┌────────────────────────────A CEREBRUM RELEASE!─────────────────────────────┐
  5. │ Mod Name      : SPV067I.MOD       Mod Authors: Bull Ship  1@11132.wwivnet  │
  6. │ Difficulty    : ████▒▒▒▒▒▒                     Wyatt Earp 1@11131.wwivnet  │
  7. │ WWIV Version  : 4.24                           Pâpâ ßêâr  1@11579.wwivnet  │
  8. │ Mod Date      : 7/07/95                                                    │
  9. │ Files Affected: BBS.C, READMAIL.C, MSGBASE1.C, UEDIT.C, MMENU.C, MSGBASE.C,│
  10. │                 VARS.H, FCNS.H, BBS.STR                                    │
  11. │ Description   : A user Address Book to store Network addresses/Usernames   │
  12. │                                                                            │
  13. │     THIS IS RELEASED WITH THE FULL PERMISSION AND SUPPORT OF BULL SHIP!    │
  14. ╞═────────────────────────────────────═╤═───────────────────────────────────═╡
  15. │ StarPort Valhalla [   ]   -     ASV 28.8kbps  Home of the SPV mod series!  │
  16. └─────────────────────────────────────═╧═────────────────────────────────────┘
  17.  
  18.                      >>> OFFICIAL WWIV SUPPORT SITE! <<<
  19.  
  20.  Word of Warning:  You installed it, you're responsible! Make back-ups BEFORE
  21. attempting to install this modification!  Read all text before beginning.
  22. ─────────────────────────────────────────────────────────────────────────────
  23.  LEGEND:
  24.  =  Original Code [use this to search on]
  25.  +  Add this Line [mods ALWAYS add stuff, don't they?]
  26.  -  Delete this Line [or comment out, its not needed]
  27.  *  Change this Line [I usually comment these lines]
  28.  ... Skipping some code here [keeps the mod shorter]
  29. ─────────────────────────────────────────────────────────────────────────────
  30. LONG DESCRIPTION:  This is the address book mod that Bull Ship has been
  31. working with for quite some time.  With his permission, I've simply taken the
  32. mod and re-written it into something better (I hope).
  33.   Basically, it allows your users to store other users names, network
  34. addresses (including gated multi-networked nodes), and a small note.
  35.  
  36. Features:
  37.  ∞ WWIV Multi-instance compatible.
  38.  ∞ All WWIV Restrictions supported and used.
  39.  ∞ Sysops can easily define or undefine Restrictions they want.
  40.  ∞ Newusers not allowed access.
  41.  ∞ Deletes users address book entries if you delete user.
  42.  ∞ Address book is self maintaining -- filling in old spots as they're open.
  43.  ∞ Works with auto-delete mods that use "void deluser".
  44.  ∞ Access Address Book from Email/Message read prompts.
  45.  ∞ Access to Address Book when you hit 'E' to email and WFC.
  46.  ∞ Access to Address Book by typing //ADDRESS from main menu.
  47.  ∞ Users can delete their own address book entries.
  48.  ∞ User help screen describes mod and how to use it.
  49.  
  50. BS05D.424/SPV067I.MOD revision changes and additions
  51.  ∞ Modifications made by Pâpâ ßêâr. 99% re-written code.
  52.  ∞ User name, network address, and BBS name/phone are automatically extracted
  53.    for local and networked posts.  Gated postings (including those from the
  54.    other nets, like the internet) are automatically extracted with *complete*
  55.    and proper routing and user information.  All fields that I could fill in
  56.    automatically, I did.
  57.  ∞ Addresses stored in one file, ADDRESS.DAT, in the DATA directory.
  58.  ∞ SysOp can now view ALL records, if you choose to do so.  When in "all"
  59.    mode, the person who entered the address is shown.  This works in the
  60.    (V)iew and (S)earch functions.
  61.  ∞ SysOp can remove ALL records.  You can also remove yours, or any other
  62.    user's (by number), if you wish.
  63.  ∞ The function cline() is added.  You can use this in any part of the source
  64.    that you'd like.  It creates centered or non-centered colored ("steely")
  65.    bars.  This removed the necessity of having to have the FANCY_HEADER and
  66.    REG_HEADER #define's (and removed all the redundant associated coding).
  67.  ∞ When a user gets deleted, their address book entries are made available for
  68.    others' usage.  This means that the book is self-maintaining and will fill
  69.    in "dead" spots as new addresses are added.
  70.  ∞ You can now delete individual records in the (S)earch function, as well as
  71.    E-Mailing the displayed address record.
  72.  ∞ (S)earch functions will search for ANY character(s) in ALL fields.  You can
  73.    now use a # if you want.
  74.  ∞ During the (S)earch option, you can now (M)odify an entry.
  75.  ∞ Made it so AutoSend auto-posting cannot be extracted to book.
  76.  ∞ Fixed a minor (which could be major) bug that declared the handle variables 
  77. only to 23 (24 if you used the entire character array,
  78.    not leaving room for the null terminator) when the userrec name name field
  79.    has it defined out to 30 (31 with the null terminator) characters.
  80.  ∞ Fixed another bug that would cause it to crash during extraction.  Normally,
  81.    the variable net_email_name takes on the format of:
  82.  
  83.             So and So #1 @1111
  84.  
  85.    However, I found some that were like:
  86.  
  87.             So and So 1@1111
  88.  
  89.    So I've included a new strip_to_node() function (the same function that
  90.    services my SPV031*.MOD -- Quote Mod) to handle extraction of these and
  91.    gated type "names".
  92.  ∞ When asked if an entry is ok during extraction, you can now select (M)odify
  93.    and change the fields' data.
  94.  ∞ Saves and restores top screen info. status.
  95.  ∞ Checks for duplicate address/handle entries during extraction and manual
  96.    addition of address book additions.
  97.  ∞ User can now download their address book entries.
  98.  ∞ Pressing (E)-Mail will now search through the address book first before
  99.    using stock E-Mail functions -- if you choose to do so.
  100.  ∞ If the old address book exists, the user is given the opportunity to
  101.    download it.  After the downloading, it is removed.
  102.  
  103. NOTE!  Revision "D" totally changes the way the addresses are stored.  Please
  104.        be aware of this.  The ADDRESS subdirectory and individual files are
  105.        no longer supported.  This revision allows the users to download their
  106.        old address books, if they exist.  Once downloaded, the old files are
  107.        deleted.
  108.  
  109.                               >>> IMPORTANT <<<
  110. If upgrading, please make certain to go over the ENTIRE mod.  The calls to
  111. address() are no longer in effect (they have been changed to AddressBook())
  112.  
  113. SO DO *EVERY* STEP, MAKING CERTAIN THAT THE CODE YOU HAVE INSTALLED MATCHES
  114. THE CODE YOU SEE IN THIS SPV067I UPDATE OF BS05C.424!!!
  115.  
  116. CREDITS:
  117. First, from Bull Ship:
  118. Thanks go to Mr. Rick 1@3460 who sent me code for address extraction that
  119. helped point me in the right direction.  Thanks also goes to Dr. Olds 1@2930
  120. (IceNet) who helped me test the revision B upgrade.  Wish I could say I was
  121. the one who thought of this MOD.. but that credit goes to Bonk 1@11142 and to
  122. my wife.  Credit also goes to my wife, JJJ's Mom who currently has over 80
  123. pieces of email saved so that she can keep their net address... (Hmmm, just
  124. think of the HD space I'll save <grin>.)
  125. Update to 4.24 mostly done by Wyatt Earp 1@4 SierraLink, 1@11131 WWIVnet
  126.  
  127. From Pâpâ ßêâr:
  128. Thanks to Bull Ship for asking me to participate in this project. Once I
  129. installed it, I fell in love with it.  I couldn't help to make changes to it
  130. -- all of which I hope you think are improvements!
  131. ─────────────────────────────────────────────────────────────────────────────
  132. STEP 1:  You should have, all told, 5 files, as follows:
  133.  
  134. SPV067I.MOD    Address Book Mod and instructions.
  135. ADDRESS.C      Majority of Address Book Mod functions.
  136. MENU22.ANS     ANSI Address Book menu
  137. MENU22.MSG     WWIV Color Address Book menu
  138. ADDRESS.MSG    Address Book Help / Instructions for your users.
  139.  
  140.    If you do not, please get a complete archive from MOD NET, or Amber.
  141. ─────────────────────────────────────────────────────────────────────────────
  142. STEP 2: Open ADDRESS.C and search near the top for " NOTE #1 ", around line
  143.         number 31:
  144.  
  145. Determine if you want to comment out any of WWIV's restrictions.  The way the
  146. mod is now, if you set ANY restriction on a user they will not be able to
  147. email anyone or use or create an address book.  This is the way I have it set
  148. up on my board.
  149. ─────────────────────────────────────────────────────────────────────────────
  150. STEP 2a: NOTE!  You may wish to remove any literal strings at this time to
  151.          save on DGROUP.
  152. ─────────────────────────────────────────────────────────────────────────────
  153. STEP 3: Do all the following instructions:
  154.  
  155. Copy ADDRESS.C to your source code directory.
  156. (If upgrading copy the new one over the old.)
  157.  
  158. Copy ADDRESS.MSG to your GFILES directory (this is your users Help file).
  159. (If upgrading, make certain to use the new one!)
  160.  
  161. Copy MENU22.ANS and MENU22.MSG to your GFILES directory.
  162. (If upgrading, DELETE the MENU20.* in your GFILES directory.)
  163.  
  164. <note: if you already have a menu #22, rename these menus to the next highest
  165.  menu number you have available.  And change the call in ADDRESS.C
  166.  printmenu(22); to match what you renamed the menus to.>
  167. ─────────────────────────────────────────────────────────────────────────────
  168. STEP 4:  To add access to Address book by typing  //ADDRESS.
  169.          Add these lines to MMENU.C, void mainmenu(void):
  170.  
  171. =/*************************************************/
  172. + if (strcmp(s,"ADDRESS")==0)                                      // SPV067I
  173. +   AddressBook();                                                 // SPV067I
  174. = if ((strcmp(s,"UPLOAD")==0) && (actsl>10))
  175. =   upload_post();
  176. ─────────────────────────────────────────────────────────────────────────────
  177. STEP 5: Still in the same file, same function, case 'E':
  178.         Install either OPTION #1 -or- OPTION #2, but *not* both:
  179.  
  180. OPTION #1 - will put the user directly into the address book by hitting E
  181.             from the main menu, there is an Email option in the Address Book.
  182.  
  183. =     case 'E':
  184. +       AddressBook();                                             // SPV067I
  185. -       send_email();                                  // SPV067I remove line
  186. =       break;
  187.  
  188.           ─────────────────────────────────────────────────────────
  189.  
  190. OPTION #2 - This second way will offer your users a chance to Address Book,
  191.             if they choose No, they they go straight to sending email:
  192.  
  193. =     case 'E':
  194. // SPV067I block copy START
  195.         nl();
  196.         npr("5Use Personal address book 2[1N3/1y2]5?0 ");
  197.         if (yn())
  198.           AddressBook();
  199.         else
  200. // SPV067I block copy END
  201. =         send_email();            // SPV067I (indent two spaces if you want)
  202. =       break;
  203.  
  204. ─────────────────────────────────────────────────────────────────────────────
  205. STEP 5: BBS.C, void void getcaller(void)
  206.  
  207. void getcaller(void)
  208. {
  209. = char s[81],ch,lokb,*ss;
  210. = int any,fast=0,i;
  211. + int top_address;                                                 // SPV067I
  212. = double d;
  213. = userrec tu;
  214. = c_sub=c_dir=0;
  215. ─────────────────────────────────────────────────────────────────────────────
  216. STEP 6: Same file, same function, case 'E':
  217.  
  218. =       case 'E':
  219. =         if (ok_local()) {
  220. =           usernum=1;
  221. =           holdphone(1);
  222. =           okskey=1;
  223. // SPV067I block copy START
  224.             top_address=topdata;
  225.             topdata=0;
  226.             AddressBook();
  227.             topdata=top_address;
  228. // SPV067I block copy END
  229. -             send_email();                          // SPV067I *remove line*
  230. =           okskey=0;
  231. =           write_user(1,&thisuser);
  232. =           cleanup_net();
  233. ─────────────────────────────────────────────────────────────────────────────
  234. STEP 7: READMAIL.C, void readmail(void), add as shown:
  235.  
  236. = char s[201],s1[205],s2[81],*b,*ss1;
  237. + char handle[31],address1[51],board[75],ch1,add;                  // SPV067I
  238. = mailrec m, m1;
  239. ─────────────────────────────────────────────────────────────────────────────
  240. STEP 8: Same file, same function, change these lines to support the new
  241.         case '.':
  242.  
  243. =     if (so()) {
  244. =       if (sysinfo.flags & OP_FLAGS_MAIL_PROMPT)
  245. =         npr(get_string(1365));
  246. *       ch=onek("QSRIDAMF?-+GEZPVUOLCN.");                   // SPV067I add .
  247. =     } else {
  248. =       if (cs()) {
  249. =         if (sysinfo.flags & OP_FLAGS_MAIL_PROMPT)
  250. =           npr(get_string(1366));
  251. *         ch=onek("QSRIDAMF?-+GZPVUOC.");                    // SPV067I add .
  252. =       } else {
  253. =         if (!okmail) {
  254. =           if (sysinfo.flags & OP_FLAGS_MAIL_PROMPT)
  255. =             npr(get_string(1367));
  256. *           ch=onek("QI?-+G.");                              // SPV067I add .
  257. =         } else {
  258. =           if (sysinfo.flags & OP_FLAGS_MAIL_PROMPT)
  259. =             npr(get_string(1368));
  260. *           ch=onek("QSRIDAMF?+-G.");                        // SPV067I add .
  261. =         }
  262. =       }
  263. ─────────────────────────────────────────────────────────────────────────────
  264. STEP 9: Still in the same file, same function, now add the new case '.':
  265.  
  266. =       case 'R':
  267. =         break;
  268. // SPV067I block copy START
  269.         case '.':
  270.           if ((!m.fromsys && !m.fromuser) ||
  271.                (strstr(GateName,"AutoSend"))) {
  272.             nl();
  273.             pl("6ERROR! 2No system or user number available!0");
  274.             nl();
  275.             pausescr();
  276.             break;
  277.           }
  278.           nl();
  279.           npr("5Extract this Address to your Address Book? 0");
  280.           if (ny()) {
  281.             if ((m.fromuser) && (!m.fromsys)) {
  282.               // Local BBS user
  283.               read_user(m.fromuser,&u);
  284.               strcpy(handle,nam(&u,m.fromuser));
  285.               sprintf(address1,"%d",m.fromuser);
  286.               sprintf(board,"Local %s user",syscfg.systemname);
  287.             } else if (m.fromsys) {
  288.               // User name needed for all network E-Mail
  289.               strcpy(handle,GateName);
  290.               if (m.fromuser) {
  291.                 // Network E-Mail
  292.                 sprintf(address1,"%u@%u.%s",m.fromuser,m.fromsys,
  293.                         net_networks[nn].name);
  294.                 sprintf(board,"%s %s",csne->name,csne->phone);
  295.               } else {
  296.                 // GATED network E-Mail
  297.                   sprintf(address1,"%s @%u.%s",net_email_name,m.fromsys,
  298.                           net_networks[nn].name);
  299.                 nl();
  300.                 pl("5Enter BBS name/note2: 0");
  301.                 npr("6:0");
  302.                 mpl(74);
  303.                 inputl(board,74);
  304.               }
  305.             }
  306.             add=1;
  307.             if (CheckForDupe(handle,address1)) {
  308.               nl();
  309.               npr("2Possible address/handle matches, 0");
  310.               npr("2go ahead and add to book? 0");
  311.               if (!yn())
  312.                 add=0;
  313.             }
  314.             if (add) {
  315.               do {
  316.                 i=1;
  317.                 AddressHeader("E-MAIL EXTRACT/CONFIRMING");
  318.                 npr("5%-30.30s %s0",handle,address1);  nl();
  319.                 npr("9Note1: 5%s0",board);
  320.                 nln(2);
  321.                 npr("5Add this entry to your Address Book 0");
  322.                 npr("4Y3es5/4n3o5/4m3odify5)? 0");
  323.                 ch1=onek("Y\rNM");
  324.                 switch (ch1) {
  325.                   case 'Y':
  326.                   case 13:
  327.                     WriteAddress(handle,address1,board);
  328.                     break;
  329.                   case 'N':
  330.                     nl();
  331.                     pl("6Aborted0");
  332.                     break;
  333.                   case 'M':
  334.                     nl();
  335.                     i=0;
  336.                     npr("5New handle (1ENTER=%s5)2: 0",handle); nl();
  337.                     npr("6:0");
  338.                     mpl(30);
  339.                     inputl(s2,30);
  340.                     if (s2[0])
  341.                       strcpy(handle,s2);
  342.                     npr("5New address (1ENTER=%s5)2: 0",address1);
  343.                     nl();
  344.                     npr("6:0");
  345.                     mpl(50);
  346.                     inputl(s2,50);
  347.                     if (s2[0])
  348.                       strcpy(address1,s2);
  349.                     npr("5New BBS name/note (1ENTER=%-57s5)2: 0",
  350.                          board);
  351.                     nl();
  352.                     npr("6:0");
  353.                     mpl(74);
  354.                     inputl(s2,74);
  355.                     if (s2[0])
  356.                       strcpy(board,s2);
  357.                     break;
  358.                 }
  359.               } while ((!hangup) && (!i));
  360.               nl();
  361.             }
  362.           }
  363.           npr("5Enter Address Book? 0");
  364.           if (yn())
  365.             AddressBook();
  366.           GateName[0]=0;
  367.           break;
  368. // SPV067I block copy END
  369. =       case '?':
  370. =         printmenu(4);
  371. =         i2=0;
  372. =         break;
  373. ─────────────────────────────────────────────────────────────────────────────
  374. STEP 10: MSGBASE1.C, void scan(int msgnum, int optype, int *nextsub)
  375.          add these variable declarations:
  376.  
  377. = char s[161],s1[81],*b,*ss1;
  378.  
  379. = char *fstr, ch, s2[81];
  380. + char handle[31],address1[51],board[74],ch1,Done,add;             // SPV067I
  381. + net_system_list_rec *csne;                                       // SPV067I
  382. + unsigned int system,user;                                        // SPV067I
  383. = int fnd, sdir=1, lmt;
  384. = static char findstr[21];
  385. ─────────────────────────────────────────────────────────────────────────────
  386. STEP 11: Same file, same function, add new case '.':
  387.  
  388. =               grab_quotes(NULL, NULL);
  389. =               restore_msg_menu();
  390. =               break;
  391. // SPV067I block copy START
  392.               case '.':
  393.                 grab_user_name(&(get_post(msgnum)->msg),
  394.                                  subboards[curlsub].filename);
  395.                 if (get_post(msgnum)->status & status_post_new_net) {
  396.                   set_net_num(get_post(msgnum)->title[80]);
  397.                   if (get_post(msgnum)->title[80]==-1) {
  398.                     pl(get_string(679));
  399.                     break;
  400.                   }
  401.                 }
  402.                 strcpy(handle,stripcolors(strip_to_node(net_email_name)));
  403.                 if (net_email_name[0]) {
  404.                   system=get_post(msgnum)->ownersys;
  405.                   user=get_post(msgnum)->owneruser;
  406.                   if ((!system && !user) ||
  407.                       (strstr(net_email_name,"AutoSend"))) {
  408.                     nl();
  409.                     pl("6ERROR! 2No system or user number available!0");
  410.                     nl();
  411.                     pausescr();
  412.                     break;
  413.                   }
  414.                   nl();
  415.                   npr("5Extract this address to your Address Book? 0");
  416.                   if (ny()) {
  417.                     if (!system) {
  418.                       // Local user information
  419.                       read_user(user,&tu);
  420.                       strcpy(handle,nam(&tu,user));
  421.                       sprintf(address1,"%u",user);
  422.                       sprintf(board,"Local %s user",syscfg.systemname);
  423.                     } else {
  424.                       if (user) {
  425.                         // Network user information (Fills in BBS name, ph)
  426.                         sprintf(address1,"%u@%u.%s",user,system,
  427.                                 net_networks[net_num].name);
  428.                         csne=next_system(system);
  429.                         sprintf(board,"%s %s",csne->name,csne->phone);
  430.                       } else {
  431.                         // Network gated information (internet, FIDO, too!)
  432.                         strcpy(handle,GateName);
  433.                           sprintf(address1,"%s @%u.%s",net_email_name,
  434.                                   system,net_networks[net_num].name);
  435.                         nl();
  436.                         pl("5Enter BBS name/note2: 0");
  437.                         npr("6:0");
  438.                         mpl(75);
  439.                         inputl(board,75);
  440.                       }
  441.                     }
  442.                     add=1;
  443.                     if (CheckForDupe(handle,address1)) {
  444.                       nl();
  445.                       npr("2Possible address/handle matches, 0");
  446.                       npr("2go ahead and add to book? 0");
  447.                       if (!yn())
  448.                         add=0;
  449.                     }
  450.                     if (add) {
  451.                       do {
  452.                         Done=1;
  453.                         AddressHeader("MESSAGE EXTRACT/CONFIRMING");
  454.                         npr("5%-30.30s %s0",handle,address1);  nl();
  455.                         npr("9Note1: 5%s0",board);
  456.                         nln(2);
  457.                         npr("5Add this entry to your Address Book 0");
  458.                         npr("4Y3es5/4n3o5/4m3odify5)? 0");
  459.                         ch1=onek("Y\rNM");
  460.                         switch (ch1) {
  461.                           case 'Y':
  462.                           case 13:
  463.                             WriteAddress(handle,address1,board);
  464.                             break;
  465.                           case 'N':
  466.                             nl();
  467.                             pl("6Aborted0");
  468.                             break;
  469.                           case 'M':
  470.                             nl();
  471.                             Done=0;
  472.                             npr("5New handle (1ENTER=%s5)2: 0",
  473.                                  handle); nl();
  474.                             npr("6:0");
  475.                             mpl(30);
  476.                             inputl(s2,30);
  477.                             if (s2[0])
  478.                               strcpy(handle,s2);
  479.                             npr("5New address (1ENTER=%s5)2: 0",
  480.                                  address1); nl();
  481.                             npr("6:0");
  482.                             mpl(50);
  483.                             inputl(s2,50);
  484.                             if (s2[0])
  485.                               strcpy(address1,s2);
  486.                             npr("5New BBS name/note (1ENTER=%-57s5)2: 0",
  487.                                 board);
  488.                             nl();
  489.                             npr("6:0");
  490.                             mpl(74);
  491.                             inputl(s2,74);
  492.                             if (s2[0])
  493.                               strcpy(board,s2);
  494.                             break;
  495.                         }
  496.                       } while ((!hangup) && (!Done));
  497.                       nl();
  498.                     }
  499.                   }
  500.                   npr("5Enter Address Book? 0");
  501.                   if (yn())
  502.                     AddressBook();
  503.                 }
  504.                 GateName[0]=0;
  505.                 break;
  506. // SPV067I block copy END
  507. =             case '?':
  508. =               if (lcs())
  509. =                 printmenu(13);
  510. ─────────────────────────────────────────────────────────────────────────────
  511. >>> IN UEDIT.C <<<
  512. *** IF UPGRADING FROM THE BS05*.424 MODIFICATION, REMOVE THE VARIABLE
  513.     DECLARATION FOR ad[81] IN void deluser(int un) ***
  514. ─────────────────────────────────────────────────────────────────────────────
  515. STEP 12: In UEDIT.C, void deluser(int un), add this line:
  516.  
  517. =   u.inact |= inact_deleted;
  518. =   u.waiting=0;
  519. +   DeleteAddresses(un);                                           // SPV067I
  520. =   write_user(un,&u);
  521. =   f=open_email(1);
  522. ─────────────────────────────────────────────────────────────────────────────
  523. STEP 13: If you do *NOT* have SPV031IJ.MOD (Quote Mod) installed, then add
  524.          this function to the bottom of ADDRESS.C:
  525.  
  526. NOTE:    If you have a Quote Mod installed previous to version SPV031IJ, then
  527.          *REPLACE* your strip_to_node() function with this one:
  528.  
  529. char *strip_to_node(char *txt)
  530. {
  531.   int i,ok,ok1,i1=-1;
  532.   char s[81],s1[81];
  533.  
  534.   if (txt[0]==96 && txt[1]==96) {
  535.     for (i=2;(i<=strlen(txt)) && (txt[i]!=96);i++) {
  536.        s[i-2]=txt[i];
  537.        s[i-1]=0;
  538.     }
  539.     return(s);
  540.   }
  541.   if (strstr(txt,"AT")) {
  542.     ok=1;
  543.     for (i=2; i<strlen(txt); i++) {
  544.       if (ok) {
  545.         s[++i1]=txt[i];
  546.         s[i1+1]=0;
  547.       }
  548.       if (txt[i+1]==96)
  549.         ok=0;
  550.     }
  551.     return(s);
  552.   }
  553.   if (strstr(txt,"@")) {
  554.     if (strstr(txt,"#")==NULL) {
  555.       strcpy(s1,strrev(txt));
  556.       ok=ok1=0;
  557.       for (i=0;i<strlen(s1);i++) {
  558.         if ((ok) && (ok1)) {
  559.           s[i1++]=s1[i];
  560.           s[i1+1]=0;
  561.         }
  562.         if ((ok1) && (!ok)) {
  563.           if (s1[i+1]==32)
  564.             ok=1;
  565.         }
  566.         if ((s1[i]==64) && (!ok1))
  567.           ok1=1;
  568.       }
  569.       return(strrev(s));
  570.     } else {
  571.       ok=1;
  572.       for (i=0; i<strlen(txt); i++) {
  573.         if (ok) {
  574.           s[i]=txt[i];
  575.           s[i+1]=0;
  576.         }
  577.         if (txt[i+2]==35)
  578.           ok=0;
  579.       }
  580.       return(s);
  581.     }
  582.   }
  583.   return(txt);
  584. }
  585. ─────────────────────────────────────────────────────────────────────────────
  586. STEP 14: Prototype the new ADDRESS.C functions to FCNS.H  Either type:
  587.  
  588.    MAKE FCNS
  589.  
  590.          at the command line, or block copy these lines into the file:
  591.  
  592. = void rip_list_qscan(int start);
  593. = void rip_config_qscan(void);
  594. =
  595. + /* File: address.c -- SPV067I */
  596. + void AddressBook(void);
  597. + void DeleteAddresses(int UserNumber);
  598. + void WriteAddress(char *Name,char *NetAddress,char *NetName, char *Board);
  599. + void AddressHeader(char *Area);
  600. + unsigned char CheckForDupe(char *Handle, char *NetAddress);
  601. + void SendEmail(void);
  602. + char *strip_to_node(char *txt);                // NOTE NOTE NOTE -- SPV067I
  603. +
  604. = #endif
  605.  
  606. NOTE NOTE NOTE: *DO NOT* add this line if you already have SPV031*.* (Quote
  607.                 Mod) installed!
  608. ─────────────────────────────────────────────────────────────────────────────
  609. STEP 15: Modify MAKEFILE.MAK to accept new ADDRESS.C, use either OPTION #1 or
  610.          OPTION #2:
  611.  
  612. OPTION #1 - MAKEFILE.MAK for TCC
  613.  
  614.  (1) In the overlaid files section add the call for  ADDRESS.OBJ as shown:
  615.  
  616.         $(OBJ)sr.obj       $(OBJ)ini.obj      $(OBJ)xferovl2.obj\
  617.         $(OBJ)bbsovl3.obj  $(OBJ)qwk.obj      $(OBJ)qwk1.obj\
  618.         $(OBJ)ripovl.obj   $(OBJ)address.obj
  619.  
  620.  (2) Near the bottom of the "depends" section add the call for  ADDRESS.C
  621.      as shown:
  622.  
  623. $(OBJ)qwk1.obj    : qwk1.c     vars.h vardec.h net.h
  624.   $(TCC_OVL)
  625. $(OBJ)ripovl.obj  : ripovl.c vars.h vardec.h net.h
  626.   $(TCC_OVL)
  627. $(OBJ)address.obj : address.c vars.h
  628.   $(TCC_OVL)
  629.  
  630.           ─────────────────────────────────────────────────────────
  631.  
  632. OPTION #2 - MAKEFILE.MAK for BCC
  633.  
  634.    (1) Add to the first part of the overlaid section
  635.  
  636. =        xfertmp.obj  xinit.obj    qwk.obj      qwk1.obj     \
  637. *        ripovl.obj   address.obj
  638. =
  639. = BBS_O_OVL = \
  640. =         $(OBJ)\batch.obj    $(OBJ)\bbsovl1.obj  $(OBJ)\bbsovl2.obj  \
  641.  
  642.   (2) Add to the second overlaid section
  643.  
  644. =         $(OBJ)\xinit.obj    $(OBJ)\qwk.obj      $(OBJ)\qwk1.obj     \
  645. =         $(OBJ)\ripovl.obj   $(OBJ)\address.obj
  646. =
  647. =
  648. = ###########################################################################
  649.  
  650.   (3) Add to the dependencies
  651.  
  652. = ripovl.obj  : ripovl.c
  653. =   $(TCC_OVL)
  654. + address.obj : address.c
  655. +   $(TCC_OBJ)
  656. =
  657. = fix.obj     : fix.c
  658. ─────────────────────────────────────────────────────────────────────────────
  659. STEP 16: Add this variable declaration to VARS.H:
  660.  
  661. =               ver_no2[51],wwiv_net_no[20], xdate[9], *xenviron[50],
  662. *               dlfn[81],edlfn[81], nete[5], irt_sub[81], GateName[81];
  663. =
  664. = __EXTRN__ unsigned char actsl, andwith, checksum;
  665. ─────────────────────────────────────────────────────────────────────────────
  666. STEP 17: Add this line to MSGBASE.C:
  667.  
  668. =     while ((ss[p]!=13) && ((long)p<len) && (p<200))
  669. =       n[p]=ss[p++];
  670. =     n[p]=0;
  671. +     strcpy(s1,n);                                                // SPV067I
  672. +     strcpy(GateName,stripcolors(strip_to_node(s1)));             // SPV067I
  673. =     ++p;
  674. =     p1=0;
  675. ─────────────────────────────────────────────────────────────────────────────
  676. STEP 18: Recompile the the whole enchilada.
  677. ─────────────────────────────────────────────────────────────────────────────
  678. STEP 19: If you've changed your WWIV.INI so that  MAIL_PROMPT is enabled, use
  679.          a string editor like MINIESM or Tolken's ESM and add " . " to the
  680.          following lines:
  681.  
  682. 1365 / 1366 / 1367 / 1368
  683. ─────────────────────────────────────────────────────────────────────────────
  684. STEP 20: Now.. you need to update your menus to reflect the new option for
  685.          your users, using an editor that doesn't have WORDWRAP.. <don't use
  686.          WWIVEDIT!!!>
  687.  
  688. Menus affected are 1, 2, 4 and 13 in MENUS.MSG and MENUSANS.MSG.
  689.  
  690. 1.3>5 Extract Address to Personal Address Book0
  691. ─────────────────────────────────────────────────────────────────────────────
  692.  Again, thanks to Bull Ship, and the people who've helped him.  If it weren't
  693. for him, I'm not certain that a mod this great would have come into being.
  694.  If you have problems, please E-Mail me (1@11579.wwivnet) and not him.  I've
  695. changed virtually every line of coding, so I'm the responsible party :)
  696.  
  697.        This mod is copyright 1995 by Tracy Baker, aka Papa Bear, and is
  698.  distributed as freeware.  Permission is granted to distribute and post this
  699.    mod on BBS systems and online services, provided no alterations are made
  700.   (removal of message headers/taglines allowed).  This mod may contain some
  701.   parts of WWIV source code, which is copyright 1988-1994 by Wayne Bell and
  702.     licensed only to registered users of WWIV.  Use of WWIV source without
  703.      registration constitutes a license violation and could lead to legal
  704.                         prosecution and certain doom.
  705.    Shareware distributors and CD-ROM publishers may not distribute this mod
  706.  without express written permission of the Author or WWIV Software Services.
  707.  
  708. 7-9=1*6>2Pâpâ ßêâr6<1*9=7-0
  709. ---
  710. 1No, I don't have any taglines to give you.  Go Away.
  711.