BS05B.423 - Address Book, stores email addresses for users Bull Ship #1 @2932 Sat Jan 29 23:02:41 1994 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Mod Name : BS05B.423 Mod Author: Bull Ship 1@1 SierraLink ³ ³ Difficulty : ÛÛ±±±±±±±± 1@2932 WWIVnet ³ ³ WWIV Version : 4.23 1@2932 IceNET ³ ³ Mod Date : 1/29/94 1@2932 TerraNET ³ ³ Files Affected: BBS.C, READMAIL.C, MSGBASE1.C, 1@22901 WWIVLink ³ ³ UEDIT.C, BBS.STR 1@2932 FishNet ³ ³ Description : A user Address Book to store Network addresses/Usernames ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÍÍ[ Description ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Provides you and your users a way of storing those Usernames, Network and User addresses, Board Names and even the Network name. Features: ì Each users address book is stored in it's own individual file. ì WWIV Multi-instance compatible. ì All WWIV Restrictions supported and used. ì Sysops can easily define or undefine Restrictions they want. ì Newusers not allowed access. ì Deletes users address book if you delete user. ì Works with auto-delete mods that use "void deluser". ì Access Address Book from Email/Message read prompts. ì Access to Address Book when you hit 'E' to email and WFC. ì Access to Address Book by typing //ADDRESS from main menu. ì Users can delete their own address book. ì User help screen describes mod and how to use it. Revision A: ì Added ability to search address book for user supplied string. ì Auto-address email for user when search string is found. ì Added Email option to Address Book menu. ì Address Book now replaces Email at WWIV main menu (sysop option). ì Fixed 1 bug in 'delete' address book, removed stray bracket and inlcuded forgotten instruction to make ADDRESS directory. Revision B: ì Added ability to Auto-extract address book info from email and posts. ì Detects if email or post is gated, if it is, it has user input the address info manually. ì In Email, for Board name/Note field, the board name is offered, but the user can instead enter a note if desired. ì Colors added by sysops to Post/Email headers are stripped before adding the entry to the address book to prevent messing up the search function. This mod doesn't affect the headers themselves. Notes: Very important to your users, tell them they cannot enter a " # " character anywhere in their address book entry. For some reason the " # " causes the search function to stop when it gets to that char- acter. Another thing that stops the search function is if the sysop tries put color codes in the input fields, so don't attempt to store WWIV heart color codes in the users address book. Save yourself some Dgroup space and extract the character strings to your BBS.STR or MODS.STR. Also cut out the address book menu to a text menu (MENU20.MSG) in your gfiles dir. Replace the menu code with npr("2-= 4 %s's Personal Address Book 2 =-\r\n\n",name); printmenu(20); // <----- replace menu with this line. the printmenu(20); command as shown above. If you don't understand how to do this, email me and I'll explain it better. To upgrade from BS05A.423, do steps: 6, 8, 9, 10 and 18 ÍÍ[ Credits ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Thanks go to Mr. Rick 1@3460 who sent me code for address extraction that helped point me in the right direction. Thanks also goes to Dr. Olds 1@2930 (IceNet) who helped me test the revision B upgrade. Wish I could say I was the one who thought of this MOD.. but that credit goes to Bonk 1@2942 and to my wife. Credit also goes to my wife, JJJ's Mom who currently has over 80 pieces of email saved so that she can keep their net address... (Hmmm, just think of the HD space I'll save .) The search functions I used came from a stand alone utility that came across the MODnet sub. The util was called NETSUB.C, I don't know who the author of it was, but thanks go to whoever it is. ÍÍ[ Legend ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ + Add line - Remove line = Existing line * Modify line ÍÍ[ Step 1 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Please back up your source code. Even the best programmers make mistakes. ÍÍ[ Step 2 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ If you have a MODS.C file then open it and add the following functions to it. If not, then open BBS.C and add the following functions at the bottom. (If your upgrading, remove the entire old function "void address(void)" and replace it with the functions below.) // added for address book (BS05B.423) void properize(char *s) { // Properize is from newuser.c and is used int i; // below. If you have defined the ASV/CBV // you won't need to use this properize. for (i=0;i0) && ((s[i-1]==' ') || (s[i-1]=='.')))) { s[i]=toupper(s[i]); } else { s[i]=tolower(s[i]); } if ((i>1) && (s[i-1]=='c') && (s[i-2]=='M')) { s[i]=toupper(s[i]); } } } void address(void) { int i, f, ok; char handle[24], address[11], network[10], board[29], complete[80], s1[181]; char ch, name[24]; if ((thisuser.sl<=syscfg.newusersl) || (thisuser.restrict & restrict_net) || // Any one of these restriction (thisuser.restrict & restrict_anony) || // can be commented out just by (thisuser.restrict & restrict_upload) || // placing a double slash in (thisuser.restrict & restrict_logon) || // front of the one(s) you (restrict_chat & thisuser.restrict) || // don't want to use. (restrict_email & thisuser.restrict) || (restrict_vote & thisuser.restrict) || (thisuser.restrict & restrict_automessage) || (restrict_post & thisuser.restrict)) { nl(); prt(6,"You currently don't have access to the Address Book. Ask your Sysop why!"); // wordwrap nl(); nl(); pausescr(); } else { ok = 0; do { topscreen(); tleft(0); nl(); strcpy(name,thisuser.name); // I used Waynes Properize from NEWUSER.C properize(name); // I think it looks better this way. npr("2-= 4 %s's Personal Address Book 2 =-\r\n\n",name); prt(7,"(2V7)1iew Your Address Book"); nl(); prt(7,"(2A7)1dd to or create your Address Book"); nl(); prt(7,"(2S7)1earch for Specific Text"); nl(); prt(7,"(2H7)1elp (Info on address book)"); nl(); prt(7,"(2D7)1elete your Address Book (start new)"); nl(); prt(7,"(6E7)1mail Someone"); nl(); prt(7,"(2Q7)1uit back to BBS"); nl(); nl(); prt(1,"Your Selection? "); ch=onek("QEHVSDA"); switch(ch) { case 'Q': ok = 1; break; case 'H': printfile("ADDRESS"); pausescr(); break; case 'S': search(); break; case 'V': nl(); prt(2,"Spacebar to Abort... P to Pause...."); nl(); nl(); prt(7,"Address Users Handle or Name Network Note or BBS Name"); // wordwrap sprintf(s1,"%sADDRESS\\%d.ADR",syscfg.gfilesdir,usernum); if (exist(s1)) { printfile(s1); } else { nl(); prt(2,"You haven't created an Address book yet! Select A to create one."); //wordwrap nl(); } break; case 'D': nl(); prt(2,"Do you want to 6DELETE2 your Address Book? "); if (yn()) { nl(); prt(6,"Are you absolutely sure??? "); if (yn()) { sprintf(s1,"%sADDRESS\\%d.ADR",syscfg.gfilesdir,usernum); unlink(s1); } } nl(); break; case 'A': nl(); prt(2,"Enter the Users Handle or Name: "); mpl(24); inputl(handle,24); nl(); prt(2,"Enter the Net Address (user number & node): "); mpl(11); inputl(address,11); nl(); prt(2,"Enter Network name: "); mpl(10); inputl(network,10); nl(); prt(2,"Input Note or BBS name: "); mpl(29); inputl(board,29); sprintf(complete,"%-11.11s %-24.24s %-10.10s %-29.29s\r\n", address, handle, network, board); //wordwrap nl(); pl(complete); nl(); prt(5,"Add this entry to your Address Book 2[1Y3/1n2]5 ? "); if (ny()) { sprintf(s1,"%sADDRESS\\%d.ADR",syscfg.gfilesdir,usernum); f=sh_open(s1,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE); sh_lseek(f,0L,SEEK_END); i=strlen(complete); sh_write(f,(void *)complete,i); sh_close(f); nl(); prt(6,"Entry Added"); } else { nl(); prt(6,"Aborted"); } nl(); break; case 'E': send_email(); break; } } while ((!hangup) && (!ok)); } } void search(void) { FILE *subfile, *subscriber; char done, dones, s1[81], userstring[31]; int lcv; dones = 0; nl(); prt(2,"Enter a search string: "); mpl(30); inputl(userstring, 30); if (userstring[0]) { nl(); prt(7,"Searching..."); strupr(userstring); sprintf(s1,"%sADDRESS\\%d.ADR",syscfg.gfilesdir,usernum); searchfile(s1, userstring, &done, subfile, &dones); } if (dones == 0) { nl(); prt(2,"String not found! Done!"); nl(); pausescr(); } else { if (done != 1) nl(); prt(2,"No More Matches Found! Done!"); nl(); pausescr(); } } void getline(char *line, FILE *subfile) { int done = 0; do { if (fgets(line, 90, subfile) == NULL) { done = 1; line[0] = 0; } } while ((!done) && ((line[0] < 48) || (line[0] > 57))); } void searchfile(char *filename, char *userstrng, char *done, FILE *subfile, char *dones) //wordwrap { char filestring[100], buff[100], e_mail[12]; int lcv, lcv2; unsigned short sy,un; // fopen is fine here, file is not written to and only the user can access it // also I couldn't figure out sh_open read-only routines subfile = fopen(filename, "r"); *done = 0; do { getline(filestring, subfile); strcpy(buff, filestring); strupr(buff); if (strstr(buff, userstrng)) { *dones = 1; prt(2,"Found this Entry:"); nl(); prt(7,"Address Users Handle or Name Network Note or BBS Name"); //wordwrap npr("\r\n%s\n\r",&filestring); prt(2,"Email this Address? "); if (yn()) { strncpy(e_mail, filestring, 11); e_mail[11] = '\0'; npr("2Emailing: 1%s2\n",e_mail); write_inst(INST_LOC_EMAIL,0,INST_FLAGS_NONE); helpl=0; irt[0]=0; irt_name[0]=0; parse_email_info(e_mail,&un,&sy); grab_quotes(NULL, NULL); if (un || sy) email(un,sy,0,0); fclose(subfile); break; } prt(2,"Do you want to continue with this search? "); if (yn()) { prt(7,"Searching..."); *done = 0; } else *done = 1; } } while (filestring[0] && (*done != 1)); fclose(subfile); } // added for address book (BS05B.423) Save your MODS.C or BBS.C whichever you put it in. ÍÍ[ Step 3 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ To add access to Address book by typing //ADDRESS. Open BBS.C, add this just above "((strcmp(s,"UPLOAD"" in void mainmenu, as shown: /*************************************************/ + if (strcmp(s,"ADDRESS")==0) // address + address(); // address = if ((strcmp(s,"UPLOAD")==0) && (actsl>10)) = upload_post(); ÍÍ[ Step 4 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Still in BBS.C, in "void mainmenu", find "case 'E':" and add the option you would like your users to use: (don't use them both, just use the first or the second option) Choice #1, will put the user directly into the address book by hitting E from the main menu, there is an Email option in the Address Book, this is how my board is modded: = case 'E': + address(); // address - send_email(); = break; Choice #2, This second way will offer your users a chance to Address Book, if they choose No, they they go straight to sending email: = case 'E': + nl(); // address + prt(5,"Use Personal address book 2[1N3/1y2]5 ? "); // address + if (yn()) { // address + address(); // address + break; // address + } // address = send_email(); = break; ÍÍ[ Step 5 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ To add access to Address Book for sysop at WFC screen. Now in "void getcaller", modify the "case 'E' as shown: = case 'E': = if (ok_local()) { = usernum=1; = useron=1; = holdphone(1); = okskey=1; + nl(); // address + prt(5,"Use Personal address book 2[1N3/1y2]5 ? "); // address + if (yn()) // address + address(); // address = send_email(); = okskey=0; = useron=0; Save BBS.C ÍÍ[ Step 6 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ (add this to upgrade from BS05A.423 to BS05B.423) To add access to Address Book at Email read prompt by hitting " . " Open READMAIL.C, in "void readmail" near the top, add as shown: = char s[201],s1[205],s2[81],*b,*ss1; + char handle[24], address1[11], complete[80]; // address book BS05B.423 + char board[29], network[10], *ss2; // address book BS05B.423 = mailrec m, m1; ÍÍ[ Step 7 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ To add access to Address Book at Email read prompt by hitting " . " Still in READMAIL.C and in "void readmail" add the " . " as shown: =#ifdef OPT_MAIL_PROMPT = npr(get_string(1365)); =#endif * ch=onek("QSRIDAF?-+GEZPVUOLCN."); // address = } else { = if (cs()) { =#ifdef OPT_MAIL_PROMPT = npr(get_string(1366)); =#endif * ch=onek("QSRIDAF?-+GZPVUOC."); // address = } else { = if (!okmail) { =#ifdef OPT_MAIL_PROMPT = npr(get_string(1367)); =#endif * ch=onek("QI?-+G."); // address = } else { =#ifdef OPT_MAIL_PROMPT = npr(get_string(1368)); =#endif * ch=onek("QSRIDAF?+-G."); // address = } ÍÍ[ Step 8 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ (To upgrade from BS05A, replace the old "case '.'" with this one: ) Now further down, still in "void readmail" add the entire "case '.'" as shown: = case 'R': = break; // add from here for BS05B.423 case '.': // address nl(); prt(2,"Extract this Address to your Address Book? "); if (yn()) { if (m.fromsys==0) { ss2=syscfg.systemname; read_user(m.fromuser,&u); strcpy(handle,nam(&u,m.fromuser)); } else { ss2=csne->name; nl(); prt(2,"Cannot extract Users Handle, please enter it: "); mpl(24); inputl(handle,24); } npr("2Use Board Name: 4%s2 for Note field? ",ss2); if (yn()) strcpy(board,ss2); else { nl(); prt(2,"Input Note or BBS name: "); mpl(29); inputl(board,29); } if (m.fromuser==0) { nl(); prt(1,"Cannot use Auto-extract from Gated Email!"); nl(); prt(2,"Enter the Net Address (user number & node): "); mpl(11); inputl(address1,11); nl(); prt(2,"Enter Network name: "); mpl(10); inputl(network,10); } else { sprintf(address1,"%u@%u",m.fromuser,m.fromsys); strcpy(network,net_networks[nn].name); } sprintf(complete,"%-11.11s %-24.24s %-10.10s %-29.29s\r\n", address1, handle, network, board); nl(); pl(complete); nl(); prt(5,"Add this entry to your Address Book 2[1Y3/1n2]5 ? "); if (ny()) { sprintf(s1,"%sADDRESS\\%d.ADR",syscfg.gfilesdir,usernum); f=sh_open(s1,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE); sh_lseek(f,0L,SEEK_END); i=strlen(complete); sh_write(f,(void *)complete,i); sh_close(f); nl(); prt(6,"Entry Added"); nl(); } else { nl(); prt(6,"Aborted"); nl(); } nl(); prt(2,"Enter Address Book? "); if (yn()) address(); } else address(); // upgrading from BS05A? remove the existing break; // call to address and break. // stop adding here for BS05B.423 = case '?': = printmenu(4); = i2=0; = break; Save READMAIL.C ÍÍ[ Step 9 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ (to upgrade from BS05A.423 to BS05B.423 add this) To add access to Address Book at Message read prompt by hitting " . " Open MSGBASE1.C, In "void scan" near the top, add as shown: = char s[161],s1[81],*b,*ss1, *toval; + char handle[24], address1[11], complete[80]; // address book BS05B.423 + char board[29], network[10], *targ; // address book BS05B.423 = int i,i1,i2,done,quit,abort,next,val,realexpress,f; ÍÍ[ Step 10 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ (to upgrade from BS05A, remove the old "case '.'", replace with this one) To add access to Address Book at Message read prompt by hitting " . " Still in MSGBASE1.C, In "void scan" add as shown: = case 'W': = p2=msgs[msgnum]; = grab_quotes(&(p2.msg),subboards[curlsub].filename); = post(); = resynch(cursub, &msgnum, &p2); = grab_quotes(NULL, NULL); = break; // start add for BS05B.423 case '.': grab_user_name(&(msgs[msgnum].msg),subboards[curlsub].filename); if (msgs[msgnum].status & status_post_new_net) { set_net_num(msgs[msgnum].title[80]); if (msgs[msgnum].title[80]==-1) { pl(get_string(679)); // network deleted break; } } if(net_email_name[0] != '\0') { nl(); prt(2,"Extract this address to your Address Book? "); if (yn()) { if (msgs[msgnum].owneruser != 0 ) { targ=strchr(stripcolors(net_email_name),'#'); i=targ-stripcolors(net_email_name); strncpy(handle,stripcolors(net_email_name),i); handle[i]=0; sprintf(address1,"%u@%u",msgs[msgnum].owneruser, msgs[msgnum].ownersys); strcpy(network,net_networks[net_num].name); } else { nl(); prt(1,"Cannot use Auto-extract from a Gated Post!"); nl(); nl(); prt(2,"Enter the Users Handle or Name: "); mpl(24); inputl(handle,24); nl(); prt(2,"Enter the Net Address (user number & node): "); mpl(11); inputl(address1,11); nl(); prt(2,"Enter Network name: "); mpl(10); inputl(network,10); } nl(); prt(2,"Input Note or BBS name: "); mpl(29); inputl(board,29); sprintf(complete,"%-11.11s %-24.24s %-10.10s %-29.29s\r\n", address1, handle, network, board); nl(); pl(complete); nl(); prt(5,"Add this entry to your Address Book 2[1Y3/1n2]5 ? "); if (ny()) { sprintf(s1,"%sADDRESS\\%d.ADR",syscfg.gfilesdir,usernum); f=sh_open(s1,O_RDWR | O_BINARY | O_CREAT, S_IREAD | S_IWRITE); sh_lseek(f,0L,SEEK_END); i=strlen(complete); sh_write(f,(void *)complete,i); sh_close(f); nl(); prt(6,"Entry Added"); nl(); } else { nl(); prt(6,"Aborted"; nl(); } nl(); prt(2,"Enter Address Book? "); if (yn()) address(); } else address(); // updating from BS05A ? remove the } // existing call to address and break break; // end add for BS05B.423 = case '?': = if (lcs()) = printmenu(13); Save MSGBASE1.C ÍÍ[ Step 11 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ To delete users address book when you delete a user. Open UEDIT.C, go to "void deluser" Near the top change the char as shown: = mailrec m; * char fn[81],ad[181]; // address ad[181] = votingrec v; ÍÍ[ Step 12 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Now go down a couple line and add as shown: = u.inact |= inact_deleted; = u.waiting=0; + sprintf(ad,"%sADDRESS\\%d.ADR",syscfg.gfilesdir,un); // address + unlink(ad); // address = write_user(un,&u); = f=open_email(1); Save UEDIT.C ÍÍ[ Step 13 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Now you must add the prototypes (function names) to FCNS.H so they can be seen and used by WWIV, there are two ways of doing this: Either run 'MAKE FCNS' from DOS to update FCNS.H and it will be done for you. Or add the following lines to FCNS.H in either your MODS.C section or the BBS.C section (depending on what file you put the functions from step 2. + void properize(char *s); + void address(void); + void search(void); + void getline(char *line, FILE *subfile); + void searchfile(char *filename, char *userstrng, char *done, FILE *subfile, char *dones); // wordwrap ÍÍ[ Step 14 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Now compile. ÍÍ[ Step 15 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ If you have defined "#define OPT_MAIL_PROMPT" in VARS.H you will want to update BBS.STR to show the new option (" . ") at the message read prompt. Using MINIESM or Tolkiens ESM edit the following strings in BBS.STR: 1365 / 1366 / 1368 ÍÍ[ Step 16 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Now.. you need to update your menus to reflect the new option for your users. Menus affected are 1, 4 and 13. Add "1.3>5 Personal Address Book0" to MENUS.MSG and MENUSANS.MSG using a text editor that doesn't have word wrap. ÍÍ[ Step 17 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Create a directory under your Gfiles directory and call it ADDRESS. This is where the user address books will be stored. ÍÍ[ Step 18 ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ (upgrade your ADDRESS.MSG to include warning I've added below) Create a text help file called ADDRESS.MSG and place it in your GFILES directory. Or use mine: ----------------------- cut below this line --------------------- 2-= 4 Welcome to Ship's Online's Personal Address Book 2 =-0 217)1 The address book you create and add to is yours and yours alone.0 1 No other users can see it or add addresses to it, it's private.0 227)1 It's purpose is to provide users an easy method of keeping track of0 1 people they want to be able to email. You no longer have to keep scraps0 1 of paper hanging around with another Users name or net address on it.0 1 I'll store the info here on my BBS for you.0 237)1 Usage is very easy, just read the prompts and enter the info you want0 1 stored. You can view it by hitting V from the Address Book menu.0 247)1 The address field is the only one that would benefit you to follow any0 1 structured entry routine. You should attempt to always enter a persons0 1 user number and network address separated by an @ sign. ie.. 1@1 or0 1 1@2932 (email your sysop if you don't understand network addresses)0 257)1 There is no way for you to delete an individual entry. You can either0 1 delete your whole address book, or just live live with an entry you no0 1 longer want.0 267)1 Warning: Do not put the character " # " anywhere in your address0 1 book entry. If you put this character in your address book you will0 1 loose the ability to search for anything past it.0 ----------------------- cut above this line ----------------------- ÍÍ[ Disclaimer ]ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ It works fine here.. I'm not responsible.. if you run into problems I'll try to help you. Email me at one of the addresses above. Email me and tell me what you think.. I think there is great potential for this mod.. My users already love it and use it regularly.