Category : BBS Programs+Doors
Archive   : WWIVMODS.ZIP
Filename : WWIVMOD1.MOD

Output of file : WWIVMOD1.MOD contained in archive : WWIVMODS.ZIP
/* VARIOUS MODS 1, by Many Hands */
/* */
/* This is a collection of various mods thought up by various people so that */
/* you can personalize your WWIV bbs just alittle bit more. All credits have */
/* been given where credit was due. */
/* */
/* Typed in by MrBill (WWIVnet address = 1@7300) */
/* of MrBill's Abode 703-369-6140 24hrs/2400bps lots of WWIV support! */
/* and wmh/mtb (WWIVnet address = 1@8407) */
/* of Rappahannock Vaporboard 804-435-0602 */
Save all daily logs
by MrBill

This is not a mod at all, but it's a hell of a good idea to do! make a
directory called LOGS off of your BBS directoy. Then make a batchfile like
copy con savelogs.bat
copy c:\wwiv\gfiles\*.log c:\wwiv\logs
del c:\wwiv\gfiles\net.log

Run INIT and set the external event program to be SAVELOGS and some time
like 12:01 (01) or so to run the program. You will now be able to save all the
logs for future reference. I do this and copy them off to floppies every week
so that I can always go back and see what has happened in the past. Remember
that the time that you set the external event for is in minutes after midnight
not in hours

Another nice thing to do is whenever you get a new user, save his validation
feedback wit the E option of the e-mail menu and you'll always be able to go
back and find some interesting (ho hum) stuff that you would most likely
and normally forget. I do this by just making a usernumber.msg file and that
way (instead of trying to do their name or something like that) if you delete
a user, and a new one comes along to fill up there number, the message will
just go right over the old's a nice way to remind some users of what
they have told you in the past!

Default [PAUSE] on screen and/or default expert menus statusfor newusers
by MrBill

to add [PAUSE] on screen as default to new users look in NEWUSER.C
void newuser and just add the first line, if you want them to default to
expert menu statatus add the second line

thisuser.fsenttoday1=0; /* search */
thisuser.sysstatus |= sysstatus_pause_on_page; /* add */
thisuser.sysstatus ^= sysstatus_expert; /* add */

Define Color 7 (Ansic (7))
by MrBill

to make color 7 to blue on black in NEWUSER.C, void newuser put:

thisuser.colors[7]=9; /* change */


The colors are bitmapped, to figure out other colors do it like this

Number I R G B Color
------ - - - - -----
0 0 0 0 0 Black
1 0 0 0 1 Blue
2 0 0 1 0 Green
3 0 0 1 1 Cyan
4 0 1 0 0 Red
5 0 1 0 1 Violet
6 0 1 1 0 Brown
7 0 1 1 1 White

for high intensity the Intensity column (I) would have a one in it and the
colors are in the same order for 8-15 just being high intensity of the same

the background color is done the same way as the above (but there is no high
intensity for background, instead you've got the blink option) so to make
the color on the board for ansic(7) to be bright blue on red like my
Me Again sign off it would be bit mapped like this:
and then you'd convert the octal to decimal

Pick a fullscreen editor and default protocal on first logon
by MrBill

This is to allow a new user to pick a fullscreen editor on his initial call
and even use it to write the initial validation feedback, this is something
I wish everyone would use because I hate digging up my macros for the line
editor (awhhh, poor baby) when I call a new board. Look in NEWUSER.C,
void newuser to do this mod.

input_screensize(); /* search */
if (okansi()){ /* add */
nl(); /* add */
prt(5,"Select a fullscreen editor? "); /* add */
if (yn()) /* add */
select_editor(); /* add */
} /* add */
nl(); /* add */
prt(5,"Select a default transfer protocal? "); /* add */
if (yn()){ /* add */
nl(); /* add */
pl("Enter your default protocol, 0 for none."); /* add */
nl(); /* add */
i=get_protocol(1); /* add */
if (i>=0) /* add */
thisuser.defprot=i; /* add */
} /* add */

Auto-validation of WWIV SysOps
by MrBill

If you put in the mod right before this one, just put this after the last line
of it. if not, then you will be searching for input_ansistat() and put this
right after it. This is all in NEWUSER.C in void newuser.

nl(); /* add */
prt(5,"Are you currently a WWIV SysOp?"); /* add */
if (yn()){ /* add */
pl("Please enter your BBS name and number"); /* add */
outstr(":"); /* add */
inputl(thisuser.note,40); /* add */
sysoplog("#*#*#* Auto-validation of WWIV SysOp"); /* add */; /* put the security level that you want here */
thisuser.dsl=60; /* put the d/l security level that you want here */
thisuser.exempt=1; /* put if you want exempt from d/l ration */
thisuser.restrict=0; /* put if no restrictions */; /* see note */ /* add */
thisuser.dar=12; /* see note */ /* add */
nl(); /* add */
prt(1,"You have just been validated as a visiting ");/* add */
prt(1,"WWIV sysop. If I find any of ");nl(); /* add */
prt(1,"this info to be false, I will delete you "); /* add */
prt(1,"and inform others about you."); /* add */
nl(); /* add */
nl(); /* add */
pausescr(); /* add */
} /* add */
if (!hangup)

NOTE: the AR's and DAR's are bitmaped. I have my bbs set up for if you are
a WWIV sysop, you get the AR and DAR of C and D, and normal (non-WWIV) sysops
just get D for their AR and DAR to access my sysop sub. To figure out what
number to assign for the AR's and DAR's in autovalidation look at the
following chart and then figure out (with a hex to dec calculator or if
your smart enough in your head) what the decimal value would be for the
hexidecimal number that you need. And thanks to Gord the Rogue who explained
all this to me awhile ago.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| | | | | | | | | | | | | | | |
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
| | | | | | | | | | | | | | | |

so if you need your AR to be just A for sysop the number would be:
or for the AR to be set to C and M it would be:
the DAR's are done the same way
(if anyone has a hex to deci conversion program please send it to me!)
Where are they FROM today today? (Addition to the FROM.MOD)
by MrBill

Throw this little one in BBSUTL.C, void logon so that the city and state a user
is calling from will be displayed in the daily log and the LASTON.TXT file.
After you put this in, search again for the same thing and you can insert these
lines again to add the info to your sysoplog also.

strcat(s,nam(&thisuser,usernum)); /* search */
strcat(s," ["); /* add */
strcat(s,thisuser.citystate); /* add */
strcat(s,"] "); /* add */

Where are all the users FROM? (Addition to the FROM.MOD)
by MrBill

To show where people are from in the U:serlist command from the board
in BBSUTL1.C, void list_users

if (ok) {
ansic(2); /* add */
pla(nam(&u,smallist[i].number),&abort); /* search */
ansic(3); /* add */
pla(u.citystate,&abort); /* add */
nl(); /* add */

Advertising MrBill's Casino
by MrBill

If your using MrBill's Casino and half your people don't know it's there
because they don't look at the menu, put this in to "show them the light"
in BBS.C, void mainmenu

print("T - ",ctim(nsl()),"");
prt(6,"$ "); /* add */
prt(7,"- "); /* add */
prt(3,"MrBill's Casino"); /* add */
nl(); /* add */
if (usub[cursub].subnum==-1) { /* search */
if (usub[cursub].subnum==-1) {
strcpy(s1,"[] No Subs Available :");

Uedit Mod for using FROM.MOD
by (I'm not sure)

This is an addendum to the "From" mod that will allow the Sysop to edit
the adress information in Uedit. Just add this to "Void uedit()" in Sysopf.c
and add % into the key statement. This was uploaded to WWIV Amber but I'm not
sure who wrote it, I'm sorry for leaving you out, email me and i'll add your
name up top. This is the way I have it for my uedit too, but i use different
commands so that I can do all the info with seperate can do it
that way to, i'm sure you can figure it out folks.

case '%':
prt(2,"New Street Adress? ");
if (s[0]) {
prt(2,"New City, State? ");
if (s1[0]) {
prt(2,"New Zip? ");
if (s2[0]) {

Change Alias
by MrBill
for Zomby Woof of Joes' Garage @2101

This is a mod to allow users to change their alias for posts or so whenever
they feel like it, of course their user number stays the same so that they
can always be identified by the smart users. This can make your message
bases alittle more interesting, also this will save you time whenever users
would like to change their alias' and your too busy to do it. To do this mod
load up BBS.C and look for the void mainmenu(), at the top of this add the
variable s3[31] like this: "char *s,s1[81],s2[81],s3[31];". It's all the way
at the top and you can't miss it. Other then that, just look at the rest below
to add the mod. NOTE: You will get a suspicious pointer conversion warning
upon compiling this, for some reason the compiler doesn't like the
write_user(usernum,& line but the code works fine.

if (strcmp(s,"NAME")==0){ /* add */
nl(); /* add */
pl("Enter your new alias."); /* add */
outstr(":"); /* add */
input(s3,30); /* add */
if (finduser(s3)<1) { /* add */
strcpy(s2,"*+*+* Changed name to "); /* add */
strcat(s2,s3); /* add */
sysoplog(s2); /* add */
dsr(; /* add */
strcpy(,s3); /* add */
isr(usernum,; /* add */
write_user(usernum,&; /* add */
}else /* add */
pl("That name is already in use, try another."); /* add */
nl(); /* add */
topscreen(); /* add */
} /* add */
if (strcmp(s,"CLS")==0) /* search */

Color D/L directory listing
by MrBill

This is a nice little one to add some color to the file listing in your d/l
directories, that plain old grey really gets on my nerves and this will make
it easier on the eyes. Just load up XFER.C and add these three color control

at the end of void printinfo(uploadsrec *u, int *abort)
strcat(s,u->description); /* search */
ansic(1); /* add */

in void printtitle(int *abort)
ansic(7); /* add */
strcpy(s,(directories[udir[curdir].subnum].name)); /* search */

and at the end of void printtitle(int *abort)
s[i]=0; /* search */
ansic(3); /* add */

then at the end of void listfiles()
sprintf(s,"Files listed: %d",num_listed); /* search */
ansic(5); /* add */

by The Other Wayne, aka The Burgermeister

This is for those who wish (or have users who wish) that Wayne (Bell) had not
skipped the "Two Lines Left" warning that was in 3.21d. It is really a
nusiance not knowing when I'm gonna run out of lines. When two lines are
left, it will skip a line, print "==>Two lines left!" and skip a line and wait
for the new text.

Installing the mod is simple. Hey, if >I< could do it...

1. Start TC and load MSGBASE.C into the editor.

2. Search for (using -Q-F):
(this is in 'void inmsg(...);' at about line

3. Here's what to add (using the 2af notation, where '#'=ignore line and
'+'=add line):

# if (savel) {
# strcpy(&(lin[(curli++)*LEN]),s);
+ if (curli==(maxli-3)) {
+ nl();
+ pl("==> Two lines left!");
+ nl();
+ }
# if (curli==maxli) {
# nl();
# pl("-= No more lines =-");

And it's done.

Note 1: You see that the condition says 'if (curli==(maxli-3))', when it
seems that 'maxli-2' would do. Not really, because as you see in the block
that follows, the editor stops accepting anything but '/ES' or one of its
variants on what should be the last line to enter text. So, 'maxli-3' will
really mean "Two more lines to enter reg'lar text."
Which brings me to...

Note 2: Because of the funny code mentioned above, the number of lines
allowed as indicated in the editor's header is misleading. While it says
"Limit 30 lines", the actual limit is 29 lines. If this is irritating enough
to bug you, you fix it this way:
Search for the line:
in 'void inmsg(...);' (around line 454, depending on other mods you've made).
Change the expression '(maxli)' to '(maxli-1)'.

3. If you want to change the line limit to suit your personal security level
structures, the set of 'if... else... else...' conditions at around line 412
in MSGBASE.C will take care of that.

by The Other Wayne, aka The Burgermeister
(suggested by Jonathan Schragg, the Frontier BBS, @8405)

So you want to make your comand line prompt a bit more informative. For
instance, instead of
[1] [The Usual Chit-Chat]:

you'd rather have it say
My Super BBS
Time Left = 0:32:24

Sub number 1 : The Usual Chit-Chat
[Command ('?' for menu, ^O for help)]:

Not hard. If I can do it, anyone can. Load BBS.C into your Turbo C editor.
Look for this block of code:

void mainmenu()
char *s, s1[81],s2[81];
int i;
long l;

if ((sysstatus_expert & thisuser.sysstatus)==0)

print("T - ",ctim(nsl()),"");
if (usub[cursub].subnum==-1) {
if (usub[cursub].subnum==-1) {
strcpy(s1,"[] No Subs Available :");
+ if (s1[0]==0) {
+ s1[0]='[';
+ strcat(&s1,usub[cursub].keys);
+ strcat(s1,"] [");
+ strcat(s1,subboards[usub[cursub].subnum].name);
+ strcat(s1,"] :");
+ }
+ prt(2,s1);

Okay, ready. First thing to do is delete the line
print("T - ",ctim(nsl()),"");
This prints out the time left. We're putting it in elsewhere. With that
done, replace the block of code noted by plusses (+) with this:

if (s1[0]==0) {
strcpy(s1,"Sub number ");
strcat(s1," : ");
prt(5,"{your BBS's name here}"); nl();
print("Time left: ",ctim(nsl()),"");
prt(2,"[Command ('?' for menu, ^O for help)]: ");

Now it's ready to compile and go. If you don't want a space between the "Time
left:" line and the sub-name line, skip the 'nl();' that's on a line alone.

This is the ground work. You can change it anywhichway from this you'd like.
And if you'd like to have the sub number on a separate line from the sub name,
that can be done, too. See the 's2[81]' declared in the void's declaration
section? Well, s2 is NOT used in void mainmenu(). Since this is a LOCAL
variable, you CAN use it without hurting anything else in the BBS. So, to get
the prompt to read
{your BBS's name here}
Time left: {time}
Sub # : 1
Sub Name: The Usual Chit-Chat
[Command ('?' for menu, ^O for help)]:
use the following instead of the above replacement:

if (s1[0]==0) {
strcpy(s1,"Sub: ");
strcpy(s2,"Sub Name: ");
prt(5,"{your BBS's name here}"); nl();
print("Time left: ",ctim(nsl()),"");
prt(2,"[Command ('?' for menu, ^O for help)]: ");

Be careful with your 'strcat' and 'strcpy' when you do this. First time I put
this in, I accidentally entered
strcat(s2,"Sub Name: ");
and as a result got a line that added the sub name again every time it came
back to the prompt.

For the Transfer section menu, the principle is the same. Look for the
similar code in void dlmainmenu(), which is right after void mainmenu().

by the Other Wayne, aka The Burgermeister

My system currently has only 512K installed, so I can't install the SLASHEX
mod to enable the /EX editor command, because it runs out of memory while
compiling. If for either that reason, or because you simply don't have
SLASHEX to put in, you have also not included this mod, then your users are no
doubt frustrated at having to execute '/RL' to remove the '/EX' on the
previous line. I know >I< hate having that stray /EX on a message. Here's a
quick way to trap the /EX command without saving it in the message, and at the
same time tell the users that /EX is not implemented.

Load MSGBASE.C in the TC editor. Look for this block of code:

while (!done) {
if (hangup)
if (s[0]=='/') {
+ if (stricmp(s,"/HELP")==0) {

Now then, before the line marked with a '+', insert:

if (stricmp(s,"/EX")==0) {
pl("Sorry, the external message editor is under construction");

You may want to write in a comment noting that the block needs to be removed
if you install SLASHEX.

by The Other Wayne, aka The Burgermeister

I have seen several messages from people asking where others are from and all
that, and some wondering about adding a tag line. Jonathan Schragg was the
one who got me moving on it, which I had been considering anyway.

This mod will add a tagline to public messages on the net, but not on E-Mail.
It also won't add the tag to messages written with an external full-screen
editor. I think it can be done using the "addline" routine (this is used to
add the header to FSED messages), but I do not yet completely understand how
addline works or what the parameters represent, so I don't want to mess with
it. Anyone who cares to either attempt it or explain addline are welcome to.

And now for the mod:
1. Load MSGBASE.C into the TC editor.

2. In 'void inmsg(..)' search for:

if (curli==0)

3. Replace this with (= is same, + is add, * is ammend):

* if (curli==0) {
= save=0;
+ } else {
+ if (subboards[cursub].type && (aux != "EMAIL")) {
+ curli++;
+ strcpy(&(lin[(curli++) *LEN]),"**> WWIVNet Origin: {board name, place}");
+ strcpy(&(lin[(curli++) *LEN])," {additional message, if you wish}");
+ }
+ }
= } else {

If you want the Tag to appear in E-Mail, then remove "&& (aux != "EMAIL")"
from the test for network type (apparently e-mail has some non-zero sub type,
though I have yet to find out what).
Now that you see how things are written in messages (in case you were
wondering), you can either add or subtract lines from the Tag. A single line
would be least obnoxious, but I use two anyway.
MAKE SURE you have three end-brackets (}) before the second else. This will
cause errors farther down in the code ("Misplaced else" most likely).
I was asked "why make it an 'else' condition of the 'if (curli==0)'
statement?". The simple explanation is that it streamlines the code. Having
it follow the 'if (curli==0)' would also work, but that would add the tag to
aborted messages. That effect is harmless, since the message is aborted
anyway, but unnecessary.
There was an odd effect on e-mail, but since it is related to the following
mod, I'll reserve it for then.

by The Other Wayne, aka The Burgermeiser

Doug said he thought he'd taken care of this, but I haven't seen an autosave
feature that saved messages at (hangup) anywhere, so here it is. I find this
handy for those with call waiting or bosses who look in, who find them selves
hanging up on the 28th line of a 30-line magnum opus. Happened to me plenty
when I was living in my old apartment, with five roommates and call waiting.
This mod will not only automatically save the message (very simple), but leave
a line at the end of the message that informs the readers that the writer hung
up (in case they get confused by an abrupt ending).

1. Load (or keep) MSGBASE.C.

2. Search in 'void inmsg(..)' for:

if (hangup)

3. Replace it with:

if (hangup) {

And that takes care of the autosave (said it was simple). To add in the extra

4. Search for:

if (savel) {
if (curli==maxli) {
pl("-= No more lines =-");
pl("/ES to save");
if (curli==0) {

[Note: If you added my two-line-warning, then that will also appear in this
block of code.]

5. And replace it with (= is same line, + is add line, * is amend line):

= if (savel) {
= strcpy(&(lin[(curli++)*LEN]),s);
= if (curli==maxli) {
= nl();
= pl("-= No more lines =-");
= pl("/ES to save");
= nl();
= --curli;
+ } else {
+ if (hangup) {
+ curli+=2;
+ strcpy(s,"[*> *clik* They Hung up! Thppt! <*]");
+ strcpy(&(lin[(curli++) *LEN]),s);
+ }
= }
= }
= }
= if (curli==0) {

Again, if you have the two-line-warning in your program, it will also appear
Also again, this will not appear in FSED. If you figure out how...
Make sure you have all four closing brackets at the end. When I forgot them,
I got a "Misplaced else" error, and kept getting it because I though it was on
the brackets in the next set (which is the tag line mod). It was because I
only had three brackets.
There was, as I said, an odd effect on E-mail. When I tested these, the
e-mail behaved as it should when I entered a regulr message to 1@8400 from
here. But then I tested the hangup in e-mail, and the "They Hung up!" message
appeared as it should, but the tag line ALSO appeared. Hmm... If anyone
knows how the code could fix this, let me know.

by The Other Wayne, aka The Burgermeister

This accomplishes nothing but make the board look 'neat'. When a post is
wanted, it will clear the screen, print either
"Posting on sub {#}: {sub name}..." or
"This post will go out on WWIVnet on {sub name}..." at the top of the screen,
then go to the Title bar. It won't do this for e-mail messages, because most
who answer e-mail want to be able to refer back to the previous message while
they reply. Having e-mail clear the screen also gets in the way of validation
feedback, since users can't look back to see what the sysop wants while
writing it.

1. Load MSGBASE1.C into the editor.

2. Search in 'void post()' for:

if (syscfg.systemnumber) {
pl("This post will go out on WWIVnet.");

3. And replace it with (usual legend):

= if (syscfg.systemnumber) {
* outchr(12); /* replace 'nl();' with the screen-clear*/
* strcpy(s,"This post will go out on WWIVnet on '");
+ strcat(s,subboards[usub[cursub].subnum].name);
+ strcat(s,"'...");
+ prt(3,s);
= nl();
= }
+ } else {
+ outchr(12);
+ strcpy(s,"Posting on sub ");
+ strcat(s,usub[cursub].keys);
+ strcat(s,": ");
+ strcat(s,subboards[usub[cursub].subnum].name);
+ strcat(s,"...");
+ prt(3,s); nl();
= }
= inmsg(&m,p.title,&a,1,(subboards[curlsub].filename),ALLOW_FULLSCREEN);

None. Can't think of anything important about this, since it works fine.

by The Other Wayne, aka The Burgermeister
(suggested by K.C. Troise, 2@8407)

This is an easy one. One of my users thought it might be a nice "personal"
touch to see WHEN the last few were on. Since KC is responsible for getting
most of my users on the Vaporboard, it will also give him a chance to see when
people were on and badger them about not calling more. He's a helpful guy.

1. Load BBSUTL.C into the editor.

2. In 'void logon()', search for:

strcat(s," ");
strcat(s," - ");

[note that if MrBill's "where are they from today today?" mod is in, those
lines will appear here]

3. And replace it with:

strcat(s," ");
strcat(s,times()); /* new */
strcat(s," "); /* new */
strcat(s,date()); /* new */
strcat(s," "); /* new */
strcat(s," - ");

All you really have to do is block copy those four lines from the section
above it that copies them into the sysop log, then clean up the spacing.


I hope more of you will be willing to share some of your smaller mods now.
Who cares how big it is? A mod is a mod is a mod. If it can help someone or
is of interest to just ONE person, then it is worthwhile to share your ideas.
So everyone please share what you've got and if you want, i'll put it in the
next VARIOUSx.MOD file.

Turbo C ya later,

  3 Responses to “Category : BBS Programs+Doors
Archive   : WWIVMODS.ZIP
Filename : WWIVMOD1.MOD

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: