Citadel+ User's Guide and Reference Manual Draft Version/065 March 12, 1995 By Anticlimactic Teleservices Table of Contents Introduction v What we want from you v Typographic conventions v Style conventions v Section I: Quick Setup 1 System requirements 1 Choosing the correct version 1 Setting Citadel up 1 Section II: User's Guide 3 Basic Usage 4 Message Editor 6 Groups 9 Boolean group expressions 10 Accounting 11 Message Censoring 12 ANSI Colors 13 Message Command Interpreter (MCI) Commands 15 Variables 15 The commands 15 Examples 19 Applications 22 General format 22 Special command-line variables 23 Defining applications 24 The input and output data files 25 Help Files 27 Blurbs 27 Menus 31 Help files 34 Networking 36 General information 36 DragCit 1.0/1.1: The oldest and slowest 36 DragCit 1.5/1.6: Faster, but still messy 38 Net 6.9: Citadel networking at its best (so far) 39 Citadel-86 compatible networking 43 Time and Date Formatting 44 The TZ environment variable 44 Time/date format strings 44 Scroll-Back Buffer 46 Spell Checker 48 Status Line and Screen 49 The standard status line 49 The second status line 50 The help window 50 The status screen 50 User Configuration 52 Room Editing 61 User Editing 65 Section III: Command Reference 67 Common single-key commands 67 Less common single-key commands 68 Multiple key (extended) commands 69 .Read (.R...) commands 70 .Sysop (.S...) commands 72 .Aide (.A...) commands 76 .Chat (C) command 78 .Download (.D...) command 78 .Enter (.E...) commands 79 .Goto (.G...) command 80 .Help (.H...) command 80 .Jumpback (.J) command 80 .Known (.K...) commands 80 .Login (.L...) command 81 .Mail search (.M) command 82 .Bypass (.B...) command 82 .Terminate (.T...) commands 82 .Upload (.U...) command 82 .Invite (.I...) commands 82 .Expert toggle (.X) command 82 .Queue (.Q...) commands 82 .Menu (.?) command 83 Message Editor Commands 83 Output commands 85 Console-only commands 85 Dial-out commands 88 Window commands 88 Section IV: Configuration Files 91 CONFIG.CIT 92 Required 92 Optional 93 Paths and filenames 93 Console Attributes (Colors) 95 System Size 95 Modem 97 System Settings 100 Auxiliary Memory 107 Configuration 107 System Personality 108 Accounting 111 Security 112 EXTERNAL.CIT 118 NODES.CIT 121 CRON.CIT 128 GRPDATA.CIT 131 Sample Entry 132 DEFUSER.CIT 134 HARDWARE.CIT 142 PROTOCOL.CIT 143 Command line variables and flags 144 MDMRESLT.CIT 146 ROUTE.CIT 148 MAILLIST.CIT 149 Section V: Citadel Script Files 151 Overview 152 How script files are called 152 Variables 153 Functions 154 Script keywords 155 Debugging 160 Citadel internal functions by name 162 Citadel internal functions by function 247 Configuration 247 Debugging 247 Files 247 Messages 247 Networking 247 Users 247 Rooms 247 Halls 247 Groups 247 User interaction 247 String duplication checking 248 Miscellaneous 248 Appendix A: Customization 249 The CTDL.DAT File 249 Using CTDLDAT.EXE 250 The CTDLDATA.DEF file 250 What Citadel expects 251 The ENG-AM.DAT File 259 Appendix B: External drivers 261 Appendix C: FOSSIL support 275 Appendix D: Sound Blaster 277 Appendix E: Citadel BBSes 279 Appendix F: Credits 281 Appendix G: Data Files 283 The userlog files 283 The room files 289 The hall files 290 The group file 291 The borders file 291 The message file 291 Appendix H: Other files 295 Queued file transfers 295 Abnormal termination 295 Networking files 299 The NETID.CIT file 299 Net 1.0/1.1 network packets 299 Net 1.5/1.6 network packets 299 Net 6.9 network packets 299 MSG.69 format 300 MESG.TMP format 300 ROOMREQ.(alias) format 300 FILE69.(alias) format 300 Appendix I: Legal 313 Index 315 IIntroduction Citadel+ is the most configurable, most powerful, most supported, and all-around best variant of Citadel there is. If you have doubts about this, point us in the direction of a better Citadel and reasons why it is better; we will quickly incorporate any missing features into future versions of the software. The software is free for anyone to use for any use. This does not, of course, mean that you should expect any less from Citadel than from any commercial product; Citadel is fully tested and supported software. If you have any problems with the software, report them to The Anticlimactic Teleservice at (206)562-9792 for a quick fix. The same applies to new features: we will implement almost any new feature requested of us. What we want from you What we want most from our users is feedback. Even if you decide not to use Citadel, it would be nice to hear from you; tell us why you did not like Citadel so we can improve the software for future releases. Typographic conventions There are a few typographic conventions used in this manual that, if understood, help readability. They are as follows: Courier This is used when showing text as it would be entered into a text file. Italics This is used in two places: subheadings within a section and user input into the keyboard when running Citadel. Subheadings in italics are referenced in the table of contents. Style conventions Most references on written American English style will claim that all punctuation belongs inside quotation marks. However, this can lead to confusing text, especially when dealing with a computer: when listing possible words to enter in a configuration file, for example, the "correct" method would be to list them with the commas inside the quotes: "Setting1," "Setting2," or "Setting3." However, as the comma is not really part of what you should enter into the file, and the computer will not recognize what you want it to do if you do, this manual adopts a style of including only what is really being quoted inside the quotation marks: "Setting1", "Setting2", or "Setting3". This is just a warning to those of you who expect strict conformity to all style rules, even the silly and counterproductive ones. Another problem arises that English has no neuter pronoun that is acceptable for referring to people: people are always "he", "she", "him", or "her". The neuter pronoun ("it") is not used to refer to people. The problem is that in most cases, we do not know what sex the person we are referring to is. The solution to this problem that some people prefer is to use text like "he or she" whenever using a pronoun to refer to a person of unknown sex. The problem with this method is that it leads to longer, more confusing sentences. The purpose of a reference manual is to clearly state what it is trying to communicate, so adopting this style would cause the manual to suffer in quality. Another solution some people use is to alternate: sometimes use "he" and sometimes use "she". The problem that I have with this method is that it seems to turn into a quota system: after revising any section of the manual, I would have count "he"s and "she"s, to ensure that I used an equal amount of them. So, even though this may annoy some people, this manual uses "he" and "him" as the neuter pronoun. While this may not be fair in that it implies that the person being referred to is male, this is a problem with the language we speak. I don't feel that there is any good solution to this problem. (Introducing a new word, or making "it" acceptable when referring to people, would be nice, but we would have to convince several hundred million other people who speak English of this.) So, if you are female and reading some section that applies to you, please regard all occurrences of the word "he" as typographical errors for the word "she", all occurrences of the word "him" as typographical errors for the word "her", and all occurrences of the word "his" as typographical errors for the word "hers". _Section I: Quick Setup Citadel is a complex program with many features. It includes defaults that work well for most settings, but it can still take a while to set up a Citadel. Because of the number of manufacturers and models of modems in the world, setting the modem parameters can be especially difficult. If you have problems, call The Anticlimactic Teleservice at (206)562- 9792. This is the main distribution and support site for Citadel, so it carries the latest version of the program and related utilities and is a good place to ask questions or link into the Citadel network. System requirements Citadel requires the following to run: Hard disk 512K RAM (perhaps less) MS-DOS version 3.30 or later IBM PC Compatible computer The following is recommended: Modem 640K RAM IBM AT Compatible computer The following is nice to have, as well: Even more RAM Even faster computer Choosing the correct version There are two versions of Citadel: the Regular version and the Auxmem version. The Auxmem version can store much of its data in either EMS or XMS memory, or in disk-based virtual memory. Because of this, the Auxmem version can handle a larger system than the Regular version. But, even if you don't have a large system, the Auxmem version may be the correct one for you. It requires less conventional memory when running a moderately sized system than the Regular version, which gives you more room to use other features of Citadel. The disadvantage to the Auxmem version is that it is slightly slower than the Regular version. This slow-down is not noticeable if you are using an AT-class machine or faster, and is only slightly noticeable on an XT-class machine with EMS memory. If you only have conventional memory (up to 640K), then you should probably use the Regular version of Citadel. However, if you have any EMS or XMS memory, you should probably use the Auxmem version of Citadel. Also, if you have extended memory but no XMS driver, you can configure it as a RAM disk, so the Auxmem version of Citadel can indirectly access the memory by placing its swap file on the RAM disk. Setting Citadel up The first thing to do is make a directory for Citadel on your hard disk. If you don't have a hard disk, get one. (If you really want to run on a floppy-only system, request a floppy version of Citadel+ on The Anticlimactic Teleservice, and we will try to comply. It might be possible to make the software run on such a system by removing enough features to make the executable file small enough. Then again, it might not: it has been a couple of years since this was attempted.) Copy CTDL.EXE into this directory, then run it with the -C command-line parameter. (-C tells Citadel to configure itself. If you omit this, Citadel will alert you that it needs to be configured, and to run it with the -C parameter.) When first run, Citadel will prompt for some information that it needs to know to get started, such as the name of the BBS and its phone number, then create all its data files (room, message, user, etc.) and directories. Citadel will use default values for the size of the system and other options. Section IV contains full information on the configuration options, which you might want to change at a later time. Once Citadel has configured itself, it will present you with a room prompt for the Lobby. At this time, it is ready for use. Create an account with the Login (L) command by pressing L then coming up with new initials and password. Use the F6 key to access the sysop functions. You can press ? at any prompt to get a menu, or H for help. Now is a good time to read the "Basic Usage" topic in the next section. SSection II: User's Guide Citadel has many features, not all of which are used by all users. This section describes all features of the software, on a topical basis. This section does not explain specific commands; Section III is a command reference. This section also does not go into detail about setting configuration options in files (Section IV has detailed information about these); it merely tells you which options apply to the feature being described. The following topics are discussed in this section: Basic Usage Message Editor Groups Accounting Message Censoring ANSI Colors Message Command Interpreter (MCI) Commands Applications Help Files Networking Time and Date Formatting Scroll-Back Buffer Spell Checker Status Line and Screen User Configuration Room Editing Hall Editing. User Editing Basic Usage Citadel contains many rooms, which are grouped together in halls. When in a certain room, the message retrieval commands (such as the New messages (N) command) are used to read messages in that room and the Enter message (E) command is used to enter a message into that room. Individual pointers are kept for the last message read in each room, so there is no need to visit every room with new messages every call: new messages in rooms not visited will still be new during the next call. Additionally, Citadel allows more structure by grouping rooms in halls. This way, similar rooms (such as those dealing with technical topics) can be grouped together. Because of the simplicity of the room concept, only a few commands are needed to use Citadel effectively. These are the commands to enter and read messages and change rooms and halls. This makes Citadel easy for new modem users: there is no need to memorize a large command set to use the program well, and it is easy to get at the messages as there are no sub-menus to navigate (and potentially get lost in). After a user logs on, Citadel displays all new messages in the Lobby, then gives a room prompt, meaning that it is ready for user commands. There are two commonly used commands at this point: the Enter message (E) and Goto new messages (G) commands. To respond to something in the Lobby, press E to invoke the Enter message (E) command. This brings up Citadel's message editor. This is an easy editor to use for entering text, and fairly simple for editing text as well. To enter text, just start typing. Everything typed gets entered into the message buffer. To bring up the message editor's command prompt, press Enter on a blank line. The most common mistake that new users make when using the message editor is that they forget that Citadel automatically formats messages for each caller's screen- width. Because of this, pressing the Enter key will not force Citadel to start on a new line when it displays the message. To force Citadel to start a new line, press the Enter key then the space bar, so it thinks that you are starting a new paragraph. The commands most used from the message editor's command prompt are Save (S) , Abort (A), Continue (C), Print formatted (P), and Replace (R). Save, Abort, Continue, and Print do the obvious thing. Replace starts its search at the end of the text, going backwards, and only replaces one occurrence. An alternate text replacement command is Find and replace (F). This command displays the text it is going to replace before doing it. It takes a bit longer to use, but is good for users not totally familiar with Citadel's message editor. Another useful command of the message editor is Verify spelling (V). This checks the spelling of the words in the message, and gives suggestions for correcting those words it cannot find. The spell checker has many options, and is fully explained in the spell checker section. It is a good idea, especially when new, to use the Print formatted (P) command of the message editor before saving the message. This gives you a chance to see what Citadel's formatting does to a message, so it can be revised before saving it. Usually, the Goto new messages (G) command is used after entering a message in Lobby. This moves to the next room with new messages in the current hall. Once there, use the New messages (N) command to read the messages in the room. Then, either post a message with the Enter message (E) command or go to the next room with the Goto new messages (G) command. When the Goto new messages (G) command returns you to the Lobby, use the Next hall (>) command to go to the next hall and repeat the Goto/New/Enter loop. After you have visited all the halls, use the Terminate (T) command to log off the BBS and let others call. Other useful commands are the file transfer commands: Upload (U), Download (D), .Read Directory (.RD), and .Read Info file (.RI). More information is available with the .Read Directory (.RD) and .Read Info file (.RI) commands by adding the Verbose modifier: .Read Verbose Directory (.RVD), and .Read Verbose Info file (.RVI). These commands only work in directory rooms, which are rooms with a ] character at the end of the room prompt. The file transfer protocols available on the board are up to individual sysops to configure, using the PROTOCOL.CIT configuration file. The ones set up are available when either the Upload (U) or Download (D) commands are used. In addition, Xmodem, 1K Xmodem, Xmodem CRC, and Zmodem are always available through the .Enter With protocol (.EW...) and .Read With protocol (.RW...) commands. Message Editor Citadel's message editor allows for quick entering of messages, and effective editing of them. Enter text by just typing; Citadel takes care of word wrap. The message formatting that Citadel performs may be confusing to a new user: Citadel tries to word wrap messages to the caller's screen width, which can cause columnized messages (such as tables) to be displayed incorrectly. There are two ways around this formatting: one that is compatible with all software on the network, and one that is specific to Citadel+. If you want to ensure that the message will be easily readable by all software, just start every line with a space. This will make Citadel think that you are starting a new paragraph, so it will not word wrap the line to join with the previous. To be able to start typing in the left column, enter a Control+A5 before the text. This will tell Citadel to turn off its formatting. This only works with Citadel+ BBSes, though, so your message might be displayed incorrectly on another BBS on the network. If you want to turn formatting back on, use Control+A6. Citadel turns formatting back on after it is done with each message, so a message with a Control+A5 in it does not have to include a Control+A6. To exit text entry mode, and go into text editing mode, press Enter on a blank line. Citadel will respond with an "Entry Command:" prompt. The following commands are active at this prompt: A Abort. This aborts the message being entered and returns to the room prompt. If this command is used by accident, the .Enter Old (.EO) command will revive the aborted message. By default, Citadel asks for confirmation when aborting a message. However, this can be overridden with the Confirm Abort (A) option of the Message Editor options (E) sub-command of the .Enter Configuration (.EC) command. C Continue. This returns to the text entry mode. By default, Citadel displays the last 100 characters of the message before returning to text entry mode. To have Citadel display the whole message, use the Verbose Continue (V) option of the Message Editor options (E) subcommand of the .Enter Configuration (.EC) command. D Delete buffer. This deletes all of the message text that has been entered, and returns to the text entry mode. Citadel asks for confirmation when using this command, as there is no way to undo it. E Encrypt message. This asks for a key to use to encrypt the message. The key is case sensitive, and you must remember it if you want to be able to read the message in the future: the key is needed to decrypt the message when reading it. By default, only mail may be encrypted, but the sysop has control over which types of messages may be encrypted with the #ALLOWCRYPT keyword in CONFIG.CIT. He may choose to allow all messages to be encrypted, or no messages to be encrypted. F Find and replace. This prompts for text to replace, then finds the most recent occurrence of it, starting with the end of the message. It then asks if you want to replace this text. If you answer no, Citadel finds the next matching text, and prompts to replace it. This continues until you answer yes, when it asks for the text to substitute, or until no more matches are found. I Signature. This lets you change the user signature of the message. The _ key can also be used to change the signature. L Location. This displays the current room and hall. P Print formatted. This displays the message as it would appear when read. This is a good way to ensure that your message is formatted the way you want. R Replace. This operates as Find and replace (F), but is more of an expert-level command: you are not prompted for the occurrence to replace. Citadel finds the last occurrence of the text in the message, and replaces it with what you specify. Use this with caution, especially as a new user. S Save. This saves the message and returns to the room prompt. By default, Citadel does not ask for confirmation when saving messages. However, this can be overridden by using the Confirm Save (S) option of the Message Editor options (E) sub- command of the .Enter Configuration (.EC) command. U Subject. This lets you change the message's subject. V Verify spelling. This runs the spell checker on the message. Citadel's spell checker has many options, which are described in the Spell Checker topic. W Word count. This counts the characters, words, and lines (as Citadel thinks) of the message. ! Link application. This is available only to sysops on console. It links the message to an application (see the "Applications" topic in this section) to the message, so that the application is run every time the message is read, after the message is displayed. If the message is transferred to another board on the network, this link is lost. ~ Allow ESC. This toggles whether Citadel will save the Escape character (ASCII 27) to the message or not. By default, it strips this character, to avoid confusing people who try to use the arrow keys for message editing. However, some people might want to include ANSI sequences in their messages; they must use this command to tell Citadel to save the Escape character to do so. @ Address message. This lets you change the address of the message, for sending mail to other users. # Special delivery options. This sets special delivery options for mail. The only one currently implemented is receipt confirmation requested. If a message is marked as such, then Citadel generates a message addressed to you confirming that the message was received when it is read by the recipient for the first time. Note that if the message is networked mail destined to software other than Citadel+ on the network, then the confirmation will not be sent. Also, if the message passes through some other software that does not pass the special delivery information, the response will not be sent. < Insert file. This command is available only to sysops on console. It reads the contents of any file on disk and appends it to the message, up to Citadel's 8K message limit. * Change name. This lets users change their title and surname for this message only. Sysops have the added capability to change their name for this message only. ? Menu. This displays a list of available commands. Groups Access to different areas of the board can be limited by using groups. For example, if a room is group-only, only users who are members of the group can get to the room to read the messages in it. In addition to rooms, halls, messages, and doors can be made group-only. Groups are created with the .Sysop Group New (.SGN) command, edited with the .Sysop Group Edit (.SGE) command, and killed with the .Sysop Group Kill (.SGK) command. Once a group is created, aides can usually add and remove people and rooms from the groups. To make a group more secure, it can be locked from aides, which means that only sysops can add and remove people from it. For even greater security, a group can be hidden, which means that only current members of the group or a sysop on console can even know of the group's existence. A low-security group can be made auto-add, which means that all new users are added to it when they log in for the first time. Groups are also used for accounting: different time limits and upload/download charges can be assigned to different groups. Citadel's accounting is powerful and adaptable. The Accounting section explains it in full. Only aides and sysops may add or remove people from groups. For a list of all groups on the system that you can add or remove users from, use the .Aide List group (.AL) command, and don't specify a group. If a group is specified, the command will list all users, rooms, and halls belonging to the group. The .Sysop Group List (.SGL) command operates identically. To add or remove users to or from a group, use the .Aide Group (.AG) command, the .Sysop Group Group-specific membership (.SGG) command, the .Sysop Group User-specific membership (.SGU) command, or the .Sysop Group Operator- specific membership (.SGO) commands. The .Aide Group (.AG) command works on one user and one group at a time. The .Sysop Group Group-specific membership (.SGG) command operates on one group, but goes through the whole userlog, prompting to add or remove each user or not. The .Sysop Group User-specific membership (.SGU) command operates on one user, but goes through the group list, prompting to add or remove the user to or from each group on the system. The .Sysop Group Operator-specific membership command (.SGO) command lets you add users to a group based on their membership in another group, or their access to the system. This is done by specifying a Boolean expression, as described below. A rooms can be made group-only by setting its access with the .Aide Edit room (.AE) command. A room can also have a privileges group, also set by the .Aide Edit room (.AE) command. Users not in the privileges group can access the room, but have fewer privileges than members of the privileges group. The privileges can be upload or download ability in directory rooms, or message entry or moderating in any room. Alternatively, a room can be made group-only when it is being created, by adding the Group-only modifier to the .Enter Room (.ER) command: .Enter Group-only Room (.EGR). Halls can be made group-only by setting the group with the .Sysop Hall Edit (.SHE) command. Also, when a new hall is being created with the .Sysop Hall New (.SHN) command, Citadel allows the hall to be made group-only. Messages can only be made group only when being created, by adding the Group-only modifier to the .Enter Message (.EM) command: .Enter Group-only Message (.EGM). Sysops have the added ability to send mail to every member of a group by using the .Enter Group-only Exclusive message (.EGE) command. Two groups are automatically created by Citadel: Null and Reserved_2. Everybody is added to Null when logging in new (Null is always auto-add). The Reserved_2 group is used when something needs to be made group-only, but there is no defined group for it, such as when mapping unknown group- only messages coming in over the network, or creating an Aide room message for a room with a Boolean group expression (see below). Boolean group expressions Citadel allows you to use Boolean expressions to control group-access to halls and rooms. By using these, you have a large amount of control over who may access a room or hall. They can also be used for the .Sysop Group Operator-specific membership (.SGO) command and the .Read Group-only... (.RG...) commands. When entering a Boolean expression, you may use the operators OR, AND, NOT, and XOR, in addition to the grouping symbols "(" and ")". If the group name you are specifying contains more than one word, you must enclose the name in quotations. You must also put a space before and after the grouping symbols "(" and ")" so Citadel does not try to interpret them as part of the group name. For example, suppose you have three groups on your system: Group 1; Group 2; and Group 3. If you want to make a room accessible to members of Group 1 or Group 2, but who are not in Group 3, then you would enter the following expression: ( "Group 1" or "Group 2" ) and not "Group 3". Note that as Citadel has partial group-name recognition, you could also enter that expression as: ( 1 or 2 ) and not 3, assuming that you have no other groups that Citadel would find first. When using the .Sysop Group Operator-specific membership (.SGO) command and .Read Group-only... (.RG...) commands, Citadel provides the meta-groups *SYSOP, *AIDE, *NODE, *UNLISTED, *TWIT, *PERMANENT, *NETWORK, and *NOMAIL to allow you more power when choosing a group expression. These are used like actual groups, with membership based on access. Most of these are not available in the .Read Group-only (.RG) commands to users who are not Aides, for security reasons. Also, these don't make sense with the .Read Group- only Messages (.RGM) commands, because messages don't have these access levels. Accounting Citadel accounting is based on groups. When a user logs in, Citadel assigns accounting information to him based on which groups he is in, picking the best deal for him if he is a member of two or more conflicting groups. For each group, you can limit the times (days and hours) it can call, its maximum time limit, the number of minutes granted to members per day, the cost of uploads and downloads, and hours of the day that the group is not charged any time. To turn on accounting, you must edit CONFIG.CIT and sometimes DEFUSER.CIT. At the minimum, you must set the #ACCOUNTING keyword in CONFIG.CIT to 1. This is enough to turn on accounting, but you may want to change some of the defaults. The default time limit for unlogged-in users is five minutes. If you want to give them more or less time, set #UNLOGGEDBALANCE in CONFIG.CIT to the number of minutes you desire. When a new user creates an account, Citadel assigns 60 minutes to it. If you want to give more or less time, set #CREDITS in DEFUSER.CIT to the number of minutes you desire. If you want to rename credits, use the #CREDIT_NYM keyword in CONFIG.CIT. Then, set GRPDATA.CIT for your accounting values, as explained in Section IV. You can turn off accounting for a specific user by using the .Sysop Userlog edit (.SU) command. You can also use this command to change the balance of a user's account. When a user is logged-in, you can use the PgUp and PgDn keys to change the account balance by five minutes at a time. The current account balance is displayed in the status line. Message Censoring Citadel provides a method to keep messages on your system from being too vulgar for your taste. This is done with message censoring. When a message is censored, it will always pass through the network. However, you have control over who reads the message on your system. In addition to the obvious censoring of message text that you find objectionable, you can elect to censor any author who has demonstrated a history of undesirable posts, or any node with either an undesirable name or with users who continually post unacceptable messages. You can also choose to censor (or uncensor) any message that you read as you read it. Exclusive messages are never censored. If a user on your system enters a message that Citadel censors, it will display the file CENSOR.BLB to the user. This is a good place to insert a warning or tell the user why you chose to have the message censored. Each user can be configured to view or not view messages that are marked "Censored" by Citadel. Sysops can control this by using the View censored messages (*) option of the .Sysop Userlog edit (.SU) command. If the #CENSOR keyword in CONFIG.CIT is set to 1, then users can also control this with the View censored messages (*) option of the .Enter Configuration (.EC) command. When viewing is enabled with this option, the file DISCLAIM.BLB is displayed to. A carefully worded disclaimer blurb can help keep you out of prison. It is easy to enable censoring: just use the #CENSOR_AUTHOR, #CENSOR_TEXT, and #CENSOR_NODE keywords in EXTERNAL.CIT as follows: #CENSOR_AUTHOR "name" Censor all messages from the user name. #CENSOR_TEXT "text" Censor any messages that contain text anywhere in the message buffer that might be displayed when a user reads the message. This includes titles, surnames, signatures, source software field, etc. #CENSOR_NODE "node" Censor all messages from the board node. ANSI Colors Citadel supports both ANSI codes and a Citadel-specific method of changing colors that is a bit easier to use. To turn on this support, use the Terminal settings (T) subcommand of the .Enter Configuration (.EC) command. There are two choices for turning on ANSI available from this subcommand: ANSI mode (A) and ANSI color (C) . Turning on ANSI mode tells Citadel to display certain things with ANSI (such as room prompts and message headers). It also tells Citadel to pass the Citadel-specific Control+A codes (see below) 0 to 4 to you. Turning on ANSI color tells Citadel to pass the Control+A codes a-h and A-H to you. Turning on either also tells Citadel to pass ANSI (ESC[...) codes to you. Otherwise, it strips these out, in an attempt to keep the text visible to you. (It works well as long as the only ANSI codes are color changes, not cursor movement.) Citadel's Control+A color codes start with a Control+A (ASCII 1) and then a character that specifies the new color or other attribute. The available characters are: Code Result 0 Normal 1 Blink 2 Reverse 3 Bold (high intensity) 4 Underline a Black foreground A Black background b Red foreground B Red background c Green foreground C Green background d Yellow foreground D Yellow background e Blue foreground E Blue background f Magenta foreground F Magenta background g Cyan foreground G Cyan background h White foreground H White background r Random foreground R Random background You can change the actual ANSI codes that Citadel passes to your terminal for the codes 0-4 by using the Attributes (R) choice of the Terminal settings (T) subcommand of the .Enter Configuration (.EC) command. Underline (Control+A4) usually does not appear as an underline: the text modes of IBM PC video cards that support color (CGA, EGA, VGA) do not support underlined text. The ANSI terminal code that enables underlined text on these cards sets the text color to blue. (Or, more accurately, to generate underlined text on the MDA, you specify the text color as blue.) You can also mix Control+A3 with the a-h codes to make the colors brighter. To do this, enter the Control+A3 before the Control+Aletter. Similarly, mixing Control+A1 with the codes A-H will make the characters blink in the specified color. Control+A2 (reverse) and Control+A4 (underline) cannot be mixed with the other colors like this: the color code entered will override the reverse or underline attribute. Message Command Interpreter (MCI) Commands If you have MCI (Message Command Interpreter) turned on with the #TWIT_FEATURES keyword of CONFIG.CIT, messages can become much more than just text: they can be interactive sessions for the user. Like colors (see the "ANSI Colors" section), MCI commands all start with Control+A. A few MCI commands are a single character long, like the colors, but most are multiple characters. Multiple character commands all start with X and end with X; the X at the start tells Citadel that this is an extended command, and the X at the end tells Citadel that it has reached the end of the command. For example, the command to display the current connect rate is "^AXcrX". The "^A" is the Control+A that tells Citadel that a special formatting code (color or MCI) is next. The first "X" tells Citadel that this is an extended code. The "cr" stands for "Connect Rate" and actually tells Citadel what to display. The final "X" tells Citadel that this is the end of the extended command. Variables There are 10 variables that can hold string values and 10 that can hold character values. The variables holding string values can also be used to hold numeric values. The variables are labeled 0 to 9. To assign a value to a string variable, use the Assign (^AXas{variable}{value}X) command. To get the output of any MCI command into a string variable, use the Assign next (^AXan{variable}X) command. To get user input into a string, use the Get string (^AXgs{variable}X) command. String variables can be displayed using the Put string (^AXps{variable}X) command. Character variables can only be assigned to a user's keystroke, with the Get character (^AXgc{variable}X) command. Character variables can be displayed using the Put character (^AXpc{variable}X) command. The value of a variable can be tested with the Compare (^AXcm{variable}[vflag]{type}{value}X) command, then acted on with the Equal to (^AXeq{command}X), Greater than (^AXgt{command}X), and Less than (^AXlt{command}X) commands. The commands All commands with an "*" after them are not yet implemented. Account balance (^AXabX) This displays the current user's account balance. Add (^AX++{result variable}{variable 1}{variable 2...}X) This command looks at string variables as if they were numeric, and adds {variable 1} to {variable 2} (and to {variable 3}, etc., if present) and assigns the value to {result variable}. For example, the command "^AX++394123X" would assign the sum of string variable 9 plus string variable 4 plus string variable 1 plus string variable 2 plus string variable 3 to string variable 3. Address (^AXad{#}X) This displays the current user's address. The value of {#} determines which line to display: 1, 2, or 3. If no user is logged-in, this displays "Not logged in" for all three. Assign (^AXas{variable}{value}X) This assigns the value given by {value} to the string variable number {variable}. Assign next (^AXan{variable}X) This assigns the output of the next MCI command to the string variable number {variable}, instead of displaying to the user. Backspace (^AXbs{#}X) This sends backspace (Control+H) characters to the user. The value of {#} determines how many to send. Beep (^AXbp{#}X) This sends bell (Control+G) characters to the user. The value of {#} determines how many to send. Call number * (^AXcnX) This sends the current call number. Clear screen *(^AXclX) This clears the screen. Compare (^AXcm{variable}[vflag]{type}{value}X) This does a comparison of a variable to {value}. The type of comparison is determined by {type}: if it is "N" then a numeric comparison between {value} and the string variable number {variable} is made; if it is "C" then an alphabetic comparison between the character variable number {variable} and {value} is made; otherwise an alphabetic comparison between the string variable number {variable} and {value} is made. The alphabetic comparisons are not case sensitive: the strings "abc" and "ABC" are considered equal. [vflag] should be set to "V" if you want {value} to address a variable, or omitted if you want {value} to be treated literally by Citadel. That is, the MCI command "^AXcm0S9X" will compare string variable 0 to the string "9" and MCI command "^AXcm0VS9X" will compare string variable 0 to string variable 9. To use the result of a comparison, use the Greater Than, Less Than, and Equal To commands, which are described below. Connect rate (^AXcrX) This displays the connect rate. Disk free * (^AXdf{drive}X) This shows how much disk space is free on {drive}:. For the drive of the current room's directory, use "0" for {drive}. For the drive of the #HOMEPATH as set in CONFIG.CIT, use "1" for {drive}. Otherwise, use a letter from "A" to "Z". Divide (^AX//{result variable}{variable 1}{variable 2...}X) This command looks at string variables as if they were numeric, and divides {variable 1} by {variable 2} (and by {variable 3}, etc., if present) and assigns the value to {result variable}. For example, the command "^AX//394123X" would assign the quotient of string variable 9 divided by string variable 4 divided by string variable 1 divided by string variable 2 divided by string variable 3 to string variable 3. Equal to (^AXeq{command}X) This executes the MCI command {command} if the last Compare (see above) command resulted in equivalence. Don't put an "X" at the start of {command}. Otherwise, Citadel will interpret this as the end of the "eq" command. If you need to do a non-extended command in response to an Equal to command, you must use the Goto command to go to it. For example, this will display the current room name (see the Room Name command below) if the last Compare command ended in an equivalency: "^AXeqrmX". Notice that there is no X before the "rm" part of the command, only after it. First name (^An) This attempts to display the user's first name. It will display full names of users like "The Hidden" who have "The", "A", or "An" as their first names. Get character (^AXgc{variable}X) This gets a single character from the user and stores it in character variable number {variable}. The character is not displayed by Citadel. Get string (^AXgs{variable}X) This gets a string from the user and stores it in string variable number {variable}. The string is displayed as the user enters it. Goto label (^AXgo{label}X) This makes the output flow jump to the label specified by {label}. This command does not work if the output is not stoppable by the user (such as in a room prompt). Greater than (^AXgt{command}X) This executes the MCI command {command} if the result of the last Compare command was greater than. The {command} should not start with an "X" as that is not part of the MCI command, but a special character that tells Citadel where an MCI command starts and ends. For example, the command "^AXgtgowowX" will transfer the output flow to the label "wow" if that last Compare command resulted in a greater than. Hall name (^AXhnX) This outputs the name of the current hall. Initials (^AXinX) This outputs the initials the current user uses to log into the board. Label (^AXlb{label}X) This is a place holder, used by the Goto label command. It does nothing by itself. Last call time/date (^AXlcX) This displays the user's last call time and date, using the current verbose time/date format string. Last name (^AXlnX) This attempts to display the user's last name. Citadel does this by searching backwards from the end of the name for the first space. Anything after the first space it finds (or the whole name if there is no space) is thought to be the last name. Less than (^AXlt{command}X) This executes the MCI command {command} if the result of the last Compare command was less than. The {command} should not start with an "X" as that is not part of the MCI command, but a special character that tells Citadel where an MCI command starts and ends. For example, the command "^AXltgowowX" will transfer the output flow to the label "wow" if that last Compare command resulted in a less than. Messages in room (^AXmrX) This displays the number of messages in the current room, as is displayed when going to it. Multiply (^AX**{result variable}{variable 1}{variable 2...}X) This command looks at string variables as if they were numeric, and multiplies {variable 1} by {variable 2} (and by {variable 3}, etc., if present) and assigns the value to {result variable}. For example, the command "^AX**394123X" would assign the product of string variable 9 times string variable 4 times string variable 1 times string variable 2 times string variable 3 to string variable 3. Node name (^AXnnX) This displays the name of the current node. Node phone number (^AXnpX) This displays the phone number of the current node. Non-verbose Time/Date (^At) This displays the current time/date using the non- verbose time/date stamp. Number read * (^AXnmX) This displays the total number of messages read this call. Out special * (^AXos#X) Wow. This has not yet been implemented. Password (^AXpwX) This displays the password the current user uses to log on. Phone number (^AXpnX) This displays the phone number of the current user. Poopcount (^AP) This displays the poopcount of the current user. Poopuser * (^Ap) This displays the current poopuser of the board. Port rate (^AXprX) This displays the current port rate. Put character (^AXpc{variable}X) This displays the contents of character variable number {variable}. Put string (^AXps{variable}X) This displays the contents of string variable number {variable}. Random number (^AXrd{variable}#X) This assigns a random number in the range of 1 to # to string variable number {variable}. Real name (^AXrnX) This displays the real name of the current user. Room name (^AXrmX) This displays the current room name. Slow output * (^AXsl#X) Wow. This has not yet been implemented. Subtract (^AX--{result variable}{variable 1}{variable 2...}X) This command looks at string variables as if they were numeric, and subtracts {variable 2} from {variable 1} (and {variable 3} from that difference, etc., if present) and assigns the value to {result variable}. For example, the command "^AX--394123X" would assign the difference of string variable 9 minus string variable 4 minus string variable 1 minus string variable 2 minus string variable 3 to string variable 3. Sysop name (^AXsnX) This displays the name of the console sysop, as set by #SYSOP in CONFIG.CIT. User name (^AN) This displays the current user's full name. Verbose Time/Date (^AT) This displays the current time/date using the verbose time/date stamp. Examples To create complex MCI messages with looping and branching, you almost need to use a text editor, unless you are really good about keeping things in your mind. In the following examples, the character "" is used for Control+A. (Control+A will show up as a smiley face in your text editor.) Also, as you often need to enter many characters without pressing the Enter key to make the formatting come out correctly, each line is entered with a hanging indent. The following message would give the user a message based on his poopcount: Hey, n, youXan0XPXcm0N0XXltgonegativeXXcm0N100XXltgosma llXXcm0N1000XXltgomedXXcm0N10000XXltgola rgeX have a lot of poop!XgoendX XlbnegativeXr poop comes out backwards!XgoendX XlbsmallX should poop more.XgoendX XlbmedX just barely poop enough.XgoendX XlblargeX are pretty good about pooping.XlbendX This message starts with the text "Hey, n, you", which is always displayed. This lets the user see that it is directed at him by including his name in the message. After that, Citadel does some comparisons and branching to display the rest of the message based on the user's poopcount. As we don't want to output a carriage return in the middle of this, it all has to be on the same line. If your text editor takes you to the next line when you fill up the first, then you have word-wrap mode turned on. You should turn it off so that the message looks correct when it is loaded into Citadel. The first thing this message does after printing the introduction text is use the Assign Next command and the Poopcount command to assign the user's poopcount to variable number 0. This is the "Xan0XP" in the message. After this, the message performs the first comparison: "Xcm0N0X". This compares the value of variable 0 (which we just loaded with the user's poopcount) with the number 0. Then we act on the comparison: "XltgonegativeX" branches to the label "negative" if the variable 0 contains a value less than 0. If the value is not less than zero, then display of the message continues with the next comparison: "Xcm0N100X". This compares the value of variable 0 with the number 100. As before, this is acted on with the Less Than command: "XltgosmallX" branches to the label "small" if the value is less than 100. This continues similarly, checking for a value of under 1,000 (which branches to the label "med"), then a value of under 10,000 (which branches to the label "large"). If the user's poopcount is 10,000 or greater, then the text " have a lot of poop!" is displayed. This, when combined with the "Hey, n, you" that has already been displayed to the user, creates the full message "Hey, n, you have a lot of poop!" After the message is displayed, the Goto command "XgoendX" is used to skip to the end of the message. At this point in the message, any text entered would never be displayed. That is because there was an unconditional Goto just previous: there is no way that this section of the message will ever be displayed. Because of this, we can press Enter here and move to the next line (just to keep things close to readable in the text editor) without having an effect on the formatted output. Then we have our first Label: "XlbnegativeX". This gives a destination to go to when the user's poopcount is less than 0 (remember the first comparison done in the message). This starts by outputting the text "r poop comes out backwards!" This, when combined with the first part of the message already displayed, forms the message: "Hey, n, your poop comes out backwards!" (You'd understand if your poopcount was less than 0.) After the message is displayed, the Goto command "XgoendX" skips to the end of the message. Again, we are now in a place of the message that will never be displayed to the user. Because of this, we can start a new line to keep things close to readable. This new line is just the label "small" and the rest of the message that should be displayed to people with a poopcount of less than 100 but not less than 0, followed by a Goto that skips to the end of the message. This is repeated for people with a poopcount of less than 1,000 but not less than 100, with the label "med". Finally, the label "large" is used for the message to display to uses with a poopcount of less than 10,000 but not less than 1,000. At the end of this message, however, we don't have a Goto command that skips to the end of the message: we have the "end" Label that we have been skipping to previously. At this point, you can enter anything more in the message that you want to display to all users. However, we just end the message here, so nothing more is done. Wow. More examples. Applications You can configure Citadel to make extensive use of applications (external programs). They can be set up as doors, which can be accessed through the .Enter Door (.ED...) command; they can be attached to a room, then accessed either through the .Enter Application (.EA) command or automatically when someone enters the room; they can be accessed through a single-key command from the room prompt, even overriding internal commands; they can be hooked up to the message editor menu as external editors or message filters; they can be used to implement external file transfer protocols, both for the .Upload (.U...) and .Download (.D...) commands and for networking; applications can also be attached to many system events with the #EVENT keyword in EXTERNAL.CIT. These applications can be .EXE or .COM programs, DOS batch files, or Citadel script files. They are set up in different places, depending on what sort of application they are (file transfer protocol, door, etc.) General format All applications, regardless of where they are set up, have the same general format: first, 0 or more flags that tell Citadel how to execute the application, then the file name for the application, then any command line parameters that you wish to pass to the application. The following flags tell Citadel to execute the application using the following methods: ! This tells Citadel to "Super-shell", or swap as much of itself as possible out of memory, thus giving the application the most memory possible in which to run. Citadel leaves less than 1K of itself in conventional memory, swapping the rest of itself to XMS, EMS, or disk. Swapping to XMS or EMS is nearly instantaneous, but swapping to disk takes a few seconds. @ This tells Citadel to not clear the screen before running the application, and to not restore the screen before returning. This is used to save memory if you are not super-shelling and the application saves and restores the screen for you: an 80x25 text screen takes nearly 4K to save in memory. When using the super-shell, this does not make any difference, because the memory used to save the screen is also swapped out when shelling. $ This tells Citadel to load COMMAND.COM (or, actually, the program pointed to by the COMSPEC environment variable) and tell it to process the command. This is required to run DOS batch files or to redirect program output to a file. ? This tells Citadel not to write BBS information files (Citadel's native OUTPUT.APL as well as CALLINFO.BBS, CHAIN.TXT, DOOR.SYS, DORINFO1.BBS, PCBOARD.SYS, TRIBBS.SYS, and USERINFO.DAT) before shelling. Writing these files takes some time and disk space, but not much. Usually, it does not matter if they are written when not needed. But, if you are very tight on disk space or running on a slow machine, this may make a difference. * This tells Citadel that the application is a script file, not a program. This overrides all other flags. That is, if this flag is present then all others are ignored. This is because the other flags don't apply to script files. Also, when running a script file the command line arguments are not passed to it, since script files have no command line parameters. After these flags, give Citadel the application file name, optionally followed by any command line parameters to pass to the application. For example, the application command to write the directory listing of your C:\CIT drive to the C:\LIST.DIR file would be as follows: ?$dir c:\cit >c:\list.dir The "?" flag is included because the DOS DIR command does not need or use any BBS information files. This is a performance enhancement only, and is not required. The "$" flag is used because DIR is a DOS internal command, so it needs COMMAND.COM to process the command. Even if DIR was an external command (like CHKDSK), you would need the "$" flag in this case because COMMAND.COM handles the redirection to a file specified by the ">c:\list.dir" command line parameter. Note that this would be entered into a file (such as CRON.CIT or EXTERNAL.CIT) in quotations, which means that backslashes would have to be doubled, as explained at the beginning of Section IV: "?$dir c:\\cit >c:\\list.dir" Special command-line variables Often, you will want to specify variable information to your application. For example, the file transfer protocols need to know which file to send. This is done with command line variables, which all start with the "%" character. (If you need to pass the "%" character itself to an application, use "%%".) These variables are valid for all applications: %a The application path, as set by the #APPLICPATH keyword in CONFIG.CIT. This is the path that applications are run from. %c The speed of the connection between modems. This is a numeric value between 300 and 115200, representing the baud rate at which the modems are communicating. %l The modem port or LOCAL. This is the numeric value 1-4, depending on which serial port the modem is connected to, or the text LOCAL if the current user is logged in locally. %p The modem port, as set by the #MDATA keyword in CONFIG.CIT. This the numeric value 1-4, depending on which serial port the modem is connected to. %s The speed of the connection to the serial port. This is a numeric value between 300 and 115200, representing the actual baud rate at which Citadel is currently sending data to and receiving data from the serial port. %u The name of the currently logged-in user, after stripping out any color codes. If there is no user logged-in, this passes the text "[Not logged in]". If the application is being defined as an external editor, the following variable applies, in addition to the standard %a, %c, %l, %p, %s, and %u: %f The file to edit. If the application is being defined as a file transfer protocol, the following variable applies, in addition to the standard %a, %c, %l, %p, %s, and %u: %f The file, or files, to transfer. If the application is being defined as an #ARCHIVER in EXTERNAL.CIT or in a #ZIP line in NODES.CIT, the following variables apply, in addition to the standard %a, %c, %l, %p, %s, and %u: %f The name of the archive file. %d The name of the file, or files (using wildcards or separation by spaces), to extract from the archive file. The files should be extracted into the current directory. In the preceding three cases, %f may be full path to the file or just the filename (assumed to be in the current directory), depending on Citadel's needs at the time. The application should be able to accept either form. Defining applications The following specifies all ways in which an application can be defined: As an #ARCHIVER in EXTERNAL.CIT This type of application tells Citadel how to get the contents of an archive file, or extract files from it. See the EXTERNAL.CIT section in Section IV for full information. As a file transfer #PROTOCOL in PROTOCOL.CIT This type of application implements external file transfer protocols, such as Kermit, for uploading and downloading as well as networking. See the PROTOCOL.CIT section in Section IV for full information. As a #DOOR in EXTERNAL.CIT This type of application is available as a single keystroke from a room prompt, or from the .Enter Door (.ED...) command. See the EXTERNAL.CIT section in Section IV for full information. As an #EDITOR in EXTERNAL.CIT This type of application implements an external message editor or message filter. See the EXTERNAL.CIT section in Section IV for full information. As an #AUTO_EDITOR in EXTERNAL.CIT This type of application is similar to an #EDITOR, but it is always run on every message posted. See the EXTERNAL.CIT section in Section IV for full information. As an #EVENT in EXTERNAL.CIT This type of application is run every time some system event occurs, such as a user logging in or uploading a file. See the EXTERNAL.CIT section in Section IV for full information. As a #USERAPP in EXTERNAL.CIT This type of application runs every time a specific user logs in. See the EXTERNAL.CIT section in Section IV for full information. As a #NEWUSERAPP in CONFIG.CIT This type of application is run every time a new user logs in. See the EXTERNAL.CIT section in Section IV for full information. As a room application This type of application is attached to a room with the .Aide Edit room (.AE) command. While in the room, the user can use the .Enter Application (.EA) command to run the application. Citadel can also be told to make the room an auto-application room, which means that it will run the application every time a user enters the room for the first time during a call. See the Room Editing topic in this section for full information. As a #ZIP command in NODES.CIT This is used when collecting files together for any networking using Net 1.5 or higher. See the NODES.CIT section in Section IV for full information. As part of a #LOGIN string in NODES.CIT This is used if you want to execute an application as part of logging into a remote system during networking. See the NODES.CIT section in Section IV for full information. As a SHELL_1 or SHELL_2 #DO type in CRON.CIT This is used to execute an application at a pre- determined time. See the CRON.CIT section in Section IV for full information. As an application linked to a message This type of application is attached to a message by the sysop-only message editor command Link application (!). After Citadel displays a message with a linked application, it then runs the application. The input and output data files When Citadel executes an application, it creates BBS information files in the application directory, unless the ? or * flags were specified in the application command line. Citadel creates BBS information files of various standards to maximize compatibility with doors written for a specific other BBS program. The formats created by Citadel are OUTPUT.APL, CALLINFO.BBS, CHAIN.TXT, DOOR.SYS, DORINFO1.BBS, PCBOARD.SYS, TRIBBS.SYS, and USERINFO.DAT. After it is finished executing, it reads in the contents of INPUT.APL (if such a file exists), and modifies its settings based on its contents. It then checks for the file MESSAGE.APL, and uses the information to create a message on the system. It then displays the contents of README.APL (if the file exists) to the user of the system, then the contents of CONSOLE.APL (if the file exists) to the system console only (not the user on the modem). It then deletes all above files to clean up. See Appendix H: Other files for the specifications of these files, and the values written to various of these files that are not designed for Citadel. Help Files Help files are files that Citadel displays to users to help them in using the software. Help files fall into three categories: blurbs, menus, and help files. The blurbs and menus can only be defined by Citadel, but you can make as many help files as desired, in addition to those defined by Citadel. All help files have defaults built into Citadel. If you want to override the defaults, just create your own files: Citadel looks for the files on disk before it uses its built-in files. Blurbs If you want to override Citadel's default blurb files, place them in the directory set by #HELPPATH in CONFIG.CIT. They all have the extension .BLB and inform the user of something. Equivalents of these blurbs for users with ANSI have the extension .BL@. If Citadel cannot find the appropriate blurb with the .BL@ extension, it uses the .BLB version. There are no default ANSI blurbs. If a blurb is said to rotate, then the sequence of rotation is FILE.BLB, FILE1.BLB, FILE2.BLB, etc. When the next file in sequence is not found, it is reset to FILE.BLB. You can have a different number of ANSI (.BL@) and normal (.BLB) blurbs; they will rotate at their own rate. If you want to use this feature, you must override the default: if there is no FILE.BLB, Citadel will just use the default one built into it, and not even look for FILE1.BLB. AD######.BLB This is displayed at the room prompt, at times defined by the #ADCHANCE and #ADTIME keywords of CONFIG.CIT. This is a rotating blurb. ADDRESS.BLB This is displayed when the user presses the ? key when Citadel is prompting for his mailing address. BULLETIN.BLB This is displayed after the user logs in and before new messages in Lobby are displayed. This is a good place to give user important news about the BBS. If you have a bulletin menu defined in your CTDL.MNU file (see the Menus section below for information about menus), then this blurb is not displayed. CALLIMIT.BLB This is displayed when the user presses the ? key when setting a user's call-per-day limit with the .Sysop Userlog edit (.SU) command. CENSOR.BLB This is displayed whenever a message is posted that the BBS censors because the sysop has specified message censoring in EXTERNAL.CIT; see the Message Censoring topic in this section for full information. CHAT####.BLB This is displayed when the sysop enters chat with the user. This is a rotating blurb. CHATTED.BLB When #CHATMAIL in CONFIG.CIT is set to 2, this is displayed when a user who has requested chat terminates. After this is displayed, Citadel asks if he wants to leave a message to the sysop. CLOSESYS.BLB This is displayed to users requesting access to a closed system, as set by "#LOGIN CLOSED_SYSTEM" in CONFIG.CIT. After this blurb is displayed, the BBS will hang-up on the user. Use this to inform the user that you are not accepting new callers. COLORS.BLB This is displayed when the user presses the ? key when prompted to enter a color's number. DIALOUT.BLB This is displayed when the console user goes into dial-out mode by pressing F8 when the modem does not have a connection. DISCLAIM.BLB This is displayed when a user turns on the display of censored messages with the .Enter Configuration (.EC) command. ENCRYPT.BLB This is displayed when the user presses the ? key when prompted to enter a message encryption or decryption key. ENTERNYM.BLB This is displayed when the user presses the ? key when using the .Enter Name (.EN) command. ENTRY.BLB This is displayed when a user in non-expert mode enters a message. This is a good place to inform users about the Citadel message editor. GOODBYE.BLB This is displayed when the user runs out of time on systems with accounting enabled. After this message is displayed, the BBS will hang up on the user. HELLO###.BLB This is displayed when the BBS detects carrier, before the user logs in. This is a rotating blurb. JOKE####.BLB If present, this is displayed after the bulletin blurb, before Citadel builds message counts. If there is no JOKE.BLB file, Citadel displays "One moment please..." at this time. JOKE.BLB files are special in that they are not all output at once: before the pause when Citadel builds the message counts, Citadel prints out all lines of the file up to the first one that starts with the "#" character. After the pause, all lines after the first one that starts with the "#" character are printed out. This gives users something to think about while Citadel takes time to count messages. This is a rotating blurb. LENGTH.BLB This is displayed when the user presses the ? key when setting lines per screen with the .Enter Configuration (.EC) command. LOGOUT##.BLB This is displayed when the user issues the command to log out, before the BBS hangs up. This is a rotating blurb. MOREPRMP.BLB This is displayed when the user presses the ? key when setting a more prompt with the .Enter Configuration (.EC) command. MSGNYM.BLB This is displayed when the user presses the ? key when using the .Aide Name messages (.AN) command. NETPREFX.BLB This is displayed when the user presses the ? key when setting a new prefix with the .Enter Configuration (.EC) command. NEWMSG.BLB This is displayed to new users before they enter a message to sysop when "#LOGIN SYSOP_MESSAGE" is set in CONFIG.CIT. NEWQUEST.BLB This is displayed to users before asking the questions enabled by #NEWUSERQUESTIONS in CONFIG.CIT. NEWROOM.BLB This is displayed when a user in non-expert mode creates a room. NOANSWER.BLB This is displayed to users who have requested chat when the sysop does not respond to the request. NOCHAT##.BLB This is displayed to users requesting chat when chat is turned off, either for the system or for the user. This is a rotating blurb. The rotation is reset when a user logs in, so you can have the blurbs in a progressive sequence, hinting that you really are not around to chat. NOLOGIN.BLB This is displayed when a user is not able to log in for accounting reasons on systems with accounting enabled. NOROUTE.BLB This is displayed when Citadel cannot find the ROUTE.CIT file when trying to send networked mail. Why is this a blurb and not just a simple message? I don't know. NULLS.BLB This is displayed when the user presses the ? key when setting the number of nulls with the .Enter Configuration (.EC) command. NUMUSERS.BLB This is displayed when the user presses the ? key when setting the number of users to display on log- in with the .Enter Configuration (.EC) command. PASSWORD.BLB This is displayed to new users immediately before their name is requested. You can use this to give them some information about what you like for names: pseudonyms, full names, only first names, etc. PHONENUM.BLB This is displayed when the user presses the ? key when being prompted for a phone number. PROMPT.BLB This is displayed when the user presses the ? key when setting the room prompt format string with the .Enter Configuration (.EC) command. REALNAME.BLB This is displayed when the user presses the ? key when being prompted for a real name. RESUME.BLB This is displayed when a user logs in after losing the connection to the BBS while entering a message during the previous call: it informs the user of the situation so he can decide whether to continue entering the message. TEXTUP.BLB This is displayed to users not in expert mode when they issue the command to start a text upload. TIME.BLB This is displayed when the user presses the ? key when setting a time/date format string with the .Enter Configuration (.EC) command. TOOLOW.BLB This is displayed when a connection is made at a speed slower than the #MINBAUD setting in CONFIG.CIT. The BBS hangs up after displaying this blurb. TOOMANY.BLB This is displayed to users who have called more times in one day than their limit allows, as set with #CALLLIMIT in CONFIG.CIT or with the .Sysop Userlog edit (.SU) command. UNLINK.BLB This is displayed when the user presses the ? key when using the .Aide Unlink (.AU) command. USERINFO.BLB This is displayed to new users as soon as they request access. You can give general information about your BBS in this blurb. VERIFIED.BLB This is displayed when unverified users try to log in. WCDOWN.BLB This is displayed to non-expert users when they request a download. WCUP.BLB This is displayed to non-expert users when they request an upload. WIDTH.BLB This is displayed when the user presses the ? key while setting the screen width with the .Enter Configuration (.EC) command. WOWCOUNT.BLB This is displayed when the user presses the ? key when using the .Wowcount (.W) command. Menus Citadel's menus are all kept in the file CTDL.MNU in the path set by #HELPPATH in CONFIG.CIT. An optional file, CTDL.MN@, can be used to define ANSI menus. If a menu is not found in CTDL.MN@, Citadel will display the menu from CTDL.MNU. If the menu is not defined in CTDL.MNU, Citadel will use a default menu built into the program. These menu files are text files, with separator lines in between sections to let Citadel know which section belongs to which menu. These lines start with the "#" character and are followed by the menu's name. For example, a line "#AIDE" starts the Aide section of the menu file. The section ends when another section begins. The following menus are used by Citadel: #AIDE This is displayed when the .Aide Menu (.A?) command is used. #AIDEQUEUE This is displayed when the .Aide Queue Menu (.AQ?) command is used. #BULLETINS This is an optional menu. If it is not present, the BULLETIN.BLB file is displayed when a user logs in. If it is present, then it is used instead of the BULLETIN.BLB file. Because this is optional, there is no default for this menu. This menu is displayed line-by-line like other menus, except for lines that start with the "!" character. In this case, Citadel reads the line to determine what to do. The format for such lines is as follows: !filename character description show filename is the name of the file to display for this bulletin. character is the character to use to display this bulletin. description is the name of this bulletin, as shown to users. show can either be 1 or 0: if it is 1, then Citadel formats a prompt for this menu automatically. If it is 0, then no such prompt is formatted, allowing you to make as fancy a menu as you desire. For example, the following line describes a bulletin for showing system news: !news.txt s "System News" 1 Because "show" is set to 1, Citadel will display the following: S> System News After the menu is displayed to the user, Citadel prompts for which bulletin to read. #CRON This is displayed when the .Sysop Cron Menu (.SC?) command is used. #DOOR This is displayed when the .Enter Door Menu (.ED?) command is used. If this menu does not exist, then Citadel creates a menu based on the doors that have been set up in EXTERNAL.CIT. #DOWNLOAD This is displayed when the .Download Menu (.D?) command is used when there is no file queue defined. If this menu does not exist, then Citadel creates a menu based on the file transfer protocols that have been set up in PROTOCOL.CIT. #EDIT This is displayed when the Menu (?) command is used at the "Entry Command:" prompt of the message editor. #EDITTEXT This is displayed when the Menu (?) command is used at the "Entry Command:" prompt of the text editor when not entering a message (currently, only when editing a finger). #ENTERWC This is displayed when the .Enter With protocol Menu (.EW?) command is used. #ENTOPT This is displayed when the .Enter Menu (.E?) command is used. #FILEQUEUE This is displayed when the .Queue Menu (.Q?) command is used, if file queuing is enabled. See #PROTOCOL in PROTOCOL.CIT for information regarding file queuing. #FINGER This is displayed when the .Finger Menu (.F?) command is used. #GRPGLOB This is displayed when the .Sysop Group Group- specific membership Menu (.SGG?) command is used. #HELP This is displayed when the .Help Menu (.H?) command is used. If this menu does not exist, Citadel looks in the path set by #HELPPATH in CONFIG.CIT for all files with a .HLP extension, and lists these to the user. Citadel will also list any help files built into it that are not in the help path. #INVITE This is displayed when the .Invite Menu (.I?) command is used. #KNOWN This is displayed when the .Known Menu (.K?) command is used. #MAINDOT This is displayed when the .Menu (.?) command is used. #MAINOPT This is displayed when the Menu (?) command is used. #PERSONAL This is displayed when the .Personal hall Menu (.P?) command is used. #PERSONALADD This is displayed when the .Personal hall Add Menu (.PA?) command is used. #READOPT This is displayed when the .Read Menu (.R?) command is used. #READWC This is displayed when the .Read With protocol Menu (.RW?) command is used. #RESPONSEDOWNLOAD This is displayed when the .Queue Download Menu (.QD?) command is used, or when the .Download Menu (.D?) command is used when a file queue has been defined. If this menu does not exist, then Citadel creates a menu based on the file transfer protocols that have been set up in PROTOCOL.CIT. #SYSENTER This is displayed when the .Sysop Enter config file Menu (.SE?) command is used. #SYSGROUP This is displayed when the .Sysop Group Menu (.SG?) command is used. #SYSHALL This is displayed when the .Sysop Hall Menu (.SH?) command is used. #SYSNET This is displayed when the .Sysop 6.9 net command Menu (.S6?) command is used. #SYSOP This is displayed when the .Sysop Menu (.S?) command is used. #SYSTABLE This is displayed when the .Sysop Table debugging Menu (.S+?) command is used. #TERMINATE This is displayed when the .Terminate Menu (.T?) command is used. #UPLOAD This is displayed when the .Upload Menu (.U?) command is used. If this menu does not exist, then Citadel creates a menu based on the file transfer protocols that have been set up in PROTOCOL.CIT. #VOLKSWAGEN This is displayed when the .Volkswagen Menu (.V?) command is used. Help files Citadel has several help files built into it, all of which can be overridden by including a file by the same name in the path set by #HELPPATH or #HELPPATH2 in CONFIG.CIT. In addition, you may add as many more help files as you want just by including files with the .HLP extension in #HELPPATH or #HELPPATH2. Users may read any of these help files by using the .Help (.H) command followed by a filename. A list of help files is available by pressing ? instead of providing a filename. The following help files are included in Citadel: ACCOUNT.HLP The internal version declares that there is no accounting enabled on the BBS. If you enable accounting on your board, you should create your own ACCOUNT.HLP that details what you charge for and give time for. AIDE.HLP This explains all Aide-level commands. ANSI.HLP This explains Citadel's support of ANSI and its own special color codes. CONFIG.HLP This explains all options available for users to configure their userlog entry with the .Enter Configuration (.EC) command. DOHELP.HLP This gives a brief overview of the system. It is displayed when the user uses the Help (H) command. DOORS.HLP This explains how to access doors. FILES.HLP This explains how to upload and download files. GROUPS.HLP This describes groups and how they are used. HALLS.HLP This describes halls and tells how they are used. HELP.HLP This describes the help system. INTRO.HLP This gives an introduction to Citadel. This is also displayed when the user uses the Information (I) command. LOGIN.HLP This describes logging in. MESSAGES.HLP This describes messages. NETWORK.HLP This describes how to use the Citadel network. QUEUE.HLP This describes how to use file queuing. ROOMS.HLP This describes rooms. ROOMSYS.HLP This explains what a room system is. SPECIAL.HLP This explains some special commands. How a command comes to be regarded as special is beyond me. SPELL.HLP This describes the internal spell checker. SYSOP.HLP This explains all Sysop-level commands. Networking Citadels can share messages and files with each other. This is called networking. Citadel+ can network with many other versions of Citadel: all versions of Citadel derived from DragCit share a common networking protocol. Citadel+ also supports networking with Citadel-86 compatible software that supports the MSGOUT and MSGADD utilities. In addition, Anticlimactic Teleservices has significantly enhanced the networking protocols, so networking with other Citadel+es is faster, easier, and more reliable than netting in the "old style" way with the other Citadels. Citadel+ has also added file transfers to the basic message-only netting provided by the other Citadels. You can set up a network with just one or two other boards, so a few friends can have their own message and file passing system, or you can hook onto the main network of DragCit- derived Citadels, which spans the country. Most of the nodes listed in Appendix E are on this network, so you can check it for a possible connection to the network. The Anticlimactic Teleservice at (206)562-9792 is a good place to pick up a network connection: create a node account, then leave mail to "Sysop" giving your node's address and request to be given network access. General information Some things are the same across all the network revisions. Each node has to have an account on all the boards with which it networks, and at least one of them has to call the other. Also, a file named NODES.CIT contains additional information about the remote node that is needed for networking. Here are the basic procedures to start a network of any protocol, using two hypothetical BBSes named NODE1 and NODE2. First, create an account on the remote BBS. That is, create an account on NODE1 called "NODE2", and create an account on NODE2 called "NODE1". These are created like any other accounts: log in with new initials and password. Second, mark these accounts as Node accounts with the Node (O) option of the .Sysop Userlog edit (.SU) command. When you set the Node option, Citadel requests the node's address. See Appendix I for information on selecting your address. Wow. Appendix I has been removed, I think. Now, decide which node is going to call the other. (Both can call each other. This makes for the best netting, but if only one sysop wants to pay for a long distance net, only one should make the call, of course.) On each BBS that is going to be calling, add the following line to the file CRON.CIT: #DO NETWORK "Other Board" "Other Board" is the name of the other BBS (NODE1 or NODE2). At this point, the procedure differs for each of the supported network protocols, and is explained in the appropriate section below. DragCit 1.0/1.1: The oldest and slowest Versions 1.0 and 1.1 of the network protocol are essentially the same. Actually, there is some dispute as to whether there is any difference, or if 1.1 even exists. Regardless of its name, it is the original network protocol of DragCit. As the original, it is the one that is in all DragCit derived software. However, also because it is the original, it is the least desirable of the methods. (Other methods wouldn't be implemented unless they were better.) Only use it if the other node cannot use anything newer. To set up this type of networking, add the following lines to the NODES.CIT file for the remote BBS: #NODE "node_name" "node_region" #PHONE "node_phone" #BAUD 300...115200 #DIAL_TIMEOUT seconds to wait for CONNECT from modem #LOGIN see below #WAIT_TIMEOUT seconds to wait for a "W" in the #LOGIN string, as explained below. #NETWORK DRAGCIT1_1 #PROTOCOL protocol used, as specified in PROTOCOLS.CIT. This must be a batch protocol. The #LOGIN line is a simple script to follow to log into the remote BBS. The available commands are: D "protocol" "path" "file" Download. protocol is the file transfer protocol to use (as set in PROTOCOL.CIT); path is the path that the downloaded file should end up in; and file is the name of the file. If protocol is a batch protocol, then file is ignored, but it still needs to be there. P "time" Pause. time is the number of seconds to pause. R "text" "send" "tries" Repeat. This is a combination of Send and Wait. This waits for text to come in over the modem for #WAIT_TIMEOUT (as set in NODES.CIT) seconds. If it is not received in that time, it sends the text send to the modem, and starts waiting again. It does this tries times before giving up and aborting the script. S "text" Send. text is the text to send to the modem. U "protocol" "path" "file" Upload. protocol is the file transfer protocol to use (as set up in PROTOCOL.CIT); path is the path that the downloaded file should end up in; and file is the name of the file. If protocol is a batch protocol, then file may contain wildcards or multiple filenames, separated by spaces. W "text" Wait. text is the text to wait to come in over the modem. If the text does not appear in #WAIT_TIMEOUT (as set in NODES.CIT) seconds, the script is aborted. ! "cmd" Shell. cmd is the command line to shell to. All standard Citadel flags are available here, as explained in the Applications section. @ "script" This tells Citadel to read the text file specified by "script" and interpret it as more of the #LOGIN command. Citadel reads each line in this file, so it can have any number of #LOGIN commands. For example, you usually will wait for the prompt "initials:" and send your node's initials and password. This would be accomplished by the following line: #LOGIN W "initials:" S "initials;password\r" The "\r" is interpreted as a return; see the beginning of Section IV: Configuration Files for more special characters you may use. Then, choose if you want to share any groups between the two nodes. This is done by adding #GROUP lines to the NODES.CIT file, as follows: #GROUP "name_here" "name_there" If the group is named the same on both nodes, you only need to supply the name_here field. Then, choose which rooms you want to share messages in. Each room must be marked as "shared" on each system, and the node must be in the proper groups to access the rooms. Then, make a line for each room as follows: #ROOM "name_here" "name_there" As with the #GROUP lines, only one name has to be specified if the room name is the same on both nodes. The biggest thing to watch out for with Net 1.0/1.1 is improper room matching. Make sure both sysops agree which rooms to net, and make sure to net them both ways. Also, cross netting is easy to do by accident, and can be quite a pain to figure out. Make sure you have the room names correctly entered in the NODES.CIT file. Wow. Some conclusion. DragCit 1.5/1.6: Faster, but still messy One of the biggest bottlenecks in Net 1.0/1.1 is the file transfer: it transfers each room as a separate file and the file must be there even if it is zero bytes long. When netting more than a few rooms, the overhead of sending many short files is quite large. Also, there is significant time wasted as each system waits for the other. One system requests the rooms, then waits for the other system to prepare the message files to send back. Once the messages are passed in that direction, the order is reversed: the second system requests rooms from the first system and has to wait for it to prepare the message files to send back. In addition to all of this, the files are sent in raw ASCII form, so the files are bigger than they need to be. Net 1.5 solves these problems by switching the order the files are sent, and by compressing the message files before sending them. The order is switched so that both room requests are sent first, so both systems are fetching the messages at the same time. The total time spent fetching messages, therefore, is the length of time spent by the slower of the two systems, not the sum of both lengths. After the message files are created, they are compressed into one file by some archival program. To tell Citadel which one to use, add a #ZIP line to the NODES.CIT file as follows: #ZIP "compress_cmd" "decompress_cmd" When creating the command lines, use %d in place of the resulting file name. For the compress command, use %f for the original file name. (Make sure the compressor can handle more than one file name and make use of wildcards: Citadel will send "room.* mesg.tmp" as the file name.) To use PKZIP, for example, use the following line: #ZIP "pkzip %d %f" "pkunzip -o %d" Make sure the programs are either in the #APPLICPATH or on the DOS PATH so Citadel can find the programs to run. In addition to the #ZIP line in NODES.CIT, the only other addition to make to distinguish from Net 1.0/1.1 is the #NETWORK line. Use either: #NETWORK DRAGCIT1_5 or #NETWORK DRAGCIT1_6 Net 1.5 and 1.6 are almost identical. 1.6 is a little bit more robust, so use it if the remote BBS software supports it. Net 6.9: Citadel networking at its best (so far) Wow. More proofreading. As mentioned earlier, the biggest problem with the network up to this point is in cross netted and one-way netted rooms. It was hard to add a room to the network, as every connection had to add the appropriate #ROOM lines to the NODES.CIT file on both sides. If only one sysop remembered to do it, a one-way net would develop. Worse, the room names are up to each sysop's fancy, so cross-netting could develop quite easily: it was hard to keep track of what each sysop has named a room. Net 6.9 solves these problems by using Net IDs instead of room names to keep track of netted rooms. Net IDs are consistent across the network, so there is no possibility of crossing rooms. Net IDs are kept in the ROOM.DAT file, and are set with the .Aide Edit room (.AE) command. When networking, Citadel generates a room request file with all the Net IDs on the BBS. This eliminates the need for #ROOM lines in the NODES.CIT file, so networking is much easier to maintain, and more reliable: there is no dependence on sysops to verify that all rooms that can network do network, as it is done automatically by Citadel. To be able to use Net 6.9, you must first create a "Default" node in NODES.CIT. This entry sets how packets should be incorporated that came from nodes that your system could not identify. (It also sets the defaults for items in NODES.CIT, which apply to all other nodes in the file if there are no overrides for them.) Then set the #NETWORK keyword for the node to NET6_9, and Citadel will know to use Net 6.9 when networking with that node. The protocol specified by #PROTOCOL needs to be a bi- directional protocol. If you need (or prefer) to use a unidirectional protocol, set #NETWORK to NET6_9a, and make sure your network partner does so as well. Several keywords were added to the NODES.CIT file to help with Net 6.9. Of these, two important ones are #AUTOROOM and #VERBOSE. The reason for these two is that Citadel will request all rooms it carries from the remote node whether it has them or not; it has no way of knowing which rooms are available. This creates both a problem and an opportunity. The problem is that the error messages in Aide) can be very long if the remote node requests many rooms not carried locally. By setting #VERBOSE, you can specify which error and status messages are created. Valid values are as follows: All Show all error and status messages. File69In Tell when an incoming network file transfer is received. File69InFull Tell when an incoming network file transfer is received, and give full information about it. NetIDNotFound Tell when a Net ID is requested that is in NETID.CIT but does not exist on the system. NoAccess Tell when a node attempts to access a room that it cannot. NoNetIDOnSystem I don't know. RoomCreated Tell when a room is created with #AUTOROOM. RoomNotCreated Tell when a room could not be created with #AUTOROOM: a room by that name already exists, or there is no more space for new rooms. Citadel allows you to choose any of these you want. Additionally, if you choose "All" to turn them all on, you can then turn any off that you do not want on by placing an exclamation mark ("!") before it. For example, to turn on all messages except NetIDNotFound, use: #VERBOSE All !NetIDNotFound To turn all messages off, specify #VERBOSE followed by no options. The default is File69In. As the both name and some of the settings for #VERBOSE imply, Citadel can create networked rooms automatically with #AUTOROOM. If #AUTOROOM is set to 1, any unknown room requested by another node is first checked against the file NETID.CIT. If its Net ID is not in this file, then it is created and placed in the Maintenance hall. The Net ID is then appended to NETID.CIT. The sysop can then decide whether to keep the room and add it to an appropriate hall, or to kill the room. Because the NETID.CIT file is checked and updated as it is, a room will only be created by #AUTOROOM once; if the room is killed, it will not be re- created, as its Net ID is already in the NETID.CIT file. More control over rooms created by #AUTOROOM is provided by two more NODES.CIT keywords: #AUTOHALL and #AUTOGROUP. By setting #AUTOHALL for a node, you can specify a hall you wish rooms to be placed in, in addition to Maintenance. Similarly, #AUTOGROUP lets you specify a group to assign to all rooms created by #AUTOROOM. Another important new keyword is #REQUEST. If you want to get all rooms from the other board that you have access to, set #REQUEST to 0. This will ensure that you always get all new rooms from the other board. This is most often used by boards that run as network hubs, to ensure that they get all rooms. If, as is most often the case, you want to only carry some of the rooms, set #REQUEST to 1 (this is the default). This will make Citadel send a room request file to the other node with each network packet. You can tell Citadel to send a room request file with every nth packet by setting #REQUEST to that number, but there really is no good reason to do that. Just another case of Citadel over-engineering, really. (Well, there are some extreme cases when this could be helpful in a minor way, but you would have to be trying hard to make this the case.) However, Net 6.9 is more than just a better way to share messages. One of the added benefits is that of file transfers, though it is a bit rudimentary. To transfer a file to another node that you directly net with, create a file named FILE69.xxx, where xxx is the other node's alias, and put it in your #TRANSPATH, as defined in CONFIG.CIT. This file should be created in the same way as network packets as specified by the #ZIP keyword in NODES.CIT (usually by using PKZIP.) When Citadel next creates a packet to send to the other node, it will include this file in the packet. When the other node receives the packet, it will see this file and extract it into #DLPATH using the command specified by the #ZIP keyword. If it sees any FILE69.* files in #DLPATH after this, it will copy them to #TRANSPATH. In this way, you can pass files through many boards to get to your destination. For example, if you want to get a file to a board ZZZ, but you don't net with ZZZ, you can send that file to the board in steps. Assume that you net with board XXX, which nets with board YYY, which nets with board ZZZ. To transfer the file, therefore, you will need to send it to XXX, which will need to send it to YYY, which will need to send it to ZZZ. To do this, you would do the following: 1. Create FILE69.ZZZ, which contains the files you want to get to ZZZ. 2. Create FILE69.YYY, which contains FILE69.ZZZ. You can then get rid of FILE69.ZZZ. 3. Create FILE69.XXX, which contains FILE69.YYY. You can then get rid of FILE69.YYY. 4. Place FILE69.XXX in your #TRANSPATH. Then, when you network with XXX, you will send it FILE69.YYY, which it will then pass on to YYY, which will take FILE69.ZZZ out of it and pass it on to ZZZ, which will then extract the files you wanted to send to it. Note that not only is this far from easy, it is also far from fail-safe. Because the file names are not unique, your transfer might not make it through if another file transfer comes through and overwrites your file. This is one area tagged for future improvement. One of the other benefits of Net 6.9 is that the process of creating network packets, transferring them, and incorporating them, is all separate. Usually, you will just use the default setup, which does it all together as in previous network protocols. However, there are times when it is beneficial to take control, and specify that the networking happens in some other order. The most common of these is the case of long distance networking: by the default setup, all message fetching is done while the BBSes are connected. Usually, this is not much of a problem. However, when the connection costs money, things are different. To facilitate pre-fetching (that is, fetching the messages before the connection is established), use the NET69_OUT command in CRON.CIT. Have this event run once every four hours or so, and there will be a packet waiting to be sent when the connection to the other BBS is established. If there are one or more packets waiting to be transferred, Citadel will not fetch more messages, but instead just send the packets it has already created. This behavior can be modified with the #FETCH command in NODES.CIT. Another reason that you might want to deviate from the standard networking model is if you have two BBSes running on the same computer, one as a sub-board of the other, or on two computers connected by a LAN, or able to transfer files between the two in some other way. If you have two computers that each run a BBS that can access a shared directory over a LAN, for example, an efficient method to network them is to have the systems share a common #TRANSPATH. Have each system fetch once every hour or so, which will then have it dump a packet into the #TRANSPATH. Also have a NET69_IN command in CRON.CIT that runs once every hour or so, to pick up packets that are sitting in #TRANSPATH waiting for it. There are plenty of other reasons that you might want to create network packets separate from sending them to the other BBS immediately, some that have been thought of already and some that have not. Experiment. In addition to using commands in CRON.CIT to facilitate networking, the .Sysop 6.9 net command (.S6...) commands let you do things manually. The available sub-commands of this command are: F Fetch. This will create a network packet for the node you specify. I Incorporate. This will incorporate all incoming network packets that are on the local system. R Room request. This will generate a room request file for the specified node. You can then read through it and see which rooms you are requesting. Citadel-86 compatible networking Citadel+ can also network with systems that support the Citadel-86 method of networking. The Citadel-86 (or compatible system, such as Citadel-68K) needs to use the utility MSGOUT to create a packet that Citadel+ can read, and MSGADD to read packets that Citadel+ writes. Wow. Time and Date Formatting Citadel stores all times internally in Greenwich Mean Time (GMT). This means that times come over the network correctly set; if a user on the east coast was to leave a message at 1:00pm, for example, a BBS on the west coast will know that is 10:00am in its time zone. Citadel also computes daylight saving time, and adjusts the time zone as appropriate. Citadel's date stamps can be configured by the user to suit his preferences. In addition, #DATESTAMP and #VDATESTAMP in CONFIG.CIT provide date stamps for when there is no user logged-in. These are also used as defaults for new users, unless overridden with the #DSTAMP and #VDSTAMP keywords in DEFUSER.CIT. The TZ environment variable Before you run Citadel, you should set your time zone with the TZ environment variable. Do this from the DOS command prompt as follows: C:\>set TZ=XXX#YYY The meanings of XXX, #, and YYY are as follows: XXX Time zone name. # Number of hours difference from GMT when not in daylight saving time. YYY Daylight saving time zone name. For example, use the following command if you are in the Pacific time zone (the west coast of the United States): C:\>set TZ=PST8PDT This names the time zone as PST, tells Citadel that it is eight hours behind GMT, and that during daylight saving time to call the time zone PDT. If there is no TZ environment variable set, the default is Eastern Time (the east coast of the United States). Time/date format strings When setting #DATESTAMP, #VDATESTAMP, #DSTAMP, or #VDSTAMP, or when a user sets his date stamp with the .Enter Configuration (.EC) command, use the following variables: %a abbreviated weekday name (Sun, Mon, Tue...) %A full weekday name (Sunday, Monday, Tuesday...) %b abbreviated month name (Jan, Feb, Mar...) %B full month name (January, February, March...) %c standard date and time string. Wow. %d day-of-month as decimal (1-31) %D day-of-month as decimal (01-31) %H hour (00-23) %I hour (01-12) %j day-of-year as a decimal (001-366) %m month as decimal (01-12) %M minute as decimal (00-59) %p locale's equivalent of AM or PM %S second as decimal (00-59) %U week-of-year, Sunday being first day of week (00- 52) %w weekday as a decimal (0-6, Sunday being 0) %W week-of-year, Monday being first day of week (00- 52) %x standard date string. Wow. %X standard time string. Wow. %y year in decimal without century (00-99) %Y year including century as decimal (1900-) %Z time zone name (as set with TZ; see above) %% the percent sign If there are any #HOLIDAY lines in the EXTERNAL.CIT file, they will show up in place of the "%x" variable. Scroll-Back Buffer To create a scroll-back buffer, add the following line to the CONFIG.CIT file: #SCROLL_BACK color_flag num_lines time_out color_flag This is either 0 or 1. 0 means don't save color to the scroll-back buffer and 1 means to save colors. Saving the color information is visually appealing, but takes more memory, so you are not able to save as many lines. num_lines This is the number of lines to save. In the Regular version with a standard 80-column display, you can save 408 lines if color_flag is 1 and 818 lines if color_flag is 0. You can save fewer lines on a wider (such as 132- column) display, but I don't know how many right off. Basically (as this is a goofy Intel-based segmented architecture machine), you get up to 64K to play with. You do the math. You can just set this to some impossibly high number like 9999 and let Citadel compute the maximum for you if you want. The Auxmem version stores the scroll-back buffer in EMS, XMS, or virtual memory, so this limit does not apply. time_out This is the number of seconds you can be idle in the scroll-back buffer before you are kicked out. While using the scroll-back buffer, nothing else works: users cannot log in; the screen saver will not turn on; cron events won't execute. If you set this to 0, you will never time out. This is a good way to disable the board if you want... When running Citadel, use the Alt+K key combination to activate the scroll-back buffer. When the scroll-back buffer is active, the following commands are available: B Search for text backwards in the buffer from the current position. G Go to a specified line in the buffer. S Search for text forward in the buffer from the current position. W Write text from the buffer to a file on disk, starting at the top of the current screen. Cursor Up Move one line farther back into the buffer. Cursor Down Move one line forward in the buffer. PgUp Move one screen farther back into the buffer. PgDn Move one screen forward in the buffer. Home Move to the beginning of the buffer. End Move to the end of the buffer. Esc Return to normal operation. Note: Even when #BIOS is set to 1, the buffer uses direct screen writes when being displayed. Spell Checker Citadel has a spell checker built into its internal message editor. The default dictionary to use is found in #LEXPATH and its name is defined by the #DICTIONARY keyword, both set in CONFIG.CIT, but the name can be overridden on a room-by- room basis using the .Aide Edit room (.AE) command. The default #DICTIONARY is ENG-AM.DAT (American English), which is also the only dictionary that Anticlimactic Teleservices provides currently. You can create your own dictionary by using CTDL -O or Control+F6, G and selecting "Compile dictionary". The input to this function is simply an alphabetically sorted list of words, one per line. Citadel reads this file, then writes out an indexed compressed version of it that it can use as a dictionary. The Customization Kit comes with the list of words used to create the default ENG-AM.DAT dictionary; you can add your own words to this list and use the resulting enhanced dictionary. You can also create your own dictionaries, perhaps for languages other than American English. By attaching one of these dictionaries to a room, you can, for example, have a French dictionary in a room devoted to learning and practicing French. The spell checker is accessed by using the Verify spelling (V) command of the message editor. It has three modes: Terse, Regular, and Verbose. In Terse mode, it just lists the words that it cannot find in its dictionary. In Regular mode, it lists the words that it cannot find in its dictionary, and gives some suggestions as to the correct spelling of the words. In Verbose mode, it enters a dialog that lets you replace all occurrences of a misspelled word with the correct spelling, or update your personal dictionary if the word is spelled correctly. A special fourth mode, Automatic, operates like Verbose mode. It is called Automatic, however, because it runs automatically whenever the message is saved. It is best to have Citadel confirm the Save command when using the spell checker in Automatic mode. (This is enabled by using the Message editor options (E) subcommand of the .Enter Configuration (.EC) command. The current mode can be changed by the Spell checker mode (P) option of the Message editor options (E) subcommand of the .Enter Configuration (.EC) command. This subcommand also lets you manipulate your personal dictionary: you can add words to it, remove words from it, or list the words currently in it. Citadel checks the personal dictionary when verifying the spelling of a word, but not when looking up suggestions for an incorrectly spelled word. Users should choose the mode best suited for their spelling ability; good spellers might not want to spend the time it takes Citadel to determine possible correct spellings for a word that it cannot find in its dictionaries. Average spellers might like suggestions for correct spellings, but might not want to enter the full session with the spell checker that a poor speller might desire. And poor spellers might appreciate the full spell checker and corrector, especially when in Automatic mode. Status Line and Screen Citadel usually has a single status line at the bottom of the screen to alert you to what is going on with it. You can turn this status line off if you want by using the Shift+F10 keystroke. Alternatively, you can turn on a second status line with the Alt+F10 keystroke. You can also turn on a help window with the F10 keystroke. If you really want to go into information overload, turn on the status screen with the F4 keystroke. The standard status line The status line is displayed on the last line of the console screen. This has ten sections that display information about what the BBS is up to: In the first section (that is, before the first "|" character), the name of the currently logged-in user is displayed. If there is no user logged-in, this is used to display a clock and calendar. The second section is used to tell where Citadel thinks the user is. If this is displayed as "Modem", then Citadel thinks there is a caller on-line over the serial port. If carrier is not present, then Citadel resets, logging off the current user. If this is displayed as "Console", then Citadel ignores anything commands sent to it over the serial port. (Except that it will answer the phone if it gets a call, and switch to Modem mode if it gets carrier.) However, if carrier is present, then text is output to the serial port. This is also used to determine where to echo hidden information (such as mail): either the modem or the system console. You can use the F5 keystroke to toggle between these two modes. Be careful if you are logged on locally and there is no caller on-line, however: if you switch to Modem mode, then Citadel will check for carrier, see there is none, and reset itself, thinking the user just dropped carrier. The third section is used to report the presence of carrier: it will contain either the text "CD" (carrier detect) or "NC" (no carrier). The fourth section is used to report the speed. If there is no carrier or you are in dial-out mode, then this is the port speed between the computer and the modem. If there is a caller on-line, then this is the speed of the connection between the two modems. (These are generally the same at lower speeds.) Speeds of over 9600 baud are abbreviated: 12.0, 14.0, 16.8, 28.8, 57.6, 115K, and 230K. This is because there is only four characters to display the speed in. (Would you believe that this status line was designed, and the space allocated to the speed section, when 9600 baud was a dream?) The fifth section is used to report the time left in the current user's account in minutes. If there is no user on- line, or accounting is disabled (either for the current user or for the whole system), then the text "NA" is displayed. If it is currently special time for the current user, the text "SpTm" is displayed. If the current user has over 9,999 minutes (6 days, 22 hours, 39 minutes), the text "Lots" is displayed, as there are only four digits available for the time. The sixth section is used to display system status flags: The first flag is either "E" if the modem is enabled (the BBS will answer calls) or "D" if disabled (the BBS will now answer calls); the second flag is either the male symbol (an "o" with an arrow extending out of it to the upper right) if there is mail waiting for the sysop and #CHECKSYSMAIL in CONFIG.CIT is set, or blank if not; the third flag is a double musical note if bells are turned on, a single musical note if turned on only to run the chat request, or blank if bells are turned off; the fourth flag is the Yen symbol (an upper-case "Y" with an equals sign in the middle of it) if output filtering (Alt+B) is turned on, or blank if not; the fifth flag is the Greek letter phi (an upper-case "I" with a circle in the middle of the vertical part) if debug mode (Alt+D) is turned on, or blank if not; the sixth flag is a symbol I don't know the origin of (sort of like a sun) if the console is locked, or blank if not; and the seventh flag is the approximately equals symbol (a wavy equals symbol) if ignore up-time (Alt+U) is turned on, or blank if not. The seventh section displays the status of the Chat command: "Chat" if chat is enabled and the current user has not requested chat; "RCht" if chat is enabled and the current user has requested chat; "rcht" if chat is disabled and the current user has requested chat; or blank if chat is disabled and the current user has not requested chat. The "RCht" and "rcht" chat-requested messages flash. You can clear the requested message by pressing F9 twice, which toggles chat mode. The eighth section displays "Prt" if output is being trapped to the printer file (which is toggled with Alt+P) or blank if not. The ninth section displays "REQ" if the system has been requested (F3 or Alt+F3), or blank if not. The tenth section displays flags that give information about the current user: "A" if the user is an Aide, "T" if the user is a Problem-user (twit); "P" if the user is Permanent; "N" if the user has Network privileges; "U" if the user is Unlisted; "S" if the user is a Sysop; and "M" if the user may not leave mail. The second status line The second status line has three sections: First, the name of the current hall; second, the name of the current room; and third a clock (and calendar if your display is wide enough). The help window The help window displays the function of the 10 function keys F1 through F10. This stays up for two minutes after it is displayed. It really doesn't give much help, does it? The status screen The status screen gives a quick summary of the status of the system. On the top line is the version of Citadel that is running, the current time and date, and a display of how long the BBS has been up. On the next few lines on the left side of the screen is the name of the current user, room, and hall. On these lines on the right side of the screen are the command that the user is using and the length of time that the user has been logged into the system. If accounting is enabled, this also shows the time left in the user's account. On the next few lines are a display of the count of characters sent and received since the last user logged in, a display of the count of messages entered and read since the last user logged in, and a display of the current user's poopcount if there is a user logged in. On the next line is a display of memory. In the regular version, this is the amount of memory free. In the Auxmem version, there is first a display of the amount of conventional memory free, followed by a display of the amount of EMS, XMS, and virtual memory used (note: used, not free). (If any of these forms of memory is not in use, it will not appear on the screen.) On the next line is the current speed of the serial port, and the speed of the modem-to-modem connection if there is a connection. The rest of the screen is devoted to a list of significant system events that have occurred, along with the time that they occurred. User Configuration One of the strengths of Citadel is that users have a high degree of control over the appearance of the BBS. Sysops can configure new users in any way they desire, can edit any user's configuration, and can control what users can change to some degree. Users use the .Enter Configuration (.EC) command to change their configuration. Sysops use the .Sysop Userlog edit (.SU) command to change the configuration of users; see the User Editing topic for full information on this command. The configuration of new users is specified in the DEFUSER.CIT file, and some options of the .Enter Configuration (.EC) command can be turned off in the CONFIG.CIT file with the #ECCOLOR, #ECSIGNATURE, #ECTWIRLY, and #ECUSERLOG keywords. See Section IV (Configuration Files) for full information on the DEFUSER.CIT file and the CONFIG.CIT keywords. The .Enter Configuration (.EC) command is used for almost all editing of users' configuration. The only setting that falls outside of this command is the initials and password used to log in. Those are set with the .Enter Password command. The .Enter Configuration (.EC) command is based on menus, with various depths of sub-menus. The main menu that appears when the command is first invoked includes the following options: D Toggle room descriptions. Room descriptions are files that the sysop can attach to a room to give some explanation of the room. If this option is turned on, then Citadel displays this file to you the first time you enter a room during a call. If this option is turned off, then Citadel does not display the contents of this file. - Toggle hall descriptions. Hall descriptions are files that the sysop can attach to a hall to give some explanation of the hall. If this option is turned on, then Citadel displays this file to you every time you enter a hall during a call. If this option is turned off, then Citadel does not display the contents of this file. + Toggle room info lines. Room info lines are brief (80 characters or fewer) descriptions of rooms, which may be created when a room is created or changed later by an Aide. If this option is turned on, then Citadel displays this line to you every time you enter a room. If this option is turned off, then Citadel does not display the line. 1 Toggle wide rooms. When you use the Known rooms (K) command, Citadel displays the rooms in one of two methods, depending on the setting of this option. If this option is turned on, then the room list is displayed in two columns, making it easy to see which rooms are being listed. If this option is turned off, then Citadel displays as many rooms as it can per line, separating each room with a comma, fitting the maximum number of rooms per line. X Toggle auto next hall. When this is turned on, Citadel automatically takes you to the next hall on the system when you enter a window room. This usually works well to take you through the system without every having to manually change halls, but it does not work as well if the sysop has created an elaborate hall and window scheme. W Toggle twirly cursor. When Citadel is waiting for user input, it can display a twirly cursor, to let you know that it is waiting. Note that the cursor pattern is under the sysop's control, so it might not actually twirl. V Toggle auto verbose. Usually, to get more information when reading messages, the Verbose (V) modifier is used in the .Read Messages (.RM) command. This setting is useful for people who always want the full message header, by forcing verbose mode to always be on. This also affects a few other commands that have a Verbose mode. L Toggle verbose logout. This option turns on verbose mode for only the .Terminate (.T) command. This is useful for people who always want full log- out information (such as time on the system, number of messages read and entered, etc.), but do not want to see everything verbosely. This option is not available when Auto verbose (V) is enabled, as it would be redundant: this is a subset of that option. U Toggle list in userlog. Turning this setting off makes it so that other users cannot see your entry in the userlog, and therefore cannot know when you last called, or that you even called at all. This does not, however, prevent Aides from being able to see your entry. H Toggle helpful hints. Helpful hints give you more information about what Citadel is doing, or expects from you. After a while, these notes become more annoying than helpful. When this happens, turn them off with this option. Y Toggle you are here. For users new to room systems, turning this on may help navigating the system. When this is on, it presents a list of accessible halls and rooms before every room prompt. O Toggle last old on new. It is often easier to keep track of the discussion in a room between calls by viewing the last old message when you read the new messages in a room. Turning this feature on gives you this reminder. M Toggle Minibin login stats. When logging on to a Citadel, it usually gives you information regarding what has happened since your last call: the number of callers the system has had since then, the number of messages they left on the system, etc. If you do not want to see this information, turn it off with this option. J Toggle display of subjects. Messages may have subjects, telling what the message is about. However, some users find these to be redundant: the subject can be known by reading the message. Turning this option off keeps Citadel from displaying message subjects. @ Toggle pause after message. Citadel usually displays all messages to the user with no pausing, leaving it up to the user to determine when to pause the output. However, some users find it easier to have Citadel pause after every message it displays. Turning this option on makes it do that. G Toggle display of signatures. Signatures are attached to the bottom of messages, and usually have no relevance to the message and are quite repetitive, and thus often are thought of as annoying. Use this option to suppress the display of signatures. C Toggle clear screen before message. Usually, Citadel displays messages one after the other when the user is reading them. Some users, however, prefer to have each message start fresh at the top of a blank screen. Turn this option on to have Citadel do this. This is only available if the user has ANSI terminal emulation turned on. (See Terminal settings (T), later in this list.) Note that it is highly recommended that you also turn Pause after message (@) on if you choose to use this feature. I Toggle display of titles and surnames. Citadel gives users the ability to add text both before their names (titles) and after (surnames). They may be informative, humorous, bizarre, or whatever else the user wants. If you find them all to be just annoying, use this option to suppress the display of them. 5 Format strings. This displays a sub-menu that has the following options: B Back to previous menu. This returns to the main menu. N Net prefix. When listing rooms, Citadel prepends the net prefix to the room name to let you know that it is a networked room. Additionally, the default room prompt (which can be changed by the sysop, or by each user individually with the Prompt format (P) format string option, described later in this list) displays the net prefix before networked rooms. P Prompt format. This lets the user change what the room prompt looks like. It is possible, for example, to have Citadel give the current time as part of the prompt, or the group the current room belongs to, or many other pieces of information. For a full explanation of what is allowed for a prompt format, press the ? key when setting the prompt. # Time/date stamp. This lets the user change what the time stamp looks like. It is possible, for example, to have Citadel give the day of the week in numeric form (0 being Sunday, 1 being Monday, etc.), in short form (Sun, Mon, etc.), or in long form (Sunday, Monday, etc.). There are two format strings used: regular and verbose. When reading messages with Verbose turned on, and most other times that Citadel gives a time, the verbose format string is used. When reading messages without Verbose turned on, the regular format string is used. For a full explanation of what is allowed for the time/date format, press the ? key when setting it. > Default hall. Usually, Citadel logs all users into the Root hall (which the sysop may have renamed). Some users wish to start in another hall, which may contain the rooms they read most. This can be accomplished by setting the default hall to whatever is desired. P Default protocol. Usually, Citadel waits for the user to supply a file transfer protocol when the Upload (U) and Download (D) commands are used. If a default protocol is specified, Citadel uses that instead. The default protocol can be overridden by using the .Upload (.U) and .Download (.D) commands, which always wait for a protocol. _ Signature. Messages can have two signatures: one for the board and one for the user. The board's signature is defined by the sysop. This is used to define the user signature you wish to have appended to your messages. F Forwarding address. You can choose to have exclusive messages sent to you to be forwarded to another user. This other user can be someone on the board, or someone on another board on the network. Just enter the user's name and Citadel will start forwarding any new messages. By choosing this option and selecting no name, you can turn off forwarding if it is currently on. Note that "forwarding" is not the best term: the message is still available to you, so it is more of a "cc" function. & Address. If you have a hard-to-type name, you may want to set an address for your account. Then, other users just have to enter your address to send mail to you. (For example, a user with the name John Quilcene Jackovichsky, Jr. might use his initials: JQJ.) T Terminal settings. This brings up a sub-menu that has the following options: A Toggle ANSI mode. Enabling ANSI mode tells Citadel to display various messages with different attributes, which makes it easier to read the board. C Toggle ANSI color. Enabling ANSI color tells Citadel to interpret the ^A codes that set color. I Toggle IBM graphics characters. Enabling IBM graphics characters tells the board to send all characters out without translation. This enables users to see IBM extended ASCII characters, such as the line drawing symbols. Users without IBM PC or compatible computers (or some other computer with the same character set) would want to turn this option off, which tells Citadel to translate such characters into the graphically closest approximation, using standard seven bit ASCII. W Screen width. This tells Citadel how wide your terminal screen is, which it uses to properly word wrap output. Most terminals support 80 columns today. Valid values range from 10 to 255 columns. U Toggle uppercase only. This tells Citadel to send all text out mapped to uppercase letters only. This is useful for users with older terminals that cannot handle lowercase letters. F Toggle linefeeds. This tells Citadel to send a linefeed (ASCII 10) after every carriage return (ASCII 13) that it sends. This is required to prevent line overwriting for many terminals, but double spaces the text on others. T Toggle tabs. This tells Citadel to send tab characters out. If this is turned off, Citadel sends enough spaces to simulate eight- space tab stops. On terminals that support tabs, message reading is slightly faster when this option is turned on. (Very slightly, since tabs are not used often.) N Nulls. This tells Citadel to send out nulls as filler between sending a carriage return and linefeed (if so configured) to the user. This is useful on slower terminals, which might not be able to keep up with the baud of the connection. If you cannot see the first characters of each line, set this to the number of missing characters. M Music. This tells Citadel that your terminal supports music codes. Most terminals do not, but users of those that do might want to enable this, in case the sysop has put such codes into the board. L Lines per screen. This sets the number of lines after which Citadel should pause the display. This screen pause can also be turned off with this option by specifying 0 lines. R Attributes. This prompts for color numbers to send in response to the ^A0 through ^A4 codes. This is only available if you are configured to use ANSI. You will be prompted for each color number; enter either the number or press the ? key to view a list of available colors. B Back to previous menu This returns you to the main menu. O IBM Room prompts. This is only available if IBM Graphics characters are turned on. This changes the flags at the end of the room prompt to use IBM Extended characters. > More prompt. This specifies the text to display when pausing on a full screen, or between messages. 6 Personal information. This option brings up another menu, with the following choices: R Real name. This lets you set your real name. Real names are never displayed to any users other than sysops on a Citadel. However, they are written to networked messages. If a room is networked into some other network that requires real names, they may be displayed on the other network. P Phone number. This lets you set your phone number. Phone numbers are never displayed to any users other than sysops, and never leave the board in networked messages. 1 Address line 1. 2 Address line 2. 3 Address line 3. These let you set your street mailing address. Your mailing address is never displayed to any users other than sysops, and never leave the board in networked messages. B Back to previous menu. This returns you to the main menu. R Message read options. This option brings up another menu, with the following choices: A Author-based exclusions. This option brings up another menu, with the following choices: L List. This lists your current author- based message exclusions. Citadel will not display any message from an author that you have excluded. A Add. This adds another author-based message exclusion. R Remove. This removes an author-based message exclusion. B Back to previous menu. This returns you to the Message read options menu. N Node-based exclusions. This option brings up another menu, with the following choices: L List. This lists your current node-based message exclusions. Citadel will not display any message from a node that you have excluded. A Add. This adds another node-based message exclusion. R Remove. This removes a node-based message exclusion. B Back to previous menu. This returns you to the Message options menu. T Text-based exclusions. This option brings up another menu, with the following choices: L List. This lists your current text-based message exclusions. Citadel will not display any message containing text that you have excluded. A Add. This adds another text-based message exclusion. R Remove. This removes a text-based message exclusion. B Back to previous menu. This returns you to the Message options menu. R Region-based exclusions. This option brings up another menu, with the following choices: L List. This lists your current region- based message exclusions. Citadel will not display any message from a region that you have excluded. A Add. This adds another region-based message exclusion. R Remove. This removes a region-based message exclusion. B Back to previous menu. This returns you to the Message options menu. O Notify on exclusion. When Citadel excludes a message, it can either do it silently, or it can tell you that it is skipping the message. This option tells it which one to do. E Toggle exclude encrypted messages. To keep Citadel from displaying encrypted messages, turn this on. M Message author tags. This option brings up another menu, with the following choices: L List. This lists your current message author tags. These are extra text after a user's name in a message header. You can set more than one for a user, as well. These can be used as a reminder about who the user is, or any other personal note to yourself. A Add. This adds another message author tag. R Remove. This removes all tags on a specified author. B Back to previous menu. This returns you to the Message options menu. B Back to previous menu. This returns you to the main menu. Z Pointer edit menu. This option brings up another menu, with the following choices: S Set all pointers. This sets all message pointers in all rooms to a specified value. This can be beneficial after returning to a board that you have not called for a few months; you can set the pointer back by a few hundred, so you only have that many new messages to read, not a few thousand. N Set all pointers to new. This sets all message pointers in all rooms to make all messages on the system new. O Set all pointers to old. This sets all message pointers in all rooms to make all messages on the system old. R Set pointer for a room. This sets the message pointer for a specific room to a specified message. This is useful if you only read some of the messages in a room. You can set the message pointer to the last message you read, then bypass the room. On the next call to the system, only messages newer than the last one you read will be new. D Display all pointers. This shows the message pointer for every room on the system that you have access to. B Back to previous menu. This returns you to the main menu. E Message editor options. This option brings up another menu, with the following choices: V Verbose continue. When using the Continue (C) command of the message editor, Citadel can either display the whole message to you as it has been entered up to that point, or just the last 100 bytes. Turning this on tells Citadel to display the full message, and leaving it off tells it to only display the last 100 bytes. P Spell checker options. This brings up another menu with the following options: Wow. All the options. P Spell checker mode. This configures Citadel's spell checker for your preference: Automatic, Verbose, Regular, or Terse modes. R Remove word from dictionary. This removes a word from your personal dictionary. A Add word to dictionary. This adds a word to your personal dictionary. L List words in dictionary. This lists the words in your personal dictionary. S Confirm Save. This tells Citadel to confirm your choice to save a message when in the message editor. A Confirm Abort. This tells Citadel to confirm your choice to abort a message when in the message editor. E Confirm not .EO. This tells Citadel to confirm the loss of aborted messages by not using the .Enter Old Message (.EOM) command when entering a message after aborting the last one. B Back to previous menu. This returns you to the main menu. S Save. This asks for confirmation, then (if you confirm your choice) saves your configuration as you have specified it and returns to the room prompt. A Abort. This asks for confirmation, then (if you confirm your choice) aborts any configuration changes you have made and returns to the room prompt. Room Editing Users with Aide access are able to edit most attributes of rooms. This is done with the .Aide Edit room (.AE) command. Sysops can use this command to edit the few attributes that Aides are not allowed to modify. Note that this command does not change the location of the room in the hall structure: that is done by editing the halls, and is explained in the Hall Editing topic. When the .Aide Edit room (.AE) command is used, Citadel prompts for a room name, using the current name as a default. If a valid name is entered, Citadel provides a menu with the following options: N Name. This changes the name of the room. I Infoline. This changes the infoline of the room. D Directory. Only Sysops are allowed to pick this option. This allows the room to be linked to a directory on disk to facilitate uploads and downloads. To prevent remote sysops from accessing parts of the disk that you want to keep private, use the #DIRECTORY keyword in EXTERNAL.CIT. L Application. Only Sysops are allowed to pick this option. This allows an application to be linked to the room. See the Applications topic for more information on applications. F Description file. Only Sysops are allowed to pick this option. A description file is a text file on disk that describes the room. Users can configure to view this file when they enter the room for the first time each call. G Access group. This allows the room to be restricted to a specific group of users. You can use Boolean expressions to assign access to groups. For example, you might wish to limit a room to "Group 1" AND NOT "Group 2", which would cause the room to be only accessible to people in Group 1 but not in Group 2. The main sysop set by #SYSOP in CONFIG.CIT is always allowed into all rooms. V Privileges group. This allows a certain group to be given more privileges than others. After picking a group to give the privileges to, Citadel asks what privileges to give to the group. The questions it asks are: Read only? If a room is read-only, then only members of the privileges group are allowed to enter messages in it. Group moderates? If a room is moderated, then all messages left in it are not visible to callers other than the original author and the room's moderators. The moderators can release the messages for others to read. This allows you to let a whole group of people moderate the room. Download-only? If a room is download-only, then only members of the privileges group are allowed to upload to it. Upload-only? This question is only asked if you do not make the room download-only. If a room is upload-only, then only members of the privileges group are allowed to download from it. H Toggle hidden. If a room is hidden, then users must know the exact room name to get to it the first time. Once they go to it once, Citadel remembers that they have found the room, and lets them back in as if it was a normal room in the future. The main sysop as set by #SYSOP in CONFIG.CIT is always allowed into all rooms. B Toggle BIO. BIO stands for "By Invitation Only". BIO rooms are similar to hidden rooms, but the user must be explicitly invited to the room to access it: merely knowing the name is not enough. (Users are invited with the .Invite... (.I...) commands.) The main sysop as set by #SYSOP in CONFIG.CIT is always allowed into all rooms. Y Toggle anonymous. Citadel does not store any information about the authors of messages in anonymous rooms. (However, sysops can configure Citadel to keep track of anonymous messages in the trap file, if they are concerned about security or legality.) Only Sysops are allowed to make Lobby, Aide, or Mail anonymous. M Toggle moderated. If a room is moderated, then all messages left in it are not visible to callers other than the original author and the room's moderators. The moderators can release the messages for others to read. Unless the privileges group is set to moderate the room, Aides are the only moderators. (Unless the sysop has turned off Aides' ability to moderate rooms with #MODERATE in CONFIG.CIT, in which case only Sysops can moderate rooms.) E Toggle network/shared. Only Sysops are allowed to change this. If a room is marked as network/shared, then its messages can be shared with the Citadel network. W Network ID. The Network ID is used to identify the room on the Citadel network when using the Net 6.9 protocol. Each room shared on the network has a unique Network ID. P Toggle permanent. Permanent rooms do not appear when using the .Sysop Zap empty rooms (.SZ) command. Lobby, Mail, Aide, and Dump are always permanent. U Toggle subject prompt. Citadel can be set to prompt for a subject when entering a message in the room. R Archive. Only Sysops on console are allowed to change this. Rooms marked as Archive rooms have their messages stored in a text file in addition to in Citadel's message base. This allows the messages to be stored even after the message base scrolls: Citadel never empties the archive file. X Toggle Nonexcludable. Rooms marked as nonexcludable cannot be excluded with the Exclude room (X) command. C Dictionary. Only Sysops on console are allowed to change this. Citadel allows alternate spell- checker dictionaries to be set for each room. This allows, for example, rooms dedicated to a foreign language to have a dictionary for that language. S Save. This saves the changes made, after asking for confirmation. A Abort. This aborts all changes made, after asking for confirmation. Hall Editing Wow. User Editing Sysops can use the .Sysop Userlog edit (.SU) command to edit the configuration of other users. When the .Sysop Userlog edit (.SU) command is used, Citadel asks for the name of the user to edit, using the current user as the default. If a valid name is entered, it provides the following menu: L Lock title and surname. If a user's title and surname are locked, then he cannot change them himself. K Lock signature. If a user's signature is locked, then he cannot change it himself. Y Toggle Sysop. This sets whether the user has Sysop privileges or not. D Toggle Aide. This sets whether the user has Aide privileges or not. O Toggle node. This sets whether the user is a node on the Citadel network or a person. P Toggle permanent. This sets whether the user's account is permanent or not. Permanent accounts are not removed to make room for new callers. E Toggle net user. This sets whether the user's messages are sent out on the network always, or if an Aide has to release them first. T Toggle twit. This sets whether the user's messages are visible to other users always, or if an Aide has to release them first. M Toggle mail. This sets whether the user can send mail to other users or not. V Toggle verified. This sets whether the user is verified or not. Non-verified users are not allowed to log in. 4 Toggle enter borders. This sets whether the user can change the system's borders with the .Enter Border (.EB) command. H Lock default hall. If a user's default hall is locked, then he cannot set it. C Toggle chat. This sets whether the user is allowed to use the Chat (C) command or not. R Toggle room creation. This sets whether the user is allowed to create rooms or not. This is in addition to limits set by #ROOMOK in CONFIG.CIT. 3 Toggle 300 baud output. This sets whether the user is presented with a simulated 300 baud connection or not. This is meant as a method to discourage the user from using the board much. 1 Toggle psycho chicken. This sets whether the BBS switches to psycho chicken mode when the user calls. U Toggle upload. This sets whether the user is allowed to upload files. 5 Toggle download. This sets whether the user is allowed to download files. F Toggle trap to print file. This sets whether the printfile set by the #PRINTER keyword in CONFIG.CIT is opened when the user logs on. N Name. This allows you to change the user's name. 2 Calls per day. This lets you limit the number of times a user can call in a day. (Midnight to midnight.) . User configuration. This presents the same menus available with the .Enter Configuration (.EC) command, except Save and Abort are replaced with B for Back to previous menu. S Save. This asks for confirmation, then saves the data entered if confirmation is given. A Abort. This asks for confirmation, then aborts the data entered if confirmation is given. SSection III: Command Reference The Citadel command structure is quite powerful. It has been designed to make the most common commands quickly accessible. Most commands that are used during a call to a Citadel are a single keystroke. The less common, and more dangerous, commands take at least two keystrokes. This lets new users quickly remember all they need to know for using the system, while protecting them from accidentally doing something they did not want to do. The multiple keystroke commands are usually forms of the single-key commands that include command modifiers. That is, the command to enter a message is just E for "Enter". To enter an exclusive message (a message that can only be read by one other person), the command is .EE for "Enter Exclusive". The period tells Citadel that you are starting an extended command. All multiple keystroke commands start with a period. (You can also use the comma (,), slash (/), or space ( ) characters to invoke an extended command. This makes it easier to start such a command: use whichever key you find easiest to use. For simplicity and clarity, only the period key is mentioned in the documentation.) Common single-key commands The following commands are the ones most often used while logged into a Citadel. They only require a single keystroke. B Bypass. This command works like the Goto (G) command, but it does not update the new pointer for the current room. That is, messages that were new when you entered the room are still considered new when you exit the room. This is a good way to skip a room so you can come back to it on a later call, and not miss any new messages. Unless the room being bypassed is the Lobby, Citadel will not take you back to this room during the current call. C Chat. This command rings the console speaker to page the sysop. If the sysop is around, he can enter chat mode, where the user and the sysop can type to each other in real-time. The console page can by turned off by the sysop with the F9 key, in which case Citadel will display NOCHAT.BLB to the user. E Enter message. This command lets the user enter a message in the current room. F Forward messages. This command displays all messages in the current room, from the oldest to the newest. G Goto. This command goes to the next room in the current hall with unread messages. It may also go to the next window room, depending on the setting of #SUBHUBS in CONFIG.CIT. H Help. This command prints out help information to the user. J Jumpback. This command returns to previously visited rooms, in reverse order of leaving them. K Known rooms. This command lists all known rooms in the current hall, telling the user which ones do and which ones don't have new messages. N New messages. This command displays all new (unread) messages in the current room, from the oldest to the newest. This is the most common way to read messages. O Old messages. This command displays all old (read) messages in the current room, in reverse order from the newest to the oldest. This command is a good way to check up on what was recently said in the room. R Reverse messages. This command displays all the messages in the current room in reverse order, from the newest to the oldest. T Terminate. This asks for confirmation, then terminates the connection between the user and the board. > Next hall. This command takes the user to the next hall that a window room has access to. This is usually used after rooms with new messages in the current hall have been visited. The ] key can be used instead of the > key. < Previous hall. This command takes the user to the previous hall that a window room has access to. The [ key can be used instead of the < key. ? Menu. This displays a list of available commands. Often, the only commands that are used during a call to a Citadel are the New messages (N), Goto new messages (G), Enter message (E), and Next hall (>) commands, followed by a Terminate (T) command at the end. When the user logs in, he is shown all new messages in Lobby, the first room. He can then post a message with the Enter message (E) command. After finishing with Lobby, he can use the Goto new messages (G) command to go to the next room with new messages, and then the New messages (N) command to read them. He can then choose to enter a message in this room with the Enter message (E) command before using the Goto new messages (G) command to go to the next room with new messages. When he is done with the first hall, he can use the Next hall (>) command to go to the next hall, where the Goto new messages (G)/New messages (N)/Enter messages (E) loop starts up again. After visiting all halls, he can use the Terminate (T) command to end the call. Less common single-key commands The following commands are also single-key commands, but are not as commonly used. A Aide edit room. To use this command, the user must be an aide. This lets the user edit the attributes of a room, such as its name and access group. D Download. This command lets the user download from the current room if it is a directory room. (Directory rooms end with a "]" character.) I Introduction. This command displays INTRO.HLP as an introduction to the BBS. L Login. This logs the user onto the board. This command is usually only used on console; most boards are set up to automatically log callers on when they first connect by setting #FORCELOGIN in CONFIG.CIT to 1. M Enter exclusive (Mail). This sends an exclusive message to another user on the board, or possibly on the network if the board is connected to the network. U Upload. This command lets the user upload to the current room if it is a directory room. (Directory rooms end with a "]" character.) V Auto verbose toggle. When verbose mode is on, more information is displayed as you use Citadel. X Exclude. This command excludes the current room from being visited by the Goto new messages (G) and Bypass (B) commands. The room is still accessible by the user if he uses the .Goto (.G), .Bypass (.B), Next room (+), or Previous room (-) commands. When not in expert mode, Citadel asks for confirmation when excluding a room. To unexclude a room, go to it then use this command again. It is impossible to exclude the Lobby, or any other room that has been set as non-excludable with the .Aide Edit room (.AE) command. + Next room. This command goes to the next room on the system. This is not usually used, because the Goto new messages (G) command goes to the next room with new messages, which is usually the only type of room users want to visit anyway. As "+" is often a special character for modems, the = key will do the same thing. - Previous room. This command goes to the previous room on the system. This is not usually used, because the Goto new messages (G) command goes to the next room with new messages, which is usually the only type of room users want to visit anyway. The backspace key also moves the user to the previous room. ; Small chat. This gives users and sysops a quick way to communicate with each other. After the ; key, up to 255 characters can be entered, which Citadel ignores but can be seen by the user of either computer. Multiple key (extended) commands Multiple key, or extended, commands all start with a period followed by one or (usually) more keystrokes. The subsequent keystrokes sometimes set an option of another command. For example, the .Read (.R) family of commands usually are used to read messages. If you want to read only messages from one user, you would use the .Read By-user (.RB) command. At this point, you can still choose more qualifiers, such as .Read By-user Keyword search (.RBK) to search for messages that the user left containing a certain word or phrase. When you have picked enough qualifiers, you then invoke the command. In this case, you would use the M key or the Enter key (Enter because Messages is the default) to finish off the command: .Read By-user Keyword search Messages (.RBKM) or .Read By-user Messages (.RBM). These qualifiers could, however, have been applied to another command. In the previous example, .Read By-user was applied to the .Read Messages (.RM) command. It could also have been applied to the .Read Userlog (.RU) command, as .Read By-user Userlog (.RBU). Not all qualifiers can be used with all commands, of course. For example, the Keyword-search option means nothing to the .Read Userlog (.RU) command. Don't worry about hurting anything, though. If you enter .Read Keyword-search Userlog (.RKU), Citadel will just ignore the Keyword-search option and do a standard .Read Userlog (.RU) command. Following is a list of all multiple key commands and qualifiers in Citadel. .Read (.R...) commands ## Number of messages. Just enter a number after .Read, such as ".R10" to read that number of messages. This also works with the .Read Userlog (.RU) command. A All. This reads all messages in all rooms on the system. It is good to combine with the Keyword search (K) or By-user (B) option to search for messages. M Messages. This tells Citadel to start reading messages with the currently defined options. You can also use the Enter key to start reading messages. # By message number. This tells Citadel where to start reading. For example, to read all messages numbered under 100, use .Read Reverse By message number Messages (.RR#M) and Citadel will ask for which message number. Enter 100, and it will display all messages with a number under 100. To read all messages over 100, use "Forward" instead of "Reverse" (.RF#M). & By date. This tells Citadel that you want to read only messages after or before a certain date. When you start the command, Citadel will ask for the date, then whether you want to read messages before or after that date. Enter B or A to specify which. Messages on the date specified are always include. ! Header scan. This tells Citadel that you only want to display message headers, and not read the actual message text. This is a good way to quickly scan messages. K Keyword search. This prompts you for a keyword to search for when reading messages. Only messages containing the keyword are displayed. The * keystroke can be used for K if desired. B By-user. This searches for messages by user, using wildcards if desired. This also searches node names, so you can read all messages posted on a certain node with the command. By-user also affects the .Read Userlog (.RU) command. C Configuration. This displays the configuration of the currently logged-in user. D Directory. This displays the contents of the directory for directory rooms. (Directory rooms end with the "]" character.) E Exclusive. This searches only for exclusive messages. F Forward. This reads messages in the forward direction. G Group-only. This reads only messages posted in a certain group. This command also affects the .Read Userlog (.RU) command. H Halls. This lists all hallways that the current room is in. I Info file. This displays file information for files in directory rooms. (Directory rooms end with the "]" character.) L Local. This reads only messages that did not come in over the network. N New. This reads only messages that have been posted since the last time you were in the current room. This also affects .Read Directory (.RD), .Read Info file (.RI), and .Read Archive file (.RZ) commands. For these commands, Citadel asks which date to consider "new" files to be after. It also affects the .Read Userlog (.RU) command, by listing only those users who have called since your last call, or the last time somebody logged- in on console if there is nobody currently logged- in. O Old. This reads only messages that were posted before the last time you were in the current room. This also affects .Read Directory (.RD), .Read Info file (.RI), and .Read Archive file (.RZ) commands. For these commands, Citadel asks which date to consider "old" files to be before. It also affects the .Read Userlog (.RU) command, by listing only those users who have not called since your last call, or the last time somebody logged- in on console if there is nobody currently logged- in. P Public. This reads only non-exclusive, non-group- only messages. R Reverse. This reads the messages in reverse order, from newest to oldest. This also affects the .Read Userlog (.RU) command. S Status. This displays the current system status, including such things as how much memory is free, how many messages are on the system, etc. T Text file. This displays the contents of a file in a directory room to the user. (Directory rooms end with the "]" character.) U Userlog. This displays a list of users who currently have accounts on the system. V Verbose. This tells Citadel to display more information when reading. It affects the following commands as follows: Messages All information in the message header is displayed. Text file The text file is passed through Citadel's word wrapping code, making many text files look better to the user. UserlogDisplays the last call time and date and number for the users, and their titles and surnames. Status Shows more information. Directory Shows file dates, sizes, and approximate download times. Info file Shows file uploaders, dates and times, sizes, and approximate download times. Additionally, users can use the Auto verbose (V) command to turn on auto verbose mode. In this mode, all commands are treated as if they have the Verbose modifier. W With Protocol. This downloads files from directory rooms. Use the .Read With protocol Menu (.RW?) for a listing of available file transfer protocols. (Directory rooms end with the "]" character.) Z Archive file. This views the contents of archived files. Citadel relies on external archiver viewers to be set up with #ARCHIVER in EXTERNAL.CIT to view these files. A list of which ones have been set up is available with the .Read Archive file Menu (.RZ?) command. ? Menu. This displays a list of available commands. .Sysop (.S...) commands These commands are only available to people with sysop accounts. In addition, anybody at console can use these commands by using the F6 key, unless the console has been locked with #F6PASSWORD in CONFIG.CIT. > Create PATH.DAT. This command creates a file containing all paths of all networked messages on the system. This can then be used by a network map generator. A Abort. This returns to the room prompt. 1 Reset Maintenance hall. This command puts all rooms in Maintenance. C Cron. This provides another choice of commands, as follows: A All done. This sets the last try and last succeeded times of all events to the current time. D Done. This sets the last try and last succeeded time of a certain event to the current time. E Enter. This reads CRON.CIT, replacing all information in memory. This is the same as the .Sysop Enter CRON.CIT (.SET) command. F Force. This lets you force the execution of a specific cron event. L List. This lists all cron events in memory. N Next event set. This sets the next cron event for Citadel to try to execute. P Pause. This toggles cron pause. When cron pause is turned on, no cron events execute. R Reset event. This resets a cron event to the "never-done" state and unzaps it. S Set success time. This lets you set the "last succeeded" time of a cron even to any date and time desired. Z Zap event toggle. If an event is zapped, then it will not execute automatically: you could still force it with the .Sysop Cron Force (.SCF) command. ? Menu. This displays a list of available commands.. O Off hook. This takes the modem off hook. This only works if logged-in on console. D Date set. This sets the time and date. E Enter config file. This provides a choice of which files to reload, as follows: A All. All files are reloaded. C CONFIG.CIT. E EXTERNAL.CIT. G GRPDATA.CIT. I MCI.CIT M MDMRESLT.CIT] P PROTOCOL.CIT T CRON.CIT. ? Menu. This displays a list of available commands. F Aide function. This operates exactly the same as the .Aide (.A...) command. G Group. This provides another choice of commands, as follows: E Edit. This lets you change the attributes of a group, such as its name and whether aides are locked from it. Although you can also use the R (for "rename") key for this, don't: this ability may not exist in future versions of Citadel. G Group-specific membership. This lets you add or remove every user on the system from a specified group. Citadel prompts for each user. K Kill. This lets you kill a group. L List. This works the same as the .Aide List group (.AL) command. N New. This creates a new group. O Operator-specific membership. Wow. U User-specific membership. This lets you add or remove a user from every group on the system. Citadel prompts for each group. ? Menu. This displays a list of available commands. H Hall. This provides another choice of commands, as follows: F Force access. This moves you into a specified hall. K Kill. This removes a hall. L List. This lists all halls on the system. N New. This lets you create a new hall. E Edit. This lets you change the attributes of a hall, such as its name or group. The R key can also be used. G Global room. This lets you add or remove every room on the system from a hall. - Move hall backward. This moves the current hall back one in the hall file. + Move hall forward. This moves the current hall forward one in the hall file. ? Menu. This displays a list of available commands. I Info file reset. This packs FILEINFO.DAT, the file that Citadel uses to keep track of files for upload and download, which users can see with the .Read Info file (.RI) command. Over time, this file gets fragmented and full of extra information. This command just reorders it for quicker lookups. Because the file is reset every time Citadel is started, the only time this command should be used is if the board has lots of file moving, deleting, or uploads without being taken down. J Journal room. This command copies all messages in a room from a specified number onward into a file. It is a shortcut to using the Alt+P command to capture messages to a file. K Kill user. This command removes a user's account from the system. L Login enable. This enables a single remote new- user login when "#LOGIN CLOSED_SYS" is entered into CONFIG.CIT. (If it is not a closed system, remote new-user logins are always allowed). M Mass delete. This command kills all messages from a specified user. N New user verify. This command prompts you for each unverified or problem user on the system, asking if you want to give the user regular access or not. If you choose not to do so, you are then given the option to kill the user's account. P Purge userlog. This command goes through all users in the userlog, asking if you want to remove the user. This is good for corrupted userlogs, when there may be many users you want to remove but cannot even type their names, or if someone tries to scroll your userlog by logging in with many false accounts. This starts with the last user in the userlog, and works backwards. R Run script file. This command runs a Citadel script file. S Show user. This command shows the current configuration of a user, as if the user had used the .Read Configuration (.RC) command. U Userlog edit. This command lets you edit the userlog entry of a user. X Exit Citadel. This command takes the board down and exits to the operating system. It can only be used on console. Z Zap empty rooms. This command goes through all unused rooms (those with no messages in them) and asks if it should delete each one. ! Shell to DOS. This command invokes a copy of the DOS command shell, letting you run other programs or DOS commands. @ Super-shell to DOS. This command invokes a copy of the DOS command shell, letting you run other programs or DOS commands. It also removes most of Citadel from conventional memory, giving you a large amount of free conventional memory. On systems with no free EMS or XMS memory, Citadel needs to write a large amount of information to disk for this to work, which takes some time. Therefore, only use this command on such systems if you need the extra memory for what you plan to do while shelled out of Citadel. + Table debugging. This provides another choice of commands, as follows: M Message. This displays what is in the message table, which can be useful for debugging. R Room. This displays what is in the room table, which can be useful for debugging. 6 6.9 Net command. This provides another choice of commands, as follows: F Fetch. This fetches messages for a node and generates an outgoing network packet. I Incorporate. This incorporates any incoming network packets that are found in the #TRANSPATH. R Generate room request. This generates a room request file for a node, but does not send it out to the node. @ Build address. This reads MSG.DAT and builds addresses in ROUTE.CIT. < Wow. > Wow. ? Menu. This displays a list of available commands. ^ Auxmem memory status. This command lists EMS, XMS, and swap file usage for the Auxmem version of Citadel. This command does not exist in the Regular version. # Read by message number. This command reads messages specified by message number. Messages that the current user does not have access to (for example, mail between other users) cannot be viewed with this command. % Full path file download. This command lets you download any file on the system, restricted by any #DIRECTORY keywords in EXTERNAL.CIT. ? Menu. This displays a list of available commands. .Aide (.A...) commands These commands are only available to people with aide accounts. In addition, anybody at console can use this command by using the F6 key and the Aide function (F) subcommand, unless the console has been locked with #F6PASSWORD in CONFIG.CIT. A Attributes. This can be used to change the DOS attributes (read-only and hidden) of a file in a directory room. (Directory rooms end with the "]" character.) C Chat. This works similarly to the Chat (C) command, but is active even when the sysop has toggled chat off with the F9 key. The sysop can use #AIDECHATHRS in CONFIG.CIT to disable this command during specific hours of the day (or, more often, night). E Edit room. This command can be used to change the attributes of a room, such as its name or owning group. This is the same as the Aide edit room (A) command. F File set. This command asks for file comments for all files in a directory room without comments. (Directory rooms end with the "]" character.) G Group. This command adds users to and removes them from groups. H Hall. This command adds rooms to and removes them from halls. This can be limited to sysops by setting #AIDEHALL in CONFIG.CIT to 0. I Insert message. This command inserts the currently marked message into the current room. J Jump to Aide) and Maintenance. This command takes the user to the Aide) room and Maintenance hall, if he has group access to them. K Kill room. This command removes a specified room from the system. L List group. This command can either list groups on the system, or which users, rooms, and halls belong to a certain group. To get a list of groups on the system, don't provide a group when asked. To get a list of what belongs to a certain group, provide a group when asked. M Move file. This moves a file from one directory room to another. (Directory rooms end with the "]" character.) N Name message. This lets you change what messages are called on the system. To work, message nyms have to be enabled with the #TWIT_FEATURES keyword in CONFIG.CIT. Q Queue. This provides another choice of commands, as follows: A Auto mark/kill/censor toggle. When these are enabled, you are asked if you want to mark, kill, or censor each message that you read. C Clear. This clears the message queue. I Insert. This copies all messages in the queue into the current room. K Kill. This kills all messages in the queue. L List. This lists all messages in the queue. M Move. This kills all messages in the queue and then copies them into the current room, as if the user used the .Aide Queue Kill (.AQK) command followed by the .Aide Queue Insert (.AQI) command. R Room mark. This puts every message in the current room into the queue. S Sort. This sorts the queue by message number, either ascending or descending. V Verbose. This turns on verbose mode, which affects the Insert, Kill, List, and Move commands. In non-verbose mode, these commands print out the message numbers of the messages affected. In verbose mode, these commands print out the headers of the messages affected. ? Menu. This displays a list of available commands. R Rename file. This can be used to rename a file in a directory room. (Directory rooms end with the "]" character.) S Set file information. This can be used to change file the description of a file in a directory room. (Directory rooms end with the "]" character.) U Unlink file. This can be used to unlink (delete) a file in a directory room. Sysops can use this command to unlink multiple files in a directory room by specifying wildcards. (Directory rooms end with the "]" character.) W Window room. This changes whether a room is a window into a specific hall. This can be limited to sysops by setting #AIDEHALL in CONFIG.CIT to 0. - Move room back. This moves a room back in the list of rooms, to before the previous room in the current hall. Note that there is only one list of rooms, so any change in one hall affects all other halls that the room is in. + Move room forward. This moves a room forward in the list of rooms, to after the next room in the current hall. Note that there is only one list of rooms, so any change in one hall affects all other halls that the room is in. < Copy message to old-buffer. This can be used to copy the contents of any visible message on the system and into the "old-buffer". The user can then use the .Enter Old (.EO) command to re-post the message. ? Menu. This displays a list of available commands. .Chat (C) command This operates identically to the Chat (C) command. .Download (.D...) command Wow. .Enter (.E...) commands A Application. This is used to run the room's application, if any has been specified with the .Aide Edit room (.AE) command. B Border. This lets the user modify borders, if borders are turned on for the board and the user has border modification access. C Configuration. This lets users change their configuration. See the "User Configuration" topic in Section II for full information regarding this command. D Door. This lets users run a door that has been set up in EXTERNAL.CIT with the #DOOR keyword. E Exclusive message (Mail). This enters a message that can be read by only one other user. Additionally, sysops can add the Group-only modifier to this command to leave mail to every member of a group: .Enter Group-only Exclusive message (.EGE). G Group-only. This is used to create Group-only messages and rooms by adding it to the .Enter Message (.EM) and .Enter Room (.ER) commands: .Enter Group-only Message (.EGM) and .Enter Group- only Room (.EGR). A Group-only message can only be read by members of the group, and a Group-only room can only be visited by members of the group. Citadel will ask for the group's name. H Hall. This moves to any hall that the current room windows into and that the user has access to. This is an alternative to the Next hall (>) and Previous hall (<) commands. L Local. This is used to create Local messages by adding it to the .Enter Message (.EM) command: .Enter Local Message (.ELM). Local messages never network off of the system they were entered on. M Message. This enters a message in the current room, using any modifiers (such as Group-only) that have been used. The Enter key can also be used for this. N Name. This is used to change the color and case of the current user's name. Additionally, sysops can use this command to completely change their name. O Old. This is used to revive the contents of an aborted message: .Enter Old Message (.EOM) will place the text of the aborted message into the message editor and let the user continue editing the message. P Password. This is used to change the user's password. R Room. This is used to create a new room. S Surname / Title. If allowed by #TWIT_FEATURES in CONFIG.CIT, this can be used by users to change their title and surname. T Text file. This is used to create a text file in a directory room. (Directory rooms end with the "]" character.) W With protocol. This is used to upload files into directory rooms using an internal file transfer protocol. Use the .Enter With protocol Menu (.EW?) command to list available protocols. (Directory rooms end with the "]" character.) X Exclude room. This is identical to the Exclude room (X) command. * File-linked. This is used to create File-linked messages: .Enter File-linked Message (.E*M). File- linked messages have no message text of their own; they just point to a file on the disk to display as message text. If the file specified is not present, then Citadel displays an error message stating this. Only sysops can create File-linked messages. When file-linked messages network off the board, only the first 8K of the file is sent out, as the limit on normal Citadel messages is 8K. ? Menu. This displays a list of available commands. .Goto (.G...) command This prompts for a room to go to, then takes you to that room. This will only allow you to specify rooms in the current hall. If a room with the exact name you specify is not found, Citadel will then look for rooms that start with what you specify. If it still cannot find any matches, it checks for any room that contains what you entered anywhere in its name. If there are still no matches, it says it cannot find a room, and stays in the current room. .Help (.H...) command Wow. .Jumpback (.J) command This command is identical to the Jumpback (J) command. .Known (.K...) commands Most of these commands are modifiers to the .Known Rooms (.KR) command, which lists rooms in the current hall. Any number of these modifiers can be used together, though some cancel others out (such as Local and Shared). If you specify two such mutually-exclusive options, the last one specified is used, and the first one ignored. A Application. This lists only rooms with room applications. Y Anonymous. This lists only anonymous rooms. P Permanent. This lists only permanent rooms. D Directory. This lists only directory rooms. H Halls. This lists all halls that the room is contained in that the user has group access to. G Group-only. This lists only rooms that have a group, or that belong to a specific group. When you use this command, Citadel asks for a group; just press Enter to list all rooms that belong to any group, or specify a group to list all rooms belonging to that group. L Local. This lists only rooms that are not shared on the network. N New. This lists only rooms that have new messages in them. O Old. This lists only rooms that have no new messages in them. E Exclusive-message. This lists only rooms that have unread mail in them. M can also be used for this. S Shared. This lists only rooms that are shared on the network. I Room information. This lists information about the current room, such as which halls it is in, what group owns it, etc. R Rooms. This lists rooms in the current hall. Enter can also be used for this. V Verbose. This performs a verbose listing, which shows more information about what is being listed. T This hall only. This lists rooms that are in no other halls. This is generally used only in Maintenance, to see which rooms have been created by #AUTOROOM recently when #AUTOHALL is not specified in NODES.CIT. W Window. This lists all rooms that exit to other halls. X Excluded. This lists only rooms that have been excluded by you. 0 Empty. This lists only rooms that have no messages in them. ) Hidden. This lists only hidden rooms that you have found. B BIO. This lists only BIO rooms. # Number of messages. This lists the number of messages in all rooms that are listed. ? Menu. This displays a list of available commands. .Login (.L...) command This is similar to the Login (L) command, but does not display system information (such as the node's name, etc.), and accepts the initials and password immediately. .Mail search (.M) command This skips to the next room on the system with unread exclusive messages. It checks rooms in all halls the current user has access to. .Bypass (.B...) command This prompts for a room to go to, then takes you to that room, without updating the message pointers for the current room. This will only allow you to specify rooms in the current hall. If a room with the exact name you specify is not found, Citadel will then look for rooms that start with what you specify. If it still cannot find any matches, it checks for any room that contains what you entered anywhere in its name. If there are still no matches, it says it cannot find a room, and stays in the current room. Once a room is bypassed, Citadel will not take you to it with the Goto new messages (G) command or the Bypass (B) commands for the rest of the call. .Terminate (.T...) commands Q Quit-also. This logs the user off of the board and hangs up. Y can also be used for this. S Stay. This logs the user off of the board, but does not hang up. V Verbose. This lists information about the call when logging off, such as the number of messages entered and read. ? Menu. This displays a list of available commands. .Upload (.U...) command Wow. .Invite (.I...) commands L List users. Wow. R Room list. Wow. U User. Enter Wow. ? Menu. This displays a list of available commands. .Expert toggle (.X) command This provides a quick way to toggle helpful hints on and off. .Queue (.Q...) commands These only work if file queuing has been enabled on the system with #RESPONSEDOWNLOAD in PROTOCOL.CIT. A Add. This adds a file in the current room to the queue. C Clear. This clears the queue by removing all files from it. D Download. This downloads all files in the queue. L List. This lists all files in the queue. R Remove. This removes a specified file from the queue. ? Menu. This displays a list of available commands. .Menu (.?) command This displays a list of all available commands. Message Editor Commands When entering text into a message, press Enter on a blank line to bring up the "Entry Command:" prompt of the message editor. At this point, the following commands are available: A Abort. This aborts the message being entered and returns to the room prompt. If this command is used by accident, the .Enter Old (.EO) command will revive the aborted message. By default, Citadel asks for confirmation when aborting a message. However, this can be overridden with the Confirm Abort (A) option of the Message Editor options (E) subcommand of the .Enter Configuration (.EC) command. C Continue. This returns to the text entry mode. By default, Citadel displays the last 100 characters of the message before returning to text entry mode. To have Citadel display the whole message, use the Verbose Continue (V) option of the Message Editor options (E) subcommand of the .Enter Configuration (.EC) command. D Delete buffer. This deletes all of the message text that has been entered, and returns to the text entry mode. Citadel asks for confirmation when using this command, as there is no way to undo it. E Encrypt message. This asks for a key to use to encrypt the message. The key is case sensitive, and you must remember it if you want to be able to read the message in the future: the key is needed to decrypt the message when reading it. By default, only mail may be encrypted, but the sysop has control over which types of messages may be encrypted with the #ALLOWCRYPT keyword in CONFIG.CIT. He may choose to allow all messages to be encrypted, or no messages to be encrypted. F Find and replace. This prompts for text to replace, then finds the most recent occurrence of it, starting with the end of the message. It then asks if you want to replace this text. If you answer no, Citadel finds the next matching text, and prompts to replace it. This continues until you answer yes, when it asks for the text to substitute, or until no more matches are found. I Signature. This lets you change the user signature of the message. The _ key can also be used to change the signature. L Location. This displays the current room and hall. P Print formatted. This displays the message as it would appear when read. This is a good way to ensure that your message is formatted the way you want. R Replace. This operates as Find and replace (F), but is more of an expert-level command: you are not prompted for the occurrence to replace. Citadel finds the last occurrence of the text in the message, and replaces it with what you specify. Use this with caution, especially as a new user. S Save. This saves the message and returns to the room prompt. By default, Citadel does not ask for confirmation when saving messages. However, this can be overridden by using the Confirm Save (S) option of the Message Editor options (E) sub- command of the .Enter Configuration (.EC) command. U Subject. This lets you change the message's subject. V Verify spelling. This runs a spell checker on the message. Citadel's spell checker has many options, which are described in the Spell Checker topic. W Word count. This counts the characters, words, and lines (as Citadel thinks) of the message. ! Link application. This is available only to sysops on console. It links the message to an application (see the "Applications" topic in this section) to the message, so that the application is run every time the message is read, after the message is displayed. If the message is transferred to another board on the network, this link is lost. ~ Allow ESC. This toggles whether Citadel will save the Escape character (ASCII 27) to the message or not. By default, it strips this character, to avoid confusing people who try to use the arrow keys for message editing. However, some people might want to include ANSI sequences in their messages; they must use this command to tell Citadel to save the Escape character to do so. @ Address message. This lets you change the address of the message, for sending mail to other users. # Special delivery options. This sets special delivery options for mail. The only one currently implemented is receipt confirmation requested. If a message is marked as such, then Citadel generates a message addressed to you confirming that the message was received when it is read by the recipient for the first time. Note that if the message is networked mail destined to software that is not Citadel+ on the network, then the confirmation will not be sent. Also, if the message passes through some other software that does not pass the special delivery information, the response will not be sent. < Insert file. This command is available only to sysops on console. It reads the contents of any file on disk and appends it to the message, up to Citadel's 8K message limit. * Change name. This lets users change their title and surname for this message only. Sysops have the added capability to change their name for this message only. ? Menu. This displays a list of available commands. Output commands Citadel lets you enter certain commands while it displays text, depending on what is being displayed. The possible commands are: P Pause. This works almost all the time. It pauses the output of text until another key is pressed. Control+S also works for this. N Next. This works when displaying text files, help files, or messages. It skips to the next text file, help file, or message. S Stop. This works almost all the time. It stops the output flow. J Jump. This works when displaying messages, and a few other times. It jumps to the next paragraph or section of what is being displayed. If there is no next paragraph or section, this operates the same as the Next (N) command. K Kill. This works when reading your own message, or any message if you are an aide. It lets you kill the message. ! Header scan. This works when reading messages. It toggles header scan mode. R Reverse. This works almost all the time (often times, when you don't think it will). It reverses the output flow. V Verbose toggle. This works often. It toggles verbose mode on and off. M Mark. This works for aides reading messages. It marks a message to insert later with the .Aide Insert (.AI) command. Console-only commands There are also commands that only work on console. These use the IBM extended keys, such as those generated by Alt with another key or the function keys. These keys are only active when there is no window currently displayed on the screen that has the input focus. F1 Shutdown. This disables the modem, and Citadel stops answering the phone. This is only temporary, and is usually used to hang up on the current user. When Citadel next reinitializes the serial port (which it does periodically to ensure that it is still active), the system will start answering the phone again. Ctrl+F1Speech toggle. If an external sound driver is loaded that has support for speech synthesis, this will toggle whether Citadel uses it or not. Alt+F1 Clear screen. This clears the console screen and places the cursor in the top left corner. This is available even when the console is locked with #F6PASSWORD in CONFIG.CIT, unless #FULLCONLOCK in CONFIG.CIT is specified. F2 Reset. This re-initializes the serial port. Like F1, this hangs up on the current user. However, it immediately starts answering the phone again. Ctrl+F2Toggle input focus. This switches the input focus from the TTY interface to the last focused window, if there are any windows currently displayed. If not, this does nothing. F3 Request. This tells Citadel to wait until the current user terminates, then alert you and wait for you to log on or turn off request mode. This lets you log onto the system after the current caller. Alt+F3 Request with an attitude. Wow. F4 Status screen. This switches from the terminal screen to a status screen, which displays some information about the system. This screen is updated in real time while the user operates the board. The update is quick enough that the status screen can be left up all the time, even on a slow computer. The user will not notice a difference. F5 Console / Modem mode. If a user is logged on via modem, you can take control of the call by switching to Console mode. While you can always enter commands while a user is logged-in, switching to Console mode keeps the remote user from being able to do anything. If a user is logged in on console, switching to Modem mode make Citadel think that a user on the modem hung up the phone, and logs the console user off. F6 Sysop function. This has the same effect as the .Sysop (.S...) command, but is available even if the currently logged-in user is not a sysop. Alt+F6 Aide toggle. This toggles the aide status of the currently logged-in user. Sft+F6 Sysop toggle. This toggles the sysop status of the currently logged-in user. Ctrl+F6Console sysop. This brings up a windowing interface to the sysop functions. F7 Bells toggle. This changes the current bells setting: whether Citadel rings the computer's bell any time it encounters a Control+G, only when the Control+G is part of the chat page, or never. F8 Chat mode. This brings the user into chat mode the next time he encounters a prompt. Alt+C can also be used to bring the user into chat mode. If there is no user on, this enters dial-out mode. F9 Chat toggle. This toggles whether the system rings the chat bell when a user requests chat with the Chat (C) command, or if it just displays NOCHAT.BLB to the user. F10 Help. This displays a little help window at the bottom of the screen, explaining what function keys do what. Alt+H will also show this help window. Sft+F10Status line toggle. This turns off the status line at the bottom of the screen. Alt+F10Second status line toggle. This toggles between single and double line status line modes. Alt+A Accounting toggle. This turns accounting on and off for the currently logged-in user. Alt+B Filter toggle. This toggles the output filter as set by #FILTER in CONFIG.CIT. Alt+D Debug toggle. This toggles Debug mode. In Debug mode, Citadel gives extra information about what it is doing, to help track down problems. Alt+E Event time-out. This executes the next cron event that is ready to be executed, if any. Alt+F Force event. This executes the current cron event, even if it is not time to execute it. Alt+K Scroll-back buffer. This brings up Citadel's scroll-back buffer, if it has been defined with #SCROLL_BACK in CONFIG.CIT. Alt+L Console lock toggle. If there is a #F6PASSWORD defined in CONFIG.CIT, this will let you lock and unlock the console keyboard. Alt+P Printing toggle. This will turn on and off the print file. Alt+R Repeat event. This executes the current cron event, and does not set the cron event pointer to the next event until it is successful. Alt+S Screen saver. This activates the screen saver. Alt+T Twit toggle. This toggles the problem user status of the currently logged-in user. Alt+U Ignore up-time toggle. This ignores the #UP_DAYS and #UP_HOURS in CONFIG.CIT and lets the board answer the phone at any time. Alt+V Verified toggle. This toggles the verified status of the currently logged-in user. Alt+X Exit. This exits from Citadel. The Alt+F4 keystroke can also be used to exit. Alt+Z Time-out. This forces a time out of the currently logged-in user. This is a somewhat more "polite" way to take over the computer, as compared to using the F1 or F2 keys. PgUp More time. This places five minutes in currently logged-in user's account, if accounting is turned on. PgDn Less time. This removes five minutes from the currently logged-in user's account, if accounting is turned on. Dial-out commands When in dial-out mode, the following console commands are available: Alt+D Debug toggle. This is the same as Alt+D outside of dial out mode. Alt+E Shell. This shells to DOS, leaving all of Citadel in memory. Alt+H Hang-up. This hangs up the phone. Alt+K Scroll-back. This is the same as Alt+K outside of dial-out mode. Alt+P Duplex toggle. This toggles between full and half duplex. Alt+Q Exit dial-out mode. This returns to normal mode. Alt+S Super-shell. This shells to DOS, swapping most of Citadel out of memory. Alt+V Status screen. This is the same as F4 outside of dial out mode. PgUp Speed up. This increases the current baud rate. PgDn Slow down. This decreases the current baud rate. FKeys Macros. All function keys, shifted function keys, controlled function keys, and Alted function keys are reserved for macros when in dial out mode. Use the #DIALMACRO keyword in CONFIG.CIT to defining them. Window commands When a window has the input focus, the following commands are available, in addition to any specified by that window (the window can also disable any of these commands, though none does currently): Ctrl+F2Switch to TTY mode. Wow. Alt+F4 Close window. Wow. F5 Move window. Wow. Ctrl+F5Resize window. Wow. F6 Switch to next window. Wow. Sft+F6 Switch to previous window. Wow. _Section IV: Configuration Files Citadel configures itself based on the settings it finds in various configuration files, all of which have the extension .CIT. The CONFIG.CIT file must be in the same directory as the CTDL.EXE file, and the rest should be in the #HOMEPATH defined in CONFIG.CIT. These are just text files, listing the variables and their desired values, one line for each variable. All variable names start with a "#" character, which must be in the first column of the line. Any line not starting with "#" is considered a comment by Citadel and is ignored. String values must be in double quotes ("") if there is any space in the string. Single-word strings can be in quotes, but it is not required. If a string value is in quotes, the "^" and "\" characters are special. The "^" character signifies control. That is, "^A" in a string would be interpreted by Citadel as Control+A (ASCII 1). The "\" character is used to signify special characters, as in the C programming language. The following special characters are recognized by Citadel: Code Resulting character \n Line feed (ASCII 10) \t Tab (ASCII 9) \r Return (ASCII 13) \f Form feed (ASCII 12) \b Backspace (ASCII 8) \\ Backslash (\) \^ Caret (^) The values from CONFIG.CIT are stored in ETC.TAB and the values from CRON.CIT are stored in CRON.TAB, so they are not read every time Citadel is loaded. The values in HARDWARE.CIT, EXTERNAL.CIT, PROTOCOL.CIT, GRPDATA.CIT, and MCI.CIT are read every time Citadel is loaded, and the values in NODES.CIT, ROUTE.CIT, and DEFUSER.CIT are loaded as Citadel needs them: when networking or doing a Net 6.9 fetch for NODES.CIT; when routing networked mail for ROUTE.CIT; and when creating a default log entry for DEFUSER.CIT. CONFIG.CIT Citadel's main configuration file is named CONFIG.CIT. Because of the configurability of Citadel, there are over 150 keywords that can be specified in this file. However, only a few are required for Citadel to run: the rest have reasonable defaults. If Citadel cannot find one or more of the required keywords when it loads this file, it prompts for the missing information. It then adds this information to the file so it is available the next time it is read. Required The following keywords must be in the CONFIG.CIT file for Citadel to run. If any are missing, Citadel will ask you to provide the missing information, then save it to CONFIG.CIT for the future. #NODENAME This is the name of the system. It is displayed at the beginning of a call, and when the .Read Status (.RS) command is used. When a networked message from your board is read on another node, this node name will be in the header, along with the node region. #NODEREGION This is the city or town that your board is in. If you don't live within the boundaries of any city/town, choose the nearest major city/town as your region. In networked messages from your board, the region is displayed after the node name, in the format "node name, region". #NODECOUNTRY This is the country, state or province, and county (or whatever low-level subdivision your country uses) in which your board resides. The preferred format is hierarchical: country/state/county. For example, a Seattle, Washington board would have US/WA/KING. #NODEPHONE This is a string containing the node's phone number, including area code. At present, it is used for informational purposes only (users will see this field in the message header when reading verbosely), so it can be just a partial number or "private" if the board is a private node. For the United States and Canada, the preferred format is "(xxx)xxx-xxxx". #HOMEPATH This determines which drive and subdirectory the Citadel system files (CTDL.EXE,.DAT, .TAB, .CIT files, etc.) will be in. It must be given as a full path name, including drive letter. (See the beginning of this section for conventions regarding backslashes in quoted path names.) #MDATA This defines the modem data port. Citadel supports COM1 through COM4: #NODEPHONE use 1 for port 1, 2 for port 2, 3 for port 3, 4 for port 4. Even though Citadel supports them, try to avoid COM3 and COM4; on the IBM PC, the COM3 and COM4 hardware is not well designed. #SYSOP This is the user name of the BBS's sysop. This account has access to all groups. If the (optional) #FORWARD keyword is set to 1, then all mail to "Sysop" will be sent to the #SYSOP account only. #ADDRESS This is the network address for your BBS. It is used when netting, and must be different from all other #ADDRESSes on the network. The format of #ADDRESSes is xxx.yyyy, where xxx is the alias specific to your BBS, and yyyy is the Location Identifier. Aliases may be one, two, or three characters. Most Location Identifiers are three characters, but they may be four, as well. See the file LOCID.ZIP for information on how to choose your Location Identifier. Optional The following keywords are optional, and let you set up Citadel to reflect the character of your BBS. The default settings are shown in parentheses. Paths and filenames Set these keywords to keep Citadel from creating its default paths off of the path set by the required keyword #HOMEPATH. This gives you the ability to keep different files on different drives, etc. #APPLICPATH (#HOMEPATH + \APPLIC) This defines which drive and directory Citadel should search for application files in first. If they are not found in this directory, Citadel searches the DOS PATH for application files. Application files include room applications and the external programs found in EXTERNAL.CIT. #HELPPATH (#HOMEPATH + \HELP) This defines which drive and directory the help (*.HLP), menu (CTDL.MNU), and blurb (*.BLB) files are in. #HELPPATH2 ("") If present, this defines a second place to look for the help (*.HLP), menu (CTDL.MNU), and blurb (*.BLB) files if they cannot be found in #HELPPATH. If you are using a sub-board or front door, you should put the general files in the #HELPPATH2 directory (which should be the same for all sub-boards), and the sub-board-specific files in the #HELPPATH directory (which should be different for each sub-board). #ROOMPATH (#HELPPATH) This defines the drive and directory in which the room description files will be kept (these files are linked with rooms using the .Aide Edit room (.AE)command). The keyword #ROOMTELL determines whether or not any such files will be displayed to users. #SCRIPTPATH (#HOMEPATH) This defines the drive and directory in which Citadel script files (*.CSF) are found. #TEMPPATH (#HOMEPATH + \TEMP) This sets the drive and directory to use for temporary networking files. This must be different from #HOMEPATH, #TRANSPATH, and #DLPATH. This can be a RAM disk to improve networking performance. #TRANSPATH (#HOMEPATH + \TRANS) This sets the drive and directory for outgoing networked e-mail files, Net 6.9 packets, etc. This must not be a RAM disk, as you will lose all files if there is a power loss. This path must be different from #HOMEPATH, #DLPATH, and #TEMPPATH. #DIRPATH (#HELPPATH) This sets the default directory for directory rooms. #DLPATH (#HOMEPATH + \DLPATH) This sets the default directory for received Net 6.9 file transfers. #MSGPATH (#HOMEPATH) This sets the directory for MSG.DAT. You should only set this to something other than #HOMEPATH if you are low on disk space on the drive where #HOMEPATH resides. #LOGEXTDIR (#HOMEPATH) This sets the directory for the log extension files: there may be as many of these as there are users in the userlog, so you may want to put this in some place other than #HOMEPATH to reduce clutter. Additionally, these files tend to be small, so putting these on a drive with a small cluster size will improve disk usage. #LEXPATH (#HOMEPATH) This sets the path for any dictionaries used by the spell checker. #RLMPATH (#APPLICPATH) This sets the path for .RLM files. This is all you need to know. #PRINTER (#HOMEPATH + \PRINTER.OUT 0) This defines the file that output is copied to when you press Alt+P. This can be any valid DOS file or device name. If you supply a filename only, rather than a full path name, the file will be in the #HOMEPATH directory. An optional second parameter, if set to 1, will make Citadel prompt for a file name when you press Alt+P, with the #PRINTER file name as the default. #TRAP_FILE (#HOMEPATH + \TRAP.FBI) This is the file that contains a log of system auditing and important events. This can be any valid DOS file or device name. Log information will be appended to this file. The #TRAP keyword lets you specify which events are trapped. #DICTIONARY (ENG-AM.DAT) This sets the name of the dictionary to use for spell-checking unless a specific one is assigned to a room. Console Attributes (Colors) These keywords are used to set the console colors. If you want to change any of the defaults, refer to a reference book on the IBM PC to see which colors are available, and which hexadecimal values to use to specify them. All of these are set with hexadecimal values. #ATTR (07) This sets the color for normal text. The default, 07, gives white on black. #BATTR (00) This sets the color for the screen border; it is for color systems only. The default, 00, is black. The screen is looks best if it is left black or set to the same color as the background in #ATTR. #CATTR (0A) This sets the color of the characters that the console user types in chat mode. The default, 0A, gives green on black for color systems, and bold for monochrome systems. #UTTR (01) This sets the color for underlined text. The default, 01, is blue on black for color systems, and underline for monochrome systems. #WATTR (70) This sets the color for inverse text, including the status line. The default, 70, gives black on white for color systems, and inverse for monochrome systems. System Size These keywords set the size of your system. Once set, these values can be changed by running Citadel with the "-C" command line parameter: "CTDL -C". Be reasonable about the sizes you set here. Don't try, for example, to set #MAXLOGTAB and #MAXROOMS to their maximum values at the same time. It is not that Citadel cannot handle it, it is that it would take nearly 300 megabytes of disk space to store the log files, and another four or five to save the room file. Setting absurdly large values for #MAXROOMS also slows things down a bit, and gives you nothing. It is best to keep all the #MAX... values set only a bit above what you actually have. When you need more, you can always resize up. This will both keep things faster and save you memory. #MESSAGEK (1024) #NMESSAGES (8000) #MESSAGEK sets how many kilobytes of disk space to reserve for the message base. Typically, 1024 works well for the Regular version and non- networked BBSes running the Auxmem version, and 5120 is a good value for networked BBSes running the Auxmem version. #NMESSAGES sets the maximum number of messages that the system will be expected to contain at any one time. 5-8 times #MESSAGEK is a good guess for non-netted systems; 3-5 times #MESSAGEK is good for netted systems. If you have #MSGCOMPRESS turned on, you can store about 1.3 times more messages, so you should increase #NMESSAGES accordingly. As a too-large #NMESSAGES merely wastes memory, while a too-small #NMESSAGES causes "message not found" error messages, the default is set to the very generous (in relation to the default #MESSAGEK) value of 8000. If you wish to save memory once your message base is scrolling, look at the values given in .Read Verbose Status, and set your #NMESSAGES to 500 or so larger than the number of messages on the system. Both the Auxmem and Regular versions of Citadel can handle #MESSAGEK values of up to two gigabytes. However, the Regular version of Citadel is limited to 32766 #NMESSAGES, each one taking 14 bytes of RAM. The Auxmem version of Citadel has no practical limit on #NMESSAGES; it is limited by the amount of free memory and disk space (each message taking 22 bytes of RAM or disk space). #MAXLOGTAB (128) This sets how many users can be stored in the userlog at one time. Values between 64 and 256 work well in most cases. The minimum allowed value is 2 and the maximum allowed value is Wow. #MAXROOMS (128) This sets the maximum number of rooms that can be on the system. The minimum is 8, and the maximum is 856 (Regular version) or 16376 (Auxmem version). It needs to be a multiple of 8. If it is not, or if it is out of range, Citadel will automatically set it to a valid value. #MAXHALLS (8) This sets the maximum number of halls that can be on the system. The minimum is 8, and the maximum ranges from 32 to 1360, depending on the setting of #MAXROOMS. To derive the largest possible #MAXHALLS from the #MAXROOMS setting, use the formula: INT((65532 / (#MAXROOMS / 8)) / 8) * 8 #MAXHALLS needs to be a multiple of 8. If it is not, or if it is out of range, Citadel will automatically set it to a valid value. #MAXGROUPS (16) This set the maximum number of groups that can be on the system. The minimum is 8, and the maximum is 256. It needs to be a multiple of 8. If it is not, or if it is out of range, Citadel will automatically set it to a valid value. #MAXFILES (150) This sets the maximum number of files that Citadel will see in a directory. For non-Net 6.9 style networking (1.0, 1.1, 1.5, 1.6), this is also the maximum number of rooms you can network with any single node. #MAXBORDERS (10) This sets the maximum number of borders allowed on the system. Each border takes 81 bytes of RAM and 81 bytes on disk when Citadel exits to store them for next time. Modem These keywords are used to set the various modem parameters and commands. The default values work for Hayes-compatible 2400 baud modems. Check your modem documentation if you have some other type of modem. #MODSETUP ("ATX4VMQS0=0S2=128&D2") This sets the modem initialization string, which is sent when Citadel loads, after every call, after every cron event, every #IDLE_WAIT minutes, and when F2 is pressed on console. #MODUNSETUP ("") This is sent when the BBS is taken down. If #MODSETUP sets auto-answer (S0=1 for Hayes- compatible modems), then #MODUNSETUP can be used to turn if off (S0=0 for Hayes-compatible modems). Also, if you are using #DUMB_MODEM 6 (described below), you can reset the modem to hang up when DTR is lost with this command. #INIT_BAUD (2400) This tells Citadel the baud rate at which the modem should be initialized. Valid values are: 300 600 1200 2400 4800 9600 19200 38400 57600 115200 #MIN_BAUD (300) This is the minimum baud rate at which the system will accept calls. If a connection is established at a slower speed than #MIN_BAUD, the system will print out TOOLOW.BLB and then hang up. Valid settings are: 300 600 1200 2400 4800 7200 9600 12000 14400 16800 19200 21600 24000 26400 28800 38400 57600 115200 230400 #DUMB_MODEM (0) This allows you to set the baud rate detection method for incoming calls. Settings of 4, 5, and 6 are for high speed (9600+ baud) modems. Valid settings are: 0 Citadel looks for numeric response codes from a Hayes-compatible modem. Wow. This is probably the same as 3 now. I'll have to check. 1 Callers must type a plurality of carriage returns to determine what the baud rate is. 2 Citadel looks for the HS line on the RI line. You need a special cable to do this, but it is quite accurate and quick for 1200 baud modems. 3 Citadel looks for verbose response codes from a Hayes-compatible modem. 4 This fixes the system at the #INIT_BAUD for incoming calls. (#BAUD in NODES.CIT is used for netting out.) 5 This is the same as 4, but drops the port speed for 300, 1200, and 2400 baud. This can only be used with a few modems; 6 is more widely supported. (One one modem ever tested worked with this setting. Another modem of the same model from the same manufacturer failed to work properly with this setting.) 6 This is the same as 5, but instead of just changing the port rate when a low speed connection is made, Citadel first drops DTR, then changes the port rate, and then sends the string specified by #DOWNSHIFT to the modem. #DOWNSHIFT contains the command to switch back to on-line mode, out of command mode. For this to work, #MODSETUP needs to tell the modem to go into command mode when it loses DTR, and not to hang up the phone (&D1 for Hayes-compatible modems). When Citadel hangs up the phone with this setting, it first drops DTR, then sends the string specified by #HANGUP to the modem. 7 Similar to 6. Richard says he'll write something about it some time. Wow. #DOWNSHIFT ("ATO") #HANGUP ("ATH") These keywords are for use with #DUMB_MODEM 6 only. #DOWNSHIFT is the command to switch back to on-line mode, and is used when connecting as described in the #DUMB_MODEM entry. #HANGUP, also described in the #DUMB_MODEM entry, is the command to tell the modem to hang up after switching to command mode by dropping DTR. #DIAL_INIT ("ATM0V1") This is the string that is used to initialize the modem before dialing out; i.e., when netting out and when going into dial-out mode. #DIAL_PREF ("ATDT") This is the dial prefix used for dialing the phone number when networking. #DIAL_RING ("ATA") This is the string to send to the modem when the phone rings. Use "" if your modem auto-answers (S0 is set to a non-zero value in the modem initialization string, #MODSETUP). Use "ATA" if you have S0=0 and no call-waiting. This is generally used to ensure that users will not get a "zombie modem" when the BBS is not answering the phone, and is used to implement #UP_HOURS and #UP_DAYS (explained below). However, it can also be used to run a BBS on a line with call waiting, if you can disable it and also have three-way calling on the line. Together with #UP_DAYS and #UP_HOURS, this lets you run a part- time BBS on a voice line. To do this, set #DIAL_RING to disable the call-waiting before answering the phone ("ATX3DT!,*70R" for Hayes- compatible modems). This keyword can take an optional second parameter: the number of seconds after answering the phone before Citadel should try again. Wow. #OFFHOOK (0) This determines whether Citadel should take the modem off-hook at console log-in, giving a busy signal to anyone calling during that time. Turn this on by setting it to 1. The effect of turning off #OFFHOOK (setting it to 0) depends on the configuration of the modem as specified with #MODSETUP. If auto-answer is off (S0=0 for Hayes-compatible modems), the modem will not answer. If the person logged-in at console can tell that there is a caller (if a phone plugged into the modem line is ringing, for example), he can log out and allow Citadel to tell the modem to answer the phone. If auto-answer is on (S0=a non- zero value for Hayes-compatible modems), the caller will get a zombie modem; the sysop can allow the caller to log in by doing a .Terminate Stay (a .Terminate Quit-Also will hang up on the caller, as it reinitializes the modem). #OFFHOOKSTR ("ATM0H1") This is the string to send to the modem to make it go off-hook when #OFFHOOK is set to 1. #HANGUPDELAY (0) This is the number of seconds to wait after dropping DTR before raising it again (or sending #HANGUP if #DUMB_MODEM is set to 6). Most modems don't need this, so the default is 0. If the BBS is not hanging up on your users when they issue the .Terminate Quit-Also command, try setting this to a larger number, after verifying that your modem is set to drop carrier when it loses DTR. (Or, if using #DUMB_MODEM 6 or 7, that #HANGUP is set correctly.) #CHECKCTS (0) This determines whether Citadel should check the Clear To Send (CTS) line of the serial port before sending data to the modem. If this is set to 0, Citadel will always send data. If it is set to 1, Citadel will only send data if CTS is true. This is used for synchronization of systems with high- speed modems, as Citadel will be communicating with the modem much faster than the modem communicates with the other modem. This lets the modem tell Citadel when it needs to wait for the remote modem. #AUTOANSI (0) This determines whether or not your system checks for ANSI at the beginning of a call. A setting of 1 means that Citadel does the ANSI check. With 0 or 2, Citadel doesn't check: with 0, it assumes that no caller has ANSI; with 2, it assumes that every caller has ANSI. (Of course, once the caller has logged-in, the ANSI settings in his configuration take priority. #AUTOANSI only applies before log-in, and sets the default ANSI setting for new users.) #CONNECTWAIT (0) After a connection is made with another modem, Citadel will wait #CONNECTWAIT seconds before sending anything out. This can be useful for synchronizing high-speed modems. #BAUDPAUSE (0) This tells Citadel to wait after changing the serial port speed before sending anything else to the port. Give the time desired to wait in hundredths of a second. The need for this option is very rare; one quite flaky modem seemed to be more stable when this was set. System Settings These keywords set various aspects of your BBS. #IDLE_WAIT (3) This is the time (in minutes) that the system will wait before executing a cron event or resetting the modem with #MODSETUP. #OLDCOUNT (150) This determines how many messages are new to first- time callers. A value of 0 makes all the messages on the system new. #ROOMTELL (1) This activates room descriptions. Room descriptions are displayed to users the first time each call they visit a room with a room description file set up, unless they turn off "see room descriptions" with the .Enter Configuration (.EC) command. Setting this to 1 enables room descriptions, and setting it to 0 disables them. However, there is no good reason to disable room descriptions; just don't set any with the .Aide Edit room (.AE)command if you don't want any. #UP_DAYS (ANY) #UP_HOURS (ANY) These set the days and hours that your BBS is up for callers. This only works if #DIAL_RING is set (i.e., you are not setting your modem to auto- answer). Valid settings are a list of numbers representing days or hours (for days, 0 = Sunday... 6 = Saturday; for hours, 0 = midnight through 23 = 11PM), or the word ANY. For example, to have the BBS only answer on weekdays between 10PM and 7AM, use these two lines: #UP_DAYS 1 2 3 4 5 #UP_HOURS 22 23 0 1 2 3 4 5 6 #NETMAIL (1) This determines whether networked mail is put into the Mail room, or into the room corresponding to the room it was entered in on the originating system. (If there is no corresponding room, the mail will be put in the Mail room.) Setting this to 0 directs all networked mail to the Mail room; setting it to 1 tells Citadel to try to put it in a corresponding room. #SUBHUBS (1) This option affects how the Goto new messages (G) and Bypass (B) commands work. Valid settings for #SUBHUBS are: 0 Window rooms are treated the same as on Stonehenge; that is, you are never taken to window rooms on a Goto loop unless there are new messages in them. Also, if there are no new messages in any room in a hall, Goto will just take you to the Lobby room, even if it is not in that hall. 1 When you issue the Goto command, Citadel will take you to the next room with new messages. After all non-excluded new rooms have been visited, further Gotos will cycle through any window rooms in that hall. 2 When you issue the Goto command, Citadel will take you to the next room with new messages or the next window room, whichever comes first. 4 This enables floor mode: there are no window rooms, so the > and < commands will take you to the next or previous hall from any room, and Goto will always take you to the next room with new messages, or to the Lobby room if there are no rooms with new messages in the current hall. When this setting is used, it is not possible to remove the Lobby room from any halls. There is no #SUBHUBS 3. #SCREENSAVE (0 0 0 0 0 0) This keyword sets the screen saver parameters. You don't need to set all parameters; Citadel will assume a value of 0 for any that you don't set. The meaning of each parameter is as follows: 1st The number of minutes with no keyboard activity before the screen blanks. Setting this to 0 disables the screen saver. 2nd This tells Citadel whether or not to turn off the screen saver when a call is received. Setting this to 1 tells it to turn off the screen saver, and setting it to 0 tells it to leave it on. 3rd This only makes sense if the second parameter is on; it tells Citadel if you want the screen saver to stay off for the duration of the call. If this is set to 1, the screen saver stays off; setting it to 0 tells Citadel to turn the screen saver on again after the number of minutes set with the first parameter. 4th This tells Citadel whether or not to display a clock on the screen while it is blanked. If this is non-zero, a clock is displayed that moves and changes color after the number of seconds set by this parameter. This movement and color changing prevents screen burn-in. Setting this to 0 disables the display of the clock. (You can use the #SAVERMSG keyword to display something other than a clock.) 5th This determines whether or not the cursor is displayed on the blanked screen. The cursor position is kept current, as if the screen was not blanked, so you can tell if a user is on line by watching to see if the cursor moves. Setting this to 1 tells Citadel to display the cursor; setting it to 0 tells it not to display the cursor. 6th This determines whether the console is locked when the screen-saver turns on. For this to work, a password must be set with the #F6PASSWORD keyword. Setting this to 1 tells Citadel to lock the console; setting it to 0 tells it not to lock the console. #SAVERMSG ("") This sets a message to be displayed in place of a clock when the screen-saver is active if the fourth parameter to #SCREENSAVE is non-zero. #SCROLL_BACK (0 0 0) This sets up the console scroll-back buffer. Setting all three parameters to 0 means that no scroll-back buffer is created. Otherwise, the first parameter determines whether or not to save colors in scroll-back (set this to 1 to save color, or 0 to strip color information from the scroll-back buffer, which gives you twice as many lines), the second parameter sets the number of lines of scroll-back to allocate, and the third parameter sets the number of seconds of inactivity to allow before timing out of scroll-back (if this parameter is 0, it will never time out: this is not recommended, as you may inadvertently tie up Citadel for long periods of time by leaving the scroll-back buffer on). The Regular Version of Citadel can handle scroll-back buffers of up to 64K in size, so the maximum number of lines you can save is around 400 with color, or 800 without (assuming an 80 column screen). If you set the number of lines too high, Citadel will calculate it for you, so you can get the maximum scroll-back by choosing an absurdly high value. In the Auxmem Version, the scroll-back buffer is stored in XMS, EMS , or virtual memory, and has no practical limit. #MSGCOMPRESS (0) This determines whether or not messages will be compressed. The current compression scheme only compresses message text (not headers), so it shouldn't interfere with auto-routing programs, or other programs that read the message header. However, this means that you will only get 20-30% more messages in your message base. Compression does, of course, slow down message reading slightly, but this is not particularly noticeable even on an XT. Also, turning this on leads to some memory overhead: there is some memory needed for the compression buffer and Huffman tree, and you will need to set #NMESSAGES higher because there will be more messages in the message base, so if you tend to be short on memory, you may not want to use compression. Set 1 for compression on, 0 for compression off. #FORWARD (0) This sets where to send mail that users leave to "Sysop". By setting this to 1, mail to "Sysop" is sent to the user identified by the #SYSOP keyword; setting it to 0 makes mail to "Sysop" readable by every user on the system with sysop access by saving "Sysop" as the recipient of the mail. #TIMEOUT (5) #CONSOLETIMEOUT (#TIMEOUT) #UNLOGTIMEOUT (1) These keywords set the amount of time (in minutes) that a user may be idle before being logged out. #UNLOGTIMEOUT is the maximum allowed idle time for an unlogged-in user, and #TIMEOUT is the maximum allowed idle time for a logged-in user. #CONSOLETIMEOUT is the maximum allowed idle time for a user logged in at console. #SLEEPCOUNT (0) #COUNTBEEP (0) #SLEEPCOUNT sets a countdown timer on the idle time out. If this is set to a non-zero value, Citadel will perform a seconds-based countdown from this number before the user is logged out, but after the #SLEEPPROMPT is displayed: if the user takes any action during this countdown, it will be aborted, and the call will continue. A 0 value means that no countdown will be done; the user is immediately logged out. #COUNTBEEP determines whether or not to beep every second during the #SLEEPCOUNT countdown (also during the post-download hang-up countdown). Set this to 1 to beep, or to 0 to not beep. #RESTORE_MODE (1) This sets whether or not to restore the video mode after a shell to an application. Usually, you will want Citadel to run in the same video mode always. However, if two people use Citadel from console, there may be a disagreement: for example, one person may like 25 line mode and the other likes 50 line mode. When this is set to 1, you would have to exit Citadel, run a video-mode changing program, and restart it to switch video modes. If it is set to 0, simply shelling and running a video-mode changing program is sufficient to change video modes. #MAXJUMPBACK (25) This sets the maximum number of Jumpbacks the user can do at one time. Each new room added to the buffer takes a few bytes; the maximum is over 4000 (if you set it too high, Citadel will set it to the maximum). #MAXSTAT (??50??) This sets the maximum number of system events to store for display on the System Status Screen. 50 is more than enough for any standard screen mode. If you are in a mode with many lines on the screen and notice that the list does not fill the whole screen, increase this value. Alternatively, if you don't use the System Status Screen to view past events, you can save a small amount of memory by decreasing this setting. #BIOS (0) This determines whether Citadel will use the BIOS for screen writes, or whether it will write directly to video RAM. Set this to 1 to enable BIOS calls; set it to 0 to disable BIOS calls and use direct memory writes. Direct video writing is much faster, but might cause "snow" to appear when used with completely IBM-compatible CGA video cards. (Many clone CGA, and all Monochrome, EGA, and VGA, video cards will not produce snow with direct screen writes.) Even when this is set to 1, Citadel will sometimes use direct memory access (such as when saving and restoring the screen, or using the scroll-back buffer), so it still will not run properly under multitasking systems which require BIOS screen writes, such as IBM's Top-View or Quarterdeck's DESQview (except on 386 computers). #DIALMACRO (none) This defines macros to put on function keys for use in Dial-Out mode. After the #DIALMACRO keyword, enter the name of the function key, then the macro to assign to that function key. You can assign up to 48 macros (or 40 on older keyboards) by using the Shift, Alt, and Control keys with the function keys. Function keys are named "F1" to "F12", "ALT_F1" to "ALT_F12", "SFT_F1" to "SFT_F12", and "CTL_F1" to "CTL_F12". For example, the following will assign the string "ATDT555- 1212" plus a return to Shift+F1: #DIALMACRO SFT_F1 "ATDT555-1212\n" #EXPIRE (15) This is the message expiration value for networking. It should be set to the number of days messages stay in your message base before being scrolled off by new ones. This can be determined by reading forward in a regularly-used room like Aide, and subtracting the date of the first message found from the current date. You may want to make it a bit smaller than that as a safety measure, to prevent old messages from reappearing in a room if your scroll rate changes. (This is most likely to happen if the proportion of netted rooms to local rooms changes significantly.) #CIT86COUNTRY ("") This sets the node's country for broadcast over the Citadel-86 network, if you are connected to it either directly or indirectly. #CIT86DOMAIN ("") This sets your domain for broadcast over the Citadel-86 network. This should only be set on the node that gateways into the Citadel-86 network. As this only seems to be used for mail routing by Citadel-86es and the gateway does not support mail, this option really does nothing right now. #DISKFREE (0) This sets how much disk space Citadel should attempt to keep free, in bytes. If your disk has less free space than this on it, Citadel will no longer accept uploads. #FILEBUFSIZE (4096) To speed access to the message base, Citadel creates a buffer in memory to store parts of it. This sets the size of this buffer, in bytes. If you feel like experimenting, you may be able to optimize system performance by changing this value. (If it is too small, Citadel needs to access the disk more often when reading messages because it cannot hold enough of the data in the buffer at once. If it is too big, it also has to access the disk more often, because it tries to keep more data in the buffer than it needs. #NOBELLS (0) This lets you set how Citadel treats bells when first configured. Set to 0 to always ring the console speaker; 1 to ring it only as part of a chat request; or 2 to never ring it. #NOCHAT (0) This lets you turn chat on or off when first configured. Set to 0 to turn chat on or 1 to turn it off. #AIDECHATHRS (ANY) This lets you specify which hours the .Aide Chat (.AC) command is active. Specify the hours allowed as a number from 0 to 23, or use ANY to let it always be active. #CHATMAIL (0) Wow. #ADCHANCE (0) This sets the percentage chance that an ad will be displayed before a room prompt is displayed. Set this as an integer from 0 to 100. #ADTIME (0) This sets the number of seconds to wait at a room prompt with no activity before displaying an ad. Use 0 to disable this feature. #CHATWHY (0) Wow. #CHATFLASH (0) This sets whether to cycle the color of the border as part of the chat page. This can be useful to attract attention when the bell is turned off or otherwise inaudible. Set this to 1 to enable this feature or 0 to disable it. #WYSIWYG (0 0 0) This sets how colors appear on the console screen. The first parameter indicates how the color is set for new blank lines when the screen scrolls: set this to 0 to have them appear in the #ATTR color setting (standard DragCit behavior), or set it to 1 to have them appear in the current character color (standard ANSI.SYS behavior). The second parameter indicates how a user's colors show up on console: set this to 0 to always display the colors as set by the CONFIG.CIT keywords #ATTR, #CATTR, etc.; set it to 1 to display the colors as set by the CONFIG.CIT keywords unless the user is logged in on console, in which case the user's color settings are used; or set it to 2 to have the colors always display as the user has them set. The third parameter indicates whether or not colors are always displayed on console regardless of user configuration: set it to 0 to have colors only displayed if the user is configured to display colors, or set it to 1 to have colors always displayed on console. #SPEECHON (0) This sets whether to send output to a speech synthesizer if an .ESD with speech synthesis is loaded. Set this to 1 to enable speech output, or 0 to disable it. This sets the default for use after configuring; use the Alt+F1 keystroke while Citadel is running to toggle speech output. #OVREMS (0) This sets whether to store overlays in EMS memory. When overlays are stored in memory instead of on disk, Citadel runs faster. However, it also has less free memory. #OVREXT (0) This sets whether to store overlays in extended memory. When overlays are stored in memory instead of on disk, Citadel runs faster. However, it also has less free memory. #CHECKSYSMAIL (3) Wow. #MEMFREE (102400) This sets the minimum free memory (in bytes) to allow before forcing a super-shell when shelling. The default (100K) gives enough memory for most commonly-used utilities. #SHOWMOVED (1) This sets whether to display the original room name in a moved message's header when verbose mode is off. (It is always displayed when verbose mode is on.) #ALTF3TIME (300) #ALTF3MSG ("^A3The sysop needs the system. You have only ^A1%m:%s^A0^A3 left.^A0") These set how Citadel responds to the Alt+F3 keystroke. #ALTF3TIME sets the time, in seconds, to allow the user to stay on the system after pressing Alt+F3. #ALTF3MSG sets the message to display to the user before every room prompt when his time is limited by Alt+F3. The following variables are allowed: %m Minutes left, with no leading zero. %s Seconds left. %z Minutes left, with a leading zero if one digit. #FASTLOGIN (0) This sets whether to use an alternate message counting method that is sometimes faster (but sometimes slower) when logging a user in. This feature is only available in the Auxmem version. Trying to describe when it has a benefit and when it does not is more than I want to do, so just try it if it seems to take a while to log in. #SAVEJB (1) This sets whether to save jump-back information for users between calls. Saving jump-back information takes some disk space, so you may want to disable this feature if you are low. #SWAPNOTE (0 in Auxmem; 1 in Regular) This sets whether to display the "Swapping, please wait" message when doing a Super-shell. As most people running the Auxmem version have enough memory that a super-shell is to memory (and therefore quite quick), this defaults off for the Auxmem version. Similarly, as most people running the Regular version do their super-shells to disk (which is quite slow), the default for them is to display the message. #FASTSCRIPTS (0) This sets whether to make scripts load faster, at a sacrifice of memory. This only affects load time, not execution time. When this is set to 1, then the script interpreter does not free its memory when a script terminates, so it is ready to go the next time a script is run. If it does free its memory, it must take a bit of time to prepare to run the script each time. #NEWNODEALERT (1) This sets whether to save a message to the Aide) room whenever a new node is detected on the network. This message contains the node's name, region, country, address, and phone number, as well as the local message number that is the evidence of the node's existence. Auxiliary Memory These keywords only have an effect if you are running the Auxmem version of Citadel. They are silently ignored by the Regular version. #VIRTMEM ("VMEM.TAB") If the size of the room table exceeds the amount of XMS and EMS memory installed in your computer, Citadel will keep the information in a disk file. This keyword lets you set the drive and directory to keep this file in, as well as the name. This lets you, for example, keep this file on a RAM disk for speed. (If you have extended memory but no XMS provider, for example, setting the extended memory up as a RAM disk and writing this file to the RAM disk will give Citadel access to this memory.) If you don't want Citadel to ever use virtual memory, set this to an invalid file name. (#VIRTMEM "" works well.) Citadel will then abort with an error if it runs out of memory, instead of using virtual. Configuration These keywords determine the default configuration for unlogged-in users. These are also the defaults for new users, unless overridden in the DEFUSER.CIT file. New users are given an opportunity to change these as part of the log- in process. Existing users can change their settings with the .Enter Configuration (.EC) command. #NET_PREFIX ("\^A3*\^A0") This sets the default net prefix for new and unlogged-in users. By default, it is displayed before the room name of networked rooms. #DATESTAMP ("%x %X %p") #VDATESTAMP ("%A %x %X %p") These set the default time/date formats for new and unlogged-in users. #DATESTAMP is used for message headers when reading non-verbosely; #VDATESTAMP is used for verbose message headers, .Read Status, and .Read Verbose Userlog. #PROMPT ("%n\^A2%r%e") This sets the default room prompt for new and unlogged-in users. See the file PROMPT.BLB for full information about setting the prompt. #MOREPROMPT ("<More>") This sets the default more prompt for new and unlogged- in users. The more prompt is displayed after each screen when screen pause is turned on and after each message when pause-between-messages is turned on. System Personality These keywords determine the "personality" of your BBS; for example, whether it is a twitty or serious board. #ENTER_NAME ("your name") This allows you to configure the prompt that asks for a new user's name. This will be appended to "Enter " (that is the word "Enter" and a space), so don't include "Enter " as part of the string. A colon (":") will be appended to this string, so don't include any ending punctuation, either. Examples: "your name", "your handle", "your full real name". These will be displayed as: "Enter your name:", "Enter your handle:", and "Enter your full real name:". #CENSOR (0) This determines whether or not users can use the .Enter Configuration command to change their ability to see censored messages. #TWIT_FEATURES (TITLES NET_TITLES SURNAMES NET_SURNAMES ENTER_TITLES COLORS MCI) This turns on certain (rather frivolous) features of the software. The features currently implemented are: MSG_NYMS Allows aides to change what messages are called with the .Aide Name messages (.AN)command. (See #MESSAGE_NYM for the ability to set the default name.) BORDER_LINES Allows users to enter borders with the .Enter Border (.EB) command. (See #BORDER for the ability to set default borders.) TITLES SURNAMES Turn on support for titles and surnames for users. Titles are seen before the user's name on message headers and surnames are seen after the name: [Title] Name [Surname]. Titles and surnames can be edited and locked by the sysop. NET_TITLES NET_SURNAMES Allow titles and surnames received over the network to be displayed on the BBS. ENTER_TITLES Allows users to change their title and surname with the .Enter Surname / Title (.ES) command. COLORS Allows colors in room names, titles, surnames, user names, etc. MCI Enables MCI features (^AN, ^AT, etc.). #SIGNATURE ("") This is the signature line for your board. It is appended to each message sent over the network from your board. You may have as many #SIGNATURE lines as you like; Citadel will cycle through them in the order it finds them in the CONFIG.CIT file. You must have them sequentially in the file for this to work, with nothing else between the lines, not even blank lines. #ANONAUTHOR ("****") This sets the author of anonymous messages. #TWITREGION ("") #TWITCOUNTRY ("") These define "twit" (sometimes called "configurable") region and country fields that are displayed after the regular region and country fields on verbose read. They are not used in routing. #MESSAGE_NYM ("message" "messages" "Saving") This lets you define an alternate name for messages, and what is printed when they are being saved. The first parameter defines the singular name, the second defines the plural name, and the third is what you do to it when you save it. If the MSG_NYMS feature of the #TWIT_FEATURES keyword is enabled, then aides can change these with the .Aide Name message (.AN) command. #CREDIT_NYM ("credit" "credits") This lets you define alternate names for credits. The first parameter is the singular name, and the second is the plural name. These are only used if #ACCOUNTING is set to 1. #BORDER ("") This lets you initialize your borderlines. You can have up to 10 #BORDER lines. This only has an effect if BORDER_LINES is turned on in #TWIT_FEATURES. #POOP! (0) This sets what users will see when they hit P or Q at a room prompt. Valid settings are: 0 All users will see "Poop!" and "Quack!" when they hit P and Q, respectively. 1 Only users with Helpful Hints turned off (expert mode on) will see "Poop!" and "Quack!" when they hit P and Q; they are treated as unknown commands for other users. 2 P and Q will be treated as unknown commands for all users. #MCI_FIRSTNAME ("") #MCI_NAME ("") #MCI_TIME ("") #MCI_DATE ("") #MCI_POOP ("") These set what is sent out instead of the MCI values if MCI is not turned on in #TWIT_FEATURES, as follows: MCI_FIRSTNAME sets what to send on ^An. MCI_NAME sets what to send on ^AN. MCI_TIME sets what to send on ^At. MCI_DATE sets what to send on ^AT. MCI_POOP sets what to send on ^AP. #SLEEPPROMPT ("Sleeping? Call again! :-)") This sets the prompt that is shown to users who have been idle for too long. #TWIRLY ("/-\\|" 10) This sets a configurable twirly cursor string. This is used to build the twirly cursor for users who have it turned on. Citadel cycles through the string, displaying one character at a time. The optional second parameter controls speed: a larger value produces a slower twirl. #FUELBAR (ù #) This allows the sysop to configure the "Building message table" fuel bar that is displayed when doing a full reconfiguration. The first parameter is the character used to create the empty bar; the second parameter is the character used to fill it. #SOFTVERB ("") This should be named #SOFTADJECTIVE, but we are poopie. This specifies text to display before the name of the program, such as when callers call the system and it identifies itself and when the .Read Status (.RS) command is used. #ECTWIRLY (1) This sets whether users may enable (or disable) their twirly cursor with the .Enter Configuration (.EC) command. #ECUSERLOG (1) This sets whether users may make their account unlisted (or listed) with the .Enter Configuration (.EC) command. #ECSIGNATURE (1) This sets whether users may set their user signature with the .Enter Configuration (.EC) command. #ECCOLOR (1) This sets whether users may turn on (or off) and set their colors with the .Enter Configuration (.EC) command. #BORDERFREQ (20) This sets how often borders are displayed to the user. The value of this is used as a counter: after that number of room prompts has been displayed, a border is also displayed. #MAXERROR Wow. #MUSIC (1) This sets whether users may enable music with the .Enter Configuration (.EC) command. #TWITREV (1) This sets whether the Reverse (R) option works when you don't expect it. #PERSONALHALLOK (1) This sets whether the .Personal hall... (.P...) commands are active. #CHATBELL Wow. #ROOM_NYM ("room" "rooms") This sets what to call rooms. #HALL_NYM ("hall" "halls") This sets what to call halls. #USER_NYM ("user" "users") This sets what to call users. #GROUP_NYM ("group" "groups") This sets what to call groups. #FILTER (1 0 0) This sets the action of the Alt+B keystroke. This has three parameters: Psycho, Reverse, and Mmmm. You can turn on any combination of these for your desired effect. Psycho makes all characters alternate in case as they are output; Reverse makes all words come out backwards; and Mmmm replaces all upper-case letters with the character M and all lower-case letters with the character m. Accounting These keywords are used to set up accounting for your system. #ACCOUNTING (0) This determines whether or not accounting will be enabled for your board. It defaults to 0, which means that accounting is disabled; set it to 1 to enable accounting. #UNLOGGEDBALANCE (5) #NEWBAL (60) #UNLOGGEDBALANCE sets the balance for users who are not logged-in. #NEWBAL sets the balance for new users. (Both are in minutes.) Security The following keywords determine security features of your system. #LOGIN (VERIFIED NEW_ACCOUNTS) These keywords control how your BBS handles new- user log-ins. There are a number of possible events that may occur when creating a new account: #LOGIN allows you to select any combination of these events. Valid possibilities are: CLOSED_SYSTEM Prints CLOSESYS.BLB and hangs up. No account will be created, and no message will be left alerting the sysop that someone tried to create an account. NEW_ACCOUNTS This allows new accounts to be created by callers. VERIFIED All new users will automatically be verified at log-in; the user does not have to supply any information. QUESTIONS Asks a set of questions (real name, phone number, etc.), and has the caller enter a message to sysop. The answers to the questions and the message to sysop are saved to a file for the sysop to read later. Do not use this option; it is included only for backwards- compatibility. Use the #NEWUSERQUESTIONS keyword instead. SYSOP_MESSAGE This has the caller leave a message to the sysop. Don't use this with QUESTIONS (which you shouldn't be using anyway), or the caller will have to enter two messages to the sysop. This is slightly different than the sysop-message that is part of QUESTIONS: that message is actually not saved to the message base, but only the the new user information file. This message is actually saved to the message base. If you include the #LOGIN keyword, you must explicitly set VERIFIED and NEW_ACCOUNTS on if you want them to be on. All options need to be set on the same line. For example, the following would allow new callers to create accounts, but they will not be verified and Citadel will have them leave a message to the sysop: #LOGIN NEW_ACCOUNT SYSOP_MESSAGE #NEWUSERAPP ("") This sets an application to run as part of the new- user login routine. This gives you a chance to create an extensive questionnaire, run a call-back verifier, or do anything else you want to do. #NEWUSERQUESTIONS (none) This lets you have Citadel ask questions to new users when they first log on. Specify which questions you want Citadel to ask in the order that you want them asked. In addition to being saved in the user's log entry, the responses to these questions (except for COLORS) are saved to the file NEWUSER.LOG in your #HOMEPATH, so you can easily review all of your new users' answers at once. The available questions are: REALNAME The user is prompted for his real name. A response is required to continue. PHONENUMBER The user is prompted for his phone number. A response is required to continue. ADDRESS The user is prompted for his mailing address, which can be up to three lines long. OCCUPATION The user is prompted for his occupation. BIRTHDAY The user is prompted for his birthday. SEX The user is prompted for his sex. A choice of unspecified is available (and is the default). WHEREHEAR The user is prompted for where he heard about the system. COLORS The user is prompted to set his colors. TITLE The user is prompted to enter a title. SURNAME The user is prompted to enter a surname. PROTOCOL The user is prompted to select a default file transfer protocol. MESSAGE The user is prompted to leave a message to the sysop. Before the message editor is entered, the NEWQMSG.BLB file is displayed to the user. This message is saved to NEWUSER.LOG, and not to the message base. #F6PASSWORD ("") This keyword creates a system password to lock all function and Alt+ keys. They are always unlocked if a Sysop is logged-in. To unlock them at other times, press Alt+L. Citadel will then prompt for a password. If the password is correct, the keys will be unlocked until they are locked again by pressing Alt+L. When the console is locked, the symbol of a sun is displayed in the status line. Additionally, there are two special settings for this: "disabled" and "f6disabled". If "disabled" is used, then the keys are always locked unless a Sysop is logged in on console: the Alt+L keystroke cannot be used to unlock them. If "f6disabled" is used, then only the F6, Control+F6, Shift+F6, and Alt+F6 keys are locked; all other keys are available all the time. The F6 key combinations are only unlocked when a Sysop is logged-in: Alt+L cannot be used to unlock them. To disable the locking of console keys, set this to "" (the default). #FULLCONLOCK (0) This sets whether to fully lock the console when the console is locked. When fully locked, all keystrokes except Alt+L are disabled, not just the Alt+ and function key ones. It is very rare that you will want to set this to 1 if #F6PASSWORD is set to "disabled": in this situation, nothing can be done on console other than using Control+Alt+Del, the reset button, or the power switch. (A sysop can call from remote then upload and run a script that brings the system down in this situation.) #FORCELOGIN (1) This determines whether Citadel will automatically ask for initials and password when it receives a call. If set to 0, then callers will be able to be on-line as unlogged-in users, and their abilities will be restricted by the #READOK and #ENTEROK settings. (These also apply when a caller uses the .Terminate Stay (.TS) command.) #ENTEROK (1) #READOK (1) These two keywords determine whether or not unlogged-in users may use any Read or Enter commands. A setting of 0 for #ENTEROK means that unlogged-in users cannot use the Enter commands; a setting of 1 means that they can use the Enter commands. Similarly, a setting of 0 for #READOK means that unlogged-in users cannot use the Read command and a setting of 1 means that they can. #MESSAGE_ROOM (5) This sets the maximum number of messages that a user can enter in any single room on one call. Aides are exempt from this restriction. #READLLOG (1) This determines whether or not users can use the .Read Group-only Userlog (command. If it is set to 1, all users can use this command; if it is set to 0, only aides can. #ROOMOK (1) This determines whether or not non-aide users can create rooms. If this is set to 1, all users can make rooms in all halls. If it is set to 0, only aides can make rooms in all halls. Users can still make rooms in halls where the sysop explicitly allows it. #READALL (0) This determines who can use the All modifier of the .Read Messages (.RM) command. If it is set to 0, everyone can; if it is set to 1, only aides can; if it is set to 2, only sysops can; and if it is set to 3, nobody can. #AIDEHALL (1) This keyword determines whether or not aides can use the hall changing commands .Aide Hall (.AH) and .Aide Window (.AW). If it is set to 0, then only sysops can use these commands; if it is set to 1, then aides can also use them. #MODERATE (1) This keyword determines whether or not aides can see moderated messages. If it is set to 0, then only sysops can see moderated messages; if it is set to 1, then aides can also see them. Moderated messages are messages in moderated rooms and messages by users without network access in networked rooms. #NOPWECHO (48) This determines what the user sees when typing in initials and password. If it is set to 0, the user sees the characters as they are typed. If it is in the range of 48 through 57, the initials and password will be displayed as an automatically incrementing series of digits. Any other value will simply echo the character with that ASCII value in response to each character typed by the user. #TRAP (ALL) This controls which events are logged to the file specified by the #TRAP_FILE keyword. The following parameters are available; more than one may be specified: ALL This causes all events to be logged. CARRIER This causes carrier detect and carrier loss to be logged. LOGIN This causes log-ins, log-outs, and new users to be logged. NEWROOM This causes the creations of new rooms to be logged. ACCOUNT This causes accounting information to be logged. AIDE This causes Aide functions to be logged. ANONYMOUS This causes anonymous messages to be logged. APPLIC This causes application executions to be logged. CHAT This causes chat requests to be logged. CRON This causes Cron events to be logged. DOWNLOAD This causes file downloads to be logged. ERROR This causes internal system errors to be logged. HACK This causes possible hack attempts to be logged. NETWORK This causes network events to be logged. PASSWORD This causes password changes to be logged. PROBLEM_USER This causes problem user messages to be logged. Wow. I don't think this option really exists. SYSOP This causes Sysop functions to be logged. UPLOAD This causes file uploads to be logged. Placing a ! before an item disables that item. For example, the following would trap everything except chat requests: #TRAP ALL !CHAT #SYSOPOK (1) This sets whether users can be given sysop access from remote with the .Sysop Userlog edit (.SU) command. #SHOWSYSOP (1) Wow. #NUMROOMS Wow. #READLOG Wow. #ALLOWCRYPT (1) This sets whether message encryption is allowed. This has three settings: 0 (message encryption is not allowed); 1 (message encryption is allowed in mail only); or 2 (message encryption is allowed in any message). #BADPWPAUSE (0) This specifies an amount of time to wait after a user enters a bad password and declines to log in as a new user before providing the password prompt again. Specify the number of seconds you wish Citadel to pause for. Pausing at this time discourages attempted hacking of your system by password guessing. #PWDAYS (0) This sets how long people can keep their password before Citadel prompts for them to change it. Specify the number of days desired, or 0 to turn off this feature. #CALLLIMIT (0) This limits the number of calls users can make in a day. (A day being midnight-to-midnight, not any 24 hour period.) This can also be set for each user with the .Sysop Userlog edit (.SU) command. Specify the number of calls, or 0 to allow unlimited calls. This restriction is placed in addition to system accounting which is enabled with the #ACCOUNTING keyword. #NOCONSOLETRAP (0) This sets whether to not trap anything to the trap file that is done on console. This can be used to save disk space if you have a secure console and know everything that happens there. However, it will cause statistics generators that read the trap file to generate inaccurate information. Set this to 0 to trap everything that happens on console, or 1 to not. EXTERNAL.CIT The EXTERNAL.CIT file mostly contains information that tells Citadel how to use external programs: message editors (#EDITOR and #AUTO_EDITOR), user applications (#USERAPP), archivers (#ARCHIVER), and doors (#DOOR). It also contains other information that needs to be read whenever Citadel loads (#HOLIDAY and #REPLACE), or sometimes throughout the operation of the program (#DIRECTORY and #REFUSER). The standard Citadel flags for applications as described in Section II apply to all command lines given in this file. #ARCHIVER "name" "view_cmd" "extract_cmd" "extension" External archivers are used to view archive files with the .Read Archive file (.RZ) command in directory rooms. "name" must have a different initial letter for each archiver; this is what Citadel uses as the keystroke to identify the archiver. "view_cmd" is the command line to use to view the contents of an archive. The output should be placed in the file README.APL in Citadel's #APPLICPATH so Citadel can display it to the user. Currently, "extract_cmd" is not used. "extension" is the DOS file extension usually attributed to the archiver (LZH for LHArc, ZIP for PKZIP, etc.). Citadel uses this to add an extension to files if the user does not provide one. #AUTO_EDITOR "name" console "cmd" Automatic editors are editors that are applied to every message saved. "name" is the name of the editor, which is not important or used. console is a flag that may be set to 0 or 1. If it is set to 0, then the editor is always used. If it is set to 1, then the editor is only used when on console. #CENSOR_AUTHOR "name" #CENSOR_NODE "name" #CENSOR_TEXT "word" These set up message censoring. For a full discussion of message censoring, see the "Message Censoring" topic in Section II. #DIRECTORY "dir_name" This provides a way to keep your remote sysops from creating directory rooms pointing to certain directories. If a sysop calling from remote tries to create a directory room pointing to any directory specified in a #DIRECTORY line, the sysop will be de-verified, Citadel will hang up the phone, and a message will be left in the Aide) room alerting you. #DIRECTORY lines are not checked when a directory room is made by a sysop on console. Wildcards are allowed in directory names, so "C:*" will lock out the whole C: drive, or "C:\WORK\*" will lock out C:\WORK and any directory below it, for example. (If the directory is specified in quotation marks, remember that you need to double backslashes: "C:\\WORK\\*".) #DOOR "name" "cmd" "group" console sysop aide dir override Doors give you a way to connect external programs to Citadel. Doors can either be accessed with the .Enter Door (.ED...) command, or by a single keystroke at the room prompt. "name" must have a unique letter for each door, because this is the keystroke that Citadel assigns to the door. Additionally, if the door has same first letter of any Citadel internal command, the door can be set to override the internal command with the override parameter. "cmd" is the application command line to execute for the door. "group" sets a group to access the door. Users must be in this group to use the door. (This gives you a way to disable commands by groups: make "name" override the internal command, set "group" to the group that you want the internal command disabled for, and set "override" to non-zero.) The next four items are Boolean flags: console can be set to 1 to make door active only on console, or 0 if it can be used from remote as well; sysop can be set to 1 to make the door only usable by Sysops, or 0 if it can be used by non-Sysops as well; aide can be set to 1 to make the door only usable by Aides, or 0 if it can be used by non-Aides as well; dir can be set to 1 to make the door only work in directory rooms, or 0 if it should work in all rooms. override specifies how (and if) the door overrides internal commands. If set to 0, then it doesn't override any commands; the .Enter Door (.ED) command is the only way to execute the door. If set to 1, then the door overrides the single-key command with the same letter (for example, R at a room prompt). If set to 2, then the door overrides the extended command with the same letter (for example, .R at a room prompt). If set to 3, then the door overrides both. #EDITOR "name" console "cmd" Editors are optional external message editors. These are available from Citadel's internal message editor by going to the "Entry Command:" prompt and typing the first letter of the "name" field for the desired editor. For this to work, each "name" must not only start with different letters than the others, but they also have to be different than the Citadel editor commands ("S" for save, "A" for abort, etc.), otherwise Citadel will not be able to access its internal command. console can either be set to 0 for the editor to work over the modem (such as an ANSI editor, or a message filter), or 1 if the editor can only be used when on console (such as Brief, QEdit, MS- DOS's Edit, etc.). "cmd" is the application command line to execute for the editor. For example, the following command line will set up MS- DOS 5.0's Edit command for use with Citadel as a console editor: #EDITOR "Edit" 1 "?edit %f" (As this program is quite large, you may have to use "!?edit %f" for the command line to enable super-shelling, as described in the Applications topic in Section II.) #EVENT "type" "cmd" Events cause Citadel to execute the application "cmd" whenever an event of type "type" occurs. You can have more than one event for each type: they will be executed in order they are found in the EXTERNAL.CIT file. The valid "type" settings are: LOGIN LOGOUT CHAT DOWNLOAD READDIR READINFO UPLOAD ROOMPROMPT SAVEMSG READMSG BEEP READMSGS CARRIER NEWROOM HACK PASSWORD AIDE SYSOP ERROR NETWORK ACCOUNT APPLIC CRON ANONYMOUS NEWUSER STARTUP SHUTDOWN #HOLIDAY month date week day "name" Holidays are displayed when a date stamp has a "%x" in it. Citadel can accept holidays as a certain date of a certain month, or as a certain day of a certain week of a certain month. That is, New Year's Day is always on January 1. However, other holidays (like President's Day) are always on a certain day of the week (the third Monday of February for President's Day). If date is left at 0, then week must be set from 1 to 5 and day must be set from 1 (Sunday) to 7 (Saturday). If date is set to an actual date (1 to 31), then week and day must both be set to 0. For example, here are the holiday settings for New Year's Day and President's Day: #HOLIDAY 1 1 0 0 "New Year's Day" #HOLIDAY 2 0 3 2 "President's Day" #NETCOMMAND "command" "script" This sets a script to be used to process a specific network command. command is the network command to pass to the script (without the "#" leading character, which is provided by Citadel). script is the name of the script file to run to process the command. #REPLACE "word" "replace_phrase" Citadel outputs to the screen and modem one word at a time. Before it outputs a word, it checks to see if it should replace it with another word or phrase, as set by the #REPLACE keyword. This can be used as a "bleep" type censor function or for pure obnoxiousness. For example: #REPLACE "cat" "cute cuddly thing" This tells Citadel to print the words "cute cuddly thing" every time it sees the word "cat" in the output stream. #USERAPP "name" "outstr" "cmd" hangup These are executed every time a particular user logs in. "name" is the name of the user to tie the application to. "outstr" contains any text to send to the user before executing the application. "cmd" is the application command line to execute. hangup is a Boolean flag: if it is 1, then Citadel hangs up on the user after executing the application; if it is 0, then Citadel lets the user into the BBS after executing the application. NODES.CIT The NODES.CIT file contains information telling Citadel how to network with other nodes. When Citadel loads a NODES.CIT entry for a node, it first loads the "DEFAULT" entry, then loads the node's entry. For options that usually stay the same between nodes, it is best to set the option in the "DEFAULT" entry. If you need to change an option for a particular node, just set it for the node. Because the node's information is read after the "DEFAULT" node is read, any information specific to each node will override the contents of the "DEFAULT" entry. #AUTOGROUP "group name" (none) This sets a group to limit rooms created by #AUTOROOM to. If you must use #AUTOROOM, it is a good idea to also use #AUTOGROUP with a group that no nodes (or no nodes other than the creating node) belong to, to prevent net-wide spread of bad rooms. #AUTOHALL "hall name" (none) This sets a hall to add rooms to that are created with #AUTOROOM. #AUTOROOM autoroom (0) This sets if rooms can be automatically created. Set to 1 to enable this feature. Note that this will create every networked room on the other node that your node has access to. This is usually not a good idea. #BAUD speed (#INIT_BAUD in CONFIG.CIT) This specifies the speed to set the serial port at before dialing the other node. Citadel will detect the connect rate when a connection is made with the other node and adjust its speed as required. The valid values for this are: 300 600 1200 2400 4800 9600 19200 38400 57600 115200 #DIALOUT "dial string" (none) This is the string sent to the modem to dial the phone. This is sent after #DIAL_PREF in CONFIG.CIT is sent and before a carriage return is sent. #DIAL_TIMEOUT timeout (60) This specifies the length of time (in seconds) to wait after sending the dial string to the modem before giving up trying to make a connection. #FETCH fetch (0) This sets how to fetch when on-line using Net 6.9. The valid values are: -1 Never do any fetching while on-line. 0 Only do a fetch when on-line and there is no outgoing network packet for the other node in #TRANSPATH. 1 Fetch any waiting mail and FILE69 file transfer files (but not normal messages) even if there is an outgoing network packet for the other node in #TRANSPATH. 2 Do a full fetch even when there are outgoing network packets for the other node in #TRANSPATH. #FETCH_TIMEOUT timeout (35) This sets the number of minutes that Citadel will wait for the other node to complete fetching messages before assuming something is wrong and hanging up. #GATEWAY gateway (0) If this is non-zero, then Citadel will write extra information out to the network packet that may be helpful for software that acts as a gateway to other networks. Currently, the only thing written out differently is the time: In addition to the standard Citadel method of writing the time, it writes the time in a format that is easier for programs written in a language other than C to read. If you are running a gateway to another network, then the documentation for the gateway software will tell you if this setting is needed. #GROUP "grouphere" ["groupthere"] (none) If you want to map groups between two nodes, tell Citadel which groups to map to each other here. This is only used when incorporating messages: the group status of a room is not preserved or passed over the network. For example, if you network with a board that has a "Programming" group and you want to map messages in that board's "Programming" group into your board's "Programmers" group, set up the mapping here: #GROUP "Programmers" "Programming" You need to explicitly set up a #GROUP mapping to share groups, even if the name is the same on both boards. However, if the name is the same, you don't need to provide the name of the group on the other node: Citadel will use the name of the group on the local board for the name of the group on the remote board if only one name is present. If a message comes in that belongs to a group that is not mapped, it is put into the group specified by #MAPUNKGROUP, described below. #LOGIN login script (none) This is used to tell Citadel how to log onto the other board for networking. Usually, you wait for "initials:" from the other board, then send your board's initials and password. Do this with the string: #LOGIN w "initials:" s "in;pw\r" Take notice of the "\r" at the end of the initials and password: this is interpreted by Citadel as a return. If you don't include the "\r", then Citadel will never send the return to the other board, and you will not successfully log in, as the other board will be waiting for your board to finish entering its initials and password. Also know that after Citadel has reached the end of the #LOGIN script, it will claim that log-in was successful. However, it does not know if it was really able to log in, it just knows that it got to the end of its instructions. If you have something wrong (such as the wrong initials or password), your BBS will think that it was able to log in, but the other BBS will not. This is a common cause of networking error. Have the sysop of the other system watch the log-in process, to verify that your BBS was indeed able to log in. The available #LOGIN script commands are: D "protocol key" "path" "file" Download the file "file" into the path "path" with the file transfer protocol with "protocol key" as the menu key. Use an empty string ("") if downloading with a batch protocol. P "seconds" Pause for "seconds" number of seconds. R "wait" "send" "times" This is a complex "send while waiting" command. This is used to get the attention of some systems, which require you to hit the enter key often to recognize that they got a call. You would use this similarly to this: R "Connected" "\r" "10" This will cause Citadel to wait for "Connected" (use whatever the called system sends when it recognizes the connection) for the amount of time specified by #WAIT_TIMEOUT. If Citadel sees the string, then it considers itself successful. If it does not see the string, then it sends "\r" (remember that Citadel interprets this as a carriage return) to the modem, and waits again. It repeats this process 10 times before giving up and considering the log-in to be a failure. S "text" This tells Citadel to send the text specified by "text" out to the other system. U "protocol key" "path" "file" Upload the file "file" from the path "path" with the file transfer protocol with "protocol key" as the menu key. If a batch protocol is used, "file" may contain wildcards and multiple filenames separated by spaces. W "text" This tells Citadel to wait for the text specified by "text" to come in from the other system. If it is not seen in the time specified by #WAIT_TIMEOUT, then Citadel considers the log-in process to be a failure. ! "cmd" This tells Citadel to shell out to DOS and run the application specified by "cmd". The standard application flags (!, @, $, etc.) may be placed at the start of the command line to tell Citadel how to run the application. @ "script" This tells Citadel to read the text file specified by "script" and interpret it as more of the #LOGIN command. Citadel reads each line in this file, so it can have any number of #LOGIN commands. #MAPUNKGROUP "group name" ("Reserved_2") This sets the group to place group-only messages in that come in over the network belonging to a group that is not explicitly mapped by the #GROUP keyword. #MOREINFO69 sendit (1) This is not used yet. #NETWORK networktype (DRAGCIT1_0) This sets the network protocol to use for the network. This has to be the same on both nodes. The available network protocols are: DRAGCIT1_0 DRAGCIT1_1 DRAGCIT1_5 DRAGCIT1_6 NET6_9 NET6_9a HENGE CIT86 However, HENGE is not currently implemented. Wow. It should be removed. #NETFAIL failtrap (0) This sets how Citadel traps network events that fail. The available settings are: -1 Never trap failure. 0 Trap failure as specified by #TRAP NETWORK in CONFIG.CIT. 1 Always trap failure, even if network trapping is not enabled in CONFIG.CIT. #NODE "name" ["region"] (none) This declares the start of a section for a node. Give the node's "name" as either its full name or its full address, or just its alias if it is in the same region as your node. The optional "region" parameter is the old-style (30 character) region, and is not used for much. #OUTPUTPACE time (0) This sets the time to wait between each character sent while logging in with the #LOGIN command, in hundredths of a second. This is helpful when logging in over some packet-switched networks that cannot handle a full-speed transfer of data. #PHONE Avoid this keyword: use #DIALOUT instead. #PREDIAL "command" (none) This sets a command to send to the modem after #DIAL_INIT from CONFIG.CIT and before starting to dial the other board by sending #DIAL_PREF from CONFIG.CIT followed by #DIALOUT from this file. #PROTOCOL menukey (none) This specifies the file transfer protocol that Citadel should use for networking. For all network types, this must be a batch protocol. For Net 6.9, there is the additional requirement that it be a bi-directional file transfer protocol. (Use Net 6.9a if you want to use a uni-directional file transfer protocol). The specified protocol must be defined in PROTOCOL.CIT so Citadel knows how to use it. #REDIAL attempts (0) This sets how many times to try dialing the node every time Citadel tries to network. A value of either 0 or 1 results in a single attempt. #REQUEST frequency (1) This sets how often to send room request files to Net 6.9 network partners. Set frequency to how often you wish to send your room request: Citadel will send the file after that many fetches. Use 0 to never send a room request file. In general, this should be left at 1. #ROOM "name here" ["name there"] (none) When networking two boards using a network protocol of 1.6 or earlier, you need to tell Citadel which rooms to share with the other BBS, and the names of the rooms both on the local system and the remote system. Citadel then uses this to map the messages between the two systems. This is the biggest flaw of the earlier network protocols, as it is easy to make a mistake here that takes quite some time to track down: be careful as you set up your room mapping. If the room is named the same thing on both the local and remote system, then you may include only one name and Citadel will use it for both. #ROOM lines must be the last lines of a node's entry in NODES.CIT: after Citadel encounters the first #ROOM line, it only reads #ROOM lines. For Net 6.9, #ROOM lines are not used, as the mapping is done automatically based on the Network IDs of the rooms. #VERBOSE verbose (FILE69IN) This sets which error and status messages are saved to the Aide) room when networking with the specified node. The following parameters are available; more than one my be specified: FILE69IN Alerts you when an incoming file transfer is received. FILE69INFULL Alerts you when an incoming file transfer is received, and saves the output of the command used to extract the file from the packet. NOACCESS Alerts you when a node requests a room to which it does not have access. ROOMCREATED Alerts you when a room is created. ROOMNOTCREATED Alerts you when a room is not created, though Citadel tried. NETIDNOTFOUND Alerts you when a Net ID is detected on the network that Citadel has seen before, but that you don't carry. (Most likely because you have deleted the room.) NONETIDONSYSTEM Alerts you when a Net ID is specified in a Citadel-86 style network that does not exist on the system. In addition, the following shortcuts are available: 0 Sets the default #VERBOSE. 1 Sets the default #VERBOSE and turns on FILE69INFULL and NOACCESS. 2 Sets the default #VERBOSE and turns on FILE69INFULL, NOACCESS, ROOMCREATED, ROOMNOTCREATED, NETIDNOTFOUND, and NONETIDONSYSTEM. ALL Turns on all #VERBOSE settings. Currently, this is the same as 2, but this may change in the future: 2 will never turn on more than it currently does, but ALL will always turn on all options available. After using any of the shortcuts, you may then turn off any options by specifying the option preceded by an exclamation mark (!). For example, if you wanted to know about everything except NOACCESS, you could specify the following: #VERBOSE ALL !NOACCESS #WAIT_TIMEOUT timeout (60) This sets the number of seconds that Citadel will wait for an incoming string with either the "W" or "R" #LOGIN commands before declaring failure. #ZIP "create" "extract" (see below) This sets how to create and extract network packets. This is not used for the DRAGCIT1_0, DRAGCIT1_1, or HENGE network types. For DRAGCIT1_5, DRAGCIT1_6, NET6_9, and NET6_9a, these are command lines to pass to an archiver such as PKZIP (thus the name #ZIP). For CIT86, these are the filenames for the network packets. For the "create" archiver command line, the variable %d gives the name of the archive file to create, and %f gives the names of the files to archive. (This will include multiple files separated by spaces and wildcards; make sure the archiver you choose supports these.) In the extract command line, the variable %d gives the name of the archive file to extract files from. Citadel always wants to extract all files from the archive, so there is no %f variable for extraction. Both you and your network partner must agree on how to create and extract network packets with an archiver: you must use the correct command to extract archives that he creates for you, and he must use the correct command to extract archives that you create for him. Though there is no requirement for it, the de facto standard program used on the Citadel network is PKZIP 2.04g. This is used in the CIT86 network protocol as the names of the files to create and read. For reading, wildcards are accepted. For use as archive command lines, there are no defaults. For use as CIT86 network packets, the default "create" packet name is "MSGOUT86.xxx" (where "xxx" rotates from "000" to "999" sequentially), and the default "extract" packet name is "MSGIN86.*". CRON.CIT The CRON.CIT file defines CRON events; events that Citadel should run after some amount of time has passed. These are used extensively for networking, to tell Citadel when to try to network. They have other uses, however, such as taking the board down, turning chat on or off, performing a backup, analyzing usage with a program that reads the trap file, or any other use that you desire. You have full control over when an event will execute. You can determine how long citadel should wait between successful executions of the event, and how long it should wait between unsuccessful executions of the event. You can also limit the execution of the event to specific days, dates, months, or hours. This can be used, for example, to tell Citadel to only try to network at night, when long distance charges are the lowest. Control of when the events are executed is provided by the #IDLE_WAIT CONFIG.CIT variable, which tells Citadel how many idle minutes are allowed before it is to try to execute a cron event, and the variables listed below. #DO This tells Citadel what to do for this cron event. After the #DO, you must specify a cron type and a command string. The cron type is one of the following: NETWORK Attempt to network with a remote node. The command string tells Citadel which node to network with. SHELL_1 This tells Citadel to execute an application. The command string tells Citadel which application to execute. SHELL_2 This does the same exact thing as SHELL_1. It is included only for backwards compatibility. SHUTDOWN This tells Citadel to quit to DOS. The command string is the exit code to used, which can be interpreted by the ERRORLEVEL command in a DOS batch file. CHAT_ON This tells Citadel to turn chat on. The command string is ignored. CHAT_OFF This tells Citadel to turn chat off. The command string is ignored. NET69_IN This incorporates any Net 6.9 packets in the #TRANSPATH. The command string is ignored. NET69_OUT This executes a Net 6.9 pre-fetch for another node. The command string tells Citadel which node to pre-fetch for. COMMAND This runs a Citadel script file. While a script file can also be run with the SHELL_1 (or SHELL_2) command, running one in this way gives the added ability to check the success of the command, which is used by the #RETRY_TIME parameter, described below. The command string tells Citadel which script file to run. NET86_IN NET86_OUT These are used for Cit-86 networking, which is not yet fully implemented. Don't use these; they are included here only for completeness. Any lines following a #DO line are considered by Citadel to apply to the #DO line. When Citadel reads another #DO line from CRON.CIT, it then assumes that all subsequent lines apply to the new #DO line. #HOURS This tells Citadel in which hours it is to attempt to execute the cron event. The parameters for #HOURS can be the word "ANY" or any numbers from 0 to 23. If it is "ANY", or there is no #HOURS line, then Citadel will execute the cron event during any hour. Otherwise, Citadel will only run the command during one of the specified hours of the day. For example, to tell Citadel to run a cron event only between 11:00 PM and 5:00 am (for example to only network during the cheap long distance times of night), include the following line: #HOURS 23 0 1 2 3 4 Note that 5 is not specified: the 4 applies to all times from 4:00 to 4:59:59, which brings us right to 5:00 am. #DAYS This tells Citadel during which days it is to attempt to execute the cron event. The parameters for #DAYS can be the word "ANY" or any combination of the days of the week, "SUN" to "SAT" or "SUNDAY" to "SATURDAY". For example, if you want to split long distance charges between a network partner, you might want to call it half of the days of the week. To do this, include the following line: #DAYS SUN TUE THU SAT The other node would include the corresponding: #DAYS MON WED FRI Of course this only splits the calling into four sevenths and three sevenths, but that is the result of having a culture that was not designed for the ease of computers. (This is not as bad as the 28, 29, 30, or 31 day month, however...) #MONTHS This tells Citadel during which months it is to attempt to execute the Cron event. The parameters for #MONTHS can be the word "ANY" or any combination of the months of the year, "1" to "12", "JAN" to "DEC", or "JANUARY" to "DECEMBER". For example, if you want to run an event only during the month of February, you could include the following line: #MONTHS FEB #DATES This tells Citadel during which dates of a month it is to attempt to execute the cron event. The parameters for #DATES can be the word "ANY" or any combination of dates, from "1" to "31". For example, if you want to analyze your trap file on a monthly basis, you could set #DATES as follows: #DATES 1 This would let Citadel only execute the event on the first day of the month. Combine this with #REDO_TIME (see below) to make sure that the event is only executed once during this date. #REDO_TIME This tells Citadel how long to wait after executing an event before it should execute it again, in minutes. For example, if you want to network with another BBS every four hours, set this as follows: #REDO_TIME 240 #RETRY_TIME This tells Citadel how long to wait, in minutes, after an event fails before it should attempt it again. A common cause of a failed event is that the other node is busy when attempting to network. For example, to tell Citadel to attempt to network every 5 minutes until it is successful, use the following line: #RETRY_TIME 5 GRPDATA.CIT The GRPDATA.CIT file contains information that Citadel uses for accounting. If you don't have accounting enabled, this file is never read. #GROUP "Group Name" This sets the group that the next set of variables will affect. For example, to give information about the "Null" group, start with the following line: #GROUP "Null" Citadel will then assign all the information it finds next in the file to the "Null" group until it finds another #GROUP line or reaches the end of the file. #PRIORITY 0 to 32767 When Citadel is determining the accounting for a user, it first assigns default values for accounting and sets the current priority level to 0. The defaults are the worst possible values, from the user's point of view. It then checks each group on the system. If the user is in a group and the group is defined in GRPDATA.CIT, Citadel checks the priority of the group. If it is higher than the current priority level, it resets all accounting information to the default values, then reads that groups information. Otherwise, it chooses either the value already set for the user or the value set for the group, whichever is better. This means that, of all the groups a user belongs to, Citadel will only look at the groups with the highest setting of #PRIORITY, and give the user the best deal based on the settings for those groups. This lets the values of certain groups override the values of others. For example, if you have a group for twits or users who you want to limit to less time than the other users while still having access to the same groups they have, you could set this group with priority over all the other access groups and the user would be limited to what that group would allow, even though he is in groups with more access. #DAYS SUN MON TUE WED THU FRI SAT or ANY These set which days members of this group can log in. If a user tries to log in during a day that he cannot, Citadel will print NOLOGIN.BLB to the modem then disconnect. #HOURS 0 to 23 or ANY These set which hours members of this group can log in. If a user tries to log in during a hour that he cannot, Citadel will print NOLOGIN.BLB to the modem then disconnect. #SPECIAL 0 to 23 or ANY These set which hours are free for members of this group. No time at all is charged during these hours. #DAY_INC 0 to any reasonable value This sets how many minutes per 24 hour period to add for this group. Unlike most BBS software, which is broken, Citadel's accounting is continuous: it is not based on silly midnight-to- midnight days. So, if a user uses up all of his time at 11:30PM, he will not get it all back at midnight. If he calls back at midnight, Citadel will see that 30 minutes have passed, calculates that it has been one twenty-fourth of a day, and gives the user one-twenty-fourth of #DAY_INC. Similarly, if the user waits 36 hours to call back (a day and a half), Citadel will give the user one and a half times #DAY_INC minutes. #MAX_BAL 0 to any reasonable value This is the maximum time that users for this group can have in their account. #DL_MULT -32768 to 32767 #UL_MULT -32768 to 32767 These set special rates to charge for file uploads and downloads. This lets you, for example, charge only half the time spent uploading, or even to give time for uploads, as a "thank-you" for uploading. Here you must remember that during a transfer, time stands still in terms of accounting: no time is charged during the transfer. #UL_MULT and #DL_MULT are used to charge (or credit) the account balance after the transfer is complete, using the following formula: ACC_BAL = ACC_BAL + (TRNS_TIME * MULT / 100) Therefore, setting a positive value gives the user time, and setting a negative value takes it away. Examples of values and results are: Value Result -200 Charge twice the time that the transfer took. -100 Charge for how long the transfer took. -50 Charge for half the time that the transfer took. 0 Don't charge or credit any time for the transfer. (Ignore it.) 50 Credit half the time the transfer took to the user's account. Sample Entry This is a sample entry in a GRPDATA.CIT file: #GROUP "Null" #DAYS ANY #HOURS ANY #SPECIAL 0 1 2 3 4 5 6 7 #DAY_INC 60 #MAX_BAL 120 #PRIORITY 1 #UL_MULT 0 #DL_MULT -100 This entry will allow members of group "Null" to call on any day at any time. From midnight until 7:59am, they have unlimited call time. An extra 60 minutes will be added to their accounts every 24 hours, up to a maximum of 120 minutes. Uploads are free, and downloads are charged for the time spent during the transfer. That is, if a user uploaded a file taking five minutes, the account balance at the end of the transfer will be the same as it was at the beginning. If, however, the user downloaded a file taking five minutes, Citadel will take five minutes out of the account after the transfer was complete. If a user attempts a download that takes more time than there is in the account, Citadel will allow it, but they will be charged time for it. This will result in negative time, so the user will have to wait for the time in his account to become positive before he can log in again. DEFUSER.CIT It is best to specify only those parameters that you want set differently than the defaults. While no damage is done by redundantly setting parameters to the defaults, it takes extra time for Citadel to read the DEFUSER.CIT file. On slower computers and hard disks, this may be a noticeable difference. To keep things fast, it is also best to keep extra lines in this file to a minimum. #ADDR1 #ADDR2 #ADDR3 (none) These set the three lines of the new user's address. You can set each of these individually. There is rarely a reason to give new users a default address. #AIDE (0) This determines whether new users will be made Aides. The default (0) tells Citadel not to make new users into Aides. If set to non-zero, Citadel will make new users into Aides. It is usually considered a bad idea to make new users Aides. #BLINK (Wow.) This sets the default attribute for blinking text for users with ANSI emulation turned on. #BOLD (Wow.) This sets the default attribute for bold text for users with ANSI emulation turned on. #BORDERS (1) This determines whether the user can enter borders with the .Enter Border command. The default (1) lets users use the .Enter Border (.EB) command. Set this to 0 to disable the command for new users. #CALLLIMIT (0) This sets the calls-per-day limit for new users. This is in addition to a global calls-per-day limit set in CONFIG.CIT. A day is midnight-to- midnight. Set this to 0 to allow unlimited calls per day. #CHECKALLCAPS (0) This sets whether to check words in all-caps in the spell-checker. #CHECKAPS (0) This sets whether to check words ending with an apostrophe S in the spell-checker. If this is turned off, then the apostrophe S is removed from all words, and only the root word is checked. #CHECKDIGITS (0) This sets whether to check words with imbedded digits in the spell-checker. #CONFIRMABORT (1) This sets whether to ask for confirmation when the Abort command is used in the message editor and a message has been started. #CONFIRMEOABORT (0) This sets whether to ask for confirmation when the aborted message buffer is about to be cleared by starting a new message. #CONFIRMSAVE (0) This sets whether to ask for confirmation when the save command is used in the message editor. #CREDITS (60) This determines the number of credits to give new users. #DEFAULTHALL (none) This sets the default hall for new users. It defaults to none, which is effectively your Root hall. (Whatever you may have renamed it to.) #DICTWORD (none) This adds a word to the personal dictionary used by the spell-checker. As many words as desired may be specified by having multiple #DICTWORD keywords. #DISPLAYTS (1) This sets whether new users are configured to see titles and signatures by default. The default (1) sets new users to see titles and signatures. If you don't want new users to see titles and signatures, set this to 0. #DSTAMP (#DATESTAMP from CONFIG.CIT) This sets the default date stamp for new users. This is usually not used, as a default is set in CONFIG.CIT. #EXCLUDEENCRYPTED (0) This sets whether to exclude encrypted messages. #EXPERT (0) This sets the default expert mode for new users. The default (0) sets new users to be non-expert. If you want new users default to being expert, set this to non-zero. #FINGER (none) This sets the finger for new users. #FORWARD (none) This sets a user to forward all mail to. #FORWARDNODE (none) This sets a node to forward all mail to. #HALLTELL (1) This sets whether new users see hall descriptions by default. The default (1) sets new users to see hall descriptions. If you don't want new users to see hall descriptions, set this to be non-zero. #HIDEEXCL (0) This sets whether new users have message exclusions hidden by default. The default (0) does not hide message exclusions. If you want new users to have message exclusions hidden by default, set this to be non-zero. #IBMANSI (0) This sets whether new users have IBM ANSI mode turned on by default. #AUTOANSI in CONFIG.CIT overrides this setting. The default (0) does not turn on ANSI emulation mode. If you want new users to have ANSI emulation mode on by default, set this to be non-zero. #IBMCOLOR (0) This sets whether new users have ANSI COLOR mode turned on by default. #AUTOANSI in CONFIG.CIT overrides this setting. The default (0) does not have ANSI color turned on. If you want new users to have ANSI color on by default, set this to be non-zero. #IBMGRAPH (0) This sets whether new users have IBM extended ASCII turned on by default. The default (0) does not have IBM extended ASCII turned on by default. If you want new users to have IBM extended ASCII turned on by default, set this to be non-zero. #IBMROOM (0) This sets whether to display the room flags with IBM graphics characters. #INVERSE (Wow.) This sets the color code for inverse text. #KNODE (none) This sets a node to discard messages from. You can specify as many nodes as you wish by using multiple #KNODE keywords. #KREG (none) This sets a region to discard messages from. You can specify as many regions as you wish by using multiple #KREG keywords. #KTEXT (none) This sets text check for discarding: messages containing this text are discarded. You can specify as many text strings as you wish by using multiple #KTEXT keywords. #KUSER (none) This sets a user to discard messages from. You can specify as many users as you wish by using multiple #KUSER keywords. #LFMASK (1) This sets whether new users have linefeeds by default. The default (1) turns linefeeds on for new users. If you don't want linefeeds turned on for new users, set this to 0. You should leave this set to 1, as the vast majority of users will be calling with computers that require linefeeds. (Also, keep in mind that sending unnecessary linefeeds merely makes text appear double-spaced, but failing to send necessary linefeeds makes all text appear on the same line.) #LINESSCREEN (0) This sets the number of lines per screen for new users. The default (0) turns off full-screen pause. If you want full-screen pause turned on for new users, set this to the number of lines you desire. For example, #LINESSCREEN 23 means that screen pause defaults to on, with the pause every 23 lines. #LOCKHALL (0) This sets whether the default hall of new users is locked. The default (0) does not have the default hall of new users locked. If you want to lock the default hall of new users, set this to be non- zero. #LOCKUSIG (0) This sets whether the user signature of new users is locked. The default (0) does not lock the user signature of new users. If you want to lock the user signature of new users, set this to be non- zero. #MINIBIN (1) This sets whether full usage statistics are displayed when logging in by default. The default (1) displays full statistics. If you don't want this to be on by default, set this to be non-zero. #MOREPROMPT (#MOREPROMPT from CONFIG.CIT) This sets the moreprompt for new users. This is usually not used, as a default is set in CONFIG.CIT. The more prompt is displayed after a full screen of text if the user has pause-on-full- screen turned on and after messages if the user has pause-between-messages turned on. #MSGCLS (0) This sets whether the screen is cleared between messages. (This only works if #IBMANSI is turned on.) The default (0) does not clear the screen between messages for new users. If you want to clear the screen between messages for new users, set this to be non-zero. #MSGPAUSE (0) This sets whether Citadel pauses between messages for new users by default. The default (0) does not pause between messages for new users. If you want the default to be pause between messages, set this to be non-zero. #MUSIC (0) This sets whether new users have music turned on or not. For this to have any effect, #MUSIC in CONFIG.CIT must be set to 1. #NETPREFIX (#NET_PREFIX from CONFIG.CIT) This sets the default net prefix for new users. This is usually not used, as a default is set in CONFIG.CIT. #NETUSER (1) This sets whether new users are Netusers by default. The default (1) makes new users Netusers by default. If you don't want new users to be Netusers by default, set this to be 0. #NEXTHALL (0) This sets whether new users have auto-next hall turned on by default. The default (0) does not have auto-next hall enabled. If you wish to enable auto-next hall for new users, set this to be non- zero. #NOACCOUNT (0) This sets whether new users have accounting disabled by default. The default (0) does not disable new users' accounting. If you wish to disable new users' accounting by default, set this to be non-zero. #NOCHAT (0) This sets whether new users have chat disabled by default. #NODE (0) This sets whether new users are Nodes by default. It is not a good idea to set this to 1. #NODOWNLOAD (0) This sets whether new users have download privileges disabled by default. #NOMAIL (0) This sets whether new users have mail disabled by default. #NOMAKEROOM (0) This sets whether new users have room creation abilities disabled by default. #NOUPLOAD (0) This sets whether new users have upload privileges disabled by default. #NULLS (0) This sets the default number of nulls for new users. There is no good reason to set this to anything greater than 0; this is a hold-over from the 1970s and early 1980s when many callers used printing terminals that could not keep up with the 300 baud data stream from the modem. #NUMUSERSHOW (0) This sets the number of most-recent-caller users to show when logging-in. #OLDTOO (1) This sets whether new users have last old on new turned on by default. #OUT300 (0) This sets whether new users have 300 baud simulation turned on by default. #PERMANENT (0) This sets whether new users are permanent by default. #PHONENUM (none) This sets the default phone number of new users. #POOP (0) This sets the initial poopcount for new users. #PRINTFILE (0) This sets whether new users are trapped to the print file by default. #PROBLEM (0) This sets whether new users are considered problem users by default. #PROMPT (#PROMPT from CONFIG.CIT) This sets the room prompt for new users. This is usually not used, as a default is set by #PROMPT in CONFIG.CIT. #PROTOCOL (none) This sets the default file transfer protocol for new users. #PSYCHO (0) This sets whether new users have psycho chicken mode enabled by default. #PUNPAUSES (0) This sets whether the P key can be used to un- pause output that has been paused by the P key. (This also applies to Control+S, which Citadel treats exactly the same as P.) #REALNAME (none) This sets the default real name for new users. #REPLACE (none) This sets text to replace as it is entered in the message editor. Give two strings: first the text to replace, then the text to replace it with. Citadel makes an attempt to get the case right when replacing text. #ROOMINFO (1) This sets whether new users see room information lines by default. #ROOMTELL (1) This sets whether new users see room information files by default. #SEEBORDERS (1) This sets whether new users see borders and ads by default. #SHOWCOMMAS (1) This sets whether new users see commas in numbers as thousands separators. #SIGNATURE (none) This sets the default signature for new users. #SIGNATURES (1) This sets whether new users view signatures by default. #SPELLCHECK (Wow.) Wow. #SUBJECTS (1) This sets whether new users view subjects by default. #SURNAME (none) This sets the default surname for new users. #SURNAMLOK (0) This sets whether new users' titles and surnames are locked by default. #SYSOP (0) This sets whether new users are made sysops. This is generally not a good idea. #TABS (0) This determines whether or not tabs will be converted to spaces for new and unlogged-in users. The default is tabs off; i.e., tabs are converted to spaces. All terminals support spaces, so this is the safest setting. #TITLE (none) This sets the title for new users. #TUSER (none) This sets a user-tag. Give two parameters: first the name of the user to tag, then the tag. You can have as many user tags as you wish by specifying multiple #TUSER keywords. #TWIRLY (0) This sets if new users have their twirly cursor enabled by default. #UCMASK (0) This determines whether or not new and unlogged-in users will see text in all-uppercase. 0 leaves text in its normal case, 1 sets it to all- uppercase. #UNDERLINE (Wow.) This sets the attribute of underlined text. #UNLISTED (0) This sets if new users have unlisted accounts by default. #USEPERSONAL This sets if new users are in their personal hall by default. Nothing would be in their personal hall. #VDSTAMP (#VDATESTAMP from CONFIG.CIT) This sets the default verbose date stamp for new users. This is usually not used, as a default is set in CONFIG.CIT. #VERBOSE (0) This sets if new users have auto-verbose turned on by default. #VERBOSECONT (0) This sets the verbose-continue default for new and unlogged-in users. Setting it to 0 will set it to off, and setting it to 1 will set it to on. Verbose continue determines what happens when the "Continue" command is used in the message editor. If it is on, Citadel will print out the entire message before accepting new input; if it is off, Citadel prints out only the last 100 characters. #VERBOSELOGOUT (0) This sets if new users have verbose log-out turned on by default. #VERIFIED (1) This sets if new users are verified. (If not, they are not allowed to log in.) #VIEWCENSOR (0) This sets if new users are set to view censored messages by default. #WIDEROOM (0) This sets if new users have wide rooms turned on by default. #WIDTH (80) This sets the default screen width for new and unlogged-in users. Values from 10 to 255 are accepted. #YOUAREHERE (0) This sets if new users have You Are Here turned on. Please never turn this on, for it is evil. HARDWARE.CIT Citadel reads HARDWARE.CIT to know which external hardware drivers (if any) to load. These drivers are written to provide support for non-standard or specialized hardware. Appendix B contains detailed information concerning programming drivers for any specialized hardware you may possess. Currently, hardware drivers are available for FOSSIL serial support and Sound Blaster support. These drivers are documented in Appendices C and D, respectively. The following driver types are supported: #COMDRIVER This provides an alternate method to communicate with your computer's serial hardware. This can be useful for non-IBM PC compatible computers. Communications drivers have the extension "ECD" for External Communications Driver. #KBDDRIVER This provides an alternate method to communicate with your computer's keyboard. This can be useful for non-IBM PC compatible computers. Keyboard drivers have the extension "EKD" for External Keyboard Driver. #SNDDRIVER This provides a method to communicate with any sound cards in your computer. This can be incorporated with scripts to provide sound on your computer tied to certain events, or to add speech synthesis to Citadel. Sound drivers have the extension "ESD" for External Sound Driver. To use external drivers, just create a HARDWARE.CIT which specifies the drivers you desire, and place it in your Citadel's #HOMEPATH (as defined in CONFIG.CIT), along with the drivers. For example, to use the FOSSIL.ECD communications driver, HARDWARE.CIT should have the following line: #COMDRIVER FOSSIL When if a driver is loaded, you will see mention of it in the "System Status / Debugging" section of the .Read Verbose Status (.RVS) command. Only one driver of each type can be loaded at a time. PROTOCOL.CIT The PROTOCOL.CIT file is used to define external file transfer protocols for use with the .Upload (.U...) and .Download (.D...) commands. #PROTOCOL "name" This gives the name of the file transfer protocol being defined. All keywords up until the next #PROTOCOL keyword define the attributes of the protocol. #MENU_NAME "menuname" This sets the name of the protocol to display on the .Upload Menu (.U?) and .Download Menu (.D?). If this is not provided, then the #PROTOCOL name is used. #COMMAND_KEY "character" This sets key used to execute the protocol. If this is not specified, then the first character of #MENU_NAME is used, or the first character of #PROTOCOL if #MENU_NAME is not specified. #BATCH batch This sets whether the protocol can transfer more than one file at a time. Specify 0 if the protocol is not batch (it can only transfer a single file at a time), or 1 if it is. #BLOCK_SIZE size This sets the block size used by the protocol. If it has a varying block size, then specify 0. #RECEIVE "command line" This specifies the command line to use to receive files with the file transfer protocol. See below for variables and flags that may be used. #SEND "command line" This specifies the command line to use to send files with the file transfer protocol. See below for variables and flags that may be used. #AUTO_UPLOAD "string" This specifies a string of characters that Citadel should respond to by initiating an upload with the file transfer protocol if it sees them at the room prompt of a directory room. #RESPONSE_SEND "command line" This specifies the command line to use to send files specified in a response file with the file transfer protocol. See below for variables and flags that may be used. #NET_ONLY netonly This specifies if the protocol should be used for networking only. Specify 0 to let the protocol be used by users, or 1 to make the protocol only be available for networking. #CHECK_TRANSFER Wow. Command line variables and flags With all command lines, the following variables may be used: %a The application path, as set by the #APPLICPATH variable in CONFIG.CIT. %c The modem-to-modem connect speed. For high speed modems, the actual speed of the connection from the computer to the modem is often higher than the actual speed that the two modems are connected at. The %s variable is used if the file transfer protocol needs to set the port rate to use; the %c variable is used to let the protocol more accurately guess the time that the transfer will take. %f The file being sent or received. This is not used in the file receive string of a batch protocol: the protocol supplies the file name. Also, this is the name of the text file that lists the files to be sent when used in the response file send file command. %l The modem port or LOCAL. This is the numeric value 1-4, depending on which serial port the modem is connected to, or the text LOCAL if the current user is logged in locally. %p The serial port that is being used: 1 to 4. %s The actual speed (baud) used to talk to the serial port. %u The name of the currently logged-in user, after stripping out any color codes. If there is no user logged-in, this passes the text "[Not logged in]". In addition, the following flags can be put at the start of the command line to tell Citadel how to run the application: ! This tells Citadel to "Super-shell", or swap as much of itself as possible out of memory, thus giving the application the most memory possible in which to run. Citadel leaves less than 1K of itself in memory, swapping the rest of itself to XMS, EMS, or disk. Swapping to XMS or EMS is nearly instantaneous, but swapping to disk takes a few seconds. @ This tells Citadel to not clear the screen before running the application, and to not restore the screen before returning. This is used to save memory if you are not super-shelling and the application saves and restores the screen for you: an 80x25 text screen takes nearly 4K to save in memory. When using the super-shell this does not make any difference, because the memory used to save the screen is also swapped out when shelling. $ This tells Citadel to load COMMAND.COM (or, actually, the program pointed to by the COMSPEC environment variable) and tell it to process the command. This is used to run DOS batch files or to redirect program output to a file. ? This tells Citadel not to write out BBS information files when shelling. Writing these files takes some time and some disk space, but not much. Usually, it does not matter if they are written out when not needed. But, if you are very tight on disk space or running on a slow machine, this makes a difference. * This tells Citadel that the application is a script file, not a program. This overrides all other flags. That is, if this flag is present then all others are ignored. This is because the other flags don't apply to script files. Also, when running a script file the command line arguments are not passed to it, since script files have no command line parameters. Citadel also has some internal file transfer protocols, which can be specified by setting the command lines to special values: "[xmodem]" for Xmodem checksum; "[crcxmodem]" for Xmodem CRC; "[1kxmodem]" for 1K Xmodem (sometimes incorrectly referred to as Ymodem); and "[zmodem]" for Zmodem. The internal file transfer protocols don't work with file queuing. MDMRESLT.CIT The MDMRESLT.CIT file contains all result codes your modem may generate that Citadel needs to understand. Any number of each type of string may be present. If this file does not exist, then Citadel uses built-in defaults. If this file does exist, then you must specify all possible result codes your modem can generate that Citadel needs to know about. #NOCARRIER "string" A string your modem sends when it is not able to make a connection when dialing out. #NOANSWER "string" A string your modem sends when there is no answer at a telephone number it just dialed. This is similar to #NOCARRIER. #ERROR "string" A string your modem sends when it doesn't understand what the computer just told it to do. #NODIALTONE "string" A string your modem sends when it is not able to detect a dial tone when dialing out. #BUSY "string" A string your modem sends when it detects a busy signal after dialing a telephone number. #RING "string" A string your modem sends when it detects a ringing signal on the phone line, after someone dials your phone number. #COMPRESSION "string" A string your modem sends when it has negotiated a connection with some form of data compression. #CORRECTION "string" A string your modem sends when it has negotiated a connection with some form of error correction. #CONNECT300 "string" #CONNECT1200 "string" #CONNECT2400 "string" #CONNECT4800 "string" #CONNECT7200 "string" #CONNECT9600 "string" #CONNECT12000 "string" #CONNECT14400 "string" #CONNECT16800 "string" #CONNECT19200 "string" #CONNECT28800 "string" #CONNECT38400 "string" #CONNECT57600 "string" #CONNECT115200 "string" #CONNECT230400 "string" Strings your modem sends after making a connection at the specified speed. #CONNECT1200C "string" #CONNECT2400C "string" #CONNECT4800C "string" #CONNECT7200C "string" #CONNECT9600C "string" #CONNECT12000C "string" #CONNECT14400C "string" #CONNECT16800C "string" #CONNECT19200C "string" #CONNECT28800C "string" #CONNECT38400C "string" #CONNECT57600C "string" #CONNECT115200C "string" #CONNECT230400C "string" Strings your modem sends after making a connection with data compression at the specified speed. Citadel also assumes that there is error correction on these connections. #CONNECT1200E "string" #CONNECT2400E "string" #CONNECT4800E "string" #CONNECT7200E "string" #CONNECT9600E "string" #CONNECT12000E "string" #CONNECT14400E "string" #CONNECT16800E "string" #CONNECT19200E "string" #CONNECT28800E "string" #CONNECT38400E "string" #CONNECT57600E "string" #CONNECT115200E "string" #CONNECT230400E "string" Strings your modem sends after making a connection with error correction (but not data compression) at the specified speed. #RUNAPPLIC "string" "command line" Result codes that your modem generates that you want to support in some way, but that Citadel does not know about. This tells Citadel to run an application when it receives the result code. This can be used to have Citadel shell to a fax program if it gets a FAX result code, for example. ROUTE.CIT The ROUTE.CIT file is used for routing networked mail. Citadel appends information to the end of this file, and expects to be able to read it back. Because of how the standard C file reading functions work, this means that if you edit this with a text editor, be sure that it does not append a Control+Z character on the end. (As if this was CP/M. This is MS-DOS. This is such an advanced operating system that it actually keeps track of the length of files, so it doesn't need Control+Zs at the end of files. Text editors that always append Control+Zs to the end are stupid. People who configure their text editors to do so when there is a choice are equally stupid, and should be forced to use CP/M like they evidently want to do.) #ADDRESS "address" "name" "region" This specifies the address, name, and region of a node on the network. Citadel adds valid #ADDRESS lines as new nodes are detected on the network. However, as there is no way to know when a node goes down, you are responsible for deleting #ADDRESS lines if you care. If not, then your users will be able to easily send messages to nodes that don't exist. #ROUTE "routed system" "through system" This lets you specify an explicit route for network mail to take to get somewhere. In general, it is best not to do so, and let Citadel deliver it as it sees best fit to do. However, it is possible (if you try hard enough) to design a network topology such that mail will not automatically get through. If you do this, it is your own fault. Neener. So it is your responsibility to fix the network topology (no, I am not going to tell you what is wrong with it), or at least force a route with this keyword. This can also be used to add more security to mail routing, if you know what you are doing. No, I am not going to tell you what this means, either. Cope. Basically, what I am doing here is discouraging you from using this keyword, as it is truly evil and only still exists for extreme cases. MAILLIST.CIT The MAILLIST.CIT file is used for creating mailing lists. Citadel needs to edit this file occasionally, and it removes any non-command lines from it as it does so (since it doesn't know what they are). Therefore, if you put comments in it, they might go away. The available keywords are: #MAILLIST "name" This creates a mailing list. All keywords after this until the next #MAILLIST define the attributes of the mailing list. #USER "name [@ {node|address}[, region[, country]]]" This gives the routing information for a subscriber to the mailing list. (In the same format as you would address a message to the user manually.) Each subscriber has a #USER entry. For example, the following entries might exist: #USER "Bob" #USER "Sally @ Another BBS" #USER "Jane @ bbs.sea" #USER "Fred @ Yet another BBS, Somewhere" #MAYSUBSCRIBE maysub This sets whether users may subscribe to the mailing list. The default is 0: they may not subscribe. If users may not subscribe, then this file has to be edited manually to add users to the list. #MAYTELL maytell This sets Citadel may give out information about the mailing list when requested by a user. The default is 1: Citadel may tell about it. #MAYLIST maylist This sets whether the membership of the mailing list is private or not. (That is, whether it may be listed when requested by a user.) The default is 1: the membership is not private. #INFOLINE "infoline" This gives an optional one-line description of the mailing list. This is returned to users requesting information about the mailing list if #MAYTELL is set to 1. #INFOFILE "full path" This gives an optional text file description of the mailing list. This should be the full path to the file. This file is displayed in response to users requesting information about the mailing list if #MAYTELL is set to 1. _Section V: Citadel Script Files The internal script language in Citadel adds a high degree of customizability to the software. With it, you can create new commands or applications for your BBS. However, like any programming language, learning the script language and putting it to use can be difficult. It is not a problem if you don't understand the script language: it is not required to use Citadel. In fact, most sysops never use the script language at all. Overview Scripts files are ASCII files (like CONFIG.CIT) that contain commands that Citadel recognizes and acts upon. Some sample scripts are included with Citadel. These can be used on your system as-is to take advantage of the features they offer, but they are intended to be used as example code to help you understand the script language better. Citadel reads script files into memory one line at a time. When it reads a line, Citadel first removes any leading spaces from it. If the first character after all spaces is a "#", Citadel considers the line to be a script command. Otherwise, it ignores the line and reads the next line from the file. Therefore, any line not starting with a "#" (after stripping of leading spaces) is effectively a comment. The lines that do start with a "#" character are parsed and stored in memory. If Citadel is not able to parse the line, then it displays and error, and aborts out of the script interpreter. After all lines of a script file are read, Citadel begins executing the script. Therefore, the only disk access is at the start of execution. The rest of the processing is done in memory, and is fairly quick. Beyond memory that Citadel allocates for the script interpreter's use, the amount of memory used by a script file is usually not much. By watching the display of the System Status Screen (Press F4 while running Citadel to see this screen), you can determine how much memory your script file takes. All script commands are contained in functions. Citadel initiates execution of a script file by calling the _Main function. When this function returns, Citadel releases the memory used by the script and continues with what it was doing before it loaded the script. If this is the only executing script (that is, it was not called by another script), then it also releases the memory used by the interpreter unless #FASTSCRIPT in CONFIG.CIT is set to 1. Results from functions or script commands that generate results are available in the special variable _Result. Use this variable quickly if you need it; the next command or function will probably overwrite it. To be safe, don't use _Result as a parameter to a command that generates a _Result; the results may be unpredictable, and may change in future versions of Citadel. It is safe to use _Result in an #ASGN, #IF, #LOOP, #WHILE, #IFNOT, #LOOPNOT, or #WHILENOT command. In the interest of speed, there is very little run-time checking to ensure that the script does not overwrite memory that it does not own, or that enough parameters are passed to functions. When writing a script, it is best to do it on a test system, to ensure that you don't corrupt your main board. Be especially sure to test any script thoroughly before releasing it to other sysops. How script files are called Script files can be called in one of three ways: with the .Sysop Run script (.SR) command, with the COMMAND cron type, or as an application. Because applications can be tied to many things (see the Applications topic in the User's Guide section), script files can be used many places within Citadel. Variables Script variables can be either local or global. Local variables can only be accessed in the function that they are declared in. Global variables are available to all functions, so they are good for storing global configuration information that many functions might need to access. A warning about local variables: they are all static. This means that you shouldn't make functions recursive, unless you take care not to have variable conflicts. (Actually, you also shouldn't make functions recursive because doing so will cause loops to act strangely.) Local variables are declared with the #LVAR script command, and global variables are declared with the #GVAR script command. After the command, Citadel expects a variable type followed by the variable's name. The type can be Boolean, Integer, UInteger, Long, ULong, or String[length] . Boolean variables can hold a value of TRUE or FALSE; Integer variables can hold an integer in the range of -36,768 to 36,767; UInteger variables can hold an integer value in the range of 0 to 65,535; Long variables can hold an integer value in the range of -2,147,483,648 to 2,147,483,647; ULong variables can hold an integer value in the range of 0 to 4,294,967,295; and String variables can store a string of characters of some length. String variables need a length, so Citadel knows how much memory to set aside for holding the string. Most strings in Citadel can be held in 30 characters, so String30 is a common length. The minimum allowed is String1 and the maximum allowed is String255. There are no floating point variables in script files (or anywhere else in Citadel). All variables must start with the underscore character ("_") and may contain any ASCII characters other than white space (space, tab, linefeed, etc.). They are not case sensitive. For example, the following lines in a script file would define a local Integer variable named _Total and a global String variable that can hold up to 30 characters named _Name: #LVAR Integer _Total #GVAR String30 _Name It does not matter where global variables are declared, and the only restriction placed on the declaration of local variables is that they must be declared in a function definition, so Citadel knows which function owns the variable. They can be used before they are declared, because Citadel sets aside space for the variables when it loads the script: by the time it is running, all variables that will ever exist already exist. When using variables, Citadel automatically converts their type as appropriate for how you are using them. For example, if you assign an Integer variable with the value 30 to a String variable, the string will contain the text "30". Similarly, if you assign a String variable containing the text "130" to an Integer variable, then the Integer variable will contain the value 130. Functions Script functions have a name, can take parameters, and return a value. Like variables, all functions defined in a script file must begin with the underscore ("_") character. They may take up to five parameters, passed either by value or by reference. The type of value returned can be any of the types allowed for variables, or an additional type Void which means that it returns no value. The return value is placed in the _Result variable. Functions are declared with the #FUNC script command. This is followed by the function name, its return type, then any parameters the function uses, the type followed by the name. Parameters are passed by value by default. If you wish to pass parameters by reference, append a _R to the end of the parameter's type. For example, the following line in a script file would declare a function _Myfunc that returns an integer, and takes a long value passed by value named _Param1 and a Boolean value passed by reference named _Param2: #FUNC _MyFunc Integer Long _Param1 Boolean_R _Param2 When calling a function that takes a parameter by reference, you must call it with a variable: trying to pass it an immediate value will generate a run-time error, as Citadel cannot pass these by reference (as there is no variable to reference). Return from functions using the #RET script command, followed by the value to return. If the function has no return value (that is, it was declared as Void), use "#RET Void" to return from the function. Though it is not required, you may end a function's definition using the #ENDFUNC type. It is not required because Citadel ends a function automatically at the end of the file, or when it finds a new function defined with the #FUNC command. It just looks cleaner to have the end defined. In addition to functions that are be defined in a script file, Citadel provides many internal functions that allow script files to get and set Citadel's settings, communicate with the user, manipulate files, etc. These functions don't start with an underscore ("_") character, and never take parameters by reference. They are detailed later in the "Citadel internal functions" topic. Script keywords The following is an alphabetical list of all the keywords used in the script files, and what they do: #ASGN _variable value This is used to assign a value to a variable. _variable is any user-defined variable that is in scope. value is any value you wish to assign to it, either an immediate value or another variable. Citadel automatically casts value to _variable's type. This means, for example, that you can assign an integer variable to a string variable; Citadel internally converts the integer variable to a base 10 string representation of the variable and assigns that value to the string. #ADD value1 value2 [value3 ...] This adds all the values together and assigns the sum to _Result. All the values are interpreted as longs, and the result is given as a long. #AND value1 value2 [value3...] This performs a Boolean AND on all specified values (interpreted as Boolean values) and assigns the result to _Result. A Boolean AND returns TRUE if all parameters are TRUE; it returns FALSE if any one of the parameters are FALSE. #CALL function [param1 ...] This calls a function, which can be either a function defined in the script file or a Citadel internal function. If the function takes parameters, they should be placed after the function's name. #CHAIN script This executes the script specified by the string value script. When the other script returns, execution ceases in the current script. #DIV value1 value2 [value3 ...] This divides value1 by value2, and divides the quotient by value3 if it exists, then divides that quotient by value4 if it exists, etc. All values are interpreted as longs, and the resulting quotient is assigned to _Result as a long. #DO This begins a #DO... #LOOP or #DO...#LOOPNOT loop. The #DO is just a place holder, and does no processing by itself. When the associated #LOOP or #LOOPNOT command is encountered, Citadel returns to this #DO command if it is appropriate; see #LOOP and #LOOPNOT. #ELSE This begins an #ELSE block of an #IF... #ELSE... #ENDIF or #IFNOT...#ELSE...#ENDIF command block. Any commands from this #ELSE to the #ENDIF are executed if the #IF expression evaluates to FALSE or the #IFNOT expression evaluated to TRUE; see #IF and #IFNOT. #ENDFUNC This command ends a function definition. As explained in the "Functions" section, this is not required, it just looks neater. #ENDIF This ends an #IF... #ELSE... #ENDIF or #IFNOT...#ELSE...#ENDIF command block. Processing continues after this command as normal. #EQ value1 value2 This tests value1 for equality with value2. At least one of the two values must be a variable expression, so Citadel knows what type to evaluate them as. (Besides, comparing two constants is just silly.) If both values are variables, Citadel evaluates them both as the type of the first variable. This command assigns _Result a Boolean value of TRUE (if the values are equal) or FALSE (if they are not). #EXIT result This exits the script immediately and returns control to Citadel. result is evaluated as a Boolean value and is passed back to Citadel. Citadel only looks at this value if it was called as a #DO COMMAND cron type; if result is TRUE, then Citadel considers the event to be a success, else it considers it a failure. #FUNC _name rettype [type1 _name1... type5 _name5] This marks the beginning of a function definition. The function's name is given by _name, and must start with an underscore ("_") character. rettype must be Boolean, Integer, UInteger, Long, ULong, String[length], or VOID. The function can take up to five parameters. Any parameters must have a type and a name, which must start with the underscore ("_") character. Parameters are passed by value by default; to pass them by reference, append a _R to their type. (For example, Integer_R will pass an Integer type by reference.) #GE value1 value2 This tests if value1 is greater than or equal to value2. At least one of the two values must be a variable expression, so Citadel knows what type to evaluate them as. (Besides, comparing two constants is just silly.) If both values are variables, Citadel evaluates them both as the type of the first variable. This command assigns _Result a Boolean value of TRUE (if value1 is greater than or equal to value2) or FALSE (if it is not). #GOTO label This transfers control to the #LABEL command corresponding to label. This jump cannot be between functions. #GT value1 value2 This tests if value1 is greater than value2. At least one of the two values must be a variable expression, so Citadel knows what type to evaluate them as. (Besides, comparing two constants is just silly.) If both values are variables, Citadel evaluates them both as the type of the first variable. This command assigns _Result a Boolean value of TRUE (if value1 is greater than value2) or FALSE (if it is not). #GVAR type _name This creates a global variable called _name of type type. _name must start with an underscore character ("_") and type must be one of: Boolean, Integer, UInteger, Long, ULong, or String[length]. Global variables can be accessed anywhere in the script file. #IF expression This initiates an #IF... #ELSE... #ENDIF command block. expression is interpreted as a Boolean value. If it is TRUE, then execution starts at the command following the #IF and continues until an #ELSE or #ENDIF is found. If expression is FALSE, then execution starts at the command following an #ELSE or #ENDIF. #IFNOT expression This initiates an #IFNOT... #ELSE... #ENDIF command block. expression is interpreted as a Boolean value. If it is FALSE, then execution starts at the command following the #IFNOT and continues until an #ELSE or #ENDIF is found. If expression is TRUE, then execution starts at the command following an #ELSE or #ENDIF. #LABEL label This is a place holder for the #GOTO command. It is named label, which is that same label to give the #GOTO command to jump to this location; see #GOTO. #LOOP expression This ends a #DO... #LOOP loop. expression is evaluated as a Boolean value. If it is TRUE, then execution loops back to the #DO that started the loop. If it is FALSE, then execution passes to the command following the #LOOP command. #LOOPNOT expression This ends a #DO... #LOOPNOT loop. expression is evaluated as a Boolean value. If it is FALSE, then execution loops back to the #DO that started the loop. If it is TRUE, then execution passes to the command following the #LOOPNOT command. #LE value1 value2 This tests if value1 is less than or equal to value2. At least one of the two values must be a variable expression, so Citadel knows what type to evaluate them as. (Besides, comparing two constants is just silly.) If both values are variables, Citadel evaluates them both as the type of the first variable. This command assigns _Result a Boolean value of TRUE (if value1 is less than or equal to value2) or FALSE (if it is not). #LT value1 value2 This tests if value1 is less than value2. At least one of the two values must be a variable expression, so Citadel knows what type to evaluate them as. (Besides, comparing two constants is just silly.) If both values are variables, Citadel evaluates them both as the type of the first variable. This command assigns _Result a Boolean value of TRUE (if value1 is less than value2) or FALSE (if it is not). #LVAR type _name This creates a local variable called _name of type type. _name must start with an underscore character ("_") and type must be one of: Boolean, Integer, UInteger, Long, ULong, or String[length]. Local variables can only be accessed in the function that they are defined in. #MOD value1 value2 [value3 ...] This divides value1 by value2, and divides the remainder by value3 if it exists, then divides that remainder by value4 if it exists, etc. All values are interpreted as longs, and the resulting remainder is given as a long. #MUL value1 value2 [value3 ...] This multiplies all the values together and assigns the product to _Result. All the values are interpreted as longs, and the result is a long. #NE value1 value2 This tests value1 for inequality with value2. At least one of the two values must be a variable expression, so Citadel knows what type to evaluate them as. (Besides, comparing two constants is just silly.) If both values are variables, Citadel evaluates them both as the type of the first variable. This command assigns _Result a Boolean value of TRUE (if the values are not equal) or FALSE (if they are). #OR value1 value2 [value3...] This performs a Boolean OR on all specified values (interpreted as Boolean values) and assigns the result to _Result. A Boolean OR returns TRUE if any one the parameters is TRUE; it returns FALSE if all parameters are FALSE. #RET [value] This returns from a function. If the function has a return type, value gives the value to return, and is evaluated as the type that the function is defined to return. If the function does not have a return type, use Void as value. #RUN script This executes the script script. When the other script returns, execution continues in the current script with the next instruction. #STR code string1 [string2 ...] The action of this command depends on code, which can be one of the following: B Return the sub-string of string1 starting at character position string2 (interpreted as an integer, not a string) and going for string3 (interpreted as an integer, not a string) characters. U Return string1 as all upper case. L Return string2 as all lower case. C Concatenate all strings. S Return the size allocated to string1. E Return the length of string1. PR Pad string1 to string2 (interpreted as an integer, not a string) characters with spaces on the right. PL Pad string1 to string2 (interpreted as an integer, not a string) characters with spaces on the left. #SUB value1 value2 [value3 ...] This subtracts value2 from value1, then subtracts value3 from the difference if it exists, then subtracts value4 from that difference if it exists, etc. All values are interpreted as longs, and the resulting difference is given as a long. #VERSION version This checks the version of Citadel that is running. If version specifies a version newer than the running version, then Citadel will not execute the script. This is checked at load-time, so it does not matter where #VERSION is placed in the file: if it is found, then the script will never begin execution. version is a numeric representation of the version of Citadel that is running generating by multiplying the version number and 1000 then adding the compile number. #WEND This ends a #WHILE... #WEND or #WHILENOT...#WEND loop. If the expression given in the #WHILE command is TRUE or the #WHILENOT command is FALSE, command execution returns to the command after the #WHILE or #WHILENOT command, else it continues with the command after the #WEND. #WHILE expression This begins a #WHILE... #WEND loop. If expression evaluates to be TRUE, command execution continues to the command after the #WHILE command. If it is FALSE, then command execution jumps to the command after the #WEND command. #WHILENOT expression This begins a #WHILENOT... #WEND loop. If expression evaluates to be FALSE, command execution continues to the command after the #WHILENOT command. If it is TRUE, then command execution jumps to the command after the #WEND command. #XOR value1 value2 [value3...] This performs a Boolean XOR on all specified values (interpreted as Booleans) and assigns the result to _Result. A Boolean XOR returns TRUE if one and only one the parameters is TRUE; it returns FALSE if either no parameter is TRUE or if more than one parameter is TRUE. Debugging The script interpreter provides a source-level debugger with integrated profiler. To run a script with the debugger active, append an asterisk to the end of the file name when giving Citadel the name of the script to execute. You may also activate the debugger on a currently running script by placing Citadel in debug mode (this can be done almost any time when Citadel is running by using the Alt+D keystroke). Note that Citadel has to be placed into debug mode while the script is running; if Citadel is already in debug mode when the script starts, it will not load the debugger. If you want to start using the debugger in this case press Alt+D twice, to turn it off and then back on. When the debugger first starts, it gives you the main debugger message window. Citadel places all debugging messages into this window. (It uses a window so it does not interfere with the output of the script, in the main TTY window.) The debugger has two other windows that it can display if you tell it to: a watch window (which keeps track of the values of any variables you tell it to) and a source window (which displays your script file, and tells which line is currently being executed). Like all of Citadel's windowing functions, you can tell if a window has focus (that is, will receive any keyboard commands you provide) by looking at its border: if there is a double line, then it has focus. If there is no window with a double line, and the cursor is visible in the TTY window, then no window has focus, and all keyboard commands will be sent to the TTY window. To switch between TTY and window modes, use Ctrl+F2 (or just click in the desired area with the mouse, if you have one). This is important with the script debugger because you must make sure that a debugger window has the input focus before you try to use a debugger command, else the keystrokes will be sent to the script for processing. Before it executes a command, the debugger displays the line number in its main window. Once it has executed the command, it displays how many milliseconds it took, the total time it has spent on that command while executing the script, the total number of times the command has been executed, and the average time it has spent executing that command. While any of the three debugging windows has the input focus, any of the following command keys are active: space Single-step. If the script is currently paused, this will execute a single instruction and then pause the script again. B Breakpoint. You will be prompted for a line number. If there is currently a breakpoint set on that line, it will be cleared. If there is not a breakpoint set on that line, it will be added. When the script interpreter reaches a breakpoint, it pauses script execution, so you are able to examine the current state of the script. Breakpoints are identified in the source code window by using a different color to display the line number. E Examine. This lets you examine the value of any variable. You are prompted for the name of the variable, then the debugger displays the value in the message window. P Pause. This pauses the currently running script. Q Quit. This quits the debugger, leaving the script to continue normally. S Source. This opens a source window. The current execution line is displayed in a different color than the other lines. Line numbers are also given for each line; lines with breakpoints set are in a different color. If the script is paused, you may use the Cursor Up and Cursor Down keys to scroll through the source, or the Cursor Home key to bring the current execution line into the window. U Un-pause. This resumes the execution of a currently paused script. W Watch. This prompts for a variable, then adds it to the watch window (if it is not already in it), or removes it (if it is). If this is the first variable added to the watch window, then the window is created. If this is the last variable removed from the watch window, then the window is destroyed. X Exit. This quits the debugger, and aborts the script's execution. Use this if you see that your script has worked itself into an endless loop, or otherwise is not functioning properly. Citadel internal functions by name The following internal functions are currently available. More will be added in subsequent versions of Citadel. AddCommasToNumber number This adds commas as thousands separators to number. number is evaluated as a long and the result is given as a string. If the current user has show commas turned off in .Enter Configuration (.EC), then this has no effect. AddDupCheck string This adds the string specified by the string value string to the duplicate checking data. This function returns a Boolean value: TRUE if it was successful; FALSE if not (which means Citadel is out of memory). To use the duplicate checking functions, start by calling StartDupCheck, which initializes the checking data structures. Then add strings with AddDupCheck. Use CheckForDup to see if a string has been added. When you are finished, call StopDupCheck to free up the memory used by the duplicate checking. AddNetIDToNetIDCit netid comment This adds a Net ID to NETID.CIT. netid is a string value specifying the Net ID to add. comment is a string value specifying the comment to give the Net ID. This returns a Boolean value: TRUE if the Net ID could be added to NETID.CIT; FALSE if not. AddUser username groupname This adds a user to a group. username is a string expression giving the user's name and groupname is a string expression giving the group's name. AddWatch variable This sets a watch of variable variable in the script debugger. This can be tricky: you cannot merely use: #CALL AddWatch _Variable To add a watch of _Variable, because the value of _Variable will be used. The trick is to use the sub-string command, like this: #STR B x_Variable 1 99 #CALL AddWatch _Result This makes the value of _Result be "_Variable" which is then passed to AddWatch. This function returns a Boolean value: TRUE if the watch could be added, or FALSE if it could not (either because Citadel is out of memory or because the script debugger is not currently active; see SetDebugScript). AppendToNetCommandReply string1 [string2...] This adds text to the network command reply message. This function is only valid in scripts called in response to a network command, as set by #NETCOMMAND in EXTERNAL.CIT; if used in any other script, it has no effect. This appends all specified string values to the message, with no space in between, so be sure to include any spaces or new lines that you wish to have in the reply message. ASCIIToChar asciivalue This converts an integer to a character having that ASCII value. asciivalue is the integer to convert, and the result is given as a single character long string. AskYN prompt default This prompts the user to answer a Yes/No (and sometimes Abort) question. prompt is a string expression giving the question (without a "?" following it; that is added by AskYN). default is an integer expression that takes the following form: 0 Yes/No; Default no 1 Yes/No; Default yes 2 Yes/No/Abort; Default abort 3 Yes/No/Abort; Default no 4 Yes/No/Abort; Default yes This function returns an integer result: 0 for No; 1 for Yes; and 2 for Abort. ChangeDir pathname This changes the current directory (and drive) to that given by pathname. If pathname is omitted, this changes to #HOMEPATH as set in CONFIG.CIT. CharToASCII charvalue This converts the first character of the string given by charvalue to its ASCII value, and returns that as an Integer. Chat This function enters into chat mode. No checking is done whether chat is on or off or if the current user has chat disabled. ChatReq ring internalchat This rings the chat bell, even if chat is disabled for the entire system or the current user. ring is a Boolean expression that is TRUE to ring the bell (if bells are enabled) or FALSE to not ring the bell (even if bells are enabled). internalchat is a Boolean expression that is TRUE to enter internal chat mode if the sysop responds to the page, and FALSE to not enter internal chat mode if the sysop responds to the page. This function returns a Boolean result: FALSE if the sysop does not respond, TRUE if the sysop does respond. CheckForDup string This checks the string specified by the string value string to see if it has been added to the duplicate checking data with AddDupCheck. This function returns a Boolean value: TRUE if string is a duplicate (that is, it has been added with AddDupCheck); FALSE if not. To use the duplicate checking functions, start by calling StartDupCheck, which initializes the checking data structures. Then add strings with AddDupCheck. Use CheckForDup to see if a string has been added. When you are finished, call StopDupCheck to free up the memory used by the duplicate checking. CheckUserOutControl pause Calling this lets the user use the Jump (J), Next (N), Stop (S), and Pause (P), commands. If your script is displaying text, then you don't need to call this, as the text output functions handle this for you. pause is a Boolean value: TRUE if you want Citadel to pause for the user (and display the more prompt), or FALSE if you just want it to check for user input. It is a good idea to place this in a loop where the script may be busy for a while but not display anything to the user, so the user can abort out of the loop. Use the IsCanOutput function afterwards to see if the user has tried to abort the loop: it will return FALSE if Stop was pressed. ClearBreakPoint lineno This clears the breakpoint at lineno in the script debugger. This function returns a Boolean value: TRUE if the breakpoint could be cleared; FALSE if it could not (it either was not set, or the script debugger was not active; see SetDebugScript). CloseFile filenumber This closes a file opened by the script file. filenumber is an integer value representing which file to close. CountDirectory This counts the number of files in the last loaded directory and returns the value as an Integer. See GetDirectory. DebuggingMsg message This outputs a message given by the string value message to the main debugging window if the script debugger is active. If it is not active, then this does nothing. DecToHex number [digits] This converts number to a string representation of the number in hexadecimal (base 16) using capital letters A-Z. The optional parameter digits is interpreted as an integer and gives the minimum number of digits to have in the hexadecimal string; if there are fewer digits than specified, then the string is padded on the left with zeros. DeleteFile filename This deletes the file specified by the string value filename. This function returns a Boolean value: TRUE if the file was deleted; FALSE if it was not (most likely because the file didn't exist). Dial phonenum timeout This dials the phone number given by phonenum and waits for a connection. The user may abort the dial by pressing a key. If no carrier is detected within timeout seconds, the dial is aborted. Note: phonenum can be more than just the phone number. This is appended to #DIAL_PREF as set in CONFIG.CIT, and output to the modem, followed by a carriage return (ASCII 13). So, assuming a Hayes-compatible modem, if #DIAL_PREF is set to just "AT", then phonenum has to include a "D" in addition to the phone number. See your modem manual for more information on modem commands. DirectoryGetName index This gets the name of the file in position index (starting at 1) in the last directory read by GetDirectory and returns it as a string value. DirectoryGetSize index This gets the size of the file in position index (starting at 1) in the last directory read by GetDirectory and returns it as a long value. DirectoryGetTime index This gets the time and date of the file in position index (starting at 1) in the last directory read by GetDirectory and returns it as a long value. DiskFree drive This function checks the free disk space on a specified drive and returns it as a long. drive is a string expression, the first character of which is interpreted as the disk to check. Use @ to check the default drive. DoCCR This sends a CR/LF to the console, but not the modem. DoChat This rings the chat bell only if chat is turned on for the system and the current user. ring is a Boolean expression that is TRUE to ring the bell (if bells are enabled) or FALSE to not ring the bell (even if bells are enabled). internalchat is a Boolean expression that is TRUE to enter internal chat mode if the sysop responds to the page, and FALSE to not enter internal chat mode if the sysop responds to the page. This function returns a Boolean result: FALSE if the sysop does not respond, TRUE if the sysop does respond. DoCR This sends a CR/LF to the console and modem. DoNetwork node This tells Citadel to network with the node specified (either by name or by address) by the string value node. This returns a Boolean value: TRUE if the network was successful, or FALSE if it failed for any reason. DumpDirectory This releases the memory used by the last GetDirectory function. DumpF filename format This dumps the file specified by filename to the user. format is a Boolean value that tells Citadel if it should apply its screen formatting to the file. DumpFC filename format This dumps the file specified by filename to the console only. format is a Boolean value that tells Citadel if it should apply its screen formatting to the file. ExitCitadel resultcode This exits Citadel. Execution of the script stops when this function is called. (Since Citadel itself exits, of course.) resultcode is an integer value that sets the return code of Citadel, which can be accessed by the ERRORLEVEL variable in MS- DOS batch files. FileEOF filenumber This tests the file referenced by filenumber to see if its end has been reached. This returns a Boolean value: TRUE if the end of the file has been reached; FALSE if not. FileExists filename This tests whether the file specified by filename exists on disk. This returns a Boolean value: TRUE if the file exists; FALSE if not. FindHallByName name [partial] This searches for a hall with the name name. The optional partial is a Boolean value which specifies that the search should include partial hall names. If TRUE, then partial names are included; if FALSE or not present, then only full matches are accepted. If the search is successful, then the hall index is returned as an integer value; if it is unsuccessful, then the value -1 is returned. FindNodeByName name This searches for a node with the name name. name can be either the address or full name of the node (no partial searches are allowed). If the search is successful, then the log table slot of the node is returned as an integer value; if unsuccessful, then the value -1 is returned. FindRoomByName roomname partial This finds the room index of a room when given a name to search for. roomname is a string value giving the name of the room to search for and partial is a Boolean value: TRUE if partial matches are acceptable; FALSE if an exact match is desired. The room index is returned as an integer value. If no match is found, the return value is -1 (an invalid room index). FindRoomByNetID netid network This finds the room index of a room when given a Net ID to search for. netid is a string value giving the Net ID to search for. network is a Boolean value: TRUE if the room must be networked to be considered a match; FALSE if not. The room index is returned as an integer value. If no match is found, the return value is -1 (an invalid room index). FindUserByName username partial This finds the log table index of a user when given a name to search for. username is a string value giving the name of the user to search for and partial is a Boolean value: TRUE if partial matches are acceptable; FALSE if an exact match is desired. The user's position in the log table is returned as an Integer value. If no match is found, the return value is -1 (an invalid room index). Note that users move around in the log table whenever a user logs in, so you cannot rely on a user always occupying the same location in the log table. Also, the position in the log table does not correspond to the position in the log file (which does stay constant): use GetLTLogSlot to find the position in the log file based on position in the log table. GetAccounting This checks to see if accounting is enabled for the system. This function returns a Boolean value: TRUE if accounting is enabled for the system, FALSE if it is not. GetAideChatHour hour This checks to see if the .Aide Chat (.AC) command is enabled for a specific hour. hour is an integer value from 0 to 23 representing the hour to check. This function returns a Boolean value: TRUE if .Aide Chat is allowed for the hour specified, FALSE if it is not. GetAideHall This checks to see if aides who are not sysops are allowed to use the .Aide Hall (.AH) and .Aide Window (.AW) commands, as specified by the #AIDEHALL CONFIG.CIT keyword. This function returns a Boolean value: TRUE if the commands are allowed for aides who are not sysops, and FALSE if the are not. GetAideModerate This checks to see if aides who are not sysops are allowed to moderate moderated rooms as set by the #MODERATE CONFIG.CIT keyword. This function returns a Boolean value: TRUE if aides who are not sysops are allowed to moderate moderated rooms, FALSE if they are not. GetAlias This function gets the current node's alias. It is returned as a string value. GetAnonAuthor This function gets the #ANONAUTHOR as set in CONFIG.CIT. It is returned as a string value. GetApplPath This function gets the #APPLICATIONS path as set in CONFIG.CIT. It is returned as a string value. GetAttr This function gets the console default attribute as set by #ATTR in CONFIG.CIT. It is returned as an integer value. GetAutoANSI This function returns the current setting of #AUTOANSI in CONFIG.CIT. It is returned as an integer value. GetBAttr This function gets the console's border attribute as set by #BATTR in CONFIG.CIT. It is returned as an integer value. GetBells This function returns the current state of bells on the system as an integer value. The possible values are: 0 Bells on 1 Bells are on for the chat page only 2 Bells are never on. GetBIOS This function returns whether BIOS is being used to display screen output as set by #BIOS in CONFIG.CIT. This function returns a Boolean value: TRUE if BIOS is being used for screen output, FALSE if it is not. GetBorder number This function returns a border, as set by the .Enter Border (.EB) command. number is an integer value specifying which border to get. The border is returned as a string value. See GetMaxBorders for the limit of number. GetCallNo This function returns the current call number to the system. It is returned as a long. GetCAttr This function returns the attribute used in chat mode, as set by #CATTR in CONFIG.CIT. The value is returned as an integer. GetChatOn This function returns whether chat is on for the system or not. This function returns a Boolean value: TRUE if chat is on; FALSE if it is not. GetCheckCTS This functions returns whether CTS is being checked when sending characters to the modem, as set by #CHECKCTS in CONFIG.CIT. This function returns a Boolean value: TRUE if CTS is being checked; FALSE if it is not. GetCit86Country This returns #CIT86COUNTRY as set in CONFIG.CIT. GetCit86Domain This returns #CIT86DOMAIN as set in CONFIG.CIT. GetColors This function checks to see if colors are allowed everywhere on the system, as set by #TWIT_FEATURES COLORS in CONFIG.CIT. This function returns a Boolean value: TRUE if colors are allowed everywhere; FALSE if they are not. GetCommentOfNetIDInNetIDCit netid This gets the comment of a Net ID from NETID.CIT. netid is a string value giving the Net ID to find the comment of. This function returns a string value: the comment of the Net ID. GetConnectRate This function checks the current connect rate between the modems. The rate is returned as a long, from 300 to 115,200. GetConnectWait This function checks if Citadel waits after a connection is made before sending data to the modem, as set by #CONNECTWAIT in CONFIG.CIT. This function returns an integer value: the number of seconds to wait. GetContextSensitiveText This returns text, which may be different depending on when it is called. Currently, the only possible thing to be returned is the last string the user entered in small chat. Use it in conjunction with #EVENT SMALLCHAT. GetCountBeep This function checks to see if Citadel beeps when doing a countdown timer until hanging up, as set by #COUNTBEEP in CONFIG.CIT. This function returns a Boolean value: TRUE if Citadel beeps while counting down and FALSE if it does not. GetCreditNym This function returns the name of a single credit on the system, as set by #CREDIT_NYM in CONFIG.CIT. The name is returned as a string value. GetCreditsNym This function returns the name of credits on the system, as set by #CREDIT_NYM in CONFIG.CIT. The name is returned as a string value. GetCurrentTime This gets the current time and returns the value as a long. This value is the number of seconds since 12:00AM, January 1, 1970, GMT. (This is how Citadel stores time.) GetDebugSystem This function returns whether Citadel is in debug mode as a Boolean value: TRUE if debug mode is active; FALSE if not. GetDefDateStamp This function returns the date stamp for unlogged- in users. It is returned as a string value. GetDefNetPrefix This function returns the net prefix for unlogged- in users. It is returned as a string value. GetDefRPrompt This function returns the room prompt for unlogged- in users. It is returned as a string value. GetDefVDateStamp This function returns the verbose date stamp for unlogged-in users. It is returned as a string value. GetDialMacro index This function returns the string used for a dial out mode keyboard macro. index gives the key to look up, as per the following table: index Function Key 1 - 12 F1 through F12 13 - 24 Alt+F1 through Alt+F12 25 - 36 Shift+F1 through Shift+F12 37 - 48 Control+F1 through Control+F12 The macro is returned as a string value. GetDialPref This returns the dialing prefix, as set by #DIAL_PREF in CONFIG.CIT. It is returned as a string value. GetDialRing This returns what is sent to the modem in response to a RING, as set by #DIALRING in CONFIG.CIT. It is returned as a string value. GetDialSetup This returns what is sent to the modem to set it up for dialing out, either when networking or when going into dial out mode. It is returned as a string value. GetDirectory path mask sortby reverse This reads an MS-DOS directory of files. path is a string value that gives the name of the subdirectory to load. If path is an empty string, then the current subdirectory is used. mask is a wildcard expression that specifies which files to load. UNIX-style wildcards are allowed here, not just DOS-style, so you can specify something like "[aeiou]*.*" to search for all files that start with a vowel. sortby is an integer value: 0 to not sort the directory; 1 to sort it by name; or 2 to sort it by date. reverse is a Boolean value: FALSE to sort from lowest to highest; TRUE to sort from highest to lowest. GetDirPath This returns what path is used as a default room path, as set by #DIRPATH in CONFIG.CIT. It is returned as a string value. GetDiskFree This returns the minimum amount of space Citadel is to try to keep free on disk, as set by #DISKFREE in CONFIG.CIT. It is returned as a long value. GetDLPath This returns what path is used for incoming Net 6.9 file transfers, as set by #DLPATH in CONFIG.CIT. It is returned as a string value. GetDownShift This returns what is sent to the modem when #DUMB_MODEM is set to 6 to go back on-line after going into command mode and switching speeds. It is returned as a string value. GetDumbModem This returns the #DUMB_MODEM value from CONFIG.CIT which determines how Citadel is to detect and deal with different modem speeds. It is returned as an integer value. GetEnterName This returns what the user is asked for when entering his name when first logging in, as set by #ENTER_NYM in CONFIG.CIT. This is returned as a string value. GetEnterOK This returns whether unlogged-in users are allowed to leave messages, as set by #ENTEROK in CONFIG.CIT. This is returned as a Boolean value: TRUE if unlogged-in users may enter messages, and FALSE if they may not. GetEnterSur This returns whether users may enter their own surname, as set in CONFIG.CIT. This is returned as a Boolean value: TRUE if users may enter their own surname, and FALSE if they may not. GetExpire This returns the current setting of #EXPIRE in CONFIG.CIT. This is returned as an integer. GetF6Pass This returns the current F6 password as set in CONFIG.CIT. It is returned as a string value. GetFileBufSize This returns the current size of the MSG.DAT file buffer as set in CONFIG.CIT. It is returned as an integer value. GetForceLogin This returns whether users are forced to log in when they first call, as set by #FORCELOGIN in CONFIG.CIT. It is returned as a Boolean value: TRUE if users are forced to log in, and FALSE if they are not. GetForwardSys This returns if mail to "Sysop" is forwarded to the user specified by #SYSOP in CONFIG.CIT. It is returned as a Boolean value: TRUE if mail is to be forwarded, and FALSE if it is not. GetFuelBarEmpty This returns the character used to draw the empty fuel bar when re-indexing MSG.DAT. This is returned as an integer value. GetFuelBarFull This returns the character used to draw the full fuel bar when re-indexing MSG.DAT. This is returned as an integer value. GetGrpDesc group This returns a group's description. group is an index specifying which group to extract the description from. This is returned as a string value. GetGrpName group This returns a group's name. group is an index specifying which group to extract the name from. This is returned as a string value. GetGrpSlot name This returns the index of the group named by name. This is returned as an integer value. A return value of -1 means that the named group does not exist. GetHallDesc hall This returns a hall's description. hall is an index specifying which hall to extract the description from. This is returned as a string value. GetHallGroup hall This returns a hall's group. hall is an index specifying which hall to get the group for. The group's index is returned as an integer. This returns a value even if the hall is not group- only; use IsHallGrp to check that the hall is group-only first. GetHallName hall This returns a hall's name. hall is an index specifying which hall to extract the name from. This is returned as a string value. GetHangUp This returns the string sent to hang up the modem, if #DUMB_MODEM 6 is in use. This is returned as a string value. GetHangupDelay This returns the amount of time to spend after dropping DTR to hang up the modem before raising it again, in seconds. This is returned as an integer value. If a 0 is returned, Citadel still waits a half second. GetHelpPath This returns the help path, as set by #HELPPATH in CONFIG.CIT. This is returned as a string value. GetHelpPath2 This returns the secondary help path, as set by #HELPPATH2 in CONFIG.CIT. This is returned as a string value. GetHomePath This returns Citadel's home path, as set by #HOMEPATH in CONFIG.CIT. This is returned as a string value. GetIdleTimeout This returns the idle time out, which is the number of minutes that Citadel will wait while idle before attempting to execute a Cron event. This is returned as an integer value. GetInitBaud This returns the speed that Citadel uses to initialize the modem. It is returned as an integer value, corresponding the following table: 0 300 baud 1 1,200 baud 2 2,400 baud 3 4,800 baud 4 9,600 baud 5 19,200 baud 6 38,400 baud 7 57,600 baud 8 115,200 baud GetLApplication This returns the path Citadel uses to look for applications, as set by #APPLICPATH in CONFIG.CIT. This is returned as a string value. GetLClosedSys This reports if the system is closed to new callers, as set by #LOGIN CLOSED_SYSTEM in CONFIG.CIT. This is returned as a Boolean value: TRUE if the system is closed and FALSE if it is not. GetLCreate This reports if new accounts are being accepted from remote, as set by #LOGIN NEW_ACCOUNTS in CONFIG.CIT. This is returned as a Boolean value: TRUE if new accounts are allowed, FALSE if they are not. GetLogExtDir This returns the directory for log extensions (LE_*.DAT files) as set by #LOGEXTDIR in CONFIG.CIT. This is returned as a string value. GetLQuestionnaire This reports if new users are asked for user information (name, phone number, etc.) when logging in, as set by #LOGIN QUESTIONS. This is returned as a Boolean value: TRUE if questions are asked, FALSE if no questions are asked. GetLSysMsg This reports if new users are required to send a message to the sysop, as set by #LOGIN SYSOP_MESSAGE in CONFIG.CIT. This is returned as a Boolean value: TRUE if a message to sysop is required, FALSE if it is not. GetLTAide index This returns whether a user is an aide or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user is an aide, and FALSE if not. GetLTAlias index This returns a user's alias. index is an integer value indexing a slot in the log table. This function returns the alias as a string value. GetLTCallNo index This returns a user's last call number. index is an integer value indexing a slot in the log table. This function returns the last call number as a long value. GetLTExpert index This returns whether a user has expert mode turned on or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has expert mode turned on, and FALSE if not. GetLTInHash index This returns a hash of the initials of a user. index is an integer value indexing a slot in the log table. This function returns the hash as an integer value. GetLTInuse index This returns whether a log slot is in use or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the slot is in use, and FALSE if not. GetLTLFMask index This returns whether a user has line feeds turned on or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has line feeds turned on, and FALSE if not. GetLTLogSlot index This returns a user's location in the log file. index is an integer value indexing a slot in the log table. This function returns the location in LOG.DAT as an integer value. GetLTName index This returns a user's name. index is an integer value indexing a slot in the log table. This function returns the name as a string value. GetLTNetUser index This returns whether a user has network privileges line or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has network privileges, and FALSE if not. GetLTNoAccount index This returns whether a user has accounting turned off or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has accounting turned off, and FALSE if not. GetLTNode index This returns whether a user is a node or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user is a node, and FALSE if not. GetLTNoMail index This returns whether a user has mail turned off or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has mail turned off, and FALSE if not. GetLTOldToo index This returns whether a user is set to read the last old message on a new messages request. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has last old on new turned on, and FALSE if not. GetLTPermanent index This returns whether a user has a permanent account or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has a permanent account, and FALSE if not. GetLTProblem index This returns whether a user is a problem user or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user is a problem user, and FALSE if not. GetLTPwHash index This returns a hash of the password of a user. index is an integer value indexing a slot in the log table. This function returns the hash as an integer value. GetLTRegion index This returns a user's region. This only makes since for users that are nodes. index is an integer value indexing a slot in the log table. This function returns the region as a string value. GetLTRoomTell index This returns whether a user has room descriptions turned on or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has room descriptions turned on, and FALSE if not. GetLTSysop index This returns whether a user is a sysop or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user is a sysop, and FALSE if not. GetLTTabs index This returns whether a user has tabs turned on or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has tabs turned on, and FALSE if not. GetLTUCMask index This returns whether a user has uppercase only turned on or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has uppercase only turned on, and FALSE if not. GetLTUnlisted index This returns whether a user has an unlisted account or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user has an unlisted account, and FALSE if not. GetLVerified index This returns whether a user is verified or not. index is an integer value indexing a slot in the log table. This function returns a Boolean value: TRUE if the user is verified, and FALSE if not. GetMaxBorders This returns the maximum number of borders allowed, as set by #MAXBORDERS in CONFIG.CIT. This is returned as an integer value. GetMaxFiles This returns the maximum number of files allowed, as set by #MAXFILES in CONFIG.CIT. This is returned as an integer value. GetMaxGroups This returns the maximum number of groups allowed, as set by #MAXGROUPS in CONFIG.CIT. This is returned as an integer value. GetMaxHalls This returns the maximum number of halls allowed, as set by #MAXHALLS in CONFIG.CIT. This is returned as an integer value. GetMaxJumpback This returns the maximum number of Jumpbacks allowed, as set by #MAXJUMPBACK in CONFIG.CIT. This is returned as an integer value. GetMaxLogTab This returns the maximum number of log entries allowed, as set by #MAXLOGTAB in CONFIG.CIT. This is returned as an integer value. GetMaxPoop This returns the poopcount of the current poopuser. This is returned as a long value. GetMaxRooms This returns the maximum number of rooms allowed, as set by #MAXROOMS in CONFIG.CIT. This is returned as an integer value. GetMCIDate This returns the string sent in response to ^AT if MCI is turned off. This is returned as a string value. GetMCIFirstName This returns the string sent in response to ^An if MCI is turned off. This is returned as a string value. GetMCIName This returns the string sent in response to ^AN if MCI is turned off. This is returned as a string value. GetMCIOn This returns whether MCI is turned on with #TWIT_FEATURES MCI or not. This is returned as a Boolean value: TRUE if MCI is on, FALSE if it is not. GetMCIPoop This returns the string sent in response to ^AP if MCI is turned off. This is returned as a string value. GetMCITime This returns the string sent in response to ^At if MCI is turned off. This is returned as a string value. GetMData This returns the serial port that the modem is attached to. This is returned as an integer value ranging from 1 to 4. GetMessageK This returns the size of the message base as set by #MESSAGEK in CONFIG.CIT. This is returned as a long value. GetMessageRoom This returns the maximum number of messages allowed in a single room per call for users who are not aides or sysops. This is returned as an integer value. GetMinBaud This returns the minimum baud rate that allowed to connect with the board. This is returned as an integer value as per the following table: 0 300 baud 1 1,200 baud 2 2,400 baud 3 4,800 baud 4 7,200 baud 5 9,600 baud 6 12,000 baud 7 14,400 baud 8 16,800 baud 9 19,200 baud 10 38,400 baud 11 57,600 baud 12 115,200 baud 13 230,400 baud GetModemString [length] This gets a string from the modem. The optional integer value length specifies the number of characters to retrieve. If it is not specified, 255 is used. This returns when a CR (ASCII 13) or LF (ASCII 10) is received. If more than length characters are received, the console user presses a key, or more than three seconds pass, then this returns an empty string. GetModSetup This returns the string sent to the modem to initialize it as set by #MODSETUP in CONFIG.CIT. This is returned as a string value. GetModUnsetup This returns the string sent to the modem to deinitialize it as set by #MODUNSETUP in CONFIG.CIT. This is returned as string value. GetMorePrompt This returns the string sent to the screen when pausing, either because of full screen pause or between messages if pause between messages is turned on. This is returned as a string value. GetMsgCompress This returns whether the message base is being compressed by Citadel or not. This is returned as a Boolean value: TRUE if Citadel is compressing the message base, FALSE if it is not. GetMsgNym This function returns the name of a single message on the system, as set by #MESSAGE_NYM in CONFIG.CIT or the .Aide Name messages (.AN) command. The name is returned as a string value. GetMsgPath This returns the path Citadel uses to store the message file, as set by #MSGPATH in CONFIG.CIT. This is returned as a string value. GetMsgsNym This function returns the name of a messages on the system, as set by #MESSAGE_NYM in CONFIG.CIT or the .Aide Name messages (.AN) command. The name is returned as a string value. GetMsgVerb This function returns verb used to describe saving messages, as set by #MESSAGE_NYM in CONFIG.CIT or the .Aide Name messages (.AN) command. The name is returned as a string value. GetMTOldest This returns the message number of the oldest message in the message table. This is returned as a long value. GetNetCommandText This function returns the text of the network command message as a string value. This is only valid in scripts called to process network commands as set in #NETCOMMAND in EXTERNAL.CIT: if used in any other script, this returns an empty string. This only retrieves the first 255 characters, as that is the maximum length of a script string. GetNetCommandTextToFile filename This function writes the text of the network command message to a text file specified by the string value filename. This returns a Boolean value: TRUE if the text could be written to the file, FALSE if not. This is only valid in scripts called to process network commands as set in #NETCOMMAND in EXTERNAL.CIT: if used in any other script, this has no effect and returns FALSE. This is useful for processing network command text over 255 characters in length: you can read the file as needed. GetNetID index This returns the Net ID of a room. index is an integer value indexing a slot in the room table. The Net ID is returned as a string value. GetNetMail This returns whether net mail is always dumped in the Mail room, or if Citadel is to try to find the correct room for it. This is returned as a Boolean value: TRUE if Citadel should try to find the correct place for networked mail, FALSE if it always places it in the Mail room. GetNetSurnames This returns whether surnames are displayed on networked messages as set by #TWIT_FEATURES NET_SURNAMES in CONFIG.CIT. This is returned as a Boolean value: TRUE if they are, FALSE if they are not. GetNetTitles This returns whether titles are displayed on networked messages as set by #TWIT_FEATURES NET_TITLES in CONFIG.CIT. This is returned as a Boolean value: TRUE if they are, FALSE if they are not. GetNewest This returns the message number of the newest message on the system. This is returned as a long value. GetNewUserApp This returns the application run when new users log in. This is returned as a string value. GetNMessages This returns the maximum number of messages that Citadel can keep track of, as set by #NMESSAGES in CONFIG.CIT. This is returned as a long value. GetNodeCountry This returns the country of the node, as set by #NODECOUNTRY in CONFIG.CIT. This is returned as a string value. GetNodeName This returns the name of the node, as set by #NODENAME in CONFIG.CIT. This is returned as a string value. GetNodePhone This returns the phone number of the node, as set by #NODEPHONE in CONFIG.CIT. This is returned as a string value. GetNodeRegion This returns the region of the node, as set by #NODEREGION in CONFIG.CIT. This is returned as a string value. GetNodeSig This returns the current signature of the node, as set by #SIGNATURE in CONFIG.CIT. This is returned as a string value. GetNoPWEcho This returns the value of #NOPWECHO in CONFIG.CIT. This is returned as an integer value. GetNumberOfMessages This returns the total number of messages in the message table as a long value. GetOffHook This returns whether the modem is placed off hook when someone logs in local. This is returned as a Boolean value: TRUE if Citadel places the modem off hook when a user is logged-in on console, FALSE if it does not. GetOffHookStr This returns the string sent to the modem to place it off hook as set by #OFFHOOKSTR in CONFIG.CIT. This is returned as a string value. GetOldCount This returns the number of messages Citadel calls new for first-time callers. This is returned as an integer value. GetOldest This returns the message number of the oldest message in the message base. This might be older than the oldest message in the message table if #NMESSAGES is not set high enough. This is returned as a long value. GetOneKey prompt keys default label1 label2... This prompts the user to enter a single key. prompt is a string value that is displayed to the user, followed by the valid choices then a question mark. keys is a string value that gives the valid responses. default is a string value that gives the default key, for if the user presses Enter. label1, label2, etc., are string values that describe the choices. When the valid choices are presented to the user, Citadel uses the current user's expert setting: if expert mode is on, then only the valid keys are listed; if it is off, then the full labelx string is displayed. The choice specified by default is then displayed in brackets. When a valid key is pressed by the user, Citadel displays the labelx for that choice, and returns an integer value which is the index of the key in keys, starting at 0. If the user presses ESC, then the value -1 is returned. GetParam line index This gets an individual parameter from a line of multiple parameters. This uses the same algorithm that Citadel uses when reading configuration files like CONFIG.CIT. line is a string value, which is the line of text that is to be parsed. index is an integer value, from 1 up, which is the parameter that is to be returned. The specified parameter is returned as a string value. GetParamCount line This returns the total number of parameters on a line of multiple parameters. line is a string value that is counted. The total is returned as an integer value. GetPoop This returns the setting of #POOP! in CONFIG.CIT. This is returned as an integer value. GetPoopUser This returns the current poopuser. This is returned as a string value. GetPortRate This returns the current port rate, which is the speed that the computer is talking to the modem at. This is returned as a long value, ranging from 300 to 115,200. GetPrinter This returns the current default printer file as set with #PRINTER in CONFIG.CIT. This is returned as a string value. GetPrinterPrompt This returns whether Citadel prompts for a file name when Alt+P is used to capture output. This is returned as a Boolean value: TRUE if Citadel prompts for a file name, FALSE if it does not. GetReadAll This returns the current value of #READALL in CONFIG.CIT. This is returned as an integer value. GetReadLUser This returns whether users can use the .Read Group- only Userlog (.RGU) command. This is returned as a Boolean value: TRUE if the command is allowed, and FALSE if it is not. GetReadOK This returns whether unlogged-in users may read messages, as set by #READOK in CONFIG.CIT. This is returned as a Boolean value: TRUE if unlogged users can use the Read commands, FALSE if they cannot. GetRestoreMode This returns whether the screen is restored after a shell. This is returned as a Boolean value: TRUE if Citadel forces the screen mode back to the mode before the shell and FALSE if it uses the new mode set while shelled. GetRoomBypass index This tells if a specific room has been bypassed by the user during this call. index is an integer value that indexes the room in the room table. This returns a Boolean value: TRUE if the room has been bypassed this call, FALSE if it has not. GetRoomDir This returns the directory for the current room. This may contain a return value even if the room is not currently a directory room; use IsRoomDIR first to verify that this is a directory room. The room's directory is returned as a string value. GetRoomEntered index This gets the number of messages entered this call in a room. index is an integer value indexing a slot in the room table. The number of messages entered in the room during this call is returned as an integer. GetRoomGroup index This gets the group slot for a group-only room. index is an integer value indexing a slot in the room table. The group number is returned as an integer value. Note that this function returns a slot even if the room is not group-only; use IsRoomGrpOnly to determine if the room is group- only first. GetRoomHasMail index This tells if a specific room contains mail waiting for the current user. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the user has mail waiting in the specified room; FALSE if he does not. GetRoomHasOldMail index This tells if a specific room contains old unread mail of the current user. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the user has unread old mail in the specified room; FALSE if he does not. GetRoomMsgs index This returns the number of messages visible to the current user in a room. index is an integer value indexing a slot in the room table. The number of messages visible to the current user in the specified room is returned as a long value. GetRoomName index This returns the name of the specified room. index is an integer value indexing a slot in the room table. The name of the room is returned as a string value. GetRoomNew This returns the number of new messages to the current user in a room. index is an integer value indexing a slot in the room table. The number of new messages visible to the current user in the specified room is returned as a long value. GetRoomOK This returns whether non-aide users can create rooms using the .Enter Room (.ER) command. This is returned as a Boolean value: TRUE if the command is allowed for all users, FALSE if only aides can use it. GetRoomPath This returns the path that Citadel searches for room descriptions in. This is returned as a string value. GetRoomTotal index This returns the total number of messages in a room, visible to the current user or not. index is an integer value indexing a slot in the room table. The number of messages in the specified room is returned as a long value. GetRoomVisited index This tells whether a room has been visited during this call. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room has been visited this call, FALSE if it has not. GetScreenSave code This returns information about the current settings of the screen saver. code is an integer value telling what to tell about, as per the following table: 1 The number of minutes before the screen will blank; 0 if the screen saver is turned off. This is returned as an integer. 2 Whether the screen save is turned off when Citadel gets a call. This is returned as a Boolean: TRUE if is turned off, FALSE if it is not. 3 Whether the screen saver turns off for the duration of the call. This is returned as a Boolean: TRUE if the screen saver stays turned off for the duration of a call, FALSE if it does not. 4 Whether a clock is displayed on the screen, and how often it moves if it is displayed. This is returned as an integer: 0 if no clock is to be displayed on the screen, otherwise the number of seconds before it is moved. 5 Whether the cursor stays on when the screen is blanked. This is returned as a Boolean: TRUE if the cursor stays on when the screen is blanked, FALSE if it is turned off. GetScrollColors This tells whether colors are saved in the scroll- back buffer or not. This is returned as a Boolean value: TRUE if colors are saved; FALSE if they are not. GetScrollSize This tells the size of the scroll-back buffer, in lines. This is returned as an integer value. GetScrollTimeout This returns the scroll-back buffer time-out in seconds. This is returned as an integer value. GetSetCensor This tells if users can choose to view censored messages with the .Enter Configuration (.EC) command or not. This is returned as a Boolean value: TRUE if users can choose; FALSE if they cannot. GetSetMsgNym This tells whether the .Aide Name messages (.AN) command is active or not. This returns a Boolean value: TRUE if the command is active; FALSE if it is not. GetSleepCount This tells how long of a countdown timer (in seconds) is given to users before timing out on them. This is returned as an integer. GetSleepPrompt This returns the string sent to users when they are timed out on. This is returned as a string value. GetStatNum This returns the maximum number of system events tracked in the Status Screen (F4), as set by #MAXSTAT in CONFIG.CIT. This is returned as an integer value. GetString prompt default length This gets string input from the user. prompt is a string value used to prompt the user. It is appended to "Enter " to make a full sentence. If you don't want a prompt, use an empty string ("") for prompt. default gives the user a default choice, which is displayed in square brackets ([]) to the user. If you don't want a default choice, use an empty string ("") for default. length is an integer value, which limits the length of a responds you want from the user. The string the user enters is returned as a string value. GetSubHubs This returns the setting of #SUBHUBS in CONFIG.CIT. It is returned as an integer value. GetSurnames This returns whether surnames allowed on the system as set by #TWIT_FEATURES SURNAMES in CONFIG.CIT. This is returned as a Boolean value: TRUE if they are, FALSE if they are not. GetSysBorders This tells whether borders are active on the system. This is returned as a Boolean value: TRUE if borders are active; FALSE if they are not. GetSysopName This tells the name of the sysop as set by #SYSOP in CONFIG.CIT. This is returned as a string value. GetTempPath This tells the temp path as set by #TEMPPATH in CONFIG.CIT. This is returned as a string value. GetTimeOut This tells the number of minutes users are allowed to be idle before Citadel times out on them. This is returned as an integer value. GetTitles This returns whether surnames allowed on the system as set by #TWIT_FEATURES SURNAMES in CONFIG.CIT. This is returned as a Boolean value: TRUE if they are, FALSE if they are not. GetTransPath This returns the transfer path as set by #TRANSPATH in CONFIG.CIT. This is returned as a string value. GetTrapFile This tells the name of the trap file as set by #TRAP_FILE in CONFIG.CIT. This is returned as a string value. GetTwirly This returns the twirly cursor string as set by #TWIRLY in CONFIG.CIT. This is returned as a string value. GetTwirlyPause This returns the length of the pause between updates of the twirly cursor as set by #TWIRLY in CONFIG.CIT. This is returned as an integer value. GetTwitCountry This returns the board's twit country as set in CONFIG.CIT. This is returned as a string value. GetTwitRegion This returns the board's twit region as set in CONFIG.CIT. This is returned as a string value. GetUnlogBal This returns the accounting balance of unlogged-in users. This is returned as a long value. GetUnlogTimeout This tells the number of minutes unlogged-in users are allowed to be idle before Citadel times out on them. This is returned as an integer value. GetUpDay day This tells if the board is up during a specified day. day is an integer value, ranging from 0 (Sunday) to 6 (Saturday). This returns a Boolean value: TRUE if the board is up for callers on that day, FALSE if it is not. GetUpHour hour This tells if the board is up during a specified hour. hour is an integer value, ranging from 0 to 23. This returns a Boolean value: TRUE if the board is up for callers during that hour of the day, FALSE if it is not. GetUserAddr1 This returns line 1 of the current user's postal address. This is returned as a string value. GetUserAddr2 This returns line 2 of the current user's postal address. This is returned as a string value. GetUserAddr3 This returns line 3 of the current user's postal address. This is returned as a string value. GetUserCallNo This returns the current user's last call number. This is returned as a long value. GetUserCallTime This returns the current user's last call time. This is returned as a long value corresponding to Citadel's time/date functions. GetUserCredits This returns the number of credits that the current user has left. This is returned as a long value. Notice that this is a different value that you usually see when dealing with credits: Citadel thinks of credits internally in terms of seconds, but converts to minutes when displaying credits to users. This function returns the number of seconds left. GetUserDefHall This returns the current default hall for the user. The default hall is returned as a string value. GetUserDStamp This function returns the date stamp for the current user. It is returned as a string value. GetUserFwd This returns the user portion of the forwarding address for the current user. This is returned as a string value. GetUserFwdNode This returns the node portion of the forwarding address for the current user. This is returned as a string value. GetUserIn This returns the current user's initials. This is returned as a string value. GetUserLastHall This returns the last hall the current user was in last call. This is returned as a string value. Citadel currently does not keep track of this, so the returned value is meaningless. GetUserLastPointer This returns the newest message on the system during the current user's last call. This is returned as a long value. GetUserLastRoom This returns the last room the current user was in last call. This is returned as a string value. Citadel currently does not keep track of this, so the returned value is meaningless. GetUserLines This returns the current user's lines per screen setting. This is returned as an integer value. GetUserName This returns the current user's name. This is returned as a string value. GetUserNetPref This returns the current user's net prefix. This is returned as a string value. GetUserNulls This returns the current user's number of nulls. This is returned as an integer value. GetUserPhone This returns the current user's phone number. This is returned as a string value. GetUserPoop This returns the current user's poopcount. This is returned as a long value. GetUserPrompt This returns the current user's room prompt format. This is returned as a string value. GetUserProto This returns the current user's default protocol. This is returned as a string value. GetUserPW This returns the current user's password. This is returned as a string value. GetUserRealName This returns the current user's real name. This is returned as a string value. GetUserSig This returns the current user's signature. This is returned as a string value. GetUserSurname This returns the current user's surname. This is returned as a string value. GetUserTitle This returns the current user's title. This is returned as a string value. GetUserVDStamp This function returns the verbose date stamp for the current user. It is returned as a string value. GetUserWidth This returns the current user's screen width. This is returned as an integer value. GetUttr This function gets the console underlined text attribute as set by #UTTR in CONFIG.CIT. It is returned as an integer value. GetVMemFile This gets the name of the file being used for virtual memory. This is returned as a string value. When not running the Auxmem version, this function has no meaning and returns an empty string. GetWAttr This function gets the console reverse video attribute as set by #WATTR in CONFIG.CIT. It is returned as an integer value. Hangup This hangs up the modem. HexToDex hex This converts the string of hexadecimal digits hex to their numeric value and returns the result as a long value. HowLongAgoWasIt time This generates a string telling how long ago the time specified by the long value time was. IChar This waits for the user to enter a single character. This character is echoed to the screen, and returned as a single-character long string. ICharNE This waits for the user to enter a single character. This character is not echoed to the screen, and returned as a single-character long string. IsCanOutput This checks to see if output is being displayed to the user. This returns a Boolean value: TRUE if output is being displayed; FALSE if not (such as when the user presses Stop or Next). IsConsoleLocked This returns whether the console is locked as a Boolean value: TRUE if the console is locked; FALSE if not. IsFilenameLegal filename [allowspace] This checks the legality of filename. This checks for illegal characters and whether the name specifies a device, not a true file. allowspace is on optional Boolean value that specifies if spaces should be considered legal in the filename (such as for when multiple filenames are separated by spaces): if TRUE, then spaces are allowed; if FALSE or missing, then spaces are not allowed. IsGrpAutoAdd index This tells if a group is an auto-add group or not. index is an integer value indexing a slot in the group file. This returns a Boolean value: TRUE if the group is auto-add; FALSE if it is not. IsGrpHidden index This tells if a group is hidden or not. index is an integer value indexing a slot in the group file. This returns a Boolean value: TRUE if the group is hidden; FALSE if it is not. IsGrpInuse index This tells if a group is in use or not. index is an integer value indexing a slot in the group file. This returns a Boolean value: TRUE if the group is in use; FALSE if it is not. IsGrpLocked index This tells if a group is locked from aides or not. index is an integer value indexing a slot in the group file. This returns a Boolean value: TRUE if the group is locked from aides; FALSE if it is not. IsHallDesc index This tells if a hall has a description or not. index is an integer value indexing a slot in the hall file. This returns a Boolean value: TRUE if the hall is described; FALSE if it is not. IsHallEnterRoom index This tells if a user can enter rooms in this hall or not. index is an integer value indexing a slot in the hall file. This returns a Boolean value: TRUE if the users can enter rooms in this hall even if #ROOMOK in CONFIG.CIT is set to 0; FALSE if they cannot. IsHallGrp index This tells if a hall is a group-only or not. index is an integer value indexing a slot in the hall file. This returns a Boolean value: TRUE if the hall is group-only; FALSE if it is not. IsHallInuse index This tells if a hall is in use or not. index is an integer value indexing a slot in the hall file. This returns a Boolean value: TRUE if the hall is in use; FALSE if it is not. IsInGroup index This tells if the current user is in a group or not. index is an integer value indexing a slot in the group file. This returns a Boolean value: TRUE if the current user is in the group; FALSE if he is not. IsLoggedIn This tells if there is currently a user logged in or not. This returns a Boolean value: TRUE if there is a user logged in; FALSE if not. IsMatchWildcard string wildcard This tests if the string value specified by string matches the wildcard expression specified by the string value wildcard. You can use Unix-style wildcards in wildcard. For example, the wildcard string "th[ea]n" matches the string "then" and "than". Like almost everything in Citadel, this is not case-senesitive. IsNetIDInNetIDCit netid This searches NETID.CIT for a Net ID. netid is a string value specifying the Net ID to search for. This function returns a Boolean value: TRUE if the Net ID is found; FALSE if not. IsOutputJump This checks to see if the user has pressed the J key to jump output. This returns a Boolean value: TRUE if the user has pressed the J key; FALSE if not. IsOutputNext This checks to see if the user has pressed the N key to next output. This returns a Boolean value: TRUE if the user has pressed the N key; FALSE if not. IsOutputStop This checks to see if the user has pressed the S key to stop output. This returns a Boolean value: TRUE if the user has pressed the S key; FALSE if not. IsRoomAnon index This tells whether a room is anonymous or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is anonymous, FALSE if it is not. IsRoomApplic index This tells whether a room has an application or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room has an application, FALSE if it does not. IsRoomBIO index This tells whether a room is BIO or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is BIO, FALSE if it is not. IsRoomBypassed index This tells whether a room has been bypassed during the current call or not. index is an integer value that specifies the room to test. This returns a Boolean value: TRUE if the room has been bypassed; FALSE if not. IsRoomDir index This tells whether a room has a directory or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room has a directory, FALSE if it does not. IsRoomDownOnly index This tells whether a room is download-only or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is download-only, FALSE if it is not. IsRoomGrpMod index This tells whether a the privileges group moderates a room or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is moderated by the privileges group, FALSE if it is not. IsRoomGrpOnly index This tells whether a room is group-only or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is group-only, FALSE if it is not. IsRoomInHall hall room This returns whether the room specified by the index room is in the hall specified by the index hall as a Boolean value. IsRoomInuse index This tells whether a room is in use or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is in use, FALSE if it is not. IsRoomModerated index This tells whether a room is moderated or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is moderated, FALSE if it is not. IsRoomWindow index This returns whether a room is a window into other halls or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is a window, FALSE if not. In floor mode (#SUBHUBS 4 in CONFIG.CIT), this always returns FALSE. IsRoomPerm index This tells whether a room is permanent or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is permanent, FALSE if it is not. IsRoomPrivGrp index This tells whether a room is has a privileges group or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room has a privileges group, FALSE if it is not. IsRoomPublic index This tells whether a room is public or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is public, FALSE if it is not (which means that it is hidden). IsRoomReadOnly index This tells whether a room is read-only or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is read-only, FALSE if it is not. IsRoomShared index This tells whether a room is shared or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is shared, FALSE if it is not. IsRoomSubject index This tells whether a room prompts for a subject or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room prompts for a subject on all messages, FALSE if it is not. IsRoomUpOnly index This tells whether a room is upload-only or not. index is an integer value indexing a slot in the room table. This function returns a Boolean value: TRUE if the room is upload-only, FALSE if it is not. IsUserAide This tells whether the current user is an aide or not. This function returns a Boolean value: TRUE if the user is an aide, FALSE if he is not. IsUserDisplayTS This tells whether the current user chooses to view titles and surnames or not. This function returns a Boolean value: TRUE if the user chooses to view titles and surnames, FALSE if he does not. IsUserEntBorders This tells whether the current user is viewing borders and ads or not. This function returns a Boolean value: TRUE if the user sees borders and ads, FALSE if he does not. IsUserExpert This tells whether the current user is an expert or not. This function returns a Boolean value: TRUE if the user is an expert, FALSE if he is not. IsUserFwdNode This tells whether the current user is forwarding his mail to another node or not. This function returns a Boolean value: TRUE if the user is forwarding his mail to another node, FALSE if he is not. IsUserHallLock This tells whether the current user has his default hall locked or not. This function returns a Boolean value: TRUE if the user has his default hall locked, FALSE if he does not. IsUserHallTell This tells whether the current user sees hall descriptions or not. This function returns a Boolean value: TRUE if the user sees hall descriptions, FALSE if he does not. IsUserHideExcl This tells whether the current hides message exclusions or not. This function returns a Boolean value: TRUE if the user hides messages exclusions, FALSE if he does not. IsUserIBMANSI This tells whether the current user has IBM ANSI or not. This function returns a Boolean value: TRUE if the user has IBM ANSI, FALSE if he does not. IsUserIBMColor This tells whether the current user has IBM COLOR or not. This function returns a Boolean value: TRUE if the user has IBM COLOR, FALSE if he does not. IsUserIBMGraph This tells whether the current user has IBM graphics or not. This function returns a Boolean value: TRUE if the user has IBM graphics, FALSE if he does not. IsUserInuse This tells whether the current user is in use or not. This function returns a Boolean value: TRUE if the user is in use, FALSE if it is not. If a user is logged-in, this should always return TRUE. If a user is not logged-in, this should always return FALSE. IsUserLastOld This tells whether the current user has last old on new turned on or not. This function returns a Boolean value: TRUE if the user has last old on new turned on, FALSE if he does not. IsUserLF This tells whether the current user has linefeeds turned on or not. This function returns a Boolean value: TRUE if the user has linefeeds turned on, FALSE if he does not. IsUserLockSig This tells whether the current user has a locked signature or not. This function returns a Boolean value: TRUE if the user has a locked signature, FALSE if he does not. IsUserMiniBin This tells whether the current user has Minibin usage statistics turned on or not. This function returns a Boolean value: TRUE if the user has Minibin usage statistics turned on, FALSE if he does not. IsUserMsgCls This tells whether the current user has clear screen between messages turned on or not. This function returns a Boolean value: TRUE if the user has clear screen between messages turned on, FALSE if he does not. IsUserMsgPause This tells whether the current user has pause between messages turned on or not. This function returns a Boolean value: TRUE if the user has pause between messages turned on, FALSE if he does not. IsUserNet This tells whether the current user has network privileges or not. This function returns a Boolean value: TRUE if the user has network privileges, FALSE if he does not. IsUserNextHall This tells whether the current user has auto next hall turned on or not. This function returns a Boolean value: TRUE if the user has auto next hall turned on, FALSE if he does not. IsUserNoAcct This tells whether the current user has no accounting or not. This function returns a Boolean value: TRUE if the user has no accounting, FALSE if he does not (meaning that he does have accounting). IsUserNoChat This tells whether the current user has chat disabled or not. This function returns a Boolean value: TRUE if the user has chat disabled, FALSE if he does not. IsUserNode This tells whether the current user is a node or not. This function returns a Boolean value: TRUE if the user is a node, FALSE if he is not. IsUserNoDownload This tells whether the current user has downloads disabled or not. This function returns a Boolean value: TRUE if the user has downloads disabled, FALSE if he does not. IsUserNoMail This tells whether the current user has mail disabled or not. This function returns a Boolean value: TRUE if the user has mail disabled, FALSE if he does not. IsUserNoUpload This tells whether the current user has uploads disabled or not. This function returns a Boolean value: TRUE if the user has uploads disabled, FALSE if he does not. IsUserOut300 This tells whether the current user has 300 baud simulation turned on or not. This function returns a Boolean value: TRUE if the user has 300 baud simulation turned on, FALSE if he does not. IsUserPerm This tells whether the current user is permanent or not. This function returns a Boolean value: TRUE if the user is permanent, FALSE if he is not. IsUserPrint This tells whether the current user is trapped to the print file or not. This function returns a Boolean value: TRUE if the user is trapped to the print file, FALSE if he is not. IsUserProblem This tells whether the current user is a problem user or not. This function returns a Boolean value: TRUE if the user is a problem user, FALSE if he is not. IsUserPsycho This tells whether the current user has psycho chicken turned on or not. This function returns a Boolean value: TRUE if the user has psycho chicken turned on, FALSE if he does not. IsUserRoomInfo This tells whether the current user has room information lines turned on or not. This function returns a Boolean value: TRUE if the user has room information lines turned on, FALSE if he does not. IsUserRoomTell This tells whether the current user has room descriptions turned on or not. This function returns a Boolean value: TRUE if the user has room descriptions turned on, FALSE if he does not. IsUserSeeBorders This tells whether the current user sees borders or not. This function returns a Boolean value: TRUE if the user sees borders, FALSE if he does not. IsUserSignatures This tells whether the current user sees signatures or not. This function returns a Boolean value: TRUE if the user sees signatures, FALSE if he does not. IsUserSubjects This tells whether the current user sees subjects or not. This function returns a Boolean value: TRUE if the user sees subjects, FALSE if he does not. IsUserSurLock This tells whether the current user has a locked surname and title or not. This function returns a Boolean value: TRUE if the user has a locked surname and title, FALSE if he does not. IsUserSysop This tells whether the current user is a sysop or not. This function returns a Boolean value: TRUE if the user is a sysop, FALSE if he is not. IsUserTabs This tells whether the current user has tabs turned on or not. This function returns a Boolean value: TRUE if the user has tabs turned on, FALSE if he does not. IsUserTwirly This tells whether the current user has the twirly cursor turned on or not. This function returns a Boolean value: TRUE if the user has the twirly cursor turned on, FALSE if he does not. IsUserUnlisted This tells whether the current user has an unlisted account or not. This function returns a Boolean value: TRUE if the user is unlisted, FALSE if he is not. IsUserUpOnly This tells whether the current user has upper case only turned on or not. This function returns a Boolean value: TRUE if the user has upper case only turned on, FALSE if he does not. IsUserVCont This tells whether the current user has verbose continue turned on or not. This function returns a Boolean value: TRUE if the user has verbose continue turned on, FALSE if he does not. IsUserVerbose This tells whether the current user has verbose mode turned on or not. This function returns a Boolean value: TRUE if the user has verbose mode turned on, FALSE if he does not. IsUserVerified This tells whether the current user is verified or not. This function returns a Boolean value: TRUE if the user is verified, FALSE if he is not. IsUserViewCensor This tells whether the current user views censored messages or not. This function returns a Boolean value: TRUE if the user views censored messages, FALSE if he does not. KeyboardAdd string1 [string2...] This adds the characters of the specified strings to the keyboard buffer. This can be useful as the last thing a script does before exiting, as then Citadel will process the characters as if they were pressed on the keyboard. In this way, a script can execute some Citadel commands. KeyboardFlush This clears all keys out of Citadel's keyboard buffer. KillRoom [roomname] This attempts to kill a room on the system and returns a Boolean value: TRUE if the room was killed; FALSE if not. roomname is an optional string value: if it is present, then this tries to kill the room with that name; else it prompts the user for the name of the room to kill, as would happen if the user invoked the .Aide Kill room (.AK) command. KillUser [username] This attempts to kill a user on the system and returns a Boolean value: TRUE if the user was killed; FALSE if not. username is an optional string value: if it is present, then this tries to kill the user with that name; else is prompts the user for the name of the user to kill, as would happen if the user invoked the .Sysop Kill user (.SK) command. MemoryFree This finds the size of the largest free block of memory and returns the number of bytes as a long value. ModemFlush This flushes the input buffer of the modem: all pending incoming characters from the modem are discarded. ModemInitPort This initializes the modem port. MsgAddComment comment This adds a comment to the message in the script's message buffer. comment is a string value which is used as the comment to add. This returns a Boolean value: TRUE if the comment could be added; FALSE if it could not (which generally means that Citadel is out of memory). MsgAppendText string1 [string2...] This appends each string to the script's message buffer. MsgClear This clears all information from the script's message buffer. MsgDump This deletes the script's message buffer, freeing the memory for other use. MsgGetAuthor This retrieves the author from the script's message buffer. MsgGetCit86Country This retrieves the Citadel-86 country from the script's message buffer. MsgGetComment index This retrieves a comment from the message in the script's message buffer. index is a long value that specifies which comment to retrieve. The comment is returned as a string value. MsgGetCommentCount This returns the number of comments the message in the script's message buffer has. The count is returned as a long value. MsgGetCopyOfMessage This retrieves the original message ID from the script's message buffer, if this message is a copy. If this message is not a copy, this returns an empty string. MsgGetCreationRoom This retrieves the creation room from the script's message buffer. MsgGetCreationTime This retrieves the creation time from the script's message buffer. This is returned as the number of seconds since 12:00AM, January 1, 1970, GMT. MsgGetDestinationAddress This retrieves the destination address from the script's message buffer. MsgGetEncryptionKey This retrieves the encryption key from the script's message buffer. MsgGetEZCreationTime This retrieves the EZ creation time from the script's message buffer. MsgGetFilelink This retrieves the linked file from the script's message buffer. MsgGetForward This retrieves the forwardee's name from the script's message buffer. MsgGetFromPath This retrieves the from path from the script's message buffer. MsgGetGroup This retrieves the group from the script's message buffer. MsgGetHeadLoc This retrieves the location of the message in MSG.DAT from the script's message buffer. MsgGetLocalID This retrieves the local ID from the script's message buffer. MsgGetOriginAddress This retrieves the origin address of the message in the script's message buffer as a string value. The origin address is not always available, so a return value of an empty string does not always mean that the message originated on a node with no address. MsgGetOriginalAttribute This retrieves the attribute of the original message (if this message is a copy) from the script's message buffer. MsgGetOriginalID This retrieves the original ID from the script's message buffer. MsgGetOriginalRoom This retrieves the original room from the script's message buffer. MsgGetOriginCountry This retrieves the origin country from the script's message buffer. MsgGetOriginNodeName This retrieves the origin node name from the script's message buffer. MsgGetOriginPhoneNumber This retrieves the origin phone number from the script's message buffer. MsgGetOriginRegion This retrieves the origin region from the script's message buffer. MsgGetOriginSoftware This retrieves the origin software from the script's message buffer. MsgGetRealName This retrieves the real name from the script's message buffer. MsgGetReplyToMessage This retrieves the ID of the message this is a reply to from the script's message buffer, if this is a reply. If it is not, then this returns an empty string. MsgGetRoomNumber This retrieves the room number from the script's message buffer. MsgGetSignature This retrieves the signature from the script's message buffer. MsgGetSourceID This retrieves the source ID from the script's message buffer. MsgGetSourceRoomName This retrieves the source room name from the script's message buffer. MsgGetSubject This retrieves the subject from the script's message buffer. MsgGetSurname This retrieves the surname from the script's message buffer. MsgGetTitle This retrieves the title from the script's message buffer. MsgGetToCountry This retrieves the destination country from the script's message buffer, if this is networked mail. If not, this returns an empty string. MsgGetToNodeName This retrieves the destination node name from the script's message buffer, if this is networked mail. If not, this returns an empty string. MsgGetToPath This retrieves the forced path from the script's message buffer. MsgGetToPhoneNumber This retrieves the destination phone number from the script's message buffer, if this is networked mail. If not, this returns an empty string. MsgGetToRegion This retrieves the destination region from the script's message buffer, if this is networked mail. If not, this returns an empty string. MsgGetToUser This retrieves the destination user from the script's message buffer, if this is mail. If not, this returns an empty string. MsgGetTwitCountry This retrieves the twit country from the script's message buffer. MsgGetTwitRegion This retrieves the twit region from the script's message buffer. MsgGetUserSignature This retrieves the user signature from the script's message buffer. MsgGetX This retrieves the X field from the script's message buffer. MsgHeaderClear This clears the message header of the script's message buffer, but does not affect the message text. MsgIsCensored This returns a Boolean value: TRUE if the message is censored; FALSE if not. MsgIsCompressed This returns a Boolean value: TRUE if the message is compressed; FALSE if not. MsgIsEncrypted This returns a Boolean value: TRUE if the message is encrypted; FALSE if not. MsgIsLocal This returns a Boolean value: TRUE if the message is local-only; FALSE if not. MsgIsMadeVisible This returns a Boolean value: TRUE if the message is a released problem user or moderated message; FALSE if not. MsgIsMoreFlag flag This checks whether the message in the script's message buffer has a specified moreflag set. flag is a string value, the first character of which specifies the flag. This returns a Boolean value: TRUE if the specified flag is set; FALSE if not. MsgIsReceiptConfirmationRequested This returns a Boolean value: TRUE if the message is receipt confirmation requested; FALSE if not. MsgIsReceived This returns a Boolean value: TRUE if the message is received; FALSE if not. MsgIsRepliedTo This returns a Boolean value: TRUE if the message is replied to; FALSE if not. MsgIsViewDuplicate This returns a Boolean value: TRUE if the message is a duplicate; FALSE if not. MsgLoad messageid This loads the message with the number messageid into the script's message buffer. This returns a Boolean value: TRUE if the message could be read; FALSE if it could not (the message doesn't exist, or there isn't enough memory to allocate the message buffer). MsgSave This saves the message in the script's message buffer to the message base. MsgSaveTextToFile filename This saves the text of the message in the script's message buffer to the text file specified by the string value filename. This returns a Boolean value: TRUE if it worked, or FALSE if it didn't (there is no message in the script's message buffer or filename could not be opened to write the text to). MsgSetAuthor author This sets the author of the script's message buffer. author is a string value giving the author of the message. MsgSetCensored censored This sets whether the message in the script's message buffer is censored or not. censored is a Boolean value: TRUE if the message should be censored; FALSE if not. MsgSetCreationRoom roomname This sets the creation room of the script's message buffer. roomname is a string value giving the creation room of the message. MsgSetCreationTime time This sets the creation time of the script's message buffer. time is a long value giving the creation time of the message, in seconds since 12:00AM January 1, 1970, GMT. MsgSetDestinationAddress address This sets the destination address of the script's message buffer. address is a string value giving the destination address of the message. MsgSetEncrypted encrypt This sets whether the message in the script's message buffer is encrypted or not. encrypt is a Boolean value: TRUE if the message should be encrypted; FALSE if not. MsgSetEncryptionKey key This sets the encryption key of the script's message buffer. key is a string value giving the encryption key of the message. MsgSetEZCreationTime time This sets the EZ creation time of the script's message buffer. time is a string value giving the EZ creation time of the message. MsgSetFilelink filename This sets the linked file of the script's message buffer. filename is a string value giving the file to link the message to. MsgSetForward username This sets the forwarding address of the script's message buffer. username is a string value giving the forwardee of the message. MsgSetGroup groupname This sets the group of the script's message buffer. groupname is a string value giving the group of the message. MsgSetLocal local This sets whether the message in the script's message buffer is local-only or not. local is a Boolean value: TRUE if the message should be local- only; FALSE if not. MsgSetMoreFlag flag value This sets whether the message in the script's message buffer has a specified moreflag set. flag is a string value, the first character of which specifies the flag. value is a Boolean value: TRUE to set the flag, FALSE to clear it. This returns a Boolean value: TRUE if the specified flag could be set or cleared; FALSE if not (for example, the maximum number of moreflags has been set). MsgSetOriginalRoom roomname This sets the original room of the script's message buffer. roomname is a string value giving the original room name of the message. MsgSetRealName name This sets the real name of the script's message buffer. name is a string value giving the real name of the author of the message. MsgSetReceiptConfirmationRequested requested This sets whether receipt confirmation is requested of the message in the script's message buffer. requested is a Boolean value: TRUE if confirmation is requested; FALSE if not. MsgSetReplyToMessage messageid This sets the message number that the message in the script's message buffer is a reply to. messageid is a string value giving the message that this is a reply to. MsgSetRoomNumber roomno This sets the room number of the script's message buffer. roomno is an integer value giving the room number of this message. MsgSetSignature signature This sets the signature of the script's message buffer. signature is a string value giving the signature of the message. MsgSetSourceRoomName roomname This sets the source room name of the script's message buffer. roomname is a string value giving the source room name of the message. MsgSetSubject subject This sets the subject of the script's message buffer. subject is a string value giving the subject of the message. MsgSetSurname surname This sets the surname of the script's message buffer. surname is a string value giving the surname of the message. MsgSetText text This sets the text of the script's message buffer. text is a string value giving the text of the message. MsgSetTitle title This sets the title of the script's message buffer. title is a string value giving the title of the message. MsgSetToPath path This sets the to path of the script's message buffer. path is a string value giving the to path of the message. MsgSetToPhoneNumber phonenum This sets the destination phone number of the script's message buffer. phonenum is a string value giving the destination phone number of the message. MsgSetToUser touser This sets the destination user of the script's message buffer. This can be a user on the network, by setting touser to something like "user @ node". MsgSetUserSignature signature This sets the user signature of the script's message buffer. signature is a string value giving the user signature of the message. MsgSetX x This sets the X field of the script's message buffer. x is a string value giving the X field of the message. MsgShow This displays the message in the script's message buffer to the user. MsgStart This starts a new message by allocating a message buffer for the script. MsgTabGetAuthHash index This returns the hash of the author of a message as an integer value. index is a long value giving the index of the message in the message table. MsgTabGetCopyOffset index This returns the offset from a copied message of the original message as a long value. index is a long value giving the index of the copied message in the message table. MsgTabGetLocation index This returns the byte offset in MSG.DAT of the start of a message as a long value. index is a long value giving the index of the message in the message table. MsgTabGetNextRoomMsg index This returns the message number of the next message in the same room as a message as a long value. index is a long value giving the index of the message in the message table. If the specified message is the last message in the room, then this returns -1. Note: This function is only valid in the Auxmem version. If executed in the Regular version, this will always return -1. MsgTabGetOriginID index This returns the low word of the Origin ID of a message networked message as an integer value. index is a long value giving the index of the message in the message table. MsgTabGetPrevRoomMsg index This returns the message number of the previous message in the same room as a message as a long value. index is a long value giving the index of the message in the message table. If the specified message is the first message in the room, then this returns -1. Note: This function is only valid in the Auxmem version. If executed in the Regular version, this will always return -1. MsgTabGetRoomNum index This returns the room number of a message as an integer value. index is a long value giving the index of the message in the message table. MsgTabGetToHash index This returns the hash of the destination user of a message as an integer value. index is a long value giving the index of the message in the message table. MsgTabIsCensored index This returns whether a message has been censored as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsCopy index This returns whether a message is a copy of another one as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsForwarded index This returns whether a message is forwarded as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsInUse index This returns whether a message table entry is in use as a Boolean value. index is a long value giving the index of the entry in the message table. MsgTabIsLimited index This returns whether a message is group-only as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsLocal index This returns whether a message is local-only as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsMail index This returns whether a message is mail as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsMadeVis index This returns whether a problem-user or moderated message has been made visible as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsMassEMail index This returns whether a message is mass E-Mail as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsModerated index This returns whether a message is a moderated message as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsNetMail index This returns whether a message is network mail destined for another system as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsNetworked index This returns whether a message is from another node on the network as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsProblem index This returns whether a message is a problem-user message as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsReceived index This returns whether a message has been received as a Boolean value. index is a long value giving the index of the message in the message table. MsgTabIsRepliedTo index This returns whether a message has been replied to as a Boolean value. index is a long value giving the index of the message in the message table. Net69Fetch nodename This does a Net 6.9 pre-fetch for the node specified by nodename. Net69Incorporate This does a Net 6.9 incorporation of any incoming network packets in the transfer path. Net69RoomReq nodename This creates a room request file for the node specified by the string value nodename. This has the same effect as the .Sysop 6.9 Net Room request (.S6R) command. Net86Fetch nodename This does a Citadel-86 fetch for the node specified by nodename. Net86Incorporate nodename This does a Citadel-86 incorporation for the node specified by nodename. OpenFile filenumber name This function opens a file. The file is created if it does not exist, and is opened for read and write access. filenumber is an integer from 0 to 4 which is used to reference the file later. name is a string value giving the file's name. If there is no path information in name, the file is opened in #HOMEPATH as set in CONFIG.CIT. If there is already a file referenced by filenumber open, it is closed first. This function returns a Boolean value: TRUE if the file was opened and FALSE if it was not for any reason. OutStrPaced string pacing This outputs a string to the modem, pausing between each character. string is the string to output to the modem, and pacing is the number of hundredths of a second to pause between characters. (Citadel might pause longer than this value, but not less.) ParseDateString datestring This attempts to parse a date as a human may enter it in a string. For example, this can accept "March 13, 1995" or "3-13-95" or "3/13/1995" or "95Mar13" and know what it means. This returns a long value which can then be passed to any script function that requests a time or date: the time and date specified by the long value is 12:00 AM on the date parsed. If Citadel cannot parse the date, it returns the long value that specifies January 1, 1970. Yes, this really is a stupid error return value. If you wish to parse both a date and a time, add the return values of ParseDateString and ParseTimeString to end up with a value that specifies the given time on the given date. ParseTimeString timestring This attempts to parse a time as a human may enter it in a string. For example, this can accept "13:05:00" or "1:05pm" or "01:05 P" and know what it means. This returns a long value which can then be passed to any script function that requests a time or date: the time and date specified by the long value is the time specified on January 1, 1970. If Citadel cannot parse the time, it returns the long value that specifies 12:00 AM. Yes, this really is a stupid error return value. If you wish to parse both a date and a time, add the return values of ParseDateString and ParseTimeString to end up with a value that specifies the given time on the given date. Pause delay This causes Citadel to pause. delay gives the length of the pause, in hundredths of a second. Citadel might pause longer than this value, but not less. PauseScript This causes the script to pause, and the script debugger to be activated, if it is not currently activated. PlaySound type name Wow. PrintC string1 [string2 ...] This prints all specified strings to the console screen, one after the other. PrintM string1 [string2 ...] This prints all specified strings to the console screen and modem, one after the other. Random limit This returns a random number in the range of 0 to one less than limit. limit is an integer value, and the random number is returned as an integer. ReadAplOnExit This tells the script interpreter to read INPUT.APL, README.APL, MESSAGE.APL, and CONSOLE.APL when the script exits. If you call the WriteApl function, then you do not need to call this function as well. ReadBool filenumber This reads a Boolean value from the file referenced by the integer value filenumber and returns it as a Boolean. ReadChar filenumber This reads a single character (byte) from the file referenced by the integer value filenumber and returns its ASCII value as an integer. ReadInt filenumber This reads an integer value from the file referenced by the integer value filenumber and returns it as an integer. ReadLong filenumber This reads a long value from the file referenced by the integer value filenumber and returns it as a long. ReadStr filenumber This reads a string value from the file referenced by the integer value filenumber and returns it as a string. The string can end with an ASCII 0 (NUL), an ASCII 10 (LF), and ASCII 13 (CR), or an ASCII 255. ReadUInt filenumber This reads an unsigned integer value from the file referenced by the integer value filenumber and returns it as an unsigned integer. ReadULong filenumber This reads an unsigned long value from the file referenced by the integer value filenumber and returns it as an unsigned long. RemoveNetIDFromNetIDCit netid This removes a Net ID from NETID.CIT. netid is a string value specifying the Net ID to remove. This function returns a Boolean value: TRUE if the Net ID could be removed; FALSE if not. RemoveUser username groupname This removed the user specified by the string value username from the group specified by the string value groupname. RemoveWatch This removes a watch of variable variable in the script debugger. This can be tricky: you cannot merely use: #CALL RemoveWatch _Variable To remove a watch of _Variable, because the value of _Variable will be used. The trick is to use the sub-string command, like this: #STR B x_Variable 1 99 #CALL RemoveWatch _Result This makes the value of _Result be "_Variable" which is then passed to RemoveWatch. This function returns a Boolean value: TRUE if the watch could be removed, or FALSE if it could not (either because the variable is not currently being watched, or because the script debugger is not currently active; see SetDebugScript). RenameFile oldname newname This attempts to rename the file given by the string value oldname to the name given by the string value newname. oldname and newname may reside in different directories on the same disk (in which case the file is moved), but not on different disks. If the rename operation was successful, this returns TRUE; else it returns FALSE. RunApplic cmdline This runs the application given by the string variable cmdline. cmdline is interpreted by Citadel like any other application command line: place a "!" at the beginning of it to tell Citadel to super-shell to the application, etc. SayASCII string This only works if you have an external sound driver loaded that support speech syntheses. This calls that function and tells it to speak the words in the string value string. SeekFile file location fromwhere This seeks to a location in a file opened by OpenFile. file is an integer value telling which file to perform the seeking in. location is a long value telling where to seek to. fromwhere is an integer value telling where to start the seek as per the following table: 0 Seek from the beginning of the file. 1 Seek from the current location in the file. 2 Seek from the end of the file. SetAideChatHour hour value This sets whether the .Aide Chat (.AC) command is active for any hour of the day. hour is the hour, from 0 (Midnight) to 23 (11pm). value is a Boolean value: TRUE if the command should be enabled for that hour; FALSE if not. SetAideHall value This sets whether Aides may use the .Aide Hall (.AH) and .Aide Window (.AW) commands, or if they are restricted to Sysops. value is a Boolean value: TRUE if Aides are allowed to use the commands; FALSE if not. SetAideModerate value This sets whether Aides may release moderated messages, or if that power is restricted to Sysops. value is a Boolean value: TRUE if Aides are allowed to release moderated messages; FALSE if not. SetAnonAuthor author This sets the name that Citadel prints as the author of anonymous messages. author is a string value giving the new name. SetApplPath path This sets Citadel's application path. path is a string value giving the new path. SetAttr attr This sets the new attribute (color) of normal text on console. attr is an integer value giving the new color code. SetAutoANSI value This sets Citadel's automatic ANSI detection. value is an integer value, corresponding to the values for the #AUTOANSI CONFIG.CIT keyword. SetBAttr attr This sets the attribute (color) of the border (overscan) area of the screen. attr is an integer value giving the new color. SetBells value This sets how Citadel determines whether to ring the console speaker when it encounters a Control+G character. value is an integer value: 0 for never ring the speaker; 1 for ring the speaker only in response to chat requests; and 2 for always ring the speaker. SetBorder number string This sets a border. number is an integer value specifying the border to set, and string is a string value specifying the new contents of the border. SetBreakPoint lineno This sets a breakpoint in the script debugger on the line specified by lineno. This returns a Boolean value: TRUE if the break point could be set; FALSE if not (either because Citadel is out of memory, or because the script debugger is not currently running; see DebugScript). SetCAttr attr This sets the attribute (color) of text entered on console during chat. This is also used for the color of bold text. attr is an integer value giving the new color code to use. SetChatOn value This turns the Chat (C) command on and off. value is a Boolean value: TRUE if chat should be turned on; FALSE if it should be turned off. SetCheckCTS value This sets whether Citadel should check the Clear To Send (CTS) line of the serial port before sending data to it. value is a Boolean value: TRUE to check CTS; FALSE to ignore it. After setting this, you should call InitPort to make the new setting active. SetCit86Country country This sets the country used for Citadel-86 networking. country is a string value giving the new country code. SetCit86Domain domain This sets the domain used for Citadel-86 networking. domain is a string value giving the new domain name. SetColors value This sets whether Citadel should allow colors in strings such as user names, room names, etc. value is a Boolean value: TRUE if it should allow colors everywhere; FALSE if not. SetConnectWait time This sets the length of time after a connection is made before Citadel should start sending data to the serial port. If you don't have an error- correcting or data-compressing modem, you can set this to give callers with such modems time for their modems to determine that you don't have such a modem. time is an integer value giving the number of seconds to wait after a connection before sending data to the serial port. SetConsoleLock lock This sets whether the console is locked. lock is a Boolean value: TRUE to lock the console; FALSE to unlock it. SetCountBeep value This sets whether Citadel should send Control+G characters to the serial port when counting down to hanging up (after timing out if #SLEEPCOUNT in CONFIG.CIT is non-zero or after the user finishes a download that he told Citadel to hang up after). value is a Boolean value: TRUE if Control+Gs should be sent every second; FALSE if not. SetCreditNym name This sets the singular name of credits on the system. name is a string value giving the new name. SetCreditsNym name This sets the plural name of credits on the system. name is a string value giving the new name. SetDebugScript debug This either turns on or off the script debugger. debug is a Boolean value: TRUE to turn on the debugger; FALSE to turn it off. SetDebugSystem debug This sets whether Citadel's debug mode is on or not. debug is a Boolean value: TRUE to set debug mode on; FALSE to set it off. SetDefDateStamp dstamp This sets the date stamp for unlogged-in users and new users (unless overridden in DEFUSER.CIT). dstamp is a string value giving the new date stamp. SetDefNetPrefix netprefix This sets the net prefix for unlogged-in users and new users (unless overridden in DEFUSER.CIT). netprefix is a string value giving the new net prefix. SetDefRPrompt prompt This sets the room prompt for unlogged-in users and new users (unless overridden in DEFUSER.CIT). prompt is a string value giving the new room prompt. SetDefVDateStamp dstamp This sets the verbose date stamp for unlogged-in users and new users (unless overridden in DEFUSER.CIT). dstamp is a string value giving the new date stamp. SetDialMacro index macro This sets the string used for a dial out mode keyboard macro. index gives the key to set, as per the following table: index Function Key 1 - 12 F1 through F12 13 - 24 Alt+F1 through Alt+F12 25 - 36 Shift+F1 through Shift+F12 37 - 48 Control+F1 through Control+F12 macro is a string value giving the new macro. SetDialPref prefix This sets the dial prefix used for dialing out. prefix is a string value giving the new prefix. SetDialRing command This sets the text sent to the modem in response to a RING signal from the modem. command is a string value giving the new text to send. SetDialSetup command This sets the text to send to the modem to set it up for dialing out. command is a string value giving the new text to send. SetDirPath path This sets the path to use for the default when creating a new directory room. path is a string value giving the new path. SetDiskFree bytes This sets how many bytes that Citadel should try to keep free on disk. When there is less than this amount free, Citadel will stop accepting uploads. bytes is a long value giving the new number of bytes to be kept free. SetDLPath path This sets the path used to store incoming Net 6.9 file transfers. path is a string value giving the new path name. SetDownShift command This sets the string sent to the modem to go back on-line after dropping the speed when using #DUMBMODEM 6 or #DUMBMODEM 7. command is a string value giving the new string to send to the modem. SetDumbModem value This sets how Citadel should handle baud rate detection, as explained in the #DUMBMODEM section of CONFIG.CIT. value is an integer value giving the new method to detect baud rate. SetEnterName string This sets what Citadel prompts for when asking new users for their name. string is a string value giving the new text to use. SetEnterOK value This sets whether unlogged-in users are allowed to enter messages. value is a Boolean value: TRUE if they are allowed to enter messages; FALSE if not. SetEnterSur value This sets whether users are allowed to change their title and surname. value is a Boolean value: TRUE if users should be allowed to change their title and surname; FALSE if not. SetExpire days This sets the number of days to use for expiring incoming network messages. days is an integer value giving the new number of days to use. SetF6Pass password This sets the new F6 password. password is a string value giving the new password to use. (Use an empty string to turn off the password checking.) SetForceLogin value This sets whether users are forced to log in when first calling the system, or if they are given a room prompt without logging in. value is a Boolean value: TRUE if users are forced to log in; FALSE if not. SetForwardSys value This sets whether messages to "Sysop" are delivered to the user specified by #SYSOP in CONFIG.CIT, or if they are left addressed to "Sysop" (which means that any user with Sysop access may read the message). value is a Boolean value: TRUE if the messages should be forwarded to #SYSOP; FALSE if not. SetFuelBarEmpty value This sets what Citadel should display for the empty fuel bar when indexing the message base. value is an integer value giving the ASCII code of the character to use. SetFuelBarFull value This sets what Citadel should display for the full fuel bar when indexing the message base. value is an integer value giving the ASCII code of the character to use. SetHangup command This sets the command used to hang up the modem when using #DUMBMODEM 6 or #DUMBMODEM 7. command is a string value giving the new command to use. SetHangupDelay time This sets the amount of time after telling the modem to hang up before sending more data to it. time is an integer value. If it is zero, then Citadel will wait a half a second after hanging up before sending more data to the modem. If it is non-zero, then it will wait that number of seconds before sending more data to the modem. SetHelpPath path This sets the path Citadel uses to look for help files. path is a string value giving the new path to use. SetHelpPath2 path This sets the alternate path Citadel uses to look for help files. path is a string value giving the new path to use. SetHomePath path This sets the path Citadel uses to look for most of its system files. path is a string value giving the new path to use. SetIdleTimeout timeout This sets the new idle time-out that Citadel uses to determine when it can attempt a Cron event. timeout is an integer value telling the new time- out value, in minutes. SetInitBaud code This sets the speed to initialize the modem at. code is an integer value that determines the speed: code speed 0 300 1 1200 2 2400 3 4800 4 9600 5 19200 6 38400 7 57600 8 115200 SetLApplication value This sets whether Citadel runs the new user application when a new user logs onto the system. value is a Boolean value: TRUE to run the application; FALSE not to run it. SetLClosedSys value This sets whether the system is closed (which means it doesn't accept new users). value is a Boolean value: TRUE to close the system; FALSE to make it open (and thus accept new users). SetLCreate value This sets whether new users are allowed to create accounts. (No, I don't know how this differs from SetLClosedSys, either). value is a Boolean value: TRUE to allow new users to create accounts; FALSE not to allow it. SetLogExtDir path This sets the directory Citadel uses to store log extension files. path is a string value giving the new path to use. SetLQuestionnaire value This sets whether Citadel asks new users for their real name, phone number, address, etc., when logging on. value is a Boolean value: TRUE to ask the questions; FALSE to not ask them. SetLSysMsg value This sets whether Citadel requires new users to leave a message to the sysop when first logging in. value is a Boolean value: TRUE to make them leave a message to the sysop; FALSE to not do it. SetLVerified value This sets whether new users are automatically verified when logging onto the system. value is a Boolean value: TRUE to automatically verify all new users; FALSE to not. SetMaxFiles max This sets the maximum number of files that Citadel can see in a single directory. max is an integer value giving the maximum number. SetMCIDate string This sets the string sent to the user when MCI is turned off and the MCI date command (^AT) is encountered. string is a string value giving the new string to send. SetMCIFirstName string This sets the string sent to the user when MCI is turned off and the MCI first name command (^An) is encountered. string is a string value giving the new string to send. SetMCIName string This sets the string to send to the user when MCI is turned off and the MCI name command (^AN) is encountered. string is a string value giving the new string to send. SetMCIOn value This sets whether MCI is active or not. value is a Boolean value: TRUE to make MCI active; FALSE to turn it off. SetMCIPoop string This sets the string to send to the user when MCI is turned off and the MCI poop command (^Ap) is encountered. string is a string value giving the new string to send. SetMCITime string This sets the string to send to the user when MCI is turned off and the MCI time command (^At) is encountered. string is a string value giving the new string to send. SetMData port This sets the serial port that the modem is attached to. port is an integer value in the range of 1 to 4 to use for the serial port. After a new port is set with this function, use the InitPort function to make it active. SetMessageRoom number This sets the maximum number of messages to allow a user to enter in a single room on a single call. number is an integer value giving the maximum number of messages allowed. SetMinBaud code This sets the minimum speed that the system will accept callers at. code is an integer value giving the speed: code baud 0 300 1 1,200 2 2,400 3 4,800 4 7,200 5 9,600 6 12,000 7 14,400 8 16,800 9 19,200 10 38,400 11 57,600 12 115,200 13 230,400 SetModSetup command This sets the string to send to the modem to set it up. command is a string value giving the new command to use. SetModUnSetup command This sets the string to send to the modem when exiting Citadel. command is a string value giving the new command to use. SetMorePrompt promt This sets the more prompt for unlogged-in users and new users (unless overridden in DEFUSER.CIT). prompt is a string value giving the new more prompt. SetMsgCompress value This sets whether Citadel compresses messages as it saves them. value is a Boolean value: TRUE to compress messages; FALSE to not. SetMsgNym name This sets the singular name of messages on the system. name is a string value giving the new name to use. SetMsgPath path This sets the path that Citadel uses to store the MSG.DAT file. path is a string value giving the new path to use. SetMsgsNym name This sets the plural name of messages on the system. name is a string value giving the new name to use. SetMsgVerb verb This sets the verb to use when saving messages. verb is a string value giving the new verb to use. SetNetMail value This sets whether Citadel should attempt to find the original room for incoming networked mail, or just leave it in the Mail room. value is a Boolean value: TRUE to tell it to attempt to find the original room; FALSE to just place it in Mail. SetNetSurnames value This sets whether Citadel should display surnames on messages that come in over the network. value is a Boolean value: TRUE to display networked surnames; FALSE to not. SetNetTitles value This sets whether Citadel should display titles on messages that come in over the network. value is a Boolean value: TRUE to display networked titles; FALSE to not. SetNewUserApp app This sets the application to run when a new user creates an account. app is a string value giving the application name. SetNodeCountry country This sets the country of the node to save to networked messages. country is a string value giving the new country to use. SetNodeName name This sets the system's name. name is a string value giving the new name to use. SetNodePhone phonenum This sets the system's phone number. phonenum is a string value giving the new phone number to use. SetNodeRegion region This sets the region of the node to save to networked messages. region is a string value giving the new region to use. SetNoPWEcho value This sets what to echo to the user as he enters his password. value is an integer value, corresponding to the values for #NOPWECHO in CONFIG.CIT. SetOffHook value This determines whether to place the modem off- hook while the system is busy doing other things. (This makes the line busy for callers.) value is an integer value: 0 to never place the modem off- hook; 1 to place the modem off-hook when a user is logged in on console or when incorporating network packets; 2 to place the modem off-hook when a user is logged in on console, but not when incorporating network packets. SetOffHookStr command This sets the string to send to the modem to place it off-hook. command is a string value giving the text to send. SetOldCount count This sets the number of messages on the system to make new for new users. count is an integer value giving the number of messages to be new. (Use 0 to make all messages new.) SetOutImpervious This turns off the user's ability to skip output with the Next, Stop, or Jump commands, or to pause it with the Pause command. SetOutNormal This turns on the user's ability to skip output with the Next, Stop, or Jump commands, or to pause it with the Pause command. SetOutNoStop This turns off the user's ability to skip output with the Next, Stop, or Jump commands, but allows it to be paused with the Pause command. SetPoop poop This sets the action of the Q and P keys. poop is an integer value, which may have the same values of #POOP! in CONFIG.CIT. SetPortRate baud This sets the baud rate of the serial port. If baud is omitted, then the port is initialized to the speed given by #INITBAUD in CONFIG.CIT. baud can be 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, or 115200, and Citadel will initialize the port at that rate. Or, it could be a number from 0 to 8, and Citadel will initialize the port as follows: baud speed 0 300 1 1200 2 2400 3 4800 4 9600 5 19200 6 38400 7 57600 8 115200 SetPrinter filename This sets the name of the file to send output to when the printer capture is turned on. filename is a string value giving the name of the file. SetPrinterPrompt value This sets whether Citadel prompts for a new file name every time the Alt+P keystroke is used to start capturing text. value is a Boolean value: TRUE to prompt for a new filename every time; FALSE to just use the filename set by #PRINTER in CONFIG.CIT. SetRandom This reinitializes the random number generator. SetReadAll value This sets who may use the .Read All... (.RA...) commands. value is an integer value, with the same settings as #READALL in CONFIG.CIT. SetReadLUser value This sets if the .Read Group-only Userlog (.RGU) command is allowed or not. value is a Boolean value: TRUE to allow the command; FALSE to not. SetReadOK value This sets whether unlogged-in users may read messages. value is a Boolean value: TRUE to allow them to read; FALSE to not. SetRestoreMode value This sets whether Citadel restores the screen mode after returning from a shell if it has changed. value is a Boolean value: TRUE to restore the screen mode; FALSE to not. SetRoomBypassed index bypass This sets whether a room has been bypassed during the current call or not. index is an integer value that specifies the room to set the bypass flag for. bypass is a Boolean value: TRUE to set the flag; FALSE to clear it. SetRoomInHall hall room inhall This sets whether the room specified by the index room is in the hall specified by the index hall. inhall is a Boolean value: TRUE to place the room in the hall; FALSE to remove it. SetRoomOK value This sets whether non-Aides are allowed to create rooms in halls not explicitly set that users may create rooms. value is a Boolean value: TRUE if non-Aides may create rooms in any halls; FALSE if they may only create rooms in halls that have been explicitly set to allow it. SetRoomPath path This sets the path to store room description files in. path is a string value giving the new path to use. SetScreenSave code value This sets the behavior of the screen saver. code is an integer value telling what to set, as per the following table: 1 The number of minutes before the screen will blank. value is an integer value; use 0 to turn the screen saver off. 2 Whether the screen saver is turned off when Citadel gets a call. value is a Boolean value: TRUE to turn it off, FALSE to leave it on. 3 Whether the screen saver stays turned off for the duration of the call. value is a Boolean value: TRUE to make the screen saver stay turned off for the duration of a call, FALSE to let it turn back on during a call. 4 Whether a clock is displayed on the screen, and how often it moves if it is displayed. value is an integer value: the number of seconds to wait before moving the clock; use 0 to turn off the display of the clock. 5 Whether the cursor stays on when the screen is blanked. value is a Boolean value: TRUE to make the cursor stay on when the screen is blanked, FALSE to turn it off. SetScrollTimeout time This sets the amount of time the scroll-back buffer is displayed with no keyboard activity before turning it off. time is an integer value giving the number of seconds. SetSetCensor value This sets whether users are allowed to set if they wish to view censored messages or not. value is a Boolean value: TRUE to allow users to set this; FALSE to not. SetSetMsgNym value This sets whether Aides are allowed to change the name of messages with the .Aide Name messages (.AN) command. value is a Boolean value: TRUE to allow Aides to change the name of messages; FALSE to not. SetSleepCount value This sets whether to initiate a count-down when users time-out. value is a Boolean value: TRUE to initiate a count-down; FALSE to just hang-up. SetSleepPrompt prompt This sets the text to display to the user when he times out. prompt is a string value giving the text to display. SetSubHubs value This sets how Citadel handles sub-hubs. value is an integer value with the same meaning as #SUBHUBS in CONFIG.CIT. SetSurnames value This determines if surnames are allowed on the system. value is a Boolean value: TRUE to allow surnames; FALSE to not. SetSysopName name This sets the user name of the main sysop on the system. name is a string value giving the name of the sysop. SetTempPath path This sets the path Citadel uses for temporary files. path is a string value giving the name of the new path to use. SetTimeOut time This sets the amount of time users may be idle on the system before they are timed out on. time is an integer value giving the number of minutes to wait. SetTitles value This determines if titles are allowed on the system. value is a Boolean value: TRUE to allow titles; FALSE to not. SetTransPath path This sets the path used for transient network files. path is a string value giving the new path to use. SetTrapFile filename This sets the name of the trap file. filename is a string value giving the new filename to use. SetTwirly string This sets the string used to create the twirly cursor. string is a string value used to set the twirly cursor. The cursor is created by sending each character of the string out one at a time. SetTwirlyPause time This sets the amount of time to wait between sending each character of the twirly cursor out. time is an integer value giving the number of hundredths of a second to wait. SetTwitCountry country This sets the twit country to use for networked messages. country is a string value giving the new twit country. SetTwitRegion region This sets the twit region to use for networked messages. region is a string value giving the new twit region. SetUnlogBal credits This sets the number of credits to assign to unlogged- in users. credits is a long value giving the number of seconds to give to the user. SetUnlogTimeout time This sets the amount of time that unlogged-in users may be idle before the system times out on them. time is an integer value giving the number of minutes. SetUpDay day value This sets whether the system is up on the specified day. day is an integer value ranging from 0 (Sunday) to 6 (Saturday) specifying the day to set. value is a Boolean value: TRUE to make the system active on that day; FALSE to make it inactive. SetUpHour hour value This sets whether the system is up during the specified hour. hour is an integer value ranging from 0 (Midnight) to 23 (11 PM) specifying the hour to set. value is a Boolean value: TRUE to make the system active during that hour; FALSE to make it inactive. SetUserCredits credits This sets the currently logged-in user's credits to the long value credits. Remember that Citadel thinks of credits internally in terms of seconds, not minutes, so this value is the number of seconds, not minutes, to assign to the user. SetUttr attr This sets the attribute (color) to use for underlined text on console. attr is an integer value giving the color code to use. SetWattr attr This sets the attribute (color) to use to display the status line (and all other reverse text) on console. attr is an integer value giving the color code to use. SFormat formatstring codes [var1...var10] This gives replaceable parameters in a format string, formatstring. In addition to standard text, this string contains special codes denoting replaceable parameters: the percent symbol ("%") followed by a single letter. codes includes all letters that are valid in formatstring. var1 through var10 give what to replace the codes with. (You don't need all varx parameters: use only as many as you need. You cannot use more than 10, however.) For example, the following call: #CALL SFormat "Testing %a %b %a %c" "abcd" "string1" "string2" "string3" "string4" Would result in the following string: "Testing string1 string2 string1 string 3" As you can see, you can re-use format codes several times in formatstring, and you don't need to use all the codes. If you want the percent symbol itself to appear in the result string, use two in a row in formatstring: "This is 100%% complete." StartDupCheck This readies the duplicate checking data for use. Call it before using AddDupCheck. To use the duplicate checking functions, start by calling StartDupCheck, which initializes the checking data structures. Then add strings with AddDupCheck. Use CheckForDup to see if a string has been added. When you are finished, call StopDupCheck to free up the memory used by the duplicate checking. StartMessageEditor room This loads the message in the script's message buffer into the message editor and lets the current user edit and save (or abort) it. room is an integer value that specifies the room the message should be entered into, or -1 if it should go to the current room. This returns a Boolean value: TRUE if the message was saved, FALSE if not (either because the user chose Abort or Citadel ran out of memory). StopDupCheck This frees up all memory used for duplicate checking. Call it when you are done duplicate checking. To use the duplicate checking functions, start by calling StartDupCheck, which initializes the checking data structures. Then add strings with AddDupCheck. Use CheckForDup to see if a string has been added. When you are finished, call StopDupCheck to free up the memory used by the duplicate checking. StrfTime formatstring time length This outputs a time formatted like other time strings in Citadel. (See the Time/Date Format Strings section for a full explanation.) formatstring is the string used to format the output, time is the time to format (given as the number of seconds since 12:00AM January 1, 1970, GMT), and length is the maximum allowed length of the resulting string. As a short-cut, you can use the number 0 for time to have Citadel format the current time. StringIsAddress string This returns whether the string specified by string is a valid address on the Citadel network. This does not check for the existence of the address, only if it has a valid format for one. This returns a Boolean value: TRUE if the string is a valid address; FALSE if not. StrPos Wow. TellFile filenumbner This returns the current position of the file pointer in the file given by the integer expression filenumber. The position is returned as an unsigned long value. ThisRoom This returns the current room as an index into the room table. This is returned as an integer value. UserAddKillNode nodename This adds a node-based message exclusion for the user in the script user buffer. nodename is a string value giving the name of the node to exclude. This returns a Boolean value: TRUE if the exclusion could be added; FALSE if not. UserAddKillRegion region This adds a region-based message exclusion for the user in the script user buffer. region is a string value giving the region to exclude. This returns a Boolean value: TRUE if the exclusion could be added; FALSE if not. UserAddKillText text This adds a text-based message exclusion for the user in the script user buffer. text is a string value giving the text to exclude. This returns a Boolean value: TRUE if the exclusion could be added; FALSE if not. UserAddKillUser username This adds a user-based message exclusion for the user in the script user buffer. username is a string value giving the name of the user to exclude. This returns a Boolean value: TRUE if the exclusion could be added; FALSE if not. UserAddWordToDictionary word This adds a word to the personal dictionary of the user in the script user buffer. word is a string value giving the word to add. UserClear This clears the script user buffer, setting all values to their defaults. UserDump This releases the memory used by the script user buffer. UserGetAlias This returns the alias of the user in the script user buffer as a string value. UserGetBirthDate This returns the birth date of the user in the script user buffer as a long value (the time of midnight on the user's birth date). UserGetCallLimit This returns the call-per-day limit of the user in the script user buffer as an integer value. If this returns a 0, then there is no limit for the user. UserGetCallNumber This returns the call number of the user in the script user buffer as a long value. UserGetCallsToday This returns the number of calls during one day (midnight to midnight) of the user in the script user buffer as an integer value. Note that this will return a non-zero number even if the user has not called today: it returns the number of calls the user made during the last day he called. Use UserGetCallTime to determine which day that was. UserGetCallTime This returns the time of the last call of the user in the script user buffer as a long value. UserGetCredits This returns the number of credits of the user in the script user buffer as a long value. Note that Citadel internally stores credits as seconds, not minutes. UserGetDateStamp This returns the date stamp of the user in the script user buffer as a string value. UserGetDefaultHall This returns the default hall of the user in the script user buffer as a string value. UserGetDefaultProtocol This returns the default file transfer protocol of the user in the script user buffer as a string value. Note that only the menu-key letter of the protocol is returned, not the full name. UserGetDefaultRoom This returns the default room of the user in the script user buffer as a string value. Note that the default room is not currently in use. UserGetDL_Bytes This returns the number of bytes the user in the script user buffer has downloaded as a long value. Note that this is not currently in use. UserGetDL_Num This returns the number of files the user in the script user buffer has uploaded as an integer value. Note that this is not currently in use. UserGetFirstOn This returns the time of the first call of the user in the script user buffer as a long value. UserGetForwardAddr This returns the user mail to the user in the script user buffer is forwarded to as a string value. UserGetForwardAddrNode This returns the node mail to the user in the script user buffer is forwarded to as a string value. UserGetForwardAddrRegion This returns the region of the node mail to the user in the script user buffer is forwarded to as a string value. UserGetInitials This returns the initials of the user in the script user buffer as a string value. UserGetKillNode index This returns a node-based message exclusion of the user in the script user buffer as a string value. index is an integer value giving the exclusion number to extract. UserGetKillRegion index This returns a region-based message exclusion of the user in the script user buffer as a string value. index is an integer value giving the exclusion number to extract. UserGetKillText index This returns a text-based message exclusion of the user in the script user buffer as a string value. index is an integer value giving the exclusion number to extract. UserGetKillUser index This returns a user-based message exclusion of the user in the script user buffer as a string value. index is an integer value giving the exclusion number to extract. UserGetLastHall This returns the last hall the user in the script user buffer was in last call as a string value. UserGetLastMessage This returns the message number of the last message on the system during the last call of the user in the script user buffer as a long value. UserGetLastRoom This returns the last room the user in the script user buffer was in last call as a string value. UserGetLinesPerScreen This returns the lines per screen of the user in the script user buffer as an integer value. UserGetLocID This returns the Location Identifier of the user in the script user buffer as a string value. UserGetLogins This returns the number of times the user in the script user buffer has logged in as an unsigned integer value. UserGetMailAddr1 This returns the first line of the mailing address of the user in the script user buffer as a string value. UserGetMailAddr2 This returns the second line of the mailing address of the user in the script user buffer as a string value. UserGetMailAddr3 This returns the third line of the mailing address of the user in the script user buffer as a string value. UserGetMorePrompt This returns the more prompt of the user in the script user buffer as a string value. UserGetName This returns the name of the user in the script user buffer as a string value. UserGetNetPrefix This returns the net prefix of the user in the script user buffer as a string value. UserGetNulls This returns the number of nulls of the user in the script user buffer as an integer value. UserGetNumKillNode This returns the number of node-based message exclusions the user in the script user buffer has defined as a long value. UserGetNumKillRegion This returns the number of region-based message exclusions the user in the script user buffer has defined as a long value. UserGetNumKillText This returns the number of text-based message exclusions the user in the script user buffer has defined as a long value. UserGetNumKillUser This returns the number of user-based message exclusions the user in the script user buffer has defined as a long value. UserGetNumUserShow This returns the number of users to show on log-in of the user in the script user buffer as an integer value. UserGetOccupation This returns the occupation of the user in the script user buffer as a string value. UserGetPassword This returns the password of the user in the script user buffer as a string value. UserGetPasswordChangeTime This returns the time the user in the script user buffer last changed his password as a long value. UserGetPhoneNumber This returns the phone number of the user in the script user buffer as a string value. UserGetPoopcount This returns the poopcount of the user in the script user buffer as a long value. UserGetPosted This returns the total number of messages the user in the script user buffer has posted as a long value. UserGetPromptFormat This returns the room prompt format string of the user in the script user buffer as a string value. UserGetRead This returns the total number of messages the user in the script user buffer as read as a long value. UserGetRealName This returns the real name of the user in the script user buffer as a string value. UserGetRoomNewPointer index This returns the message pointer of the user in the script user buffer as a long value. index is an integer value giving room to get the message pointer of. UserGetSex This returns the sex of the user in the script user buffer as an integer value. This is 0 if the sex has not been specified, 1 if male, or 2 if female. UserGetSignature This returns the signature of the user in the script user buffer as a string value. UserGetSpellCheckMode This returns the spell check mode of the user in the script user buffer as an integer value. UserGetSurname This returns the surname of the user in the script user buffer as a string value. UserGetTitle This returns the title of the user in the script user buffer as a string value. UserGetTotalTime This returns the total amount of time (in seconds) the user in the script user buffer has spent on the system as a long value. UserGetUL_Bytes This returns the total number of bytes the user in the script user buffer has uploaded to the system as a long value. Note that this is not currently in use. UserGetUL_Num This returns the total number of files the user in the script user buffer has uploaded to the system as an integer value. Note that this is not currently in use. UserGetUserDefined code This returns user-defined data for the user in the script user buffer as a string value. code is a string value giving a code used to distinguish the data. With user-defined data, your script can easily store information in each user's data files on disk. Just be sure to pick a unique code so your script does not conflict with other people's scripts. code can be any string up to 30 characters long, so you can do something like use your name followed by a number ("Brent Bottles 1" for example) and be reasonably assured of uniqueness. UserGetVerboseDateStamp This returns the verbose date stamp of the user in the script user buffer as a string value. UserGetWhereHear This returns where the user in the script user buffer heard about the BBS as a string value. UserGetWidth This returns the terminal width of the user in the script user buffer as an integer value. UserIsAccounting This returns whether the user in the script user buffer has accounting turned on as a Boolean value. UserIsAide This returns whether the user in the script user buffer is an aide as a Boolean value. UserIsAutoNextHall This returns whether the user in the script user buffer has auto-next-hall turned on as a Boolean value. UserIsAutoVerbose This returns whether the user in the script user buffer has auto-verbose turned on as a Boolean value. UserIsChat This returns whether the user in the script user buffer can use the Chat (C) command as a Boolean value. UserIsCheckAllCaps This returns whether the user in the script user buffer has spell-checking of words in all caps turned on as a Boolean value. UserIsCheckApostropheS This returns whether the user in the script user buffer has spell-checking of words that end in "'s" turned on as a Boolean value. UserIsCheckDigits This returns whether the user in the script user buffer has spell-checking of words containing digits turned on as a Boolean value. UserIsClearScreenBetweenMessages This returns whether the user in the script user buffer has clear screen between messages turned on as a Boolean value. UserIsConfirmNoEO This returns whether the user in the script user buffer has confirm no .EO when there is an aborted message turned on as a Boolean value. UserIsDefaultHallLocked This returns whether the user in the script user buffer has his default hall locked as a Boolean value. UserIsDownload This returns whether the user in the script user buffer may download as a Boolean value. UserIsDungeoned This returns whether the user in the script user buffer is dungeoned as a Boolean value. Note that this is not currently in use. UserIsEnterBorders This returns whether the user in the script user buffer may enter borders as a Boolean value. UserIsExcludeEncryptedMessages This returns whether the user in the script user buffer has exclusion of encrypted messages turned on as a Boolean value. UserIsExpert This returns whether the user in the script user buffer is an expert as a Boolean value. UserIsForwardToNode This returns whether the user in the script user buffer has forwarding-to-node turned on as a Boolean value. UserIsHideMessageExclusions This returns whether the user in the script user buffer has hiding of message exclusions turned on as a Boolean value. UserIsIBMANSI This returns whether the user in the script user buffer has IBM ANSI turned on as a Boolean value. UserIsIBMColor This returns whether the user in the script user buffer has IBM color turned on as a Boolean value. UserIsIBMGraph This returns whether the user in the script user buffer has IBM graphics characters turned on as a Boolean value. UserIsIBMRoom This returns whether the user in the script user buffer has IBM room prompt characters turned on as a Boolean value. UserIsInGroup index This returns whether the user in the script user buffer is in a group as a Boolean value. index is the group's index. UserIsInRoom index This returns whether the user in the script user buffer is in a room as a Boolean value. index is the room's index. UserIsInuse This returns whether the user in the script user buffer is in use as a Boolean value. UserIsKillNode nodename This returns whether a node is subjected to node-based message exclusion by the user in the script user buffer as a Boolean value. nodename is the name of the node to test. UserIsKillRegion region This returns whether a region is subjected to region-based message exclusion by the user in the script user buffer as a Boolean value. region is the of the region to test. UserIsKillText text This returns whether text is subjected to text- based message exclusion by the user in the script user buffer as a Boolean value. text is the text to test. UserIsKillUser username This returns whether a user is subjected to user- based message exclusion by the user in the script user buffer as a Boolean value. username is the name of the node to test. UserIsLinefeeds This returns whether the user in the script user buffer has linefeeds turned on as a Boolean value. UserIsMail This returns whether the user in the script user buffer may send mail as a Boolean value. UserIsMainSysop This returns whether the user in the script user buffer is the main sysop as set by #SYSOP in CONFIG.CIT as a Boolean value. UserIsMakeRoom This returns whether the user in the script user buffer may make rooms as a Boolean value. UserIsMinibin This returns whether the user in the script user buffer has Minibin usage statistics turned on as a Boolean value. UserIsMusic This returns whether the user in the script user buffer has music turned on as a Boolean value. UserIsNetUser This returns whether the user in the script user buffer has network privileges as a Boolean value. UserIsNode This returns whether the user in the script user buffer is a node as a Boolean value. UserIsOldToo This returns whether the user in the script user buffer has last old on new turned on as a Boolean value. UserIsOut300 This returns whether the user in the script user buffer has 300 baud output simulation turned on as a Boolean value. UserIsPauseBetweenMessages This returns whether the user in the script user buffer has pause-between-messages turned on as a Boolean value. UserIsPermanent This returns whether the user in the script user buffer is permanent as a Boolean value. UserIsPrintFile This returns whether the user in the script user buffer has automatic trap-to-print file turned on as a Boolean value. UserIsProblem This returns whether the user in the script user buffer is a problem user as a Boolean value. UserIsPsycho This returns whether the user in the script user buffer has psycho chicken turned on as a Boolean value. UserIsPUnPauses This returns whether the user in the script user buffer has P Unpauses turned on as a Boolean value. UserIsRoomExcluded index This returns whether the user in the script user buffer has a room excluded as a Boolean value. index is an integer value specifying which room to check. UserIsRoomInPersonalHall index This returns whether the user in the script user buffer has a room in his personal hall as a Boolean value. index is an integer value specifying which room to check. UserIsSurnameLocked This returns whether the user in the script user buffer has his title and surname locked as a Boolean value. UserIsSysop This returns whether the user in the script user buffer is a Sysop as a Boolean value. UserIsTabs This returns whether the user in the script user buffer has tabs turned on as a Boolean value. UserIsTwirly This returns whether the user in the script user buffer has the twirly cursor turned on as a Boolean value. UserIsUnlisted This returns whether the user in the script user buffer is not listed in the userlog as a Boolean value. UserIsUpload This returns whether the user in the script user buffer may upload files as a Boolean value. UserIsUpperOnly This returns whether the user in the script user buffer has upper case only turned on as a Boolean value. UserIsUsePersonalHall This returns whether the user in the script user buffer is using his personal hall as a Boolean value. UserIsUserDefined code This returns whether user-defined data for the user in the script user buffer has been defined as a Boolean data. code is a string value giving a code used to distinguish the data. With user- defined data, your script can easily store information in each user's data files on disk. Just be sure to pick a unique code so your script does not conflict with other people's scripts. code can be any string up to 30 characters long, so you can do something like use your name followed by a number ("Brent Bottles 1" for example) and be reasonably assured of uniqueness. UserIsUserSignatureLocked This returns whether the user in the script user buffer has his signature locked as a Boolean value. UserIsVerboseLogOut This returns whether the user in the script user buffer has verbose log-out turned on as a Boolean value. UserIsVerified This returns whether the user in the script user buffer has been verified as a Boolean value. UserIsViewBorders This returns whether the user in the script user buffer has the display of borders turned on as a Boolean value. UserIsViewCensoredMessages This returns whether the user in the script user buffer has the display of censored messages turned on as a Boolean value. UserIsViewCommas This returns whether the user in the script user buffer has the display of commas as thousands separators in number turned on as a Boolean value. UserIsViewHallDescription This returns whether the user in the script user buffer has the display of hall description files turned on as a Boolean value. UserIsViewRoomDesc This returns whether the user in the script user buffer has the display of room description files turned on as a Boolean value. UserIsViewRoomInfoLines This returns whether the user in the script user buffer has the display of room information lines turned on as a Boolean value. UserIsViewSignatures This returns whether the user in the script user buffer has the display of signatures turned on as a Boolean value. UserIsViewSubjects This returns whether the user in the script user buffer has the display of subjects turned on as a Boolean value. UserIsViewTitleSurname This returns whether the user in the script user buffer has the display of titles and surnames turned on as a Boolean value. UserIsWideRoom This returns whether the user in the script user buffer has wide rooms turned on as a Boolean value. UserIsWordInDictionary word This returns whether a word is in the personal dictionary of the user in the script user buffer as a Boolean value. word is the word to check. UserIsYouAreHere This returns whether the user in the script user buffer has you are here turned on as a Boolean value. UserLoad index This loads a user off disk into the script user buffer. index is an integer value that specifies which user to load. This returns a Boolean value: TRUE if the user could be loaded; FALSE if not. UserRemoveKillNode nodename This removes a node-based message exclusion from the user in the script user buffer. nodename is a string value giving the name of the node to stop excluding. This returns a Boolean value: TRUE if the node could be removed; FALSE if not (most likely, the node wasn't excluded). UserRemoveKillRegion region This removes a region-based message exclusion from the user in the script user buffer. region is a string value giving the name of the region to stop excluding. This returns a Boolean value: TRUE if the region could be removed; FALSE if not (most likely, the region wasn't excluded). UserRemoveKillText text This removes a text-based message exclusion from the user in the script user buffer. text is a string value giving the text to stop excluding. This returns a Boolean value: TRUE if the text could be removed; FALSE if not (most likely, the text wasn't excluded). UserRemoveKillUser username This removes a user-based message exclusion from the user in the script user buffer. username is a string value giving the name of the user to stop excluding. This returns a Boolean value: TRUE if the user could be removed; FALSE if not (most likely, the user wasn't excluded). UserRemoveUserDefined code This removes user-defined data from the user in the script user buffer. code is a string value giving a code used to distinguish the data. With user-defined data, your script can easily store information in each user's data files on disk. Just be sure to pick a unique code so your script does not conflict with other people's scripts. code can be any string up to 30 characters long, so you can do something like use your name followed by a number ("Brent Bottles 1" for example) and be reasonably assured of uniqueness. This returns a Boolean value: TRUE if the data could be removed; FALSE if not (most likely, the data wasn't defined). UserRemoveWordFromDictionary word This removes a word from the personal dictionary of the user in the script user buffer. word is a string value giving the word to remove from the dictionary. This returns a Boolean value: TRUE if the word could be removed; FALSE if not (most likely, the word was not in the user's personal dictionary). UserSave index This saves the user in the script user buffer to disk. index is the position in the log files to save the user. This returns a Boolean value: TRUE if the user could be saved; FALSE if not. UserSetAccounting accounting This sets whether the user in the script user buffer has accounting turned on. accounting is a Boolean value: TRUE to turn accounting on; FALSE to turn it off. UserSetAide aide This sets whether the user in the script user buffer is an aide. aide is a Boolean value: TRUE to make the user an aide; FALSE to make the user not an aide. UserSetAlias alias This sets the alias of the user in the script user buffer. alias is a string value giving the new alias. UserSetAutoNextHall autonexthall This sets whether the user in the script user buffer has auto-next-hall turned on. autonexthall is a Boolean value: TRUE to turn it on; FALSE to turn it off. UserSetAutoVerbose autoverbose This sets whether the user in the script user buffer has auto-verbose turned on. autoverbose is a Boolean value: TRUE to turn it on; FALSE to turn it off. UserSetBirthDate date This sets the birth date of the user in the script user buffer. date is a long value giving the time of midnight on the morning of the user's birth date. UserSetCallLimit limit This sets the call-per-day limit of the user in the script user buffer. limit is an integer value giving the new limit. Use 0 to remove the limit. UserSetCallNumber number This sets the last call number of the user in the script user buffer. number is a long value giving the new call number. UserSetCallsToday calls This sets the number of calls the user in the script user buffer made during the last day that the user called. calls is an integer value giving the number of calls. UserSetCallTime time This sets the time the user in the script user buffer last called. time is a long value giving the time of the last call. UserSetChat maychat This sets whether the user in the script user buffer has access to the Chat (C) command. maychat is a Boolean value: TRUE to let the user chat; FALSE to not. UserSetCheckAllCaps checkcaps This sets whether the user in the script user buffer has checking of words in all-caps turned on in the spell checker. checkcaps is a Boolean value: TRUE to turn on checking of all-caps; FALSE to turn it off. UserSetCheckApostropheS check This sets whether the user in the script user buffer has apostrophe s checking turned on in the spell checker. check is a Boolean value: TRUE to turn on checking; FALSE to turn it off. UserSetCheckDigits check This sets whether the user in the script user buffer has digit checking turned on in the spell checker. check is a Boolean value: TRUE to turn on checking; FALSE to turn it off. UserSetClearScreenBetweenMessages cls This sets whether the user in the script user buffer has clear-screen-between-messages turned on or not. cls is a Boolean value: TRUE to turn it on; FALSE to turn it off. UserSetConfirmNoEO confirm This sets whether the user in the script user buffer has confirm not .EO turned on or not. confirm is a Boolean value: TRUE to turn it on; FALSE to turn it off. UserSetCredits credits This sets the number of credits the user in the script user buffer has in his account. credits is a long value giving the new number of credits. (Remember that Citadel thinks of credits internally in terms of seconds, not minutes.) UserSetDateStamp stamp This sets the date stamp of the user in the script user buffer. stamp is a string value giving the new date stamp. UserSetDefaultHall hallname This sets the default hall of the user in the script user buffer. hallname is a string value giving the name of the new default hall. UserSetDefaultHallLocked locked This sets whether the default hall of the user in the script user buffer is locked or not. locked is a Boolean value: TRUE if the hall is to be locked; FALSE if not. UserSetDefaultProtocol protocol This sets the default file transfer protocol of the user in the script user buffer. protocol is a string value, the first letter of which gives the menu command for the file transfer protocol to be used as default. UserSetDefaultRoom roomname This sets the default room of the user in the script user buffer. roomname is a string value giving the name of the room to make the default room. Note that the default room is not currently in use. UserSetDL_Bytes bytes This sets the number of bytes downloaded by the user in the script user buffer. bytes is a long value giving the new number of bytes downloaded. UserSetDL_Num files This sets the number of files downloaded by the user in the script user buffer. files is an integer value giving the new number of files downloaded. UserSetDownload maydownload This sets whether the user in the script user buffer may download files. maydownload is a Boolean value: TRUE if the user may download; FALSE if not. UserSetDungeoned dungeoned This sets whether the user in the script user buffer is dungeoned or not. dungeoned is a Boolean value: TRUE if the user is dungeoned; FALSE if not. Note that dungeoning currently has no effect. UserSetEnterBorders mayenter This sets whether the user in the script user buffer may enter (change) borders. mayenter is a Boolean value: TRUE if the user may enter borders; FALSE if not. UserSetExcludeEncryptedMessages exclude This sets whether the user in the script user buffer excludes encrypted messages or not. exclude is a Boolean value: TRUE to exclude encrypted messages; FALSE to not. UserSetExpert expert This sets whether the user in the script user buffer is an expert or not. expert is a Boolean value: TRUE if the user is an expert; FALSE if not. UserSetFirstOn time This sets the time the user in the script user buffer was first on the system. time is a long value giving the time. UserSetForwardAddr username This sets the forwarding address of the user in the script user buffer. username is a string value giving the name of the user to forward messages to. UserSetForwardAddrNode nodename This sets the node of the forwarding address of the user in the script user buffer. nodename is a string value giving the name of the node to forward messages to. UserSetForwardAddrRegion region This sets the region of the forwarding address of the user in the script user buffer. region is a string value giving the region of the node to forward messages to. UserSetForwardToNode fwd This sets whether to forward mail to the user in the script user buffer to another node or not. fwd is a Boolean value: TRUE to forward the mail to another node; FALSE to not. UserSetHideMessageExclusions hide This sets whether the user in the script user buffer hides messages exclusions or not. hide is a Boolean value: TRUE to hide the message exclusions; FALSE to not. UserSetIBMANSI ibmansi This sets whether the user in the script user buffer has IBM ANSI turned on or not. ibmansi is a Boolean value: TRUE to set it on; FALSE to set it off. UserSetIBMColor ibmcolor This sets whether the user in the script user buffer has IBM color ANSI turned on or not. ibmcolor is a Boolean value: TRUE to set it on; FALSE to set it off. UserSetIBMGraph ibmgraph This sets whether the user in the script user buffer has IBM graphics characters turned on or not. ibmgraph is a Boolean value: TRUE to set them on; FALSE to set them off. UserSetIBMRoom ibmroom This sets whether to use IBM graphics characters in room prompts for the user in the script user buffer. ibmroom is a Boolean value: TRUE to use them; FALSE to not. UserSetInGroup group ingroup This sets whether the user in the script user buffer is in a group. group is an integer value giving the index of the group. ingroup is a Boolean value: TRUE to place the user in the group; FALSE to remove him. UserSetInitials initials This sets the initials of the user in the script user buffer. initials is a string value giving the new initials. UserSetInRoom room inroom This sets whether the user in the script user buffer is in a room. room is an integer value giving the index of the room. inroom is a Boolean value: TRUE to place the user in the room; FALSE to remove him. UserSetInuse inuse This sets whether the user in the script user buffer is in use or not. inuse is a Boolean value: TRUE to make the user in use; FALSE to not. UserSetLastHall lasthall This sets the last hall the user in the script user buffer was in during the last call. lasthall is a string value giving the name of the hall. UserSetLastMessage msgnumber This sets the last message on the system during the user in the script user buffer's last call. msgnumber is a long value giving the number of the message. UserSetLastRoom lastroom This sets the last room the user in the script user buffer was in during the last call. lastroom is a string value giving the name of the room. UserSetLinefeeds linefeeds This sets whether the user in the script user buffer has linefeeds turned on or not. linefeeds is a Boolean value: TRUE to turn on linefeeds; FALSE to not. UserSetLinesPerScreen lines This sets the number of lines on the screen of the user in the script user buffer. lines is an integer value giving the number of lines. Use 0 to turn off pause-on-full-screen. UserSetLocID locid This sets the Location Identifier of the user in the script user buffer. locid is a string value giving the new Location Identifier. (This is generally used only for nodes.) UserSetLogins number This sets the number of times the user in the script user buffer has logged into the system. number is an integer value giving the number of log-ins. UserSetMail mail This sets whether the user in the script user buffer may leave mail. mail is a Boolean value: TRUE if he may leave mail; FALSE if not. UserSetMailAddr1 addr1 This sets the first line of the mailing address of the user in the script user buffer. addr1 is a string value giving the line. UserSetMailAddr2 addr2 This sets the second line of the mailing address of the user in the script user buffer. addr2 is a string value giving the line. UserSetMailAddr3 addr3 This sets the third line of the mailing address of the user in the script user buffer. addr3 is a string value giving the line. UserSetMakeRoom makeroom This sets whether the user in the script user buffer may make rooms or not. makeroom is a Boolean value: TRUE to allow room creation; FALSE to not. UserSetMinibin minibin This sets whether the user in the script user buffer has Minibin usage statistics turned on or not. minibin is a Boolean value: TRUE if the statistics are on: FALSE if not. UserSetMorePrompt prompt This sets the more prompt of the user in the script user buffer. prompt is a string value giving the new more prompt. UserSetMusic music This sets whether the user in the script user buffer has music turned on or not. music is a Boolean value: TRUE if music is on; FALSE if off. UserSetName name This sets the name of the user in the script user buffer. name is a string value giving the new name to use. UserSetNetPrefix prefix This sets the net prefix of the user in the script user buffer. prefix is a string value giving the new net prefix. UserSetNetUser netuser This sets whether the user in the script user buffer is a net user or not. netuser is a Boolean value: TRUE to make the user a Netuser; FALSE to not. UserSetNode node This sets whether the user in the script user buffer is a node. node is a Boolean value: TRUE to make the user a node; FALSE to not. UserSetNulls nulls This sets the number of nulls for the user in the script user buffer. nulls is an integer value giving the number of nulls. UserSetNumUserShow number This sets the number of users to show on log-in for the user in the script user buffer. number is an integer value giving the number of users to show. UserSetOccupation occupation This sets the occupation of the user in the script user buffer. occupation is a string value giving the occupation. UserSetOldToo oldtoo This sets whether the user in the script user buffer sees the last old message when reading new messages. oldtoo is a Boolean value: TRUE to view last old on new; FALSE to not. UserSetOut300 out300 This sets whether the user in the script user buffer has 300 baud simulation turned on or not. out300 is a Boolean value: TRUE to turn it on; FALSE to not. UserSetPassword password This sets the password of the user in the script user buffer. password is a string value giving the new password to use. UserSetPasswordChangeTime time This sets the time the user last changed his password. time is a long value giving the time. UserSetPauseBetweenMessages pause This sets whether the user in the script user buffer has pause-between-messages turned on or not. pause is a Boolean value: TRUE to pause; FALSE to not. UserSetPermanent permanent This sets whether the user in the script user buffer is permanent or not. permanent is a Boolean value: TRUE to make the user permanent; FALSE to not. UserSetPhoneNumber phonenum This sets the phone number of the user in the script user buffer. phonenum is a string value giving the user's phone number. UserSetPoopcount poopcount This sets the poopcount of the user in the script user buffer. poopcount is a long value giving the new poopcount. UserSetPosted number This sets the number of messages posted by the user in the script user buffer. number is a long value giving the total number of messages posted. UserSetPrintFile printfile This sets whether automatic capture to print file is turned on for the user in the script user buffer. printfile is a Boolean value: TRUE to turn on automatic capture; FALSE to not. UserSetProblem problem This sets whether the user in the script user buffer is a problem user or not. problem is a Boolean value: TRUE to make the user a problem user; FALSE to not. UserSetPromptFormat prompt This sets the room prompt format for the user in the script user buffer. prompt is a string value giving the new room prompt format. UserSetPsycho psycho This sets whether the user in the script user buffer has psycho chicken turned on or not. psycho is a Boolean value: TRUE to turn it on; FALSE to turn it off. UserSetPUnPauses punpauses This sets whether the P key un-pauses for the user in the script user buffer. punpauses is a Boolean value: TRUE to make it un-pause; FALSE to not. UserSetRead number This sets the total number of messages read by the user in the script user buffer. number is a long value giving the number of messages read. UserSetRealName name This sets the real name of the user in the script user buffer. name is a string value giving the new real name. UserSetRoomExcluded room excluded This sets whether the user in the script user buffer has a room excluded or not. room is an integer value giving the room index to set. excluded is a Boolean value: TRUE to exclude the room; FALSE to not. UserSetRoomInPersonalHall room inhall This sets whether a room is in the personal hall of the user in the script user buffer. room is an integer value giving the room index to set. inhall is a Boolean value: TRUE to place the room in the hall; FALSE to remove it. UserSetRoomNewPointer room pointer This sets the new message pointer for the user in the script user buffer in a particular room. room is an integer value giving the room index to set. pointer is a long value, giving the message number of the last old message in the room UserSetSex sex This sets the sex of the user in the script user buffer. sex is an integer value: 0 to make the sex unspecified; 1 to set the sex as male; or 2 to set the sex as female. UserSetSignature signature This sets the user signature of the user in the script user buffer. signature is a string value giving the new signature. UserSetSpellCheckMode mode This sets the spell checker mode of the user in the script user buffer. UserSetSurname surname This sets the new surname for the user in the script user buffer. surname is a string value giving the new surname to use. UserSetSurnameLocked locked This sets whether the title and surname of the user in the script user buffer is locked or not. locked is a Boolean value: TRUE to lock the title and surname; FALSE to unlock them. UserSetSysop sysop This sets whether the user in the script user buffer is a sysop or not. sysop is a Boolean value: TRUE to make the user a sysop; FALSE to not. UserSetTabs tabs This sets whether the user in the script user buffer has tabs turned on or not. tabs is a Boolean value: TRUE to turn tabs on; FALSE to turn them off. UserSetTitle title This sets the title of the user in the script user buffer. title is a string value giving the new title. UserSetTotalTime time This sets the total time spent on the system by the user in the script user buffer. time is a long value giving the total time in seconds. UserSetTwirly twirly This sets whether the user in the script user buffer has the twirly cursor turned on or not. twirly is a Boolean value: TRUE to turn the twirly cursor on; FALSE to turn it off. UserSetUL_Bytes bytes This sets the number of bytes uploaded by the user in the script user buffer. bytes is a long value to use as the new number of bytes uploaded. UserSetUL_Num files This sets the number of files uploaded by the user in the script user buffer. files is an integer value to use as the new number of files uploaded. UserSetUnlisted unlisted This sets whether the user in the script user buffer has an unlisted account or not. unlisted is a Boolean value: TRUE to set the account as unlisted; FALSE to set it as listed. UserSetUpload mayupload This sets whether the user in the script user buffer may upload or not. mayupload is a Boolean value: TRUE if the user may upload; FALSE if not. UserSetUpperOnly upperonly This sets whether the user in the script user buffer has uppercase-only turned on. upperonly is a Boolean value: TRUE to set uppercase-only on; FALSE to set it off. UserSetUsePersonalHall userpersonal This sets whether the user in the script user buffer is set to use his personal hall or not. usepersonal is a Boolean value: TRUE to use the personal hall; FALSE to not. UserSetUserDefined code data This sets user-defined data for the user in the script user buffer. code is a string value giving a code used to distinguish the data. data is a string value which is the actual data to set. With user-defined data, your script can easily store information in each user's data files on disk. Just be sure to pick a unique code so your script does not conflict with other people's scripts. code can be any string up to 30 characters long, so you can do something like use your name followed by a number ("Brent Bottles 1" for example) and be reasonably assured of uniqueness. UserSetUserSignatureLocked lock This sets whether the user in the script user buffer has a locked user signature or not. lock is a Boolean value: TRUE to lock the signature; FALSE to unlock it. UserSetVerboseDateStamp stamp This sets the verbose date stamp for the user in the script user buffer. stamp is a string value to use as the new verbose date stamp. UserSetVerboseLogOut vlogout This sets whether the user in the script user buffer has verbose log-out turned on or not. vlogout is a Boolean value: TRUE to turn it on; FALSE to turn it off. UserSetVerified verified This sets whether the user in the script user buffer is verified or not. verified is a Boolean value: TRUE to verify the user; FALSE to deverify him. UserSetViewBorders viewborders This sets whether the user in the script user buffer views borders and ads or not. viewborders is a Boolean value: TRUE to view borders; FALSE to not. UserSetViewCensoredMessages viewcensored This sets whether the user in the script user buffer views censored messages or not. viewcensored is a Boolean value: TRUE to view censored messages; FALSE to not. UserSetViewCommas commas This sets whether the user in the script user buffer views commas as a thousands separator in numbers or not. commas is a Boolean value: TRUE to view them; FALSE to not. UserSetViewHallDescription desc This sets whether the user in the script user buffer views hall descriptions or not. desc is a Boolean value: TRUE to view hall descriptions; FALSE to not. UserSetViewRoomDesc desc This sets whether the user in the script user buffer views room descriptions or not. desc is a Boolean value: TRUE to view room descriptions; FALSE to not. UserSetViewRoomInfoLines info This sets whether the user in the script user buffer views room information lines or not. desc is a Boolean value: TRUE to view room information lines; FALSE to not. UserSetViewSignatures signatures This sets whether the user in the script user buffer views signatures or not. signatures is a Boolean value: TRUE to view signatures; FALSE to not. UserSetViewSubjects subjects This sets whether the user in the script user buffer views message subjects or not. subjects is a Boolean value: TRUE to view message subjects; FALSE to not. UserSetViewTitleSurname titlesurname This sets whether the user in the script user buffer views titles and surnames or not. titlesurname is a Boolean value: TRUE to view titles and surnames; FALSE to not. UserSetWhereHear wherehear This sets where the user in the script user buffer heard about the system. wherehear is a string value to use as where he heard about it. UserSetWideRoom wideroom This sets whether the user in the script user buffer has wide rooms turned on or not. wideroom is a Boolean value: TRUE to turn on wide rooms; FALSE to turn it off. UserSetWidth width This sets the terminal width of the user in the script user buffer. width is an integer value of the new width of his terminal. UserSetYouAreHere youarehere This sets whether the user in the script user buffer has you are here on or not. youarehere is a Boolean value: TRUE to turn on you are here; FALSE to turn it off. UserStart This allocates a buffer for the script to load, edit, and save users. This returns a Boolean value: TRUE if the buffer could be allocated; FALSE if not (Citadel is out of memory). If there is already a script user buffer, this clears it and sets all values to their default. UserUseCurrentUser This is a short-cut to load the current user into the script's user buffer, instead of having to find the user's index and call UserLoad. WaitFor text timeout This waits for the text given by text to come in over the modem. timeout is the number of seconds to wait before giving up. This returns a Boolean value: TRUE if the text was found; FALSE if not (Citadel timed-out). WriteApl code value This writes something to INPUT.APL. This is a quick-and-dirty way to make a change in Citadel: after the script is finished running, Citadel checks for INPUT.APL and uses the data in it to change its configuration. See the Applications section for full information on this file. code is the INPUT.APL code to write and value is the value to write for the code. This returns a Boolean value: TRUE if the file could be updated; FALSE if it couldn't. WriteBool filenumber value This writes the Boolean value value to the file referenced by the integer value filenumber. WriteChar filenumber value This writes a character with the ASCII value specified by the integer value value to the file referenced by the integer value filenumber. WriteInt filenumber value This writes the integer value value to the file referenced by the integer value filenumber. WriteLong filenumber value This writes the long value value to the file referenced by the integer value filenumber. WriteStr filenumber value terminate This writes the string value value to the file referenced by the integer value filenumber. The string is terminated according to the value of the integer variable terminate: 0 Don't write anything after the string. 1 Write ASCII 0 (NUL) after the string. 2 Write an ASCII 13 (CR) followed by an ASCII 10 (LF) after the string. WriteUInt filenumber value This writes the unsigned integer value value to the file referenced by the integer value filenumber. WriteULong filenumber value This writes the unsigned long value value to the file referenced by the integer value filenumber. Citadel internal functions by function Following is a list of internal functions grouped by function. See the previous topic for details of the functions. Dial. Configuration Debugging AddWatch ClearBreakPoint DebuggingMsg Files ChangeDir CloseFile CountDirectory DeleteFile Messages Networking AddNetIDToNetIDCit AppendToNetCommandReply Users AddUser Rooms Halls Groups AddUser User interaction AskYN Chat ChatReq CheckUserOutControl DecToHex Dial String duplication checking AddDupCheck CheckForDup Miscellaneous AddCommasToNumber ASCIIToChar CharToASCII _Appendix A: Customization If you wish to change the messages that appear when running Citadel, or the dictionary, you will need the Citadel Customization Kit, available from The Anticlimactic Teleservice at (206)562-9792. This section explains how to use the Kit. Note: This section might be too technical for some users. If you don't understand what is being said, please don't attempt to change things, unless you have a backup of everything. By modifying the files described in this document in the wrong way, you can easily make Citadel not run properly or not run at all. If you have any questions, please ask before trying anything. Usually, Citadel reads string information (what it displays to the user) from CTDL.EXE. However, it first looks for a file named CTDL.DAT. If it finds this file, it uses it to load its strings out of. By creating a specialized CTDL.DAT, you can give your board its own special look. However, be warned that doing this once does not mean that you have done it for good: future revisions of Citadel will be looking for different information in the CTDL.DAT file. While most of the strings we add will go after the existing strings, there is no guarantee that we will not change the order of strings. We will not go out of our way to change the data, but we also will not avoid doing it to further enhance Citadel's memory usage. What this means is that you might have to do some extra work next time you update your Citadel software if you want to keep your changes to CTDL.DAT changed. If you make more changes, you will have more work to do when updating than if you don't make as many changes. If you add words to Citadel's spell checker by modifying ENG- AM.DAT, please send us your new dictionary, so we can update the distribution dictionary as well. There are 115,756 words in the dictionary, which includes most of the common words in the English language, but there might be some missing. We don't have the time to add more words, so would appreciate any help we can receive. The CTDL.DAT File Citadel loads various parts of CTDL.DAT into memory when it needs to do certain tasks. For example, a section is loaded into memory when you enter the sysop "Privileged Function" menu, from either F6 or the .Sysop (.S...) command. This section includes all the text of the sysop commands. When you abort out of this menu, the memory is released for other use. Allowing the strings to be in a separate file like this gives two benefits: it lets users modify strings without needing source code to the CTDL.EXE program itself, and it saves memory by not keeping more strings than are needed in memory at a time. (The same memory management is in effect if not running with a CTDL.DAT file: Citadel knows to read only part of CTDL.EXE at a time, just as it reads part of CTDL.DAT at a time.) Citadel refers to different sections in the file by number, and different sub-sections in a section by number. You must have all sections Citadel expects: there is no error checking done when loading data from CTDL.DAT, and a corrupted file or missing sections will cause Citadel to crash (or at least look really funky). For speedy lookup and loading, CTDL.DAT is a binary file. That is, one that you cannot easily edit. A program in the customization kit, CTDLDAT.EXE, reads in a text file (that is, one that you can easily edit) and turns it into CTDL.DAT. This is the same program that we use to create a CTDL.DAT that is combined with CTDL.EXE and distributed as Citadel. Using CTDLDAT.EXE To run CTDLDAT.EXE, you must first have the text file for it to read. By default, this file is called CTDLDATA.DEF, but it can be named anything you desire, by specifying the name on the CTDLDAT command line. That is, to create CTDL.DAT from the CTDLDATA.DEF file, use the following command: C:\CIT>ctdldat If your data is kept in a different file, such as MYCTDL.DEF, then just enter that name on the command line, as follows: C:\CIT>ctdldat myctdl.def CTDLDAT will then read information out of MYCTDL.DEF, not CTDLDATA.DEF. As it runs, CTDLDAT will display exclamation marks and periods, which indicate new sections and sub-sections, respectively. Once all data is read, it reports how much memory is free, then starts writing the data, again displaying exclamation marks and periods. Because much of the data in this file, it takes a while to write it. Any line in the input file that is not understood will simply be ignored by CTDLDAT, and an error message will be displayed to the screen. If you have any of these errors, fix them before trying to run Citadel with the resulting CTDL.DAT file, or it will probably crash. The CTDLDATA.DEF file The general format for the CTDLDATA.DEF file is as follows: VERSION x ENTRY SUBENTRY TYPE DATA ENDSUB ENDENT Any number of SUBENTRY blocks can be in an ENTRY block, and any number of ENTRY blocks can be in a file. But, of course, Citadel expects a certain number of each. The VERSION is a number used by Citadel to check that you are using the correct version of CTDL.DAT. Citadel expects this number to be 1000 times its major version number plus its minor version number. Therefore, Citadel+/065.106 expects this to be 65106. That is, the following line should be in CTDLDATA.DEF: VERSION 65106 Note: Your version of Citadel is not 65.106: use whatever version number that comes with your customization kit. As explained earlier, Citadel refers to entries in CTDL.DAT by number, and subentries within entries by number. This number is the location of the entry block in CTDLDATA.DEF. This means that the order of this file is important, so don't re-order the contents. The currently-defined SUBENTRY types are STRING, STRCMP, STRCMPA, STRCMPK, STRCMPT, STRCMPX, and RAWDATA. STRING and STRCMPx types are tables of strings used by the program (the various STRCMPx types are strings compressed with various algorithms), and RAWDATA is just a list of defined bytes. In future releases of Citadel, more subentry types might be added as needed. There are two basic types of data compression available for strings: STRCMP and STRCMPX. The other types are just slightly modified versions of STRCMP. STRCMPX does not compress as well as the rest, but it decompresses almost instantaneously. Therefore, it is used for sections that are read often while the program is in use. The others are used for data that is not used as often. STRCMPA is optimized for alphabetic characters only; STRCMPK is optimized for characters used in keywords (#, A-Z, 0-9, _, and !); and STRCMPT is optimized for general text (letters, numbers, punctuation, etc.). There are two valid DATA lines for the various STRING subentries: STRING and STRFILE. STRING data lines are written to CTDL.DAT string by string. STRFILE entries tell CTDLDAT to read in a text file, and output each line of the file as a separate string. There are also two valid DATA lines for RAWDATA subentries: DB (Define Byte) followed by a list of numbers showing the value of each byte, and DW (Define Word) followed by a list of numbers showing the value of each word (two bytes). What Citadel expects This is the order of entries and subentries that Citadel+/065.106 expects to find in CTDL.DAT, and thus should be in CTDLDATA.DEF: 1. The first entry is used when configuring, and has the following subentries: 1. Messages used in configuration. 2. CONFIG.CIT keywords. 3. Trap types, for the #TRAP CONFIG.CIT keyword. 4. Default new-user keywords, for the #USER CONFIG.CIT keyword. This section is no longer used, as the #USER keyword has been discontinued. However, it must still exist, as a place holder. 5. System setting keywords, for the #LOGIN CONFIG.CIT keyword. 6. Twit feature keywords, for the #TWIT_FEATURES CONFIG.CIT keyword. 7. Function key names, for the #DIALMACRO CONFIG.CIT keyword. 8. GRPDATA.CIT keywords. 9. EXTERNAL.CIT keywords. 10. Event keywords, for the #EVENT EXTERNAL.CIT keyword. 11. PROTOCOL.CIT keywords. 12. MDMRESLT.CIT keywords. 2. The second entry for general purpose messages, and has the following two subentries: 1. All general-purpose messages. 2. Messages for the F4 screen "doing" message. 3. Messages for writing to the trap file. 3. The third entry is used by the script language interpreter, and has the following subentries: 1. All script language keywords. 2. All internal script functions. 3. Status/error messages used when running scripts. 4. The names of the script commands. 4. The fourth entry is for time/date information, and has the following subentries: 1. Short month names. 2. Long month names. 3. Short day names. 4. Long day names. 5. What to call AM and PM. Note: The month and day names are not only used for output. They also tell Citadel what the names days and months are when reading configuration files, such as CRON.CIT. If you change these subentries, then you will also have to change your configuration files to reflect the different names. 5. This entry is used for networking, and has only one subentry: 1. Messages used when networking. 6. This entry is used for the F6 "Privileged Function" menu, and has only one subentry: 1. Messages used when in the sysop menu. 7. This entry is defined for miscellaneous strings. 1. The command line usage display. 2. The note explaining why you need to run Citadel with the -C command-line parameter. 8. These are the menus used in the Control+F6 console sysop interface. The menus are: 1. The main menu. 2. The hall menu. 3. The hall-room menu. 4. The room menu. 5. The user menu. 6. The group menu. 7. The help menu. 8. Help files menu. 9. DOS menu. 9. This entry is used for setting default user settings. It has only one subentry: 1. All the default user keywords. 10. This entry is used when loading the CRON.CIT file (and, actually, in the .SCL (Sysop Cron List) command.) It has the following two subentries: 1. Cron types, for the #DO CRON.CIT keyword. 2. All CRON.CIT keywords. 11. This entry is used for loading NODES.CIT. 1. All NODES.CIT keywords. 2. The #NETWORK types. 3. Messages used when reading NODES.CIT. 4. The #VERBOSE types. 12. The built-in menus. 1. The #ENTOPT menu. 2. The #KNOWN menu. 3. The #READOPT menu. 4. The #GRPGLOB menu. 5. The #EDIT menu. 6. The #TERMINATE menu. 7. The #SYSNET menu. 8. The #SYSGROUP menu. 9. The #SYSHALL menu. 10. The #SYSENTER menu. 11. The #AIDE menu. 12. The #AIDEQUEUE menu. 13. The #MAINDOT menu. 14. The #DOOR menu. Note that as doors are set up by individual sysops, the default #DOOR menu just alerts the user that the sysop has not set up the #DOOR menu in his CTDL.MNU file. 15. The #CRON menu. 16. The #SYSOP menu. 17. The #MAINOPT menu. 18. The #VOLKSWAGEN menu. 19. The #BULLETINS menu. As this is an optional menu, this is not used, and is only a place- holder. 20. The #INVITE menu. 21. The #FILEQUEUE menu. 22. The #HELP menu. As this is an optional menu, this is not used, and is only a place-holder. 23. The #PERSONAL menu. 24. The #PERSONALADD menu. 25. The #FINGER menu. 26. The #EDITTEXT menu. 27. The #SYSTABLE menu. 28. The #READWC menu. 29. The #ENTERWC menu. 13. This is used when processing network commands. 1. Messages used when processing network commands. 2. Network command names. 14. The built-in blurbs. 1. BULLETIN.BLB. 2. CHAT.BLB. 3. CLOSESYS.BLB. 4. ENTRY.BLB. 5. GOODBYE.BLB. 6. HELLO.BLB. 7. LOGOUT.BLB. 8. NEWMSG.BLB. 9. NEWQUEST.BLB. 10. NEWROOM.BLB. 11. NOCHAT.BLB. 12. NOLOGIN.BLB. 13. PASSWORD.BLB. 14. TEXTUP.BLB. 15. TOOLOW.BLB. 16. USERINFO.BLB. 17 VERIFIED.BLB 18. WARNING.BLB. 19. WCDOWN.BLB. 20. WCUP.BLB. 21. NOROUTE.BLB. 22. CHATTED.BLB. 23. CENSOR.BLB. 24. RESUME.BLB. 25. DISCLAIM.BLB. 26. AD.BLB. 27. NOANSWER.BLB. 28. TOOMANY.BLB. 29. MOREPRMP.BLB. 30. REALNAME.BLB. 31. PHONENUM.BLB. 32. ADDRESS.BLB. 33. NETPREFX.BLB. 34. TIME.BLB. 35. PROMPT.BLB. 36. MSGNYM.BLB. 37. COLORS.BLB. 38. ENTERNYM.BLB. 39. ENCRYPT.BLB. 40. WOWCOUNT.BLB. 41. CALLIMIT.BLB. 42. WIDTH.BLB. 43. LENGTH.BLB. 44. NULLS.BLB. 45. NUMUSERS.BLB. 46. UNLINK.BLB. 15. The built-in help files. 1. ACCOUNT.HLP. 2. AIDE.HLP. 3. ANSI.HLP. 4. CONFIG.HLP. 5. DOHELP.HLP. 6. DOORS.HLP. 7. DOTCMDS.HLP. 8. ENTER.HLP. 9. FILES.HLP. 10. GROUPS.HLP. 11. HALLS.HLP. 12. HELP.HLP. 13. INTRO.HLP. 14. KNOWN.HLP. 15. LOGIN.HLP. 16. MEMBERS.HLP. 17. MESSAGES.HLP. 18. NETWORK.HLP. 19. POLICY.HLP. 20. QUEUE.HLP. 21. READ.HLP. 22. ROOMS.HLP. 23. ROOMSYS.HLP. 24. SPECIAL.HLP. 25. SPELL.HLP. 26. SURNAMES.HLP. 27. SYSOP.HLP. 16. This is the Huffman tree data used for message compression. 1. The Huffman tree data. Don't change this unless you are sure you know what you are doing. 17. Sample .CIT files. 1. EXTERNAL.CIT. 2. NODES.CIT. 3. GRPDATA.CIT. 4. CRON.CIT. 5. MDMRESLT.CIT. 6. PROTOCOL.CIT. 18. Used for ;; commands. 1. An index to all the ;; commands: each subentry following this tells what to display for the ;; commands. After the index, a string with just "#" denotes the end. 2-x The text of the ;; commands. In general, just place the text of the command, then a string with "-end-" at the end tells Citadel that it has come to the end. However, there are two special output types: the looping entry, and the random entry. For the looping entry, place a "#" string. When Citadel gets to this string, it will jump back to the beginning of the entry, and start displaying again. The only way out of this is for the user to use the Stop (S) command. See the ;;GREMCIT entry for an example. For the random entry, start the first line with an asterisk ("*") followed by the number of entries to choose from. Each entry starts with an exclamation mark ("!") as the first character of the line, and goes on until the next line that starts with an exclamation mark. After the last entry, make a string of just "!" to end it. See the ;;GOLTAR entry for an example. 19. Used for the .Volkswagen (.V) command. 1. xxx. The ENG-AM.DAT File As with CTDL.DAT, the ENG-AM.DAT file is a binary file, so Citadel can search it quickly. However, Citadel itself includes the ability to create this file, with either the -o command line parameter or the Configuration option of the main menu of the Control+F6 sysop interface. Choose Compile Dictionary from the menu, and then enter the name of the file to use as the input. Citadel will then compile the dictionary file. For the input file, use ENG-AM.TXT that comes with the customization kit, or create your own file. This file is an alphabetized listing of words, each on its own line separated by CR/LF combinations. If there is some word out of alphabetical order, Citadel will alert you to this, and stop the compilation. _Appendix B: External drivers Note: This section is not required for using Citadel. If you have unusual hardware, and experience writing assembly routines to access it, you can create external drivers that tell Citadel how to access your hardware. Currently, external driver support exists for serial communication, keyboard access, and sound card support. Support for video drivers is planned, but not yet implemented. Citadel's external hardware drivers are actual machine code that access the hardware being supported. Therefore, to create an external hardware driver, you need some method to create machine code. The examples and discussion that follows uses Borland's Turbo Assembler, but you may be able to use other development tools if they are able to create a file of the format needed by Citadel. The driver file must be smaller than 64K, as Citadel loads it into a segment. No segment fix-ups are performed on the file as it is loaded, so don't rely on the file being in any specific segment. The CS register will, naturally, point to the segment Citadel loaded the driver into, and can be used to initialize the DS register to access any memory used by the driver. The general format of the files are as follows: Offset Length Data 0 32 Description. This is a NUL terminated ASCII string that defines the driver in English. This description is displayed as part of the .Read Verbose Status (.RVS) command when the driver is loaded. 32 256 Function offsets. Citadel expects function offsets in this part of the file, two bytes per function. The order of these offsets is defined by what type of driver this is, as explained below. Don't put anything else in this area of the driver, as it may cause unpredictable results in future versions of Citadel. (If, that is, you call a system crash "unpredictable".) 288 variable This is the actual driver code and data, which (of course) is different from driver to driver. All functions should conform to the C calling standard, as is used by Borland C++ 3.x. That is, parameters are passed left to right on the stack, and the calling function is responsible for cleaning up the stack. Integer return values should be placed in the AX register, and long integer return values should be placed in the DX:AX register pair, with DX being the MSW and AX being the LSW. All pointers, both passed and returned, are far pointers. A minimal driver, as coded in Borland's Turbo Assembler, would look like this: ; skeleton hardware driver for citadel ideal model large, c codeseg org 0 desc db 'Skeleton Hardware Driver' db 32 - ((offset $ - offset desc)) dup(0) ; filler for alignment dw offset function ; our function dw 127 dup (0) ; 128 total entries reserved proc function ret endp end This shows all the major components of a Citadel hardware driver: the description string, a function offset, space for up to 128 offsets total, and a function. This skeleton is essentially unchanged for all drivers. What does change from driver to driver is, of course, the functions. Perhaps the best way to show the functions of the different drivers is with example source code. The following code implements a skeleton driver for serial communications, a full driver for use with the IBM PC keyboard, and a full driver for use with the Sound Blaster sound card. In the serial driver, the only non-obvious part is the parameters for the init_port function, which are as follows: Port (0 to 3) 0 = COM1 1 = COM2 2 = COM3 3 = COM4 Baud (0 to 11 (0Bh)) 0 = 110 1 = 150 2 = 300 3 = 600 4 = 1200 5 = 2400 6 = 4800 7 = 9600 8 = 19200 9 = 38400 A = 57600 B = 115200 Stops (0 to 1) 0 = 1 stop bit 1 = 2 stop bits Parity (0 to 3) 0 = none 1 = odd 2 = none 3 = even Len (0 to 3) 0 = 5 bits, 1 = 6 bits, 2 = 7 bits, 3 = 8 bits cCTS 0 = no check 1 = check CTS on output ; skeleton com driver for citadel ideal model large, c codeseg org 0 desc db 'Skeleton Com Driver' db 32 - ((offset $ - offset desc)) dup(0) ; filler for alignment dw offset init_port ; open port with params dw offset close_port ; close port dw offset ring_detect ; is the RI line active? dw offset have_carrier ; is the CD line active? dw offset mi_ready ; do we have stuff waiting? dw offset ib_flush ; flush the input buffer dw offset get_input ; get the next thing waiting dw offset put_output ; send this character... dw offset set_dtr ; raise or drop it dw offset ob_flush ; flush output buffer dw 118 dup (0) ; 128 total entries reserved ; ---------------------------------------------------------- ------------ proc init_port port:word, baud:word, stops:word, parity:word, len:word, cCTS:word ret endp ; ---------------------------------------------------------- ------------ proc close_port ret endp ; ---------------------------------------------------------- ------------ proc ring_detect xor ax, ax ret endp ; ---------------------------------------------------------- ------------ proc have_carrier xor ax, ax ret endp ; ---------------------------------------------------------- ------------ proc mi_ready xor ax, ax ret endp ; ---------------------------------------------------------- ------------ proc ib_flush ret endp ; ---------------------------------------------------------- ------------ proc get_input ret endp ; ---------------------------------------------------------- ------------ proc put_output char:byte ret endp ; ---------------------------------------------------------- ------------ proc set_dtr setit:word ret endp ; ---------------------------------------------------------- ------------ proc ob_flush ret endp end In the keyboard driver, the init_kbd and close_kbd are often not used. get_kbd returns ASCII 0 to 255 for normal key presses. For extended key presses, it sets the LSB to 0 and the MSB to the IBM keyboard scan code for the key. sp_press is used only to turn off the screen blanker when a special key is pressed. If you cannot support the function with your hardware, don't worry; it is not needed for the operation of Citadel. ; skeleton kbd driver for citadel ideal model large, c codeseg org 0 desc db 'Skeleton Keyboard Driver' db 32 - ((offset $ - offset desc)) dup(0) ; filler for alignment dw offset init_kbd ; open kbd dw offset close_kbd ; close kbd dw offset stat_kbd ; are there keys waiting? dw offset get_kbd ; get key dw offset sp_press ; special (alt, shift, ctl) pressed? dw 123 dup (0) ; 128 total entries reserved ; ---------------------------------------------------------- ------------ proc init_kbd ret ; Nothing special for IBM PC endp ; ---------------------------------------------------------- ------------ proc close_kbd ret ; Nothing special for IBM PC endp ; ---------------------------------------------------------- ------------ proc stat_kbd mov ah, 1 ; read keyboard status int 16h ; BIOS keyboard service jnz Char ; is there a character? xor ax, ax ; no character, return zero ret Char: mov ax, 1 ; character, return non zero ret endp ; ---------------------------------------------------------- ------------ proc get_kbd mov ah, 0 ; read keyboard character int 16h ; BIOS keyboard service or al, al ; extended character? je Extended xor ah, ah ; no, zero high byte Extended: ret endp ; ---------------------------------------------------------- ------------ proc sp_press xor ax, ax mov es, ax mov di, 417h mov ax, [es:di] and ax, 0f00fh ret endp end Sound card support is, obviously, not integral to BBS software. Because of this, the sound options in Citadel are mostly supported only through script files. The only exception to this is speech synthesizer support, which can be toggled on for anything being output by Citadel. The reason for including this driver's source code is to provide sample code for a somewhat complex driver, which might be beneficial for generating ideas of how to implement some other driver. There are a few tricks in this driver that might not be totally obvious, but are helpful when developing drivers. While many more functions are implemented in the Sound Blaster driver, the only ones currently used by Citadel are init_sound, close_sound, play_sound, and say_ASCII. The format for future sound drivers may have different or changed functions. The reason for this is that the current driver specification is very much tailored to one specific sound card: the Sound Blaster. If a sound driver is written for another card, the specification may need to be changed slightly to support it. If you want to implement a driver for some other sound hardware, and find that you need to change the specification for it to work well, contact Anticlimactic Teleservices. We can then work with you to provide services in Citadel that work with your driver. Even if you don't need to change the driver format, it would be best to contact Anticlimactic Teleservices if you plan to implement a sound driver, to be sure that it has not changed since this documentation was written. ; sound blaster sound driver for citadel ; -- sbsim is used for interface to hardware ideal model large, c codeseg org 0 desc db 'Citadel Soundblaster 1.00' db 32 - ((offset $ - offset desc)) dup(0) ; filler for alignment dw offset init_sound ; init driver dw offset close_sound ; close driver dw offset get_version ; get sbsim version dw offset query_drivers ; which are loaded? dw offset query_status ; which are currently active? dw offset start_snd_src ; wow dw offset play_sound ; wow dw offset stop_sound ; wow dw offset pause_sound ; wow dw offset resume_sound ; wow dw offset read_snd_stat ; wow dw offset set_midi_map ; wow dw offset get_src_vol ; wow dw offset set_src_vol ; wow dw offset set_fade_pan ; wow dw offset strt_fade_pan ; wow dw offset stop_fade_pan ; wow dw offset pse_fade_pan ; wow dw offset res_fade_pan ; wow dw offset read_fade_pan ; wow dw offset get_pan_pos ; wow dw offset set_pan_pos ; wow dw offset say_ASCII ; wow dw 105 dup (0) ; 128 total entries reserved talk db 0 talkadr dd 0 talkbuf dd 0 proc do_int near db 0cdh ; int dvr_int db 0 ret endp ; ---------------------------------------------------------- ------------ proc init_sound cmp [dvr_int], 0 ; already initialized? jne is_ret mov bx, 7fh * 4 ; offs of first sbsim int - 1 xor ax, ax ; segment of ivt wrong_int: add bx, 4 ; next int offset cmp bx, 0c0h * 4 jae no_int mov es, ax ; and segment mov dx, [es:bx+2] ; segment in dx mov es, dx ; then es... [es:103h] is signature cmp [word ptr es:103h], 'BS' jne wrong_int cmp [word ptr es:105h], 'IS' jne wrong_int cmp [byte ptr es:107h], 'M' jne wrong_int shr bx, 1 shr bx, 1 mov [dvr_int], bl jmp short sbtalker no_int: mov [dvr_int], 0 ; look for sbtalker sbtalker: mov [talk], 0 mov dx, [es:0bch] ; int 2f segment or dx, dx jz is_ret mov es, dx mov ax, 0fbfbh int 2fh or ax, ax jnz is_ret mov ax, [es:bx+4] mov dx, [es:bx+6] mov [word ptr talkadr], ax mov [word ptr talkadr+2], dx add bx, 20h mov [word ptr talkbuf], bx mov [word ptr talkbuf+2], es mov [talk], 1 is_ret: mov al, [dvr_int] mov ah, 0 ret endp ; ---------------------------------------------------------- ------------ proc close_sound mov [dvr_int], 0 mov [talk], 0 xor ax, ax ret endp ; ---------------------------------------------------------- ------------ proc get_version xor ax, ax cmp [dvr_int], 0 je gv_ret xor bx, bx call do_int gv_ret: ret endp ; ---------------------------------------------------------- ------------ proc query_drivers xor ax, ax cmp [dvr_int], 0 je qd_ret mov bx, 1 call do_int qd_ret: ret endp ; ---------------------------------------------------------- ------------ proc query_status xor ax, ax cmp [dvr_int], 0 je qs_ret mov bx, 3 call do_int qs_ret: ret endp ; ---------------------------------------------------------- ------------ proc start_snd_src which:byte, what:dword mov ax, -1 cmp [dvr_int], 0 je sss_ret mov bh, [which] mov bl, 0 mov ax, [word ptr what] mov dx, [word ptr what+2] push ds mov ds, dx call do_int pop ds sss_ret:ret endp ; ---------------------------------------------------------- ------------ proc play_sound which:byte mov ax, -1 cmp [dvr_int], 0 je ps_ret mov bh, [which] mov bl, 1 call do_int ps_ret: ret endp ; ---------------------------------------------------------- ------------ proc stop_sound which:byte mov ax, -1 cmp [dvr_int], 0 je ss_ret mov bh, [which] mov bl, 2 call do_int xor ax, ax ss_ret: ret endp ; ---------------------------------------------------------- ------------ proc pause_sound which:byte mov ax, -1 cmp [dvr_int], 0 je pse_ret mov bh, [which] mov bl, 3 call do_int xor ax, ax pse_ret:ret endp ; ---------------------------------------------------------- ------------ proc resume_sound which:byte mov ax, -1 cmp [dvr_int], 0 je rs_ret mov bh, [which] mov bl, 4 call do_int xor ax, ax rs_ret: ret endp ; ---------------------------------------------------------- ------------ proc read_snd_stat which:byte mov ax, -1 cmp [dvr_int], 0 je rss_ret mov bh, [which] mov bl, 5 call do_int rss_ret:ret endp ; ---------------------------------------------------------- ------------ proc set_midi_map map:word mov ax, -1 cmp [dvr_int], 0 je smm_ret mov bx, 0506h mov ax, [map] call do_int xor ax, ax smm_ret:ret endp ; ---------------------------------------------------------- ------------ proc get_src_vol which:word xor ax, ax cmp [dvr_int], 0 je gsv_ret mov bx, 0400h mov ax, [which] call do_int gsv_ret:ret endp ; ---------------------------------------------------------- ------------ proc set_src_vol which:word, vol:word mov ax, -1 cmp [dvr_int], 0 je ssv_ret mov bx, 0401h mov ax, [which] mov dx, [vol] call do_int ssv_ret:ret endp ; ---------------------------------------------------------- ------------ proc set_fade_pan fps:dword mov ax, -1 cmp [dvr_int], 0 je sfp_ret mov bx, 0410h mov ax, [word ptr fps] mov dx, [word ptr fps+2] call do_int sfp_ret:ret endp ; ---------------------------------------------------------- ------------ proc strt_fade_pan mov ax, -1 cmp [dvr_int], 0 je bfp_ret mov bx, 0411h call do_int bfp_ret:ret endp ; ---------------------------------------------------------- ------------ proc stop_fade_pan which:word mov ax, -1 cmp [dvr_int], 0 je tfp_ret mov bx, 0412h mov ax, [which] call do_int tfp_ret:ret endp ; ---------------------------------------------------------- ------------ proc pse_fade_pan mov ax, -1 cmp [dvr_int], 0 je pfp_ret mov bx, 0413h call do_int pfp_ret:ret endp ; ---------------------------------------------------------- ------------ proc res_fade_pan mov ax, -1 cmp [dvr_int], 0 je rfp_ret mov bx, 0414h call do_int rfp_ret:ret endp ; ---------------------------------------------------------- ------------ proc read_fade_pan which:word mov ax, -1 cmp [dvr_int], 0 je dfp_ret mov bx, 0415h mov ax, [which] call do_int dfp_ret:ret endp ; ---------------------------------------------------------- ------------ proc get_pan_pos which:word mov ax, -1 cmp [dvr_int], 0 je gpp_ret mov bx, 0416h mov ax, [which] call do_int gpp_ret:ret endp ; ---------------------------------------------------------- ------------ proc set_pan_pos which:word, pos:word mov ax, -1 cmp [dvr_int], 0 je spp_ret mov bx, 0417h mov ax, [which] mov dx, [pos] call do_int spp_ret:ret endp ; ---------------------------------------------------------- ------------ proc say_ASCII uses si di, what:dword, len:byte mov ax, -1 cmp [talk], 0 je sa_ret mov es, [word ptr talkbuf+2] mov di, [word ptr talkbuf] mov al, [len] stosb push ds mov ds, [word ptr what+2] mov si, [word ptr what] mov cl, al mov ch, 0 rep movsb pop ds mov ax, 707h call [talkadr] xor ax, ax sa_ret: ret endp end If you do create a driver for some specialized hardware, we would like to distribute it with future releases of Citadel. This way, we can support a wider variety of hardware than we currently do. Of course, full credit will be given to you as the author of the driver. _Appendix C: FOSSIL support Citadel's internal serial support is quite robust, so most people will not need to use FOSSIL drivers. If, however, you have non-standard serial hardware, or some other desire to use FOSSIL drivers, support is provided through Citadel's external hardware drivers. The driver, called FOSSIL.ECD, is loaded by creating a HARDWARE.CIT file in Citadel's #HOMEPATH (as set in CONFIG.CIT) which contains the following line: #COMDRIVER FOSSIL You will also need to place the FOSSIL.ECD driver in #HOMEPATH. Citadel will then use the routines in the FOSSIL driver for serial I/O, beginning with the next time Citadel is loaded. When running with the FOSSIL driver, there is at least one limitation. While Citadel's internal serial routines can handle up to 115,200 baud, the FOSSIL standard is limited to 38,400 baud. This is usually not a problem, but something to be aware of. If you tell Citadel to initialize the port at 115,600 baud or 57,800 baud, it will think it was successful; the FOSSIL driver hides the 38,400 baud limit from Citadel. Nothing will go wrong, you will just have a slower port rate. If Citadel does not seem to be using your FOSSIL driver, first use the .Read Verbose Status (.RVS) command in Citadel. In the "System Status / Debugging" section, it should mention that you are using the FOSSIL External Communications Driver. If it does not, then the problem is either in the HARDWARE.CIT file, or the FOSSIL.ECD file is not in Citadel's #HOMEPATH. If the driver is being loaded, then you should check your FOSSIL driver's configuration. _Appendix D: Sound Blaster If you wish to have Sound Blaster support on the console system, you will need the Citadel Sound Blaster Extensions, available from The Anticlimactic Teleservice at (206)562- 9792. This section explains how to use the Extensions. Sound capabilities are enabled in Citadel by loading an External Sound Driver (.ESD) driver. This is specified in the HARDWARE.CIT file. To add the Sound Blaster driver, include the following line: #SNDDRIVER SB In addition, Creative Lab's SBSIM driver must be loaded to use the Sound Blaster support provided through the SB.ESD driver. As sound support is not integral to a BBS, there are no hooks in Citadel specific to using the Sound Blaster. The only support for sound is through Citadel's script language. By linking script files to play certain sounds with system events with the #EVENT keyword in EXTERNAL.CIT, you can have a fair amount of control over sounds on console. The #EVENT keyword tells Citadel to run an application every time a specific system event occurs. The EXTADD.TXT file contains the #EVENT lines to add to your EXTERNAL.CIT file. The .VOC files contain the sounds to be played and should be placed in Citadel's #HOMEPATH as set in CONFIG.CIT. The .CSF files are the Citadel Script Files that are referenced by the #EVENT lines in EXTADD.TXT and call the various .VOC files. They should also be placed in #HOMEPATH. After making these changes, start Citadel, and sounds should start working. If no sound is generated, first check the obvious problems (sound on the Sound Blaster is turned down, the speakers are not turned on or plugged in, etc.). If everything looks good, use the .Read Verbose Status (.RVS) command in Citadel. In the "System Status / Debugging" section, it should mention that you are using the External Sound Driver for Sound Blaster. If it does not, then the problem is in the HARDWARE.CIT file, or that the SB.ESD file is not in #HOMEPATH. If Citadel says that it is using the Sound Blaster driver, then it may be that you forgot to load the SBSIM driver that comes with the Sound Blaster. This driver is required for the SB.ESD driver to work. _Appendix E: Citadel BBSes Like any BBS list, this list is incomplete, and probably somewhat inaccurate. It is not meant as an absolute reference of boards, but a sampling of BBSes that you can call to see Citadel+ in action. Anticlimactic Teleservices does not necessarily recommend any BBSes by inclusion on this list. It is for informational purposes only, and opinions of individual sysops and users are not necessarily those of Anticlimactic Teleservices. We were not able to verify the existence of nodes marked with a "?" character. Name Phone Number Speed Hours Amber (206)861-7829 300-14.4 v.32bis 24 hours The Anticlimactic Teleservice (206)562-9792 300-9600 v.32 24 hours ?The Asylum (206)244-2350 300-14.4 v.32bis? ? The Basement (206)488-6337 300-2400 24 hours Black Mountain (206)599-0903 ??? 24 hours Blain's World (Not!) (206)380-2236 300-2400 9:30pm-7am PT Blind Man's Bluff (206)823-3744 300-14.4 v.32bis 24 hours Bypass' Sideband Alley (206)243-8977 300-2400 24 hours Cave Bear's Laire (206)630-9863 300-14.4 v.32bis 24 hours A Clockwork Orange (206)486-6527 300-2400 24 hours ?Cod's World (206)939-5857 300-1200 24 hours ?The Coffee Connection (206)367-6443 300-14.4 v.32bis 24 hours Columbia Crest (206)786-9248 300-2400 24 hours ?Desolation Row (410)730-0231 ? ? Digital Free America (816)563-6810 300-14.4 v.32bis 24 hours ?The Dragon's Laire (509)925-5745 300-14.4 v.32bis 24 hours The Dream Realm (214)436-3881 300-14.4 v.32bis 24 hours ?Dystopia ][ (206)734-4636 300-14.4 v.32bis 24 hours Fort Blatherskite (206)542-2774 300-14.4 v.32bis? 24 hours Gateway to Reality (206)547-2331 300-2400 24 hours The Ghetto (206)364-2514 300-14.4 v.32bis 24 hours ?The Hermitage (206)347-7306 ? 24 hours The Institute (916)635-1453 300-2400 24 hours Isles of Ether (206)725-1048 300-14.4 v.32bis 24 hours ?Line Noize (206)384-4133 ??? 24 hours Lost Archives (206)366-5102 300-14.4 v.32bis 24 hours The Lost Ideas (916)452-1332 300-14.4 v.32bis 24 hours ?Masquerade (206)485-8463 1200-2400 24 hours Memory Alpha (206)859-6200 1200-14.4 v.32bis 24 hours Miscellaneous Debris (916)773-2417 1200-2400 24 hours the Modern Imagination BBS (916)349-9352 1200-14.4 v.32bis 24 hours Mostly Harmless (206)883-1383 300-14.4 v.32bis 24 hours The Netherworld (403)329-8905 ? 8p-6a MT ?The Oasis (206)534-9928 300-14.4 v.32bis 24 hours The Ocean (916)368-7661 300-2400 24 hours Outsider's (301)587-5922 300-14.4 v.32bis 24 hours Palace of Miniken (206)820-8424 300-2400 24 hours The Raft (206)861-9936 300-14.4 v.32bis 24 hours Simple Treasures (206)939-3998 300-2400 7p- 7a; 24 Sun & Holidays PT Slumberland (206)547-2629 300-9600 v.32 24 hours St. Dismas' Infirmary (301)434-0867 ? 24 hours Star Fleet Academy (206)491-9605 300-14.4 v.32bis 24 hours Starship Inconnu (206)661-3664 300-14.4 v.32bis 24 hours Succulent Shrimp BBS (214)503-1772 ? 24 hours ?Suck My Duck (206)475-8399 300-2400 24 hours This Twilight Garden (206)488-4371 300-14.4 v.32bis 23 hours Too Dark Park (206)869-3809 300-14.4 v.32bis 24 hours Toys in the Attic (206)582-7476 ??? 24 hours Vulgar Display of Power (206)882-0551 300-2400 24 hours ?Your Name Here (206)564-5303 300-14.4 v.32bis 24 hours ?The Wall (206)255-4682 300-14.4 v.32bis 24 hours ?The Wind (206)589-1733 300-2400 24 hours _Appendix F: Credits Citadel has been worked on by many people over several years, so it is impossible to give credit to everybody who has made a contribution to this program; memories fade, and not everything is written down. So, this list is not at all a complete list of people who have played a role in bringing the software to where it is today. But, it is nice to give some credit to people who played a part in Citadel's history. A historically minded person may wish to study the various Citadel history documents that can be found lurking on many Citadel user's hard disks, or stored on some forgotten floppy disk. However, I am not such a person, so I have not spent time verifying the accuracy of this information; it is just a list of a few people who have been involved, as I remember it, from either being there or reading one of the various Citadel history documents. This history ends with a brief description of the people currently working on Citadel. The first person that should be mentioned, of course, is Cynbe ru Taren, the original author of Citadel. His version was quite a bit less powerful than modern versions of Citadel, and much rougher around the edges, but it is thanks to him that Citadel was written in the first place. Though there is probably not much of his original code left, it is ideas that make a program what it is, not code. His idea of a simple interface to a message oriented board is still what drives Citadel development today. It is hard to decide if David Bonn or Hue A. White, Jr., is the next name that should be mentioned here. David Bonn worked on a program derived from Citadel called Stonehenge, which was a commercial program that met limited success in the Seattle area in the mid-1980s. This program introduced many of the ideas that exist in Citadel now, halls and groups being the most noticeable. However, Citadel is not based, code-wise, on David Bonn's Stonehenge code; it derives from Hue A. White's Citadel-86 code. Matt Pfleger used Citadel-86 as a launching point in his effort to clone Stonehenge in a free BBS. His version of Citadel cloned almost every feature in Stonehenge, and added quite a few of its own. It also implemented many features that were in Stonehenge in a better way. The only feature not cloned by Matt was networking. Stonehenge networking had some conceptual errors in it, so he did not want to copy it exactly. He also did not like Citadel-86's networking protocol, which he had long since removed from Citadel. He was trying to develop a better method of networking, but never did finish. In the late 1980s, he abandoned Citadel development when Peter Torkleson (The Dragon) started active development with an older version of Matt's source code. This program was developed into the very early 1990s, and was named Dragon's Citadel. Major enhancements added during this time include networking, ANSI support, and applications. But, like many Citadel authors before him, Peter abandoned Citadel. At this point, Matt Pfleger almost immediately took Peter's latest source code, and started development on it again. Matt is currently joined by four other people. The current people working on Citadel in one form or another are (in reverse alphabetical order) Matt Pfleger, Elisabeth Perrin, Don Kimberlin, Richard Finegold, and Brent Bottles. The five of us have been involved in computers, BBSes, and Citadel for several years and bring a wide variety of backgrounds to the project. This combination of talent and vision comes together to bring you the best Citadel BBS in existence. _Appendix G: Data Files Citadel stores information it needs to run in two different types of files: data files and table files. Data files have the extension .DAT and table files have the extension .TAB. Table files change often, and even between the Auxmem version and Regular version of the program. Because of this, and because there is little reason to know what is in a table file, we will not go into the specifics of tables. Data files change too, but in predictable ways. This is how Citadel is able to convert data files when you upgrade to a new version. All multi-byte integers are stored in Intel-standard format; that is, least significant byte first, most significant byte last. All strings are stored in C-standard format; that is a string of ASCII characters followed by a nul (ASCII 0) byte. Bit fields are stored in whatever direction that Borland C++ stores them; I don't know what order they are stored in, but I do know that it allocated 16 bits at a time. Time is stored as the UNIX standard: the number of seconds since 12:00:00 AM, January 1, 1970. GMT. In general, the data files start with a four-byte long integer that tells how long each record in the file is, in bytes. After this, each record is saved to the file in sequential order. This does not hold true to the secondary data files (those with a number in their names), the message file (MSG.DAT), or log extension files (LE*.DAT). When Citadel loads, it looks at this value, and uses it to ensure that the data files are the proper length. If the record size stored to the data file is too small, Citadel converts the file by adding the correct number of bytes to the end of each record, all cleared to 0. If the record size stored in the data file is too big, Citadel removes that many bytes from the end of each record. Because of this, Citadel can convert data files from previous versions to the current version, and from future versions back to the current version. Also, because of this, new fields are added to data files only at the end of the records. Some data files are split into many parts. (The log file, for example, is in six parts.) This is to facilitate automatic resizing of data files when values are changed in CONFIG.CIT: the LOG6.DAT file, for example, depends on both #MAXLOGTAB and #MAXROOMS to set how big it is. Citadel can look at the size of LOG.DAT and ROOM.DAT to see the previous settings of #MAXLOGTAB and #MAXROOMS, respectively, and use that to resize LOG6.DAT correctly. What follows are the specifics of each data file, correct as of Version 65 alpha 77. The userlog files The userlog is split into six parts, with each user also having a possible log extension file. LOG.DAT stores the bulk of the information for each user; LOG2.DAT stores which groups each user is a member of; LOG3.DAT stores which rooms each user has access to; LOG4.DAT stores which rooms each user has excluded; LOG5.DAT stores the last-message-read pointer for each room; LOG6.DAT stores which rooms are in each user's personal hall; and the log extension files store things that might change in number, such as words in the personal dictionary, message exclusion, and the like. LOG.DAT The LOG.DAT file starts with a four-byte long integer that stores the length of each record, as explained above. After that, each record is saved sequentially, which is as follows: Offset Length Name Description 0 31 UserName Name of the user. 31 31 Initials Initials used to log in. 62 31 Password Password used to log in. 93 31 ForwardAddr Name to forward mail to. 124 31 ForwardNode Node to forward mail to. (See FwdToNode, below.) 155 31 Surname User's surname. 186 31 Title User's title. 217 1 Reserved_0 Set to 0. 218 2 Reserved_1 Set to 0. 220 1 Nulls Number of nulls to send. 221 1 Width Terminal width. 222 4 CallTime Time of last call. 226 4 CallNumber Caller number of last call. 230 4 Credits Number of seconds left in the user's account. Note that this is not what Citadel displays: it converts to minutes first. 234 4 LastPointer The newest message at the time of the last call. 238 4 Reserved_2 Set to 0. 242 1 LinesPerScreen For screen pause; 0 for off. 243 1 AttrNormal Attribute for Normal text. 244 1 AttrBlink Attribute for Blinking. 245 1 AttrInv Attribute for Inverse. 246 1 AttrBold Attribute for Bold. 247 1 AttrUnderline Attribute for Underline. 248 1 DefProtocol First letter of default protocol. 249 64 PromptFmt Room prompt format string. 313 64 TimeStamp Time stamp format string. 377 64 VTimeStamp Verbose time stamp format string. 441 91 Signature User's signature. 532 31 NetPrefix User's net prefix. 563 31 Address1 First line of user's mailing address. 594 31 Address2 Second line of user's mailing address. 625 31 Address3 Third line of user's mailing address. 656 4 Alias User's alias. 660 5 Region User's region. 665 1 Reserved_3 Set to 0. 666 4 DLBytes Number of bytes downloaded. (Not in use.) 670 4 ULBytes Number of bytes uploaded. (Not in use.) 674 2 DLNumber Number of files downloaded. (Not in use.) 676 2 ULNumber Number of files uploaded. (Not in use.) 678 31 ForwardRegion Region to forward mail to. (Might not be in use.) 709 80 MorePrompt User's "more" prompt. 789 31 Occupation What's the user's job is. (Not in use.) 820 2 NumUserShow Number of users to show on login. 822 4 Birthdate Midnight on day of birthdate. (Not in use.) 826 4 FirstOn Time of first call to system. 830 2 Male 1 if male, 0 if female. 832 4 TotalTime Total number of seconds on the system. 836 4 Logins How many times have logged into the system. 840 4 Posted Total number of messages posted on the system. 844 4 Read Total number of messages read on the system. 848 4 PWChange The last time the user's password was changed. 852 2 CallsToday The number of calls today. (Midnight to midnight, not 24 hours.) 854 2 CallLimit Number of calls allowed per day. (0 for unlimited.) 856 80 WhereHear Where did you hear about the BBS? 936 16 Reserved_4 Set to 0. 952 31 LastRoom Room they were last in on last call. 983 31 LastHall Hall they were last in on last call. 914 31 DefaultRoom Default room. (Not in use.) 945 31 DefaultHall Default hall. 976 4 Poopcount The user's Poopcount. 980 2 Bitmap_1 Bitmapped flags, as follows: InUse Is slot in use. UCMask Upper case only. LFMask Send linefeeds. Expert Expert mode. Aide Is user an Aide? (Note: if this is cleared, but Sysop (below) is set, the user is considered to be an Aide.) Tabs Send tabs? OldToo Send last old message on new message request. Problem Is user a twit? (Note: Even if this is set, the user is not considered a twit if he is an Aide (see above).) Unlisted Unlisted userlog entry. Permanent Permanent userlog entry. Sysop Is user sysop. Node Is user a node. NetUser Is user a netuser. NoAccount Is accounting disabled. NoMail Is mail disabled. RoomTell Does user view room descriptions. 982 2 Bitmap_2 More bitmapped flags as follows: Dungeoned Is user dungeoned? (Not in use.) MsgAide Message-only aide. (Not in use.) FwdToNode Mail forwarded to a node. AutoNextHall Auto next hall. FileAide File-only aide. (Not in use.) EnterBorders Can user change borders. UnVerified Is user unverified. SurnameLock Is user's title and surname locked? LockHall Is user's default hall locked? Psycho Is user psyco- chickened? DisplayTS Display titles and surnames to user? Subjects Display subjects? Signatures Display signatures? IBMGraph Display IBM graphic characters? IBMANSI Use ANSI? IBMCOLOR Use color ANSI? 984 2 Bitmap_3 More flags: Twirly Show twirly cursor. Verbose Auto verbose. MsgPause Pause between messages. Minibin Show Minibin login stats. MsgCLS Clear screen before message. RoomInfo Display room info lines. HallTell Display hall descriptions. VerboseCont Continue in the message editor in the icky verbose way. ViewCensor View censored messages. SeeBorders Display borders. Out300 Simulate 300 baud output. LockSignature Lock user's signature. HideExclusions Hide message exclusions. (Don't tell the user when messages are excluded.) NoDownload User may not download. NoUpload User may not upload. NoChat User may not chat. 986 2 Bitmap_4 More flags... PrintFile Turn on printfile when user logs in. SpellCheck Two bits: 00 for terse, 01 for regular, 10 for verbose, 11 for automatic. NoMakeRoom User may not use .ER command. VerboseLogOut Log user out verbosely. ConfirmSave Ask for confirmation before saving message. NoConfAbort Don't ask for confirmation before aborting message. ConfirmNoEO Confirm entering a message when one is aborted. UsePersonal Use personal hall. YouAreHere Use YouAreHere. IBMRoom Show room prompt with IBM graphic characters. WideRoom Show room lists widely. Music User can hear it. CheckAPS Check apostrophe Ses in the spell checker. CheckAllCap Check words in all-caps in the spell checker. CheckDigits Check words with digits in them in the spell checker. 988 1 Reserved_5 Set to 0. 989 31 RealName The user's real name. 1020 31 PhoneNumber The user's phone number. 1051 1 Reserved_6 Set to 0. 1052 2 Bitmap_5 Even more flags... ExcludeCrypt Exclude encrypted messages. HideCommas Don't show commas in numbers. PUnPauses The P key unpauses text output. Reserved_7 13 bits: set all to 0. 1054 4 LastCalledVer Version of Citadel running during last call. Major version times 1000 plus minor version. (65077 for 65 alpha 77, for example.) LOG2.DAT The LOG2.DAT file stores the groups that each user has access to. There is no leading four-byte integer as in LOG.DAT. Each user gets #MAXGROUPS/8 bytes: one bit per group. Access to group 0 is governed by the LSB of the first byte; access to group 7 is governed by the MSB of the first byte; access to group 8 is governed by the LSB of the second byte; etc. LOG3.DAT The LOG3.DAT file stores the rooms that each user has access to. There is no leading four-byte integer as in LOG.DAT. Each user gets #MAXROOMS/8 bytes: one bit per room. Access to room 0 is governed by the LSB of the first byte; access to room 7 is governed by the MSB of the first byte; access to room 8 is governed by the LSB of the second byte; etc. If a user does not have a bit set for a room, then the user may not go to the room unless it is a hidden room and the user knows the name of the room. New users are given access to all public rooms when they log in, but not BIO or hidden rooms. LOG4.DAT The LOG4.DAT file stores the rooms that each user has excluded. There is no leading four-byte integer as in LOG.DAT. Each user gets #MAXROOMS/8 bytes: one bit per room. Room 0 is governed by the LSB of the first byte; Room 7 is governed by the MSB of the first byte; Room 8 is governed by the LSB of the second byte; etc. LOG5.DAT The LOG5.DAT file stores the last message read for each user for each room. There is no leading four- byte integer as in LOG.DAT. Each user gets #MAXROOMS four-byte integers: one for each room. Room 0 is governed by the first four-byte integer; Room 1 is governed by the second four-byte integer; etc. LOG6.DAT The LOG6.DAT file stores the rooms that each user has added to his personal hall. There is no leading four-byte integer as in LOG.DAT. Each user gets #MAXROOMS/8 bytes: one bit per room. Room 0 is governed by the LSB of the first byte; Room 7 is governed by the MSB of the first byte; Room 8 is governed by the LSB of the second byte; etc. LE*.DAT Each user may also have a Log Extension file, which stores information that cannot be expressed in the structured data files above. The name of the file is LE then the number of the user in the LOG.DAT file, then the .DAT extension. If there is no data for a user to put in the log extension file, it is not created. In general, the file consists of a keyword (starting with the character #), white space, then the keyword's value in one or more quoted strings followed by a CR/LF combination (ASCII 13 followed by ASCII 10). The two exceptions to this are the #MESSAGE and #FINGER log extensions, as described below. All log extensions other than #MESSAGE and #FINGER may show up multiple times: all occurrences of the extensions are loaded into memory. Keyword Description #KILLUSER The name of a user to exclude messages from. #KILLTEXT Message text to exclude. #KILLNODE The name of a node to exclude messages from. #KILLREG The name of a region to exclude messages from. #DICTWORD The words of the user's personal dictionary. #TAGUSER Two strings: first the name of the user, second the user's tag. #JB Jump-back information, stored as five numbers: first, the newpointer for the room; second the number of new messages in the room; third, the hall to jump back to; fourth, the room to jump back to; and fifth, whether the room was bypassed. #MESSAGE A message to resume next call; saved if carrier is lost when entering a message. Immediately after the #MESSAGE, a CR/LF combination is stored to the file. Then the binary data of the message is saved, similar to the format of MSG.DAT (explained below). After the last byte of the message, a CR/LF combination is saved. #FINGER The user's information, set and viewed by the .Finger... commands. Immediately after the #FINGER, a CR/LF combination is stored to the file. After that, the finger data is stored, as a nul-terminated string. After that, another CR/LF combination is stored to the file. The room files The room database is split into two parts. ROOM.DAT stores the bulk of the information for each room; ROOMPOS.DAT stores the logical order of the rooms. ROOM.DAT The ROOM.DAT file starts with a four-byte long integer that stores the length of each record, as explained above. After that, each record is saved sequentially, which is as follows: Offset Length Name Description 0 2 Bitmapped_1 This stores the room's flags, as follows: Inuse Whether the room is in use. Public Whether the room is public (non-hidden). Directory Whether the room is a directory room. Permanent Whether the room is permanent. GroupOnly Whether the room is group-only. ReadOnly Whether the room is read-only. DownloadOnly Whether the room is download-only. Shared Whether the room is shared (networked). Moderated Whether the room is moderated. Application Whether the room has an application. BIO Whether the room is By- Invitation-Only. UploadOnly Whether the room is upload-only. PrivGrp Whether the room has a privileged group. Anonymous Whether the room is anonymous. AskSubject Whether to ask for a subject for messages in the room. GrpModerated Whether the group is moderated by the privileged group. 2 2 Bitmapped_2 This stores more flags, as follows: ArchiveMsgs Whether to archive all messages saved in the room. BoolGroup Whether access to the room is based on a Boolean expression. Unused_1 14 bits: set all to 0. 4 31 Name Name of room. 35 64 DirName Name of the room's directory. 99 13 RoomTell File name of room's description. 102 13 ApplicName File name of room's application. 115 1 Unused_2 Set to 0. 116 2 GroupNumber Number of owning group. 118 4 Unused_3 Set to 0. 122 2 PrivGrpNum Number of privileged group. 124 2 Bitmapped_3 More flags, as follows: AutoApp Run room's application automatically when entering the room for the first time on a call. NoExclude Users may not exclude room. Unused_4 14 bits: set all to 0. 126 80 InfoLine Room's info line. 206 31 NetID Network ID of room. 237 13 ArchiveFile File name for archiving. 250 13 Dictionary File name for dictionary, if using custom dictionary for room. 263 31 Moderator Name of the room's moderator. (Not in use.) 294 31 ExclNetPartner Exclusive net partner. (Not in use.) 325 1 Unused_5 Set to 0. 326 50 BoolGroup Used for Boolean group access. ROOMPOS.DAT This is a list of each room's logical position. Each room gets a two-byte integer for its location. The first room gets the first two bytes, the second room the next two, etc. Locations are expressed starting with 0 and ending with one less than the maximum number of rooms on the system. The hall files The hall database is split into three parts. HALL.DAT stores the bulk of the information for each room; HALL2.DAT stores the other two parts: which rooms are in each hall, and which rooms are windowed into each hall. HALL.DAT The HALL.DAT file starts with a four-byte long integer that stores the length of each record, as explained above. After that, each record is saved sequentially, which is as follows: Offset Length Name Description 0 31 Name The name of the hall. 31 1 GroupNumber The hall's group number. 32 2 Bitmapped Flags, as follows: Inuse Whether the hall is used. Owned Whether the hall is group-only. Described Whether the hall has a description file. Unused_1 Set to 0. EnterRoom May users enter rooms? BoolGroup Use the Boolean expression for group access? Unused_2 10 bits: set all to 0. 34 1 Unused_3 Set to 0. 35 13 DescriptionFile Name of hall's description file. 48 50 GroupExpr Boolean group access expression. HALL2.DAT HALL2.DAT stores which rooms are in each hall, and which rooms are windowed into each hall. There are two parts to this file: first the rooms in each all, then the rooms windowed into each hall. In each part, each hall gets #MAXROOMS/8 bytes: one bit for each room. For each section, Room 0 is governed by the LSB of the first byte for the hall; Room 7 is governed by the MSB of the first byte for the hall; Room 8 is governed by the LSB of the second byte for the hall; etc. The group file There is only a single file for group storing the group database, GRP.DAT. GRP.DAT The GRP.DAT file starts with a four-byte long integer that stores the length of each record, as explained above. After that, each record is saved sequentially, which is as follows: Offset Length Name Description 0 31 Name Name of the group 31 1 Reserved_1 Set to 0. 32 80 Description Group's description. 122 2 Bitmapped Flags, as follows: Inuse Whether group is used. Locked Whether group is locked from aides. Hidden Whether group is hidden. AutoAdd Whether new users are added to the group when they log in. Reserved_2 12 bits: set all to 0. The borders file Borders are saved in a single file, BORDERS.DAT. BORDERS.DAT Each border is saved as an 81 byte string. There are as many of these as there are borders. The message file The message base is saved as a single file, MSG.DAT. Other than the log extension files, this is the most "free-form" of the data files. There is not any set limit of the number of messages in the file, the first byte of the file might not be the first byte of a message, not all bytes in the file are usually used by messages, and messages don't have any set length in the file. The first byte of a message is ASCII 255 (0xFF hex), which Citadel uses as a key to the start of a message. This is the only byte that is allowed to have this value in the message base. After the 0xFF that starts the message, the next byte is the message's attribute byte. This is a bitmapped byte, with each bit having the following value: Bit Name Description 0 (LSB) Received Only used for mail: if the message was received. 1 Replied Only used for mail: if the message was replied to. 2 MadeVis Only used for moderated and problem user messages: whether the message has been made visible. (Note that when a message is released, a copy of the message is also made. How this all works is somewhat complicated.) 3 Compressed If the message has been compressed. 4 Censored If the message is censored. 5 BigRoom If two bytes are used to save the message's room number. (See below for full room number information.) 6 More If there is a second attribute byte. 7 (MSB) Reserved Must always be 0, to avoid making this be 0xFF. If the More bit is set in this attribute byte, there is a second attribute byte, of which currently only the LSB is used. This is set to indicate a local message. The other 7 bits must all be set to 0. After the one or two attribute bytes, the room number is saved. If the room number is less than or equal to 254, it is saved as a single byte. If the room number is 255 or greater, it is saved as two bytes, and the BigRoom attribute bit is set. Additionally, to avoid the possibility of 255 being written as part of the room number, if the room is being saved in two bytes, it is first multiplied by two. This way the least significant bit of the least significant byte is always a 0, and it can never be a 255. As the limit to the number of rooms in Citadel is 13683, the most significant bit of the most significant byte of the room number is also always 0, even after multiplying by two. After the room number, the message number is written as an ASCII string, followed by a nul (ASCII 0) byte. Message numbers are assigned sequentially. After this, the following fields might be saved in any order. They are written by first writing the field's code as a single character, then the ASCII information of the field, then a nul (ASCII 0) byte. All numbers are written out as a base 10 ASCII number. Not all fields are saved to all messages. For example, if the message's author has no surname defined, there will be no surname field present. Code Name Description A Author The message's author. B Subject The message's subject. C Copy Message number of message this is a copy of. D Date The time the message was created. d EZTime The time saved in an easier method to read. Only saved to networked messages, and only if #GATEWAY in NODES.CIT is set for the other node. F Forward User mail is being forwarded to. Note that if this is a message forwarded over the network, this field will actually contain the name of the user the mail was originally written to, and the "ToUser" field ("T") will contain the name of the forwardee. There is a reason for this. Try to figure it out yourself if you want a challenge. G Group The name of the group that this message belongs to. H OriginPhone This is the phone number of the node the message was first written on. h DestinationPhone This is the phone number of the node the message is being sent to. If this was used at all, which it is not, it would only be used in mail. I ReplyToMessage This is the message number that this message is a reply to. J TwitRegion This is the message's twit region. j TwitCountry This is the message's twit country. L FileLink This is the file the message is linked to. l ApplLink This is the application the message is linked to. N Title This is the title of the message's author. n Surname This is the surname of the message's author. O OriginNodeName The name of the system the message was first written on. o OriginNodeRegion This is the region of the system the message was first written on. P FromPath This is the path the message took to get to the current system. p ToPath This is the path that the message will follow. Only used in mail. Q OriginCountry This is the country of the system the message was first written on. q ToCountry This is the country that the message is destined to. Only used in mail. R CreationRoom This is the name of the room that the message first came to the current board in. r OriginalRoom This is the name of the room on the system that the message was first written on. S SourceID The message number on the system the message was first written on. s SourceSoftware This is the name and version of the software that first generated this message. T ToUser This is the name of the user that the message is addressed to. Only used in mail. U Cit86Country This is the message's country as defined by the Citadel-86 network. X X This field is "Y" if the message is a problem user message, and "M" if it is moderated. Z ToNodeName This is the node that the message is being sent to. Only used in mail. z ToRegion This is the region that the message is being sent to. Only used in mail. . Signature This is the message's signature. _ UserSignature This is the signature of the user who left the message. ! RealName This is the real name of the author of the message. > DestAddress This is the address of the system that the message is being sent to. Only used in mail. # MoreFlags This text string contains any number of characters, each of which is a flag that signifies something. Currently, the only two flags that have been defined are: R Receipt confirmation requested. E Encrypted. % Comment There may be any number of comments. other unknown Citadel will store and pass through the network any field, even if it does not recognize the field's code. The only limit is that it will only store the first 255 characters of each field. After this information, which makes the header, one last field is written: the message's text. This is written starting with a "M" character, followed by the text of the message, followed by a nul (ASCII 0) character. This is usually ASCII text, but it is not guaranteed to be: if the message is compressed or encrypted, this will be binary data. The only two guarantees are that there is no 0xFF character (as that would violate the rule about the only one of those allowed being the start of the message) and there is no 0x00 character (as that would mark the end of the message). Each message is written to the file right after the previous one. When the end of the MSG.DAT file is reached (which is a static size set in CONFIG.CIT), writing continues at the start of the file. A single message might be located at the end and beginning of the file. Citadel keeps track of 0xFF characters, and as each is written over, it knows that that message is no longer valid. There is usually some slack between the end of the last message and the start of the first. _Appendix H: Other files Queued file transfers Citadel uses a temporary file named FILEQTMP.CIT for queued file transfers. When it calls the external file transfer protocol, it first writes out each file to transfer to this file, then uses the #RESPONSE_FILE transfer command in PROTOCOL.CIT to transfer each of these files. This file is then deleted when the transfer is finished. Abnormal termination When Citadel detects a problem that prevents further execution, it creates a file named CRASH.CIT with an explanation of the problem in it. The possible problems are: Allocating system tables twice. Citadel's trying to do something that it should't. Try to remember what you did to cause this to happen, and see if it can be re-produced. Then report your findings to The Anticlimactic Teleservice at (206)562-9792. Auxmem corrupted! Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Bad auxmem request! slot : number, size number (number) Citadel tried to access memory that does not exist. Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Bad bad. Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Bad bad memory stuff. Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Cannot allocate file buffer for filename Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Cannot allocate space for accounting information Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Cannot allocate space for file buffer Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Cannot allocate space for tables Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Cannot find any messages. When Citadel tried to build its index to MSG.DAT, it was not able to find any valid messages in the whole file. Citadel needs to be able to find at least one message to run successfully, and creates one when it creates MSG.DAT. This most likely means that your MSG.DAT got highly corrupted, and you probably need to restore from a back-up. Cannot read filename! Most likely, a disk error occurred when trying to read the specified file. Cannot write filename! Citadel is not able to write some information to one of its data files. This probably indicates that you are out of disk space; delete any extra files that you have on the disk. Cannot write size of file: filename Citadel is not able to write some information to one of its data files. This probably indicates that you are out of disk space; delete any extra files that you have on the disk. Could not create filename file! Citadel was not able to create a file that is essential to the operation of the program. Check that you have enough FILES set in CONFIG.SYS, and try to create the file yourself, to see if there is something blocking Citadel from doing it. EMS->heap error #number The EMS driver was not able to copy some of Citadel's data from EMS to conventional memory. number indicates the EMS error that occurred. Error allocating free chunck Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Error allocating logTab Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Error allocating msgTab Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Error allocating roomTab Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Error allocating msgTab (number) Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Error allocating roomTab (number) Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. filename file missing! (errorcode) Citadel cannot find a file that it needs to continue operation. Check that FILES is set high enough in CONFIG.SYS, and that the file actually exists. filename resize failed Citadel was not able to resize one of its data files. Check that you have enough memory and disk space free to accomplish the resize. Freeing system tables twice. Citadel's trying to do something that it should't. Try to remember what you did to cause this to happen, and see if it can be re-produced. Then report your findings to The Anticlimactic Teleservice at (206)562-9792. functionname - not enough memory Citadel was not able to allocate enough memory to accomplish some essential task. For most things, Citadel is able to abort out of the task if it cannot allocate enough memory to complete it. However, it cannot do this with all tasks. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Heap is corrupted. Something has corrupted memory. Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Heap->EMS error #number The EMS driver was not able to copy some of Citadel's data from conventional memory to EMS. number indicates the EMS error that occurred. Heap->XMS error #number The XMS driver was not able to copy some of Citadel's data from conventional memory to XMS. number indicates the XMS error that occurred. Heap->Virtual error Citadel was not able to copy some of its data from conventional memory into virtual memory. Lost auxmem block! Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Message::ReadHeader: bad HowToRead Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Message::Store: bad HowToSave Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. No auxmem chain! Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. not enough memory for cron table Citadel is most likely out of memory. See if you can remove any memory resident utilities or extra device drivers, or otherwise increase the amount of conventional memory available to Citadel. If this is not possible, try setting the system size in CONFIG.CIT to be smaller. Room missing in table! A room could not be found in the table of logical room ordering. You can delete the ROOMPOS.DAT file, and Citadel will create a valid new one. You will lose any logical room ordering you have created with the .Aide Move room (.A- and .A+) commands. Super secret error #x14h-22a!! If we told you, then it wouldn't be a secret, would it? Unknown required keyword: keyword Report the circumstances of this error appearing to The Anticlimactic Teleservice at (206)562-9792. Virt->heap error Citadel was not able to copy some of its data from virtual memory into conventional memory. XMS->heap error #number The XMS driver was not able to copy some of Citadel's data from XMS to conventional memory. number indicates the XMS error that occurred. Networking files Citadel creates several files for the purpose of networking. Most of these are temporary files, which are just transferred to the other node then deleted. The other node reads the files, then deltes them. The NETID.CIT file One file that is used for networking that is not a temporary file is NETID.CIT. This file stores the Net IDs of all networked rooms created on the system with #AUTOROOM. This keeps track of which node the room came from, and also keeps rooms from being created with #AUTOROOM that you have killed: before createing a room, Citadel checks this file to see if the Net ID has already been used. If so, then it does not recreate the room. In general, you should never edit this file. However, it is user-editable, in case some circumstance comes up that warrents editing of it. The file is simply a text file with lines following this general format: #NETID "Net ID" "Original Node" Where "Net ID" is the Net ID and "Original Node" is the name of the system that the room came from. Net 1.0/1.1 network packets Wow. Net 1.5/1.6 network packets Wow. Net 6.9 network packets In the Net 6.9 protocol, everything is included in a single packet. The packet is created with some archiver program (usually PKZIP) and contains several different files. The name of this packet is important: it is the destination board's alias plus the string "69" plus the creating board's alias, with a serial number as an extension. (The extension's contents is not important: it just is used to make sure that the packets have unique names over a reasonable amount of time. Citadel+ assigns a number from 000 to 999 as the serial number, incrementing it each time a packet is created for the other node. After 999, the counter restarts at 000.) For example, the first packet created for a node with the alias SKY on a board with the alias TGI would be SKY69TGI.000; the second would be SKY69TGI.001; the thousanth would be SKY69TGI.999; etc. The following files may be found in a packet (any number of them may be included; there are no required files): Filename Contents MSG.69 Messages in rooms. MESG.TMP Mail. ROOMREQ.(alias) Room request file. FILE69.(alias) Network file transfers. MSG.69 format The MSG.69 file contains the messages to be incorporated into various rooms. The first thing in the file is the full address (or, previously, name) of the originating node, followed by a NUL (ASCII 0). The receiving node uses this information to determine where the packet came from. After this are the messages for any number of rooms (even zero). First, there is the Network ID of the room, followed by a NUL (ASCII 0). Following this are the messages in standard Citadel format. (The only message attributes that should be included are Received and Replied, in the interest of backwards compatibility.) The room number is not important, but must be included. Following the last message in the room, there is the Network ID of the next room or the end of the file. (Citadel knows the difference between Network IDs and messages because messages all start with ASCII 255, which is an invalid character in a Network ID.) MESG.TMP format The MESG.TMP file contains all mail destined for the node, either as a final destination or for routing. The file simply consists of the messages, in standard Citadel format. (The only message attributes that should be included are Received and Replied, in the interest of backwards compatibility.) The room number is not important, but must be included. ROOMREQ.(alias) format The ROOMREQ.(alias) file contains the Network IDs of the rooms that the creating node wishes to receive from the destination node. The (alias) that is the extension of the file is the alias of the creating node. This file is simply a list of Network IDs, separated by a CR/LF (ASCII 13 and ASCII 10) combination. Note: The <cr><lf> combination is used for readability and editability. Net 6.9 will accept Null/0xFF/CR/LF or any mix or combination of those characters as separators. FILE69.(alias) format The FILE69.(alias) file is an archive file created with the archiver specified by #ZIP in the NODES.CIT entry for the other node. The other node uses the extract command to extract all of the files from FILE69.(alias). It extracts all files to its #DLPATH as set in CONFIG.CIT. After extracting the archive file, the receiving node checks for the existence of any FILE69.(alias) files in #DLPATH, and moves any found to #TRANSPATH as set in CONFIG.CIT. This allows for multiple hop file transfers. CALLINFO.BBS. format The CALLINFO.BBS information we have is incomplete, so Citadel might not write this file completely correctly. This file is a text file, with each field taking a line followed by a carriage return/line feed (ASCII 13 and ASCII 10) combination. The information that Citadel writes is: User's Name The name of the currently logged in user, with all color codes removed. Speed The number 0 for 2400 baud, 1 for 300 baud, 2 for 1200 baud, 3 for 9600 baud, or 5 for console or other speed. City The last line of the user's mailing address that has data in it, or blank if no lines have data. Security Level The number 5 for problem users, 30 for normal users, 80 for Aides, and 100 for Sysops. Time left The time left in the user's accounts, in minutes. In an attempt to keep from overflowing other software's limits, no value larger than 546 minutes is written. ANSI Color The word "COLOR" if the current user has ANSI color enabled or "MONO" if he does not. Password The current user's password (but not initials). Userlog Number The current user's slot in LOG.DAT. (Not that this means anything to Citadel.) Time used The number of minutes this call has lasted. If there is no user logged in, the number 0. Unknown Citadel writes nothing out. Our information lists this field as being "01:23". Unknown Citadel writes nothing out. Our information lists this field as being "01:23 01/02/90". Unknown Citadel writes nothing out. Our information lists this field as being "ABCDEFGH". Unknown Citadel writes nothing out. Our information lists this field as being "0". Unknown Citadel writes nothing out. Our information lists this field as being "99". Unknown Citadel writes nothing out. Our information lists this field as being "0". Unknown Citadel writes nothing out. Our information lists this field as being "9999". Phone number The current user's phone number. Unknown Citadel writes nothing out. Our information lists this field as being "01/01/90 02:34". Expert The word "EXPERT" if helpful hints are turned off or "NOVICE" if they are on. File transfer protocol The name of the user's default file transfer protocol, or a blank line if none is specified. Unknown Citadel writes nothing out. Our information lists this field as being "01/01/90". Times on The number of times the current user has logged onto the system. Lines per screen The number of lines per screen, or 0 if the current user has screen pause turned off. Last message read The new message pointer for the current room. Total uploads The total number of files the user has uploaded. Total downloads The total number of files the user has downloaded. Idiotically Stupid!!! The text "8 { Databits }". (There are two spaces between the "8" and the "{".) User's location The text "LOCAL" if logged in on console, or "REMOTE" if logged in over the modem. Port The text "COM" followed by the serial port number of the modem. (For example, "COM1" if the modem is on the first serial port.) Speed The number 0 for 2400 baud, 1 for 300 baud, 2 for 1200 baud, 3 for 9600 baud, or 5 for other speed. No attention is paid to whether the user is on console or not. Unknown Citadel writes nothing out. Our information lists this field as being "FALSE". Another stupid thing The text "Normal Connection". Unknown Citadel writes nothing out. Our information lists this field as being "01/02/94 01:20". Task number Citadel writes the number 0. Door number Citadel writes the number 1. CHAIN.TXT. format The information regarding the format for this file came from a post to alt.bbs by Paranoid@f102.n514.z17.mtlnet.org dated September 28, 1993. This message consisted of a file created by Mr. Bill (or perhaps MrBill), WWIVnet Address 1 @ 7300 [MrBill's Abode 703-369-6140], or CompuServe address 71001,1101. CHAIN.TXT is a text file, with each field taking a line followed by a carriage return/line feed (ASCII 13 and ASCII 10) combination. The information that Citadel writes is: User Number The current user's slot in LOG.DAT. (Not that this really means anything on Citadel.) User's Alias The user's name, with color codes removed. User's Name The user's real name, with color codes removed. Ham radio call sign Citadel writes nothing out. User's age Calculated from the user's birthdate. If the user has not specified a birthdate, the number 21. User's sex The letter "M" if the user is a male, or "F" if the user is a female, or hasn't specified his sex. User's gold The number of seconds left in the user's account. (Limited to 32,767 to avoid overflowing other software.) Last logon date The date the user last logged on before the current call. Written in the form "01/01/95". Columns The user's terminal width. Lines per screen The user's lines per screen, or 0 if screen pause is turned off. Security level The number 5 for problem users, 75 for normal users, 200 for Aides, and 250 for Sysops. Co-Sysop The number 1 if the current user is an Aide, or 0 if not. Sysop The number 1 if the current user is a Sysop, or 0 if not. ANSI The number 1 if the current user has ANSI turned on, or 0 if not. Remote The number 1 if logged in remotely, or 0 if on console. Time left The number of seconds left in the current user's account, limited to 32,767 to avoid overflowing other software. GFILES directory #DIRPATH as set in CONFIG.CIT with a trailing back-slash. DATA directory #HOMEPATH as set in CONFIG.CIT with a trailing back-slash. System log of the day Citadel writes the text "wow.log" User baud rate The connect rate if there is a connection or the port rate if there is no connection. Serial port The number 1, 2, 3, or 4. System name #NODENAME as set in CONFIG.CIT with any color codes removed. System sysop #SYSOP as set in CONFIG.CIT with any color codes removed. User login time The time that the current user logged in (or the current time if there is no user logged in), written as seconds after midnight. Time used The number of seconds used this call (or 0 if there is no user logged in). Uploaded K The number of kilobytes uploaded by the user. (Citadel stores this for each user, but does not track this currently.) Uploaded files The number of files uploaded by the user. (Citadel stores this for each user, but does not track this currently.) Downloaded K The number of kilobytes downloaded by the user. (Citadel stores this for each user, but does not track this currently.) Downloaded files The number of files downloaded by the user. (Citadel stores this for each user, but does not track this currently.) Data format The text "8N1" as this is the only data format supported by Citadel. Port rate The current speed of the serial port. WWIVnet node Citadel writes the number 0. CONSOLE.APL. format CONSOLE.APL is a text file that Citadel displays to the console after it returns from a shell. After it displays this file, Citadel deletes it. DOOR.SYS. format The format for DOOR.SYS comes from a March 14, 1988 release by "Limited Release Software Group" (and apparently written by Rick Greer, who is nowhere to be found), amended March 21, 1988, October 22, 1988 (by Kenny Gardner), July 7, 1990 (by Kenny Gardner for Raymond Clements), and July 14, 1991 (by Jim Harrer of Mustang Software, who can't program). DOOR.SYS is a text file, with each field taking a line followed by a carriage return/line feed (ASCII 13 and ASCII 10) combination. The information that Citadel writes is: Com port "COMx:" where "x" is replaced by the serial port number, or 0 if the current user is logged in on console. User speed The connect speed if carrier is present, or the port speed if no carrier is present. Parity The number "8". Node number The number "1". DTE Rate The port speed. Screen display The text "N" if the screen saver is active, or "Y" if it is not. Printer status The text "Y" if text is being captured with Alt+P, or "N" if it is not. Page bell The text "Y" is the speaker is activated for the Chat command, or "N" if it is not. Caller alarm The text "Y". User name The current user's name, with color codes removed. Calling from The last line of the current user's address with data in it, or blank if there is no address information at all. Home phone The current user's phone number. Work/Data phone The current user's phone number. Password The current user's password (but not initials). Security level The number 5 for problem users, 30 for regular users, 80 for Aides, and 100 for Sysops. Total times on The number of times the current user has logged onto the system. Last date called The date that the current user last called before this call, in the format "01/01/95". Seconds remaining Number of seconds left in the current user's account, limited to 32,767 to avoid overflowing other software. Minutes remaining Number of minutes left in the current user's account, limited to 546 to avoid overflowing other software. Graphics mode The text "GR" if the current user has IBM Graphics characters turned on, or "NG" if not. Page length The screen length of the current user, or 0 if screen pause is turned off. Expert mode The text "N" if helpful hints are turned on, or "Y" if they are off. Forums registered in Citadel writes a blank line. Current conference The index of the current room in ROOM.DAT. User expiration date The text "12/31/99". User number The index of the current user in LOG.DAT. (Not that this means anything in Citadel.) Default protocol The command key that represents the current user's default file transfer protocol. Number of uploads The number of files the current user has uploaded. (Citadel stores this information, but does not currently track it.) Number of downloads The number of files the current user has downloaded. (Citadel stores this information, but does not currently track it.) Daily K downloaded The number "0". Daily K limit The number "999,999". Birthdate The current user's birthdate, written in the form "01/01/95". MAIN directory #HOMEPATH as set in CONFIG.CIT. GEN directory #DIRPATH as set in CONFIG.CIT. Sysop's name #SYSOP as set in CONFIG.CIT with all color codes removed. Alias name The current user's name, with color codes removed. Event time Citadel writes a blank line. Error correction The text "Y" if the modems are communicating with an error-correcting protocol, or "N" if not. ANSI in no graphics The text "N". Use record locking The text "N". BBS Default color The color as set by #ATTR in CONFIG.CIT. Time in minutes The time left in the current user's account, in minutes. The highest number written is 546, to avoid overflowing other software. Last new file scan The date of the user's last call, in the format "01/01/95". This call time The time that the user called (or the current time if there is no user logged in) in the form "00:00". Last call time The time that the user last called in the form "00:00". Max files available The number "99". Files d/l today The number "0". Total K uploaded The total kilobytes uploaded by the current user. (Citadel stores this information for each caller, but does not currently track it.) Total K downloaded The total kilobytes downloaded by the current user. (Citadel stores this information for each caller, but does not currently track it.) User comment The current user's signature. Total doors opened The number "0". Total messages left The total number of messages posted by the current user. DORINFO1.DEF. format DORINFO1.DEF is a text file, with each field taking a line followed by a carriage return/line feed (ASCII 13 and ASCII 10) combination. The information that Citadel writes is: Node name The name of the system, with color codes removed. Sysop's first name The text of #SYSOP as set in CONFIG.CIT with color codes removed, up to the first space. Sysop's last name The text of #SYSOP as set in CONFIG.CIT with color codes removed, following the first space. Com port The serial port the modem is connected to, or 0 if logged in on console. Baud rate The current port rate. Networked The number "0". User's first name The current user's name with color codes removed, up to the first space. User's last name The current user's name with color codes removed, following the first space. City The last line of the current user's address that has data in it, or a blank line if there is no address information. Terminal type The number "0" if TTY, or "1" if ANSI. Security level The number 5 for problem users, 30 for regular users, 80 for Aides, and 100 for Sysops. Minutes remaining The number of minutes left in the current user's account, limited to 546 to keep from overflowing other software. FOSSIL The number "-1" if using an external serial driver or "0" if using internal serial routines. INPUT.APL. format INPUT.APL is read by Citadel after it returns from a shell, and the data in it is used to change Citadel's current settings. This is a text file, with each line starting with a character that serves as a flag specifying what is on the line, followed by text that specifies the data. After the data, the line is either ended by a carriage return/line feed (ASCII 13 and 10) combination, or just a single line feed (ASCII 10). Not all data is required to be in INPUT.APL: just write what you desire to change. Also, Citadel ignores any field it does not know about. The following data types are defined by Citadel: Flag Name Data 33 Surname The current user's surname. 34 Title The current user's title. 35 Sysop Whether the current user is a Sysop - 1 or 0. 36 Aide Whether the current user is an Aide - 1 or 0. 37 Twit Whether the current user is twitted - 1 or 0. 38 Expert Whether the current user is in expert mode (that is, helpful hints are turned off) - 1 or 0. 39 Credits The number of minutes left in the current user's account. 40 Permanent Whether the current user has a permanent account - 1 or 0. 41 NetUser Whether the user has net access - 1 or 0. 42 NoMail Whether the user cannot send mail - 1 or 0. 43 Verified Whether the user is a verified user - 1 or 0. 48 RealName The current user's real name. 50 Nulls The number of nulls the current user is configured for. 51 Linefeed Whether the current user has linefeeds turned on - 1 or 0. 52 Uppercase Whether the current user is configured for an uppercase-only terminal - 1 or 0. 54 Columns The number of columns the current user is configured for. 55 Lines The number of lines on screen the current user is configured for, or 0 if screen pause is turned off. 56 Unlisted Whether the current user has an unlisted userlog entry - 1 or 0. 73 Hall The name of the hall the user is currently in. 74 Room The name of the room the user is currently in. 95 Transmitted The number of characters sent by Citadel to the currently logged- in user. 96 Received The number of characters received by Citadel from the currently logged-in user. 97 SysReq Whether the system has been requested (F3 or Alt+F3) -1 or 0. 99 StatusScreen Whether the system status screen (F4) is displayed or not - 1 or 0. 100 Chat Whether Chat is enabled or not - 1 or 0. 101 Bells Whether bells are enabled or not - 1 or 0. 102 Printing Whether output is being trapped (Alt+P) or not - 1 or 0. 111 GroupAdd Specifies the name of a group to add the current user to. 112 GroupRemove Specifies the name of a group to remove the current user from. 200 MsgAuthor Specifies the name to use for the author of the message created by MESSAGE.APL. (If this field is not specified but MESSAGE.APL exists, the node's name is used as the message author.) 201 MsgToUser Specifies the user to use for the recipient of the message created by MESSAGE.APL. (If this field is not specified but MESSAGE.APL exists, the message is not sent to anybody; it is made to be a public message.) 202 MsgGroup Specifies the group to use for the message created by MESSAGE.APL. (If this field is not specified but MESSAGE.APL exists, the message is not made to be group-only; it is made to be a public message.) 203 MsgRoom Specifies the room to place the message created by MESSAGE.APL in. (If this field is not specified but MESSAGE.APL exists, the message is placed in the current room.) MESSAGE.APL. format MESSAGE.APL is used to create a message when returning from a shell. This file contains the text of the message. (Remember that Citadel messages can only be 8K long. If this file is longer than 8K, it will be truncated to 8K in the message.) You can set certain fields in INPUT.APL to control some aspects of the message, such as its author and group. OUTPUT.APL. format OUTPUT.APL is created by Citadel before it shells to another application, to let the other application know about the operating environment of Citadel. This is a text file, with each field being on a line by itself. The first character of the line is a flag telling what data is on the line. After the flag is the data, then a carriage return/linefeed (ASCII 13 and 10) combination to end the line. Applications that read OUTPUT.APL should know to ignore flags not defined here: more may be added in the future. Also, applications should be able to operate with reasonable defaults if they cannot find data in this file: fields may be removed in the future (though this is not likely). The following data types are defined by Citadel: Flag Name Data 32 Name The current user's name. 33 Surname The current user's surname. 34 Title The current user's title. 35 Sysop Whether the current user is a Sysop - 1 or 0. 36 Aide Whether the current user is an Aide - 1 or 0. 37 Twit Whether the current user is twitted - 1 or 0. 38 Expert Whether the current user is in expert mode (that is, helpful hints are turned off) - 1 or 0. 39 Credits The number of minutes left in the current user's account. 40 Permanent Whether the current user has a permanent account - 1 or 0. 41 NetUser Whether the user has net access - 1 or 0. 42 NoMail Whether the user cannot send mail - 1 or 0. 43 Verified Whether the user is a verified user - 1 or 0. 44 DLMult The percentage of time that is charged for downloads by the current user. 45 ULMult The percentage of time that is charged for uploads by the current user. 46 Initials The current user's initials. 47 Password The current user's password. 48 RealName The current user's real name. 49 ConnectRate The speed that the modem is talking to the other modem at: 300, 600, 1200, 2400, 4800, 7200, 9600, 12000, 14400, 16800, 19200, 21600, 24000, 26400, 28800, 38400, 57600, 115200, or 230400. 50 Nulls The number of nulls the current user is configured for. 51 Linefeed Whether the current user has linefeeds turned on - 1 or 0. 52 Uppercase Whether the current user is configured for an uppercase-only terminal - 1 or 0. 54 Columns The number of columns the current user is configured for. 55 Lines The number lines on screen the current user is configured for, or 0 if screen pause is turned off. 56 Unlisted Whether the current user has an unlisted userlog entry - 1 or 0. 57 MData Which serial port the system is using; 1, 2, 3, or 4. 58 Baud Old port rate index. Do not use this as it is included only for backwards compatibility; use PortRate (68) instead. The possible values are: 0 (300 bps), 1 (600 or 1200 bps), 2 (2400 bps), 3 (4800 bps), 4 (9600 bps), 5 (19200 bps), 6 (38400 bps), 7 (57600 bps), or 8 (115200 bps). 62 TRMNormal The string to send to change the current user's terminal to normal text. 63 TRMBold The string to send to change the current user's terminal to bold text. 64 TRMInvr The string to send to change the current user's terminal to inverse text. 65 TRMBlink The string to send to change the current user's terminal to blinking text. 66 TRMUnder The string to send to change the current user's terminal to underlined text. 67 EffBaud Old connect rate index. Do not use this as it is included only for backwards compatibility; use ConnectRate (49) instead. The possible values are: 0 (300 bps), 1 (600 or 1200 bps), 2 (2400 bps), 3 (4800 bps), 4 (7200 bps), 5 (9600 bps), 6 (12000 bps), 7 (14400 bps), 8 (16800 bps), 9 (19200 bps), 10 (21600 bps), 11 (24000 bps), 12 (26400 bps), 13 (28800 bps), 14 (38400 bps), 15 (57600 bps), 16 (115200 bps), and 17 (230400 bps). 68 PortRate The speed that Citadel is talking to the modem at: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, or 115200. 69 Country The country of the system, as set by #NODECOUNTRY in CONFIG.CIT. 70 NodeName The name of the system, as set by #NODENAME in CONFIG.CIT 71 Region The region of the system, as set by #NODEREGION in CONFIG.CIT 72 Version Citadel's version string, such as "/065". 73 Hall The name of the hall the user is currently in. 74 Room The name of the room the user is currently in. 75 TempPath The path specified by #TEMPPATH in CONFIG.CIT. 76 ApplPath The path specified by #APPLICPATH in CONFIG.CIT. 77 HelpPath The path specified by #HELPPATH in CONFIG.CIT. 78 HomePath The path specified by #HOMEPATH in CONFIG.CIT. 79 RoomPath The path specified by #ROOMPATH in CONFIG.CIT. 80 MsgPath The path specified by #MSGPATH in CONFIG.CIT. 81 PrintFile The full name of the printer output file as specified by #PRINTER in CONFIG.CIT. 82 TrapFile The path specified by #TRAP_FILE in CONFIG.CIT. 83 Accounting Is accounting turned on for the system. 84 TransPath The path specified by #TRANSPATH in CONFIG.CIT. 85 Software The name of the currently running software. (For example, "Citadel+".) 90 Attr The value of #ATTR in CONFIG.CIT. 91 WAttr The value of #WATTR in CONFIG.CIT. 92 CAttr The value of #CATTR in CONFIG.CIT. 93 Uttr The value of #UTTR in CONFIG.CIT. 94 BAttr The value of #BATTR in CONFIG.CIT. 95 Transmitted The number characters sent by Citadel to the currently logged- in user. 96 Received The number of characters received by Citadel from the currently logged-in user. 97 SysReq Whether the system has been requested (F3 or Alt+F3) -1 or 0. 98 ConLock Whether the system console is locked - 1 or 0. 99 StatusScreen Whether the system status screen (F4) is displayed or not - 1 or 0. 100 Chat Whether Chat is enabled or not - 1 or 0. 101 Bells Whether bells are enabled or not - 1 or 0. 102 Printing Whether output is being trapped (Alt+P) or not - 1 or 0. 103 SysopName The value of #SYSOP in CONFIG.CIT. PCBOARD.SYS. format The information used to create this file came from the FeatherNet PRO! 1.01 documentation, page 44.15. PCBOARD.SYS is a fixed-width field file with a truly evil file format. Information noted as being written out as an "integer" is written in two bytes, MSB followed by LSB. Other fields are written as ASCII, padded out to the field length shown with spaces. The information written out by Citadel is: Offset Length Name Description 0 2 Unknown The text "-1" 2 2 Unknown The text " 0" (note the leading space). 4 2 Chat on The text "-1" if chat is on or " 0" (note the leading space) if chat is off. 6 2 User in file The text "- 1". 8 1 Expert mode The text "Y" if helpful hints are turned off, or "N" if they are on. 9 2 Error correction The text "-1" if an error-correcting protocol is in use by the modem, or " 0" if not (note the leading space). 11 1 Graphics mode The text "Y" if ANSI is turned on, or "N" if not. 12 1 Unknown The text "A". 13 5 DTE Rate The port rate, padded with spaces on the left. 115,200 is written out as "11520". I think. 18 5 DCE Rate The connect rate, padded with spaces on the left. 115,200 is written out as "11520" and 230,400 is written out as "23040". I think. If there is no carrier, the word "Local" is written. 23 2 User number The position of the current user in LOG.DAT written as an integer. 25 15 User's first name The current user's name with color codes removed, up to the first space or 15 characters, whichever comes first. Padded with spaces on the right. 40 12 User's password The current user's password, up to the first 12 characters, padded with spaces on the right. 52 2 Time logged on The time the current user logged on (or the current time if there is no user logged on) expressed as minutes since midnight, written as an integer. 54 2 Time on The time the current user has been on the system (or 0 if there is no user on the system) expressed in minutes as an integer. 56 5 Time logged on The time the current user logged on (or the current time if there is no user logged on) expressed in "12:34" format. 61 2 Time allowed The total time allowed on the system in minutes, calculated by adding the time already spent on system to the time left in the current user's account, expressed in minutes as an integer. 63 2 D/L limit The number "99" written out as an integer. 65 1 Conf last joined The LSB of the current room's room number. 66 5 Areas been in All bits set (0xFF, 0xFF, 0xFF, 0xFF, 0xFF). 71 5 Areas scanned All bits set (0xFF, 0xFF, 0xFF, 0xFF, 0xFF). 76 2 Unknown The number "0" written as an integer. 78 2 Unknown The number "0" written as an integer. 80 4 Unknown Four spaces. 84 25 Full name The first 25 characters of the user's name after removing color codes. 109 2 Time left The time left on the system in minutes (limited to 546 to avoid overflowing other software) written as an integer. 111 1 Node on The ASCII character 0x00. 112 5 Event time The text "00:00". 117 2 Event active The text " 0" (note the leading space). 119 2 Unknown The text " 0" (note the leading space). 121 4 Unknown All bits cleared (0x00, 0x00, 0x00, 0x00). 125 1 Com port The number "1" through "4" written as ASCII characters. (0x31 through 0x34) or the ASCII character "0" (0x30) if on console. 126 2 File transfer type The keystroke used for the current user's default file transfer protocol, written twice. 128 1 ANSI mode 0x01 if ANSI is active, or 0x00 if not. 129 13 Unknown Filled with spsaces (ASCII 0x20). 142 2 Last area in The current room's index in ROOM.DAT, written as an integer. README.APL. format README.APL is a text file that Citadel displays to the user after returning from a shell. After Citadel displays the file, it deletes it. TRIBBS.SYS. format TRIBBS.SYS is a text file, with each field taking a line followed by a carriage return/line feed (ASCII 13 and ASCII 10) combination. The information that Citadel writes is: User's record number The index of the current user in LOG.DAT (not that this means anything with Citadel). User's name The name of the current user, after color codes have been removed. User's password The current user's password (but not initials). Security level The current user's security level: 5 for problem user, 75 for regular users, 200 for Aides, and 250 for Sysops. Expert mode The text "Y" if helpful hints are turned off, or "N" if they are on. ANSI mode The text "Y" if ANSI is turned on, or "N" if not. Minutes left The number of minutes left this call, limited to 546 to keep from overflowing other software. Phone number The current user's phone number. City and State The last line of the current user's address, or blank if there is no address data. Birthdate The current user's birthdate, written in the form "01/01/95". Node number The text "1". Serial port The port, from "1" to "4". Baud rate The current connect rate, or 0 if the user is on local. Port rate The current port rate. RTS/CTS The text "Y" if #CHECKCTS in CONFIG.CIT is set to 1, or "N" if set to 0. Error correction The text "Y" if the modem is using an error-correcting protocol, or "N" if not. Board's name The name of the system with color codes removed. Sysop's name The name of the sysop as set by #SYSOP in CONFIG.CIT with color codes removed. User's alias The name of the current user with color codes removed. RIP Script support The text "N". USERINFO.DAT . format USERINFO.DAT is a text file, with each field taking a line followed by a carriage return/line feed (ASCII 13 and ASCII 10) combination. The information that Citadel writes is: User's name The current user's name with color codes removed. Connect rate The current connect rate, or the text "LOCAL" if there is no carrier. Data bits The text "8" ANSI The text "Y" if the current user has ANSI enabled, or "N" if not. MNP Connection The text "N". Time/date of call The time and date of the current call (or the current time and date if there is no user logged in) written in the form "00:00 01/01/95". Current time/date The current time and date written as "00:00 01/01/95". Minutes remaining The number of minutes left in the current user's account, limited to 546 to avoid overflowing other software. Start with cmd line The text "N". Current conference The index of the current room in ROOM.DAT. Active menu number The text "0" ("Main" in Wildcat! speak). Security level name Citadel writes a blank line. Banked time The text "60". Door number The text "1". Alias name The current user's name with color codes removed. Hang up in door The text "N". Files downloaded The number of files the current use has downloaded. (Citadel stores this information for each user, but currently does not track it.) K downloaded The total kilobytes downloaded by the current user. (Citadel stores this information for each user, but currently does not track it.) _Appendix I: Legal The only copyright on Citadel is one that Borland (the makers of our compiler) told us to put on it. Challenge yourself: find the notice in the program. However, we didn't add any copyright to it. You are free, and actually encouraged, to copy and distribute it as much as you want for any purposes that you want. Honor dictates that you don't call it your own, or try to sell it for a profit, or change the files in any way, but there is nothing really keeping you from doing it. (Other than the thought of little pixies pricking you in your sleep for the rest of your life.) (Challenge yourself again, and look for that message in Citadel.) A possible problem arises, however, if you distribute the program outside of the United States of America. I don't know if the message encryption in Citadel is good enough to bother the government, but there are certain restrictions on exporting data encryption technology from the United States. Our government is so paranoid that this technology falls under the same classification as nuclear warheads: a weapon of war. (You cannot export nuclear warheads, either.) I am sure than a good mathematician specializing in cryptology can find a way to break the encryption without too much difficulty, but there may be a problem anyway. I have not looked into the laws, so I don't know much more than this. Also note that we cannot, of course, warrant the program's operation in any way. We test it thoroughly and run it ourselves, but even with the safety precautions we go through, some potentially dangerous bug may exist, which could cause data loss or equipment failure. This is not likely, and we will try to fix any such bugs brought to our attention, but we cannot give any guarantee that such bugs don't exist, or can be fixed. Source code is generally not available to the public. If you require source code for some reason, call The Anticlimactic Teleservice at (206)562-9792. We will make a decision to release code on an individual basis. Be aware, however, that code releases are not common. _Index CHAIN.TXT. See Shell Files _#_ Citadel-86 #CONFIG.CIT MSGADD, 36, 43 #DUMB_MODEM, 85 MSGOUT, 36, 43 COMMAND.COM, 22, 23, 130 _A_ Commands Accounting, 11 .Aide ANSI Colors, 13 Attributes (.AA), 64 Applications, 22 Chat (.AC), 64 Auxmem version, 1, 51, 64, Copy message to old- 82, 92, 93, 173, 188, 267 buffer (.A<), 66 Edit room (.AE), 9, 25, _B_ 39, 48, 57, 65, 66, 79 Basic Usage, 4 File set (.AF), 65 BL@, 27 Group (.AG), 9, 65 BLB, 27 Hall (.AH), 65 Insert (.AI), 73 _C_ Insert message (.AI), 65 CALLINFO.BBS. See Shell Jump to Aide) and Files Maintenance (.AJ), 65 Kill room (.AK), 65 List group (.AL), 9, 62, 6 Set file information Menu (.A?), 66 (.AS), 66 Move file (.AM), 65 Unlink (.AU), 30, 66 Move room back (.A-), 66 Window room (.AW), 66 Move room forward (.A+), .Aide (.A...), 61, 64 66 Edit room (.AE), 86 Name message (.AN), 65 Hall (.AH), 100 Name messages (.AN), 29, Name messages (.AN), 94, 164, 169, 203 95 Queue (.AQ...), 65 Window (.AW), 100 Auto mark/kill/censor .Bypass (.B), 57 toggle (.AQA), 65 .Bypass (.B...), 70 Clear (.AQC), 65 .Chat (.C), 66 Insert (.AQI), 65 .Download (.D...), 22, Kill (.AQK), 65 66, 129 List (.AQL), 65 Menu (.D?), 32, 33, 129 Menu (.AQ?), 66 .Enter (.E...), 66 Move (.AQM), 65 Application (.EA), 22, Room mark (.AQR), 65 25, 66 Sort (.AQS), 66 Border (.EB), 67, 94, Verbose (.AQV), 66 120 Rename file (.AR), 66 Configuration (.EC), 6, 7, 12, 13, 28, 29, 30, Exclusive message (.EE), 31, 34, 44, 48, 67, 67 71, 72, 86, 93, 96, File-linked (.E*), 68 148, 169 Group-only (.EG), 67 Message Editor options Hall (.EH), 67 (E), 6, 7, 48, 71, 72 Local (.EL), 67 Confirm Abort (A), 6, Menu (.E?), 32, 68 71 Message (.EM), 9, 67 Confirm Save (S), 7, Name (.EN), 28, 67 72 Old (.EO), 6, 66, 67, 71 Verbose Continue (V), Password (.EP), 67 6, 71 Room (.ER), 9, 67, 168 Terminal settings (T), Surname / Title (.ES), 13 67, 94 ANSI color (C), 13 Text file (.ET), 67 ANSI mode (A), 13 With protocol (.EW...), Attributes (R), 13 5, 67 Door (.ED), 105 Menu (.EW?), 32, 67 Door (.ED...), 22, 24, .Expert toggle (.X), 70 67, 104 .Finger (.F...) Menu (.ED?), 32 Menu (.F?), 32 Exclude room (.EX), 68 .Goto (.G), 57 .Goto (.G...), 68 Exclusive message (.KE), .Help 69 Menu (.H?), 33 Group-only (.KG), 68 .Help (.H), 34 Halls (.KH), 68 .Help (.H...), 68 Hidden (.K)), 69 .Invite Local (.KL), 69 Menu (.I?), 33 Menu (.K?), 69 .Invite (.I...), 70 New (.KN), 69 List users (.IL), 70 Number of messages Menu (.I?), 70 (.K#), 69 Room list (.IR), 70 Old (.KO), 69 User (.IU), 70 Permanent (.KP), 68 .Jumpback (.J), 68 Room information (.KI), .Known 69 Menu (.K?), 33 Rooms (.KR), 68, 69 .Known (.K...), 68 Shared (.KS), 69 Anonymous (.KY), 68 This hall only (.KT), 69 Application (.KA), 68 Verbose (.KV), 69 BIO (.KB), 69 Window (.KW), 69 Directory (.KD), 68 .Login (.L...), 69 Empty (.K0), 69 .Mal serach (.M), 69 Excluded (.KX), 69 .Menu (.?), 33, 71 .Personal hall (.P...) Configuration (.RC), 58, Add 63 Menu (.PA?), 33 Directory (.RD), 5, 59 Menu (.P?), 33 Exclusive (.RE), 59 .Queue (.Q...), 70 Forward (.RF), 59 Add (.QA), 70 Group-only (.RG), 10, 59 Clear (.QC), 70 Messages (.RGM), 10 Download (.QD), 70 Group-only (.RG...) Download (.QD?), 33 Userlog (.RGU), 100 List (.QL), 71 Halls (.RH), 59 Menu (.Q?), 32, 71 Header scan (.R!), 58 Remove (.QR), 71 Info file (.RI), 5, 59, .Read (.R), 57 62 .Read (.R...), 58 Keyword search (.RK), 58 All (.RA), 58 Local (.RL), 59 All (.RA...), 100 Menu (.R?), 33, 60 Archive file (.RZ), 59, Messages (.RM), 58, 100 60, 104 New (.RN), 59 By date (.R&), 58 Number (.R##), 58 By message number (.R#), Old (.RO), 59 58 Public (.RP), 59 By user (.RB), 58 Reverse (.RR), 59 Status (.RS), 59, 78, 96 Abort (.SA), 60 Text file (.RT), 59 Aide function (.SF), 61 Userlog (.RU), 58, 59 Auxmem memory status Verbose (.RV...), 59 (.S^), 64 Status (.RVS), 128, Config file (.SE), 61 245, 259, 261 Create PATH.DAT (.S>), With protocol (.RW...), 60 5, 60 Cron (.SC...), 60 Menu (.RW?), 33, 60 All done (.SCA), 60 .Sysop (.S...) Done (.SCD), 60 6.9 net command Enter (.SCE), 60 (.S6...), 42, 64 Force (.SCF), 61 Build address (.S6@), List (.SCL), 61 64 Menu (.SC?), 32, 61 Fetch (.S6F), 42, 64 Next event set (.SCN), Generate room request 61 (.S6R), 64 Pause (.SCP), 61 Incorporate (.S6I), Reset event (.SCR), 61 42, 64 Set success time Menu (.S6?), 34, 64 (.SCS), 61 Room request (.S6R), Zap event toggle 42 (.SCZ), 61 Date set (.SD), 61 membership (.SGG), 62 Enter config file Kill (.SGK), 9, 62 (.SE...) List (.SGL), 9, 62 All (.SEA), 61 Menu (.SG?), 33, 62 CONFIG.CIT (.SEC), 61 New (.SGN), 9, 62 CRON.CIT (.SET), 60, Operator-specific 61 membership (.SGO), 62 EXTERNAL.CIT (.SEE), User-specific 61 membership (.SGU), 62 GRPDATA.CIT (.SEG), 61 Hall (.SH...), 62 MCI.CIT (.SEI), 61 Edit (.SHE), 9, 62 MDMRESLT.CIT (.SEM), Force access (.SHF), 61 62 Menu (.SE?), 33, 61 Global room (.SHG), 62 PROTOCOL.CIT (.SEP), Kill (.SHK), 62 61 List (.SHL), 62 Exit Citadel (.SX), 63 Menu (.SH?), 33, 62 Full path file download Move hall backward (.S%), 64 (.SH-), 62 Group (.SG...), 61 Move hall forward Edit (.SGE), 9, 61 (.SH+), 62 Group-specific New (.SHN), 9, 62 Info file reset (.SI), (.S+...), 63 62 Menu (.S+?), 34 Journal room (.SJ), 63 Message (.S+M), 63 Kill user (.SK), 63 Room (.S+R), 64 Login enable (.SL), 63 Userlog edit (.SU), 11, Mass delete (.SM), 63 12, 27, 30, 36, 63, Menu (.S?), 34, 64 102 New user verify (.SN), Node (O), 36 63 Zap empty rooms (.SZ), Off hook (.SO), 61 63 Purge userlog (.SP), 63 .Terminate (.T...), 70 Read by message number Menu (.T?), 34, 70 (.S#), 64 Quit-also (.TQ), 70 Reset Maintenance hall Stay (.TS), 70, 100 (.S1), 60 Verbose (.TV), 70 Run script (.SR), 63, .Upload (.U...), 22, 70, 138 129 Shell to DOS (.S!), 63 Menu (.U?), 34, 129 Show user (.SS), 63 .Volkswagen (.V...) Super-shell to DOS Menu (.V?), 34 (.S@), 63 Console-only, 73 Table debugging Accounting toggle (Alt+A) Ignore up-time toggle Aide toggle (Alt+F6), 74 (Alt+U), 75 Bells toggle (F7), 74 Less time (PgDn), 11, 76 Chat mode (F8 or Alt+C), More time (PgUp), 11, 76 74 Printing toggle (Alt+P), Chat toggle (F9), 74 75 Clear screen (Alt+F1), Repeat event (Alt+R), 75 74 Request (F3), 74 Console / Modem mode Request with an attitude (F5), 74 (Alt+F3), 74 Console lock (Alt+L), 75 Reset (F2), 74 Console sysop (Ctrl+F6), Screen saver (Alt+S), 75 74 Scroll-back buffer Debug toggle (Alt+D), 75 (Alt+K), 75 Event time-out (Alt+E), Second status line 75 toggle (Alt+F10), 75 Exit (Alt+X or Alt+F4), Shutdown (F1), 73 75 Speech toggle (Ctrl+F1), Filter toggle (Alt+B), 73 75 Status line toggle Force event (Alt+F), 75 (Sft+F10), 75 Help (F10 or Alt+H), 75 Status screen (F4), 74 Sysop function (F6), 74 76 Sysop toggle (Sft+F6), Super-shell (Alt+S), 76 74 Menu (?), 32, 33 Time-out (Alt+Z), 75 Multiple-key (extended), Toggle input focus 57 (Ctrl+F2), 74 Output commands, 73 Twit toggle (Alt+T), 75 Header scan (!), 73 Verified toggle (Alt+V), Jump (J), 73 75 Kill (K), 73 Dial-out, 76 Mark (M), 73 Debug toggle (Alt+D), 76 Next (N), 73 Duplix toggle (Alt+P), Pause (P), 73 76 Reverse (R), 73 Exit dial-out mode Stop (S), 73 (Alt+Q), 76 Verbose toggle (V), 73 Hang-up (Alt+H), 76 Single-key, 55, 56 Macros (Fkeys), 76 Small chat (, 57 Scroll-back (Alt+K), 76 Aide edit room (A), 56, Shell (Alt+E), 76 65 Slow down (PgDn), 76 Auto verbose (V), 60 Speed up (PgUp), 76 Auto verbose toggle (V), Status screen (Alt+V), 57 Bypass (B), 55, 57, 70, Next room (+), 57 87 Old messages (O), 56 Chat (C), 55, 64, 66, Previous hall (<), 56, 74, 193, 212, 219 67 Download (D), 5, 56 Previous room (-), 57 Enter exclusive (M), 57 Reverse messages (R), 56 Enter message (E), 4, 5, Terminate (T), 5, 56 55, 56 Upload (U), 5, 57 Exclude (X), 57 Sysop (.S...), 60, 74, Forward messages (F), 55 233 Goto new messages (G), Window, 76 4, 5, 55, 56, 57, 70, COMSPEC, 22, 130 87 CONFIG.CIT, 78, 107, 120 Help (H), 55 #ACCOUNTING, 11, 95, 97, Information (I), 35 102 Introduction (I), 56 #ADCHANCE, 27, 91 Jumpback (J), 55, 68 #ADDRESS, 79 Known rooms (K), 56 #ADTIME, 27, 91 Login (L), 57 #AIDECHATHRS, 64, 91 Menu (?), 56 #AIDEHALL, 65, 66, 100, New messages (N), 4, 56 153 Next hall (>), 5, 56, 67 #ALLOWCRYPT, 6, 71, 102 #ALTF3MSG, 92 #CHECKSYSMAIL, 49, 91 #ALTF3TIME, 92 #CIT86COUNTRY, 90, 154 #ANONAUTHOR, 95, 153 #CIT86DOMAIN, 90, 154 #APPLICPATH, 23, 39, 79, #CONNECTWAIT, 86, 155 80, 104, 130, 159 #CONSOLETIMEOUT, 89 #ATTR, 81, 153 #COUNTBEEP, 89, 155 #AUTOANSI, 85, 122, 153, #CREDIT_NYM, 11, 95, 155 193 #DATESTAMP, 44, 93, 121 #BADPWPAUSE, 102 #DIAL_INIT, 84, 111 #BATTR, 81, 153 #DIAL_PREF, 84, 107, 111, #BAUDPAUSE, 86 151, 156 #BIOS, 47, 89, 154 #DIAL_RING, 84, 85, 86 #BORDER, 94, 95 #DIALMACRO, 76, 90, 236 #BORDERFREQ, 96 #DIALRING, 156 #CALLLIMIT, 30, 102 #DICTIONARY, 48, 80 #CATTR, 81, 154 #DIRPATH, 80, 156 #CENSOR, 12, 94 #DISKFREE, 90, 156 #CHATBELL, 97 #DLPATH, 41, 80, 156 #CHATFLASH, 91 #DOWNSHIFT, 84 #CHATMAIL, 28, 91 #DUMB_MODEM, 83, 84, 85, #CHATWHY, 91 156, 158 #CHECKCTS, 85, 154 #ECCOLOR, 96 #ECSIGNATURE, 96 34, 79, 80, 158 #ECTWIRLY, 96 #HELPPATH2, 34, 79, 158 #ECUSERLOG, 96 #HOMEPATH, 16, 77, 78, #ENTER_NAME, 94 79, 80, 98, 128, 149, #ENTER_NYM, 157 158, 190, 259, 261 #ENTEROK, 100, 157 #IDLE_WAIT, 83, 86, 114 #EXPIRE, 90, 157 #INIT_BAUD, 83, 84, 107 #F6PASSWORD, 60, 64, 74, #LEXPATH, 48, 80 75, 88, 99 #LOGEXTDIR, 80, 159 #FASTLOGIN, 92 #LOGIN, 28, 29, 63, 97, #FASTSCRIPTS, 92 98, 159, 235 #FILEBUFSIZE, 90 CLOSED_SYSTEM, 28, 97, #FILTER, 75, 97 159 #FORCELOGIN, 57, 100, 157 SYSOP_MESSAGE, 29, 98, #FORWARD, 79, 88 159 #FUELBAR, 96 #MAXBORDERS, 82, 162 #FULLCONLOCK, 74, 99 #MAXERROR, 96 #GROUP_NYM, 97 #MAXFILES, 82, 162 #HALL_NYM, 97 #MAXGROUPS, 82, 162, 271 #HANGUP, 84, 85 #MAXHALLS, 82, 162 #HANGUPDELAY, 85 #MAXJUMPBACK, 89, 162 #HELPPATH, 27, 31, 33, #MAXLOGTAB, 81, 82, 162, 2 #MSGPATH, 80, 164 #MAXROOMS, 81, 82, 162, #MUSIC, 96, 123 267, 271, 272, 274 #NET_PREFIX, 93, 123 #MAXSTAT, 89, 169 #NETMAIL, 86 #MCI_DATE, 95 #NEWBAL, 97 #MCI_FIRSTNAME, 95 #NEWNODEALERT, 92 #MCI_NAME, 95 #NEWUSERAPP, 25, 98 #MCI_POOP, 95 #NEWUSERQUESTIONS, 29, 98 #MCI_TIME, 95 #NMESSAGES, 81, 82, 88, #MDATA, 78 165 #MEMFREE, 92 #NOBELLS, 91 #MESSAGE_NYM, 94, 95, 164 #NOCHAT, 91 #MESSAGE_ROOM, 100 #NOCONSOLETRAP, 103 #MESSAGEK, 81, 82, 163 #NODECOUNTRY, 78, 165 #MIN_BAUD, 83 #NODENAME, 78, 165 #MINBAUD, 30 #NODEPHONE, 78, 165 #MODERATE, 100, 153 #NODEREGION, 78, 165 #MODSETUP, 83, 84, 85, #NOPWECHO, 101, 165, 200 86, 163 #NUMROOMS, 102 #MODUNSETUP, 83, 163 #OFFHOOK, 85 #MOREPROMPT, 93, 123 #OFFHOOKSTR, 85, 165 #MSGCOMPRESS, 81, 88 #OLDCOUNT, 86 #OVREMS, 91 #SHOWMOVED, 92 #OVREXT, 91 #SHOWSYSOP, 102 #PERSONALHALLOK, 96 #SIGNATURE, 94, 165 #POOP!, 95, 166, 201 #SLEEPCOUNT, 89, 194 #PRINTER, 80, 166, 201 #SLEEPPROMPT, 89, 96 #PROMPT, 93 #SOFTVERB, 96 #PWDAYS, 102 #SPEECHON, 91 #READALL, 100, 166, 202 #SUBHUBS, 55, 87, 169, #READLLOG, 100 203 #READLOG, 102 #SWAPNOTE, 92 #READOK, 100, 167 #SYSOP, 19, 79, 89, 157, #RESTORE_MODE, 89 170, 196, 214 #RLMPATH, 80 #SYSOPOK, 102 #ROOM_NYM, 97 #TEMPPATH, 80, 170 #ROOMOK, 100, 174 #TIMEOUT, 89 #ROOMPATH, 79 #TRANSPATH, 41, 42, 64, #ROOMTELL, 79, 86 80, 107, 108, 114, 170 #SAVEJB, 92 #TRAP, 101, 102, 110, 235 #SAVERMSG, 88 #TRAP_FILE, 80, 101, 170 #SCREENSAVE, 87, 88 #TWIRLY, 96, 170 #SCRIPTPATH, 79 #TWIT_FEATURES, 15, 65, #SCROLL_BACK, 46, 75, 88 67, 94, 95, 154, 162, 164 #DO, 25, 114, 115, 142, BORDER_LINES, 95 237 #TWITCOUNTRY, 95 CHAT_OFF, 114 #TWITREGION, 95 CHAT_ON, 114 #TWITREV, 96 COMMAND, 114, 138, 142 #UNLOGGEDBALANCE, 11, 97 NET69_IN, 42, 114 #UNLOGTIMEOUT, 89 NET69_OUT, 42, 114 #UP_DAYS, 75, 84, 86 NET86_IN, 115 #UP_HOURS, 75, 84, 86 NET86_OUT, 115 #USER_NYM, 97 NETWORK, 36, 114 #UTTR, 81, 173 SHELL_1, 25, 114 #VDATESTAMP, 44, 93, 126 SHELL_2, 25, 114 #VIRTMEM, 93 SHUTDOWN, 114 #WATTR, 81, 173 #HOURS, 115 #WYSIWYG, 91 #MONTHS, 115 Modem keywords, 83 #REDO_TIME, 116 CONSOLE.APL. See Shell #RETRY_TIME, 114, 116 Files CRON.TAB, 77 CRASH.CIT, 279 CTDL.DAT, 233, 234, 235, CRON.CIT, 114 243 #DATES, 116 CTDLDAT.EXE, 234 #DAYS, 115 CTDLDATA.DEF, 234, 235 #DSTAMP, 44, 121 _D_ #EXCLUDEENCRYPTED, 121 daylight saving time, 44 #EXPERT, 121 DEFUSER.CIT, 120 #FINGER, 121 #ADDR1, 120 #FORWARD, 121 #ADDR2, 120 #FORWARDNODE, 121 #ADDR3, 120 #HALLTELL, 121 #AIDE, 120 #HIDEEXCL, 121 #BLINK, 120 #IBMANSI, 122, 123 #BOLD, 120 #IBMCOLOR, 122 #BORDERS, 120 #IBMGRAPH, 122 #CALLLIMIT, 120 #IBMROOM, 122 #CHECKALLCAPS, 120 #INVERSE, 122 #CHECKAPS, 120 #KNODE, 122 #CHECKDIGITS, 120 #KREG, 122 #CONFIRMABORT, 120 #KTEXT, 122 #CONFIRMEOABORT, 121 #KUSER, 122 #CONFIRMSAVE, 121 #LFMASK, 122 #CREDITS, 11, 121 #LINESSCREEN, 123 #DEFAULTHALL, 121 #LOCKHALL, 123 #DICTWORD, 121 #LOCKUSIG, 123 #DISPLAYTS, 121 #MINIBIN, 123 #MOREPROMPT, 123 #PROBLEM, 125 #MSGCLS, 123 #PROMPT, 125 #MSGPAUSE, 123 #PROTOCOL, 125 #MUSIC, 123 #PSYCHO, 125 #NETPREFIX, 123 #PUNPAUSES, 125 #NETUSER, 123 #REALNAME, 125 #NEXTHALL, 123 #REPLACE, 125 #NOACCOUNT, 124 #ROOMINFO, 125 #NOCHAT, 124 #ROOMTELL, 125 #NODE, 124 #SEEBORDERS, 125 #NODOWNLOAD, 124 #SHOWCOMMAS, 125 #NOMAIL, 124 #SIGNATURE, 125 #NOMAKEROOM, 124 #SIGNATURES, 125 #NOUPLOAD, 124 #SPELLCHECK, 125 #NULLS, 124 #SUBJECTS, 125 #NUMUSERSHOW, 124 #SURNAME, 126 #OLDTOO, 124 #SURNAMLOK, 126 #OUT300, 124 #SYSOP, 126 #PERMANENT, 124 #TABS, 126 #PHONENUM, 124 #TITLE, 126 #POOP, 124 #TUSER, 126 #PRINTFILE, 125 #TWIRLY, 126 #UCMASK, 126 ETC.TAB, 77 #UNDERLINE, 126 EXTERNAL.CIT, 104 #UNLISTED, 126 #ARCHIVER, 24, 60, 104 #USEPERSONAL, 126 #AUTO_EDITOR, 24, 104 #VDSTAMP, 44, 126 #CENSOR_AUTHOR, 12, 104 #VERBOSE, 126 #CENSOR_NODE, 12, 104 #VERBOSECONT, 126 #CENSOR_TEXT, 12, 104 #VERBOSELOGOUT, 127 #DIRECTORY, 64, 104 #VERIFIED, 127 #DOOR, 24, 67, 104 #VIEWCENSOR, 127 #EDITOR, 24, 104, 105 #WIDEROOM, 127 #EVENT, 22, 25, 105, 155, #WIDTH, 127 236, 261 #YOUAREHERE, 127 #HOLIDAY, 45, 104, 106 DOOR.SYS. See Shell Files #NETCOMMAND, 106, 149, DORINFO1.BBS. See Shell 164 Files #REFUSER, 104 DOS PATH, 39, 79 #REPLACE, 104, 106 DragCit, 36, 37, 38 #USERAPP, 25, 104, 106 _E_ _F_ EMS, 1, 22, 46, 51, 63, 64, File Transfer Protocols 88, 91, 93, 130, 280, 281 1K Xmodem, 5, 131 Xmodem, 5, 131 Meta-groups Xmodem CRC, 5, 131 *AIDE, 10 Ymodem, 131 *NETWORK, 10 Zmodem, 5, 131 *NODE, 10 FILE69, 41, 42, 107, 283, *NOMAIL, 10 284 *PERMANENT, 10 FILEINFO.DAT, 62 *SYSOP, 10 FILEQTMP.CIT, 279 *TWIT, 10 FOSSIL, 259 *UNLISTED, 10 Null, 10, 117, 118, 119 _G_ Reserved_2, 10, 110 Groups, 9, 11 GRPDATA.CIT, 11, 117 Auto-add, 9 #DAY_INC, 118 Boolean Expressions #DAYS, 117, 118 AND, 10 #DL_MULT, 118 Begin group ((), 10 #GROUP, 117, 118 End group ()), 10 #HOURS, 117, 118 NOT, 10 #MAX_BAL, 118 OR, 10 #PRIORITY, 117, 118 XOR, 10 #SPECIAL, 117, 118 Hidden, 9 #UL_MULT, 118 Lock from aides, 9 _H_ Hard disk, 1 ENTERNYM.BLB, 28, 240 HARDWARE.CIT, 128 ENTRY.BLB, 28, 239 #COMDRIVER, 128, 259 GOODBYE.BLB, 28, 239 #KBDDRIVER, 128 HELLO###.BLB, 28 #SNDDRIVER, 128, 261 JOKE####.BLB, 28 Help Files, 27 LENGTH.BLB, 29, 240 Blurbs LOGOUT##.BLB, 29 AD######.BLB, 27 MOREPRMP.BLB, 29, 240 ADDRESS.BLB, 27, 240 MSGNYM.BLB, 29, 240 BULLETIN.BLB, 27, 31, NETPREFX.BLB, 29, 240 239 NEWMSG.BLB, 29, 239 CALLIMIT.BLB, 27, 240 NEWQUEST.BLB, 29, 239 CENSOR.BLB, 12, 27, 240 NEWROOM.BLB, 29, 239 CHAT####.BLB, 27 NOANSWER.BLB, 29 CHATTED.BLB, 28, 240 NOCHAT##.BLB, 29 CLOSESYS.BLB, 28, 97, NOCHAT.BLB, 55, 74, 239 239 NOLOGIN.BLB, 29, 117, COLORS.BLB, 28, 240 239 DIALOUT.BLB, 28 NOROUTE.BLB, 29, 240 DISCLAIM.BLB, 12, 28, NULLS.BLB, 29, 240 240 NUMUSERS.BLB, 30, 241 ENCRYPT.BLB, 28, 240 PASSWORD.BLB, 30, 239 PHONENUM.BLB, 30, 240 FILES.HLP, 35, 241 PROMPT.BLB, 30, 93, 240 GROUPS.HLP, 35, 241 REALNAME.BLB, 30, 240 HALLS.HLP, 35, 241 RESUME.BLB, 30, 240 HELP.HLP, 35, 241 TEXTUP.BLB, 30, 239 INTRO.HLP, 35, 56, 241 TIME.BLB, 30, 240 LOGIN.HLP, 35, 241 TOOLOW.BLB, 30, 83, 239 MESSAGES.HLP, 35, 241 TOOMANY.BLB, 30, 240 NETWORK.HLP, 35, 241 UNLINK.BLB, 30, 241 QUEUE.HLP, 35, 241 USERINFO.BLB, 30, 239 ROOMS.HLP, 35, 241 VERIFIED.BLB, 30, 239 ROOMSYS.HLP, 35, 241 WCDOWN.BLB, 31, 240 SPECIAL.HLP, 35, 241 WCUP.BLB, 31, 240 SPELL.HLP, 35, 242 WIDTH.BLB, 31, 240 SYSOP.HLP, 35, 242 WOWCOUNT.BLB, 31, 240 Menus, 31 Help Files, 34 #AIDE, 31, 238 ACCOUNT.HLP, 34, 241 #AIDEQUEUE, 31, 238 AIDE.HLP, 34, 241 #BULLETINS, 31, 238 ANSI.HLP, 34, 241 #CRON, 32, 60, 238 CONFIG.HLP, 34, 241 #DOOR, 32, 238 DOHELP.HLP, 34, 241 #DOWNLOAD, 32 DOORS.HLP, 34 #EDIT, 32, 238 #EDITTEXT, 32, 239 #TERMINATE, 34, 238 #ENTERWC, 32, 239 #UPLOAD, 34 #ENTOPT, 32, 238 #VOLKSWAGEN, 34, 238 #FILEQUEUE, 32, 238 CTDL.MN@, 31 #FINGER, 32, 239 CTDL.MNU, 27, 31, 79, #GRPGLOB, 33, 238 238 #HELP, 33, 238 #INVITE, 33, 238 _I_ #KNOWN, 33, 238, 241 IBM AT, 1 #MAINDOT, 33, 238 IBM PC, 1, 78, 81, 128, 246 #MAINOPT, 33, 238 INPUT.APL. See Shell Files #PERSONAL, 33, 238 #PERSONALADD, 33, 239 _M_ #READOPT, 33, 238 MAILLIST.CIT, 135 #READWC, 33, 239 #INFOFILE, 135 #RESPONSEDOWNLOAD, 33 #INFOLINE, 135 #SYSENTER, 33, 238 #MAILLIST, 135 #SYSGROUP, 33, 238 #MAYLIST, 135 #SYSHALL, 33, 238 #MAYSUBSCRIBE, 135 #SYSNET, 34, 238 #MAYTELL, 135 #SYSOP, 34, 238 #USER, 135 #SYSTABLE, 34, 239 MDMRESLT.CIT, 132 #CONNECT230400C, 133 #BUSY, 132 #CONNECT230400E, 133 #COMPRESSION, 132 #CONNECT2400, 132 #CONNECT115200, 132 #CONNECT2400C, 133 #CONNECT115200C, 133 #CONNECT2400E, 133 #CONNECT115200E, 133 #CONNECT28800, 132 #CONNECT1200, 132 #CONNECT28800C, 133 #CONNECT12000, 132 #CONNECT28800E, 133 #CONNECT12000C, 133 #CONNECT300, 132 #CONNECT12000E, 133 #CONNECT38400, 132 #CONNECT1200C, 133 #CONNECT38400C, 133 #CONNECT1200E, 133 #CONNECT38400E, 133 #CONNECT14400, 132 #CONNECT4800, 132 #CONNECT14400C, 133 #CONNECT4800C, 133 #CONNECT14400E, 133 #CONNECT4800E, 133 #CONNECT16800, 132 #CONNECT57600, 132 #CONNECT16800C, 133 #CONNECT57600C, 133 #CONNECT16800E, 133 #CONNECT57600E, 133 #CONNECT19200, 132 #CONNECT7200, 132 #CONNECT19200C, 133 #CONNECT7200C, 133 #CONNECT19200E, 133 #CONNECT7200E, 133 #CONNECT230400, 133 #CONNECT9600, 132 #CONNECT9600C, 133 71 #CONNECT9600E, 133 Find and replace (F), 4, #CORRECTION, 132 6, 7, 71, 72 #ERROR, 132 Insert file (<), 8, 72 #NOANSWER, 132 Link application (!), 7, #NOCARRIER, 132 25, 72 #NODIALTONE, 132 Location (L), 7, 71 #RING, 132 Menu (?), 8, 73 #RUNAPPLIC, 133 Print formatted (P), 4, Menus. See Help Files 7, 72 Message Censoring, 12 Replace (R), 4, 7, 72 Message Command Interpreter Save (S), 4, 7, 72 (MCI) Commands, 15 Signature (I), 7, 71 Message editor, 6, 71 Special delivery options Abort (A), 6, 71 (#), 7, 72 Address message (@), 7, Subject (U), 7, 72 72 Verify spelling (V), 4, Allow ESC (~), 7, 72 7, 48, 72 Change name (*), 8, 73 Word count (W), 7, 72 Continue (C), 4, 6, 71 MESSAGE.APL. See Shell Delete buffer (D), 6, 71 Files Encrypt message (E), 6, Modem, 1 #GROUP, 38, 108, 110 _N_ #LOGIN, 25, 37, 38, 108, NETID.CIT, 40, 41, 148, 109, 110, 112 154, 175, 191, 283 Download (D), 37, 109 Networking, 36 Pause (P), 37, 109 Protocols Repeat (R), 37, 109 Citadel-86 compatible, Script (@), 38, 110 43 Send (S), 37, 109 DragCit 1.0/1.1, 36 Shell (!), 38, 109 DragCit 1.5/1.6, 38 Upload (U), 37, 109 Net 6.9, 39 Wait (W), 37, 109 NODES.CIT, 107 #MAPUNKGROUP, 108, 110 #AUTOGROUP, 41, 107 #MOREINFO69, 110 #AUTOHALL, 41, 69, 107 #NETFAIL, 110 #AUTOROOM, 40, 41, 69, #NETWORK, 37, 39, 40, 107, 283 110, 237 #BAUD, 37, 84, 107 CIT86, 110, 113 #DIAL_TIMEOUT, 37, 107 DRAGCIT1_0, 110, 112 #DIALOUT, 107, 110, 111 DRAGCIT1_1, 37, 110, 112 #FETCH, 42, 107 DRAGCIT1_5, 39, 110, 112 #FETCH_TIMEOUT, 108 DRAGCIT1_6, 39, 110, 112 #GATEWAY, 108, 276 HENGE, 110, 112 NET6_9, 40, 110, 112 ROOMCREATED, 112 NET6_9a, 40, 110, 112 ROOMNOTCREATED, 112 #NODE, 37, 110 #WAIT_TIMEOUT, 37, 109, Default, 40 112 #OUTPUTPACE, 110 #ZIP, 24, 25, 39, 41, 112 #PHONE, 37, 110 #PREDIAL, 111 _O_ #PROTOCOL, 37, 40, 111 OUTPUT.APL. See Shell Files #REDIAL, 111 #REQUEST, 41, 111 _P_ #ROOM, 38, 39, 40, 111 PCBOARD.SYS. See Shell #VERBOSE, 40, 41, 111, Files 112, 238 PROTOCOL.CIT, 129 0, 112 #AUTO_UPLOAD, 129 1, 112 #BATCH, 129 2, 112 #BLOCK_SIZE, 129 ALL, 112 #CHECK_TRANSFER, 130 FILE69IN, 111 #COMMAND_KEY, 129 FILE69INFULL, 112 #MENU_NAME, 129 NETIDNOTFOUND, 112 #NET_ONLY, 129 NOACCESS, 112 #PROTOCOL, 24, 32, 129 NONETIDONSYSTEM, 112 #RECEIVE, 129 Functions, 140 #RESPONSE_SEND, 129 Recursion, 139 #RESPONSEDOWNLOAD, 70 Internal functions, 148 #SEND, 129 Keywords, 141 Pseudonyms, 30 #ADD, 141 #AND, 141 _R_ #ASGN, 138, 141 RAM, 1, 82, 89, 93 #CALL, 141, 148, 191, README.APL. See Shell Files 205 Receipt confirmation #CHAIN, 141 requested, 7, 72, 185 #DIV, 141 Regular version, 1, 64, 82, #DO, 141, 142, 143 92, 93, 188, 267 #ELSE, 141, 142, 143 Room editing, 53 #ENDFUNC, 140, 142 ROUTE.CIT, 134 #ENDIF, 141, 142, 143 #ADDRESS, 134 #EQ, 142 #ROUTE, 134 #EXIT, 142 #FUNC, 140, 142 _S_ #GE, 142 Script files, 137 #GOTO, 142, 143 Debugging, 146 #GT, 142 #GVAR, 139, 143 #IF, 138, 141, 142, 143 Overview, 138 #IFNOT, 138, 141, 142, Variables, 139 143 Types #LABEL, 142, 143 Boolean, 139 #LE, 143 Integer, 139 #LOOP, 138, 141, 143 Long, 139 #LOOPNOT, 138, 141, 143 String, 139 #LT, 143 UInteger, 139 #LVAR, 139, 144 ULong, 139 #MOD, 144 Scroll-Back Buffer, 46 #MUL, 144 Setup, 1 #NE, 144 Shell Files #OR, 144 CALLINFO.BBS, 22, 25 #RET, 140, 144 CHAIN.TXT, 22, 25 #RUN, 144 CONSOLE.APL, 26 #STR, 144, 148, 191 DOOR.SYS, 22, 25 #SUB, 145 DORINFO1.BBS, 22, 25 #VERSION, 145 INPUT.APL, 25, 228 #WEND, 145 MESSAGE.APL, 25 #WHILE, 138, 145 OUTPUT.APL, 22, 25 #WHILENOT, 138, 145 PCBOARD.SYS, 22, 25 #XOR, 145 README.APL, 25, 104 TRIBBS.SYS, 22, 25 123, 184, 187, 225, 227 USERINFO.DAT, 22, 25 USERINFO.DAT. See Shell Sound Blaster, 128, 246, Files 250, 261 Source code, 285 _V_ Spell checker, 4, 7, 35, Virtual memory, 1, 46, 51, 48, 72, 80, 219, 225, 233 88, 93, 173, 282 Status line and screen, 49 System requirements, 1 _W_ Wow., 18, 19, 21, 32, 36, _T_ 38, 39, 43, 44, 45, 52, Time and Date Formatting, 53, 54, 62, 64, 66, 68, 44 70, 74, 76, 82, 83, 84, Time zones, 44 85, 91, 96, 97, 102, 110, TRIBBS.SYS. See Shell Files 120, 122, 125, 126, 130, TZ environment variable, 44 190, 206, 283, 284 _U_ _X_ User configuration, 52 XMS, 1, 22, 46, 51, 63, 64, User editing, 54 88, 93, 130, 281, 282 User signature, 7, 71, 96,