Alpha 19 sync

This commit is contained in:
mysticbbs 2012-09-20 13:52:58 -04:00
parent 360e43d724
commit 4ba62f0a5e
22 changed files with 963 additions and 645 deletions

View File

@ -4719,7 +4719,7 @@
! Fixed bugs with MIS calculating the wrong node number if a user was
logged in locally in Windows.
+ Mystic in non-Unix will not assign an available node number automatically
+ Mystic in non-Unix will now assign an available node number automatically
similar to how it works in a Unix environment. This will help prevent
a person from accidentally logging into a node that is being used during
a local login.
@ -4739,3 +4739,70 @@
! MUTIL FILEBONE import was not adding the trailing slash when generating a
file path.
+ MUTIL now has an option to generate an allfiles list which contains a
listing of all files from each filebase in one text file.
The functionality if there, but its not very configurable yet. If
anyone has suggestions please let me know.
+ Added 3 new MPL functions: MsgEditor, MsgEditSet, MsgEditGet. These allow
access to the internal Mystic msg editor (line and/or full) from within
MPL. It even allows you to define wrap position and template to completely
make it look like its not the Mystic editor!
As a little hint the MsgEditSet and MsgEditGet stuff could be used to post
process message text on posts. Like say for example you wanted to write
a MPL that allows users to add Tag lines, you could do that by replacing
the "Saving message..." prompt and using those two in order to modify the
text before it is saved by Mystic!
Rather than trying to explain it all, here is an example of all 3:
Var
Lines : Integer = 0;
WrapPos : Integer = 79;
MaxLines : Integer = 200;
Forced : Boolean = False;
Template : String = 'ansiedit';
Subject : String = 'My subject';
Count : Integer;
Begin
MsgEditSet (1, 'this is line 1');
MsgEditSet (2, 'this is line 2!');
Lines := 2;
SetPromptInfo(1, 'MsgTo'); // if template uses &1 for "To:" display
If MsgEditor(0, Lines, WrapPos, MaxLines, Forced, Template, Subject) Then Begin
WriteLn('User selected to save.');
WriteLn('There are ' + Int2Str(Lines) + ' of text in buffer:');
For Count := 1 to Lines Do
WriteLn(MsgEditGet(Count));
Pause;
End Else Begin
WriteLn('User aborted the edit.');
Pause;
End
End
! Fixed a bug in the internal LHA archive viewing that could cause the last
file in the archive to get corrupted during the view, if the file had
comments (and was created on an Amiga?)
+ CTRL-Z and [ESCAPE] now both bring up the full screen editor prompt to
save, etc.
+ Revampped message quoting a little bit. Quoted text will now be auto
reformatted if adding the initials would cut off text in the original
message EXCEPT when quoting quoted text.
Quote initials will always be 2 characters now. If the User handle is a
single word handle, it will use the first two letters of their name.
! Fixed a bug that could corrupt a message and/or crash when editing a
message with a lot of lines.

View File

@ -18,7 +18,7 @@ Type
FileTime : LongInt;
Attr : Word;
FileName : String[12];
F32 : PathStr;
F32 : String[255];
DT : DateTime;
End;
@ -61,14 +61,17 @@ Begin
If _FHdr.HeadSize <> 0 Then
UnPackTime (_FHdr.FileTime, _FHdr.DT);
If Pos(#0, _FHdr.FileName) > 0 Then
SR.Name := Copy(_FHdr.FileName, 1, Pos(#0, _FHdr.FileName) - 1)
Else
SR.Name := _FHdr.FileName;
SR.Size := _FHdr.OrigSize;
SR.Time := _FHdr.FileTime;
End;
Procedure TLzhArchive.FindFirst (Var SR: ArcSearchRec);
Begin
_SL := 0;
GetHeader(SR);
End;

View File

@ -201,7 +201,7 @@ Begin
If User.ThisUser.Calls = 1 Then Inc (History.NewUsers, 1);
Inc (History.Hourly[HistoryHour]);
If Not LocalMode Then Inc (History.Hourly[HistoryHour]);
ioWrite (HistoryFile, History);
Close (HistoryFile);

View File

@ -4,7 +4,7 @@ Unit bbs_Edit_Full;
Interface
Function AnsiEditor (Var Lines: SmallInt; WrapPos: Byte; MaxLines: SmallInt; TEdit, Forced: Boolean; Var Subj: String) : Boolean;
Function AnsiEditor (Var Lines: SmallInt; WrapPos: Byte; MaxLines: SmallInt; Forced: Boolean; Template: String; Var Subj: String) : Boolean;
Implementation
@ -18,7 +18,7 @@ Begin
Session.io.BufAddStr(S + #13#10);
End;
Function AnsiEditor (Var Lines: Integer; WrapPos: Byte; MaxLines: Integer; TEdit, Forced: Boolean; Var Subj: String) : Boolean;
Function AnsiEditor (Var Lines: Integer; WrapPos: Byte; MaxLines: Integer; Forced: Boolean; Template: String; Var Subj: String) : Boolean;
Const
MaxCutText = 100;
Type
@ -411,7 +411,9 @@ End;
Procedure FullReDraw;
Begin
If TEdit Then Session.io.OutFile ('ansitext', True, 0) Else Session.io.OutFile ('ansiedit', True, 0);
Session.io.PromptInfo[2] := Subj;
Session.io.OutFile (Template, True, 0);
WinStart := Session.io.ScreenInfo[1].Y;
WinEnd := Session.io.ScreenInfo[2].Y;
@ -933,6 +935,7 @@ Begin
DeleteLine (CurLine);
TextRefreshPart;
End;
^Z,
^[ : Begin
Commands;

View File

@ -3629,7 +3629,7 @@ Begin
Temp := 'Description Editor';
B := FDir.DescLines;
If Editor(B, mysMaxFileDescLen, Config.MaxFileDesc, True, False, Temp) Then Begin
If Editor(B, mysMaxFileDescLen, Config.MaxFileDesc, False, fn_tplTextEdit, Temp) Then Begin
FDir.DescLines := B;
FDir.DescPtr := FileSize(DataFile);

View File

@ -15,7 +15,7 @@ Uses
bbs_Edit_Full,
bbs_Edit_Line;
Function Editor (Var Lines: SmallInt; MaxLen, MaxLine: SmallInt; TEdit, Forced : Boolean; Var Subj: String) : Boolean;
Function Editor (Var Lines: SmallInt; MaxLen, MaxLine: SmallInt; Forced: Boolean; Template: String; Var Subj: String) : Boolean;
Procedure Upgrade_User_Level (Now : Boolean; Var U : RecUser; Sec: Byte);
Procedure View_BBS_List (Long: Boolean; Data: String);
Procedure Add_BBS_List (Name : String);
@ -50,12 +50,12 @@ Uses
bbs_Core,
bbs_NodeInfo;
Function Editor (Var Lines: SmallInt; MaxLen, MaxLine: SmallInt; TEdit, Forced : Boolean; Var Subj: String) : Boolean;
Function Editor (Var Lines: SmallInt; MaxLen, MaxLine: SmallInt; Forced: Boolean; Template: String; Var Subj: String) : Boolean;
Begin
If (Session.io.Graphics > 0) and ((Session.User.ThisUser.EditType = 1) or ((Session.User.ThisUser.EditType = 2) and Session.io.GetYN(Session.GetPrompt(106), True))) Then
Editor := AnsiEditor(Lines, MaxLen, MaxLine, TEdit, Forced, Subj)
Editor := AnsiEditor(Lines, MaxLen, MaxLine, Forced, Template, Subj)
Else
Editor := LineEditor(Lines, MaxLen, MaxLine, TEdit, Forced, Subj);
Editor := LineEditor(Lines, MaxLen, MaxLine, False, Forced, Subj);
End;
Procedure Upgrade_User_Level (Now: Boolean; Var U: RecUser; Sec: Byte);
@ -120,7 +120,7 @@ Begin
Str := 'Signature Editor'; {++lang}
If Editor (Lines, 78, Config.MaxAutoSig, True, False, Str) Then Begin
If Editor (Lines, 78, Config.MaxAutoSig, False, fn_tplMsgEdit, Str) Then Begin
{$I-} Reset (DF, 1); {$I+}
If IoResult <> 0 Then ReWrite (DF, 1);

View File

@ -25,12 +25,14 @@ Type
MScan : MScanRec;
Group : RecGroup;
MsgText : RecMessageText;
MsgTextSize : SmallInt;
WereMsgs : Boolean;
Reading : Boolean;
Constructor Create (Var Owner: Pointer);
Destructor Destroy; Override;
Function IsQuotedText (Str: String) : Boolean;
Function OpenCreateBase (Var Msg: PMsgBaseABS; Var Area: RecMessageBase) : Boolean;
Procedure AppendMessageText (Var Msg: PMsgBaseABS; Lines: Integer; ReplyID: String);
Procedure AssignMessageData (Var Msg: PMsgBaseABS);
@ -113,6 +115,7 @@ Begin
Group.Name := 'None';
WereMsgs := False;
Reading := False;
MsgTextSize := 0;
End;
Destructor TMsgBase.Destroy;
@ -120,6 +123,14 @@ Begin
Inherited Destroy;
End;
Function TMsgBase.IsQuotedText (Str: String) : Boolean;
Var
Temp : Byte;
Begin
Temp := Pos('>', strStripL(Str, ' '));
Result := (Temp > 0) and (Temp < 5);
End;
Function TMsgBase.OpenCreateBase (Var Msg: PMsgBaseABS; Var Area: RecMessageBase) : Boolean;
Begin
Result := False;
@ -874,10 +885,11 @@ Var
Subj : String[60];
Addr : RecEchomailAddr;
MsgNew : PMsgBaseABS;
Temp1 : String;
Temp2 : String[2];
Temp3 : String[80];
tFile : Text;
TempStr : String;
Initials : String[4];
WrapData : String;
DoWrap : Boolean = True;
QuoteFile : Text;
Lines : SmallInt;
Begin
If Not Session.User.Access(MBase.PostACS) Then Begin
@ -914,9 +926,9 @@ Begin
MsgBase^.GetOrig(Addr);
Temp3 := Session.io.GetInput(20, 20, 12, strAddr2Str(Addr));
TempStr := Session.io.GetInput(20, 20, 12, strAddr2Str(Addr));
If Not strStr2Addr (Temp3, Addr) Then Exit;
If Not strStr2Addr (TempStr, Addr) Then Exit;
End;
Subj := MsgBase^.GetSubj;
@ -929,47 +941,60 @@ Begin
If Subj = '' Then Exit;
Assign (tFile, Session.TempPath + 'msgtmp');
{$I-} ReWrite (tFile); {$I+}
Assign (QuoteFile, Session.TempPath + 'msgtmp');
{$I-} ReWrite (QuoteFile); {$I+}
If IoResult = 0 Then Begin
Temp3 := MsgBase^.GetFrom;
Temp2 := Temp3[1];
Initials := strInitials(MsgBase^.GetFrom) + '> ';
TempStr := Session.GetPrompt(464);
If Pos(' ', Temp3) > 0 Then
Temp2 := Temp2 + Temp3[Succ(Pos(' ', Temp3))];
TempStr := strReplace(TempStr, '|&1', MsgBase^.GetDate);
TempStr := strReplace(TempStr, '|&2', MsgBase^.GetFrom);
TempStr := strReplace(TempStr, '|&3', Initials);
Temp1 := Session.GetPrompt(464);
Temp1 := strReplace(Temp1, '|&1', MsgBase^.GetDate);
Temp1 := strReplace(Temp1, '|&2', MsgBase^.GetFrom);
Temp1 := strReplace(Temp1, '|&3', Temp2);
WriteLn (tFile, Temp1);
WriteLn (tFile, ' ');
Lines := 0;
WriteLn (QuoteFile, TempStr);
WriteLn (QuoteFile, ' ');
MsgBase^.MsgTxtStartUp;
While Not MsgBase^.EOM and (Lines < mysMaxMsgLines - 2) Do Begin
Inc (Lines);
WrapData := '';
Temp3 := MsgBase^.GetString(79);
While Not MsgBase^.EOM Do Begin
TempStr := MsgBase^.GetString(79);
If Temp3[1] <> #1 Then
WriteLn (tFile, Temp2 + '> ' + Copy(Temp3, 1, 74));
If TempStr[1] = #1 Then Continue;
DoWrap := Not IsQuotedText(TempStr);
If DoWrap Then Begin
If WrapData <> '' Then Begin
If TempStr = '' Then Begin
WriteLn (QuoteFile, Initials + WrapData);
WriteLn (QuoteFile, Initials);
WrapData := '';
Continue;
End;
Close (tFile);
TempStr := WrapData + ' ' + TempStr;
End;
strWrap (TempStr, WrapData, 74);
WriteLn (QuoteFile, Initials + Copy(TempStr, 1, 74));
End Else
WriteLn (QuoteFile, Initials + Copy(TempStr, 1, 74));
End;
Close (QuoteFile);
End;
Lines := 0;
Session.io.PromptInfo[1] := ToWho;
Session.io.PromptInfo[2] := Subj;
If Editor(Lines, 78, mysMaxMsgLines, False, False, Subj) Then Begin
If Editor(Lines, 78, mysMaxMsgLines, False, fn_tplMsgEdit, Subj) Then Begin
Session.io.OutFull (Session.GetPrompt(107));
@ -1043,11 +1068,13 @@ Var
While Not MsgBase^.EOM and (Lines < mysMaxMsgLines) Do Begin
Inc (Lines);
MsgText[Lines] := MsgBase^.GetString(79);
End;
If Lines < mysMaxMsgLines Then Begin
Inc (Lines);
MsgText[Lines] := '';
End;
End;
@ -1096,7 +1123,7 @@ Begin
'!' : Begin
Temp1 := MsgBase^.GetSubj;
If Editor(Lines, 78, mysMaxMsgLines, False, False, Temp1) Then
If Editor(Lines, 78, mysMaxMsgLines, False, fn_tplMsgEdit, Temp1) Then
MsgBase^.SetSubj(Temp1)
Else
ReadText;
@ -1440,9 +1467,8 @@ Var
Var
B : Byte;
Begin
B := Pos('>', strStripL(Str, ' '));
If (B > 0) and (B < 5) Then Begin
If IsQuotedText(Str) Then Begin
Session.io.AnsiColor(MBase.ColQuote);
Session.io.OutPipe (Str);
Session.io.AnsiColor(MBase.ColText);
@ -2352,6 +2378,7 @@ Begin
End;
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
MsgBase^.SetTempFile (Session.TempPath + 'msgbuf.');
If Not MsgBase^.OpenMsgBase Then Begin
If Mode = 'E' Then
@ -2555,9 +2582,9 @@ Begin
Lines := 0;
Session.io.PromptInfo[1] := MsgTo;
Session.io.PromptInfo[2] := MsgSubj;
// Session.io.PromptInfo[2] := MsgSubj;
If Editor(Lines, 78, mysMaxMsgLines, False, Forced, MsgSubj) Then Begin
If Editor(Lines, 78, mysMaxMsgLines, Forced, fn_tplMsgEdit, MsgSubj) Then Begin
Session.io.OutFull (Session.GetPrompt(107));
{ all of this below should be replaced with a SaveMessage function }
@ -2997,7 +3024,7 @@ Begin
Lines := 0;
If Editor(Lines, 78, mysMaxMsgLines, False, False, MsgSubj) Then Begin
If Editor(Lines, 78, mysMaxMsgLines, False, fn_tplMsgEdit, MsgSubj) Then Begin
Session.io.OutFullLn (Session.GetPrompt(394));
OLD := MBase;

View File

@ -100,7 +100,7 @@ Type
Function YoursFound: Boolean; Virtual; {Message found}
Function GetHighMsgNum: LongInt; Virtual; {Get highest msg number}
Procedure SetMailType(MT: MsgMailType); Virtual; {Set message base type}
Function GetSubArea: Word; Virtual; {Get sub area number}
// Function GetSubArea: Word; Virtual; {Get sub area number}
Procedure ReWriteHdr; Virtual; {Rewrite msg header after changes}
Procedure DeleteMsg; Virtual; {Delete current message}
Procedure SetEcho(ES: Boolean); Virtual; {Set echo status}
@ -521,10 +521,10 @@ Procedure TMsgBaseABS.SetMailType(MT: MsgMailType);
Begin
End;
Function TMsgBaseABS.GetSubArea: Word;
Begin
GetSubArea := 0;
End;
//Function TMsgBaseABS.GetSubArea: Word;
//Begin
// GetSubArea := 0;
//End;
Procedure TMsgBaseABS.ReWriteHdr;
Begin

View File

@ -212,7 +212,7 @@ Type
Function IsRcvd : Boolean; Virtual; {Is current msg received}
Function IsPriv : Boolean; Virtual; {Is current msg priviledged/private}
Function IsDeleted : Boolean; Virtual; {Is current msg deleted}
Function IsEchoed: Boolean; Virtual; {Msg should be echoed}
// Function IsEchoed : Boolean; Virtual; {Msg should be echoed}
Function GetMsgLoc : LongInt; Virtual; {Msg location}
Procedure SetMsgLoc (ML: LongInt); Virtual; {Msg location}
Procedure YoursFirst (Name: String; Handle: String); Virtual; {Seek your mail}
@ -221,11 +221,11 @@ Type
Procedure StartNewMsg; Virtual;
Function OpenMsgBase : Boolean; Virtual;
Procedure CloseMsgBase; Virtual;
Function MsgBaseExists: Boolean; Virtual; {Does msg base exist}
// Function MsgBaseExists : Boolean; Virtual; {Does msg base exist}
Function CreateMsgBase (MaxMsg: Word; MaxDays: Word): Boolean; Virtual;
Function SeekFound : Boolean; Virtual;
Procedure SetMailType (MT: MsgMailType); Virtual; {Set message base type}
Function GetSubArea: Word; Virtual; {Get sub area number}
// Function GetSubArea : Word; Virtual; {Get sub area number}
Procedure ReWriteHdr; Virtual; {Rewrite msg header after changes}
Procedure DeleteMsg; Virtual; {Delete current message}
Function NumberOfMsgs : LongInt; Virtual; {Number of messages}
@ -1324,22 +1324,21 @@ Function TMsgBaseJAM.IsDeleted: Boolean; {Is current msg deleted}
IsDeleted := (MsgHdr^.JamHdr.Attr1 and Jam_Deleted) <> 0;
End;
Function TMsgBaseJAM.IsEchoed: Boolean; {Is current msg echoed}
Begin
IsEchoed := True;
End;
//Function TMsgBaseJAM.IsEchoed: Boolean; {Is current msg echoed}
//Begin
// IsEchoed := True;
//End;
Procedure TMsgBaseJAM.SeekFirst(MsgNum: LongInt); {Start msg seek}
Begin
JM^.CurrMsgNum := MsgNum - 1;
If JM^.CurrMsgNum < (JM^.BaseHdr.BaseMsgNum - 1) Then
JM^.CurrMsgNum := JM^.BaseHdr.BaseMsgNum - 1;
SeekNext;
End;
Procedure TMsgBaseJAM.SeekNext; {Find next matching msg}
Var
IdxLoc: LongInt;
@ -1351,6 +1350,7 @@ Begin
While (((JamIdx^[IdxLoc - JM^.IdxStart].HdrLoc < 0) or (JamIdx^[IdxLoc - JM^.IdxStart].MsgToCrc = -1)) And (JM^.CurrMsgNum <= GetHighMsgNum)) Do Begin
Inc (JM^.CurrMsgNum);
Error := ReReadIdx(IdxLoc);
End;
End;
@ -1376,19 +1376,16 @@ Begin
SeekFound := ((JM^.CurrMsgNum >= JM^.BaseHdr.BaseMsgNum) and (JM^.CurrMsgNum <= GetHighMsgNum));
End;
Function TMsgBaseJAM.GetMsgLoc: LongInt; {Msg location}
Begin
GetMsgLoc := GetMsgNum;
End;
Procedure TMsgBaseJAM.SetMsgLoc(ML: LongInt); {Msg location}
Begin
JM^.CurrMsgNum := ML;
End;
Procedure TMsgBaseJAM.YoursFirst (Name: String; Handle: String);
Begin
JM^.YourName := Name;
@ -1396,10 +1393,10 @@ Begin
JM^.NameCrc := JamStrCrc(Name);
JM^.HdlCrc := JamStrCrc(Handle);
JM^.CurrMsgNum := JM^.BaseHdr.BaseMsgNum - 1;
YoursNext;
End;
Procedure TMsgBaseJAM.YoursNext;
Var
Found : Boolean;
@ -1412,8 +1409,10 @@ Begin
Found := False;
Inc(JM^.CurrMsgNum);
While ((Not Found) and (JM^.CurrMsgNum <= GetHighMsgNum) And (Error = 0)) Do Begin
Error := ReReadIdx(IdxLoc);
If Error = 0 Then Begin {Check CRC values}
If ((JamIdx^[IdxLoc - JM^.IdxStart].MsgToCrc = JM^.NameCrc) or
(JamIdx^[IdxLoc - JM^.IdxStart].MsgToCrc = JM^.HdlCrc)) Then Begin
@ -1450,57 +1449,59 @@ Begin
End;
End;
Function TMsgBaseJAM.YoursFound: Boolean;
Begin
YoursFound := ((JM^.CurrMsgNum >= JM^.BaseHdr.BaseMsgNum) and
(JM^.CurrMsgNum <= GetHighMsgNum));
YoursFound := ((JM^.CurrMsgNum >= JM^.BaseHdr.BaseMsgNum) and (JM^.CurrMsgNum <= GetHighMsgNum));
End;
Procedure TMsgBaseJAM.StartNewMsg;
Begin
JM^.TxtBufStart := 0;
JM^.TxtPos := 0;
FillChar(MsgHdr^, SizeOf(MsgHdr^), #0);
MsgHdr^.JamHdr.SubFieldLen := 0;
// MsgHdr^.JamHdr.SubFieldLen := 0;
MsgHdr^.JamHdr.MsgIdCrc := -1;
MsgHdr^.JamHdr.ReplyCrc := -1;
MsgHdr^.JamHdr.PwdCrc := -1;
JM^.MsgTo := '';
JM^.MsgFrom := '';
JM^.MsgSubj := '';
FillChar(JM^.Orig, SizeOf(JM^.Orig), #0);
FillChar(JM^.Dest, SizeOf(JM^.Dest), #0);
JM^.MsgDate := DateDos2Str(CurDateDos, 1);
JM^.MsgTime := TimeDos2Str(CurDateDos, False);
// writeln(jm^.msgdate);
End;
Function TMsgBaseJAM.MsgBaseExists: Boolean;
Begin
MsgBaseExists := (FileExist(JM^.MsgPath + '.jhr'));
End;
//Function TMsgBaseJAM.MsgBaseExists: Boolean;
// Begin
// MsgBaseExists := (FileExist(JM^.MsgPath + '.jhr'));
// End;
Function TMsgBaseJAM.ReadIdx: Word;
Begin
If JM^.IdxStart < 0 Then JM^.IdxStart := 0;
Seek (JM^.IdxFile, JM^.IdxStart);
BlockRead (JM^.IdxFile, JamIdx^, JamIdxBufSize, JM^.IdxRead);
ReadIdx := IoResult;
End;
Function TMsgBaseJAM.WriteIdx: Word;
Begin
Seek (JM^.IdxFile, JM^.IdxStart);
BlockWrite (JM^.IdxFile, JamIdx^, JM^.IdxRead);
WriteIdx := IoResult;
End;
Function TMsgBaseJAM.OpenMsgBase: Boolean;
Var
OpenError : Word;
@ -1554,16 +1555,16 @@ Function TMsgBaseJAM.CreateMsgBase(MaxMsg: Word; MaxDays: Word): Boolean;
Var
TmpHdr : ^JamHdrType;
CreateError : Word;
// i: Word;
Begin
CreateError := 0;
New(TmpHdr);
If TmpHdr = Nil Then
CreateError := 500
Else Begin;
FillChar(TmpHdr^, SizeOf(TmpHdr^), #0);
TmpHdr^.Signature[1] := 'J';
TmpHdr^.Signature[2] := 'A';
TmpHdr^.Signature[3] := 'M';
@ -1571,52 +1572,57 @@ Begin
TmpHdr^.Created := ToUnixDate(CurDateDos);
TmpHdr^.PwdCrc := -1;
CreateError := SaveFile(JM^.MsgPath + '.jhr', TmpHdr^, SizeOf(TmpHdr^));
Dispose(TmpHdr);
If CreateError = 0 Then
CreateError := SaveFile(JM^.MsgPath + '.jlr', CreateError, 0);
If CreateError = 0 Then
CreateError := SaveFile(JM^.MsgPath + '.jdt', CreateError, 0);
If CreateError = 0 Then
CreateError := SaveFile(JM^.MsgPath + '.jdx', CreateError , 0);
If IoResult <> 0 Then;
End;
CreateMsgBase := CreateError = 0;
End;
Procedure TMsgBaseJAM.SetMailType(MT: MsgMailType);
Begin
JM^.MailType := MT;
End;
Function TMsgBaseJAM.GetSubArea: Word;
Begin
GetSubArea := 0;
End;
//Function TMsgBaseJAM.GetSubArea: Word;
//Begin
// GetSubArea := 0;
//End;
Procedure TMsgBaseJAM.ReWriteHdr;
Var
IdxLoc : LongInt;
Begin
If LockMsgBase Then
Error := 0
Else
Error := 5;
Error := ReReadIdx(IdxLoc);
If Error = 0 Then Begin
Seek (JM^.HdrFile, JamIdx^[IdxLoc - JM^.IdxStart].HdrLoc);
Error := IoResult;
End;
If Error = 0 Then Begin
BlockWrite (JM^.HdrFile, MsgHdr^.JamHdr, SizeOf(MsgHdr^.JamHdr));
Error := IoResult;
End;
If UnLockMsgBase Then;
End;
UnLockMsgBase;
End;
Procedure TMsgBaseJAM.DeleteMsg;
Var
@ -1628,20 +1634,25 @@ Begin
DelError := 0
Else
DelError := 5;
If DelError = 0 Then Begin
SetAttr1 (Jam_Deleted, True);
Dec (JM^.BaseHdr.ActiveMsgs);
DelError := ReReadIdx(IdxLoc);
End;
If DelError = 0 Then ReWriteHdr;
If DelError = 0 Then Begin
Inc(JM^.BaseHdr.ModCounter);
{these three were commented out for some reason }
JamIdx^[IdxLoc - JM^.IdxStart].MsgToCrc := -1;
JamIdx^[IdxLoc - JM^.IdxStart].HdrLoc := -1;
If WriteIdx = 0 Then;
WriteIdx;
End;
If UnLockMsgBase Then;
UnLockMsgBase;
End;
End;
@ -1650,43 +1661,45 @@ Begin
NumberOfMsgs := JM^.BaseHdr.ActiveMsgs;
End;
Function TMsgBaseJAM.FindLastRead (Var LastFile: File; UNum: LongInt): LongInt;
Const
LastSize = 100;
Type LastArray = Array[1..LastSize] of JamLastType;
Type
LastArray = Array[1..LastSize] of JamLastType;
Var
LastBuf : ^LastArray;
LastError : Word;
NumRead : LongInt;
Found : Boolean;
i: Word;
Count : Word;
LastStart : LongInt;
Begin
FindLastRead := -1;
Found := False;
New (LastBuf);
Seek (LastFile, 0);
LastError := IoResult;
While ((Not Eof(LastFile)) and (LastError = 0) And (Not Found)) Do
Begin
While ((Not Eof(LastFile)) and (LastError = 0) And (Not Found)) Do Begin
LastStart := FilePos(LastFile);
BlockRead (LastFile, LastBuf^, LastSize, NumRead);
LastError := IoResult;
For i := 1 to NumRead Do Begin
If LastBuf^[i].UserNum = UNum Then
Begin
For Count := 1 to NumRead Do Begin
If LastBuf^[Count].UserNum = UNum Then Begin
Found := True;
FindLastRead := LastStart + i - 1;
FindLastRead := LastStart + Count - 1;
End;
End;
End;
Dispose(LastBuf);
End;
Dispose (LastBuf);
End;
Function TMsgBaseJAM.GetLastRead (UNum: LongInt) : LongInt;
Var
@ -1695,14 +1708,20 @@ Var
TmpLast : JamLastType;
Begin
Assign (LastFile, JM^.MsgPath + '.jlr');
FileMode := fmReadWrite + fmDenyNone;
Reset (LastFile, SizeOf(JamLastType));
Error := IoResult;
RecNum := FindLastRead(LastFile, UNum);
If RecNum >= 0 Then Begin
Seek (LastFile, RecNum);
If Error = 0 Then Begin
BlockRead (LastFile, TmpLast, 1);
Error := IoResult;
GetLastRead := TmpLast.HighRead;
End;
@ -1710,6 +1729,7 @@ Begin
GetLastRead := 0;
Close (LastFile);
Error := IoResult;
End;
@ -1718,26 +1738,36 @@ Procedure TMsgBaseJAM.SetLastRead(UNum: LongInt; LR: LongInt);
RecNum : LongInt;
LastFile : File;
TmpLast : JamLastType;
Begin
Assign (LastFile, JM^.MsgPath + '.jlr');
FileMode := fmReadWrite + fmDenyNone;
Reset (LastFile, SizeOf(JamLastType));
Error := IoResult;
If Error <> 0 Then ReWrite(LastFile, SizeOf(JamLastType));
Error := IoResult;
RecNum := FindLastRead(LastFile, UNum);
If RecNum >= 0 Then Begin
Seek (LastFile, RecNum);
If Error = 0 Then Begin
BlockRead (LastFile, TmpLast, 1);
Error := IoResult;
TmpLast.HighRead := LR;
TmpLast.LastRead := LR;
If Error = 0 Then Begin
Seek (LastFile, RecNum);
Error := IoResult;
End;
If Error = 0 Then Begin
BlockWrite (LastFile, TmpLast, 1);
Error := IoResult;
@ -1748,18 +1778,22 @@ Procedure TMsgBaseJAM.SetLastRead(UNum: LongInt; LR: LongInt);
TmpLast.HighRead := Lr;
TmpLast.NameCrc := UNum;
TmpLast.LastRead := Lr;
Seek (LastFile, FileSize(LastFile));
Error := IoResult;
If Error = 0 Then Begin
BlockWrite (LastFile, TmpLast, 1);
Error := IoResult;
End;
End;
Close (LastFile);
Error := IoResult;
End;
Function TMsgBaseJAM.GetTxtPos : LongInt;
Begin
GetTxtPos := JM^.TxtPos;
@ -1797,7 +1831,9 @@ Var
LockError: Word;
Begin
LockError := 0;
If JM^.LockCount > 0 Then Dec(JM^.LockCount);
If JM^.LockCount = 0 Then Begin
If LockError = 0 Then Begin
// LockError := UnLockFile(JM^.HdrFile, 0, 1);
@ -1811,6 +1847,7 @@ Begin
LockError := IoResult;
End;
End;
UnLockMsgBase := (LockError = 0);
End;
@ -1830,9 +1867,12 @@ Function TMsgBaseJAM.ReReadIdx(Var IdxLoc : LongInt) : Word;
Begin
ReReadIdx := 0;
IdxLoc := JM^.CurrMsgNum - JM^.BaseHdr.BaseMsgNum;
If ((IdxLoc < JM^.IdxStart) OR (IdxLoc >= (JM^.IdxStart + JM^.IdxRead))) Then Begin
JM^.IdxStart := IdxLoc - 30;
If JM^.IdxStart < 0 Then JM^.IdxStart := 0;
ReReadIdx := ReadIdx;
End;
End;

View File

@ -135,7 +135,6 @@ Type
End;
Type
PMsgBaseSquish = ^TMsgBaseSquish;
TMsgBaseSquish = Object(TMsgBaseAbs)
SqInfo : ^SqInfoType;
@ -247,13 +246,13 @@ Type
Procedure MsgStartUp; Virtual; {Set up message}
Procedure MsgTxtStartUp; Virtual; {Set up for msg text}
Procedure SetMailType(MT: MsgMailType); Virtual; {Set message base type}
Function GetSubArea: Word; Virtual; {Get sub area number}
// Function GetSubArea: Word; Virtual; {Get sub area number}
Procedure ReWriteHdr; Virtual; {Rewrite msg header after changes}
Procedure DeleteMsg; Virtual; {Delete current message}
Procedure LoadFree; Virtual; {Load freelist into memory}
Function NumberOfMsgs: LongInt; Virtual; {Number of messages}
Procedure SetEcho(ES: Boolean); Virtual; {Set echo status}
Function IsEchoed: Boolean; Virtual; {Is current msg unmoved echomail msg}
// Function IsEchoed: Boolean; Virtual; {Is current msg unmoved echomail msg}
Function GetLastRead(UNum: LongInt): LongInt; Virtual; {Get last read for user num}
Procedure SetLastRead(UNum: LongInt; LR: LongInt); Virtual; {Set last read}
Function GetMsgLoc: LongInt; Virtual; {To allow reseeking to message}
@ -330,6 +329,7 @@ End;
Procedure TMsgBaseSquish.SetMsgPath(FN: String);
Begin
SqInfo^.FN := FExpand(FN);
If Pos('.', SqInfo^.FN) > 0 Then
SqInfo^.FN := Copy(SqInfo^.FN,1,Pos('.', SqInfo^.FN) - 1);
End;
@ -338,6 +338,7 @@ Function TMsgBaseSquish.OpenMsgBase: Boolean;
Begin
If SqiOpen Then Begin
OpenMsgBase := SqdOpen;
ReadIdx;
End Else
OpenMsgBase := False;
@ -348,8 +349,11 @@ Var
NumRead: LongInt;
Begin
If Not SqInfo^.SqdOpened Then Begin
Assign(SqInfo^.SqdFile, SqInfo^.FN + '.sqd');
FileMode := 66; {ReadWrite + DenyNone}
If Not ioReset(SqInfo^.SqdFile, 1, fmreadwrite + fmdenynone) Then
SqdOpen := False
Else Begin
@ -391,18 +395,21 @@ Procedure TMsgBaseSquish.CloseMsgBase;
Begin
SqdClose;
SqiClose;
FileMode := fmReadWrite + fmDenyNone; { shouldn't be needed... }
FileMode := fmRWDN; { shouldn't be needed... }
End;
Function TMsgBaseSquish.CreateMsgBase(MaxMsg: Word; MaxDays: Word): Boolean;
Begin
If Not SqInfo^.SqdOpened Then Begin
FillChar(SqInfo^.SqBase, SizeOf(SqInfo^.SqBase), 0);
SqInfo^.SqBase.Len := 256;
SqInfo^.SqBase.SqHdrSize := SqFSize;
SqInfo^.SqBase.UID := 1;
SqInfo^.SqBase.NumMsg := 0;
SqInfo^.SqBase.Base := SqInfo^.FN;
Str2Az(SqInfo^.FN, 78, SqInfo^.SqBase.Base);
SqInfo^.SqBase.MaxMsg := MaxMsg;
@ -410,8 +417,9 @@ Begin
SqInfo^.SqBase.EndFrame := SqInfo^.SqBase.Len;
CreateMsgBase := (SaveFile(SqInfo^.FN + '.sqd', SqInfo^.SqBase, SqInfo^.SqBase.Len) = 0);
If SaveFile(SqInfo^.FN + '.sqi', SqInfo^.SqBase, 0) = 0 Then;
If SaveFile(SqInfo^.FN + '.sql', SqInfo^.SqBase, 0) = 0 Then;
SaveFile (SqInfo^.FN + '.sqi', SqInfo^.SqBase, 0);
SaveFile (SqInfo^.FN + '.sql', SqInfo^.SqBase, 0);
End Else
CreateMsgBase := False;
End;
@ -424,7 +432,9 @@ End;
Procedure TMsgBaseSquish.SqdClose;
Begin
If SqInfo^.SqdOpened Then Close(SqInfo^.SqdFile);
If IOResult <> 0 Then;
SqInfo^.SqdOpened := False;
End;
@ -532,8 +542,7 @@ Function TMsgBaseSquish.GetDate: String; {Get message date mm-dd-yy}
Var
TmpDate: LongInt;
Begin
TmpDate := (SqInfo^.MsgHdr.DateWritten shr 16) +
((SqInfo^.MsgHdr.DateWritten and $ffff) shl 16);
TmpDate := (SqInfo^.MsgHdr.DateWritten shr 16) + ((SqInfo^.MsgHdr.DateWritten and $ffff) shl 16);
GetDate := DateDos2Str(TmpDate, 1);
End;
@ -541,8 +550,7 @@ Function TMsgBaseSquish.GetTime: String; {Get message time hh:mm}
Var
TmpDate: LongInt;
Begin
TmpDate := (SqInfo^.MsgHdr.DateWritten shr 16) +
((SqInfo^.MsgHdr.DateWritten and $ffff) shl 16);
TmpDate := (SqInfo^.MsgHdr.DateWritten shr 16) + ((SqInfo^.MsgHdr.DateWritten and $ffff) shl 16);
GetTime := TimeDos2Str(TmpDate, False);
End;
@ -584,12 +592,17 @@ Var
Begin
Hash := 0;
Counter := 1;
While Counter <= Length(Name) Do Begin
Hash := (Hash shl 4) + Ord(LoCase(Name[Counter]));
Tmp := Hash and $F0000000;
If (Tmp <> 0) Then Hash := (Hash or (Tmp shr 24)) or Tmp;
Inc (Counter);
End;
SqHashName := Hash and $7fffffff;
End;
@ -603,7 +616,9 @@ Var
NumRead : LongInt;
Begin
Seek (SqInfo^.SqdFile, FPos);
SqInfo^.Error := IoResult;
If SqInfo^.Error = 0 Then Begin
If Not ioBlockRead (SqInfo^.SqdFile, Frame, SizeOf(SqFrameHdrType), NumRead) Then
SqInfo^.Error := ioCode;
@ -620,7 +635,9 @@ Var
Res : LongInt;
Begin
Seek (SqInfo^.SqdFile, FPos);
SqInfo^.Error := IoResult;
If SqInfo^.Error = 0 Then Begin
If Not ioBlockWrite(SqInfo^.SqdFile, Frame, SizeOf(SqFrameHdrType), Res) Then
SqInfo^.Error := ioCode;
@ -633,12 +650,17 @@ Var
Begin
If Frame.PrevFrame <> 0 Then Begin
ReadVarFrame(TmpFrame, Frame.PrevFrame);
TmpFrame.NextFrame := Frame.NextFrame;
WriteVarFrame(TmpFrame, Frame.PrevFrame);
End;
If Frame.NextFrame <> 0 Then Begin
ReadVarFrame(TmpFrame, Frame.NextFrame);
TmpFrame.PrevFrame := Frame.PrevFrame;
WriteVarFrame(TmpFrame, Frame.NextFrame);
End;
End;
@ -653,9 +675,11 @@ Begin
FreeArray^[i].FreePos := 0;
FreeArray^[i].FreeSize := 0;
End;
SqInfo^.FreeLoaded := True;
i := 0;
TmpPos := SqInfo^.SqBase.FirstFree;
While ((TmpPos <> 0) and (i < MaxFree)) Do Begin
ReadVarFrame(TmpFrame, TmpPos);
Inc(i);
@ -663,6 +687,7 @@ Begin
FreeArray^[i].FreePos := TmpPos;
TmpPos := TmpFrame.NextFrame;
End;
SqInfo^.HighestFree := i;
End;
@ -693,6 +718,7 @@ Begin
If FramePos <> 0 Then Begin
ReadVarFrame(TmpFrame, FramePos);
FreeArray^[BestIdx].FreePos := 0;
FreeArray^[BestIdx].FreeSize := 0;
End;
@ -1301,10 +1327,10 @@ Begin
IsPriv := ((SqInfo^.MsgHdr.Attr and SqMsgPriv) <> 0);
End;
Function TMsgBaseSquish.IsEchoed: Boolean;
Begin
IsEchoed := ((SqInfo^.MsgHdr.Attr and SqMsgScanned) = 0);
End;
//Function TMsgBaseSquish.IsEchoed: Boolean;
//Begin
// IsEchoed := ((SqInfo^.MsgHdr.Attr and SqMsgScanned) = 0);
//End;
Function TMsgBaseSquish.IsDeleted: Boolean; {Is current msg deleted}
Begin
@ -1423,10 +1449,10 @@ Procedure TMsgBaseSquish.SetMailType(MT: MsgMailType);
Begin
End;
Function TMsgBaseSquish.GetSubArea: Word;
Begin
GetSubArea := 0;
End;
//Function TMsgBaseSquish.GetSubArea: Word;
//Begin
// GetSubArea := 0;
//End;
Procedure TMsgBaseSquish.ReWriteHdr;
Var

View File

@ -256,6 +256,8 @@ Begin
Client := TIOSocket.Create;
Client.FTelnetClient := True;
If Not Client.Connect('127.0.0.1', bbsConfig.InetTNPort) Then
Console.WriteLine('Unable to connect')
Else Begin

View File

@ -104,7 +104,7 @@ Var
NewCmd : String;
NewData : String;
Begin
NewCmd := strWordGet(1, Data, ' ');
NewCmd := strUpper(strWordGet(1, Data, ' '));
NewData := Copy(Data, Pos(' ', Data) + 1, 255);
If NewCmd = 'USER' Then Begin

View File

@ -292,6 +292,9 @@ Begin
AddProc ({$IFDEF MPLPARSER} 'getmbasestats', {$ENDIF} 'lLLL', iBool); // 541
AddProc ({$IFDEF MPLPARSER} 'writexy', {$ENDIF} 'bbbs', iNone); // 542
AddProc ({$IFDEF MPLPARSER} 'writexypipe', {$ENDIF} 'bbbis', iNone); // 543
AddProc ({$IFDEF MPLPARSER} 'msgeditor', {$ENDIF} 'iIiiosS', iBool); // 544
AddProc ({$IFDEF MPLPARSER} 'msgeditget', {$ENDIF} 'i', iString); // 545
AddProc ({$IFDEF MPLPARSER} 'msgeditset', {$ENDIF} 'is', iNone); // 546
{ END OF PROCEDURE DEFINITIONS }

View File

@ -837,7 +837,17 @@ Begin
If RecData[VarData[VN]^.RecID]^.Fields[Count].ArrDem > 0 Then Begin
GetStr(tkw[wOpenArray], True, False);
// output if zero based here asdf asdf
For X := 1 to RecData[VarData[VN]^.RecID]^.Fields[Count].ArrDem Do Begin
OutWord(RecData[VarData[VN]^.RecID]^.Fields[Count].ArrStart[X]);
// If RecData[VarData[VN]^.RecID]^.Fields[Count].ArrStart[X] = 0 Then
// OutWord(0)
// Else
// OutWord(1);
ParseVarNumber(True);
If X < RecData[VarData[VN]^.RecID]^.Fields[Count].ArrDem Then

View File

@ -452,6 +452,7 @@ Var
Count : Word;
Temp : TArrayInfo;
Offset : Word;
ArrStart : Word;
Begin
For Count := 1 to mplMaxArrayDem Do A[Count] := 1;
@ -484,13 +485,17 @@ Begin
R.ArrDem := W;
If R.ArrDem > 0 Then Begin
For Count := 1 to R.ArrDem Do
Temp[Count] := Trunc(EvaluateNumber);
Offset := 0;
For Count := 1 to R.ArrDem Do
Offset := Offset + ((Temp[Count] - 1) * R.OneSize);
For Count := 1 to R.ArrDem Do Begin
NextWord;
ArrStart := W;
Temp[Count] := Trunc(EvaluateNumber);
Offset := Offset + ((Temp[Count] - ArrStart) * R.OneSize);
End;
R.Offset := R.Offset + Offset;
End;
@ -1018,16 +1023,8 @@ Begin
RecID := FindVariable(W);
CheckArray (RecID, AD, RI);
//asdf DEBUG DEBUG
// how do we get the real size of the shit here?
// i added Checkarray here and ParseElement in ParseVarRecord for compiler
//session.io.outfullln('datasize=' + stri2s(vardata[recid]^.datasize));
//session.io.outfullln('varsize=' + stri2s(vardata[recid]^.varsize));
//session.io.outfullln('|PN');
Move (GetDataPtr(RecID, AD, RI)^, GetDataPtr(VarNum, ArrayData, RecInfo)^, RecInfo.OneSize {VarData[RecID]^.VarSize});
// Move (VarData[RecID]^.Data^, GetDataPtr(VarNum, ArrayData, RecInfo)^, VarData[RecID]^.DataSize);
End;
End;
End;
@ -1144,7 +1141,7 @@ Begin
Result := DataSize;
GetMem (Data, DataSize);
FillChar (Data^, DataSize, 0);
FillChar (Data^, DataSize, #0);
Kill := True;
End;
@ -1389,7 +1386,7 @@ Begin
VarData[VarNum]^.Kill := False;
GetMem (VarData[VarNum]^.Data, VarData[VarNum]^.DataSize);
FillChar (VarData[VarNum]^.Data^, VarData[VarNum]^.DataSize, 0);
FillChar (VarData[VarNum]^.Data^, VarData[VarNum]^.DataSize, #0);
End;
ExecuteBlock (SavedVar);
@ -1903,6 +1900,25 @@ Begin
End;
542 : WriteXY (Param[1].B, Param[2].B, Param[3].B, Param[4].S);
543 : WriteXYPipe (Param[1].B, Param[2].B, Param[3].B, Param[4].I, Param[5].S);
544 : Begin
TempBool := Editor(SmallInt(Pointer(Param[2].vData)^),
Param[3].I,
Param[4].I,
Param[5].O,
Param[6].S,
String(Pointer(Param[7].vData)^));
Store (TempBool, 1);
End;
545 : Begin
If (Param[1].I > 0) and (Param[1].I <= mysMaxMsgLines) Then
TempStr := Session.Msgs.MsgText[Param[1].I]
Else
TempStr := '';
Store (TempStr, 255);
End;
546 : If (Param[1].I > 0) and (Param[1].I <= mysMaxMsgLines) Then
Session.Msgs.MsgText[Param[1].I] := Param[2].S;
End;
End;

View File

@ -77,7 +77,7 @@ Type
);
Const
mplVer = '11B';
mplVer = '11C';
mplVersion = '[MPX ' + mplVer +']' + #26;
mplVerLength = 10;
mplExtSource = '.mps';

View File

@ -22,6 +22,7 @@
; - Mass upload files to all file bases (with FILE_ID.DIZ import)
; - Generate Top 1 up to 99 Callers, Posters, Downloaders, Uploaders, PCR
; - Import FILES.BBS into file bases
; - Generate all files listing
;
; ==========================================================================
; ==========================================================================
@ -41,11 +42,11 @@
Import_FIDONET.NA = false
Import_FILEBONE.NA = false
Import_FILES.BBS = false
MassUpload = false
MassUpload = true
GenerateTopLists = false
GenerateAllFiles = false
; WIP next to be added:
GenerateAllFiles = true
; work in progress below
PurgeMessageBases = false
PackMessageBases = false
@ -262,14 +263,14 @@
[GenerateAllFiles]
; Generate all files list [NOT COMPLETED]
; Generate all files list
; Path / filename of output filename. If the path is not included then the
; file will be created in whatever the current working directory is.
filename = allfiles.txt
; features needed:
; ideas/features for the future?
; header, footer, baseheader, basefooter, exclude bases, uploader optional
; uploader line, format list line 1st,2nd line, space between files?

View File

@ -9,19 +9,133 @@ Procedure uAllFilesList;
Implementation
Uses
m_DateTime,
m_Strings,
m_FileIO,
mUtil_Common,
mUtil_Status;
Const
AddedFiles : Cardinal = 0;
TotalFiles : Cardinal = 0;
TotalSize : Cardinal = 0;
TotalBases : Cardinal = 0;
BaseFiles : Cardinal = 0;
BaseSize : Cardinal = 0;
Procedure uAllFilesList;
Var
OutFile : Text;
Buffer : Array[1..1024 * 4] of Char;
BaseFile : File of RecFileBase;
ListFile : File of RecFileList;
DescFile : File;
Base : RecFileBase;
List : RecFileList;
DescStr : String[50];
Count : LongInt;
Begin
ProcessName ('Generating AllFiles List', True);
ProcessResult (rWORKING, False);
ProcessStatus ('Added |15' + strI2S(AddedFiles) + ' |07file(s)');
Assign (OutFile, INI.ReadString(Header_ALLFILES, 'filename', 'allfiles.txt'));
SetTextBuf (OutFile, Buffer);
ReWrite (OutFile);
If IoResult <> 0 Then Begin
ProcessStatus ('Cannot create output file');
ProcessResult (rWARN, True);
Exit;
End;
Assign (BaseFile, bbsConfig.DataPath + 'fbases.dat');
If Not ioReset (BaseFile, SizeOf(RecFileBase), fmRWDN) Then Begin
ProcessStatus ('Cannot open fbases.dat');
ProcessResult (rWARN, True);
Close (OutFile);
Exit;
End;
While Not Eof(BaseFile) Do Begin
BaseFiles := 0;
BaseSize := 0;
Read (BaseFile, Base);
// If Excludedbase then continue;
Assign (ListFile, bbsConfig.DataPath + Base.FileName + '.dir');
Assign (DescFile, bbsConfig.DataPath + Base.FileName + '.des');
If Not ioReset (ListFile, SizeOf(RecFileList), fmRWDN) Then Continue;
If Not ioReset (DescFile, 1, fmRWDN) Then Begin
Close (ListFile);
Continue;
End;
While Not Eof(ListFile) Do Begin
Read (ListFile, List);
If List.Flags AND FDirDeleted <> 0 Then Continue;
// check exclude offline, exclude failed, etc
If BaseFiles = 0 Then Begin
Inc (TotalBases);
WriteLn (OutFile, '');
WriteLn (OutFile, strStripPipe(Base.Name));
WriteLn (OutFile, strRep('=', strMCILen(Base.Name)));
WriteLn (OutFile, '');
WriteLn (OutFile, 'Filename Size Date Description');
WriteLn (OutFile, strrep('-', 79));
End;
Inc (BaseFiles);
Inc (TotalFiles);
Inc (BaseSize, List.Size DIV 1024);
Inc (TotalSize, List.Size DIV 1024);
WriteLn (OutFile, List.FileName);
Write (OutFile, ' ' + strPadL(strComma(List.Size), 11, ' ') + ' ' + DateDos2Str(List.DateTime, 1 {dateformat}) + ' ');
Seek (DescFile, List.DescPtr);
For Count := 1 to List.DescLines Do Begin
BlockRead (DescFile, DescStr[0], 1);
BlockRead (DescFile, DescStr[1], Ord(DescStr[0]));
If Count = 1 Then
WriteLn (OutFile, DescStr)
Else
WriteLn (OutFile, strRep(' ', 27) + DescStr);
End;
End;
Close (ListFile);
Close (DescFile);
If BaseFiles > 0 Then Begin
WriteLn (OutFile, strRep('-', 79));
WriteLn (OutFile, 'Total files: ' + strComma(BaseFiles) + ' (' + strComma(BaseSize DIV 1024) + 'mb)');
End;
End;
If TotalFiles > 0 Then Begin
WriteLn (OutFile, '');
WriteLn (OutFile, '* Total bases: ' + strComma(TotalBases));
WriteLn (OutFile, '* Total files: ' + strComma(TotalFiles));
WriteLn (OutFile, '* Total size: ' + strComma(TotalSize DIV 1024) + 'mb');
End;
Close (BaseFile);
Close (OutFile);
ProcessStatus ('Added |15' + strI2S(TotalFiles) + ' |07file(s)');
ProcessResult (rDONE, True);
End;

View File

@ -228,7 +228,7 @@ Begin
Read (ArcFile, Arc);
If (Not Arc.Active) or (Arc.OSType <> OSType) Then Continue;
If (Not Arc.Active) or ((Arc.OSType <> OSType) and (Arc.OSType <> 3)) Then Continue;
If strUpper(Arc.Ext) = Temp Then Break;
Until False;

View File

@ -53,7 +53,7 @@ Const
UpdateNode = 500;
UpdateStats = 6000 * 10; // 10 minutes
AutoSnoop : Boolean = True;
AutoSnoop : Boolean = False;
AutoSnoopID : LongInt = 0;
Type
@ -613,6 +613,8 @@ Begin
Client := TIOSocket.Create;
Client.FTelnetClient := True;
If Not Client.Connect('127.0.0.1', Config.INetTNPort) Then
ShowMsgBox (0, 'Unable to connect')
Else Begin

View File

@ -64,6 +64,8 @@ Const
fn_SemFileEcho = 'echomail.now';
fn_SemFileNews = 'newsmail.now';
fn_SemFileNet = 'netmail.now';
fn_tplMsgEdit = 'ansiedit';
fn_tplTextEdit = 'ansitext';
Type
SmallWord = System.Word;

View File

@ -14,18 +14,16 @@ BUGS AND POSSIBLE ISSUES
! After data file review, add missing variables to various MPL Get/Put
functions.
! RAR internal viewer does not work with files that have embedded comments
! Investigate strange crashing when Mystic is built in the FPC editor vs
the makewin script. Something is out of whack with compiler options? OR
FPC BUG? DirAttr is suspect in MPL is it 1 byte or 4 in size?
! View archive not working if its external view? [Griffin]
! Test MIS blocking features or just rewrite MIS completely.
! Test midnight rollovers for time (flag for user to be immune to timecheck)
! Elasped time will need to be recalculated based on flag above ^^
! Validate that "groupX.ans" and "fgroupX.ans" actually work.
! Test NNTP with Thunderbird specifically FUBAR dates on messages.
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
=========================================
- Auto wrapping of quotes before the FS editor gets to it.
- Finish Threaded message reader
- Add "high roller Smack talk" into BlackJack
- Add better MIS logging per server (connect, refuse, blocked, etc)
- BBS email autoforwarded to Internet email
- Ability to send internet email to people from within the BBS.
@ -74,6 +72,8 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
- Template system similar to Mystic 2 (ansiedit.ans ansiedit.ans.cfg)
- Rename Template filenames to allow more than 8 characters (for clarity)
- Does anyone use Version 7 compiled nodelists? Worth supporting?
How do other softwares leverage nodelists? Reference TG, RG, RA,
SearchLight, PCBoard, etc, and come up with the best solution.
- ANSI message upload post processor option: Auto/Disabled/Ask
- Prompt for disconect after UL or DL (and add option to filebase settings)
- Finish optional user prompts
@ -92,6 +92,7 @@ FUTURE / IDEAS / WORK IN PROGRESS / NOTES
- ^^ AREAFIX
- ^^ TIC processing
- ^^ Needs to be powerful enough to HUB an entire FTN network
- QWK Networking support internally WHO CAN HELP THIS HAPPEN?
- MPL trunc/round?
- Internal Zmodem and TN/Link protocols or at least MBBSPROT executable
^^ driver that ships with Mystic and can be used by others.
@ -119,6 +120,7 @@ Disconnect while posting design:
Line 5: Network address (or blank if none)
Line 6: MsgText
overwrite if exists
NOTE WHAT ABOUT QUOTE TEXT
5. During LOGIN, check for msg_<UID>.txt or have menu command to do it?
6. If exists, process and prompt user:
@ -163,9 +165,9 @@ mode library updates and screensave/restore changes)
1. terminal "screen length" is no longer an option of lines but a
selection:
80x25
80x50
132x50
80x24
80x49
132x49
2. all display files and templates will have this logic added:
@ -193,7 +195,7 @@ ansiflst.50.an1 = ansiflist.50.an1.cfg
FILE rating / comments system
1. what type? 4 or 5 start or 0-100 rating system?
1. what type? 4 or 5 stars, or 1-10, or 0-100 rating system?
2. records already updated to allow for either
-----------------------------------------------------------------------