home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / BBS / HM11A.ZIP / 22222222.222 / PROGRAM.DOC < prev    next >
Text File  |  1992-11-10  |  75KB  |  1,733 lines

  1.  
  2.  
  3.  
  4.                 Harmony BBS Programmer's Reference Guide
  5.  
  6.  
  7.  
  8.                    (C)Copyright 1992 Concord Software
  9.                           All Rights Reserved
  10.  
  11.  
  12.  
  13.  ====================================================================
  14.  
  15.   The information discussed in this document has been supplied to
  16.   developers interested in creating Harmony BBS compatible software.
  17.   This file contains the basic outline of all the data files that
  18.   Harmony BBS uses.  Concord Software offers a full blown utility box
  19.   (in Turbo Pascal 6.0 .TPU format) for a fee.  With this unit,
  20.   programmers will be able to easily create their own doors and other
  21.   useful utilities for Harmony BBS WHILE incorporating ALL of the
  22.   functionality of the BBS itself.  For more information, please
  23.   contact Concord Software.
  24.  
  25.  ====================================================================
  26.  
  27.  
  28.  
  29.   This document will be broken down into each directory that Harmony
  30.   BBS uses.  It will attempt to explain in detail, all of Harmony BBS's
  31.   data files.
  32.  
  33.   Note that since Harmony BBS was written mostly in Turbo Pascal v6.0,
  34.   all data types are Pascal data types.  If you wish to create
  35.   utilities or doors in another language, you will have to make the
  36.   conversion WITHIN the program, but Pascal data structures must always
  37.   be read/written to the files.
  38.  
  39.  ====================================================================
  40.  
  41.               Updates from Harmony BBS version 1.0 -> 1.1
  42.  
  43.   There are a few changes that you should be aware of in the newest
  44.   version of Harmony BBS.
  45.  
  46.   1)  Within the BBS_STATS record, the variable MAILDIR is no longer
  47.   used.  It is still there, and is in the BBSSTATS.HMY file, but it is
  48.   not currently used.  I am leaving it there for a possible future
  49.   addition that I have an idea for.
  50.  
  51.   2)  Within the MSG_BASE_STATS record, the directory variable MSGPATH
  52.   is GONE.  Since Harmony BBS now uses the Squish format, this variable
  53.   was no longer needed.
  54.  
  55.       Also within this record, the variable NEW, which was the array of
  56.   high message read pointers for each record, is also gone.  Squish uses
  57.   its own format for this type of work, and Harmony BBS now looks at
  58.   that.
  59.  
  60.   3)  Since Harmony BBS is now using the Squish format, MSG_INDEX, and
  61.   MSG_FILE are gone.
  62.  
  63.   4)  The 3rd file for each file transfer section, known as the extended
  64.   description file (XX.EXT) has been eliminated (with extreme prejudice
  65.   {I've always wanted to say that} ).  It has been moved directly into
  66.   the FILE_STATS record.  This was done because of a bug in Harmony that
  67.   was causing it to lock up sometimes because of all the indexing that
  68.   was being done between 3 files.
  69.  
  70.   5)  All file statistic records are now parallel to each other between
  71.   the index file and the statistics file.  In other words, record #3
  72.   within the XX.IDX file, contains the file name of the information for
  73.   record #3 within the XX.HMY file.  This was done to make a lot easier
  74.   on the programmers.  The EXT_DESC_IDX within the FILE_DESC record is
  75.   now gone sine that information is local to that record now.
  76.  
  77.   6)  The record BATMAIL is gone all together.  The batch mail function
  78.   within Harmony BBS was very redundant, so this has been eliminated.
  79.  
  80.   7)  No more MARKED.HMY file in the message base section is gone.  The
  81.   Squish format facilitates a very fast searching structure so marking
  82.   messages is no longer needed.
  83.  
  84.  ====================================================================
  85.  
  86.   All variables and record fields marked throughout this document as
  87.   RESERVED should NEVER be used by any 3rd part software.  It is the
  88.   programmer's responsibility to ensure that all the variables marked
  89.   as RESERVED to NOT get changed through the use of their program.
  90.  
  91.   Here is the list of all the constants and data types used through this
  92.   document :
  93.  
  94. CONST
  95.  
  96.   MAXUSERS = 1000;
  97.  
  98. TYPE
  99.  
  100.   String36    = string[36];
  101.   String72    = string[72];
  102.   String20    = string[20];
  103.  
  104.   readflag  = ARRAY [1..1000] OF Boolean;
  105.  
  106.   { ReadFlag type is used throughout many of the data files.  It is a
  107.     type that is used to keep track of each user's status of something.
  108.     A true indicates that the user has read or seen or has access to that
  109.     specific item.
  110.   }
  111.  
  112.   flagtype  = ARRAY [1..32] OF Boolean;    {Flag Settings}
  113.  
  114.   newflags  = ARRAY[1..1000] OF Integer;
  115.  
  116.   sltimes   = ARRAY [1..100] OF Byte;      {TimeLimits for each SL}
  117.  
  118.   slcalls   = ARRAY [1..100] OF Byte;      {Number of calls per day}
  119.  
  120.   bbs_stats = RECORD
  121.                 bbsname        : String[80]; {Name of BBS}
  122.                 sysopname      : String[30]; {Sysop(s) name}
  123.                 sysopalias     : String[30]; {Sysop(s) alias}
  124.                 dospassword,                 {Password for DOS in Sysopmode}
  125.                 bbspassword    : String[20]; {Private BBS's password}
  126.                 lastcaller     : String[35]; {Name/Alias of last caller}
  127.                 date           : String[10]; {Current date}
  128.                 maxusers       : 1..1000;    {Maximum amount of users}
  129.                 totalcalls     : LongInt;    {Total number of calls}
  130.                 sltime         : SLTimes;    {Security level time limits}
  131.                 slcall         : SLCalls;    {Security Level calls per day}
  132.                 netaddress     : string;     {Network address}
  133.                 clrwscr,                     {Number of minutes to clear scr}
  134.                 numbulletins,                {Number of system bulletins}
  135.                 nummsgbases,                 {Number of message bases}
  136.                 numudsections,               {Number of U/D bases}
  137.                 numbooths,                   {Number of voting booths}
  138.                 RESERVED,
  139.                 numdoors,                    {Number of active doors}
  140.                 numnews        : Byte;       {Number of news files}
  141.                 regcost        : Real;       {Registration Cost}
  142.                 numnewcalls,                 {number of calls b4 sec. drop}
  143.                 newusersec,                  {New User security level}
  144.                 firstcallsec,                {First time call sec.}
  145.                 importsec,                   {Security to import msgs}
  146.                 udsecurity,                  {Security to enter ud section}
  147.                 messagesecurity,             {Security to enter messagebase}
  148.                 valsecurity,                 {Security of validated users}
  149.                 votingsecurity,              {Security to enter voting}
  150.                 bbssecurity,                 {Security to enter BBS-DBase}
  151.                 RESERVED,
  152.                 callsforday,                 {Number of calls for today}
  153.                 numusers,                    {Active number of users}
  154.                 startclosed,                 {Military hour start closed}
  155.                 endclosed,                   {Military hour end closed}
  156.                 startavail,                  {Military hour start chat}
  157.                 endavail,                    {Military hour end chat avail}
  158.                 savemailsec,                 {Security to save mail}
  159.                 batmailsec,                  {Security to send batch mail}
  160.                 readnamesec,                 {Security to veiw real names}
  161.                 valfiles,                    {# days to val.files 0-dont}
  162.                 tagmail        : Integer;    {# days to tag mail}
  163.                 minavail       : Longint;    {Minimum amt of free dsk space}
  164.                 chatmode,                    {Text shown at chat mode}
  165.                 tagline        : String[60]; {Tagline for network}
  166.                 maildir,                     {Location of private mail}
  167.                 msgbasedir,                  {Location of msg base stats}
  168.                 uddir,                       {Location of ud stats}
  169.                 userdir,                     {Location of userlog}
  170.                 menusdir,                    {Location of ALL menus}
  171.                 systemdir      : String;     {Location of mail,log,etc.}
  172.                 newdefaults,                 {new user settings}
  173.                 loglevels,
  174.                 bbsflags       : FlagType;   {BBS flags}
  175.               END;
  176.  
  177.   nodes = RECORD
  178.             modemport : byte;                {port to use for node}
  179.             portaddr  : integer;             {default address}
  180.             minbaud,                         {minimum baud rate allowed}
  181.             maxbaud   : longint;             {maximum baud rate allowed}
  182.             hwflow,                          {use hardware flow}
  183.             swflow,                          {use software flow}
  184.             dropdtr,                         {drop dtr}
  185.             locked,                          {port locked at max bps?}
  186.             RESERVED1,
  187.             RESERVED2 : boolean;
  188.             RESERVED3
  189.             RESERVED4 : string[72];
  190.             connect300,                      {Modem Responses}
  191.             connect1200,
  192.             connect1275,
  193.             connect2400,
  194.             connect4800,
  195.             connect9600,
  196.             connect19200,
  197.             connect38400,
  198.             errorcorrect,
  199.             error,
  200.             no_carrier,
  201.             voice,
  202.             no_dialtone,
  203.             busy,
  204.             ring,
  205.             ok,
  206.             escape,                          {escape code}
  207.             answer,                          {to make modem answer}
  208.             onhook,                          {on hook}
  209.             offhook,
  210.             dial_prefix,                     {atdp/atdt}
  211.             force_ok          : String[20];  {at| usually}
  212.             init1,                           {init strings}
  213.             init2,
  214.             init3,
  215.             init4             : String[60];
  216.             delay             : byte;        {time between commands}
  217.           END;
  218.  
  219.  
  220.   user_stats = RECORD
  221.                  firstname     : String[14]; {First name of user}
  222.                  lastname      : String[15]; {Last name of user}
  223.                  alias         : String[30]; {Alias of user}
  224.                  address       : String[40]; {Address of user}
  225.                  city          : String[20]; {City of user}
  226.                  state         : String[02]; {State of user}
  227.                  zipcode       : String[05]; {Zipcode of user}
  228.                  phone         : String[12]; {Phone number of user}
  229.                  password      : String[20]; {Password of user}
  230.                  birthday,                   {Birthday of user}
  231.                  laston        : String[10]; {Last call date of user}
  232.                  kbuploaded,                 {Number of K uploaded}
  233.                  kbdownloaded,               {Number of K downloaded}
  234.                  callstotal    : Longint;    {Total number of calls}
  235.                  mailwaiting,                {Amount of mail waiting}
  236.                  totalposted,                {Total number of msgs posted}
  237.                  totdownloaded,              {Total # of files D/L}
  238.                  totuploaded,                {Total # of files U/L}
  239.                  callstoday    : Integer;    {Number of calls made today}
  240.                  RESERVED5 ,                 {Unreg calls w/ Harmony Term}
  241.                  screenlength,               {Number of rows on users term}
  242.                  screenwidth,                {Number of cols on users term}
  243.                  Protocol,                   {Active Protocol}
  244.                  security,                   {Security level of user}
  245.                  computer      : Byte;       {Computer type}
  246.                  moneyowed     : Real;       {Amount of money user owes}
  247.                  userflags      : Flagtype;  {User's flags}
  248.                END;
  249.  
  250.  
  251.  msg_base_stats = RECORD
  252.                  basename,                 {Name (seen) of msg base}
  253.                  netname     : String[40]; {Net name (exact!) of base}
  254.                  reqstring   : String[30];
  255.                  subopnum    : 1..1000;     {SubOp user number}
  256.                  maxmsgs,                  {Max number of messages}
  257.                  nettype,                  {Type of net. 2-FIDO  }
  258.                  activemsgs  : Integer;    {Number of active msgs}
  259.                  anonsec,                  {Security for anon. msgs}
  260.                  seclvlbatch : Byte;       {Security for batch retr.}
  261.                  netaddress,               {Address of message base}
  262.                  tagline     : string[70]; {Tagline for message base}
  263.                  msgbaseflags: Flagtype;   {Message base flags}
  264.                  newscan,                  {1-in newscan 0 not}
  265.                  postflags   : ReadFlag;   {1-post 0-not allowed to ps}
  266.                END;
  267.  
  268.  
  269.  voting_stats = RECORD
  270.                 title          : string[60];     {Title of voting booth}
  271.                 reqstring      : string[70];     {requirement to see q.}
  272.                 votes          : integer;        {Total number of votes}
  273.                 uservote       : readflag;       {User's who have voted}
  274.               END;
  275.  
  276.  bbs_data = RECORD
  277.                 name           : string[70];     {Name of system}
  278.                 host           : byte;           {System computer type}
  279.                 minbaud,                         {Minimum baud rate}
  280.                 maxbaud        : integer;        {Maximum baud rate}
  281.                 date,                            {Date entered}
  282.                 phone          : string[12];     {Phone number}
  283.                 hours,                           {Hours of op.}
  284.                 city           : string[30];     {City location}
  285.                 state          : string[02];     {State location}
  286.                 note           : string[40];     {Special note}
  287.             END;
  288.  
  289.   transfer_stats = RECORD
  290.                      subname       : String[40]; {Name of base}
  291.                      file_path     : String[70]; {pathname for files}
  292.                      def_ext       : String[3];
  293.                      fratio,
  294.                      kratio        : Real;
  295.                      spaceused,
  296.                      maxspace      : Longint;    {Max space allowed 0 off}
  297.                      maxfiles,                   {max files allowed 0-off}
  298.                      activefiles,                {number of active files}
  299.                      kperup,                     {K per 1 Upload given}
  300.                      kperdown,                   {K per 1 Download taken}
  301.                      cperup,                     {Credits per upload given}
  302.                      cperdown      : Integer;    {Credits per dload taken}
  303.                      sltoval       : byte;       {security to val. files}
  304.                      transfersl,                 {Requirement String}
  305.                      batchsl,                    {Security for batch u/d}
  306.                      creditsl      : String[70]; {Security unactive credit}
  307.                      minbaud       : Integer;    {Minimum baud for base}
  308.                      transferflags : Flagtype;   {Transfer flags}
  309.                    END;
  310.  
  311.      index_stats = RECORD
  312.                      filename : string[12];         {filename}
  313.                      index    : Longint;            {Pointer to index}
  314.                    END;
  315.  
  316.  
  317.      ext_stats = ARRAY[1..5] OF String[50];
  318.  
  319.  
  320.      file_stats = RECORD
  321.                     comment,
  322.                     description : string[50];
  323.                     username    : string[30];
  324.                     usernumber  : integer;
  325.                     dateuploaded: string[10];
  326.                     ext_desc_index,
  327.                     timesdl,
  328.                     size        : Longint;
  329.                     password    : string[15];
  330.                     flag        : char;
  331.                     ext_desc    : ext_stats;
  332.                   END;
  333.  
  334.  
  335.      door_info = RECORD
  336.                    name,
  337.                    description,
  338.                    reqstring    : string[70];  {name of door}
  339.                    start_time,                 {start time avail}
  340.                    end_time     : Integer;     {end time avail}
  341.                    lbatch_file,
  342.                    batch_file   : string[100]; {batch file to execute}
  343.                  END;
  344.  
  345.  
  346.    news = RECORD
  347.               subject     : string[60];    {Subject of message}
  348.               dateposted,                  {Date message was posted}
  349.               timeposted  : string[30];    {Time message was posted}
  350.               requirements: string[70];    {requirements #---}
  351.               userread    : readflag;      {who has read}
  352.               RESERVED    : Longint;
  353.               readtype    : Byte;          {Type of reading}
  354.               RESERVED2   : flagtype
  355.             END;
  356.  
  357.    bulletin = RECORD
  358.                 title    : string[60];     {Title of file}
  359.                 reqstring: string[80];     {Requirement string}
  360.                 filename : string[100];    {Path and filename}
  361.                 readflags: readflag;       {UserReadFlag}
  362.               END;
  363.  
  364.     tevent   = RECORD
  365.                  title   : string[50];     {Short description of event}
  366.                  hh,mm,                    {Hour/minute in military time}
  367.                  errlvl  : integer;        {errorlevel to exit with}
  368.                  ldate   : string[10];     {last sdate ran}
  369.                  eflags  : flagtype        {event flags}
  370.                END;
  371.  
  372.  
  373.   Each one of these data types will be discussed in more detail
  374.   throughout this document.
  375.  
  376.  ====================================================================
  377.  
  378.    Main Harmony BBS Directory (C:\HM )
  379.  
  380.    BBSSTATS.HMY - Main BBS statistics (text)
  381.  
  382.       This file contains the heart of all information for Harmony BBS.
  383.       If this file get corrupted, chances are the sysop is up the
  384.       creek.
  385.  
  386.       This is a normal text file of line text (not a file of Pascal
  387.       records).  Most of this file is read into a variable
  388.       of BBS_STATS :
  389.  
  390.       Name of BBS
  391.       Real name of sysop
  392.       Alias of sysop
  393.       Password to enter dos shell from sysop mode
  394.       Password to enter BBS when it is in closed mode (private mode)
  395.       Name and time of last caller
  396.       Current date in MM/DD/YYYY (with padded 0's, ex: 07/01/1992)
  397.       Maximum users allowed on BBS (1-1000)
  398.       Total number of calls received to this system
  399.       Time limits (per security level) -  This line contains 100
  400.         characters.  Each character position refers to the corresponding
  401.         security level.  Each character is translated to its ORD(ch) to
  402.         come up with the resulting time limit.  For example, the
  403.         character 'A' in column 60 would give all users with a security
  404.         level of 60, a time limit of 65 minutes.  If the character is
  405.         #255 (alt-255), that is considered to be a NO TIME LIMIT for
  406.         that security level.
  407.       Call limits (per security level) -  This line follows the exact
  408.         same format as the time limits line.  It determines the total
  409.         number of calls per day allowed for each security level.
  410.       Number of minutes to wait before blanking screen while the BBS
  411.         is waiting for an incoming call.  If this is set to 0, the
  412.         screen will never blank.
  413.       Total number of system bulletins available
  414.       Total number of message bases available
  415.       Total number of file transfer section
  416.       Total number of voting booths
  417.       RESERVED (always ignore)
  418.       Total number of doors available
  419.       Total number of news files
  420.       Registration cost for this BBS
  421.       Number of calls the user stays at new user security level
  422.       New user security (1-100)
  423.       Default 1st time caller security
  424.       Security required to import text files into messages
  425.       Security required to enter file transfer section
  426.       Security required to enter message bases
  427.       Validated user security level (1-100)
  428.       Security level required to enter voting booths (1-100)
  429.       Security level required to enter BBS database
  430.       RESERVED (ignore)
  431.       Total number of calls received ever
  432.       Highest active user number
  433.       Military start closed time
  434.       Military end closed time
  435.       Military start sysop available time
  436.       Military end sysop available time
  437.       Security required to be able to save post office mail
  438.       Security required to be able to send batch mail
  439.       Security required to be able to read real names in an alias
  440.         enviroment
  441.       Number of days to wait before automatically validating
  442.         unvalidated files (0=always keep unvalidated)
  443.       Number of days to keep unread public mail marked for retrieval
  444.       Minmimum amount of K(1024bytes) to leave available on system
  445.       Text printed when chat mode is entered
  446.       Default tag line appended to networked message bases
  447.       Full directory path pointing to mail (post office) information
  448.       Full directory path pointing to message base information
  449.       Full directory path pointing to file transfer information
  450.       Full directory path pointing to user information
  451.       Full directory path pointing to system information
  452.       Newuser default flags.  This line contains a string of 32 1's and
  453.         0's.  Each place determines the default settings for a new user's
  454.         userflags.  For information on each user flag, refer to the
  455.         USERLOG.HMY file in the USERS directory.  A 1 indicates the flag
  456.         as being ON and a 0 indicates a flag as being OFF
  457.       Caller log activity recording.  This line also contains a line of
  458.         32 1's and 0's.  All 32 must ALWAYS be present, even though
  459.         Harmony BBS uses only the first 15.  A 1 turns that part of
  460.         the recording as ON, and a 0 indicates Harmony BBS to NOT record
  461.         that criteria.  Each column stands for specific caller activity :
  462.  
  463.         1   Log the entering and exiting of different sections of
  464.             your system.
  465.         2   Log all deletions and additions of items.
  466.         3   Log sysop mode activity.
  467.         4   Log when files are created and read.
  468.         5   Log any attempts which Harmony considers to be "hacking".
  469.         6   Log editor functions.
  470.         7   Log any house work done on BBS.
  471.         8   Log start up activities.
  472.         9   Reserved for future use.
  473.         10  Log file transfer activity.
  474.         11  Log user editing activity.
  475.  
  476.         The 3 different levels of recording (as defined in HM.DOC) are :
  477.  
  478.         13  Record POSITIVE things with each type.  If this
  479.             flag is on, Harmony BBS will record all activities
  480.             it considers POSITIVE for each type.
  481.         14  Record NEGATIVE things with each type.  If this flag
  482.             is on, Harmony BBS will record all activities it
  483.             considers NEGATIVE for each type.
  484.         15  Record SYSOP things with each type.  If this flag
  485.             is on, all special activities that are executed by
  486.             people with security level of 100 will be recorded.
  487.  
  488.         Notice that there is nothing used in the position 12.  It has
  489.         been left open for future expansion
  490.  
  491.       General BBS flags.  This line also contains a string of 32 1's and
  492.         0's.  Each character in the string corresponds that BBS flag. The
  493.         current list of BBS flags follow :
  494.  
  495.         1    Reserved (ignore)
  496.         2    Private BBS.  If this flag is not on, Harmony BBS will
  497.              ignore the closed BBS hours defined above.  This flag HAS
  498.              to be on in order for the hours to take effect
  499.         3    Individual passwords needed to log on to system
  500.         4    Aliases allowed
  501.         5    Activity logging on. If this flag is OFF, NO BBS activity
  502.              will be recorded.
  503.         6    BBS is accepting new users
  504.         7    1st time callers have access to message bases
  505.         8    1st time callers have access to file transfers
  506.         9    Message bases active.  If this flag is off, entrance to
  507.              the message bases is not allowed by ANYONE
  508.         10   New users required to leave first time feedback
  509.         11   Non-validated users allowed to post messages
  510.         12   Reason required for chat request
  511.         13   New users allowed in post office
  512.         14   Reserved (ignore)
  513.         15   Display message base entrance files
  514.         16   BBS is connected to a network
  515.         17   Users allowed to send netmail
  516.         18   Reserved (ignore)
  517.         19   Reserved (ignore)
  518.         20   Reserved (ignore)
  519.         21   File transfer section active.  If this flag is off,
  520.              entrance to the file transfer section is not allowed by
  521.              ANYONE
  522.         22   Sigma commands allowed in post office
  523.         23   Doors active.  If this flag is off, entrance to the doors
  524.              menu is not allowed by ANYONE
  525.         24   Auto-message active.  If this flag is off, the automessage
  526.              is ignored
  527.         25   Used internally by Harmony BBS.  This flag determines the
  528.              chat availability override status.  If this flag is on, the
  529.              current state of the chat mode is toggled
  530.         26   Zip log offs allowed from BBS
  531.         27   Swapping to EMS memory allowed.  If this flag is off, the
  532.              BBS will always swap to disk when needed
  533.         28   ONLY USED IN PROFESSIONAL VERSION!  If this flag is on,
  534.              Qwik logons/logoff are allowed
  535.         29   Show bulletins at logon.  If this flag is TRUE, the user
  536.              will be brought the to system bulletins list temporarily
  537.              when first logging on the the BBS so they can read any
  538.              NEW system bulletins
  539.         30-32 These flags are reserved for future use.  Your software
  540.              should NOT take advantage of these flags.  They were put
  541.              there for future expansion by Concord Software.
  542.       Network Addresses.  The rest of this file contains all of the
  543.         network addresses that the BBS is affiliated with.  Each address
  544.         line is in the ZONE:NET/NODE.POINT format.  Since a BBS can have
  545.         many different addresses, the end of this file is of variable
  546.         length.  The programmer is responsible for reading to the EOF and
  547.         making sure their program, if need be, is aware of all the network
  548.         address.
  549.  ====================================================================
  550.  
  551.    HMC      HMY - Used to hold defined editors in HMC (text)
  552.  
  553.         This file is a file that contains 2 lines of text.
  554.  
  555.         The first line is the full path and name of the ASCII text
  556.         editor set up by the sysop for use within HMC.EXE
  557.  
  558.         The second line is the full path and name of the ANSI editor
  559.         set up by the sysop for use within HMC.EXE
  560.  ====================================================================
  561.  
  562.    HMQWIK   HMY - Configuration for Qwik reader (professional version,text)
  563.  
  564.         The structure of this file is explained within the HMQWIK.DOC
  565.         documentation file
  566.  ====================================================================
  567.  
  568.    NODES    HMY - Contains modem, port, (and node for future use) info.
  569.  
  570.         This is a file of the record data type NODES.  The first record
  571.         (record #0) in this file is used internally by Harmony BBS and
  572.         should NOT be modified.  The second record is used by Harmony
  573.         BBS.  Each variable within NODES datatype will now be
  574.         discussed :
  575.  
  576.         nodes = RECORD
  577.             modemport : byte;
  578.               { The port number (1-4) that the modem is connected to. }
  579.  
  580.             portaddr  : integer;
  581.               { If the system uses the default port address of the
  582.                 communications port (defined above), then this will be set
  583.                 to 0.  Otherwise, this will contain the new memory
  584.                 address of the communications port }
  585.  
  586.             minbaud,
  587.               { Minimum baud rate allowed for a connection to the BBS }
  588.  
  589.             maxbaud   : longint;
  590.               { Maximum baud rate allowed for a connection to the BBS.  If
  591.                 the sysop has the communications port locked, this
  592.                 variable will contain the baud rate at which it is locked
  593.                 at }
  594.  
  595.             hwflow,
  596.             swflow,
  597.               { These two variables will be true if the BBS is using
  598.                 either kind of flow control }
  599.  
  600.             dropdtr,
  601.               { This variable tells the BBS to drop the DTR
  602.                 during a log off.  If it is NOT true, it will only send
  603.                 the modem offline but keep the connection }
  604.  
  605.             locked,
  606.               { This variable tells Harmony BBS whether the port is locked
  607.                 at a specific baud rate }
  608.  
  609.             RESERVED1,
  610.             RESERVED2 : boolean;
  611.             RESERVED3
  612.             RESERVED4 : string[72];
  613.  
  614.             connect300,
  615.             connect1200,
  616.             connect1275,
  617.             connect2400,
  618.             connect4800,
  619.             connect9600,
  620.             connect19200,
  621.             connect38400,
  622.             errorcorrect,
  623.             error,
  624.             no_carrier,
  625.             voice,
  626.             no_dialtone,
  627.             busy,
  628.             ring,
  629.               { These strings contain the text responses that Harmony
  630.                 BBS will check for }
  631.  
  632.             ok,
  633.             escape,
  634.             answer,
  635.             onhook,
  636.             offhook,
  637.             dial_prefix,
  638.             force_ok          : String[20];
  639.             init1,
  640.             init2,
  641.             init3,
  642.             init4             : String[60];
  643.               { These strings contain the text the Harmony BBS will
  644.                 send to the modem }
  645.  
  646.             delay             : byte;
  647.               { The number of seconds Harmony BBS will wait before sending
  648.                 any command to the modem }
  649.  
  650.           END;
  651.  ====================================================================
  652.  
  653.    PACKERS  HMY - Contains user information on default packers for Qwik
  654.  
  655.         This file will only be present in the professional version of
  656.         Harmony BBS.  It is a file of CHAR; and contains the default
  657.         packer for all the users of the Qwik mail facility within
  658.         Harmony BBS.  Each record number contains a character, and the
  659.         ASCII value of that character is the packer number for that
  660.         user.  The packer number is determined by the order in which
  661.         they are defined within HMQWIK.HMY.  This example reads a user's
  662.         default packer :
  663.  
  664.         VAR
  665.           f : FILE of CHAR;
  666.           c : CHAR;
  667.           default_packer : BYTE;
  668.  
  669.         BEGIN
  670.           assign (f,'packers.hmy');
  671.           reset (f);
  672.           seek (f,userNUMBER)
  673.           read (f,c);
  674.           default_packer := ORD(c);
  675.           close (f);
  676.         END;
  677.  
  678.                         ________________________
  679.  ====================================================================
  680.  
  681.    Message Base Directory (C:\HM\MSGS )
  682.  
  683.    MSGBSTAT HMY - All message base statistics
  684.  
  685.         This is a file of MSG_BASE_STATS record types.  It contains all
  686.         of the information needed for the message base section of the
  687.         BBS.  The 1st record (record #0) contains the information
  688.         for message base #1.  The Nth record (record #N+1) contains the
  689.         information for message base #1.  The msg_base_stats explanation
  690.         follows :
  691.  
  692.           msg_base_stats = RECORD
  693.  
  694.              basename,
  695.                { Name of the message base }
  696.  
  697.              netname     : String[40];
  698.                { If this message base is considered to be a networked
  699.                  base (and ECHO), this line contains the actual network
  700.                  name of this message base.  The only time this is used
  701.                  by Harmony BBS is within HMC/Messages/Create AREAS.BBS
  702.                }
  703.  
  704.              reqstring   : String[30];
  705.                { Requirement string Harmony BBS uses to determine access
  706.                  to this message base }
  707.  
  708.              subopnum    : 1..1000;
  709.                { Subop's usernumber.  This number is set to 1 if the
  710.                  sysop does not have an active subop for this message base
  711.                }
  712.  
  713.              maxmsgs,
  714.                { Maximum number of messages allowed for this message
  715.                  base }
  716.  
  717.              nettype,
  718.                { This is currently not used by Harmony BBS.  It should
  719.                  not be changed since it may be incorporated in a future
  720.                  version of Harmony BBS }
  721.  
  722.              activemsgs  : Integer;
  723.                { The actual number of active messages for this message
  724.                  base.  Note that this number may not always be the actual
  725.                  number of messages in the directory.  The problem arises
  726.                  when mail is imported to a message base and HMHOUSE
  727.                  with the -M or -U parameter is not run afterwards.
  728.                  Rather then checking this variable for the total number
  729.                  of messages, depending on the application being written,
  730.                  it may be better to be look inside the message directory
  731.                  and find the highest message number }
  732.  
  733.              anonsec,
  734.                  { Security level required to leave anonymous messages
  735.                    for this message base }
  736.  
  737.              seclvlbatch : Byte;
  738.                  { Security level required to be able to receive this
  739.                    message base in a qwik packet }
  740.  
  741.              netaddress,
  742.                  { The network address for this message base.  When
  743.                    dealing with networked message bases, this variable
  744.                    should be checked instead of the main BBS network
  745.                    addresses.  This is because each message base may have
  746.                    a different address }
  747.  
  748.              tagline     : string[70];
  749.                 { Tagline that is appended to the bottom of all
  750.                   networked message bases }
  751.  
  752.              msgbaseflags: Flagtype;
  753.                { Message base flags.  A description of each one follows:
  754.  
  755.                   1 - TRUE if networked message base
  756.                   2 - TRUE if batch retrieval allowed
  757.                   3 - TRUE is messages are to be rotated, FALSE if
  758.                       message base will just be marked as "FULL"
  759.                   4 - TRUE is aliases are allowed on this message
  760.                       base.  This flag is only checked if aliases are
  761.                       allowed on the BBS
  762.  
  763.                   5-32 are currently not used.  DON'T TOUCH!  Concord
  764.                        Software may use them in a later version
  765.  
  766.              newscan,
  767.                { Determines which users have this message base turned on
  768.                  in their newscan.  Example, if newscan[201]=TRUE then
  769.                  user number 201 has this message base on and it will be
  770.                  scanned when they are new scanning all message bases, and
  771.                  will be packaged up into a qwik packet if available. }
  772.  
  773.              postflags   : ReadFlag;
  774.                { Determines which users have the ability to post on this
  775.                  message base.  If postflags[user_number]=TRUE then that
  776.                  user has the ability to post on this message base. }
  777.  
  778.  
  779.            END;
  780.  
  781.  ====================================================================
  782.  
  783.    System Directory (C:\HM\SYSTEM )
  784.  
  785.    AUTOMSG  HMY - User message
  786.  
  787.         This file contains the auto-message information.  It is a normal
  788.         text file that contains lines containing the following
  789.         information :
  790.  
  791.           User name who left message -  If aliases are turned on, the
  792.             user's alias will be stored here.  If the auto-message was
  793.             left as anonymous, the real name of the user is stored in
  794.             parenthesis after.  For example :
  795.  
  796.             Anonymous (Jasen Fici)
  797.  
  798.             If the message was not left anonymously, this line would just
  799.             contain either the user's name or alias
  800.          Date AutoMessage was left -  This line of text is in the
  801.            format DAY., MMM DD YYYY where DAY is the 3 letter abbreviation
  802.            for day of the week, MMM is the 3 letter abbreviation for
  803.            month, DD is the left-zero padded date (ex. 04), and YYYY is
  804.            the year
  805.          Text -  The next (and last) three lines of this file contain
  806.            the actual text of the automessage
  807.  ====================================================================
  808.  
  809.    BBSDATA  HMY - Database file for online BBS database
  810.  
  811.         This file contains all the information on the BBS's that have
  812.         been entered into the BBS database.  It is a file of type
  813.         BBS_DATA records.  The BBS_DATA type explanation follows :
  814.  
  815.         bbs_data = RECORD
  816.  
  817.           name           : string[70];
  818.             { Name of bulletin board system }
  819.  
  820.           host           : byte;
  821.             { Computer type BBS is run off of.  This number corresponds
  822.               to the list of computers in the documentation under
  823.               configuration of users }
  824.  
  825.           minbaud,
  826.             { Minimum baud rate allowed to connect to BBS }
  827.  
  828.           maxbaud        : integer;
  829.             { Maximum baud rate allowed to connect to BBS }
  830.  
  831.           date,
  832.             { Date this BBS was added to the database }
  833.  
  834.           phone          : string[12];
  835.             { Phone number of BBS in XXX-XXX-XXXX formt }
  836.  
  837.           hours,
  838.             { Text describing hours of operation }
  839.  
  840.           city           : string[30];
  841.             { City where BBS is operated }
  842.  
  843.           state          : string[02];
  844.             { State where BBS is operated }
  845.  
  846.           note           : string[40];
  847.             { Text left by user who added BBS to database.  Just a note
  848.             }
  849.  
  850.          END;
  851.  ====================================================================
  852.  
  853.    BULLETIN HMY - System bulletin information
  854.  
  855.         This file contains information on all the system bulletins of
  856.         the BBS.  It is a file of type BULLETIN records.  Record #0 (the
  857.         first record in the file) contains information on bulletin #1.
  858.         The BULLETIN type explanation follows :
  859.  
  860.         bulletin = RECORD
  861.  
  862.           title    : string[60];
  863.             { This is the title of the bulletin. It is what is shown in
  864.               the bulletin listing }
  865.  
  866.           reqstring: string[80];
  867.             { Requirement string required to be able to view the
  868.               bulletin }
  869.  
  870.           filename : string[100];
  871.             { Actual file name (including drive, full path, and
  872.               name) of the file to show for this bulletin }
  873.  
  874.           readflags: readflag;
  875.             { Flags to signify if user READFLAGS[USER_NUMBER] has read
  876.               this particular bulletin.  This field in conjunction with
  877.               the actual DOS file date of FILENAME are used to determine
  878.               if a bulletin is new }
  879.         END;
  880.  ====================================================================
  881.  
  882.    CALLLOG  HMY - Activity log of callers (text)
  883.  
  884.         This file contains all of the BBS activity being recorded by
  885.         Harmony BBS.  Interpreting this file can be tricky.  If you have
  886.         any other programs that are recording anything to this file,
  887.         then chances are it is close to impossible.  The CALLLOG.HMY
  888.         file is a normal text file, each line containing information on
  889.         an event that has taken place on the BBS.  Each line of text
  890.         has the following format :
  891.  
  892.         X C hH:MM:SSxm Text
  893.  
  894.         Where X = a number 1 though 11 which corresponds to the type of
  895.                   action that has taken place.  This number corresponds
  896.                   the the 11 logging events that can occur and are
  897.                   described in the BBSSTATS.HMY file of this document
  898.               C = a character (+,-,!,*)  If a plus is in this place, it
  899.                   corresponds with a positive (normal) event happening.
  900.                   If it contains the -, a negative (something wrong)
  901.                   thing has taken place.  If it contains the !
  902.                   character, then a sysop only function was executed.
  903.               hH:MM:SSxm = the time that this event was recorded.  hH
  904.                   stands for the hour, MM the minute and SS the second.
  905.                   xm will either be "am" or "pm"
  906.               Text = a short one line description of what has taken
  907.                      place
  908.  
  909.         Note that the actual length of these can vary in 2 places.  The
  910.         first is with the X.  This can range from 1 to 2 characters long
  911.         since it has to hold 1-11.  Also, the hour variable within the
  912.         time is NOT zero padded so it can range from being 1 to 2
  913.         characters long (1-12)
  914.  ====================================================================
  915.  
  916.    DOORSTAT HMY - Information on all available doors
  917.  
  918.         This file contains all of the information on the doors setup for
  919.         use with the BBS.  It is a file of of records of the DOOR_INFO
  920.         data type.  An explanation of DOOR_INFO follows :
  921.  
  922.         door_info = RECORD
  923.  
  924.           name,
  925.             { Name of the door }
  926.  
  927.           description,
  928.             { Short one line description of the door displayed during
  929.               listing }
  930.  
  931.           reqstring    : string[70];
  932.             { Requirement string Harmony BBS checks for access to door }
  933.  
  934.           start_time,
  935.             { Start time (military hours 0-23) door becomes available }
  936.  
  937.           end_time     : Integer;
  938.             { End time (military hours 0-23) door becomes unavailable.
  939.               Note that if the start_time and the end_time are the same,
  940.               then the door is considered to be available 24 hours a day
  941.               }
  942.  
  943.           lbatch_file,
  944.             { Batch file called whenever the door is entered from a
  945.               local logon (host mode) }
  946.  
  947.           batch_file   : string[100];
  948.             { Batch file called whenever a user calls the door }
  949.  
  950.         END;
  951.  ====================================================================
  952.  
  953.    EVENTS   HMY - Event information
  954.  
  955.         This file contains all of the information on external events for
  956.         the BBS to execute.  It is a file of records of data type
  957.         TEVENT.  Record #0 (the first record in the file) contains the
  958.         information on one of the events. The description of TEVENT
  959.         follows :
  960.  
  961.         tevent   = RECORD
  962.  
  963.           title   : string[50];
  964.             { Short one line description of event }
  965.  
  966.           hh,
  967.             { Hour (military time) for event to take place }
  968.  
  969.           mm,
  970.             { Minute (0-59) for event to take place }
  971.  
  972.           errlvl  : integer;
  973.             { DOS exit errorlevel to halt BBS program with }
  974.  
  975.           ldate   : string[10];
  976.             { Last date this event was executed.  Harmony BBS matches
  977.               the current date with this date to determine if it is time
  978.               to run the event.  It is in the standard MM/DD/YYYY format }
  979.  
  980.           eflags  : flagtype
  981.             { These flags are used to determine the status of this
  982.               event.  The definition of each flag is as follows :
  983.  
  984.               1 - TRUE is this event is currently active.  If this event
  985.                   is NOT active, it will not execute when the time comes.
  986.                   It is the functional equivalent of turning this event off.
  987.               2 - TRUE is this event is forced.  If the event is forced,
  988.                   and a user logs on with a time limit that will interfere
  989.                   with this event, the time limit will be adjusted.  If the
  990.                   event is not forced, and the event is missed (something is
  991.                   happening other than the BBS waiting for a call)
  992.               3-9 These flags determine which days of the week this
  993.                   event is to be executed.  If they are TRUE then the
  994.                   event will be executed on that day.  Flag 3 stands for
  995.                   Sunday through flag 9 which stands for Saturday
  996.              10-32 Reserved for Concord Software
  997.             }
  998.  
  999.         END;
  1000.  ====================================================================
  1001.  
  1002.    LOGON    HMY - List of text files displayed at logon
  1003.  
  1004.         This is a normal text file that contains information on the text
  1005.         files displayed during a user logon right after the news is
  1006.         shown.  Each line of data contains the following information :
  1007.  
  1008.           Ascii file -  The full path and file name of the file to
  1009.             be displayed to callers only with Ascii capability
  1010.           Ansi file - The full path and file name of the file to be
  1011.             displayed to callers with Ansi capability
  1012.           C - A single character on this line of text.  It contains
  1013.             either a 'N' or a 'Y'.  An 'N' tells Harmony BBS NOT to clear
  1014.             the screen before showing this file, and a 'Y' tells Harmony
  1015.             to clear the screen
  1016.           Requirement String -  This line of text contains the
  1017.             requirement string that is used to determine whether a user is
  1018.             allowed to read this file or not
  1019.  
  1020.         If there is more than one logon file to be shown, they are
  1021.         followed one right after another.  For example, if a BBS had 3
  1022.         logon files to display, this file would be 12 lines long
  1023.  ====================================================================
  1024.  
  1025.    NEWSXX   HMY - Text displayed when user is reading news file XX
  1026.  
  1027.         This is a normal text file that contains the news for
  1028.         news XX.
  1029.  ====================================================================
  1030.  
  1031.    NEWSSTAT HMY - News information
  1032.  
  1033.         This file contains the actual information for all of the news
  1034.         files.  It is a file of records of the NEWS.  Record #0 (the
  1035.         first file in the record) contains the information on news file
  1036.         one.  A description of NEWS follows :
  1037.  
  1038.           news = RECORD
  1039.  
  1040.             subject     : string[60];
  1041.               { Subject of news }
  1042.             dateposted,
  1043.               { Date the news was posted on }
  1044.  
  1045.             timeposted  : string[30];
  1046.               { Time the news was posted }
  1047.  
  1048.             requirements: string[70];
  1049.               { Requirement string used for checking whether user has
  1050.                 access to read this news }
  1051.  
  1052.             userread    : readflag;
  1053.               { These flags determine each individual user's status as
  1054.                 to whether or not they have read this news file or not.
  1055.                 It will be TRUE if they HAVE read it }
  1056.  
  1057.             RESERVED    : Longint;
  1058.               { Reserved for future -- DON'T TOUCH }
  1059.  
  1060.             readtype    : Byte;
  1061.               { Determines what type of news this is.  If this variable
  1062.                 holds the number 1, then the news file is required to be
  1063.                 read by the user at least one time.  If it holds a 0 then
  1064.                 it is NOT required to be read at least once }
  1065.  
  1066.             RESERVED   : flagtype
  1067.               { Reserved for future use --- DON'T TOUCH }
  1068.  
  1069.           END;
  1070.  ====================================================================
  1071.  
  1072.    VOTINGXX HMY - Voting booth XX information
  1073.  
  1074.         This file contains information for voting booth XX where XX is a
  1075.         number from 1-TOTAL NUMBER OF VOTING BOOTHS.  It is a normal
  1076.         ascii file that contains the following information :
  1077.  
  1078.         Voting Question -  The number of lines the voting question
  1079.           occupies is unlimited.  Each line at the beginning of this file
  1080.           can be part of the voting question, UP UNTIL a text line with
  1081.           the text <eoq> is encountered.  That text must be displayed on
  1082.           a line all by its lonesome.  For example :
  1083.  
  1084.           What's your favorite type of ice cream
  1085.           that you like to eat ?
  1086.           <eoq>
  1087.  
  1088.         Voting choices - The rest of this file contains all of the
  1089.           choices available for this question.  Each choice takes up 2
  1090.           lines of text.  The first line is that actual text of the
  1091.           choice, and the second line is the total number of people who
  1092.           have responded to the voting booth with that choice.  A sample
  1093.           VOTINGXX.HMY file would look like this :
  1094.  
  1095.           What's your favorite type of ice cream
  1096.           that you like to eat ?
  1097.           <eoq>
  1098.           Chocolate
  1099.           44
  1100.           Vanilla
  1101.           34
  1102.           Strawberry
  1103.           6
  1104.           Rasberry
  1105.           10
  1106.  
  1107.         The actual number of allowable choices for a voting booth has
  1108.         not been determined, but is WELL beyond reasonable
  1109.  ====================================================================
  1110.  
  1111.    VSTATXX  HMY - Voting booth XX statistics
  1112.  
  1113.         This file contains even more information on voting booth XX.  It
  1114.         is a file of records of the VOTING_STATS type.  An explanation
  1115.         of this type follows :
  1116.  
  1117.           voting_stats = RECORD
  1118.  
  1119.             title          : string[60];
  1120.               { This is the title that is displayed when all of the
  1121.                 voting booths are listed }
  1122.  
  1123.             reqstring      : string[70];
  1124.               { This is the requirement string Harmony BBS uses to
  1125.                 determine if a user has access to this voting booth }
  1126.  
  1127.             votes          : integer;
  1128.               { Total number of people who have voted on this booth }
  1129.  
  1130.             uservote       : readflag;
  1131.               { Flags to determine which users have voted and which
  1132.                 users haven't voted.  TRUE if a user has voted, and FALSE
  1133.                 if they haven't }
  1134.  
  1135.           END;
  1136.                         ________________________
  1137.  ====================================================================
  1138.  
  1139.    File Transfer Directory (C:\HM\UD )
  1140.                 
  1141.    XX       HMY - File descriptions for file base XX
  1142.  
  1143.         This file contains information on all of the individual files
  1144.         for file transfer base XX.  It is a file of records of data type
  1145.         FILE_STATS (described below).  This first record in this file
  1146.         (record #0) is a buffer record and should not be modified.
  1147.  
  1148.           file_stats = RECORD
  1149.  
  1150.             comment,
  1151.               { Individual user comment.  This record can be updated by
  1152.                 anyone with access to this file.  It is used to allow
  1153.                 "second opinions" on the file }
  1154.  
  1155.             description : string[50];
  1156.               { Actual 1 line description given when the file is added
  1157.                 to the file base.  If the file is added through HMC Move
  1158.                 Files, the description 'None.' will be insterted here }
  1159.  
  1160.             username    : string[30];
  1161.               { Full name or alias of user who added this file to the
  1162.                 file base }
  1163.  
  1164.             usernumber  : integer;
  1165.               { User log of person who added this file to the base.
  1166.                 This can be helpful in an alias BBS situation where the
  1167.                 real name of the user wants to be discovered }
  1168.  
  1169.             dateuploaded: string[10];
  1170.               { Date file was added to file base.  This string is in the
  1171.                 MM/DD/YYYY format and will always contain padded 0's (for
  1172.                 example 01/05/1991 }
  1173.  
  1174.             timesdl,
  1175.               { Number of times this file has been downloaded }
  1176.  
  1177.             size        : Longint;
  1178.               { Actual size of file (in BYTES) }
  1179.  
  1180.             password    : string[15];
  1181.               { Password required to download this file.  If no password
  1182.                 is required, this field should be empty }
  1183.  
  1184.             flag        : char;
  1185.               { Character containing flag information on this file.
  1186.                 The ORD of this character should should be AND'ed with
  1187.                 the following 4 bits to determine its status :
  1188.  
  1189.                   ORD(flag) AND $01 = $01 file is password protected
  1190.                                       $00 file is NOT password protected
  1191.                             AND $02 = $02 file is unvalidated
  1192.                                       $00 file is validated
  1193.                             AND $04 = $04 file is for sysop only
  1194.                                       $00 file is NOT sysop only
  1195.  
  1196.                 The other 5 bits of this flag should be left alone for
  1197.                 Concord Software }
  1198.  
  1199.             ext_desc    : ARRAY[1..5] OF String[50];
  1200.               { In other words, only files that have extended
  1201.                 descriptions are placed here. }
  1202.  
  1203.  
  1204.  
  1205.           END;
  1206.  ====================================================================
  1207.  
  1208.    XX       IDX - Index of files for file base XX
  1209.  
  1210.         Index lookup table for file information.  The purpose of this
  1211.         file is to allow for a faster way of searching and retrieving
  1212.         file information.  Since each record in this file only contains
  1213.         the file name and an index to the actual file information, this
  1214.         file should be used to find information.  It is a file of
  1215.         records of data type INDEX_STATS :
  1216.  
  1217.           index_stats = RECORD
  1218.  
  1219.             filename : string[12];
  1220.               { File name and extention in FILENAME.EXT format.  If the
  1221.                 file has no extention, then the . separator will not be
  1222.                 found (operated just like DOS) }
  1223.  
  1224.             index    : Longint;
  1225.               { Record number from XX.HMY, described above, that
  1226.                 contains statistics on this file }
  1227.  
  1228.           END;
  1229.  
  1230.         The index numbers in this file should ALWAYS be in order.  For
  1231.         example, record #2 should have the longint 2 in the index field.
  1232.         The placement of each of these records should coincide with the
  1233.         placement of the file statistics within XX.HMY
  1234.  ====================================================================
  1235.  
  1236.         Example code describing how to grab a files statistics :
  1237.  
  1238.         FUNCTION GetFileStats(
  1239.           VAR fbase: transfer_stats; basenum: byte; VAR fn: STRING;
  1240.           VAR idx_rec : index_stats; VAR file_rec : file_stats;
  1241.  
  1242.         VAR
  1243.           s    : STRING;                {temporary string }
  1244.           fle  : FILE OF index_stats;   {used for quick look up }
  1245.           fl2  : FILE OF file_stats;    {actual meat of file statistics}
  1246.           done : boolean;               {notify when finished }
  1247.  
  1248.           ti   : index_stats;       {temporary }
  1249.           fi   : file_stats;        {temporary }
  1250.           count: longint;           {temporary }
  1251.  
  1252.         BEGIN
  1253.  
  1254.           {set up function return value }
  1255.           getfilestats := False;
  1256.  
  1257.           {determine if this is a floopy based directory }
  1258.           IF fbase.transferflags[9] THEN BEGIN
  1259.  
  1260.             {check for presense of disk by taking first character of
  1261.              the file bases path name, which should contain the drive
  1262.              letter of this floppy }
  1263.  
  1264.             IF (isdiskthere( fbase.file_path[1] )) AND
  1265.                (exist( fbase.file_path + fn )) THEN BEGIN
  1266.  
  1267.                 {set up file information to default setting for a floppy
  1268.                  file }
  1269.  
  1270.                 idx_rec.filename := fn;
  1271.                 idx_rec.index := 0;
  1272.                 file_rec.description := 'Floppy file.';
  1273.                 file_rec.comment := 'None.';
  1274.                 file_rec.username := 'Sysop';
  1275.                 file_rec.usernumber := 1;
  1276.                 file_rec.dateuploaded := sdate;
  1277.                 file_Rec.timesdl := 0;
  1278.                 file_rec.password := '';
  1279.                 file_rec.flag := #0;
  1280.                 file_rec.size := fsize(fbase.file_path + fn);
  1281.  
  1282.                 {confirm a file was found }
  1283.                 getfilestats := True;
  1284.  
  1285.             END; {presence of floppy disk }
  1286.  
  1287.             Exit; {get out of this function }
  1288.  
  1289.           END; {floppy based transfer section }
  1290.  
  1291.           {open index file for filename search }
  1292.           Assign(fle, bbsstats.uddir + IntToStr(basenum) + '.idx');
  1293.           Reset(fle);
  1294.  
  1295.           {make sure function return value is still false }
  1296.           GetFilestats := False;
  1297.  
  1298.           {set up for loop}
  1299.           done := False;
  1300.  
  1301.           {while the the end of the index file has NOT been reached,
  1302.            and DONE=FALSE }
  1303.  
  1304.           WHILE (NOT Eof(fle)) AND (NOT done) DO BEGIN
  1305.  
  1306.             {grab next file index }
  1307.             Read(fle, ti);
  1308.  
  1309.             {check record with file name we are looking for }
  1310.             {setlower simply changes all the text to lowercase for
  1311.              easier string matching }
  1312.  
  1313.             IF SetLower(ti.filename) = SetLower(fn) THEN done := True;
  1314.  
  1315.           END; {index search }
  1316.  
  1317.           {check file extention }
  1318.           s := fileext(fn);
  1319.  
  1320.           {if the file we are checking for does NOT contain a file
  1321.            extention, append the default extention for this base, and
  1322.            search through the index again }
  1323.  
  1324.           IF (NOT done) AND (s = '') THEN BEGIN
  1325.  
  1326.             {append default extention }
  1327.             fn := fn + '.' + fbase.def_ext;
  1328.  
  1329.             {set file pointer to beginning of file }
  1330.             Reset(fle);
  1331.  
  1332.             {begin looping through again }
  1333.             WHILE (NOT Eof(fle)) AND (NOT done) DO BEGIN
  1334.               Read(fle, ti);
  1335.               IF SetLower(ti.filename) = SetLower(fn) THEN done := True;
  1336.             END;
  1337.  
  1338.           END; {appended file extention search }
  1339.  
  1340.           Close(fle); {close index file }
  1341.  
  1342.           {file cound NOT be found, return false }
  1343.           IF NOT done THEN Exit;
  1344.  
  1345.           {grab the statistics on the file now that it has been
  1346.            determined that the file exists on this base }
  1347.  
  1348.           count := 0;
  1349.  
  1350.           {assign found index to variable passed to function }
  1351.           idx_rec := ti;
  1352.  
  1353.           {open statistics file for reading }
  1354.           Assign(fl2, bbsstats.uddir + IntToStr(basenum) + '.hmy');
  1355.           Reset(fl2);
  1356.  
  1357.           {go grab the correct record and read it }
  1358.           Seek(fl2, idx_rec.index);
  1359.           Read(fl2, fi);
  1360.  
  1361.           {close file statistics file }
  1362.           Close(fl2);
  1363.  
  1364.           {assign found statistics for variable passed to function }
  1365.           file_rec := fi;
  1366.  
  1367.  
  1368.           {set function return value to TRUE since file was found }
  1369.           GetFileStats := True;
  1370.  
  1371.         END; {function }
  1372.  
  1373.         This function could be made more efficient by doing a one pass
  1374.         search for filename and filename+extention, but it may not
  1375.         return the correct value if there were two files in the base with
  1376.         the same first part of a filename (for example, HELLO and
  1377.         HELLO.ANS
  1378.  ====================================================================
  1379.  
  1380.    PROTOCOL HMY - External protocol information (text)
  1381.  
  1382.         Contains all the information on the protocols set up to use with
  1383.         the BBS.  It is a normal text file with the following format :
  1384.  
  1385.         {protocol 1 information}
  1386.         {protocol 2 information}
  1387.         ...
  1388.         {protocol N information}
  1389.  
  1390.         Each protocol information consists of 7 lines of text in the
  1391.         following manner :
  1392.  
  1393.           Name - The name of the protocol.  If an internal
  1394.             protocol is in this place, it will start with a !# where # is
  1395.             the actual internal protocol to use.  This number corresponds
  1396.             to the following internal protocols :
  1397.  
  1398.                              1. Xmodem
  1399.                              2. Xmodem-1k
  1400.                              3. Ymodem
  1401.                              4. Ymodem-G
  1402.                              5. Zmodem
  1403.                              6. Kermit
  1404.                              7. ASCII
  1405.  
  1406.             As you can see it can be pretty easy to mess up the number
  1407.             of the internal protocol with the actual name of the
  1408.             protocol.  This is the responsibility of the sysop or the
  1409.             programmer who is dealing with this file
  1410.           Description -  Short one line descriptions (under 50
  1411.             characters) of the protocol
  1412.           ErrorLevel - the DOS exit code this protocol returns upon a
  1413.             successful file transfer
  1414.           Maximum Downloads - the maximum number of downloads the sysop
  1415.             allows for this protocol.  This is usually controlled by the
  1416.             protocol itself, but the sysop may want to configure a smaller
  1417.             number
  1418.           Receive File Name - Name of the batch file called when this
  1419.             protocol is called upon to receive a file.  If this protocol
  1420.             is defined as an internal protocol (by the ! in the protocol
  1421.             name), this line should be left empty
  1422.           Send File Name - Name of the batch file called when this
  1423.             protocol is called upon to send a file.  If this protocol is
  1424.             defined as an internal protocol (by the ! in the protocol
  1425.             name), this line should be left empty
  1426.           Character - This line should contain the single CAPITAL letter
  1427.             used to let the user pick from the protocol choice menu.  This
  1428.             character should NEVER be repeated within a different
  1429.             protocol.  If it is, then the first one will always be chosen.
  1430.  ====================================================================
  1431.  
  1432.    UDSTAT   HMY - All file base information
  1433.  
  1434.         Contains all the information on the file bases.  It is a file of
  1435.         records of type TRANSFER_STATS.  The first record (record #0)
  1436.         contains information on file base #1.  The TRANSFER_STATS record
  1437.         description follows :
  1438.  
  1439.           transfer_stats = RECORD
  1440.  
  1441.             subname       : String[40];
  1442.               { Name of file base }
  1443.  
  1444.             file_path     : String[70];
  1445.               { Fully qualified drive and path name of location of files
  1446.                 for file base }
  1447.  
  1448.             def_ext       : String[3];
  1449.               { Default extention for file base }
  1450.  
  1451.             fratio,
  1452.               { File ratio that must be maintained for file base }
  1453.  
  1454.             kratio        : Real;
  1455.               { K (1k=1024bytes) ratio that must be maintained for file
  1456.                 base }
  1457.  
  1458.             spaceused,
  1459.               { Amount of space (in K) taken up collectively by all the
  1460.                 files in this base }
  1461.  
  1462.             maxspace      : Longint;
  1463.               { Maximum amount of space allowed (in K) to be allocate
  1464.                 for file base.  This number will be set to 0 if
  1465.                 there is no disk limit }
  1466.  
  1467.             maxfiles,
  1468.               { Maximum number of files allowed for this file base.
  1469.                 This number will be 0 if there is no maximum files limit
  1470.               }
  1471.  
  1472.             activefiles,
  1473.               { The current number of files in file base }
  1474.  
  1475.             kperup,
  1476.               { Amount of K to give to a user for every 1k uploaded }
  1477.  
  1478.             kperdown,
  1479.               { Amount of K to take from a user for every 1k downloaded.
  1480.                 This variable, and the kperup variable control the
  1481.                 calculated user ratio }
  1482.  
  1483.             cperup,
  1484.               { Amount of file credits to give to a user for every 1
  1485.                 file uploaded }
  1486.  
  1487.             cperdown      : Integer;
  1488.               { Amount of file credits to take from a user for every 1
  1489.               file downloaded.  This variable, and the cperup variable
  1490.               conrtol the calculated user ratio }
  1491.  
  1492.             sltoval       : byte;
  1493.               { Security level required by a user to download
  1494.                 unvalidated files }
  1495.  
  1496.             transfersl,
  1497.               { Requirement string used to determine access to file base
  1498.               }
  1499.  
  1500.             batchsl,
  1501.               { Requirement string used to determine access to batch
  1502.                 downloads from this file base }
  1503.  
  1504.             creditsl      : String[70];
  1505.               { Requirement string used to determine whether the credit
  1506.                 system is active for the user within the file base.  If
  1507.                 the user does NOT meet this requirement string then the
  1508.                 credit system will be active for them (if the credit
  1509.                 system is turned on of course) }
  1510.  
  1511.             minbaud       : Integer;
  1512.               { Minimum baud rate required to enter this file base }
  1513.  
  1514.             transferflags : Flagtype;
  1515.               { Transfer flags for file base.  Each flag stands for the
  1516.                 following information :
  1517.  
  1518.                 1 - TRUE if file base is currently active.  FALSE if the
  1519.                     file base has been temporarily shut down
  1520.                 2 - TRUE if files are automatically set to UNVALIDATED
  1521.                     when they are uploaded by users.  FALSE is they are
  1522.                     never to be flagged as unvalidated
  1523.                 3 - TRUE if the credit system is active for file base,
  1524.                     FALSE if the credit system is currently turned off
  1525.                     for this file base
  1526.                 4 - TRUE if the file credit system is currently in
  1527.                     effect, FALSE if the KperK credit system is in
  1528.                     effect.  Note that this flag is only looked at if
  1529.                     the credit system is on at all (determined by flag
  1530.                     3)
  1531.                 5 - TRUE if extended descriptions are allowed for file
  1532.                     base.  FALSE if no extended descriptions are
  1533.                     allowed
  1534.                 6 - TRUE if users are allowed to password protect files
  1535.                     when they are uploaded.  FALSE is passwords are not
  1536.                     allowed on this file base
  1537.                 7 - TRUE is sysop only files are allowed on this base.
  1538.                     FALSE is sysop only files are NOT allowed
  1539.                 8 - TRUE is users with VALIDATED security levels are
  1540.                     allowed to download unvalidated files from file base
  1541.                 9 - TRUE if file base is marked as a floppy base.  FALSE
  1542.                     if it is marked as a normal base.  If the file base
  1543.                     is marked as a floppy base, Harmony BBS will never
  1544.                     look for the XX.IDX,XX.HMY and XX.EXT files, it will
  1545.                     simply grab information directly from the disk
  1546.                 10-32 reserved for future use by Concord Software }
  1547.  
  1548.           END;
  1549.                                                                   
  1550.                         ________________________
  1551.  ====================================================================
  1552.  
  1553.   User Directory (C:\HM\USERS )
  1554.  
  1555.   DENIAL   HMY - List of non-acceptable names of users
  1556.  
  1557.         Contains all the words that Harmony BBS will scan for during a
  1558.         logon sequence.  It is a normal text file, each line containing
  1559.         a word or set of words that Harmony will look for.  An example
  1560.         of this file follows :
  1561.  
  1562.         hacker
  1563.         pirate
  1564.         jon doe
  1565.         empty
  1566.  
  1567.         In this case, Harmony BBS will not allow access to anyone with a
  1568.         name or alias that CONTAINS any of the above text.  For example,
  1569.         someone with the name JON DOESGOOD would not be allowed access
  1570.         to Harmony BBS
  1571.  ====================================================================
  1572.  
  1573.   USERLOG  HMY - All user information
  1574.  
  1575.         Contains all of the information on all the users of the BBS.  It
  1576.         is a file of records of type USER_STATS, a explanation of this
  1577.         record follows :
  1578.  
  1579.           user_stats = RECORD
  1580.  
  1581.             firstname     : String[14];
  1582.               { First REAL name of user.  Should be in all capitals }
  1583.               
  1584.             lastname      : String[15];
  1585.               { Last part of REAL name of user.  Should be in all
  1586.                 capitals }
  1587.  
  1588.             alias         : String[30];
  1589.               { Alias of user.  If BBS does not have aliases turned on,
  1590.                 this field will be ignored }
  1591.  
  1592.             address       : String[40];
  1593.               { Street address }
  1594.  
  1595.             city          : String[20];
  1596.               { City }
  1597.  
  1598.             state         : String[02];
  1599.               { 2 character state code }
  1600.  
  1601.             zipcode       : String[05];
  1602.               { First 5 digits of zip code }
  1603.  
  1604.             phone         : String[12];
  1605.               { Phone number in ###-###-#### format }
  1606.  
  1607.             password      : String[20];
  1608.               { Password - CASE SENSITIVE }
  1609.  
  1610.             birthday,
  1611.               { Birthday of user (in MM/DD/YYYY format with padded 0's,
  1612.                 for example 01/05/1970) }
  1613.  
  1614.             laston        : String[10];
  1615.               { Last date the user called on.  Follows same format at
  1616.                 birthday field }
  1617.  
  1618.             kbuploaded,
  1619.               { Amount of K(1k=1024bytes) uploaded from user }
  1620.  
  1621.             kbdownloaded,
  1622.               { Amount of K downloaded from user }
  1623.  
  1624.             callstotal    : Longint;
  1625.               { Total number of calls user made to system }
  1626.  
  1627.             mailwaiting,
  1628.               { Amount of mail waiting .. NOTE : NEVER look at this
  1629.                 field to determine the actual amount of mail waiting.  It
  1630.                 is basically left over from the original way Harmony BBS
  1631.                 was handling private (post office) mail.  Now, Harmony BBS
  1632.                 does a quick scan of the mail directory at strategic times
  1633.                 to determine the amount of mail the user has waiting }
  1634.  
  1635.             totalposted,
  1636.               { Total number of message user has posted }
  1637.  
  1638.             totdownloaded,
  1639.               { Total number of files user has downloaded }
  1640.  
  1641.             totuploaded,
  1642.               { Total number of files user has uploaded }
  1643.  
  1644.             callstoday    : Integer;
  1645.               { Number of calls user has made to BBS today }
  1646.  
  1647.             RESERVED5 ,
  1648.               { Ignore }
  1649.  
  1650.             screenlength,
  1651.               { User's physical screen height, used to determine screen
  1652.                 pausing and full screen message editor size }
  1653.  
  1654.             screenwidth,
  1655.               { User's physical column width.  Not used much except in
  1656.                 word wrapping situations }
  1657.  
  1658.             Protocol,
  1659.               { Default protocol.  This is currently only used within
  1660.                 the professional version of Harmony BBS where the default
  1661.                 protocol is used in Qwk mail sessions.  It contains the
  1662.                 ORD of the character which should be equal to one of the
  1663.                 characters determined in the last line of every protocol
  1664.                 within the file PROTOCOLS.HMY (described earlier) If this
  1665.                 variable is set to 0, no default protocol has been chosen
  1666.               }
  1667.  
  1668.             security,
  1669.               { Security level of user, 1-100 }
  1670.  
  1671.             computer      : Byte;
  1672.               { Computer type of user.  This number corresponds to the
  1673.                 list shown within the Harmony BBS documenation }
  1674.  
  1675.             moneyowed     : Real;
  1676.               { Amount of money user owes to whatever organization is
  1677.                 being run by the sysop }
  1678.  
  1679.             userflags      : Flagtype;
  1680.               { Flag settings for user.  The flags definitions are as
  1681.                 follows :
  1682.  
  1683.                 1 - TRUE if the last time user logged on, he/she logged
  1684.                     on in ANSI mode
  1685.                 2 - TRUE if screen pausing is currently on for user
  1686.                 3 - TRUE if user has CAPITAL LETTER functions only
  1687.                 4 - TRUE if user has access to message bases
  1688.                     FALSE if message base access for this user has been
  1689.                     turned off
  1690.                 5 - TRUE if user has access to file transfer section
  1691.                     FALSE if file transfer section access has been
  1692.                     turned off
  1693.                 6 - TRUE if user has access to Qwik functions of the
  1694.                     professional version of Harmony BBS
  1695.                 7 - should ALWAYS be FALSE
  1696.                 8 - TRUE if user is male, FALSE if user is female
  1697.                 9 - should ALWAYS be TRUE
  1698.                 10 - TRUE if user is allowed to download batch files
  1699.                 11 - TRUE if user is allowed to post messages
  1700.                 12 - TRUE if user is allowed to send private mail
  1701.                 13 - TRUE if user wishes to see message base entrance
  1702.                      files
  1703.                 14 - TRUE if user is allowed to download files at all
  1704.                 15 - TRUE if user is allowed to download unvalidated
  1705.                      files (used in conjunction with transferflags[8] in
  1706.                      transfer_stats data type
  1707.                 16 - TRUE if user has full screen editor configured as
  1708.                      their default editor.  FALSE if line editor is
  1709.                      default
  1710.                 17 - TRUE if user has graphical screen pausing turned on
  1711.                 18 - System defined flag A
  1712.                 19 - System defined flag B
  1713.                 20 - System defined flag C
  1714.  
  1715.           END;
  1716.  
  1717.         An important note should be made about this file.  It is VERY
  1718.         important that the first record of this file (record #0) NEVER,
  1719.         EVER be written to.  User records start at record #1 (the second
  1720.         physical record in the file) and contains the sysop's user
  1721.         information.  If record #0 ever gets corrupted, chances are
  1722.         almost definite a full reinstallation will have to take place
  1723.  ====================================================================
  1724.  
  1725.  ╔═════════════════════════════════════════════════════════════════════════╗
  1726.  ║Concord Software make no  claims or gaurantees as to the accuracy of this║
  1727.  ║    document.  All warranties, copyrights, and distribution policies     ║
  1728.  ║explained in the main Harmony BBS documentation are also extended to this║
  1729.  ║  document.  Concord Software takes NO responsibility for any damages,   ║
  1730.  ║  either expressed or implied, that may result from the use of Harmony   ║
  1731.  ║             BBS, or the information within this document.               ║
  1732.  ╚═════════════════════════════════════════════════════════════════════════╝
  1733.