lots of changes and too lazy to comment on each one lol

This commit is contained in:
mysticbbs 2013-02-27 04:42:36 -05:00
parent bd48629e61
commit c9f41a3fc5
14 changed files with 412 additions and 202 deletions

View File

@ -12,11 +12,72 @@ Uses
m_DateTime, m_DateTime,
m_Strings, m_Strings,
m_FileIO, m_FileIO,
m_QuickSort,
bbs_Ansi_MenuBox, bbs_Ansi_MenuBox,
bbs_Ansi_MenuForm, bbs_Ansi_MenuForm,
bbs_Common, bbs_Common,
bbs_cfg_Common; bbs_cfg_Common;
Type
RecFileBaseFile = File of RecFileBase;
Procedure SortFileBases (Var List: TAnsiMenuList; Var FBaseFile: RecFileBaseFile);
Var
TempBase : RecFileBase;
TempFile : File of RecFileBase;
Sort : TQuickSort;
SortFirst : Word;
SortLast : Word;
Count : Word;
Begin
If Not GetSortRange(List, SortFirst, SortLast) Then Exit;
ShowMsgBox (3, ' Sorting... ');
Sort := TQuickSort.Create;
For Count := SortFirst to SortLast Do Begin
Seek (FBaseFile, Count - 1);
Read (FBaseFile, TempBase);
Sort.Add (strUpper(strStripPipe(TempBase.Name)), Count - 1);
End;
Sort.Sort (1, Sort.Total, qAscending);
Close (FBaseFile);
ReName (FBaseFile, Config.DataPath + 'fbases.sortbak');
Assign (TempFile, Config.DataPath + 'fbases.sortbak');
Reset (TempFile);
Assign (FBaseFile, Config.DataPath + 'fbases.dat');
ReWrite (FBaseFile);
While FilePos(TempFile) < SortFirst - 1 Do Begin
Read (TempFile, TempBase);
Write (FBaseFile, TempBase);
End;
For Count := 1 to Sort.Total Do Begin
Seek (TempFile, Sort.Data[Count]^.Ptr);
Read (TempFile, TempBase);
Write (FBaseFile, TempBase);
End;
Seek (TempFile, SortLast);
While Not Eof(TempFile) Do Begin
Read (TempFile, TempBase);
Write (FBaseFile, TempBase);
End;
Close (TempFile);
Erase (TempFile);
Sort.Free;
End;
Procedure EditFileBase (Var FBase: RecFileBase); Procedure EditFileBase (Var FBase: RecFileBase);
Var Var
Box : TAnsiMenuBox; Box : TAnsiMenuBox;
@ -164,7 +225,7 @@ Begin
List.Close; List.Close;
Case List.ExitCode of Case List.ExitCode of
'/' : Case GetCommandOption(10, 'I-Insert|D-Delete|C-Copy|P-Paste|') of '/' : Case GetCommandOption(10, 'I-Insert|D-Delete|C-Copy|P-Paste|S-Sort|') of
'I' : Begin 'I' : Begin
InsertRecord; InsertRecord;
MakeList; MakeList;
@ -200,6 +261,7 @@ Begin
MakeList; MakeList;
End; End;
'S' : SortFileBases (List, FBaseFile);
End; End;
#13 : If List.Picked < List.ListMax Then Begin #13 : If List.Picked < List.ListMax Then Begin
Seek (FBaseFile, List.Picked - 1); Seek (FBaseFile, List.Picked - 1);

View File

@ -255,7 +255,7 @@ Begin
End; End;
End; End;
3 : Begin 3 : Begin
BoxOpen (38, 4, 64, 18); BoxOpen (38, 4, 64, 17);
CoolBoxOpen (39, 'Editors'); CoolBoxOpen (39, 'Editors');
Form.AddNone ('U', ' U User Editor', 39, 5, 39, 5, 25, ''); Form.AddNone ('U', ' U User Editor', 39, 5, 39, 5, 25, '');
@ -270,7 +270,7 @@ Begin
Form.AddNone ('P', ' P Protocol Editor', 39, 14, 39, 14, 25, ''); Form.AddNone ('P', ' P Protocol Editor', 39, 14, 39, 14, 25, '');
Form.AddNone ('E', ' E Event Editor', 39, 15, 39, 15, 25, ''); Form.AddNone ('E', ' E Event Editor', 39, 15, 39, 15, 25, '');
Form.AddNone ('V', ' V Voting Editor', 39, 16, 39, 16, 25, ''); Form.AddNone ('V', ' V Voting Editor', 39, 16, 39, 16, 25, '');
Form.AddNone ('L', ' L BBS List Editor', 39, 17, 39, 17, 25, ''); // Form.AddNone ('L', ' L BBS List Editor', 39, 17, 39, 17, 25, '');
Res := Form.Execute; Res := Form.Execute;
MenuPos[3] := Form.ItemPos; MenuPos[3] := Form.ItemPos;

View File

@ -496,7 +496,7 @@ Begin
Form.Free; Form.Free;
End; End;
Procedure EditMenu; Procedure EditMenu (Var Theme: RecTheme);
Var Var
Box : TAnsiMenuBox; Box : TAnsiMenuBox;
List : TAnsiMenuList; List : TAnsiMenuList;
@ -506,7 +506,7 @@ Var
Begin Begin
Menu := TMenuData.Create; Menu := TMenuData.Create;
Menu.Load (False, Session.Theme.MenuPath + MenuName + '.mnu'); Menu.Load (False, Theme.MenuPath + MenuName + '.mnu');
Box := TAnsiMenuBox.Create; Box := TAnsiMenuBox.Create;
List := TAnsiMenuList.Create; List := TAnsiMenuList.Create;
@ -576,13 +576,13 @@ Begin
If Changed Then If Changed Then
If ShowMsgBox(1, 'Save changes to ' + MenuName + '?') Then If ShowMsgBox(1, 'Save changes to ' + MenuName + '?') Then
If Not Menu.Save(Session.Theme.MenuPath + MenuName + '.mnu') Then If Not Menu.Save(Theme.MenuPath + MenuName + '.mnu') Then
ShowMsgBox(0, 'Unable to save menu'); ShowMsgBox(0, 'Unable to save menu');
Menu.Free; Menu.Free;
End; End;
Function GetMenuName (OldName: String) : String; Function GetMenuName (Var Theme: RecTheme; OldName: String) : String;
Var Var
Box : TAnsiMenuBox; Box : TAnsiMenuBox;
List : TAnsiMenuList; List : TAnsiMenuList;
@ -597,7 +597,7 @@ Var
Begin Begin
Sort := TQuickSort.Create; Sort := TQuickSort.Create;
FindFirst (Session.Theme.MenuPath + '*.mnu', Archive, Dir); FindFirst (Theme.MenuPath + '*.mnu', Archive, Dir);
While DosError = 0 Do Begin While DosError = 0 Do Begin
Sort.Add(JustFileName(Dir.Name), 0); Sort.Add(JustFileName(Dir.Name), 0);
@ -611,7 +611,7 @@ Var
List.Clear; List.Clear;
For Count := 1 to Sort.Total Do Begin For Count := 1 to Sort.Total Do Begin
Assign (MF, Session.Theme.MenuPath + Sort.Data[Count]^.Name + '.mnu'); Assign (MF, Theme.MenuPath + Sort.Data[Count]^.Name + '.mnu');
{$I-} Reset (MF); {$I+} {$I-} Reset (MF); {$I+}
@ -638,13 +638,13 @@ Var
If Str = '' Then Exit; If Str = '' Then Exit;
Str := Session.Theme.MenuPath + Str + '.mnu'; Str := Theme.MenuPath + Str + '.mnu';
If FileExist(Str) Then If FileExist(Str) Then
If ShowMsgBox(1, JustFile(Str) + ' already exists. Overwrite?') Then If ShowMsgBox(1, JustFile(Str) + ' already exists. Overwrite?') Then
FileErase(Str); FileErase(Str);
FileCopy(Session.Theme.MenuPath + Orig + '.mnu', Str); FileCopy(Theme.MenuPath + Orig + '.mnu', Str);
End; End;
Procedure InsertMenu; Procedure InsertMenu;
@ -656,7 +656,7 @@ Var
If Str = '' Then Exit; If Str = '' Then Exit;
OK := Not FileExist(Session.Theme.MenuPath + Str + '.mnu'); OK := Not FileExist(Theme.MenuPath + Str + '.mnu');
If Not OK Then If Not OK Then
OK := ShowMsgBox(1, Str + ' already exists. Overwrite?'); OK := ShowMsgBox(1, Str + ' already exists. Overwrite?');
@ -664,7 +664,7 @@ Var
If OK Then Begin If OK Then Begin
Menu := TMenuData.Create; Menu := TMenuData.Create;
Menu.CreateNewMenu(Session.Theme.MenuPath + Str + '.mnu'); Menu.CreateNewMenu(Theme.MenuPath + Str + '.mnu');
Menu.Free; Menu.Free;
End; End;
@ -679,7 +679,7 @@ Begin
List.NoWindow := True; List.NoWindow := True;
List.LoChars := #13#27#47; List.LoChars := #13#27#47;
List.SearchY := 21; List.SearchY := 21;
Box.Header := ' Menu Editor (' + Session.Theme.Desc + ') '; Box.Header := ' Menu Editor (' + Theme.Desc + ') ';
Box.Open (12, 5, 68, 21); Box.Open (12, 5, 68, 21);
@ -702,7 +702,7 @@ Begin
'I' : InsertMenu; 'I' : InsertMenu;
'D' : If List.ListMax > 0 Then 'D' : If List.ListMax > 0 Then
If ShowMsgBox(1, 'Delete menu: ' + strWordGet(1, List.List[List.Picked]^.Name, ' ')) Then If ShowMsgBox(1, 'Delete menu: ' + strWordGet(1, List.List[List.Picked]^.Name, ' ')) Then
FileErase (Session.Theme.MenuPath + strWordGet(1, List.List[List.Picked]^.Name, ' ') + '.mnu'); FileErase (Theme.MenuPath + strWordGet(1, List.List[List.Picked]^.Name, ' ') + '.mnu');
End; End;
#13 : Begin #13 : Begin
If List.ListMax <> 0 Then If List.ListMax <> 0 Then
@ -722,19 +722,36 @@ End;
Procedure Configuration_MenuEditor; Procedure Configuration_MenuEditor;
Var Var
Saved : String; Saved : String;
Theme : RecTheme;
Found : Boolean;
Begin Begin
Saved := ''; Saved := '';
MenuName := Configuration_ThemeEditor(True); MenuName := Configuration_ThemeEditor(True);
If MenuName = '' Then Exit; If MenuName = '' Then Exit;
Reset (Session.ThemeFile);
While Not Eof(Session.ThemeFile) Do Begin
Read (Session.ThemeFile, Theme);
If strUpper(Theme.FileName) = strUpper(MenuName) Then Begin
Found := True;
Break;
End;
End;
Close (Session.ThemeFile);
If Not Found Then Exit;
Repeat Repeat
MenuName := GetMenuName(Saved); MenuName := GetMenuName(Theme, Saved);
Saved := MenuName; Saved := MenuName;
If MenuName = '' Then Exit; If MenuName = '' Then Exit;
EditMenu; EditMenu(Theme);
Until False; Until False;
End; End;

View File

@ -131,7 +131,7 @@ Var
CurLine : Byte = 1; CurLine : Byte = 1;
CurPageLines : Byte; CurPageLines : Byte;
TotalPrompt : Integer; TotalPrompt : Integer;
SearchMask : String; SearchMask : String = '';
CopyStr : String = ''; CopyStr : String = '';
Procedure DisposeStringData; Procedure DisposeStringData;

View File

@ -928,6 +928,47 @@ Begin
BufAddStr (#27 + '[K'); BufAddStr (#27 + '[K');
End; End;
Function TBBSIO.Pipe2Ansi (Color: Byte) : String;
Begin
Result := '';
If Graphics = 0 Then Exit;
Case Color of
00: Result := #27 + '[0;30m';
01: Result := #27 + '[0;34m';
02: Result := #27 + '[0;32m';
03: Result := #27 + '[0;36m';
04: Result := #27 + '[0;31m';
05: Result := #27 + '[0;35m';
06: Result := #27 + '[0;33m';
07: Result := #27 + '[0;37m';
08: Result := #27 + '[1;30m';
09: Result := #27 + '[1;34m';
10: Result := #27 + '[1;32m';
11: Result := #27 + '[1;36m';
12: Result := #27 + '[1;31m';
13: Result := #27 + '[1;35m';
14: Result := #27 + '[1;33m';
15: Result := #27 + '[1;37m';
End;
If Color in [00..07] Then
Color := (Screen.TextAttr SHR 4) and 7 + 16;
Case Color of
16: Result := Result + #27 + '[40m';
17: Result := Result + #27 + '[44m';
18: Result := Result + #27 + '[42m';
19: Result := Result + #27 + '[46m';
20: Result := Result + #27 + '[41m';
21: Result := Result + #27 + '[45m';
22: Result := Result + #27 + '[43m';
23: Result := Result + #27 + '[47m';
End;
End;
(*
Function TBBSIO.Pipe2Ansi (Color: Byte) : String; Function TBBSIO.Pipe2Ansi (Color: Byte) : String;
Var Var
CurFG : Byte; CurFG : Byte;
@ -992,6 +1033,7 @@ Begin
End; End;
End; End;
End; End;
*)
Function TBBSIO.Attr2Ansi (Attr: Byte) : String; Function TBBSIO.Attr2Ansi (Attr: Byte) : String;
Begin Begin

View File

@ -5,9 +5,8 @@ Unit BBS_MenuData;
Interface Interface
Uses Uses
m_Strings; m_Strings,
BBS_Common;
{$I RECORDS.PAS}
Type Type
TMenuData = Class TMenuData = Class

View File

@ -37,8 +37,10 @@ Type
Procedure AppendMessageText (Var Msg: PMsgBaseABS; Lines: Integer; ReplyID: String); Procedure AppendMessageText (Var Msg: PMsgBaseABS; Lines: Integer; ReplyID: String);
Procedure AssignMessageData (Var Msg: PMsgBaseABS); Procedure AssignMessageData (Var Msg: PMsgBaseABS);
Function GetBaseByNum (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function GetBaseByNum (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Function GetBaseCompressed (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Function GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Procedure GetMessageStats (Var TempBase: RecMessageBase; Var Total, New, Yours: LongInt); Procedure GetMessageStats (Var TempBase: RecMessageBase; Var Total, New, Yours: LongInt);
Function GetTotalBases (Compressed: Boolean) : LongInt;
Function GetTotalMessages (Var TempBase: RecMessageBase) : LongInt; Function GetTotalMessages (Var TempBase: RecMessageBase) : LongInt;
Procedure PostTextFile (Data: String; AllowCodes: Boolean); Procedure PostTextFile (Data: String; AllowCodes: Boolean);
Function SaveMessage (mArea: RecMessageBase; mFrom, mTo, mSubj: String; mAddr: RecEchoMailAddr; mLines: Integer) : Boolean; Function SaveMessage (mArea: RecMessageBase; mFrom, mTo, mSubj: String; mAddr: RecEchoMailAddr; mLines: Integer) : Boolean;
@ -172,6 +174,35 @@ Begin
Close (F); Close (F);
End; End;
Function TMsgBase.GetBaseCompressed (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Var
F : File;
Count : LongInt;
Begin
If Not Config.MCompress Then Begin
Result := GetBaseByNum(Num, TempBase);
Exit;
End;
Result := False;
Assign (F, Config.DataPath + 'mbases.dat');
If Not ioReset(F, SizeOf(RecMessageBase), fmRWDN) Then Exit;
Count := 0;
While Not Eof(F) And (Count <> Num) Do Begin
ioRead (F, TempBase);
If Session.User.Access(TempBase.ListACS) Then Inc(Count);
End;
Close (F);
Result := Count = Num;
End;
Function TMsgBase.GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean; Function TMsgBase.GetBaseByIndex (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
Var Var
F : File; F : File;
@ -194,6 +225,31 @@ Begin
Close (F); Close (F);
End; End;
Function TMsgBase.GetTotalBases (Compressed: Boolean) : LongInt;
Var
F : File;
TempBase : RecMessageBase;
Begin
Result := 0;
Assign (F, Config.DataPath + 'mbases.dat');
If Not ioReset(F, SizeOf(RecMessageBase), fmRWDN) Then Exit;
If Not Compressed Then
Result := FileSize(F)
Else Begin
While Not Eof(F) Do Begin
ioRead (F, TempBase);
If Session.User.Access(TempBase.ListACS) Then
Inc (Result);
End;
End;
Close (F);
End;
Function TMsgBase.GetTotalMessages (Var TempBase: RecMessageBase) : LongInt; Function TMsgBase.GetTotalMessages (Var TempBase: RecMessageBase) : LongInt;
Var Var
TempMsg : PMsgBaseABS; TempMsg : PMsgBaseABS;
@ -387,21 +443,10 @@ Procedure TMsgBase.ChangeArea (Data: String);
Var Var
Count : LongInt; Count : LongInt;
Total : Word; Total : Word;
Old : RecMessageBase; TempBase : RecMessageBase;
Compress : Boolean;
Begin Begin
Compress := Config.MCompress;
Old := MBase;
{$IFDEF LOGGING}
Session.SystemLog('MsgAreaChange: ' + Data);
Session.SystemLog(' CurArea: ' + strI2S(Session.User.ThisUser.LastMBase));
{$ENDIF}
If (Data = '+') or (Data = '-') Then Begin If (Data = '+') or (Data = '-') Then Begin
Reset (MBaseFile); Count := Session.User.ThisUser.LastMBase;
Count := Session.User.ThisUser.LastMBase - 1;
Repeat Repeat
Case Data[1] of Case Data[1] of
@ -409,72 +454,47 @@ Begin
'-' : Dec(Count); '-' : Dec(Count);
End; End;
{$I-} If Not GetBaseByNum(Count, TempBase) Then Exit;
Seek (MBaseFile, Count);
Read (MBaseFile, MBase);
{$I+}
If IoResult <> 0 Then Break; If Session.User.Access(TempBase.ListACS) Then Begin
Session.User.ThisUser.LastMBase := Count;
MBase := TempBase;
If Session.User.Access(MBase.ListACS) Then Begin
Session.User.ThisUser.LastMBase := FilePos(MBaseFile);
Close (MBaseFile);
Exit; Exit;
End; End;
Until False; Until False;
Close (MBaseFile);
MBase := Old;
Exit;
End; End;
Count := strS2I(Data); Count := strS2I(Data);
{$IFDEF LOGGING}
Session.SystemLog('Numeric change converstion: ' + strI2S(Count));
{$ENDIF}
If Count > 0 Then Begin If Count > 0 Then Begin
Inc (Count); If GetBaseByNum (Count, TempBase) Then
If Session.User.Access(TempBase.ListACS) Then Begin
Reset (MBaseFile); Session.User.ThisUser.LastMBase := Count;
MBase := TempBase;
If Count <= FileSize(MBaseFile) Then Begin
Seek (MBaseFile, Count - 1);
Read (MBaseFile, MBase);
If Session.User.Access(MBase.ListACS) Then Begin
Session.User.ThisUser.LastMBase := FilePos(MBaseFile)
End Else
MBase := Old;
End; End;
Close (MBaseFile);
Exit; Exit;
End; End;
If Pos('NOLIST', strUpper(Data)) > 0 Then Begin If Pos('NOLIST', strUpper(Data)) > 0 Then
Reset (MBaseFile); Total := GetTotalBases(Config.MCompress)
Total := FileSize(MBaseFile); Else
Close (MBaseFile); Total := ListAreas(Config.MCompress);
End Else
Total := ListAreas(Compress);
If Total = 0 Then Begin If Total = 0 Then Begin
Session.io.OutFullLn (Session.GetPrompt(94)); Session.io.OutFullLn (Session.GetPrompt(94));
MBase := Old;
End Else Begin Exit;
End;
Repeat Repeat
Session.io.OutFull (Session.GetPrompt(102)); Session.io.OutFull (Session.GetPrompt(102));
Case Session.io.OneKeyRange(#13 + '?Q', 1, Total) of Case Session.io.OneKeyRange(#13 + '?Q', 1, Total) of
'?': Begin #13,
Compress := Config.MCompress; 'Q': Exit;
Total := ListAreas(Compress); '?': Total := ListAreas(Config.MCompress);
End;
Else Else
Break; Break;
End; End;
@ -482,38 +502,10 @@ Begin
Count := Session.io.RangeValue; Count := Session.io.RangeValue;
If (Count > 0) and (Count <= Total) Then Begin If GetBaseCompressed(Count, TempBase) Then
Reset (MBaseFile); If Session.User.Access(MBase.ListACS) Then Begin
MBase := TempBase;
If Not Compress Then Begin Session.User.ThisUser.LastMBase := Count;
Seek (MBaseFile, Count - 1);
Read (MBaseFile, MBase);
If Not Session.User.Access(MBase.ListACS) Then Begin
MBase := Old;
Close (MBaseFile);
Exit;
End;
End Else Begin
Total := 0;
While Not Eof(MBaseFile) And (Count <> Total) Do Begin
Read (MBaseFile, MBase);
If Session.User.Access(MBase.ListACS) Then Inc(Total);
End;
If Count <> Total Then Begin
Close (MBaseFile);
MBase := OLD;
Exit;
End;
End;
Session.User.ThisUser.LastMBase := FilePos(MBaseFile);
Close (MBaseFile);
End Else
MBase := Old;
End; End;
End; End;
@ -837,17 +829,22 @@ End;
Function TMsgBase.ListAreas (Compress: Boolean) : Integer; Function TMsgBase.ListAreas (Compress: Boolean) : Integer;
Var Var
Total : Word = 0; Total : LongInt = 0;
Listed : Word = 0; Listed : LongInt = 0;
TempBase : RecMessageBase; TempBase : RecMessageBase;
TempFile : File;
Begin Begin
Reset (MBaseFile); Result := 1;
Assign (TempFile, Config.DataPath + 'mbases.dat');
If Not ioReset(TempFile, SizeOf(RecMessageBase), fmRWDN) Then Exit;
Session.io.PausePtr := 1; Session.io.PausePtr := 1;
Session.io.AllowPause := True; Session.io.AllowPause := True;
While Not Eof(MBaseFile) Do Begin While Not Eof(TempFile) Do Begin
Read (MBaseFile, TempBase); ioRead (TempFile, TempBase);
If Session.User.Access(TempBase.ListACS) Then Begin If Session.User.Access(TempBase.ListACS) Then Begin
Inc (Listed); Inc (Listed);
@ -858,7 +855,7 @@ Begin
If Compress Then If Compress Then
Inc (Total) Inc (Total)
Else Else
Total := FilePos(MBaseFile); Total := FilePos(TempFile);
Session.io.PromptInfo[1] := strI2S(Total); Session.io.PromptInfo[1] := strI2S(Total);
Session.io.PromptInfo[2] := TempBase.Name; Session.io.PromptInfo[2] := TempBase.Name;
@ -869,19 +866,19 @@ Begin
If (Listed MOD Config.MColumns = 0) and (Listed > 0) Then Session.io.OutRawLn(''); If (Listed MOD Config.MColumns = 0) and (Listed > 0) Then Session.io.OutRawLn('');
End; End;
If Eof(MBaseFile) and (Listed MOD Config.MColumns <> 0) Then Session.io.OutRawLn(''); If Eof(TempFile) and (Listed MOD Config.MColumns <> 0) Then Session.io.OutRawLn('');
If (Session.io.PausePtr = Session.User.ThisUser.ScreenSize) and (Session.io.AllowPause) Then If (Session.io.PausePtr = Session.User.ThisUser.ScreenSize) and (Session.io.AllowPause) Then
Case Session.io.MorePrompt of Case Session.io.MorePrompt of
'N' : Begin 'N' : Begin
Total := FileSize(MBaseFile); Total := FileSize(TempFile);
Break; Break;
End; End;
'C' : Session.io.AllowPause := False; 'C' : Session.io.AllowPause := False;
End; End;
End; End;
Close (MBaseFile); Close (TempFile);
Result := Total; Result := Total;
End; End;
@ -1230,35 +1227,25 @@ Var
Function MoveMessage (IsCopy: Boolean) : Boolean; Function MoveMessage (IsCopy: Boolean) : Boolean;
Var Var
Total : LongInt;
TempBase : RecMessageBase;
MsgNew : PMsgBaseABS; MsgNew : PMsgBaseABS;
Str : String; Str : String;
TempBase : RecMessageBase;
Area : Integer;
Addr : RecEchoMailAddr; Addr : RecEchoMailAddr;
Begin Begin
Result := False; Result := False;
Session.User.IgnoreGroup := True; Session.User.IgnoreGroup := True;
Repeat Repeat
Total := ListAreas(Config.MCompress);
If IsCopy Then If IsCopy Then
Session.io.OutFull (Session.GetPrompt(492)) Session.io.OutFull (Session.GetPrompt(492))
Else Else
Session.io.OutFull (Session.GetPrompt(282)); Session.io.OutFull (Session.GetPrompt(282));
Str := Session.io.GetInput(4, 4, 12, ''); Case Session.io.OneKeyRange('Q?', 1, Total) of
#00: If GetBaseCompressed(Session.io.RangeValue, TempBase) Then Begin
If Str = '?' Then
ListAreas(False)
Else Begin
Reset (MBaseFile);
Area := strS2I(Str) - 1;
If (Area > 0) and (Area < FileSize(MBaseFile) - 1) Then Begin
Seek (MBaseFile, Area);
Read (MBaseFile, TempBase);
Close (MBaseFile);
If Not Session.User.Access(TempBase.PostACS) Then Begin If Not Session.User.Access(TempBase.PostACS) Then Begin
Session.io.OutFullLn (Session.GetPrompt(105)); Session.io.OutFullLn (Session.GetPrompt(105));
Break; Break;
@ -1271,6 +1258,7 @@ Var
If Not OpenCreateBase(MsgNew, TempBase) Then Break; If Not OpenCreateBase(MsgNew, TempBase) Then Break;
MsgNew^.StartNewMsg; MsgNew^.StartNewMsg;
MsgNew^.SetFrom (MsgBase^.GetFrom); MsgNew^.SetFrom (MsgBase^.GetFrom);
MsgNew^.SetLocal (True); MsgNew^.SetLocal (True);
@ -1293,11 +1281,11 @@ Var
While Not MsgBase^.EOM Do Begin While Not MsgBase^.EOM Do Begin
Str := MsgBase^.GetString(79); Str := MsgBase^.GetString(79);
MsgNew^.DoStringLn(Str); MsgNew^.DoStringLn(Str);
End; End;
MsgNew^.WriteMsg; MsgNew^.WriteMsg;
MsgNew^.CloseMsgBase; MsgNew^.CloseMsgBase;
Dispose (MsgNew, Done); Dispose (MsgNew, Done);
@ -1306,16 +1294,16 @@ Var
Session.SystemLog('Forward msg to ' + strStripMCI(TempBase.Name)) Session.SystemLog('Forward msg to ' + strStripMCI(TempBase.Name))
Else Begin Else Begin
Session.SystemLog('Moved msg to ' + strStripMCI(TempBase.Name)); Session.SystemLog('Moved msg to ' + strStripMCI(TempBase.Name));
MsgBase^.DeleteMsg; MsgBase^.DeleteMsg;
End; End;
Result := True; Result := True;
Break;
End Else Begin
Close (MBaseFile);
Break; Break;
End; End;
#13,
'Q': Break;
End; End;
Until False; Until False;
@ -2431,6 +2419,15 @@ Begin
If Mode = 'F' Then Begin If Mode = 'F' Then Begin
Session.io.PromptInfo[1] := strI2S(MsgBase^.GetHighMsgNum); Session.io.PromptInfo[1] := strI2S(MsgBase^.GetHighMsgNum);
If Session.io.PromptInfo[1] = '0' Then Begin
Session.io.OutFullLn(Session.GetPrompt(114));
MsgBase^.CloseMsgBase;
Dispose (MsgBase, Done);
Exit;
End;
Session.io.OutFull (Session.GetPrompt(338)); Session.io.OutFull (Session.GetPrompt(338));
Session.io.OneKeyRange(#13, 1, MsgBase^.GetHighMsgNum); Session.io.OneKeyRange(#13, 1, MsgBase^.GetHighMsgNum);

View File

@ -240,8 +240,9 @@ Begin
If Offset = 0 Then Offset := 1; If Offset = 0 Then Offset := 1;
If CurX + Offset > 80 Then Begin If CurX + Offset > 80 Then Begin
NewPos := (CurX + Offset) - 80; NewPos := 80;
Inc (CurY); // NewPos := (CurX + Offset) - 80;
// Inc (CurY);
End Else End Else
NewPos := CurX + Offset; NewPos := CurX + Offset;

View File

@ -1123,7 +1123,7 @@ Begin
Session.Msgs.MessageGroupChange ('+', True, False); Session.Msgs.MessageGroupChange ('+', True, False);
If ThisUser.LastMBase > 0 Then If ThisUser.LastMBase > 0 Then
Session.Msgs.ChangeArea(strI2S(ThisUser.LastMBase - 1)) Session.Msgs.ChangeArea(strI2S(ThisUser.LastMBase))
Else Else
Session.Msgs.ChangeArea('+'); Session.Msgs.ChangeArea('+');

View File

@ -219,7 +219,7 @@
113 |15No messages found. 113 |15No messages found.
114 |CR|12There are no messages in |MB.|DE|DE|DE 114 |CR|12There are no messages in |MB.|DE|DE|DE
; E-mail reader prompt ; E-mail reader prompt
115 |CR|09(A)gain, (P)revious, (N)ext, (R)eply, (D)elete, (J)ump, (Q)uit? 115 |CR|09(A)gain, (P)revious, (N)ext, (R)eply, (D)elete, (J)ump, (Q)uit? |11
; Message read prompt. &1 = Current Msg # &2 = Total Messages ; Message read prompt. &1 = Current Msg # &2 = Total Messages
116 |CR (|&1 of |&2) Reading Messages (?/Help): |XX 116 |CR (|&1 of |&2) Reading Messages (?/Help): |XX
117 |CR|12Delete this mail? |11 117 |CR|12Delete this mail? |11
@ -686,7 +686,7 @@
; Add BBS: BBS already exists ; Add BBS: BBS already exists
362 |CR|12BBS already exists in list! 362 |CR|12BBS already exists in list!
; Msg xport: local export path ; Msg xport: local export path
363 |CR|09Enter full path/filename to export to: |XX 363 |CR|09Enter full path/filename to export to:|CR|XX
; info edit: address ; info edit: address
364 |CR|03Enter your street address.|CR|09: 364 |CR|03Enter your street address.|CR|09:
; info edit: city/state ; info edit: city/state
@ -963,6 +963,6 @@
; 1=offline 2=failed 3=unvalidated 4=GB 5=MB 6=KB 7=B ; 1=offline 2=failed 3=unvalidated 4=GB 5=MB 6=KB 7=B
491 OFFLINE FAILED UNVALID GB MB KB B 491 OFFLINE FAILED UNVALID GB MB KB B
; Forward msg: which base ; Forward msg: which base
492 |CR|09Forward message to which base (?/List): |XX 492 |CR|09Forward message to which base (|10?|09/|10List|09): |11
; Sysop password prompt ; Sysop password prompt
493 |CR|09Sysop Password: |XX 493 |CR|09Sysop Password: |XX

View File

@ -208,7 +208,6 @@ End;
Procedure InitializeUnix; Procedure InitializeUnix;
Var Var
Count : Word;
Info : Stat; Info : Stat;
Begin Begin
If fpStat('mystic', Info) = 0 Then Begin If fpStat('mystic', Info) = 0 Then Begin

View File

@ -23,7 +23,6 @@
Const Const
mysSoftwareID = 'Mystic'; // no idea mysSoftwareID = 'Mystic'; // no idea
mysCopyYear = '1997-2013'; // its been a long time! mysCopyYear = '1997-2013'; // its been a long time!
mysWebsite = 'sourceforge.net/projects/mysticbbs';
mysVersion = '1.10 A26'; // current version mysVersion = '1.10 A26'; // current version
mysDataChanged = '1.10 A11'; // version of last records change mysDataChanged = '1.10 A11'; // version of last records change
@ -84,6 +83,52 @@ Type
Point : Word; Point : Word;
End; End;
RecEchoMailOpts = Record
SysLocation : String[40];
SysFlags : String[40];
IncomingPath : String[mysMaxPathSize];
SIncomingPath : String[mysMaxPathSize];
OutboundPath : String[mysMaxPathSize];
NodeListPath : String[mysMaxPathSize];
ZoneMap : String[128];
FTPPort : Word;
BINKPPort : Word;
Res : Array[1..485] of Char;
End;
RecEchomailNodeFTP = Record
Host : String[60];
Login : String[30];
Password : String[30];
Directory : String[80];
End;
RecEchomailNodeBINKP = Record
Host : String[60];
TimeOut : Word;
BlockSize : Word;
Res : Array[1..10] of Byte;
End;
RecEchoMailNode = Record
Description : String[40];
Active : Boolean;
AddrList : String[250];
InType : Byte; // 0=Disabled 1=FTP 2=BINKP 3=EMAIL 4=DIRECTORY
OutType : Byte; // 0=Disabled 1=FTP 2=BINKP 3=EMAIL 4=DIRECTORY
FTPin : RecEchoMailNodeFTP;
FTPout : RecEchoMailNodeFTP;
BINKPin : RecEchoMailNodeBINKP;
BINKPout : RecEchoMailNodeBINKP;
LastRecv : LongInt;
LastSent : LongInt;
LastReset : LongInt;
InFiles : Cardinal;
InSize : Cardinal;
OutFiles : Cardinal;
OutSize : Cardinal;
End;
RecSauceInfo = Packed Record RecSauceInfo = Packed Record
Title : String[35]; Title : String[35];
Author : String[20]; Author : String[20];
@ -280,6 +325,13 @@ Type
inetTNHidden : Boolean; inetTNHidden : Boolean;
ThemeOnStart : Boolean; ThemeOnStart : Boolean;
StartCodePage : Byte; StartCodePage : Byte;
//inetSMTPRelay : String[30];
//inetSMTPLogin : String[30];
//inetSMTPPW : String[30];
//EmailValidationLevel
//AllowEmailPWReset
Reserved : Array[1..843] of Char; Reserved : Array[1..843] of Char;
End; End;

View File

@ -211,3 +211,18 @@ FILE rating / comments system
2. records already updated to allow for either 2. records already updated to allow for either
----------------------------------------------------------------------- -----------------------------------------------------------------------
TANSILINEBUFFER:
LoadToBuffer (Ansi file)
SaveToFile (Ansi file)
SaveToBuffer (Linelength)
WrapLine (XPOS)
InsertLine
DeleteLine
JoinLines
InsertChar (XPOS, Ch, Attr)
ReplaceChar (XPOS, Ch, Attr
ReplaceLine

View File

@ -2517,4 +2517,30 @@
+ When selecting "Forward" reading, Mystic now uses the smart input + When selecting "Forward" reading, Mystic now uses the smart input
function to prompt for the message start number. function to prompt for the message start number.
+ Rewrote the message move and fowarding functions. Both now make use of
compressed message base numbers when selecting the target message base,
and they both now use smart input.
! Fixed a bug which could cause a crash after moving a message while doing
a newscan of message bases.
+ Added sorting to the file bases configuration editor. Use TAB to mark
and /S to sort just like message bases.
! Fixed a bug when editing prompts using the theme editor when performing
a search.
! The Menu editor was not properly using the theme selected when it was
started.
! According to a document I saw, the ANSI-BBS C function to move the cursor
should hard stop at 80. Mystic's ANSI parser wraps to the next line which
I think was added in a while back to increase ANSI compatibility. For
now I changed it back to follow what this standard document is claiming,
even if it is sort of against my better judgement.
+ If a message bases's data files actually exist, for but some reason the
highest message number is 0 (ie everything has been deleted), Mystic will
now display the "There are no messages in this base" prompt when reading.
<ALPHA 26 RELEASED> <ALPHA 26 RELEASED>