// ========================================================================= // Mystic BBS Software Copyright (C) 1997-2016 By James Coyle // ========================================================================= // File | RECORDS.PAS
// Desc | This file holds the data file records for all data files used

//           within Mystic BBS software.  Mystic BBS is compiled with the
//           latest version of Free Pascal for all platforms.

// =========================================================================

{$PACKRECORDS 1}

Const
mysSoftwareID = 'Mystic BBS';
mysCopyYear = '1997-2016';
mysVersion = '1.12 A3';
mysDataChanged = '1.12 A3';
mysCopyNotice = 'Copyright (C) ' + mysCopyYear + ' By James Coyle';

{$IFDEF WIN32}
PathChar = '\';
LineTerm = #13#10;
OSID = 'Windows';
OSType = 0;
{$ENDIF}

{$IFDEF LINUX}
PathChar = '/';
LineTerm = #10;
{$IFDEF CPUARM} OSID = 'Raspberry Pi'; {$ELSE} OSID = 'Linux'; {$ENDIF} OSType = 1;
{$ENDIF}

{$IFDEF DARWIN}
PathChar = '/';
LineTerm = #10;
OSID = 'OSX';
OSType = 2;
{$ENDIF}

// OSTYPE 3 = RESERVED FOR "ALL" OS TYPES IN CONFIGURATION

{$IFDEF OS2}
PathChar = '\';
LineTerm = #13#10;
OSID = 'OS/2';
OSType = 4;
{$ENDIF}

  mysMaxAcsSize      = 30;                                      // Max ACS string size
  mysMaxPathSize     = 80;
  mysMaxMsgLines     = 10000;                                   // Max message base lines
  mysMaxInputHistory = 5;                                       // Input history stack size
  mysMaxFileDescLen  = 50;                                      // file description length per line
  mysMaxBatchQueue   = 50;                                      // max files per queue
  mysMaxVoteQuestion = 20;                                      // Max number of voting questions
  mysMaxMenuNameLen  = 20;                                      // menu name size
  mysMaxMenuItems    = 99;                                      // Maximum menu items per menu
  mysMaxMenuCmds     = 25;                                      // Max menu commands per item

mysMaxMenuInput = 12;
mysMaxMenuStack = 8;
mysMaxThemeText = 527;

fn_SemFileEchoOut = 'echomail.out';
fn_SemFileEchoIn = 'echomail.in';
fn_SemFileNews = 'newsmail.out';

  fn_SemFileNet     = 'netmail.out';
  fn_SemFileQwk     = 'qwkmail.out';
  fn_tplMsgEdit     = 'ansiedit';

fn_tplTextEdit = 'ansitext';

ColumnValue : Array[0..1] of Byte = (80, 40);

Type
SmallWord = System.Word;
Integer = SmallInt;
Word = SmallWord;

RecMessageText = Array[1..mysMaxMsgLines] of String[132]; RecFileText = Array[1..100] of String[120];

AccessFlagType = Set of 1..26;

RecEchoMailAddr = Record
Zone,
Net,
Node,
Point : Word;
End;

RecEchoMailExport = LongInt;

RecEchoMailNode = Record
Index : LongInt;
Description : String[35];

    Active      : Boolean;
    Address     : RecEchoMailAddr;
    Domain      : String[8];
    ArcType     : String[4];
    MailType    : Byte;                               // 0=BINKP,1=FTP,2=Dir

binkHost : String[60];
ftpPassive : Boolean;
ProtType : Byte;
binkTimeout : Word;
binkBlock : Word;
binkMD5 : Byte;
ftpOutHost : String[60];
UNUSED2 : Word;
ftpOutLogin : String[20];
ftpOutPass : String[20];
ftpInDir : String[60];
ftpOutDir : String[60];
MaxPKTSize : Word;
LastRecv : LongInt;
LastSent : LongInt;
LastReset : LongInt;

    InFiles     : Cardinal;
    InSize      : Cardinal;
    OutFiles    : Cardinal;
    OutSize     : Cardinal;

binkPass : String[20];
RouteInfo : String[128];
AreaFixPass : String[20];
DirInDir : String[60];
DirOutDir : String[60];

    LPKTDay     : Byte;
    LPKTPtr     : Byte;

binkHideAKA : Boolean;
MaxARCSize : Word;

    PKTPass     : String[8];
    UseFileBox  : Byte;               //0=No, 1=Hold, 2=Any
    OutFileBox  : String[60];
    TICPass     : String[20];
    Res         : Array[1..122] of Byte;

End;

RecQwkNetwork = Record
Index : LongInt;
Description : String[30];
MemberType : Byte; // 0=HUB,1=Node PacketID : String[20];
UseQWKE : Boolean;
UsePassive : Boolean;
HostName : String[60];
Login : String[20];
Password : String[20];

    ArcType     : String[4];
    Res         : Array[1..75] of Byte;

End;

RecSauceInfo = Packed Record
Title : String[35];
Author : String[20];
Group : String[20];
End;

RecUserOptionalField = Record
Ask : Boolean;
Desc : String[12];
iType : Byte;
iField : Byte;
iMax : Byte;
End;

RecConfig = Record // MYSTIC.DAT // INTERNALS

    DataChanged     : String[8];                                // Version of last data change
    SystemCalls     : LongInt;                                  // system caller number
    UserIdxPos      : LongInt;                                  // permanent user # position
 // SYSTEM PATHS
    SystemPath      : String[mysMaxPathSize];                   // Root mystic path
    DataPath        : String[mysMaxPathSize];
    LogsPath        : String[mysMaxPathSize];
    MsgsPath        : String[mysMaxPathSize];
    AttachPath      : String[mysMaxPathSize];
    ScriptPath      : String[mysMaxPathSize];
    QwkPath         : String[mysMaxPathSize];
    SemaPath        : String[mysMaxPathSize];
    InboundPath     : String[mysMaxPathSize];
    MenuPath        : String[mysMaxPathSize];
    TextPath        : String[mysMaxPathSize];

OutboundPath : String[mysMaxPathSize]; // GENERAL SETTINGS

    BBSName         : String[30];
    SysopName       : String[30];
    SysopPW         : String[15];
    SystemPW        : String[15];
    FeedbackTo      : String[30];
    Inactivity      : Word;                                     // Inactivity seconds (0=disabled)
    DefStartMenu    : String[20];                               // Default start menu
    UNUSED          : String[20];
    DefThemeFile    : String[20];
    DefTermMode     : Byte;                                     // 0=ask 1=detect 2=detect/ask 3=ansi

DefScreenSize : Byte;
DefScreenCols : Byte;

    ChatStart       : Byte;                                     // Chat hour start
    ChatEnd         : Byte;                                     // Chat hour end
    ChatFeedback    : Boolean;                                  // E-mail sysop if page isn't answered
    ChatLogging     : Boolean;                                  // Record SysOp chat to CHAT.LOG?
    AcsSysop        : String[mysMaxAcsSize];
 // LOGIN/MATRIX
    LoginTime       : Byte;
    LoginAttempts   : Byte;
    PWAttempts      : Byte;
    PWChange        : Word;
    PWInquiry       : Boolean;
    UseMatrix       : Boolean;
    MatrixMenu      : String[20];
    MatrixPW        : String[15];
    MatrixAcs       : String[mysMaxAcsSize];
    AcsInvisLogin   : String[mysMaxAcsSize];
    AcsSeeInvis     : String[mysMaxAcsSize];

AcsMultiLogin : String[mysMaxAcsSize]; // CONSOLE SETTINGS

SysopMacro : Array[1..8] of String[60]; // Sysop Macros f1-f8 UseStatusBar : Boolean;
StatusColor1 : Byte;
StatusColor2 : Byte;
StatusColor3 : Byte;
// NEW USER SETTINGS 1

AllowNewUsers : Boolean;

    NewUserSec      : SmallInt;
    NewUserPW       : String[15];
    NewUserEMail    : Boolean;
    StartMGroup     : Word;
    StartFGroup     : Word;
    UseUSAPhone     : Boolean;
    UserNameFormat  : Byte;                                     // 0=typed 1=upper 2=lower 3=proper
 // NEW USER SETTINGS 2
    UserDateType    : Byte;                                     // 1=MM/DD/YY 2=DD/MM/YY 3=YY/DD/MM 4=Ask
    UserEditorType  : Byte;                                     // 0=Line 1=Full 2=Ask
    UserHotKeys     : Byte;                                     // 0=no 1=yes 2=ask
    UserFullChat    : Byte;                                     // 0=no 1=yes 2=ask
    UserFileList    : Byte;                                     // 0=Normal 1=Lightbar 2=Ask
    UserReadType    : Byte;                                     // 0=normal 1=ansi 2=ask
    UserMailIndex   : Byte;                                     // 0=normal 1=ansi 2=ask
    UserReadIndex   : Byte;                                     // 0=normal 1=ansi 2=ask
    UserQuoteWin    : Byte;                                     // 0=line 1=window 2=ask
    UserProtocol    : Byte;                                     // 0=no 1=yes 2=ask
    AskTheme        : Boolean;
    AskRealName     : Boolean;
    AskAlias        : Boolean;
    AskStreet       : Boolean;
    AskCityState    : Boolean;
    AskZipCode      : Boolean;

AskHomePhone : Boolean;
AskDataPhone : Boolean;
AskBirthdate : Boolean;

    AskGender       : Boolean;
    AskEmail        : Boolean;
    AskUserNote     : Boolean;

AskScreenSize : Boolean;
AskScreenCols : Boolean;
// NEW USER OPTIONAL

OptionalField : Array[1..10] of RecUserOptionalField; // MESSAGE BASE SETTINGS

    MCompress       : Boolean;
    MColumns        : Byte;
    MShowHeader     : Boolean;                                  // re-show msg header after pause
    MShowBases      : Boolean;
    MaxAutoSig      : Byte;
    Origin          : String[50];                               // Default origin line
    NetCrash        : Boolean;
    NetHold         : Boolean;
    NetKillSent     : Boolean;
    ColorQuote      : Byte;
    ColorText       : Byte;
    ColorTear       : Byte;
    ColorOrigin     : Byte;
    ColorKludge     : Byte;
    AcsExtReply     : String[mysMaxAcsSize];

AcsFileAttach : String[mysMaxAcsSize]; AcsNodeLookup : String[mysMaxAcsSize];

    FSEditor        : Boolean;
    FSCommand       : String[60];
 // ECHOMAIL NETWORKS
    NetAddress      : Array[1..30] of RecEchoMailAddr;          // echomail addresses
    NetPrimary      : Array[1..30] of Boolean;
    Res1            : Array[1..210] of Byte;
    NetDomain       : Array[1..30] of String[8];                // echomail domains (5D)
    NetDesc         : Array[1..30] of String[25];               // echomail network description
 // OFFLINE MAIL (should include local qwk path)
    qwkMaxBase      : Word;
    qwkMaxPacket    : Word;
    qwkArchive      : String[4];
    qwkBBSID        : String[8];
    qwkWelcome      : String[mysMaxPathSize];
    qwkNews         : String[mysMaxPathSize];
    qwkGoodbye      : String[mysMaxPathSize];
 // FILE BASE SETTINGS
    FCompress       : Boolean;
    FColumns        : Byte;
    FShowHeader     : Boolean;
    FShowBases      : Boolean;
    FDupeScan       : Byte;                                     // 0=no 1=yes 2=global
    UploadBase      : Word;                                     // Default upload file base
    ImportDIZ       : Boolean;
    FreeUL          : LongInt;
    FreeCDROM       : LongInt;
    MaxFileDesc     : Byte;
    FCommentLines   : Byte;
    FCommentLen     : Byte;
    FProtocol       : Char;
    TestUploads     : Boolean;
    TestPassLevel   : Byte;
    TestCmdLine     : String[mysMaxPathSize];
    AcsValidate     : String[mysMaxAcsSize];

AcsSeeUnvalid : String[mysMaxAcsSize]; AcsDLUnvalid : String[mysMaxAcsSize]; AcsSeeFailed : String[mysMaxAcsSize]; AcsDLFailed : String[mysMaxAcsSize]; // INTERNET SERVER SETTINGS

inetDomain : String[25];
inetIPBlocking : Boolean;

    inetLogging     : Boolean;
    inetSMTPUse     : Boolean;
    inetSMTPPort    : Word;
    inetSMTPMax     : Word;

inetSMTPDupes : Byte;
inetSMTPTimeOut : Word;
inetPOP3Use : Boolean;
inetPOP3Port : Word;
inetPOP3Max : Word;
inetPOP3Dupes : Byte;
inetPOP3Delete : Boolean;
inetPOP3Timeout : Word;

    inetTNUse       : Boolean;
    inetTNPort      : Word;
    inetTNNodes     : Byte;
    inetTNDupes     : Byte;
    inetFTPUse      : Boolean;
    inetFTPPort     : Word;
    inetFTPMax      : Word;

inetFTPDupes : Byte;
inetFTPPortMin : Word;
inetFTPPortMax : Word;
inetFTPPassive : Boolean;
inetFTPTimeout : Word;
inetNNTPUse : Boolean;
inetNNTPPort : Word;
inetNNTPMax : Word;
inetNNTPDupes : Byte;
inetNNTPTimeOut : Word;
// UNSORTED

inetTNHidden : Boolean;
ThemeOnStart : Boolean;
StartCodePage : Byte;
AcsSeeOffline : String[mysMaxAcsSize]; // DefDomain : String[8];
//inetSMTPRelay : String[30];
//inetSMTPLogin : String[30];
//inetSMTPPW : String[30];
//EmailValidationLevel
//AllowEmailPWReset
ForceNodeList : Boolean;
inetInterface : String[23];
inetBINKPUse : Boolean;
inetBINKPPort : Word;
inetBINKPMax : Word;
inetBINKPDupes : Byte;
inetBINKPTimeOut: Word;
inetBINKPCram5 : Boolean;
QwkNetMenu : String[20];
inetFTPHideQWK : Byte; // 0 = hide, 1=root dir 2=all dirs AcsMsgUpload : String[mysMaxAcsSize]; CreateSemaphore : Byte; // 0 = on logoff, 1 = on post inetUseDNSBL : Boolean;
inetDNSBL : String[40];
inetUseDNSCC : Boolean;

    inetDNSCC       : String[40];
    inetBanIP       : Byte;
    inetBanSecs     : Word;

inetBINKPUnsecure : Boolean;
UnsecurePath : String[mysMaxPathSize]; inetBINKPRename : Byte; // 0=Rename, 1=Skip inetBINKPExempt : Boolean;

    AskCodePage     : Byte;
    MatrixLogin     : Boolean;
    Reserved        : Array[1..551] of Char;

End;

Const
UserLockedOut = $00000001;
UserNoRatio = $00000002;
UserDeleted = $00000004;
UserNoKill = $00000008;
UserNoLastCall = $00000010;
UserNoPWChange = $00000020;
UserNoHistory = $00000040;
UserNoTimeout = $00000080;
UserQWKNetwork = $00000100;
UserNoDelete = $00000200;
UserForcePW = $00000400;

Type

  RecUser = Record                                         // USERS.DAT
    PermIdx      : LongInt;                                // permanent user number
    Flags        : LongInt;                                // User Flags bitmap
    Handle       : String[30];                             // Handle
    RealName     : String[30];                             // Real Name
    Password     : String[15];                             // Password
    Address      : String[30];                             // Address
    City         : String[25];                             // City
    ZipCode      : String[9];                              // Zipcode
    HomePhone    : String[15];                             // Home Phone
    DataPhone    : String[15];                             // Data phone
    Birthday     : LongInt;                                //
    Gender       : Char;                                   // M/F/U
    Email        : String[60];
    OptionData   : Array[1..10] of String[60];
    UserInfo     : String[30];
    Theme        : String[20];
    AF1          : AccessFlagType;
    AF2          : AccessFlagType;
    Security     : SmallInt;
    Expires      : String[8];

ExpiresTo : Byte;
LastPWChange : String[8];
StartMenu : String[20];

    Archive      : String[4];
    QwkFiles     : Boolean;
    DateType     : Byte;

ScreenSize : Byte;
ScreenCols : Byte;

    PeerIP       : String[20];
    PeerHost     : String[50];
    FirstOn      : LongInt;                                // Date/Time of First Call
    LastOn       : LongInt;                                // Date/Time of Last Call
    Calls        : LongInt;                                // Number of calls to BBS
    CallsToday   : SmallWord;                              // Number of calls today
    DLs          : SmallWord;                              // # of downloads
    DLsToday     : SmallWord;                              // # of downloads today
    DLk          : LongInt;                                // # of downloads in K
    DLkToday     : LongInt;                                // # of downloaded K today
    ULs          : LongInt;                                // total number of uploads
    ULk          : LongInt;                                // total number of uploaded K
    Posts        : LongInt;                                // total number of msg posts
    Emails       : LongInt;                                // total number of sent email
    TimeLeft     : LongInt;                                // time left online for today
    TimeBank     : SmallInt;                               // number of mins in timebank

FileRatings : LongInt;
FileComment : LongInt;

    LastFBase    : Word;                                   // Last file base
    LastMBase    : Word;                                   // Last message base
    LastMGroup   : Word;                                   // Last group accessed
    LastFGroup   : Word;                                   // Last file group accessed
    Vote         : Array[1..20] of Byte;                   // Voting booth data
    EditType     : Byte;                                   // 0 = Line, 1 = Full, 2 = Ask
    FileList     : Byte;                                   // 0 = Normal, 1 = Lightbar
    SigUse       : Boolean;                                // Use auto-signature?
    SigOffset    : LongInt;                                // offset to sig in AUTOSIG.DAT
    SigLength    : Byte;                                   // number of lines in sig
    HotKeys      : Boolean;                                // does user have hotkeys on?
    MReadType    : Byte;                                   // 0 = line 1 = full 2 = ask
    UseLBIndex   : Boolean;                                // use lightbar index?
    UseLBQuote   : Boolean;                                // use lightbar quote mode
    UseLBMIdx    : Boolean;                                // use lightbar index in email?
    UseFullChat  : Boolean;                                // use full screen teleconference
    Credits      : LongInt;
    Protocol     : Char;
    UNUSED       : Byte;

QwkExtended : Boolean;
QwkNetwork : LongInt;
EmailValCode : String[8];
EmailValSent : LongInt;
EmailValDate : LongInt;
Reserved : Array[1..366] of Byte; End;

RecEvent = Record
Active : Boolean;
Name : String[40];
ExecType : Byte; // 0=BBS, 1=Semaphore, 2=Shell, 3=Interval,4=Hourly ExecTime : SmallInt;
ExecDays : Array[0..6] of Boolean; Shell : String[160];
SemaFile : String[160];
Node : Byte;
Warning : Byte;
LastRan : LongInt;
Res : Array[1..32] of Byte;
End;

(* SECURITY.DAT in the data directory holds 255 records, one for each ) ( possible security level. *)

  RecSecurity = Record                   { SECURITY.DAT                     }
    Desc       : String[30];             { Description of security level    }
    Time       : Word;                   { Time online (mins) per day       }
    MaxCalls   : Word;                   { Max calls per day                }
    MaxDLs     : Word;                   { Max downloads per day            }
    MaxDLk     : Word;                   { Max download kilobytes per day   }
    MaxTB      : Word;                   { Max mins allowed in time bank    }
    DLRatio    : Byte;                   { Download ratio ( of DLs per UL) }
    DLKRatio   : SmallInt;               { DL K ratio ( of DLed K per UL K }
    AF1        : AccessFlagType;         { Access flags for this level A-Z  }
    AF2        : AccessFlagType;         { Access flags #2 for this level   }
    Hard       : Boolean;                { Do a hard AF upgrade?            }
    StartMenu  : String[20];             { Start Menu for this level        }
    PCRatio    : SmallInt;               { Post / Call ratio per 100 calls  }

Expires : Word;
ExpiresTo : Word;
Posts : Word;
PostsTo : Word;
Download : Word;
DownloadTo : Word;
Upload : Word;
UploadTo : Word;
Calls : Word;
CallsTo : Word;
Reserved : Array[1..64] of Byte;
End;

RecArchive = Record { ARCHIVE.DAT } OSType : Byte;
Active : Boolean;
Desc : String[30];
Ext : String[4];
Pack : String[80];
Unpack : String[80];
View : String[80];
End;

  MScanRec = Record                    { <Message Base Path> *.SCN       }
    NewScan : Byte;                    { Include this base in new scan?  }
    QwkScan : Byte;                    { Include this base in qwk scan?  }

End;

Const
MBRealNames = $00000001; // 1
MBKillKludge = $00000002; // 2
MBAutosigs = $00000004; // 3
MBNoAttach = $00000008; // 4
MBPrivate = $00000010; // 5
MBPrivReply = $00000020; // 6
MBAllowANSI = $00000040; // 7

Type

  RecMessageBase = Record                                  // MBASES.DAT
    Name      : String[40];
    QWKName   : String[13];                                // ancient standard.. qwk base name
    NewsName  : String[60];                                // newsgroup name spaces are replaced with .
    FileName  : String[40];
    Path      : String[mysMaxPathSize];
    UNUSED    : Byte;
    NetType   : Byte;                                           // 0=Local 1=Echo 2=News 3=Net
    ReadType  : Byte;                                           // 0=User 1=Normal 2=FS
    ListType  : Byte;                                           // 0=User 1=Normal 2=FS

ListACS : String[mysMaxAcsSize];
ReadACS : String[mysMaxAcsSize];
PostACS : String[mysMaxAcsSize];
NewsACS : String[mysMaxACsSize];
SysopACS : String[mysMaxAcsSize];
Sponsor : String[30];
ColQuote : Byte;
ColText : Byte;
ColTear : Byte;
ColOrigin : Byte;
ColKludge : Byte;

    NetAddr   : Byte;                                           // Net AKA to use for this base
    Origin    : String[50];                                     // Net origin line for this base
    DefNScan  : Byte;                                           // 0 = off, 1 = on, 2 = forced
    DefQScan  : Byte;                                           // 0 = off, 1 = on, 2 = forced
    MaxMsgs   : Word;                                           // max messages allowed (used for squish)
    MaxAge    : Word;                                           // max days to keep msg (used for squish)
    Header    : String[20];                                     // standard reader msgheader
    RTemplate : String[20];                                     // fullscreen reader template
    ITemplate : String[20];                                     // lightbar index template
    Index     : Word;                                           // permanent index
    Flags     : LongInt;                                        // MB flag bits see above
    Created   : LongInt;
    EchoTag   : String[40];                                     // EchoMail Tag

QwkNetID : LongInt;
QwkConfID : Word;
Res : Array[1..29] of Byte; // RESERVED End;

  FScanRec = Record                    { <Data Path> *.SCN               }
    NewScan : Byte;                    { Include this base in new scan?  }
    LastNew : LongInt;                 { Last file scan (packed datetime)}

End;

Const
FBShowUpload = $00000001;
FBSlowMedia = $00000002;
FBFreeFiles = $00000004;

Type
RecFileBase = Record

    Index      : Word;          // change to longint?
    Name       : String[40];         // change to 70?

FtpName : String[60];
FileName : String[40];
DispFile : String[20];
Template : String[20];
ListACS : String[30];

    FtpACS     : String[30];
    DLACS      : String[30];
    ULACS      : String[30];

HatchACS : String[30];
SysOpACS : String[30];
Path : String[80];
DefScan : Byte;
Flags : LongInt;
Created : LongInt;
NetAddr : Byte;
EchoTag : String[30];
End;

(* The file directory listing are stored as <FBaseRec.FileName>.DIR in ) ( the data directory. Each record stores the info on one file. File ) ( descriptions are stored in <FBaseRec.FileName>.DES in the data ) ( directory. FDirRec.Pointer points to the file position in the .DES ) ( file where the file description for the file begins. FDirRec.Lines is ) ( the number of lines in the file description. Each line is stored as a )

( Pascal-like string (ie the first byte is the length of the string,     )
( followed by text which is the length of the first byte                 *)

Const
FDirOffline = $01;
FDirInvalid = $02;
FDirDeleted = $04;
FDirFailed = $08;
FDirFree = $10;
FDirHatched = $20;
// FDirSent = $40;
// FDirLocal = $80;

Type
RecFileIndex = Record
CRC : Int64;
End;

RecFileList = Record
FileName : String[70];
Size : LongInt;
DateTime : LongInt;
Uploader : String[30];
Flags : Byte;
Downloads : LongInt;
Rating : Byte;
DescPtr : Cardinal;
DescLines : Byte;
End;

RecFileComment = Record { .FCI and .FCT in DATA directory } UserName : String[30];
Rating : Byte;
Date : LongInt;
Pointer : LongInt;
Lines : Word;
End;

RecGroup = Record
UniqueID : LongInt;

    Name     : String[30];
    ACS      : String[30];

Hidden : Boolean;
End;

PtrMenuCmd = ^RecMenuCmd;
RecMenuCmd = Packed Record
MenuCmd : String[2];
Access : String[mysMaxAcsSize];
Data : String[160];
JumpID : Byte;
End;

PtrMenuItem = ^RecMenuItem;
RecMenuItem = Packed Record
UniqueID : Integer;

    Text       : String[160];
    TextLo     : String[160];
    TextHi     : String[160];
    HotKey     : String[mysMaxMenuInput];
    Access     : String[mysMaxAcsSize];
    ShowType   : Byte;
    ReDraw     : Byte;
    JumpUp     : Byte;

JumpDown : Byte;
JumpLeft : Byte;
JumpRight : Byte;
JumpEscape : Byte;
JumpTab : Byte;
JumpPgUp : Byte;
JumpPgDn : Byte;
JumpHome : Byte;
JumpEnd : Byte;
CmdData : Array[1..mysMaxMenuCmds] of PtrMenuCmd; Commands : Byte;

    X          : Byte;
    Y          : Byte;
    Timer      : Word;

TimerType : Byte;
TimerShow : Boolean;
End;

RecMenuInfo = Packed Record
Description : String[30];
Access : String[mysMaxAcsSize]; DispFile : String[20];
Fallback : String[20];
NodeStatus : String[30];

    Header      : String[160];
    Footer      : String[160];
    DoneX       : Byte;
    DoneY       : Byte;

MenuType : Byte; // 0=std, 1=lb, 2=grid, 3=lbprompt InputType : Byte;
CharType : Byte;
DispCols : Byte;
Global : Boolean;
IdxCounter : LongInt;
End;

RecPercent = Record
BarLength : Byte;
LoChar : Char;
LoAttr : Byte;
HiChar : Char;
HiAttr : Byte;
Format : Byte;
StartY : Byte;
Active : Boolean;
StartX : Byte;
LastPos : Byte;
Reserved : Array[1..3] of Byte;
End;

Const
ThmAllowASCII = $00000001;
ThmAllowANSI = $00000002;
ThmLightbarYN = $00000004;
ThmFallback = $00000008;

Type
PtrTheme = ^RecTheme;
RecTheme = Record

    Flags         : LongInt;
    FileName      : String[20];
    Desc          : String[40];
    TextPath      : String[mysMaxPathSize];
    MenuPath      : String[mysMaxPathSize];

ScriptPath : String[mysMaxPathSize]; TemplatePath : String[mysMaxPathSize];

    LineChat1     : Byte;
    LineChat2     : Byte;

UserInputFmt : Byte;
FieldColor1 : Byte;
FieldColor2 : Byte;

    FieldChar     : Char;
    EchoChar      : Char;
    UNUSED        : Byte;
    TagChar       : Char;

FileDescHi : Byte;
FileDescLo : Byte;
NewMsgChar : Char;
NewVoteChar : Char;

    VotingBar     : RecPercent;
    FileBar       : RecPercent;
    MsgBar        : RecPercent;
    GalleryBar    : RecPercent;
    HelpBar       : RecPercent;
    ViewerBar     : RecPercent;
    IndexBar      : RecPercent;
    FAreaBar      : RecPercent;
    FGroupBar     : RecPercent;
    MAreaBar      : RecPercent;
    MGroupBar     : RecPercent;
    MAreaList     : RecPercent;
    Colors        : Array[0..9] of Byte;
    ColumnSize    : Byte;
    BoxFrame      : Byte;
    BoxAttr       : Byte;
    BoxAttr2      : Byte;
    BoxAttr3      : Byte;
    BoxAttr4      : Byte;
    BoxShadow     : Boolean;

BoxShadowAttr : Byte;
BoxHeadAttr : Byte;
BoxOKAttr : Byte;
BoxTextAttr : Byte;
Reserved : Array[1..188] of Byte; End;

BBSListRec = Record

    cType     : Byte;
    Phone     : String[15];

Telnet : String[40];
BBSName : String[30];
Location : String[25];
SysopName : String[30];
BaudRate : String[6];
Software : String[10];
Deleted : Boolean;
AddedBy : String[30];
Verified : LongInt;
Res : Array[1..6] of Byte;
End;

(* ONELINERS.DAT found in the data directory. This file contains all the

one-liner data. It can be any number of records in size. *)

OneLineRec = Record
Text : String[79];
From : String[30];
End;

(* Each record of VOTES.DAT is one question. Mystic only allows for up ) ( to 20 questions. *)

  VoteRec = Record                      { VOTES.DAT in DATA directory      }
    Votes    : SmallInt;                { Total votes for this question    }
    AnsNum   : Byte;                    { Total # of Answers               }
    User     : String[30];              { User name who added question     }
    ACS      : String[20];              { ACS to see this question         }
    AddACS   : String[20];              { ACS to add an answer             }
    ForceACS : String[20];              { ACS to force voting of question  }
    Question : String[79];              { Question text                    }
    Answer   : Array[1..15] of Record   { Array[1..15] of Answer data      }
                Text  : String[40];     { Answer text                      }
                Votes : SmallInt;       { Votes for this answer            }
              End;

End;

(* CHATx.DAT is created upon startup, where X is the node number being ) ( loaded. These files are used to store all the user information for a ) ( node. *)

// need to have terminal emulation and remove baud rate // add IP/host? change booleans to bitmap? user perm index

  ChatRec = Record                     { CHATx.DAT }
    Active    : Boolean;               { Is there a user on this node?   }
    Name      : String[30];            { User's name on this node        }
    Action    : String[40];            { User's action on this node      }
    Location  : String[30];            { User's City/State on this node  }
    Gender    : Char;                  { User's gender                   }
    Age       : Byte;                  { User's age                      }
    Baud      : String[6];             { User's baud rate                }
    Invisible : Boolean;               { Is node invisible?              }
    Available : Boolean;               { Is node available?              }
    InChat    : Boolean;               { Is user in multi-node chat?     }
    Room      : Byte;                  { Chat room                       }

End;

(* Chat room record - partially used by the multi node chat functions *)

RoomRec = Record
Name : String[40]; { Channel Name } Reserved : Array[1..128] of Byte; { RESERVED } // moderator ACS
// change topic ACS
// join ACS
// topic
End;

(* CALLERS.DAT holds information on the last ten callers to the BBS. This ) ( file is always 10 records long with the most recent caller being the ) ( 10th record. *)

RecLastOn = Record // CALLERS.DAT DateTime : LongInt;
NewUser : Boolean;
PeerIP : String[15];
PeerHost : String[50];
Node : Byte;
CallNum : LongInt;

    Handle     : String[30];
    City       : String[25];
    Address    : String[30];
    Gender     : Char;

EmailAddr : String[35];
UserInfo : String[30];
OptionData : Array[1..10] of String[60]; Reserved : Array[1..53] of Byte;
End;

RecHistory = Record

    Date       : LongInt;
    Emails     : Word;
    Posts      : Word;

Downloads : Word;
Uploads : Word;
DownloadKB : LongInt;
UploadKB : LongInt;
Calls : LongInt;
NewUsers : Word;

    Telnet     : Word;
    FTP        : Word;
    POP3       : Word;
    SMTP       : Word;
    NNTP       : Word;
    HTTP       : Word;
    Hourly     : Array[0..23] of Byte;

Reserved : Array[1..2] of Byte;
End;

RecProtocol = Record
OSType : Byte;
Active : Boolean;
Batch : Boolean;
Key : Char;
Desc : String[40];
SendCmd : String[60];
RecvCmd : String[60];
End;

RecPrompt = String[255];

NodeMsgRec = Record
FromNode : Byte;
FromWho : String[30];
ToWho : String[30];
Message : String[250];
MsgType : Byte;
{ 1 = Chat Pub and broadcast }
{ 2 = System message }
{ 3 = User message }
{ 4 = Chat Private }
{ 5 = chat status note }
{ 6 = chat action }
{ 7 = chat topic update }
{ 8 = user 2 user page }
{ 9 = user 2 user forced }
{ 10 = chat accepted }
{ 11 = start pipe session }
{ 12 = end pipe session }
{ 13 = terminate node }
Room : Byte; { Chat room number. 0 = chat broadcast } End;

RecScriptServer = Record
Active : Boolean;
ServerID : String[8];
Script : String[160];
Port : Word;
MaxConns : Byte;
Timeout : Word;
DupeLimit : Byte;
LogType : Byte;
UseBADIP : Boolean;
UseGOODIP : Boolean;
UseDNSCC : Boolean;
UseDNSBL : Boolean;
BanConns : Byte;
BanSecs : Byte;
Reserved : Array[1..32] of Byte;
End;