diff --git a/mystic/109to110.pas b/mystic/109to110.pas index c60578e..8d7a54d 100644 --- a/mystic/109to110.pas +++ b/mystic/109to110.pas @@ -13,6 +13,25 @@ Uses {$I RECORDS.PAS} Type + OldFBaseRec = Record { FBASES.DAT } + Name : String[40]; { File base name } + FtpName : String[60]; { FTP directory name } + Filename : String[40]; { File name } + DispFile : String[20]; { Pre-list display file name } + Template : String[20]; { ansi file list template } + ListACS, { ACS required to see this base } + FtpACS, { ACS to see in FTP directory } + SysopACS, { ACS required for SysOp functions} + ULACS, { ACS required to upload files } + DLACS : String[mysMaxAcsSize]; { ACS required to download files } + Path : String[120]; { Path where files are stored } + Password : String[20]; { Password to access this base } + DefScan : Byte; { Default New Scan Setting } + ShowUL : Boolean; + IsCDROM : Boolean; + IsFREE : Boolean; + End; + OldFDirRec = Record { *.DIR } FileName : String[70]; { File name } Size : LongInt; { File size (in bytes) } @@ -1021,21 +1040,74 @@ Begin FindClose(DirInfo); End; +Procedure ConvertFileBases; +Var + FBase : RecFileBase; + FBaseFile : File of RecFileBase; + OldFBase : OldFBaseRec; + OldFBaseFile : File of OldFBaseRec; +Begin + WriteLn ('[-] Updating file bases...'); + + If Not ReNameFile(Config.DataPath + 'fbases.dat', Config.DataPath + 'fbases.old') Then Begin + WriteLn('[!] UNABLE TO FIND: ' + Config.DataPath + 'fbases.dat'); + Exit; + End; + + Assign (OldFBaseFile, Config.DataPath + 'fbases.old'); + Reset (OldFBaseFile); + + Assign (FBaseFile, Config.DataPath + 'fbases.dat'); + ReWrite (FBaseFile); + + While Not Eof(OldFBaseFile) Do Begin + Read (OldFBaseFile, OldFBase); + + FBase.Name := OldFBase.Name; + FBase.FtpName := OldFBase.FtpName; + FBase.FileName := OldFBase.FileName; + FBase.DispFile := OldFBase.DispFile; + FBase.Template := 'ansiflst'; + FBase.ListACS := OldFBase.ListACS; + FBase.FtpACS := OldFBase.FtpACS; + FBase.DLACS := OldFBase.DLACS; + FBase.ULACS := OldFBase.ULACS; + FBase.SysopACS := OldFBase.SysopACS; + FBase.Path := OldFBase.Path; + FBase.Password := OldFBase.Password; + FBase.DefScan := OldFBase.DefScan; + FBase.CommentACS := 's20'; + FBase.Flags := 0; + + If OldFBase.ShowUL Then FBase.Flags := FBase.Flags OR FBShowUpload; + If OldFBase.IsCDROM Then FBase.Flags := FBase.Flags OR FBSlowMedia; + If OldFBase.IsFREE Then FBase.Flags := FBase.Flags OR FBFreeFiles; + + Write (FBaseFile, FBase); + End; + + Close (FBaseFile); + Close (OldFBaseFile); + + DeleteFile (Config.DataPath + 'fbases.old'); +End; + Var ConfigFile : File of RecConfig; Begin WarningDisplay; -// COMMENT this out if mystic.dat is being converted: -// Assign (ConfigFile, 'mystic.dat'); -// Reset (ConfigFile); -// Read (ConfigFile, Config); -// Close (ConfigFile); + //COMMENT this out if mystic.dat is being converted: + Assign (ConfigFile, 'mystic.dat'); + Reset (ConfigFile); + Read (ConfigFile, Config); + Close (ConfigFile); - ConvertConfig; //1.10a11 +// ConvertConfig; //1.10a11 // ConvertUsers; //1.10a11 //ConvertSecurity; //1.10a11 //ConvertFileLists; //1.10a11 +ConvertFileBases; //1.10a11 // ConvertArchives; //1.10a1 // ConvertGroups; //1.10a1 diff --git a/mystic/HISTORY.txt b/mystic/HISTORY.txt index df5b4df..dc4115f 100644 --- a/mystic/HISTORY.txt +++ b/mystic/HISTORY.txt @@ -3857,3 +3857,19 @@ + The END key now functions in the lightbar file listing. It is kind of a half-assed implementation though, since doing it "the right way" will involve some extra coding in the future. + + + File Base settings for all ACS strings has been increased from 20 to 30 + characters. + + + File base "lightbar" list templates are now defined per file base in + the file base editor. The upgrade utility will set existing bases to + 'ansiflst' but any newly created bases will need to have this value set + per base now. + + + Updated file base record structures and added options for the possible + future "Comment and Rating" system for file bases. In addition, some + boolean data has been changed into a bitmapped flag variable. + + + Added new ANSI file base editor into the System Configuration. + + + Added Copy/Paste functions into all new ANSI internal editors. diff --git a/mystic/bbs_ansi_menubox.pas b/mystic/bbs_ansi_menubox.pas index 2ffe232..ec3ac0e 100644 --- a/mystic/bbs_ansi_menubox.pas +++ b/mystic/bbs_ansi_menubox.pas @@ -418,6 +418,8 @@ Begin If (A < 0) or (Picked = 1) Then A := 0; WriteXY (X1 + Width + 1, Y1 + 1 + A, Box.BoxAttr2, #178); End; + + Session.io.BufFlush; End; Procedure TAnsiMenuList.Open (BX1, BY1, BX2, BY2 : Byte); @@ -515,6 +517,7 @@ Begin End; If Picked < ListMax Then Inc (Picked); If Picked > TopPage + WinSize - 1 Then Inc (TopPage); + Update; End Else If Pos(Ch, LoChars) > 0 Then Begin ExitCode := Ch; diff --git a/mystic/bbs_cfg_filebase.pas b/mystic/bbs_cfg_filebase.pas index 448785e..a249317 100644 --- a/mystic/bbs_cfg_filebase.pas +++ b/mystic/bbs_cfg_filebase.pas @@ -4,164 +4,191 @@ Unit bbs_cfg_FileBase; Interface -Procedure File_Base_Editor; +Procedure Configuration_FileBaseEditor; Implementation Uses - m_FileIO, m_Strings, + m_FileIO, + bbs_Ansi_MenuBox, + bbs_Ansi_MenuForm, bbs_Common, - bbs_Core, - bbs_User; + bbs_cfg_Common; -Procedure File_Base_Editor; -Const - ST : Array[0..2] of String[6] = ('No', 'Yes', 'Always'); Var - A, - B : LongInt; + FBaseFile : TBufFile; + FBase : RecFileBase; + +Procedure EditFileBase; +Var + Box : TAnsiMenuBox; + Form : TAnsiMenuForm; + Topic : String; + Count : Byte; Begin - Session.SystemLog ('*FBASE EDITOR*'); - Reset(Session.FileBase.FBaseFile); + Topic := '|03(|09File Base Edit|03) |01-|09> |15'; + Box := TAnsiMenuBox.Create; + Form := TAnsiMenuForm.Create; - Repeat - Session.io.AllowPause := True; + Box.Open (6, 5, 75, 21); - Session.io.OutFullLn ('|CL|14File Base Editor|CR|CR|09### Name|CR--- |$D40-'); + VerticalLine (22, 7, 19); + VerticalLine (69, 7, 9); - Reset (Session.FileBase.FBaseFile); - While Not Eof(Session.FileBase.FBaseFile) Do Begin - Read (Session.FileBase.FBaseFile, Session.FileBase.FBase); - Session.io.OutFullLn ('|15' + strPadR(strI2S(FilePos(Session.FileBase.FBaseFile)), 3, ' ') + ' |14|FB'); + Form.AddStr ('N', ' Base Name' , 11, 7, 24, 7, 11, 30, 40, @FBase.Name, Topic + 'File base name'); + Form.AddStr ('F', ' FTP Name' , 12, 8, 24, 8, 10, 30, 60, @FBase.FTPName, Topic + 'Base name in FTP directory list'); + Form.AddStr ('D', ' Display File' , 8, 9, 24, 9, 14, 20, 20, @FBase.DispFile, Topic + 'Display file shown before listing'); + Form.AddStr ('T', ' Template' , 12, 10, 24, 10, 10, 20, 20, @FBase.Template, Topic + 'Lightbar list template'); + Form.AddStr ('L', ' List ACS ' , 12, 11, 24, 11, 10, 30, 30, @FBase.ListACS, Topic + 'ACS to list files'); + Form.AddStr ('U', ' Upload ACS ' , 10, 12, 24, 12, 12, 30, 30, @FBase.ULACS, Topic + 'ACS to upload files'); + Form.AddStr ('D', ' Download ACS ', 8, 13, 24, 13, 14, 30, 30, @FBase.DLACS, Topic + 'ACS to download files'); + Form.AddStr ('C', ' Comment ACS ' , 9, 14, 24, 14, 13, 30, 30, @FBase.CommentACS, Topic + 'ACS to comment and rate files'); + Form.AddStr ('P', ' FTP ACS' , 13, 15, 24, 15, 9, 30, 30, @FBase.FTPACS, Topic + 'ACS to access via FTP'); + Form.AddStr ('S', ' Sysop ACS ' , 11, 16, 24, 16, 11, 30, 30, @FBase.SysopACS, Topic + 'ACS for Sysop access'); + Form.AddTog ('E', ' Default Scan' , 8, 17, 24, 17, 14, 6, 0, 2, 'No Yes Forced', @FBase.DefScan, Topic + 'Default scan setting'); + Form.AddPass ('A', ' Password' , 12, 18, 24, 18, 10, 20, 20, @FBase.Password, Topic + 'Base password (Blank/Disable)'); + Form.AddPath ('I', ' File Path' , 11, 19, 24, 19, 11, 30, 120, @FBase.Path, Topic + 'Directory where files are stored'); - If (Session.io.PausePtr = Session.User.ThisUser.ScreenSize) and (Session.io.AllowPause) Then - Case Session.io.MorePrompt of - 'N' : Break; - 'C' : Session.io.AllowPause := False; - End; - End; + Form.AddBits ('R', ' Free Files' , 57, 7, 71, 7, 12, FBFreeFiles, @FBase.Flags, Topic + 'Files in base are free?'); + Form.AddBits ('M', ' Slow Media' , 57, 8, 71, 8, 12, FBSlowMedia, @FBase.Flags, Topic + 'Files stored on slow media device?'); + Form.AddBits (#01, ' Uploader' , 59, 9, 71, 9, 10, FBShowUpload, @FBase.Flags, Topic + 'Show upload in listing'); - Session.io.OutFull ('|CR|09(I)nsert, (D)elete, (E)dit, (M)ove, (Q)uit? '); - Case Session.io.OneKey (#13'DEIMQ', True) of - 'D' : begin - Session.io.OutRaw ('Delete which base? '); - a := strS2I(Session.io.GetInput(3, 3, 11, '')); - If (A > 0) and (A <= FileSize(Session.FileBase.FBaseFile)) Then Begin - Seek (Session.FileBase.FBaseFile, A - 1); - Read (Session.FileBase.FBaseFile, Session.FileBase.FBase); - FileErase (config.datapath + Session.FileBase.FBase.filename + '.dir'); - FileErase (config.datapath + Session.FileBase.FBase.filename + '.des'); - FileErase (config.datapath + Session.FileBase.FBase.filename + '.scn'); - KillRecord (Session.FileBase.FBaseFile, A, SizeOf(FBaseRec)); - End; - End; - 'I' : begin - Session.io.OutRaw ('Insert before which? (1-' + strI2S(filesize(Session.FileBase.FBaseFile)+1) + '): '); - a := strS2I(Session.io.GetInput(3, 3, 11, '')); - if (a > 0) and (a <= filesize(Session.FileBase.FBaseFile)+1) then begin - AddRecord (Session.FileBase.FBaseFile, A, SizeOf(Session.FileBase.FBaseFile)); + Repeat + Case Form.Execute of + #27 : Break; + End; + Until False; - Session.FileBase.FBase.Name := 'New File Base'; - Session.FileBase.FBase.FtpName := 'New_File_Base'; - Session.FileBase.FBase.Filename := 'NEW'; - Session.FileBase.FBase.Dispfile := ''; - Session.FileBase.FBase.ListACS := 's255'; - Session.FileBase.FBase.FtpACS := 's255'; - Session.FileBase.FBase.SysopACS := 's255'; - Session.FileBase.FBase.UlACS := 's255'; - Session.FileBase.FBase.DlACS := 's255'; - Session.FileBase.FBase.Path := ''; - Session.FileBase.FBase.Password := ''; - Session.FileBase.FBase.ShowUL := True; - Session.FileBase.FBase.IsCDROM := False; - Session.FileBase.FBase.DefScan := 1; + Box.Close; - Write (Session.FileBase.FBaseFile, Session.FileBase.FBase); - end; - end; - 'E' : begin - Session.io.OutRaw ('Edit which? '); - a := strS2I(Session.io.GetInput(3, 3, 11, '')); - if (a > 0) and (a <= filesize(Session.FileBase.FBaseFile)) then begin - seek (Session.FileBase.FBaseFile, a-1); - read (Session.FileBase.FBaseFile, Session.FileBase.fbase); - repeat - Session.io.OutFullLn ('|CL|14File Base ' + strI2S(FilePos(Session.FileBase.FBaseFile)) + ' of ' + strI2S(FileSize(Session.FileBase.FBaseFile)) + '|CR|03'); - Session.io.OutRawln ('A. Name : ' + Session.FileBase.FBase.name); - Session.io.OutRawln ('B. Filename : ' + Session.FileBase.FBase.filename); - Session.io.OutRawln ('C. Display File : ' + Session.FileBase.FBase.dispfile); - Session.io.OutRawln ('D. List ACS : ' + Session.FileBase.FBase.Listacs); - Session.io.OutRawln ('E. Sysop ACS : ' + Session.FileBase.FBase.SysopACS); - Session.io.OutRawln ('F. Upload ACS : ' + Session.FileBase.FBase.ulacs); - Session.io.OutRawln ('G. Download ACS : ' + Session.FileBase.FBase.dlacs); - Session.io.OutRawln ('H. Storage Path : ' + Session.FileBase.FBase.path); - Session.io.OutRawln ('I. Password : ' + Session.FileBase.FBase.password); - Session.io.OutRawln ('J. Show Uploader : ' + Session.io.OutYN(Session.FileBase.FBase.ShowUL)); - Session.io.OutRawLn ('K. Default New Scan : ' + ST[Session.FileBase.FBase.DefScan]); - Session.io.OutRawLn ('L. CD-ROM Area : ' + Session.io.OutYN(Session.FileBase.FBase.IsCDROM)); - Session.io.OutRawLn ('M. All Files Free : ' + Session.io.OutYN(Session.FileBase.FBase.IsFREE)); - Session.io.OutRawLn ('N. FTP Base Name : ' + Session.FileBase.FBase.FTPName); - Session.io.OutRawLn ('O. FTP List ACS : ' + Session.FileBase.FBase.FTPACS); - Session.io.OutFull ('|CR|09([) Prev, (]) Next, (Q)uit: '); - case Session.io.OneKey('[]ABCDEFGHIJKLMNOQ', True) of - '[' : If FilePos(Session.FileBase.FBaseFile) > 1 Then Begin - Seek (Session.FileBase.FBaseFile, FilePos(Session.FileBase.FBaseFile)-1); - Write (Session.FileBase.FBaseFile, Session.FileBase.FBase); - Seek (Session.FileBase.FBaseFile, FilePos(Session.FileBase.FBaseFile)-2); - Read (Session.FileBase.FBaseFile, Session.FileBase.FBase); - End; - ']' : If FilePos(Session.FileBase.FBaseFile) < FileSize(Session.FileBase.FBaseFile) Then Begin - Seek (Session.FileBase.FBaseFile, FilePos(Session.FileBase.FBaseFile)-1); - Write (Session.FileBase.FBaseFile, Session.FileBase.FBase); - Read (Session.FileBase.FBaseFile, Session.FileBase.FBase); - End; - 'A' : Session.FileBase.FBase.Name := Session.io.InXY(23, 3, 40, 40, 11, Session.FileBase.FBase.Name); - 'B' : Session.FileBase.FBase.FileName := Session.io.InXY(23, 4, 40, 40, 11, Session.FileBase.FBase.FileName); - 'C' : Session.FileBase.FBase.DispFile := Session.io.InXY(23, 5, 8, 8, 11, Session.FileBase.FBase.DispFile); - 'D' : Session.FileBase.FBase.ListACS := Session.io.InXY(23, 6, 20, 20, 11, Session.FileBase.FBase.ListACS); - 'E' : Session.FileBase.FBase.SysopACS := Session.io.InXY(23, 7, 20, 20, 11, Session.FileBase.FBase.SysopACS); - 'F' : Session.FileBase.FBase.ULacs := Session.io.InXY(23, 8, 20, 20, 11, Session.FileBase.FBase.ULacs); - 'G' : Session.FileBase.FBase.DLacs := Session.io.InXY(23, 9, 20, 20, 11, Session.FileBase.FBase.DLacs); - 'H' : Session.FileBase.FBase.Path := CheckPath(Session.io.InXY(23, 10, 39, 39, 11, Session.FileBase.FBase.Path)); - 'I' : Session.FileBase.FBase.Password := Session.io.InXY(23, 11, 15, 15, 12, Session.FileBase.FBase.Password); - 'J' : Session.FileBase.FBase.ShowUL := Not Session.FileBase.FBase.ShowUL; - 'K' : If Session.FileBase.FBase.DefScan > 1 Then Session.FileBase.FBase.DefScan := 0 Else Inc(Session.FileBase.FBase.DefScan); - 'L' : Session.FileBase.FBase.IsCDROM := Not Session.FileBase.FBase.IsCDROM; - 'M' : Session.FileBase.FBase.IsFREE := Not Session.FileBase.FBase.IsFREE; - 'N' : Session.FileBase.FBase.FtpName := Session.io.InXY(23, 16, 40, 60, 11, Session.FileBase.FBase.FtpName); - 'O' : Session.FileBase.FBase.FtpACS := Session.io.InXY(23, 17, 30, 30, 11, Session.FileBase.FBase.FtpACS); - 'Q' : Break; - End; - Until False; - Seek (Session.FileBase.FBaseFile, FilePos(Session.FileBase.FBaseFile) - 1); - Write (Session.FileBase.FBaseFile, Session.FileBase.FBase); - End; - End; + Form.Free; + Box.Free; +End; - 'M' : Begin - Session.io.OutRaw ('Move which? '); - A := strS2I(Session.io.GetInput(3, 3, 12, '')); +Procedure Configuration_FileBaseEditor; +Var + Box : TAnsiMenuBox; + List : TAnsiMenuList; + Copied : RecFileBase; + HasCopy : Boolean = False; - Session.io.OutRaw ('Move before? (1-' + strI2S(FileSize(Session.FileBase.FBaseFile) + 1) + '): '); - B := strS2I(Session.io.GetInput(3, 3, 12, '')); + Procedure MakeList; + Begin + List.Clear; - If (A > 0) and (A <= FileSize(Session.FileBase.FBaseFile)) and (B > 0) and (B <= FileSize(Session.FileBase.FBaseFile) + 1) Then Begin - Seek (Session.FileBase.FBaseFile, A - 1); - Read (Session.FileBase.FBaseFile, Session.FileBase.FBase); + FBaseFile.Reset; - AddRecord (Session.FileBase.FBaseFile, B, SizeOf(FBaseRec)); - Write (Session.FileBase.FBaseFile, Session.FileBase.FBase); + While Not FBaseFile.EOF Do Begin + FBaseFile.Read (FBase); - If A > B Then Inc(A); + List.Add(strPadR(strI2S(FBaseFile.FilePos), 5, ' ') + ' ' + strStripPipe(FBase.Name), 0); + End; - KillRecord (Session.FileBase.FBaseFile, A, SizeOf(FBaseRec)); - End; - End; - 'Q' : Break; - End; - Until False; - Close (Session.FileBase.FBaseFile); + List.Add('', 2); + End; + + Procedure InsertRecord; + Begin + FBaseFile.RecordInsert (List.Picked); + + FillChar (FBase, SizeOf(RecFileBase), 0); + + With FBase Do Begin + FileName := 'new'; + Path := Config.SystemPath + 'xfers' + PathChar + 'new' + PathChar; + Name := 'New File Base'; + FtpName := Name; + DefScan := 1; + SysopACS := 's255'; + Flags := FBShowUpload; + End; + + FBaseFile.Write(FBase); + End; + +Begin + FBaseFile := TBufFile.Create(4096); + + If Not FBaseFile.Open(Config.DataPath + 'fbases.dat', fmOpenCreate, fmReadWrite + fmDenyNone, SizeOf(RecFileBase)) Then Begin + FBaseFile.Free; + Exit; + End; + + Box := TAnsiMenuBox.Create; + List := TAnsiMenuList.Create; + + List.NoWindow := True; + List.LoChars := #13#27#47; + List.AllowTag := True; + +// If FBaseFile.FileSize = 0 Then InsertRecord; + + Box.Open (15, 5, 65, 21); + + WriteXY (17, 6, 112, '##### File Base Description'); + WriteXY (16, 7, 112, strRep(#196, 49)); + WriteXY (16, 19, 112, strRep(#196, 49)); + WriteXY (29, 20, 112, 'Press / for command list'); + + Repeat + MakeList; + + List.Open (15, 7, 65, 19); + List.Close; + + Case List.ExitCode of + '/' : Case GetCommandOption(10, 'I-Insert|D-Delete|C-Copy|P-Paste|') of + 'I' : If List.Picked > 1 Then Begin + InsertRecord; + MakeList; + End; + 'D' : If (List.Picked < List.ListMax) Then + If ShowMsgBox(1, 'Delete this entry?') Then Begin + FBaseFile.Seek (List.Picked - 1); + FBaseFile.Read (FBase); + + FBaseFile.RecordDelete (List.Picked); + + If ShowMsgBox(1, 'Delete data files?') Then Begin + FileErase (Config.DataPath + FBase.FileName + '.dir'); + FileErase (Config.DataPath + FBase.FileName + '.dat'); + FileErase (Config.DataPath + FBase.FileName + '.scn'); + End; + + MakeList; + End; + 'C' : If List.Picked <> List.ListMax Then Begin + FBaseFile.Seek (List.Picked - 1); + FBaseFile.Read (Copied); + + HasCopy := True; + End; + 'P' : If HasCopy Then Begin + FBaseFile.RecordInsert (List.Picked); + FBaseFile.Write (Copied); + + MakeList; + End; + End; + #13 : If List.Picked < List.ListMax Then Begin + FBaseFile.Seek (List.Picked - 1); + FBaseFile.Read (FBase); + + EditFileBase; + + FBaseFile.Seek (List.Picked - 1); + FBaseFile.Write (FBase); + End; + #27 : Break; + End; + Until False; + + Box.Close; + + FBaseFile.Free; + List.Free; + Box.Free; End; End. diff --git a/mystic/bbs_cfg_main.pas b/mystic/bbs_cfg_main.pas index efc6e0c..e725b2b 100644 --- a/mystic/bbs_cfg_main.pas +++ b/mystic/bbs_cfg_main.pas @@ -40,6 +40,7 @@ Begin Case Mode of 'A' : Configuration_ArchiveEditor; + 'F' : Configuration_FileBaseEditor; 'P' : Configuration_ProtocolEditor; End; @@ -122,7 +123,6 @@ Var 'B' : Message_Base_Editor; 'G', 'R' : Group_Editor; - 'F' : File_Base_Editor; 'S' : Levels_Editor; 'E' : Event_Editor; 'V' : Vote_Editor; @@ -278,6 +278,7 @@ Begin End Else Case Res of 'A' : Configuration_ArchiveEditor; + 'F' : Configuration_FileBaseEditor; 'P' : Configuration_ProtocolEditor; 'U', 'M', @@ -285,7 +286,6 @@ Begin 'B', 'G', 'R', - 'F', 'S', 'E', 'V' : ExecuteOldConfiguration(Res); diff --git a/mystic/bbs_filebase.pas b/mystic/bbs_filebase.pas index 6085f8f..d149c83 100644 --- a/mystic/bbs_filebase.pas +++ b/mystic/bbs_filebase.pas @@ -23,13 +23,13 @@ Type End; TFileBase = Class - FBaseFile : File of FBaseRec; + FBaseFile : File of RecFileBase; FDirFile : File of RecFileList; FScanFile : File of FScanRec; ProtocolFile : File of RecProtocol; FGroupFile : File of RecGroup; ArcFile : File of RecArchive; - FBase : FBaseRec; + FBase : RecFileBase; FGroup : RecGroup; FScan : FScanRec; FDir : RecFileList; @@ -355,7 +355,7 @@ End; Procedure TFileBase.SetFileScanDate; Var L : LongInt; - Old : FBaseRec; + Old : RecFileBase; Str : String; Begin Session.io.OutFull (Session.GetPrompt(255)); @@ -662,7 +662,7 @@ Begin If (FDir.Flags And FDirInvalid <> 0) And Not Session.User.Access(Config.AcsDLUnvalid) Then Exit; If (FDir.Flags And FDirFailed <> 0) And Not Session.User.Access(Config.AcsDLFailed) Then Exit; - If (FDir.Flags And FDirFree <> 0) or (Session.User.ThisUser.Flags and UserNoRatio <> 0) or (FBase.IsFREE) Then Begin + If (FDir.Flags And FDirFree <> 0) or (Session.User.ThisUser.Flags and UserNoRatio <> 0) or (FBase.Flags and FBFreeFiles <> 0) Then Begin Result := 0; Exit; End; @@ -836,7 +836,7 @@ Var End; Var - Old : FBaseRec; + Old : RecFileBase; Temp : String[11]; A : Word; N1 : Word; @@ -1042,7 +1042,7 @@ End; Procedure TFileBase.ViewFile; Var FName : String[70]; - Old : FBaseRec; + Old : RecFileBase; Begin Session.io.OutFull (Session.GetPrompt(353)); @@ -1121,7 +1121,7 @@ Procedure TFileBase.BatchAdd; Var FName : String[70]; A : Byte; - Old : FBaseRec; + Old : RecFileBase; OkSave : Boolean; Begin If BatchNum = mysMaxBatchQueue Then Begin @@ -1223,7 +1223,7 @@ Var A : Word; Total : Word; tGroup : recGroup; - tFBase : FBaseRec; + tFBase : RecFileBase; tLast : Word; Areas : Word; Data : Word; @@ -1431,7 +1431,7 @@ Procedure TFileBase.ChangeFileArea (Data: String); Var A : Word; Total : Word; - Old : FBaseRec; + Old : RecFileBase; Str : String[5]; Compress : Boolean; @@ -1730,7 +1730,7 @@ Var TopDesc := 0; End Else Begin Inc (Count, FDir.DescLines + 1); - If FBase.ShowUL Then Inc(Count); + If FBase.Flags And FBShowUpload <> 0 Then Inc(Count); End; End; @@ -1772,7 +1772,7 @@ Var Session.io.ScreenInfo[5].Y := 0; Session.io.ScreenInfo[6].Y := 0; - Session.io.OutFile ('ansiflst', True, 0); + Session.io.OutFile (FBase.Template, True, 0); PageSize := Session.io.ScreenInfo[2].Y - Session.io.ScreenInfo[1].Y + 1; @@ -1925,7 +1925,7 @@ Var End; If BotDesc > FDir.DescLines Then Begin - If FBase.ShowUL Then Begin + If FBase.Flags and FBShowUpload <> 0 Then Begin OK := ShowText(strUploader); If OK Then BotDesc := 0 @@ -2383,7 +2383,7 @@ End; Function TFileBase.IsDupeFile (FileName : String; Global : Boolean) : Boolean; Var Res : Boolean; - OLD : FBaseRec; + OLD : RecFileBase; Procedure Check_Area; Var @@ -2462,7 +2462,7 @@ Var D : DirStr; N : NameStr; E : ExtStr; - OLD : FBaseRec; + OLD : RecFileBase; Blind : Boolean; Temp : String; FullName : String; @@ -2502,7 +2502,7 @@ Begin Exit; End; - If FBase.IsCDROM Then Begin + If FBase.Flags And FBSlowMedia <> 0 Then Begin Session.io.OutFullLn (Session.GetPrompt(80)); FBase := OLD; Exit; @@ -2715,7 +2715,7 @@ Var Begin Copied := False; - If FBase.IsCDROM Then Begin + If FBase.Flags And FBSlowMedia <> 0 Then Begin Copied := True; @@ -2829,7 +2829,7 @@ Var K : LongInt; M : Integer; Dir : String[40]; - Old : FBaseRec; + Old : RecFileBase; FL : Text; Begin K := 0; @@ -2943,7 +2943,7 @@ Var End; Var - Old : FBaseRec; + Old : RecFileBase; Begin Old := FBase; Found := False; @@ -2992,7 +2992,7 @@ End; Procedure TFileBase.NewFileScan (Mode: Char); Var - TempFBase : FBaseRec; + TempFBase : RecFileBase; Found : Boolean; Done : Boolean; NewFiles : Boolean; @@ -3113,7 +3113,7 @@ Var A : Integer; B : Integer; Temp : String; - Old : FBaseRec; + Old : RecFileBase; TF : Text; Begin If FBase.FileName = '' Then Begin @@ -3206,7 +3206,8 @@ Begin Case Session.io.OneKey('123456[]DEIMQUV!', True) of '1' : Begin Temp := Session.io.InXY (4, 3, 70, 70, 11, FDir.FileName); - If Not FBase.IsCDROM Then + + If FBase.Flags And FBSlowMedia = 0 Then If (Temp <> FDir.FileName) and (Temp <> '') Then Begin If Not FileExist(FBase.Path + Temp) or (strUpper(Temp) = strUpper(FDir.FileName)) Then Begin Assign(TF, FBase.Path + FDir.FileName); @@ -3518,7 +3519,7 @@ Var End; Var - Old : FBaseRec; + Old : RecFileBase; Pos : LongInt; Begin Session.SystemLog ('Mass upload'); diff --git a/mystic/bbs_menus.pas b/mystic/bbs_menus.pas index 8c8b889..fddc71a 100644 --- a/mystic/bbs_menus.pas +++ b/mystic/bbs_menus.pas @@ -317,7 +317,7 @@ Begin End; 'A' : Configuration_ExecuteEditor('A'); 'E' : Event_Editor; - 'F' : File_Base_Editor; + 'F' : Configuration_ExecuteEditor('F'); 'G' : Group_Editor; 'L' : Levels_Editor; 'M' : Message_Base_Editor; diff --git a/mystic/bbs_msgbase.pas b/mystic/bbs_msgbase.pas index dbf519e..4ca115f 100644 --- a/mystic/bbs_msgbase.pas +++ b/mystic/bbs_msgbase.pas @@ -769,13 +769,13 @@ End; Procedure TMsgBase.ReplyMessage (Email: Boolean; ListMode : Byte; ReplyID : String); Var - ToWho : String[30]; {to field} - Subj : String[60]; {subject field} - Addr : RecEchomailAddr; {netmail to addr} + ToWho : String[30]; + Subj : String[60]; + Addr : RecEchomailAddr; MsgNew : PMsgBaseABS; - Temp1 : String; {quote text} - Temp2 : String[2]; {Initials} - Temp3 : String[80]; {Text} + Temp1 : String; + Temp2 : String[2]; + Temp3 : String[80]; tFile : Text; Lines : SmallInt; Begin @@ -1019,11 +1019,11 @@ End; Procedure TMsgBase.MessageUpload (Var CurLine: SmallInt); Var - FN : String[100]; {was string} - TF : Text; - T1 : String[30]; { Saved TO: } - T2 : String[60]; { Saved SUBJ: } - OK : Boolean; + FN : String[100]; + TF : Text; + T1 : String[30]; + T2 : String[60]; + OK : Boolean; Begin OK := False; @@ -1500,6 +1500,7 @@ Var 'D' : Begin If Session.io.GetYN(Session.GetPrompt(402), True) Then Begin MsgBase^.DeleteMsg; + If Not SeekNextMsg(False, False) Then Begin Ansi_View_Message := True; Exit; @@ -1529,7 +1530,9 @@ Var Session.io.PromptInfo[2] := strI2S(MsgBase^.GetHighMsgNum); Session.io.OutFull (Session.GetPrompt(403)); + A := strS2I(Session.io.GetInput(9, 9, 12, '')); + If (A > 0) and (A <= MsgBase^.GetHighMsgNum) Then Begin MsgBase^.SeekFirst(A); If Not SeekNextMsg(True, False) Then Begin @@ -1546,6 +1549,7 @@ Var Ansi_View_Message := True; Exit; End; + Break; End; #13 : If (Lines > PageSize) and (PageEnd <= Lines) Then Begin @@ -1578,21 +1582,26 @@ Var #27, 'Q' : Begin GetMessageScan; + If MScan.NewScan = 2 Then Session.io.OutFullLn(Session.GetPrompt(406)) Else Begin ReadRes := False; Ansi_View_Message := True; + Exit; End; End; 'R' : Begin ReplyMessage (Mode = 'E', ListMode, ReplyID); + Break; End; 'T' : Begin Session.io.PromptInfo[1] := MBase.Name; + GetMessageScan; + Case MScan.NewScan of 0 : Begin MScan.NewScan := 1; @@ -1606,20 +1615,24 @@ Var End; SetMessageScan; + Break; End; 'X' : Begin Export_Message; + Break; End; '[' : If MsgBase^.GetRefer > 0 Then Begin MsgBase^.SeekFirst(MsgBase^.GetRefer); MsgBase^.MsgStartUp; + Break; End; ']' : If MsgBase^.GetSeeAlso > 0 Then Begin MsgBase^.SeekFirst(MsgBase^.GetSeeAlso); MsgBase^.MsgStartUp; + Break; End; '?' : Begin @@ -1671,6 +1684,7 @@ Var Session.io.PromptInfo[2] := Subj; Session.io.PromptInfo[3] := MsgFrom; Session.io.PromptInfo[4] := MsgTo; + If NewMsgs Then Session.io.PromptInfo[5] := Session.Lang.NewMsgChar Else @@ -1711,17 +1725,16 @@ Var CurPage := 0; End; -{ add scanning prompt here } -(* -if (scanmode=3) then begin - Session.io.AnsiGotoXY(32, 11); - Session.io.OutFull ('|08.---------------.'); - Session.io.AnsiGotoXY(32, 12); - Session.io.OutFull ('| |07searching ... |08|'); - Session.io.AnsiGotoXY(32, 13); - Session.io.OutFull ('`---------------'''); -end; -*) + // add scanning prompt here + //if (scanmode=3) then begin + // Session.io.AnsiGotoXY(32, 11); + // Session.io.OutFull ('|08.---------------.'); + // Session.io.AnsiGotoXY(32, 12); + // Session.io.OutFull ('| |07searching ... |08|'); + // Session.io.AnsiGotoXY(32, 13); + // Session.io.OutFull ('`---------------'''); + //end; + PageTotal := 0; Read_Page := True; @@ -1976,9 +1989,9 @@ end; End; Var - Str : String; - A : LongInt; - B : LongInt; + Str : String; + A : LongInt; + B : LongInt; Begin If SeekNextMsg(True, False) Then Repeat diff --git a/mystic/bbs_sysopchat.pas b/mystic/bbs_sysopchat.pas index 02c7976..aba0d09 100644 --- a/mystic/bbs_sysopchat.pas +++ b/mystic/bbs_sysopchat.pas @@ -21,7 +21,7 @@ Var Procedure Split_Chat; Var - Update : LongInt = 0; + Update : LongInt = 0; LastUser : Boolean; UserStr : String; SysopStr : String; @@ -32,7 +32,7 @@ Var UserY : Byte; SysopX, SysopY : Byte; - X, Y, A : Byte; + X, Y, A : Byte; Procedure Total_ReDraw; Begin @@ -52,7 +52,7 @@ Begin SysopStr := ''; Session.io.AnsiGotoXY (SysopX, SysopY); - Session.io.AnsiColor (Session.io.ScreenInfo[5].A); + Session.io.AnsiColor (Session.io.ScreenInfo[5].A); LastUser := False; End; @@ -61,39 +61,43 @@ Begin Total_ReDraw; Repeat - If Update <> TimerMinutes Then Begin + If Update <> TimerMinutes Then Begin X := Screen.CursorX; Y := Screen.CursorY; - A := Screen.TextAttr; + A := Screen.TextAttr; If Session.io.ScreenInfo[9].X <> 0 Then Begin Session.io.AnsiGotoXY (Session.io.ScreenInfo[9].X, Session.io.ScreenInfo[9].Y); - Session.io.AnsiColor (Session.io.ScreenInfo[9].A); + Session.io.AnsiColor (Session.io.ScreenInfo[9].A); + Session.io.OutFull ('|$L04|TL'); - End; + End; If Session.io.ScreenInfo[0].X <> 0 Then Begin Session.io.AnsiGotoXY (Session.io.ScreenInfo[0].X, Session.io.ScreenInfo[0].Y); - Session.io.AnsiColor (Session.io.ScreenInfo[0].A); + Session.io.AnsiColor (Session.io.ScreenInfo[0].A); + Session.io.OutFull ('|TI'); - End; + End; Session.io.AnsiGotoXY (X, Y); - Session.io.AnsiColor(A); + Session.io.AnsiColor (A); - Update := TimerMinutes; - End; + Update := TimerMinutes; + End; Ch := Session.io.GetKey; If Not Session.io.LocalInput and Not LastUser Then Begin - Session.io.AnsiGotoXY (UserX, UserY); - Session.io.AnsiColor (Session.io.ScreenInfo[1].A); + Session.io.AnsiGotoXY (UserX, UserY); + Session.io.AnsiColor (Session.io.ScreenInfo[1].A); + LastUser := True; End Else If Session.io.LocalInput and LastUser Then Begin - Session.io.AnsiGotoXY (SysopX, SysopY); - Session.io.AnsiColor (Session.io.ScreenInfo[5].A); + Session.io.AnsiGotoXY (SysopX, SysopY); + Session.io.AnsiColor (Session.io.ScreenInfo[5].A); + LastUser := False; End; @@ -103,12 +107,14 @@ Begin #08 : If Session.io.LocalInput Then Begin If SysopX > Session.io.ScreenInfo[7].X Then Begin Session.io.OutBS (1, True); + Dec (SysopX); Dec (SysopStr[0]); End; End Else Begin If UserX > Session.io.ScreenInfo[3].X Then Begin Session.io.OutBS (1, True); + Dec (UserX); Dec (UserStr[0]); End; @@ -225,22 +231,22 @@ Begin Session.io.OutBS(1, True); Dec(Str1[0]); End; - Else - Str1 := Str1 + Ch; + Else + Str1 := Str1 + Ch; - Session.io.BufAddChar(Ch); + Session.io.BufAddChar(Ch); - If Length(Str1) > 78 Then Begin - strWrap (Str1, Str2, 78); - Session.io.OutBS(Length(Str2), True); - Session.io.OutRawLn (''); - Session.io.OutRaw (Str2); + If Length(Str1) > 78 Then Begin + strWrap (Str1, Str2, 78); + Session.io.OutBS(Length(Str2), True); + Session.io.OutRawLn (''); + Session.io.OutRaw (Str2); - If Config.ChatLogging Then WriteLn (tFile, Str1); + If Config.ChatLogging Then WriteLn (tFile, Str1); - Str1 := Str2; - End; + Str1 := Str2; End; + End; Until False; Session.io.OutFull (Session.GetPrompt(27)); @@ -256,23 +262,24 @@ Begin UpdateStatusLine (0, '(ESC) to Quit, (Ctrl-R) to Redraw'); - If Config.ChatLogging Then Begin - Assign (tFile, Config.LogsPath + 'chat.log'); - {$I-} Append (tFile); {$I+} - If IoResult <> 0 Then ReWrite (tFile); + If Config.ChatLogging Then Begin + Assign (tFile, Config.LogsPath + 'chat.log'); + {$I-} Append (tFile); {$I+} - WriteLn (tFile, ''); - WriteLn (tFile, 'Chat recorded ' + DateDos2Str(CurDateDos, 1) + ' ' + TimeDos2Str(CurDateDos, True) + + If IoResult <> 0 Then ReWrite (tFile); + + WriteLn (tFile, ''); + WriteLn (tFile, 'Chat recorded ' + DateDos2Str(CurDateDos, 1) + ' ' + TimeDos2Str(CurDateDos, True) + ' with ' + Session.User.ThisUser.Handle); WriteLn (tFile, strRep('-', 70)); - End; + End; - If ((Split) And (Session.io.Graphics > 0)) Then Split_Chat Else Line_Chat; + If ((Split) And (Session.io.Graphics > 0)) Then Split_Chat Else Line_Chat; - If Config.ChatLogging Then Begin + If Config.ChatLogging Then Begin WriteLn (tFile, strRep('-', 70)); - Close (tFile); - End; + Close (tFile); + End; Session.User.InChat := False; Session.TimeOut := TimerSeconds; diff --git a/mystic/mis_client_http.pas b/mystic/mis_client_http.pas index 29bea86..1f67837 100644 --- a/mystic/mis_client_http.pas +++ b/mystic/mis_client_http.pas @@ -109,6 +109,7 @@ Var Str : String; Begin ResetSession; + Client.WriteLine(re_Greeting); Repeat diff --git a/mystic/mpl_execute.pas b/mystic/mpl_execute.pas index 310f87d..3e42e9a 100644 --- a/mystic/mpl_execute.pas +++ b/mystic/mpl_execute.pas @@ -90,7 +90,7 @@ Type Function GetMBaseRecord (Num: LongInt) : Boolean; Procedure GetMGroupVars (Var G: RecGroup); Function GetMGroupRecord (Num: LongInt) : Boolean; - Procedure GetFBaseVars (Var F: FBaseRec); + Procedure GetFBaseVars (Var F: RecFileBase); Function GetFBaseRecord (Num: LongInt) : Boolean; Procedure GetFGroupVars (Var G: RecGroup); Function GetFGroupRecord (Num: LongInt) : Boolean; @@ -203,7 +203,7 @@ Begin Close (F); End; -Procedure TInterpEngine.GetFBaseVars (Var F: FBaseRec); +Procedure TInterpEngine.GetFBaseVars (Var F: RecFileBase); Begin Move (F.Name, VarData[IdxVarFBase ]^.Data^, SizeOf(F.Name)); Move (F.ListACS, VarData[IdxVarFBase + 1 ]^.Data^, SizeOf(F.ListACS)); @@ -212,12 +212,12 @@ End; Function TInterpEngine.GetFBaseRecord (Num: LongInt) : Boolean; Var F : File; - FB : FBaseRec; + FB : RecFileBase; Begin Result := False; Assign (F, Config.DataPath + 'fbases.dat'); - If Not ioReset(F, SizeOf(FBaseRec), fmRWDN) Then Exit; + If Not ioReset(F, SizeOf(RecFileBase), fmRWDN) Then Exit; If ioSeek(F, Pred(Num)) And (ioRead(F, FB)) Then Begin GetFBaseVars(FB); diff --git a/mystic/mystic.pas b/mystic/mystic.pas index d13905e..53db541 100644 --- a/mystic/mystic.pas +++ b/mystic/mystic.pas @@ -344,6 +344,7 @@ Begin {$I-} Reset (Session.User.SecurityFile); {$I+} If IoResult <> 0 Then Begin ReWrite(Session.User.SecurityFile); + For Count := 1 to 255 Do Write (Session.User.SecurityFile, Session.User.Security); End; diff --git a/mystic/records.pas b/mystic/records.pas index b10ce4d..c721efe 100644 --- a/mystic/records.pas +++ b/mystic/records.pas @@ -244,17 +244,15 @@ Type End; Const - UserLockedOut = $01; - UserNoRatio = $02; - UserDeleted = $04; - UserNoKill = $08; - UserNoCaller = $10; - UserNoPWChange = $20; + UserLockedOut = $00000001; + UserNoRatio = $00000002; + UserDeleted = $00000004; + UserNoKill = $00000008; + UserNoCaller = $00000010; + UserNoPWChange = $00000020; //FUTURE DATA FILE UPDATES NEEDED //LASTON needs optional1-10 compare to Mystic2 -//FBASE -// ACS to comment on file //MBASES // expand header filename[20] // add template[20] @@ -282,13 +280,11 @@ Const // compare to mystic 2 for fallback stuff? // rename to THEME // horizontal/vertical percent bars -// default prot into users -// default prot into new user options Type RecUser = Record { USERS.DAT } PermIdx : LongInt; // permanent user number - Flags : Byte; { User Flags } + Flags : LongInt; { User Flags } Handle : String[30]; { Handle } RealName : String[30]; { Real Name } Password : String[15]; { Password } @@ -351,7 +347,7 @@ Type UseFullChat : Boolean; { use full screen teleconference } Credits : LongInt; Protocol : Char; - Reserved : Array[1..392] of Byte; + Reserved : Array[1..389] of Byte; End; EventRec = Record { EVENTS.DAT } @@ -445,25 +441,29 @@ Type LastNew : LongInt; { Last file scan (packed datetime)} End; - FBaseRec = Record { FBASES.DAT } - Name : String[40]; { File base name } - FtpName : String[60]; { FTP directory name } - Filename : String[40]; { File name } - DispFile : String[20]; { Pre-list display file name } - Template : String[20]; { ansi file list template } - ListACS, { ACS required to see this base } - FtpACS, { ACS to see in FTP directory } - SysopACS, { ACS required for SysOp functions} - ULACS, { ACS required to upload files } - DLACS : String[mysMaxAcsSize]; { ACS required to download files } - Path : String[120]; { Path where files are stored } - Password : String[20]; { Password to access this base } - DefScan : Byte; { Default New Scan Setting } - ShowUL : Boolean; - IsCDROM : Boolean; - IsFREE : Boolean; +Const + FBShowUpload = $00000001; + FBSlowMedia = $00000002; + FBFreeFiles = $00000004; + +Type + RecFileBase = Record + Name : String[40]; + FtpName : String[60]; + FileName : String[40]; + DispFile : String[20]; + Template : String[20]; + ListACS : String[30]; + FtpACS : String[30]; + DLACS : String[30]; + ULACS : String[30]; + CommentACS : String[30]; + SysOpACS : String[30]; + Path : String[120]; + Password : String[20]; + DefScan : Byte; + Flags : LongInt; End; - // make flags and merge in shouul, iscdrom,isfree, etc (* The file directory listing are stored as .DIR in *) (* the data directory. Each record stores the info on one file. File *)