Updates
This commit is contained in:
parent
dcf2911fa1
commit
f8a6bd6cb4
|
@ -70,7 +70,6 @@ Type
|
|||
Private
|
||||
Procedure EditPercentBar (Var Bar: RecPercent);
|
||||
Function GetColorAttr (C: Byte) : Byte;
|
||||
Function DrawAccessFlags (Var Flags: TMenuFormFlagsRec) : String;
|
||||
Procedure EditAccessFlags (Var Flags: TMenuFormFlagsRec);
|
||||
Procedure AddBasic (HK: Char; D: String; X, Y, FX, FY, DS, FS, MS: Byte; I: FormItemType; P: Pointer; H: String);
|
||||
Procedure BarON;
|
||||
|
@ -221,19 +220,6 @@ Begin
|
|||
Box.Free;
|
||||
End;
|
||||
|
||||
Function TAnsiMenuForm.DrawAccessFlags (Var Flags: TMenuFormFlagsRec) : String;
|
||||
Var
|
||||
Str : String;
|
||||
Ch : Char;
|
||||
Begin
|
||||
Str := '';
|
||||
|
||||
For Ch := 'A' to 'Z' Do
|
||||
If Ord(Ch) - 64 in Flags Then Str := Str + Ch Else Str := Str + '-';
|
||||
|
||||
Result := Str;
|
||||
End;
|
||||
|
||||
Procedure TAnsiMenuForm.EditAccessFlags (Var Flags: TMenuFormFlagsRec);
|
||||
Var
|
||||
Box : TAnsiMenuBox;
|
||||
|
@ -552,7 +538,7 @@ Begin
|
|||
ItemByte : WriteXY (FieldX, FieldY, cData, strPadR(strI2S(B^), FieldSize, ' '));
|
||||
ItemWord : WriteXY (FieldX, FieldY, cData, strPadR(strI2S(W^), FieldSize, ' '));
|
||||
ItemLong : WriteXY (FieldX, FieldY, cData, strPadR(strI2S(L^), FieldSize, ' '));
|
||||
ItemToggle : WriteXY (FieldX, FieldY, cData, StrPadR(strWordGet(B^ + 1 - MinNum, Toggle, ' '), FieldSize, ' '));
|
||||
ItemToggle : WriteXY (FieldX, FieldY, cData, StrPadR(strReplace(strWordGet(B^ + 1 - MinNum, Toggle, ' '), '_', ' '), FieldSize, ' '));
|
||||
ItemChar : WriteXY (FieldX, FieldY, cData, C^);
|
||||
ItemAttr : WriteXY (FieldX, FieldY, B^, ' Sample ');
|
||||
ItemFlags : WriteXY (FieldX, FieldY, cData, DrawAccessFlags(F^));
|
||||
|
|
|
@ -30,7 +30,7 @@ Type
|
|||
End;
|
||||
|
||||
Const
|
||||
Num_Cmds = 101;
|
||||
Num_Cmds = 102;
|
||||
MenuCmds : Array[1..Num_Cmds] of CmdRec = (
|
||||
// AUTOSIG MENU COMMANDS
|
||||
( Name: 'AE'; Desc: 'Autosig editor' ),
|
||||
|
@ -145,6 +145,7 @@ Const
|
|||
( Name: '-N'; Desc: 'Ask Yes/No (default No)' ),
|
||||
( Name: '-P'; Desc: 'Prompt for a password' ),
|
||||
( Name: '-S'; Desc: 'Add text to Sysop log' ),
|
||||
( Name: '-R'; Desc: 'Reset OK ACS flags' ),
|
||||
( Name: '-Y'; Desc: 'Ask Yes/No (default Yes)' ),
|
||||
|
||||
// SYSOP/EDITORS MENU COMMANDS
|
||||
|
|
|
@ -691,11 +691,11 @@ Begin
|
|||
Box := TAnsiMenuBox.Create;
|
||||
Form := TAnsiMenuForm.Create;
|
||||
|
||||
Box.Open (5, 5, 75, 17);
|
||||
Box.Open (5, 5, 75, 18);
|
||||
|
||||
Box.Header := ' Theme Edit ';
|
||||
|
||||
VerticalLine (23, 7, 15);
|
||||
VerticalLine (23, 7, 16);
|
||||
|
||||
Form.AddStr ('F', ' File Name' , 12, 7, 25, 7, 11, 20, 20, @Theme.FileName, Topic + 'Root theme filename');
|
||||
Form.AddStr ('D', ' Description' , 10, 8, 25, 8, 13, 30, 40, @Theme.Desc, Topic + 'Theme description');
|
||||
|
@ -706,6 +706,7 @@ Begin
|
|||
Form.AddBits ('F', ' Allow Fallback' , 7, 13, 25, 13, 16, ThmFallback, @Theme.Flags, Topic + 'Allow fallback to default paths?');
|
||||
Form.AddBits ('C', ' Allow ASCII' , 10, 14, 25, 14, 13, ThmAllowASCII, @Theme.Flags, Topic + 'Allow ASCII users to use this theme?');
|
||||
Form.AddBits ('N', ' Allow ANSI' , 11, 15, 25, 15, 12, ThmAllowANSI, @Theme.Flags, Topic + 'Allow ANSI users to use this theme?');
|
||||
Form.AddTog ('O', ' Column Size' , 10, 16, 25, 16, 13, 9, 0, 1, '80_Column 40_Column', @Theme.ColumnSize, Topic + 'Column size of this theme');
|
||||
|
||||
Form.AddNone ('1', ' 1: Prompts' , 57, 7, 57, 7, 17, Topic + 'Edit prompts for this theme');
|
||||
Form.AddNone ('2', ' 2: Options' , 57, 8, 57, 8, 17, Topic + 'Edit general options for this theme');
|
||||
|
|
|
@ -335,6 +335,8 @@ Begin
|
|||
|
||||
Configuration_EditUser (Session.User.ThisUser);
|
||||
|
||||
Screen.WriteXY (1, 24, 7, strRep(' ', 80));
|
||||
|
||||
Session.InUserEdit := False;
|
||||
Session.LocalMode := SavedLocal;
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ Uses
|
|||
|
||||
Const
|
||||
WinConsoleTitle = mysSoftwareID + ' Node ';
|
||||
CopyID = 'Copyright (C) ' + mysCopyYear + ' By James Coyle. All Rights Reserved.';
|
||||
CopyID = 'Copyright (C) ' + mysCopyYear + ' By James Coyle';
|
||||
DateTypeStr : Array[1..4] of String[8] = ('MM/DD/YY', 'DD/MM/YY', 'YY/DD/MM', 'Ask ');
|
||||
|
||||
Var
|
||||
|
@ -44,6 +44,7 @@ Var
|
|||
Config : RecConfig;
|
||||
StatusPtr : Byte = 1;
|
||||
|
||||
Function DrawAccessFlags (Var Flags: AccessFlagType) : String;
|
||||
Procedure KillRecord (Var dFile; RecNum: LongInt; RecSize: Word);
|
||||
Procedure AddRecord (var dFile; RecNum: LongInt; RecSize: Word);
|
||||
Function Bool_Search (Mask: String; Str: String) : Boolean;
|
||||
|
@ -68,6 +69,19 @@ Uses
|
|||
bbs_General,
|
||||
MPL_Execute;
|
||||
|
||||
Function DrawAccessFlags (Var Flags: AccessFlagType) : String;
|
||||
Var
|
||||
Ch : Char;
|
||||
Begin
|
||||
Result := '';
|
||||
|
||||
For Ch := 'A' to 'Z' Do
|
||||
If Ord(Ch) - 64 in Flags Then
|
||||
Result := Result + Ch
|
||||
Else
|
||||
Result := Result + '-';
|
||||
End;
|
||||
|
||||
Procedure AddRecord (var dFile; RecNum: LongInt; RecSize: Word);
|
||||
Var
|
||||
F : File Absolute dFile;
|
||||
|
@ -239,58 +253,36 @@ End;
|
|||
|
||||
{$IFNDEF UNIX}
|
||||
Procedure UpdateStatusLine (Mode: Byte; Str: String);
|
||||
|
||||
Function DrawAccessFlags (Var Flags : AccessFlagType) : String;
|
||||
Var
|
||||
S : String;
|
||||
Ch : Char;
|
||||
Begin
|
||||
S := '';
|
||||
|
||||
For Ch := 'A' to 'Z' Do
|
||||
If Ord(Ch) - 64 in Flags Then S := S + Ch Else S := S + '-';
|
||||
|
||||
Result := S;
|
||||
End;
|
||||
|
||||
Begin
|
||||
If Not Config.UseStatusBar Then Exit;
|
||||
|
||||
Screen.SetWindow (1, 1, 80, 25, False);
|
||||
|
||||
Case Mode of
|
||||
0 : Screen.WriteXY (1, 25, 120, strPadC(Str, 80, ' '));
|
||||
0 : Screen.WriteXY (1, 25, Config.StatusColor3, strPadC(Str, 80, ' '));
|
||||
1 : Begin
|
||||
Screen.WriteXY ( 1, 25, 112, ' [Alias] [Baud] [Sec] [Time] ');
|
||||
Screen.WriteXY (10, 25, 112, Session.User.ThisUser.Handle);
|
||||
Screen.WriteXY (48, 25, 112, strI2S(Session.Baud));
|
||||
Screen.WriteXY (63, 25, 112, strI2S(Session.User.ThisUser.Security));
|
||||
Screen.WriteXY (76, 25, 112, strI2S(Session.TimeLeft));
|
||||
Screen.WriteXY ( 1, 25, Config.StatusColor1, ' Alias ' + strRep(' ', 35) + 'Age SecLevel TimeLeft ');
|
||||
Screen.WriteXY ( 8, 25, Config.StatusColor2, Session.User.ThisUser.Handle);
|
||||
Screen.WriteXY (47, 25, Config.StatusColor2, Session.User.ThisUser.Gender + '/' + strI2S(DaysAgo(Session.User.ThisUser.Birthday, 1) DIV 365));
|
||||
Screen.WriteXY (62, 25, Config.StatusColor2, strI2S(Session.User.ThisUser.Security));
|
||||
Screen.WriteXY (76, 25, Config.StatusColor2, strI2S(Session.TimeLeft));
|
||||
End;
|
||||
2 : Begin
|
||||
Screen.WriteXY ( 1, 25, 112, ' [Name] [Flag1] ');
|
||||
Screen.WriteXY ( 9, 25, 112, Session.User.ThisUser.RealName);
|
||||
Screen.WriteXY (48, 25, 112, DrawAccessFlags(Session.User.ThisUser.AF1));
|
||||
Screen.WriteXY ( 1, 25, Config.StatusColor1, ' Email ' + strRep(' ', 35) + ' Location ' + strRep(' ', 27) + ' ');
|
||||
Screen.WriteXY ( 8, 25, Config.StatusColor2, strPadR(Session.User.ThisUser.Email, 36, ' '));
|
||||
Screen.WriteXY (53, 25, Config.StatusColor2, strPadR(Session.User.ThisUser.City, 27, ' '));
|
||||
End;
|
||||
3 : Begin
|
||||
Screen.WriteXY ( 1, 25, 112, ' [Address] ');
|
||||
Screen.WriteXY (12, 25, 112, Session.User.ThisUser.Address);
|
||||
Screen.WriteXY (43, 25, 112, Session.User.ThisUser.City);
|
||||
Screen.WriteXY (69, 25, 112, Session.User.ThisUser.ZipCode);
|
||||
Screen.WriteXY ( 1, 25, Config.StatusColor1, ' IP ' + strRep(' ', 19) + ' Host ' + strRep(' ', 49) + ' ');
|
||||
Screen.WriteXY ( 5, 25, Config.StatusColor2, Session.UserIPInfo);
|
||||
Screen.WriteXY (31, 25, Config.StatusColor2, strPadR(Session.UserHostInfo, 49, ' '));
|
||||
End;
|
||||
4 : Begin
|
||||
Screen.WriteXY ( 1, 25, 112, ' [BDay] [Sex] [Home PH] [Data PH] ');
|
||||
Screen.WriteXY ( 9, 25, 112, DateDos2Str(Session.User.ThisUser.Birthday, Session.User.ThisUser.DateType));
|
||||
Screen.WriteXY (25, 25, 112, Session.User.ThisUser.Gender);
|
||||
Screen.WriteXY (39, 25, 112, Session.User.ThisUser.HomePhone);
|
||||
Screen.WriteXY (65, 25, 112, Session.User.ThisUser.DataPhone);
|
||||
Screen.WriteXY ( 1, 25, Config.StatusColor1, ' Flags 1 ' + strRep(' ', 35) + ' Flags 2 ');
|
||||
Screen.WriteXY (10, 25, Config.StatusColor2, DrawAccessFlags(Session.User.ThisUser.AF1));
|
||||
Screen.WriteXY (54, 25, Config.StatusColor2, DrawAccessFlags(Session.User.ThisUser.AF2));
|
||||
End;
|
||||
5 : Begin
|
||||
Screen.WriteXY ( 1, 25, 112, ' [Email] [Flag2] ');
|
||||
Screen.WriteXY (10, 25, 112, Session.User.ThisUser.Email);
|
||||
Screen.WriteXY (54, 25, 112, DrawAccessFlags(Session.User.ThisUser.AF2));
|
||||
End;
|
||||
6 : Screen.WriteXY ( 1, 25, 112, ' ALT (C)hat (S)plit (E)dit (H)angup (J) DOS (U)pgrade (B) Status Bar ');
|
||||
5 : Screen.WriteXY (1, 25, Config.StatusColor3, ' ALTS/C Chat ALTE Edit ALTH Hangup ALT+/- Time ALTB Info ALTT Bar ALTV Screen ');
|
||||
End;
|
||||
|
||||
Screen.SetWindow (1, 1, 80, 24, False);
|
||||
|
@ -323,7 +315,7 @@ Begin
|
|||
Else
|
||||
Session.io.LocalScreenEnable;
|
||||
{B} #48 : Begin
|
||||
If StatusPtr < 6 Then
|
||||
If StatusPtr < 5 Then
|
||||
Inc (StatusPtr)
|
||||
Else
|
||||
StatusPtr := 1;
|
||||
|
|
|
@ -29,55 +29,59 @@ Type
|
|||
{$IFNDEF UNIX}
|
||||
Client : TIOBase;
|
||||
{$ENDIF}
|
||||
User : TBBSUser;
|
||||
Msgs : TMsgBase;
|
||||
FileBase : TFileBase;
|
||||
Menu : TMenuEngine;
|
||||
IO : TBBSIO;
|
||||
Pipe : TPipe;
|
||||
EventFile : File of EventRec;
|
||||
ThemeFile : File of RecTheme;
|
||||
VoteFile : File of VoteRec;
|
||||
Vote : VoteRec;
|
||||
CommHandle : LongInt;
|
||||
ShutDown : Boolean;
|
||||
TempPath : String;
|
||||
Event : EventRec;
|
||||
NextEvent : EventRec;
|
||||
Theme : RecTheme;
|
||||
LocalMode : Boolean;
|
||||
Baud : LongInt;
|
||||
ExitLevel : Byte;
|
||||
EventWarn : Boolean;
|
||||
EventExit : Boolean;
|
||||
EventRunAfter : Boolean;
|
||||
NodeNum : Byte;
|
||||
TimerStart : Integer;
|
||||
TimerEnd : Integer;
|
||||
LastTimeLeft : Integer;
|
||||
TimeOut : LongInt;
|
||||
UserHostInfo : String[50];
|
||||
UserIPInfo : String[15];
|
||||
CheckTimeOut : Boolean;
|
||||
TimeOffset : Word;
|
||||
TimeSaved : Word;
|
||||
TimerOn : Boolean;
|
||||
TimeChecked : Boolean;
|
||||
ConfigMode : Boolean;
|
||||
InUserEdit : Boolean;
|
||||
AllowMessages : Boolean;
|
||||
InMessage : Boolean;
|
||||
MessageCheck : Byte;
|
||||
HistoryFile : File of RecHistory;
|
||||
HistoryEmails : Word;
|
||||
HistoryPosts : Word;
|
||||
HistoryDLs : Word;
|
||||
HistoryDLKB : LongInt;
|
||||
HistoryULs : Word;
|
||||
HistoryULKB : LongInt;
|
||||
HistoryHour : SmallInt;
|
||||
PromptFile : File of RecPrompt;
|
||||
Prompt : RecPrompt;
|
||||
User : TBBSUser;
|
||||
Msgs : TMsgBase;
|
||||
FileBase : TFileBase;
|
||||
Menu : TMenuEngine;
|
||||
IO : TBBSIO;
|
||||
Pipe : TPipe;
|
||||
EventFile : File of EventRec;
|
||||
ThemeFile : File of RecTheme;
|
||||
VoteFile : File of VoteRec;
|
||||
Vote : VoteRec;
|
||||
CommHandle : LongInt;
|
||||
ShutDown : Boolean;
|
||||
TempPath : String;
|
||||
Event : EventRec;
|
||||
NextEvent : EventRec;
|
||||
Theme : RecTheme;
|
||||
LocalMode : Boolean;
|
||||
Baud : LongInt;
|
||||
ExitLevel : Byte;
|
||||
EventWarn : Boolean;
|
||||
EventExit : Boolean;
|
||||
EventRunAfter : Boolean;
|
||||
NodeNum : Byte;
|
||||
TimerStart : Integer;
|
||||
TimerEnd : Integer;
|
||||
LastTimeLeft : Integer;
|
||||
TimeOut : LongInt;
|
||||
UserLoginName : String[30];
|
||||
UserLoginPW : String[15];
|
||||
UserHostInfo : String[50];
|
||||
UserIPInfo : String[15];
|
||||
CheckTimeOut : Boolean;
|
||||
TimeOffset : Word;
|
||||
TimeSaved : Word;
|
||||
TimerOn : Boolean;
|
||||
TimeChecked : Boolean;
|
||||
ConfigMode : Boolean;
|
||||
InUserEdit : Boolean;
|
||||
AllowMessages : Boolean;
|
||||
InMessage : Boolean;
|
||||
MessageCheck : Byte;
|
||||
HistoryFile : File of RecHistory;
|
||||
HistoryEmails : Word;
|
||||
HistoryPosts : Word;
|
||||
HistoryDLs : Word;
|
||||
HistoryDLKB : LongInt;
|
||||
HistoryULs : Word;
|
||||
HistoryULKB : LongInt;
|
||||
HistoryHour : SmallInt;
|
||||
PromptFile : File of RecPrompt;
|
||||
Prompt : RecPrompt;
|
||||
LastScanHadNew : Boolean;
|
||||
LastScanHadYou : Boolean;
|
||||
|
||||
Constructor Create;
|
||||
Destructor Destroy; Override;
|
||||
|
@ -118,6 +122,8 @@ Begin
|
|||
EventExit := False;
|
||||
EventRunAfter := False;
|
||||
NodeNum := 0;
|
||||
UserLoginName := '';
|
||||
UserLoginPW := '';
|
||||
UserHostInfo := '';
|
||||
UserIPInfo := '';
|
||||
CheckTimeOut := True;
|
||||
|
|
|
@ -834,7 +834,7 @@ Begin
|
|||
#77 : If CurX <= RowSize Then Inc(CurX);
|
||||
#73 : PageUp;
|
||||
#81 : PageDown;
|
||||
#83 : DoDelete;
|
||||
#83 : DoDelete;
|
||||
End;
|
||||
End Else
|
||||
Case Ch of
|
||||
|
|
|
@ -475,6 +475,7 @@ Begin
|
|||
Start := strS2I(Session.io.GetInput(3, 3, 11, ''));
|
||||
|
||||
Session.io.OutFull (Session.GetPrompt(160));
|
||||
|
||||
Finish := strS2I(Session.io.GetInput(3, 3, 11, ''));
|
||||
|
||||
If (Start > 0) and (Start <= NumLines) and (Finish <= NumLines) Then Begin
|
||||
|
|
|
@ -87,9 +87,12 @@ Function LineEditor (Var Lines : Integer; MaxLen: Byte; MaxLine: Integer; TEdit,
|
|||
Begin
|
||||
Done := False;
|
||||
Save := False;
|
||||
|
||||
Repeat
|
||||
Session.io.OutFull (Session.GetPrompt(166));
|
||||
|
||||
Ch := Session.io.OneKey ('?ACQRSU', True);
|
||||
|
||||
Case Ch of
|
||||
'?' : Session.io.OutFullLn (Session.GetPrompt(167));
|
||||
'A' : If Forced Then Begin
|
||||
|
@ -144,9 +147,13 @@ Function LineEditor (Var Lines : Integer; MaxLen: Byte; MaxLine: Integer; TEdit,
|
|||
Dec(Session.Msgs.MsgText[CurLine][0]);
|
||||
End Else If CurLine > 1 Then Begin
|
||||
Dec(CurLine);
|
||||
|
||||
Session.io.PromptInfo[1] := strI2S(CurLine);
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(165));
|
||||
|
||||
Session.io.OutRaw (Session.Msgs.MsgText[CurLine]);
|
||||
|
||||
If Session.Msgs.MsgText[CurLine] <> '' Then Begin
|
||||
Session.io.OutBS(1, True);
|
||||
Dec(Session.Msgs.MsgText[CurLine][0]);
|
||||
|
@ -155,6 +162,7 @@ Function LineEditor (Var Lines : Integer; MaxLen: Byte; MaxLine: Integer; TEdit,
|
|||
#13 : Begin
|
||||
If CurLine < MaxLine Then Begin
|
||||
Inc(CurLine);
|
||||
|
||||
Session.io.OutRaw (#13#10);
|
||||
End;
|
||||
End;
|
||||
|
@ -163,15 +171,18 @@ Function LineEditor (Var Lines : Integer; MaxLen: Byte; MaxLine: Integer; TEdit,
|
|||
Commands;
|
||||
If (Not Save) and (Not Done) Then FullReDraw;
|
||||
End Else
|
||||
If Ch in [#32..#254] Then Begin
|
||||
If Ch in [#32..#254] Then Begin
|
||||
If Length(Session.Msgs.MsgText[Curline]) < MaxLen Then Begin
|
||||
Session.Msgs.MsgText[CurLine] := Session.Msgs.MsgText[CurLine] + Ch;
|
||||
|
||||
Session.io.BufAddChar (Ch);
|
||||
End;
|
||||
If (Length(Session.Msgs.MsgText[CurLine]) > MaxLen-1) and (CurLine < MaxLine) Then Begin
|
||||
strWrap (Session.Msgs.MsgText[CurLine], Session.Msgs.MsgText[Succ(CurLine)], MaxLen);
|
||||
Inc(CurLine);
|
||||
Session.io.OutBS (Length(Session.Msgs.MsgText[CurLine]), True);
|
||||
|
||||
Inc (CurLine);
|
||||
|
||||
Session.io.OutBS (Length(Session.Msgs.MsgText[CurLine]), True);
|
||||
Session.io.OutRawLn ('');
|
||||
Session.io.OutRaw (Session.Msgs.MsgText[CurLine]);
|
||||
End;
|
||||
|
@ -196,7 +207,7 @@ Begin
|
|||
GetText;
|
||||
|
||||
If Save Then Begin
|
||||
Lines := CurLine - 1;
|
||||
Lines := CurLine - 1;
|
||||
LineEditor := True;
|
||||
End Else
|
||||
LineEditor := False;
|
||||
|
|
|
@ -637,11 +637,13 @@ Begin
|
|||
If Not Session.io.GetYN (Session.GetPrompt(275), True) Then Exit;
|
||||
|
||||
Reset (Session.VoteFile);
|
||||
|
||||
If FileSize (Session.VoteFile) = mysMaxVoteQuestion Then Begin
|
||||
Close (Session.VoteFile);
|
||||
Session.io.OutFull (Session.GetPrompt(276));
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Close (Session.VoteFile);
|
||||
|
||||
Session.io.OutFull (Session.GetPrompt(277));
|
||||
|
@ -657,11 +659,14 @@ Begin
|
|||
Session.io.PromptInfo[1] := strI2S(A);
|
||||
Session.io.OutFull (Session.GetPrompt(279));
|
||||
Session.Vote.Answer[A].Text := Session.io.GetInput(40, 40, 11, '');
|
||||
|
||||
If Session.Vote.Answer[A].Text = '' Then Begin
|
||||
Dec (A);
|
||||
Break;
|
||||
End;
|
||||
|
||||
Session.Vote.Answer[A].Votes := 0;
|
||||
|
||||
Inc(A);
|
||||
End;
|
||||
|
||||
|
@ -697,10 +702,13 @@ Begin
|
|||
|
||||
While Not Eof(Session.VoteFile) Do Begin
|
||||
Read (Session.VoteFile, Session.Vote);
|
||||
|
||||
If Session.User.Access(Session.Vote.ACS) Then Begin
|
||||
Inc (Total);
|
||||
|
||||
Session.io.PromptInfo[1] := strI2S(Total);
|
||||
Session.io.PromptInfo[2] := Session.Vote.Question;
|
||||
|
||||
If Session.User.ThisUser.Vote[FilePos(Session.VoteFile)] = 0 Then
|
||||
Session.io.PromptInfo[3] := '*' //++lang
|
||||
Else
|
||||
|
@ -708,9 +716,11 @@ Begin
|
|||
Session.io.OutFullLn (Session.GetPrompt(242));
|
||||
End;
|
||||
End;
|
||||
|
||||
Close (Session.VoteFile);
|
||||
|
||||
If Total = 0 Then Session.io.OutFullLn (Session.GetPrompt(243));
|
||||
|
||||
Voting_List := Total;
|
||||
End;
|
||||
|
||||
|
@ -727,6 +737,7 @@ Begin
|
|||
Close (Session.VoteFile);
|
||||
End Else Begin
|
||||
A := Voting_List;
|
||||
|
||||
If A = 0 Then Exit;
|
||||
|
||||
Repeat
|
||||
|
@ -748,11 +759,14 @@ Begin
|
|||
|
||||
Session.io.PromptInfo[1] := Session.Vote.Question;
|
||||
Session.io.PromptInfo[2] := strI2S(Session.Vote.Votes);
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(249));
|
||||
|
||||
For A := 1 to Session.Vote.AnsNum Do Begin
|
||||
Session.io.PromptInfo[1] := strI2S(A);
|
||||
Session.io.PromptInfo[2] := Session.Vote.Answer[A].Text;
|
||||
Session.io.PromptInfo[3] := strI2S(Session.Vote.Answer[A].Votes);
|
||||
|
||||
If Session.Vote.Votes = 0 Then Begin
|
||||
Session.io.PromptInfo[4] := '0';
|
||||
Session.io.PromptInfo[5] := '';
|
||||
|
@ -760,8 +774,10 @@ Begin
|
|||
Session.io.PromptInfo[5] := Session.io.DrawPercent(Session.Theme.VotingBar, Session.Vote.Answer[A].Votes, Session.Vote.Votes, P);
|
||||
Session.io.PromptInfo[4] := strI2S(P);
|
||||
End;
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(250));
|
||||
End;
|
||||
|
||||
Session.io.OutFull (Session.GetPrompt(251));
|
||||
End;
|
||||
|
||||
|
@ -771,6 +787,7 @@ Var
|
|||
Pos : Byte;
|
||||
Begin
|
||||
Reset (Session.VoteFile);
|
||||
|
||||
While Not Eof(Session.VoteFile) Do Begin
|
||||
Read (Session.VoteFile, Session.Vote);
|
||||
If Session.User.Access(Session.Vote.ACS) Then
|
||||
|
@ -778,6 +795,7 @@ Begin
|
|||
Else
|
||||
NewQues[FilePos(Session.VoteFile)] := False;
|
||||
End;
|
||||
|
||||
Close (Session.VoteFile);
|
||||
|
||||
For Pos := 1 to mysMaxVoteQuestion Do
|
||||
|
@ -794,6 +812,7 @@ Begin
|
|||
|
||||
If Not Forced And (Num = 0) Then Begin
|
||||
Total := Voting_List;
|
||||
|
||||
If Total = 0 Then Exit;
|
||||
|
||||
Repeat
|
||||
|
@ -1258,6 +1277,8 @@ Begin
|
|||
UseFull := Not (strUpper(strWordGet(3, Data, ';')) = 'DISPLAY');
|
||||
CurPath := Root;
|
||||
|
||||
If Not DirExists(Root) Then Exit;
|
||||
|
||||
BuildDirectory(CurPath);
|
||||
|
||||
FullReDraw;
|
||||
|
@ -1381,7 +1402,7 @@ Begin
|
|||
Session.io.AnsiClear;
|
||||
|
||||
If UseFull Then
|
||||
AnsiViewer (Session.Theme.ViewerBar, 'ansigalv;dummy;' + CurPath + DirList[CurPos]^.Desc)
|
||||
AnsiViewer (Session.Theme.ViewerBar, 'ansigalv;ansigalh;' + strI2S(Speed) + ';' + CurPath + DirList[CurPos]^.Desc)
|
||||
Else Begin
|
||||
Session.io.OutFile (CurPath + DirList[CurPos]^.Desc, False, Speed);
|
||||
Session.io.PauseScreen;
|
||||
|
@ -1485,6 +1506,7 @@ Var
|
|||
FN : String;
|
||||
Template : String;
|
||||
HelpFile : String;
|
||||
Speed : Byte;
|
||||
Str : String;
|
||||
Sauce : RecSauceInfo;
|
||||
|
||||
|
@ -1503,10 +1525,30 @@ Var
|
|||
Ansi.DrawPage (Session.io.ScreenInfo[1].Y, Session.io.ScreenInfo[2].Y, TopLine);
|
||||
End;
|
||||
|
||||
Procedure ReDraw;
|
||||
Begin
|
||||
Session.io.AllowArrow := True;
|
||||
Session.io.ScreenInfo[3].X := 0;
|
||||
|
||||
Session.io.OutFile(Template, False, 0);
|
||||
|
||||
WinSize := Session.io.ScreenInfo[2].Y - Session.io.ScreenInfo[1].Y + 1;
|
||||
|
||||
If strUpper(strWordGet(4, Data, ';')) = 'END' Then Begin
|
||||
TopLine := Ansi.Lines - WinSize + 1;
|
||||
|
||||
If TopLine < 1 Then TopLine := 1;
|
||||
End Else
|
||||
TopLine := 1;
|
||||
|
||||
Update;
|
||||
End;
|
||||
|
||||
Begin
|
||||
Template := strWordGet(1, Data, ';');
|
||||
HelpFile := strWordGet(2, Data, ';');
|
||||
FN := strWordGet(3, Data, ';');
|
||||
Speed := strS2I(strWordGet(3, Data, ';'));
|
||||
FN := strWordGet(4, Data, ';');
|
||||
|
||||
If Pos(PathChar, FN) = 0 Then
|
||||
FN := Session.Theme.TextPath + FN;
|
||||
|
@ -1542,21 +1584,7 @@ Begin
|
|||
|
||||
Close (AFile);
|
||||
|
||||
Session.io.AllowArrow := True;
|
||||
Session.io.ScreenInfo[3].X := 0;
|
||||
|
||||
Session.io.OutFile(Template, False, 0);
|
||||
|
||||
WinSize := Session.io.ScreenInfo[2].Y - Session.io.ScreenInfo[1].Y + 1;
|
||||
|
||||
If strUpper(strWordGet(4, Data, ';')) = 'END' Then Begin
|
||||
TopLine := Ansi.Lines - WinSize + 1;
|
||||
|
||||
If TopLine < 1 Then TopLine := 1;
|
||||
End Else
|
||||
TopLine := 1;
|
||||
|
||||
Update;
|
||||
ReDraw;
|
||||
|
||||
While Not Session.ShutDown Do Begin
|
||||
Ch := UpCase(Session.io.GetKey);
|
||||
|
@ -1594,7 +1622,20 @@ Begin
|
|||
End;
|
||||
End Else
|
||||
Case Ch of
|
||||
#32,
|
||||
'?' : Begin
|
||||
Session.io.OutFile(HelpFile, True, 0);
|
||||
|
||||
If Not Session.io.NoFile Then
|
||||
ReDraw;
|
||||
End;
|
||||
#32 : Begin
|
||||
Session.io.AnsiColor(7);
|
||||
Session.io.AnsiClear;
|
||||
Session.io.OutFile(FN, False, Speed);
|
||||
Session.io.PauseScreen;
|
||||
|
||||
ReDraw;
|
||||
End;
|
||||
#13 : If TopLine < Ansi.Lines - WinSize Then Begin
|
||||
Inc (TopLine, WinSize);
|
||||
|
||||
|
|
|
@ -72,30 +72,30 @@ Type
|
|||
Procedure BufAddChar (Ch: Char);
|
||||
Procedure BufAddStr (Str: String);
|
||||
Procedure BufFlush;
|
||||
Function ParseMCI (Display : Boolean; Code: String) : Boolean;
|
||||
Function ParseMCI (Display: Boolean; Code: String) : Boolean;
|
||||
Function StrMci (Str: String) : String;
|
||||
Function Attr2Ansi (Attr: Byte) : String;
|
||||
Function Pipe2Ansi (Color : Byte) : String;
|
||||
Procedure AnsiGotoXY (X : Byte; Y:Byte);
|
||||
Procedure AnsiMoveX (X : Byte);
|
||||
Procedure AnsiMoveY (Y : Byte);
|
||||
Procedure AnsiColor (A : Byte);
|
||||
Function Pipe2Ansi (Color: Byte) : String;
|
||||
Procedure AnsiGotoXY (X: Byte; Y:Byte);
|
||||
Procedure AnsiMoveX (X: Byte);
|
||||
Procedure AnsiMoveY (Y: Byte);
|
||||
Procedure AnsiColor (A: Byte);
|
||||
Procedure AnsiClear;
|
||||
Procedure AnsiClrEOL;
|
||||
Procedure OutPipe (Str: String);
|
||||
Procedure OutPipeLn (Str: String);
|
||||
Procedure OutRaw (Str : String);
|
||||
Procedure OutRaw (Str: String);
|
||||
Procedure OutRawLn (Str: String);
|
||||
Procedure OutBS (Num : Byte; Del: Boolean);
|
||||
Procedure OutFull (Str : String);
|
||||
Procedure OutFullLn (Str : String);
|
||||
Function OutFile (FName : String; DoPause: Boolean; Speed: Byte) : Boolean;
|
||||
Function OutYN (Y : Boolean) : String;
|
||||
Function OutON (O : Boolean) : String;
|
||||
Procedure OutBS (Num: Byte; Del: Boolean);
|
||||
Procedure OutFull (Str: String);
|
||||
Procedure OutFullLn (Str: String);
|
||||
Function OutFile (FName: String; DoPause: Boolean; Speed: Byte) : Boolean;
|
||||
Function OutYN (Y: Boolean) : String;
|
||||
Function OutON (O: Boolean) : String;
|
||||
Procedure PauseScreen;
|
||||
Function MorePrompt : Char;
|
||||
Function DrawPercent (Bar : RecPercent; Part, Whole : SmallInt; Var Percent : SmallInt) : String;
|
||||
Function GetInput (Field, Max, Mode: Byte; Default : String) : String;
|
||||
Function DrawPercent (Bar: RecPercent; Part, Whole: SmallInt; Var Percent : SmallInt) : String;
|
||||
Function GetInput (Field, Max, Mode: Byte; Default: String) : String;
|
||||
Function InXY (X, Y, Field, Max, Mode: Byte; Default: String) : String;
|
||||
Function InKey (Wait: LongInt) : Char;
|
||||
Function GetYNL (Str: String; Yes: Boolean) : Boolean;
|
||||
|
@ -1821,12 +1821,13 @@ Var
|
|||
|
||||
Begin
|
||||
If UseInLimit Then Begin
|
||||
Field := InLimit;
|
||||
Field := InLimit;
|
||||
UseInLimit := False;
|
||||
End;
|
||||
|
||||
If UseInSize Then Begin
|
||||
UseInSize := False;
|
||||
|
||||
If InSize <= Max Then Max := InSize;
|
||||
End;
|
||||
|
||||
|
@ -1880,6 +1881,7 @@ Begin
|
|||
Ch := GetKey;
|
||||
|
||||
If IsArrow Then Begin
|
||||
|
||||
Case Ch of
|
||||
#71 : If StrPos > 1 Then Begin
|
||||
StrPos := 1;
|
||||
|
@ -1939,6 +1941,7 @@ Begin
|
|||
End;
|
||||
End;
|
||||
End Else
|
||||
|
||||
Case Ch of
|
||||
#02 : ReDraw;
|
||||
#08 : If StrPos > 1 Then Begin
|
||||
|
@ -2058,7 +2061,7 @@ Var
|
|||
Begin
|
||||
Attr := Screen.TextAttr;
|
||||
|
||||
Screen.TextAttr := 0; // kludge to force it to return full ansi codes
|
||||
// Screen.TextAttr := 0; // kludge to force it to return full ansi codes
|
||||
|
||||
If Part > Whole Then Part := Whole;
|
||||
|
||||
|
@ -2072,7 +2075,7 @@ Begin
|
|||
|
||||
Result := Attr2Ansi(Bar.HiAttr) + strRep(Bar.HiChar, FillSize) +
|
||||
Attr2Ansi(Bar.LoAttr) + strRep(Bar.LoChar, Bar.BarLength - FillSize) +
|
||||
Attr2Ansi(Attr);
|
||||
Pipe2Ansi(16) + Attr2Ansi(Attr);
|
||||
End;
|
||||
|
||||
{$IFDEF UNIX}
|
||||
|
|
|
@ -145,6 +145,7 @@ Begin
|
|||
'N' : Session.User.AcsOkFlag := Session.io.GetYN(CmdData, False);
|
||||
'P' : Session.User.AcsOkFlag := Session.io.GetPW(Copy(CmdData, 1, Pos(';', CmdData) - 1), Session.GetPrompt(417),
|
||||
strUpper(Copy(CmdData, Pos(';', CmdData) + 1, Length(CmdData))));
|
||||
'R' : Session.User.AcsOkFlag := Boolean(Ord(strS2I(CmdData)));
|
||||
'S' : Session.SystemLog(CmdData);
|
||||
'Y' : Session.User.AcsOkFlag := Session.io.GetYN(CmdData, True);
|
||||
End;
|
||||
|
@ -255,7 +256,7 @@ Begin
|
|||
End;
|
||||
'M' : Case Cmd[2] of
|
||||
'A' : Session.Msgs.ChangeArea(CmdData);
|
||||
'C' : Session.Msgs.CheckEMail;
|
||||
'C' : Session.Msgs.CheckEMail(CmdData);
|
||||
'D' : Session.Msgs.SetMessagePointers;
|
||||
'G' : Session.Msgs.MessageGroupChange (CmdData, True, True);
|
||||
'L' : Session.Msgs.NetMailLookup (True, '', '');
|
||||
|
@ -266,7 +267,7 @@ Begin
|
|||
'R' : Begin
|
||||
If CmdData = '' Then CmdData := ' ';
|
||||
|
||||
Session.Msgs.ReadMessages(UpCase(CmdData[1]), '');
|
||||
Session.Msgs.ReadMessages(UpCase(CmdData[1]), Copy(CmdData, 3, 255), '');
|
||||
End;
|
||||
'S' : Session.Msgs.GlobalMessageSearch(UpCase(CmdData[1]));
|
||||
'V' : Session.Msgs.ViewSentEmail;
|
||||
|
|
|
@ -35,11 +35,11 @@ Type
|
|||
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);
|
||||
Procedure AssignMessageData (Var Msg: PMsgBaseABS; Var TempBase: RecMessageBase);
|
||||
Function GetBaseByNum (Num: LongInt; Var TempBase: RecMessageBase) : Boolean;
|
||||
Function GetBaseCompressed (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 (List, ShowPrompt, ShowYou: Boolean; Var ListPtr: LongInt; Var TempBase: RecMessageBase; NoFrom, NoRead: Boolean; Var Total, New, Yours: LongInt);
|
||||
Function GetTotalBases (Compressed: Boolean) : LongInt;
|
||||
Function GetTotalMessages (Var TempBase: RecMessageBase) : LongInt;
|
||||
Procedure PostTextFile (Data: String; AllowCodes: Boolean);
|
||||
|
@ -53,11 +53,11 @@ Type
|
|||
Procedure MessageUpload (Var CurLine: SmallInt);
|
||||
Procedure ReplyMessage (Email: Boolean; ListMode: Byte; ReplyID: String);
|
||||
Procedure EditMessage;
|
||||
Function ReadMessages (Mode : Char; SearchStr: String) : Boolean;
|
||||
Function ReadMessages (Mode: Char; CmdData, SearchStr: String) : Boolean;
|
||||
Procedure ToggleNewScan (QWK: Boolean; Data: String);
|
||||
Procedure MessageGroupChange (Ops: String; FirstBase, Intro : Boolean);
|
||||
Procedure PostMessage (Email: Boolean; Data: String);
|
||||
Procedure CheckEMail;
|
||||
Procedure CheckEMail (CmdData: String);
|
||||
Procedure MessageNewScan (Data: String);
|
||||
Procedure MessageQuickScan (Data: String);
|
||||
Procedure GlobalMessageSearch (Mode: Char);
|
||||
|
@ -215,7 +215,6 @@ Begin
|
|||
|
||||
While NodeList.FindNext(NodeData) Do Begin
|
||||
Case ListType of
|
||||
0 : ;//If NodeData.Keyword <> '' Then Continue;
|
||||
1 : If NodeData.Keyword <> 'ZONE' Then Continue;
|
||||
2 : If (NodeData.Keyword <> 'ZONE') and (NodeData.Keyword <> 'REGION') and (NodeData.Keyword <> 'HOST') Then Continue;
|
||||
End;
|
||||
|
@ -405,10 +404,9 @@ Begin
|
|||
End;
|
||||
End;
|
||||
|
||||
Procedure TMsgBase.GetMessageStats (Var TempBase: RecMessageBase; Var Total, New, Yours: LongInt);
|
||||
Procedure TMsgBase.GetMessageStats (List, ShowPrompt, ShowYou: Boolean; Var ListPtr: LongInt; Var TempBase: RecMessageBase; NoFrom, NoRead: Boolean; Var Total, New, Yours: LongInt);
|
||||
Var
|
||||
TempMsg : PMsgBaseABS;
|
||||
MsgTo : String[40];
|
||||
Begin
|
||||
Total := 0;
|
||||
New := 0;
|
||||
|
@ -422,13 +420,53 @@ Begin
|
|||
TempMsg^.SeekFirst(TempMsg^.GetLastRead(Session.User.UserNum) + 1);
|
||||
|
||||
While TempMsg^.SeekFound Do Begin
|
||||
Inc (New);
|
||||
|
||||
TempMsg^.MsgStartUp;
|
||||
|
||||
MsgTo := strUpper(TempMsg^.GetTo);
|
||||
If NoFrom And Session.User.IsThisUser(TempMsg^.GetFrom) Then Begin
|
||||
TempMsg^.SeekNext;
|
||||
|
||||
If (MsgTo = strUpper(Session.User.ThisUser.Handle)) or (MsgTo = strUpper(Session.User.ThisUser.RealName)) Then
|
||||
Continue;
|
||||
End;
|
||||
|
||||
If NoRead And Session.User.IsThisUser(TempMsg^.GetTo) And TempMsg^.IsRcvd Then Begin
|
||||
TempMsg^.SeekNext;
|
||||
|
||||
Continue;
|
||||
End;
|
||||
|
||||
If List Then Begin
|
||||
If (ShowYou And Not Session.User.IsThisUser(TempMsg^.GetTo)) Then Begin
|
||||
TempMsg^.SeekNext;
|
||||
|
||||
Continue;
|
||||
End;
|
||||
|
||||
If ShowPrompt Then
|
||||
Session.io.OutBS(Screen.CursorX, True);
|
||||
|
||||
Inc (ListPtr);
|
||||
|
||||
Session.io.PromptInfo[1] := strI2S(ListPtr);
|
||||
Session.io.PromptInfo[2] := TempBase.Name;
|
||||
Session.io.PromptInfo[3] := TempMsg^.GetFrom;
|
||||
Session.io.PromptInfo[4] := TempMsg^.GetTo;
|
||||
Session.io.PromptInfo[5] := TempMsg^.GetSubj;
|
||||
Session.io.PromptInfo[6] := DateDos2Str(DateStr2Dos(TempMsg^.GetDate), Session.User.ThisUser.DateType);
|
||||
|
||||
If ListPtr = 1 Then
|
||||
Session.io.OutFullLn(Session.GetPrompt(506));
|
||||
|
||||
Session.io.OutFullLn(Session.GetPrompt(507));
|
||||
|
||||
If ShowPrompt Then
|
||||
Session.io.OutFull(Session.GetPrompt(487));
|
||||
|
||||
Session.io.BufFlush;
|
||||
End;
|
||||
|
||||
Inc (New);
|
||||
|
||||
If Session.User.IsThisUser(TempMsg^.GetTo) Then
|
||||
Inc(Yours);
|
||||
|
||||
TempMsg^.SeekNext;
|
||||
|
@ -470,6 +508,8 @@ Begin
|
|||
MScan.NewScan := MBase.DefNScan;
|
||||
MScan.QwkScan := MBase.DefQScan;
|
||||
|
||||
FileMode := 66;
|
||||
|
||||
Assign (MScanFile, MBase.Path + MBase.FileName + '.scn');
|
||||
{$I-} Reset (MScanFile); {$I+}
|
||||
|
||||
|
@ -527,31 +567,31 @@ Begin
|
|||
End;
|
||||
End;
|
||||
|
||||
Procedure TMsgBase.AssignMessageData (Var Msg: PMsgBaseABS);
|
||||
Procedure TMsgBase.AssignMessageData (Var Msg: PMsgBaseABS; Var TempBase: RecMessageBase);
|
||||
Var
|
||||
Addr : RecEchoMailAddr;
|
||||
SemFile : Text;
|
||||
Begin
|
||||
Msg^.StartNewMsg;
|
||||
|
||||
If MBase.Flags And MBRealNames <> 0 Then
|
||||
If TempBase.Flags And MBRealNames <> 0 Then
|
||||
Msg^.SetFrom(Session.User.ThisUser.RealName)
|
||||
Else
|
||||
Msg^.SetFrom(Session.User.ThisUser.Handle);
|
||||
|
||||
Msg^.SetLocal (True);
|
||||
|
||||
If MBase.NetType > 0 Then Begin
|
||||
If MBase.NetType = 3 Then
|
||||
If TempBase.NetType > 0 Then Begin
|
||||
If TempBase.NetType = 3 Then
|
||||
Msg^.SetMailType(mmtNetMail)
|
||||
Else
|
||||
Msg^.SetMailType(mmtEchoMail);
|
||||
|
||||
Addr := Config.NetAddress[MBase.NetAddr];
|
||||
Addr := Config.NetAddress[TempBase.NetAddr];
|
||||
|
||||
Msg^.SetOrig(Addr);
|
||||
|
||||
Case MBase.NetType of
|
||||
Case TempBase.NetType of
|
||||
1 : Begin
|
||||
Assign (SemFile, Config.SemaPath + fn_SemFileEcho);
|
||||
If Session.ExitLevel > 5 Then Session.ExitLevel := 7 Else Session.ExitLevel := 5;
|
||||
|
@ -572,7 +612,7 @@ Begin
|
|||
End Else
|
||||
Msg^.SetMailType(mmtNormal);
|
||||
|
||||
Msg^.SetPriv (MBase.Flags and MBPrivate <> 0);
|
||||
Msg^.SetPriv (TempBase.Flags and MBPrivate <> 0);
|
||||
Msg^.SetDate (DateDos2Str(CurDateDos, 1));
|
||||
Msg^.SetTime (TimeDos2Str(CurDateDos, False));
|
||||
End;
|
||||
|
@ -647,62 +687,6 @@ Begin
|
|||
End;
|
||||
End;
|
||||
|
||||
(*
|
||||
Procedure TMsgBase.ToggleNewScan (QWK: Boolean; Data: String);
|
||||
|
||||
Procedure NewScanListBases;
|
||||
Begin
|
||||
Session.io.PausePtr := 1;
|
||||
Session.io.AllowPause := True;
|
||||
|
||||
If QWK Then
|
||||
Session.io.OutFullLn (Session.GetPrompt(90))
|
||||
Else
|
||||
Session.io.OutFullLn (Session.GetPrompt(91));
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(92));
|
||||
|
||||
Total := 0;
|
||||
|
||||
Reset (MBaseFile);
|
||||
|
||||
While Not Eof(MBaseFile) Do Begin
|
||||
Read (MBaseFile, MBase);
|
||||
|
||||
If Session.User.Access(MBase.ListACS) Then Begin
|
||||
Inc (Total);
|
||||
|
||||
Session.io.PromptInfo[1] := strI2S(Total);
|
||||
Session.io.PromptInfo[2] := MBase.Name;
|
||||
|
||||
GetMessageScan;
|
||||
|
||||
If ((MScan.NewScan > 0) And Not QWK) or ((MScan.QwkScan > 0) And QWK) Then
|
||||
Session.io.PromptInfo[3] := 'Yes' {++lang++}
|
||||
Else
|
||||
Session.io.PromptInfo[3] := 'No'; {++lang++}
|
||||
|
||||
Session.io.OutFull (Session.GetPrompt(93));
|
||||
|
||||
If (Total MOD Config.MColumns = 0) And (Total > 0) Then Session.io.OutRawLn('');
|
||||
End;
|
||||
|
||||
If EOF(MBaseFile) and (Total MOD Config.MColumns <> 0) Then Session.io.OutRawLn('');
|
||||
|
||||
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;
|
||||
|
||||
Session.io.OutFull (Session.GetPrompt(430));
|
||||
End;
|
||||
|
||||
Begin
|
||||
End;
|
||||
*)
|
||||
|
||||
Procedure TMsgBase.ToggleNewScan (QWK: Boolean; Data: String);
|
||||
Var
|
||||
Total: LongInt;
|
||||
|
@ -769,7 +753,8 @@ Var
|
|||
Repeat
|
||||
Read (MBaseFile, MBase);
|
||||
|
||||
If Session.User.Access(MBase.ListACS) Then Inc(B);
|
||||
If Session.User.Access(MBase.ListACS) Then
|
||||
Inc(B);
|
||||
|
||||
If A = B Then Break;
|
||||
Until False;
|
||||
|
@ -1192,13 +1177,12 @@ Begin
|
|||
|
||||
Session.io.PromptInfo[1] := ToWho;
|
||||
|
||||
If Editor(Lines, 78, mysMaxMsgLines, False, fn_tplMsgEdit, Subj) Then Begin
|
||||
|
||||
If Editor(Lines, ColumnValue[Session.Theme.ColumnSize] - 2, mysMaxMsgLines, False, fn_tplMsgEdit, Subj) Then Begin
|
||||
Session.io.OutFull (Session.GetPrompt(107));
|
||||
|
||||
If Not OpenCreateBase(MsgNew, MBase) Then Exit;
|
||||
|
||||
AssignMessageData(MsgNew);
|
||||
AssignMessageData(MsgNew, MBase);
|
||||
|
||||
Case MBase.NetType of
|
||||
2 : MsgNew^.SetTo('All');
|
||||
|
@ -1321,7 +1305,7 @@ Begin
|
|||
'!' : Begin
|
||||
Temp1 := MsgBase^.GetSubj;
|
||||
|
||||
If Editor(Lines, 78, mysMaxMsgLines, False, fn_tplMsgEdit, Temp1) Then
|
||||
If Editor(Lines, ColumnValue[Session.Theme.ColumnSize] - 2, mysMaxMsgLines, False, fn_tplMsgEdit, Temp1) Then
|
||||
MsgBase^.SetSubj(Temp1)
|
||||
Else
|
||||
ReadText;
|
||||
|
@ -1393,9 +1377,11 @@ Begin
|
|||
Session.io.PromptInfo[2] := T2;
|
||||
End;
|
||||
|
||||
Function TMsgBase.ReadMessages (Mode : Char; SearchStr : String) : Boolean;
|
||||
Function TMsgBase.ReadMessages (Mode: Char; CmdData, SearchStr: String) : Boolean;
|
||||
Var
|
||||
ReadRes : Boolean;
|
||||
NoFrom : Boolean;
|
||||
NoRead : Boolean;
|
||||
ScanMode : Byte;
|
||||
ValidKeys : String;
|
||||
HelpFile : String[8];
|
||||
|
@ -1404,7 +1390,7 @@ Var
|
|||
ReplyID : String[31];
|
||||
TempStr : String;
|
||||
|
||||
Procedure Set_Message_Security;
|
||||
Procedure SetMessageSecurity;
|
||||
Begin
|
||||
If Mode = 'E' Then Begin
|
||||
ValidKeys := 'ADJLNPQRX?'#13;
|
||||
|
@ -1504,7 +1490,7 @@ Var
|
|||
Session.User.IgnoreGroup := False;
|
||||
End;
|
||||
|
||||
Procedure Export_Message;
|
||||
Procedure ExportMessage;
|
||||
Var
|
||||
FN : String;
|
||||
Temp : String;
|
||||
|
@ -1602,6 +1588,12 @@ Var
|
|||
4 : Res := Session.User.IsThisUser(MsgBase^.GetFrom);
|
||||
End;
|
||||
|
||||
If NoFrom And Session.User.IsThisUser(MsgBase^.GetFrom) Then
|
||||
Res := False;
|
||||
|
||||
If NoRead And Session.User.IsThisUser(MsgBase^.GetTo) And MsgBase^.IsRcvd Then
|
||||
Res := False;
|
||||
|
||||
If Not Res Then
|
||||
If Back Then
|
||||
MsgBase^.SeekPrior
|
||||
|
@ -1617,7 +1609,7 @@ Var
|
|||
SeekNextMsg := Res;
|
||||
End;
|
||||
|
||||
Procedure Assign_Header_Info;
|
||||
Procedure AssignHeaderInfo;
|
||||
Var
|
||||
NetAddr : RecEchoMailAddr;
|
||||
Begin
|
||||
|
@ -1646,10 +1638,12 @@ Var
|
|||
|
||||
TempStr := Session.GetPrompt(490);
|
||||
|
||||
If MsgBase^.IsLocal Then Session.io.PromptInfo[9] := strWordGet(1, TempStr, ' ') Else Session.io.PromptInfo[9] := strWordGet(2, TempStr, ' ');
|
||||
If MsgBase^.IsPriv Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(3, TempStr, ' ');
|
||||
If MsgBase^.IsSent Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(4, TempStr, ' ');
|
||||
If MsgBase^.IsDeleted Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(5, TempStr, ' ');
|
||||
If MsgBase^.IsLocal Then Session.io.PromptInfo[9] := strWordGet(1, TempStr, ',');
|
||||
If MsgBase^.IsEchoed Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(2, TempStr, ',');
|
||||
If MsgBase^.IsPriv Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(3, TempStr, ',');
|
||||
If MsgBase^.IsSent Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(4, TempStr, ',');
|
||||
If MsgBase^.IsRcvd Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(6, TempStr, ',');
|
||||
If MsgBase^.IsDeleted Then Session.io.PromptInfo[9] := Session.io.PromptInfo[9] + ' ' + strWordGet(5, TempStr, ',');
|
||||
End;
|
||||
|
||||
Procedure Send_Msg_Text (Str : String);
|
||||
|
@ -1748,10 +1742,15 @@ Var
|
|||
Repeat
|
||||
Set_Node_Action (Session.GetPrompt(348));
|
||||
|
||||
Set_Message_Security;
|
||||
SetMessageSecurity;
|
||||
|
||||
If MsgBase^.GetMsgNum > LastRead Then LastRead := MsgBase^.GetMsgNum;
|
||||
|
||||
If Session.User.IsThisUser(MsgBase^.GetTo) And Not MsgBase^.IsRcvd Then Begin
|
||||
MsgBase^.SetRcvd(True);
|
||||
MsgBase^.ReWriteHDR;
|
||||
End;
|
||||
|
||||
CurMsg := MsgBase^.GetMsgNum;
|
||||
Lines := 0;
|
||||
PageStart := 1;
|
||||
|
@ -1773,7 +1772,7 @@ Var
|
|||
End;
|
||||
End;
|
||||
|
||||
Assign_Header_Info;
|
||||
AssignHeaderInfo;
|
||||
|
||||
Session.io.ScreenInfo[4].Y := 0;
|
||||
Session.io.ScreenInfo[5].Y := 0;
|
||||
|
@ -1869,6 +1868,8 @@ Var
|
|||
End;
|
||||
'H' : Begin
|
||||
LastRead := CurMsg - 1;
|
||||
|
||||
Session.io.OutFullLn(Session.GetPrompt(504));
|
||||
End;
|
||||
'I' : Begin
|
||||
LastRead := MsgBase^.GetHighMsgNum;
|
||||
|
@ -1972,7 +1973,7 @@ Var
|
|||
Break;
|
||||
End;
|
||||
'X' : Begin
|
||||
Export_Message;
|
||||
ExportMessage;
|
||||
|
||||
Break;
|
||||
End;
|
||||
|
@ -2357,8 +2358,13 @@ Var
|
|||
|
||||
If MsgBase^.GetMsgNum > LastRead Then LastRead := MsgBase^.GetMsgNum;
|
||||
|
||||
Set_Message_Security;
|
||||
Assign_Header_Info;
|
||||
If Session.User.IsThisUser(MsgBase^.GetTo) And Not MsgBase^.IsRcvd Then Begin
|
||||
MsgBase^.SetRcvd(True);
|
||||
MsgBase^.ReWriteHDR;
|
||||
End;
|
||||
|
||||
SetMessageSecurity;
|
||||
AssignHeaderInfo;
|
||||
Display_Header;
|
||||
|
||||
MsgBase^.MsgTxtStartUp;
|
||||
|
@ -2429,7 +2435,13 @@ Var
|
|||
Break;
|
||||
End;
|
||||
'G' : Exit;
|
||||
'H' : LastRead := MsgBase^.GetMsgNum - 1;
|
||||
'H' : Begin
|
||||
LastRead := MsgBase^.GetMsgNum - 1;
|
||||
|
||||
Session.io.OutFullLn(Session.GetPrompt(505));
|
||||
|
||||
Break;
|
||||
End;
|
||||
'I' : Begin
|
||||
LastRead := MsgBase^.GetHighMsgNum;
|
||||
|
||||
|
@ -2449,6 +2461,7 @@ Var
|
|||
|
||||
If Not SeekNextMsg(True, False) Then Begin
|
||||
MsgBase^.SeekFirst(B);
|
||||
|
||||
SeekNextMsg(True, False);
|
||||
End;
|
||||
End;
|
||||
|
@ -2463,7 +2476,7 @@ Var
|
|||
Session.io.OutFullLn(Session.GetPrompt(411));
|
||||
|
||||
While SeekNextMsg(False, False) Do Begin
|
||||
Assign_Header_Info;
|
||||
AssignHeaderInfo;
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(412));
|
||||
|
||||
|
@ -2531,7 +2544,7 @@ Var
|
|||
|
||||
SetMessageScan;
|
||||
End;
|
||||
'X' : Export_Message;
|
||||
'X' : ExportMessage;
|
||||
'?' : Session.io.OutFile(HelpFile, True, 0);
|
||||
'[' : If MsgBase^.GetRefer > 0 Then Begin
|
||||
MsgBase^.SeekFirst(MsgBase^.GetRefer);
|
||||
|
@ -2560,12 +2573,16 @@ Var
|
|||
P = Global personal scan B = By You T = Global text search }
|
||||
|
||||
Var
|
||||
MsgNum : LongInt;
|
||||
MsgNum : LongInt;
|
||||
NoLastRead : Boolean;
|
||||
Begin
|
||||
ReadMessages := True;
|
||||
ReadRes := True;
|
||||
WereMsgs := False;
|
||||
ReplyID := '';
|
||||
NoLastRead := Pos('/NOLR', strUpper(CmdData)) > 0;
|
||||
NoFrom := Pos('/NOFROM', strUpper(CmdData)) > 0;
|
||||
NoRead := Pos('/NOREAD', strUpper(CmdData)) > 0;
|
||||
|
||||
If MBase.FileName = '' Then Begin
|
||||
Session.io.OutFullLn (Session.GetPrompt(110));
|
||||
|
@ -2595,6 +2612,8 @@ Begin
|
|||
End;
|
||||
End;
|
||||
|
||||
{ start here opencreate... }
|
||||
|
||||
Case MBase.BaseType of
|
||||
0 : MsgBase := New(PMsgBaseJAM, Init);
|
||||
1 : MsgBase := New(PMsgbaseSquish, Init);
|
||||
|
@ -2614,6 +2633,8 @@ Begin
|
|||
Exit;
|
||||
End;
|
||||
|
||||
{end here }
|
||||
|
||||
If Mode = 'E' Then
|
||||
ScanMode := 1
|
||||
Else
|
||||
|
@ -2657,7 +2678,7 @@ Begin
|
|||
Else
|
||||
MsgBase^.SeekFirst(LastRead + 1);
|
||||
|
||||
Set_Message_Security;
|
||||
SetMessageSecurity;
|
||||
|
||||
Reading := True;
|
||||
|
||||
|
@ -2669,9 +2690,11 @@ Begin
|
|||
Ascii_Read_Messages;
|
||||
End;
|
||||
|
||||
If Not (Mode in ['E', 'S', 'T']) Then MsgBase^.SetLastRead (Session.User.UserNum, LastRead);
|
||||
If Not (Mode in ['E', 'S', 'T']) And Not NoLastRead Then
|
||||
MsgBase^.SetLastRead (Session.User.UserNum, LastRead);
|
||||
|
||||
MsgBase^.CloseMsgBase;
|
||||
|
||||
Dispose (MsgBase, Done);
|
||||
|
||||
Reading := False;
|
||||
|
@ -2834,7 +2857,7 @@ Begin
|
|||
Session.io.PromptInfo[1] := MsgTo;
|
||||
// Session.io.PromptInfo[2] := MsgSubj;
|
||||
|
||||
If Editor(Lines, 78, mysMaxMsgLines, Forced, fn_tplMsgEdit, MsgSubj) Then Begin
|
||||
If Editor(Lines, ColumnValue[Session.Theme.ColumnSize] - 2, mysMaxMsgLines, Forced, fn_tplMsgEdit, MsgSubj) Then Begin
|
||||
Session.io.OutFull (Session.GetPrompt(107));
|
||||
|
||||
{ all of this below should be replaced with a SaveMessage function }
|
||||
|
@ -2850,7 +2873,7 @@ Begin
|
|||
Exit;
|
||||
End;
|
||||
|
||||
AssignMessageData(MsgBase);
|
||||
AssignMessageData(MsgBase, MBase);
|
||||
|
||||
MsgBase^.SetTo (MsgTo);
|
||||
MsgBase^.SetSubj (MsgSubj);
|
||||
|
@ -2903,78 +2926,70 @@ Begin
|
|||
Session.User.IgnoreGroup := SaveGroup;
|
||||
End;
|
||||
|
||||
Procedure TMsgBase.CheckEMail;
|
||||
Procedure TMsgBase.CheckEMail (CmdData: String);
|
||||
Var
|
||||
Old : RecMessageBase;
|
||||
Total : Integer;
|
||||
MsgBase : PMsgBaseABS;
|
||||
TempBase : RecMessageBase;
|
||||
Total : Integer;
|
||||
UnRead : Integer;
|
||||
Begin
|
||||
TempBase := MBase;
|
||||
Total := 0;
|
||||
UnRead := 0;
|
||||
FileMode := 66;
|
||||
|
||||
Session.io.OutFull (Session.GetPrompt(123));
|
||||
|
||||
Session.io.BufFlush;
|
||||
|
||||
Old := MBase;
|
||||
|
||||
Reset (MBaseFile);
|
||||
Read (MBaseFile, MBase);
|
||||
Close (MBaseFile);
|
||||
|
||||
Case MBase.BaseType of
|
||||
0 : MsgBase := New(PMsgBaseJAM, Init);
|
||||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
If OpenCreateBase (MsgBase, MBase) Then Begin
|
||||
MsgBase^.SeekFirst (1);
|
||||
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then Begin
|
||||
Session.io.OutFullLn (Session.GetPrompt(124));
|
||||
Dispose (MsgBase, Done);
|
||||
MBase := Old;
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Total := 0;
|
||||
|
||||
MsgBase^.YoursFirst(Session.User.ThisUser.RealName, Session.User.ThisUser.Handle);
|
||||
|
||||
If MsgBase^.YoursFound Then Begin
|
||||
Session.io.OutFullLn (Session.GetPrompt(125));
|
||||
|
||||
Total := 0;
|
||||
|
||||
While MsgBase^.YoursFound Do Begin
|
||||
While MsgBase^.SeekFound Do Begin
|
||||
MsgBase^.MsgStartUp;
|
||||
|
||||
Inc (Total);
|
||||
If Session.User.IsThisUser(MsgBase^.GetTo) Then Begin
|
||||
Inc (Total);
|
||||
|
||||
Session.io.PromptInfo[1] := strI2S(Total);
|
||||
Session.io.PromptInfo[2] := MsgBase^.GetFrom;
|
||||
Session.io.PromptInfo[3] := MsgBase^.GetSubj;
|
||||
Session.io.PromptInfo[4] := MsgBase^.GetDate;
|
||||
If Not MsgBase^.IsRcvd Then Inc (UnRead);
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(126));
|
||||
If Total = 1 Then
|
||||
Session.io.OutFullLn (Session.GetPrompt(125));
|
||||
|
||||
MsgBase^.YoursNext;
|
||||
Session.io.PromptInfo[1] := strI2S(Total);
|
||||
Session.io.PromptInfo[2] := MsgBase^.GetFrom;
|
||||
Session.io.PromptInfo[3] := MsgBase^.GetSubj;
|
||||
Session.io.PromptInfo[4] := MsgBase^.GetDate;
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(126));
|
||||
End;
|
||||
|
||||
MsgBase^.SeekNext;
|
||||
End;
|
||||
|
||||
If Session.io.GetYN (Session.GetPrompt(127), True) Then Begin
|
||||
MsgBase^.CloseMsgBase;
|
||||
Dispose (MsgBase, Done);
|
||||
MsgBase^.CloseMsgBase;
|
||||
|
||||
ReadMessages('E', '');
|
||||
Dispose (MsgBase, Done);
|
||||
End;
|
||||
|
||||
Session.LastScanHadNew := UnRead > 0;
|
||||
|
||||
If Total = 0 Then
|
||||
Session.io.OutFullLn (Session.GetPrompt(124))
|
||||
Else Begin
|
||||
Session.io.PromptInfo[1] := strI2S(Total);
|
||||
Session.io.PromptInfo[2] := strI2S(UnRead);
|
||||
|
||||
If Session.io.GetYN (Session.GetPrompt(127), UnRead > 0) Then Begin
|
||||
ReadMessages('E', '', '');
|
||||
|
||||
Session.io.OutFullLn (Session.GetPrompt(118));
|
||||
|
||||
MBase := Old;
|
||||
Exit;
|
||||
End;
|
||||
End Else
|
||||
Session.io.OutFullLn (Session.GetPrompt(124));
|
||||
|
||||
MsgBase^.CloseMsgBase;
|
||||
|
||||
Dispose (MsgBase, Done);
|
||||
|
||||
MBase := Old;
|
||||
End;
|
||||
MBase := TempBase;
|
||||
End;
|
||||
|
||||
Procedure TMsgBase.SetMessagePointers;
|
||||
|
@ -2999,6 +3014,7 @@ Var
|
|||
|
||||
While MsgBase^.SeekFound Do Begin
|
||||
MsgBase^.MsgStartUp;
|
||||
|
||||
If DateStr2Dos(MsgBase^.GetDate) >= NewDate Then Begin
|
||||
MsgBase^.SetLastRead(Session.User.UserNum, MsgBase^.GetMsgNum - 1);
|
||||
Found := True;
|
||||
|
@ -3047,12 +3063,14 @@ Procedure TMsgBase.MessageNewScan (Data: String);
|
|||
{ /M : scan only mandatory bases }
|
||||
{ /G : scan all bases in all groups }
|
||||
Var
|
||||
Old : RecMessageBase;
|
||||
Mode : Char;
|
||||
Mand : Boolean;
|
||||
Old : RecMessageBase;
|
||||
Mode : Char;
|
||||
Mand : Boolean;
|
||||
CmdData : String;
|
||||
Begin
|
||||
Old := MBase;
|
||||
Mand := False;
|
||||
Old := MBase;
|
||||
Mand := False;
|
||||
FileMode := 66;
|
||||
|
||||
Reset (MBaseFile);
|
||||
|
||||
|
@ -3072,6 +3090,12 @@ Begin
|
|||
Session.User.IgnoreGroup := Pos('/G', Data) > 0;
|
||||
WereMsgs := False;
|
||||
|
||||
CmdData := '';
|
||||
|
||||
If Pos('/NOLR', Data) > 0 Then CmdData := '/NOLR';
|
||||
If Pos('/NOFROM', Data) > 0 Then CmdData := CmdData + '/NOFROM';
|
||||
If Pos('/NOREAD', Data) > 0 Then CmdData := CmdData + '/NOREAD';
|
||||
|
||||
Session.io.OutRawLn ('');
|
||||
|
||||
While Not Eof(MBaseFile) Do Begin
|
||||
|
@ -3085,7 +3109,7 @@ Begin
|
|||
Session.io.OutFull (Session.GetPrompt(130));
|
||||
Session.io.BufFlush;
|
||||
|
||||
If Not ReadMessages(Mode, '') Then Begin
|
||||
If Not ReadMessages(Mode, CmdData, '') Then Begin
|
||||
Session.io.OutRawLn('');
|
||||
Break;
|
||||
End;
|
||||
|
@ -3126,12 +3150,12 @@ Begin
|
|||
Session.User.IgnoreGroup := Mode = 'A';
|
||||
|
||||
If Mode = 'C' Then
|
||||
ReadMessages('S', SearchStr)
|
||||
ReadMessages('S', '', SearchStr)
|
||||
Else Begin
|
||||
Session.io.OutRawLn ('');
|
||||
|
||||
Reset (MBaseFile);
|
||||
Read (MBaseFile, MBase); {skip email base}
|
||||
Read (MBaseFile, MBase);
|
||||
|
||||
While Not Eof(MBaseFile) Do Begin
|
||||
Read (MBaseFile, MBase);
|
||||
|
@ -3140,7 +3164,7 @@ Begin
|
|||
GetMessageScan;
|
||||
|
||||
If MScan.NewScan > 0 Then Begin
|
||||
If Not ReadMessages('T', SearchStr) Then Begin
|
||||
If Not ReadMessages('T', '', SearchStr) Then Begin
|
||||
Session.io.OutRawLn('');
|
||||
Break;
|
||||
End;
|
||||
|
@ -3151,6 +3175,7 @@ Begin
|
|||
End;
|
||||
|
||||
Session.io.OutFull (Session.GetPrompt(311));
|
||||
|
||||
Close (MBaseFile);
|
||||
End;
|
||||
|
||||
|
@ -3177,7 +3202,7 @@ Var
|
|||
Begin
|
||||
Session.SystemLog ('Sending mass mail to ' + MsgTo);
|
||||
|
||||
AssignMessageData(MsgBase);
|
||||
AssignMessageData (MsgBase, MBase);
|
||||
|
||||
MsgBase^.SetFrom (MsgFrom);
|
||||
MsgBase^.SetTo (MsgTo);
|
||||
|
@ -3277,7 +3302,7 @@ Begin
|
|||
|
||||
Lines := 0;
|
||||
|
||||
If Editor(Lines, 78, mysMaxMsgLines, False, fn_tplMsgEdit, MsgSubj) Then Begin
|
||||
If Editor(Lines, ColumnValue[Session.Theme.ColumnSize] - 2, mysMaxMsgLines, False, fn_tplMsgEdit, MsgSubj) Then Begin
|
||||
Session.io.OutFullLn (Session.GetPrompt(394));
|
||||
|
||||
OLD := MBase;
|
||||
|
@ -3350,32 +3375,38 @@ Begin
|
|||
Read (MBaseFile, MBase);
|
||||
Close (MBaseFile);
|
||||
|
||||
ReadMessages('B', '');
|
||||
ReadMessages('B', '', '');
|
||||
|
||||
MBase := Old;
|
||||
End;
|
||||
|
||||
Procedure TMsgBase.MessageQuickScan (Data: String);
|
||||
// defaults to ALL groups/bases
|
||||
// Defaults to ALL groups/bases
|
||||
// /CURRENT = scan only current message base
|
||||
// /GROUP = scan only current group bases
|
||||
// options:
|
||||
// /NOSCAN = do not show "scanning" prompt
|
||||
// /NOFOOT = do not show "end of scan" prompt
|
||||
// /NOHEAD = do not show "starting quickscan" prompt
|
||||
// Only scans bases that they have selected in Newscan, of course
|
||||
Const
|
||||
Global_CurBase : LongInt = 1;
|
||||
Global_TotalBases : LongInt = 1;
|
||||
Global_TotalMsgs : LongInt = 0;
|
||||
Global_NewMsgs : LongInt = 0;
|
||||
Global_YourMsgs : LongInt = 0;
|
||||
ShowIfNew : Boolean = False;
|
||||
ShowIfYou : Boolean = False;
|
||||
ShowScanPrompt : Boolean = True;
|
||||
ShowHeadPrompt : Boolean = True;
|
||||
ShowFootPrompt : Boolean = True;
|
||||
Mode : Char = 'A';
|
||||
// other options:
|
||||
// /LIST = List messages
|
||||
// /NEW = only show/list if base has new or msg is new
|
||||
// /YOU = only show/list if base has your msgs or is your msg
|
||||
// /NOFOOT = dont show footer prompt
|
||||
// /NOSCAN = do not show "scanning" prompt
|
||||
// /NOFROM = bypass messages posted FROM the user
|
||||
// /NOREAD = bypass messages addressed to, and read by, the user
|
||||
Var
|
||||
NoFrom : Boolean;
|
||||
NoRead : Boolean;
|
||||
ShowIfNew : Boolean;
|
||||
ShowIfYou : Boolean;
|
||||
ShowScanPrompt : Boolean;
|
||||
ShowFootPrompt : Boolean;
|
||||
ShowMessage : Boolean;
|
||||
ShowMessagePTR : LongInt;
|
||||
Global_CurBase : LongInt;
|
||||
Global_TotalBases : LongInt;
|
||||
Global_TotalMsgs : LongInt;
|
||||
Global_NewMsgs : LongInt;
|
||||
Global_YourMsgs : LongInt;
|
||||
Mode : Char;
|
||||
|
||||
Procedure ScanBase;
|
||||
Var
|
||||
|
@ -3393,10 +3424,11 @@ Const
|
|||
|
||||
If ShowScanPrompt Then Begin
|
||||
Session.io.OutFull(Session.GetPrompt(487));
|
||||
|
||||
Session.io.BufFlush;
|
||||
End;
|
||||
|
||||
GetMessageStats(MBase, TotalMsgs, NewMsgs, YourMsgs);
|
||||
GetMessageStats(ShowMessage, ShowScanPrompt, ShowIfYou, ShowMessagePTR, MBase, NoFrom, NoRead, TotalMsgs, NewMsgs, YourMsgs);
|
||||
|
||||
Inc (Global_TotalMsgs, TotalMsgs);
|
||||
Inc (Global_NewMsgs, NewMsgs);
|
||||
|
@ -3412,6 +3444,7 @@ Const
|
|||
If ShowScanPrompt Then
|
||||
Session.io.OutBS(Screen.CursorX, True);
|
||||
|
||||
If Not ShowMessage Then
|
||||
If (ShowIfNew And (NewMsgs > 0)) or (ShowIfYou And (YourMsgs > 0)) or (Not ShowIfNew And Not ShowIfYou) Then Begin
|
||||
Session.io.OutFullLn(Session.GetPrompt(488));
|
||||
Session.io.BufFlush;
|
||||
|
@ -3421,26 +3454,39 @@ Const
|
|||
Var
|
||||
Old : RecMessageBase;
|
||||
Begin
|
||||
Session.LastScanHadNew := False;
|
||||
Session.LastScanHadYou := False;
|
||||
|
||||
Global_CurBase := 1;
|
||||
Global_TotalBases := 1;
|
||||
Global_TotalMsgs := 0;
|
||||
Global_NewMsgs := 0;
|
||||
Global_YourMsgs := 0;
|
||||
ShowMessagePTR := 0;
|
||||
Mode := 'A';
|
||||
|
||||
FillChar(Session.io.PromptInfo, SizeOf(Session.io.PromptInfo), 0);
|
||||
|
||||
If Pos('/GROUP', Data) > 0 Then Mode := 'G';
|
||||
If Pos('/CURRENT', Data) > 0 Then Mode := 'C';
|
||||
|
||||
ShowScanPrompt := Pos('/NOSCAN', Data) = 0;
|
||||
ShowHeadPrompt := Pos('/NOHEAD', Data) = 0;
|
||||
ShowMessage := Pos('/LIST', Data) > 0;
|
||||
ShowFootPrompt := Pos('/NOFOOT', Data) = 0;
|
||||
ShowScanPrompt := Pos('/NOSCAN', Data) = 0;
|
||||
ShowIfNew := Pos('/NEW', Data) > 0;
|
||||
ShowIfYou := Pos('/YOU', Data) > 0;
|
||||
NoFrom := Pos('/NOFROM', Data) > 0;
|
||||
NoRead := Pos('/NOREAD', Data) > 0;
|
||||
|
||||
Old := MBase;
|
||||
Session.User.IgnoreGroup := Mode = 'A';
|
||||
|
||||
If ShowHeadPrompt Then
|
||||
Session.io.OutFullLn (Session.GetPrompt(486));
|
||||
FileMode := 66;
|
||||
|
||||
If Mode = 'C' Then
|
||||
ScanBase
|
||||
Else Begin
|
||||
Reset (MBaseFile);
|
||||
Read (MBaseFile, MBase); {skip email base}
|
||||
|
||||
Global_TotalBases := FileSize(MBaseFile);
|
||||
|
||||
|
@ -3459,6 +3505,16 @@ Begin
|
|||
Close (MBaseFile);
|
||||
End;
|
||||
|
||||
Session.LastScanHadNew := Global_NewMsgs > 0;
|
||||
Session.LastScanHadYou := Global_YourMsgs > 0;
|
||||
|
||||
Session.io.PromptInfo[1] := strComma(Global_TotalMsgs);
|
||||
Session.io.PromptInfo[2] := strComma(Global_NewMsgs);
|
||||
Session.io.PromptInfo[3] := strComma(Global_YourMsgs);
|
||||
|
||||
If ShowMessagePTR > 0 Then
|
||||
Session.io.OutFull(Session.GetPrompt(508));
|
||||
|
||||
If ShowFootPrompt Then
|
||||
Session.io.OutFullLn(Session.GetPrompt(489));
|
||||
|
||||
|
@ -3724,11 +3780,44 @@ Const
|
|||
CRLF = #13#10;
|
||||
Var
|
||||
tFile : Text;
|
||||
Flags : String;
|
||||
Begin
|
||||
Assign (tFile, Session.TempPath + 'toreader.ext');
|
||||
ReWrite (tFile);
|
||||
Write (tFile, 'ALIAS ' + Session.User.ThisUser.Handle + CRLF);
|
||||
|
||||
Write (tFile, 'ALIAS ' + Session.User.ThisUser.Handle + CRLF);
|
||||
Reset (MBaseFile);
|
||||
|
||||
While Not Eof(MBaseFile) Do Begin
|
||||
Read (MBaseFile, MBase);
|
||||
|
||||
If Session.User.Access(MBase.ReadACS) Then Begin
|
||||
Flags := ' ';
|
||||
|
||||
If MBase.Flags AND MBPrivate = 0 Then
|
||||
Flags := Flags + 'aO'
|
||||
Else
|
||||
Flags := Flags + 'pP';
|
||||
|
||||
If MBase.Flags AND MBRealNames = 0 Then
|
||||
Flags := Flags + 'H';
|
||||
|
||||
If Not Session.User.Access(MBase.PostACS) Then
|
||||
Flags := Flags + 'BRZ';
|
||||
|
||||
Case MBase.NetType of
|
||||
0 : Flags := Flags + 'L';
|
||||
1 : Flags := Flags + 'E';
|
||||
2 : Flags := Flags + 'U';
|
||||
3 : Flags := Flags + 'N';
|
||||
End;
|
||||
|
||||
If MBase.DefQScan = 2 Then
|
||||
Flags := Flags + 'F';
|
||||
|
||||
Write (tFile, 'AREA ' + strI2S(MBase.Index) + Flags, CRLF);
|
||||
End;
|
||||
End;
|
||||
|
||||
Close (tFile);
|
||||
End;
|
||||
|
@ -3853,11 +3942,11 @@ Begin
|
|||
|
||||
MsgBase^.MsgStartUp;
|
||||
|
||||
If MsgBase^.IsPriv Then
|
||||
If Not ((MsgBase^.GetTo = Session.User.ThisUser.RealName) or (MsgBase^.GetTo = Session.User.ThisUser.Handle)) Then Begin
|
||||
MsgBase^.SeekNext;
|
||||
Continue;
|
||||
End;
|
||||
If MsgBase^.IsPriv And Not Session.User.IsThisUser(MsgBase^.GetTo) Then Begin
|
||||
MsgBase^.SeekNext;
|
||||
|
||||
Continue;
|
||||
End;
|
||||
|
||||
Inc (MsgAdded);
|
||||
Inc (TotalMsgs);
|
||||
|
@ -4171,7 +4260,7 @@ Begin
|
|||
|
||||
If OpenCreateBase(MsgBase, TempBase) Then Begin
|
||||
|
||||
AssignMessageData(MsgBase);
|
||||
AssignMessageData(MsgBase, TempBase);
|
||||
|
||||
QwkBlock[0] := #25;
|
||||
Move (QwkHeader.UpTo, QwkBlock[1], 25);
|
||||
|
|
|
@ -98,9 +98,9 @@ Type
|
|||
Procedure SeekNext; Virtual; {Find next matching msg}
|
||||
Procedure SeekPrior; Virtual; {Prior msg}
|
||||
Function SeekFound: Boolean; Virtual; {Msg was found}
|
||||
Procedure YoursFirst(Name: String; Handle: String); Virtual; {Seek your mail}
|
||||
Procedure YoursNext; Virtual; {Seek next your mail}
|
||||
Function YoursFound: Boolean; Virtual; {Message found}
|
||||
// Procedure YoursFirst(Name: String; Handle: String); Virtual; {Seek your mail}
|
||||
// Procedure YoursNext; Virtual; {Seek next your mail}
|
||||
// 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}
|
||||
|
@ -496,6 +496,7 @@ Procedure TMsgBaseABS.MsgTxtStartUp;
|
|||
Begin
|
||||
End;
|
||||
|
||||
(*
|
||||
Procedure TMsgBaseABS.YoursFirst(Name: String; Handle: String);
|
||||
Begin
|
||||
End;
|
||||
|
@ -507,7 +508,7 @@ End;
|
|||
Function TMsgBaseABS.YoursFound: Boolean;
|
||||
Begin
|
||||
End;
|
||||
|
||||
*)
|
||||
Function TMsgBaseABS.CreateMsgBase(MaxMsg: Word; MaxDays: Word): Boolean;
|
||||
Begin
|
||||
End;
|
||||
|
|
|
@ -32,11 +32,12 @@ Type
|
|||
SavedY : Byte;
|
||||
CurX : Byte;
|
||||
Attr : Byte;
|
||||
LastChar : Char;
|
||||
|
||||
Procedure SetFore (Color: Byte);
|
||||
Procedure SetBack (Color: Byte);
|
||||
Procedure ResetControlCode;
|
||||
Function ParseNumber (Var Line: String) : Integer;
|
||||
Function ParseNumber : Integer;
|
||||
Function AddChar (Ch: Char) : Boolean;
|
||||
Procedure MoveXY (X, Y: Word);
|
||||
Procedure MoveUP;
|
||||
|
@ -130,28 +131,21 @@ Begin
|
|||
End;
|
||||
End;
|
||||
|
||||
Function TMsgBaseAnsi.ParseNumber (Var Line: String) : Integer;
|
||||
Function TMsgBaseAnsi.ParseNumber : Integer;
|
||||
Var
|
||||
A : Integer;
|
||||
B : LongInt;
|
||||
Str1 : String;
|
||||
Str2 : String;
|
||||
Res : LongInt;
|
||||
Str : String;
|
||||
Begin
|
||||
Str1 := Line;
|
||||
Val(Code, Result, Res);
|
||||
|
||||
Val(Str1, A, B);
|
||||
|
||||
If B = 0 Then
|
||||
Str1 := ''
|
||||
If Res = 0 Then
|
||||
Code := ''
|
||||
Else Begin
|
||||
Str2 := Copy(Str1, 1, B - 1);
|
||||
Str := Copy(Code, 1, Pred(Res));
|
||||
|
||||
Delete (Str1, 1, B);
|
||||
Val (Str2, A, B);
|
||||
Delete (Code, 1, Res);
|
||||
Val (Str, Result, Res);
|
||||
End;
|
||||
|
||||
Line := Str1;
|
||||
ParseNumber := A;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseAnsi.MoveXY (X, Y: Word);
|
||||
|
@ -168,11 +162,13 @@ Var
|
|||
X : Byte;
|
||||
Y : Byte;
|
||||
Begin
|
||||
X := ParseNumber(Code);
|
||||
Y := ParseNumber(Code);
|
||||
Y := ParseNumber;
|
||||
|
||||
If Y = 0 Then Y := 1;
|
||||
|
||||
X := ParseNumber;
|
||||
|
||||
If X = 0 Then X := 1;
|
||||
If Y = 0 Then Y := 1;
|
||||
|
||||
MoveXY (X, Y);
|
||||
|
||||
|
@ -184,7 +180,7 @@ Var
|
|||
NewPos : Integer;
|
||||
Offset : Integer;
|
||||
Begin
|
||||
Offset := ParseNumber (Code);
|
||||
Offset := ParseNumber;
|
||||
|
||||
If Offset = 0 Then Offset := 1;
|
||||
|
||||
|
@ -202,7 +198,7 @@ Procedure TMsgBaseAnsi.MoveDOWN;
|
|||
Var
|
||||
NewPos : Byte;
|
||||
Begin
|
||||
NewPos := ParseNumber (Code);
|
||||
NewPos := ParseNumber;
|
||||
|
||||
If NewPos = 0 Then NewPos := 1;
|
||||
|
||||
|
@ -216,7 +212,7 @@ Var
|
|||
NewPos : Integer;
|
||||
Offset : Integer;
|
||||
Begin
|
||||
Offset := ParseNumber (Code);
|
||||
Offset := ParseNumber;
|
||||
|
||||
If Offset = 0 Then Offset := 1;
|
||||
|
||||
|
@ -235,7 +231,7 @@ Var
|
|||
NewPos : Integer;
|
||||
Offset : Integer;
|
||||
Begin
|
||||
Offset := ParseNumber(Code);
|
||||
Offset := ParseNumber;
|
||||
|
||||
If Offset = 0 Then Offset := 1;
|
||||
|
||||
|
@ -278,7 +274,7 @@ Begin
|
|||
'h' : ResetControlCode;
|
||||
'm' : Begin
|
||||
While Length(Code) > 0 Do Begin
|
||||
Case ParseNumber(Code) of
|
||||
Case ParseNumber of
|
||||
0 : Attr := 7;
|
||||
1 : Attr := Attr OR $08;
|
||||
5 : Attr := Attr OR $80;
|
||||
|
@ -327,16 +323,18 @@ Begin
|
|||
PipeCode := PipeCode + Ch;
|
||||
|
||||
If Length(PipeCode) = 2 Then Begin
|
||||
|
||||
Case strS2I(PipeCode) of
|
||||
00..
|
||||
15 : SetFore(strS2I(PipeCode));
|
||||
16..
|
||||
23 : SetBack(strS2I(PipeCode) - 16);
|
||||
If PipeCode = '00' Then
|
||||
SetFore(0)
|
||||
Else
|
||||
AddChar('|');
|
||||
AddChar(PipeCode[1]);
|
||||
AddChar(PipeCode[2]);
|
||||
Case strS2I(PipeCode) of
|
||||
01..
|
||||
15 : SetFore(strS2I(PipeCode));
|
||||
16..
|
||||
23 : SetBack(strS2I(PipeCode) - 16);
|
||||
Else
|
||||
AddChar('|');
|
||||
AddChar(PipeCode[1]);
|
||||
AddChar(PipeCode[2]);
|
||||
End;
|
||||
|
||||
GotPipe := False;
|
||||
|
@ -349,13 +347,15 @@ Begin
|
|||
Case Escape of
|
||||
0 : Begin
|
||||
Case Ch of
|
||||
#27 : Escape := 1;
|
||||
#0 : ;
|
||||
#9 : MoveXY (CurX + 8, CurY);
|
||||
#12 : GotClear := True;
|
||||
#13 : CurX := 1;
|
||||
#27 : Escape := 1;
|
||||
Else
|
||||
If Ch = '|' Then
|
||||
GotPipe := True
|
||||
Else
|
||||
// If Ch = '|' Then
|
||||
// GotPipe := True
|
||||
// Else
|
||||
AddChar (Ch);
|
||||
|
||||
ResetControlCode;
|
||||
|
@ -372,6 +372,8 @@ Begin
|
|||
Else
|
||||
ResetControlCode;
|
||||
End;
|
||||
|
||||
LastChar := Ch;
|
||||
End;
|
||||
|
||||
Function TMsgBaseAnsi.ProcessBuf (Var Buf; BufLen: Word) : Boolean;
|
||||
|
@ -383,14 +385,18 @@ Begin
|
|||
|
||||
For Count := 1 to BufLen Do Begin
|
||||
If CurY > Lines Then Lines := CurY;
|
||||
|
||||
Case Buffer[Count] of
|
||||
#10 : If CurY = mysMaxMsgLines Then Begin
|
||||
Result := True;
|
||||
GotAnsi := False;
|
||||
|
||||
Break;
|
||||
End Else
|
||||
End Else Begin
|
||||
Inc (CurY);
|
||||
#13 : CurX := 1;
|
||||
|
||||
If LastChar <> #13 Then CurX := 1;
|
||||
End;
|
||||
#26 : Begin
|
||||
Result := True;
|
||||
Break;
|
||||
|
|
|
@ -219,9 +219,9 @@ Type
|
|||
// 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}
|
||||
Procedure YoursNext; Virtual; {Seek next your mail}
|
||||
Function YoursFound : Boolean; Virtual; {Message found}
|
||||
// Procedure YoursFirst (Name: String; Handle: String); Virtual; {Seek your mail}
|
||||
// Procedure YoursNext; Virtual; {Seek next your mail}
|
||||
// Function YoursFound : Boolean; Virtual; {Message found}
|
||||
Procedure StartNewMsg; Virtual;
|
||||
Function OpenMsgBase : Boolean; Virtual;
|
||||
Procedure CloseMsgBase; Virtual;
|
||||
|
@ -246,7 +246,7 @@ Type
|
|||
Function ReReadIdx (Var IdxLoc : LongInt) : Word;
|
||||
End;
|
||||
|
||||
Function JamStrCrc(St: String): LongInt;
|
||||
Function JamStrCrc (St: String): LongInt;
|
||||
|
||||
Implementation
|
||||
|
||||
|
@ -298,7 +298,7 @@ Begin
|
|||
If TxtBuf <> Nil Then Dispose(TxtBuf);
|
||||
End;
|
||||
|
||||
Function JamStrCrc(St: String): LongInt;
|
||||
Function JamStrCrc (St: String): LongInt;
|
||||
Var
|
||||
i: Word;
|
||||
crc: LongInt;
|
||||
|
@ -311,7 +311,7 @@ Begin
|
|||
JamStrCrc := Crc;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetMsgPath(St: String);
|
||||
Procedure TMsgBaseJAM.SetMsgPath (St: String);
|
||||
Begin
|
||||
JM^.MsgPath := Copy(St, 1, 124);
|
||||
End;
|
||||
|
@ -326,52 +326,52 @@ Begin
|
|||
JM^.Dest := Addr;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetOrig(Addr: RecEchoMailAddr);
|
||||
Procedure TMsgBaseJAM.SetOrig (Addr: RecEchoMailAddr);
|
||||
Begin
|
||||
JM^.Orig := Addr;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetFrom(Name: String);
|
||||
Procedure TMsgBaseJAM.SetFrom (Name: String);
|
||||
Begin
|
||||
JM^.MsgFrom := Name;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetTo(Name: String);
|
||||
Procedure TMsgBaseJAM.SetTo (Name: String);
|
||||
Begin
|
||||
JM^.MsgTo := Name;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetSubj(Str: String);
|
||||
Procedure TMsgBaseJAM.SetSubj (Str: String);
|
||||
Begin
|
||||
JM^.MsgSubj := Str;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetCost(SCost: Word);
|
||||
Procedure TMsgBaseJAM.SetCost (SCost: Word);
|
||||
Begin
|
||||
MsgHdr^.JamHdr.Cost := SCost;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetRefer(SRefer: LongInt);
|
||||
Procedure TMsgBaseJAM.SetRefer (SRefer: LongInt);
|
||||
Begin
|
||||
MsgHdr^.JamHdr.ReplyTo := SRefer;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetSeeAlso(SAlso: LongInt);
|
||||
Procedure TMsgBaseJAM.SetSeeAlso (SAlso: LongInt);
|
||||
Begin
|
||||
MsgHdr^.JamHdr.ReplyFirst := SAlso;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetDate(SDate: String);
|
||||
Procedure TMsgBaseJAM.SetDate (SDate: String);
|
||||
Begin
|
||||
JM^.MsgDate := SDate;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetTime(STime: String);
|
||||
Procedure TMsgBaseJAM.SetTime (STime: String);
|
||||
Begin
|
||||
JM^.MsgTime := STime;
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetAttr1(Mask: LongInt; St: Boolean);
|
||||
Procedure TMsgBaseJAM.SetAttr1 (Mask: LongInt; St: Boolean);
|
||||
Begin
|
||||
If St Then
|
||||
MsgHdr^.JamHdr.Attr1 := MsgHdr^.JamHdr.Attr1 Or Mask
|
||||
|
@ -379,67 +379,67 @@ Procedure TMsgBaseJAM.SetAttr1(Mask: LongInt; St: Boolean);
|
|||
MsgHdr^.JamHdr.Attr1 := MsgHdr^.JamHdr.Attr1 And (Not Mask);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetLocal(LS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetLocal (LS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_Local, LS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetRcvd(RS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetRcvd (RS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_Rcvd, RS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetPriv(PS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetPriv (PS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_Priv, PS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetHold(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetHold (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1 (Jam_Hold, SS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetCrash(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetCrash (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_Crash, SS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetKillSent(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetKillSent (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_KillSent, SS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetSent(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetSent (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_Sent, SS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetFAttach(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetFAttach (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_FAttch, SS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetReqRct(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetReqRct (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_RcptReq, SS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetReqAud(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetReqAud (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_ConfmReq, SS);
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetRetRct(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetRetRct (SS: Boolean);
|
||||
Begin
|
||||
End;
|
||||
|
||||
Procedure TMsgBaseJAM.SetFileReq(SS: Boolean);
|
||||
Procedure TMsgBaseJAM.SetFileReq (SS: Boolean);
|
||||
Begin
|
||||
SetAttr1(Jam_Freq, SS);
|
||||
End;
|
||||
|
||||
|
||||
Procedure TMsgBaseJAM.DoString(Str: String);
|
||||
Procedure TMsgBaseJAM.DoString (Str: String);
|
||||
Var
|
||||
i: Word;
|
||||
Begin
|
||||
|
@ -1354,7 +1354,7 @@ Procedure TMsgBaseJAM.SetMsgLoc(ML: LongInt); {Msg location}
|
|||
Begin
|
||||
JM^.CurrMsgNum := ML;
|
||||
End;
|
||||
|
||||
(*
|
||||
Procedure TMsgBaseJAM.YoursFirst (Name: String; Handle: String);
|
||||
Begin
|
||||
JM^.YourName := Name;
|
||||
|
@ -1422,6 +1422,7 @@ Function TMsgBaseJAM.YoursFound: Boolean;
|
|||
Begin
|
||||
YoursFound := ((JM^.CurrMsgNum >= JM^.BaseHdr.BaseMsgNum) and (JM^.CurrMsgNum <= GetHighMsgNum));
|
||||
End;
|
||||
*)
|
||||
|
||||
Procedure TMsgBaseJAM.StartNewMsg;
|
||||
Begin
|
||||
|
|
|
@ -262,9 +262,9 @@ Type
|
|||
Function GetMsgLoc: LongInt; Virtual; {To allow reseeking to message}
|
||||
Procedure SetMsgLoc(ML: LongInt); Virtual; {Reseek to message}
|
||||
Function IdxHighest: LongInt; Virtual; { *** }
|
||||
Procedure YoursFirst(Name: String; Handle: String); Virtual; {Seek your mail}
|
||||
Procedure YoursNext; Virtual; {Seek next your mail}
|
||||
Function YoursFound: Boolean; Virtual; {Message found}
|
||||
// Procedure YoursFirst(Name: String; Handle: String); Virtual; {Seek your mail}
|
||||
// Procedure YoursNext; Virtual; {Seek next your mail}
|
||||
// Function YoursFound: Boolean; Virtual; {Message found}
|
||||
Function GetMsgDisplayNum: LongInt; Virtual; {Get msg number to display}
|
||||
Function GetTxtPos: LongInt; Virtual; {Get indicator of msg text position}
|
||||
Procedure SetTxtPos(TP: LongInt); Virtual; {Set text position}
|
||||
|
@ -1513,6 +1513,7 @@ Begin
|
|||
SeekFirst(ML);
|
||||
End;
|
||||
|
||||
(*
|
||||
Procedure TMsgBaseSquish.YoursFirst (Name: String; Handle: String);
|
||||
Begin
|
||||
SqInfo^.CurrIdx := 0;
|
||||
|
@ -1554,7 +1555,7 @@ Function TMsgBaseSquish.YoursFound: Boolean;
|
|||
Begin
|
||||
YoursFound := SqInfo^.CurrIdx <= SqInfo^.SqBase.NumMsg;
|
||||
End;
|
||||
|
||||
*)
|
||||
Function TMsgBaseSquish.GetMsgDisplayNum: LongInt;
|
||||
Begin
|
||||
GetMsgDisplayNum := SqInfo^.CurrIdx;
|
||||
|
|
|
@ -74,7 +74,11 @@ Begin
|
|||
A := Pos(':', SearchStr);
|
||||
B := Pos('/', SearchStr);
|
||||
|
||||
AddrSearch := Not (A = 0) or (B <= A);
|
||||
If (A = 0) or (B <= A) Then
|
||||
AddrSearch := False
|
||||
Else
|
||||
AddrSearch := True;
|
||||
// AddrSearch := Not (A = 0) or (B <= A);
|
||||
|
||||
If AddrSearch Then Begin
|
||||
SearchZone := Copy(SearchStr, 1, A - 1);
|
||||
|
|
|
@ -62,7 +62,7 @@ Type
|
|||
Procedure GetOption2 (Edit: Boolean);
|
||||
Procedure GetOption3 (Edit: Boolean);
|
||||
Procedure GetTheme;
|
||||
Procedure UserLogon1 (Var UN, PW, MPE : String);
|
||||
Procedure UserLogon1 (Var MPE : String);
|
||||
Procedure UserLogon2;
|
||||
Procedure UserLogon3;
|
||||
Procedure CreateNewUser (DefName: String);
|
||||
|
@ -163,6 +163,7 @@ Var
|
|||
'A' : Res := Chat.Available;
|
||||
'I' : Res := Chat.Invisible;
|
||||
'K' : Res := AcsOkFlag;
|
||||
'N' : Res := Session.LastScanHadNew;
|
||||
'M' : Begin
|
||||
Res := Access(Session.Msgs.MBase.SysopACS);
|
||||
|
||||
|
@ -175,6 +176,7 @@ Var
|
|||
Res := (Temp2 >= Temp1);
|
||||
End Else
|
||||
Res := True;
|
||||
'Y' : Res := Session.LastScanHadYou;
|
||||
End;
|
||||
'S' : Res := ThisUser.Security >= strS2I(Data);
|
||||
'T' : Res := Session.TimeLeft > strS2I(Data);
|
||||
|
@ -1171,7 +1173,7 @@ Begin
|
|||
{$ENDIF}
|
||||
End;
|
||||
|
||||
Procedure TBBSUser.UserLogon1 (Var UN, PW, MPE : String);
|
||||
Procedure TBBSUser.UserLogon1 (Var MPE: String);
|
||||
Var
|
||||
A : Integer;
|
||||
Count : Byte;
|
||||
|
@ -1182,7 +1184,7 @@ Begin
|
|||
|
||||
Session.io.Graphics := 0;
|
||||
|
||||
Session.systemLog ('-');
|
||||
Session.SystemLog ('-');
|
||||
Session.SystemLog ('Connect from ' + Session.UserIPInfo + ' (' + Session.UserHostInfo + ')');
|
||||
|
||||
Session.HistoryHour := strS2I(Copy(TimeDos2Str(CurDateDos, False), 1, 2));
|
||||
|
@ -1194,11 +1196,7 @@ Begin
|
|||
Halt(0);
|
||||
End;
|
||||
|
||||
//Session.io.OutFullLn('|CL|CR' + strPadC(mysSoftwareID + ' BBS Version ' + mysVersion + ' for ' + OSID, 79, ' '));
|
||||
//Session.io.OutFullLn(strPadC(CopyID, 79, ' '));
|
||||
//Session.io.OutFullLn('|CR' + strPadC(mysWebSite, 79, ' '));
|
||||
|
||||
Session.io.OutFullLn ('|CL' + mysSoftwareID + ' BBS Version ' + mysVersion + ' for ' + OSID + ' : Node |ND');
|
||||
Session.io.OutFullLn ('|CL' + mysSoftwareID + ' BBS v' + mysVersion + ' for ' + OSID + ' Node |ND');
|
||||
Session.io.OutFullLn (CopyID);
|
||||
|
||||
If Config.DefTermMode = 0 Then
|
||||
|
@ -1213,9 +1211,6 @@ Begin
|
|||
|
||||
If Config.ThemeOnStart Then GetTheme;
|
||||
|
||||
If FileExist(Config.ScriptPath + 'startup.mpx') Then
|
||||
ExecuteMPL(NIL, 'startup');
|
||||
|
||||
If (Session.Theme.Flags AND ThmAllowASCII = 0) and (Session.io.Graphics = 0) Then Begin
|
||||
Session.io.OutFullLn (Session.GetPrompt(321));
|
||||
Session.SystemLog ('ASCII login disabled');
|
||||
|
@ -1227,11 +1222,14 @@ Begin
|
|||
Halt(0);
|
||||
End;
|
||||
|
||||
If UN <> '' Then Begin
|
||||
If Not FindUser(UN, True) Then
|
||||
If FileExist(Config.ScriptPath + 'startup.mpx') Then
|
||||
ExecuteMPL(NIL, 'startup');
|
||||
|
||||
If Session.UserLoginName <> '' Then Begin
|
||||
If Not FindUser(Session.UserLoginName, True) Then
|
||||
Halt;
|
||||
|
||||
If strUpper(PW) <> TempUser.Password Then Begin
|
||||
If strUpper(Session.UserLoginPW) <> TempUser.Password Then Begin
|
||||
UserNum := -1;
|
||||
Halt;
|
||||
End;
|
||||
|
|
|
@ -196,7 +196,7 @@
|
|||
; &1 = base number &2 = base name &3 = scan base? (Yes or No)
|
||||
093 |07|$R04|&1|15|$R03|&3 |07|$R29|&2
|
||||
094 |CR|12There are no available message bases!
|
||||
095 |09|$D77Ä|CR |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: |XX
|
||||
095 |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: |XX
|
||||
; For strings 096 - 099: &1 = message base name
|
||||
096 |CR |11|&1 will NOT be scanned in QWK packets!|CR
|
||||
097 |CR |11|&1 will be scanned in QWK packets!|CR
|
||||
|
@ -223,7 +223,7 @@
|
|||
; E-mail reader prompt
|
||||
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
|
||||
116 |CR (|&1 of |&2) Reading Messages (?/Help): |XX
|
||||
116 |CR|01[|09|&1 of |&2|01] |09Reading Messages (|10?|09/|10Help|09): |11
|
||||
117 |CR|12Delete this mail? |11
|
||||
118 |CR|15End of messages.
|
||||
; Post message TO:
|
||||
|
@ -241,7 +241,8 @@
|
|||
; &1 = email number &2 = email from
|
||||
; &3 = email subject &4 = email date
|
||||
126 |07|$R05|&1|15|$R32|&2|10|$R32|&3|11|&4
|
||||
127 |01|$D77Ä |CR |01[|10þ|01] |09Read waiting mail? |11
|
||||
; Read new email? &1 = total &2 = unread
|
||||
127 |01|$D77Ä |CR |01[|10þ|01] |09You have |11|&1 |09messages (|11|&2 |09unread|09). Read them now? |11
|
||||
; First message in thread prompt
|
||||
128 |CR|11This is the first message in the thread.
|
||||
; User lockout message.
|
||||
|
@ -372,7 +373,7 @@
|
|||
; &1 = File base number &2 = File base name &3 = Scan? (Yes or No)
|
||||
201 |07|$R04|&1|15|$R03|&3 |07|$R29|&2
|
||||
; Select scanned file bases prompt
|
||||
202 |09|$D77Ä|CR |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: |XX
|
||||
202 |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: |XX
|
||||
; &1 = File base name
|
||||
203 |CR |11|&1 will NOT be scanned in new file scan!|CR
|
||||
; &1 = File base name
|
||||
|
@ -395,7 +396,7 @@
|
|||
; Lightbar file list: Access to file denied.
|
||||
212 |12File is not available.|PN
|
||||
; Read Message personal prompt. &1 = Current Msg # &2 = Total Messages
|
||||
213 |CR|09[|&1 of |&2] Reading Messages (?/Help): |XX
|
||||
213 |CR|01[|09|&1 of |&2|01] |09Reading Messages (|10?|09/|10Help|09): |11
|
||||
; File group list header
|
||||
214 |CL|CR|$D13 |09Ú|$D54Ä|01¿|CR|$D13 |09³|17 ± |15File Groups|$D40 |16|01³|CR|$D13 |09À|01|$D54ÄÙ|CR|$D14 |10#|02# |10F|02ile |10G|02roup |10N|02ame|07|$D29 |02A|10reas|CR|$D14 |09|$D54Ä
|
||||
; File group list format
|
||||
|
@ -772,7 +773,7 @@
|
|||
; Ansi msg read: delete msg
|
||||
402 |CR|12Delete this mail? |11
|
||||
; Ansi msg read: jump to msg: &1 = cur msg num &2 = high msg num
|
||||
403 |CR|09Jump to which message? (1-|&2): |XX
|
||||
403 |CR|09Jump to which message? (|101|09-|10|&2|09): |11
|
||||
; Ansi msg read: scan toggle &1 = message base name
|
||||
404 |CR|11|&1 will NOT be scanned in new message scan!
|
||||
405 |CR|11|&1 will be scanned in new message scan!
|
||||
|
@ -820,7 +821,7 @@
|
|||
; new user: use lightbar message index?
|
||||
429 |CR|12Use lightbar message index? |11
|
||||
; msg scan setting footer
|
||||
430
|
||||
430 |09|$D77Ä|CR
|
||||
; Lightbar file list: #/filename:
|
||||
; &1 = filenum, &2 = filename, &3 = tag char &4 = size &5 = date &6 = DLs
|
||||
431 |07|&1|12|&3|15|$R57|&2 |09|$L07|&4 |&5
|
||||
|
@ -860,7 +861,7 @@
|
|||
; info edit: option 3
|
||||
448 |CR|09Enter optional field 3: |XX
|
||||
; file new scan setting footer
|
||||
449
|
||||
449 |09|$D77Ä|CR
|
||||
; private post (email) TO:
|
||||
450 |CR|09To: |XX
|
||||
; reply msg SUBJ
|
||||
|
@ -947,11 +948,11 @@
|
|||
484 |16|CL|09|17 ° |15Chat mode end.|$X79 |16|DE|DE
|
||||
; User2User accept chat page request? &1=user &2=Node
|
||||
485 |16|CL|15|&1 is requesting private user chat. Accept? |11
|
||||
; MsgBase quickscan header prompt
|
||||
486 |CR|12Starting Quick Scan|CR
|
||||
;
|
||||
486 UNUSED
|
||||
; MsgBase quickscan Scanning prompt
|
||||
; &1=basename &2=current base# &3=total bases#
|
||||
487 Scanning |&1 [|&2 of |&3]...
|
||||
487 |03Scanning |11|&1 |03[|11|&2 |03of |11|&3|03]|08...
|
||||
; MsgBase quickscan base list prompt
|
||||
; &4=msgs in base &5=new messages &6=your messages &7=global total msg
|
||||
; &8=global new msgs &9=global your msgs
|
||||
|
@ -959,9 +960,9 @@
|
|||
; MsgBase quickscan footer prompt
|
||||
; &7=global total msg &8=global new msgs &9=global your msgs
|
||||
489 |CRQuick Scan complete. |CR|CR|PA
|
||||
; Msg header flags text one word each separated by a space
|
||||
; 1=Local 2=Echo 3=Private 4=Sent 5=Delete
|
||||
490 Local Echo Private Sent Deleted
|
||||
; Msg header flags text one word each separated by a comma
|
||||
; 1=Local 2=Echo 3=Private 4=Sent 5=Delete, 6=Received
|
||||
490 Local,Echo,Priv,Sent,Del,Read
|
||||
; File base filesize flags one word separated by a space
|
||||
; 1=offline 2=failed 3=unvalidated 4=GB 5=MB 6=KB 7=B
|
||||
491 OFFLINE FAILED UNVALID GB MB KB B
|
||||
|
@ -992,3 +993,14 @@
|
|||
; QWK .REP complete/results prompt
|
||||
; &1=msgs imported &2=msgs failed &3=bases added to scan &4=bases removed
|
||||
503 |10SUCCESS|01.|CR|CR|11- |03Posted |11|&1 |03new messages (|11|&2 |03failed)|CR|11- |03Added |11|&3 |03bases to new scan (|11|&4 |03removed).|CR|CR|PA
|
||||
; Standard message reader: Lastread pointer set &1 = msg number
|
||||
504 |CR|11Last read pointer has been set to message number |&1.|CR|CR|PA
|
||||
; Lightbar reader: Lastread pointer set &1 = msg number
|
||||
505 |CR|11Last read pointer has been set to message number |&1.|CR|CR|PA
|
||||
; QuickScan message list header &2=basename
|
||||
506 |15From Base Subject|CR|09=============== ==================== ==========================================
|
||||
; QuickScan message list middle
|
||||
; &1=msg# &2=basename &3=from &4=to &5=subject &6=date
|
||||
507 |10|$R15|&3 |09|$R20|&2 |11|$R42|&5
|
||||
; QuicScan message list footer
|
||||
508 |09|$D79=|CR
|
||||
|
|
|
@ -109,6 +109,12 @@ Begin
|
|||
Halt(1);
|
||||
End;
|
||||
|
||||
TempPath := bbsConfig.SystemPath + 'temp0' + PathChar;
|
||||
|
||||
{$I-} MkDir (TempPath); {$I+}
|
||||
|
||||
If IoResult <> 0 Then;
|
||||
|
||||
DirChange(bbsConfig.SystemPath);
|
||||
End;
|
||||
|
||||
|
|
|
@ -184,7 +184,8 @@ Begin
|
|||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
|
||||
MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If MsgBase^.OpenMsgBase Then Begin
|
||||
Low := 1;
|
||||
|
@ -264,7 +265,8 @@ Begin
|
|||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
|
||||
MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If MsgBase^.OpenMsgBase Then Begin
|
||||
LowMessage := 1;
|
||||
|
@ -283,6 +285,7 @@ Begin
|
|||
ClientWriteLine('.');
|
||||
End;
|
||||
|
||||
(*
|
||||
Procedure TNNTPServer.cmd_POST;
|
||||
Var
|
||||
MsgBase : PMsgBaseABS;
|
||||
|
@ -408,6 +411,196 @@ Begin
|
|||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
|
||||
// set tmpbuf
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then
|
||||
If Not MsgBase^.CreateMsgBase (TempBase.MaxMsgs, TempBase.MaxAge) Then Begin
|
||||
Dispose(MsgBase, Done);
|
||||
MsgText.Free;
|
||||
Client.WriteLine('441 Cannot save');
|
||||
Exit;
|
||||
End Else
|
||||
If Not MsgBase^.OpenMsgBase Then Begin
|
||||
Dispose(MsgBase, Done);
|
||||
MsgText.Free;
|
||||
Client.WriteLine('411 Cannot save');
|
||||
Exit;
|
||||
End;
|
||||
|
||||
MsgBase^.StartNewMsg;
|
||||
|
||||
MsgBase^.SetLocal (True);
|
||||
MsgBase^.SetDate (FormatDateTime('mm/dd/yy', Now));
|
||||
MsgBase^.SetTime (FormatDateTime('hh:nn', Now));
|
||||
MsgBase^.SetTo ('All');
|
||||
MsgBase^.SetSubj (Subject);
|
||||
|
||||
If TempBase.Flags And MBRealNames <> 0 Then
|
||||
MsgBase^.SetFrom(User.RealName)
|
||||
Else
|
||||
MsgBase^.SetFrom(User.Handle);
|
||||
|
||||
If TempBase.NetType > 0 Then Begin
|
||||
MsgBase^.SetMailType(mmtEchoMail);
|
||||
|
||||
Case TempBase.NetType of
|
||||
1 : Assign (SemFile, bbsConfig.SemaPath + fn_SemFileEcho);
|
||||
2 : Assign (SemFile, bbsConfig.SemaPath + fn_SemFileNews);
|
||||
End;
|
||||
|
||||
ReWrite (SemFile);
|
||||
Close (SemFile);
|
||||
End Else
|
||||
MsgBase^.SetMailType(mmtNormal);
|
||||
|
||||
MsgBase^.SetPriv (TempBase.Flags and MBPrivate <> 0);
|
||||
|
||||
For Count := 1 to MsgText.Count Do Begin
|
||||
InData := MsgText.Strings[Count - 1];
|
||||
|
||||
If Length(InData) > 79 Then InData[0] := #79;
|
||||
|
||||
MsgBase^.DoStringLn(InData);
|
||||
End;
|
||||
|
||||
MsgBase^.WriteMsg;
|
||||
MsgBase^.CloseMsgBase;
|
||||
|
||||
Dispose (MsgBase, Done);
|
||||
|
||||
MsgText.Free;
|
||||
|
||||
ClientWriteLine ('240 Article posted ok');
|
||||
End;
|
||||
*)
|
||||
|
||||
Procedure TNNTPServer.cmd_POST;
|
||||
Var
|
||||
MsgBase : PMsgBaseABS;
|
||||
MBaseFile : File of RecMessageBase;
|
||||
TempBase : RecMessageBase;
|
||||
MsgText : TStringList;
|
||||
Subject : String;
|
||||
Newsgroup : String;
|
||||
InData : String;
|
||||
HackCount : LongInt;
|
||||
Count : LongInt;
|
||||
GotStart : Boolean;
|
||||
Found : Boolean;
|
||||
SemFile : File;
|
||||
Begin
|
||||
If Not LoggedIn Then Begin
|
||||
ClientWriteLine(re_AuthReq);
|
||||
Exit;
|
||||
End;
|
||||
|
||||
ClientWriteLine('340 Send article to be posted. End with <CRLF>.<CRLF>');
|
||||
|
||||
Subject := '';
|
||||
Newsgroup := '';
|
||||
GotStart := False;
|
||||
MsgText := TStringList.Create;
|
||||
|
||||
Repeat
|
||||
Client.ReadLine(InData);
|
||||
|
||||
If InData = '.' Then Break;
|
||||
|
||||
If Not GotStart And (Pos('Newsgroups:', InData) > 0) Then Begin
|
||||
Newsgroup := Copy(InData, 13, 255);
|
||||
|
||||
Continue;
|
||||
End;
|
||||
|
||||
If Not GotStart And (Pos('Subject:', InData) > 0) Then Begin
|
||||
Subject := Copy(InData, 10, 255);
|
||||
|
||||
Continue;
|
||||
End;
|
||||
|
||||
If (InData = '') And Not GotStart Then Begin
|
||||
GotStart := True;
|
||||
Continue;
|
||||
End;
|
||||
|
||||
If MsgText.Count >= mysMaxMsgLines Then Begin
|
||||
HackCount := 0;
|
||||
|
||||
While Not Terminated And (InData <> '.') Do Begin
|
||||
Client.ReadLine(InData);
|
||||
|
||||
Inc (HackCount);
|
||||
|
||||
If HackCount >= HackThreshold Then Begin
|
||||
EndSession := True; // someone is being a douchebag
|
||||
|
||||
Server.Status('Flood attempt from ' + Client.PeerIP + '. Goodbye');
|
||||
|
||||
MsgText.Free;
|
||||
|
||||
Exit;
|
||||
End;
|
||||
End;
|
||||
|
||||
Break;
|
||||
End;
|
||||
|
||||
If GotStart Then MsgText.Add(InData);
|
||||
Until Terminated;
|
||||
|
||||
If Terminated Then Exit;
|
||||
|
||||
If (Subject = '') Then Begin
|
||||
MsgText.Free;
|
||||
|
||||
ClientWriteLine('441 No subject; message not posted');
|
||||
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Found := False;
|
||||
|
||||
Assign (MBaseFile, bbsConfig.DataPath + 'mbases.dat');
|
||||
|
||||
If ioReset(MBaseFile, SizeOf(RecMessageBase), fmRWDN) Then Begin
|
||||
ioRead (MBaseFile, TempBase);
|
||||
|
||||
While Not EOF(MBaseFile) Do Begin
|
||||
ioRead (MBaseFile, TempBase);
|
||||
|
||||
If TempBase.NewsName = Newsgroup Then Begin
|
||||
Found := True;
|
||||
|
||||
Break;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
|
||||
Close (MBaseFile);
|
||||
|
||||
If Not Found or (Newsgroup = '') Then Begin
|
||||
MsgText.Free;
|
||||
|
||||
ClientWriteLine('441 No newsgroup selected');
|
||||
|
||||
Exit;
|
||||
End;
|
||||
|
||||
If Not CheckAccess(User, True, TempBase.PostACS) or (TempBase.NetType = 3) Then Begin
|
||||
MsgText.Free;
|
||||
|
||||
ClientWriteLine('441 No post access');
|
||||
|
||||
Exit;
|
||||
End;
|
||||
|
||||
Case TempBase.BaseType of
|
||||
0 : MsgBase := New(PMsgBaseJAM, Init);
|
||||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (TempBase.Path + TempBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then
|
||||
If Not MsgBase^.CreateMsgBase (TempBase.MaxMsgs, TempBase.MaxAge) Then Begin
|
||||
|
@ -493,7 +686,8 @@ Begin
|
|||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then Begin
|
||||
ClientWriteLine('423 No such article');
|
||||
|
@ -577,7 +771,8 @@ Begin
|
|||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then Begin
|
||||
ClientWriteLine('420 No article(s) selected');
|
||||
|
|
|
@ -55,6 +55,7 @@ Type
|
|||
Procedure Execute; Override;
|
||||
Destructor Destroy; Override;
|
||||
|
||||
Function IsUser (Str: String) : Boolean;
|
||||
Procedure ResetSession;
|
||||
Procedure CreateMailBoxData;
|
||||
Procedure DeleteMessages;
|
||||
|
@ -105,6 +106,12 @@ Begin
|
|||
MailSize := 0;
|
||||
End;
|
||||
|
||||
Function TPOP3Server.IsUser (Str: String) : Boolean;
|
||||
Begin
|
||||
Str := strUpper(Str);
|
||||
Result := LoggedIn and ((strUpper(User.RealName) = Str) or (strUpper(User.Handle) = Str));
|
||||
End;
|
||||
|
||||
Procedure TPOP3Server.ResetSession;
|
||||
Var
|
||||
Count : LongInt;
|
||||
|
@ -185,41 +192,45 @@ Begin
|
|||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then Begin
|
||||
Dispose (MsgBase, Done);
|
||||
Exit;
|
||||
End;
|
||||
|
||||
MsgBase^.YoursFirst(User.RealName, User.Handle);
|
||||
MsgBase^.SeekFirst(1);
|
||||
|
||||
While MsgBase^.YoursFound Do Begin
|
||||
While MsgBase^.SeekFound Do Begin
|
||||
MsgBase^.MsgStartup;
|
||||
MsgBase^.MsgTxtStartup;
|
||||
|
||||
Inc (MailSize);
|
||||
if IsUser(MsgBase^.GetTo) Then Begin
|
||||
MsgBase^.MsgTxtStartup;
|
||||
|
||||
New (MailInfo[MailSize]);
|
||||
Inc (MailSize);
|
||||
|
||||
MailInfo[MailSize].Text := TStringList.Create;
|
||||
New (MailInfo[MailSize]);
|
||||
|
||||
AddLine ('Date: ' + ParseDateTime(MsgBase^.GetDate, MsgBase^.GetTime));
|
||||
AddLine ('From: ' + MsgBase^.GetFrom + ' <' + strReplace(MsgBase^.GetFrom, ' ', '_') + '@' + bbsConfig.inetDomain + '>');
|
||||
AddLine ('X-Mailer: Mystic BBS ' + mysVersion);
|
||||
AddLine ('To: ' + MsgBase^.GetTo + ' <' + strReplace(MsgBase^.GetTo, ' ', '_') + '@' + bbsConfig.inetDomain + '>');
|
||||
AddLine ('Subject: ' + MsgBase^.GetSubj);
|
||||
AddLine ('Content-Type: text/plain; charset=us-ascii');
|
||||
AddLine ('');
|
||||
MailInfo[MailSize].Text := TStringList.Create;
|
||||
|
||||
While Not MsgBase^.EOM Do
|
||||
AddLine(MsgBase^.GetString(79));
|
||||
AddLine ('Date: ' + ParseDateTime(MsgBase^.GetDate, MsgBase^.GetTime));
|
||||
AddLine ('From: ' + MsgBase^.GetFrom + ' <' + strReplace(MsgBase^.GetFrom, ' ', '_') + '@' + bbsConfig.inetDomain + '>');
|
||||
AddLine ('X-Mailer: Mystic BBS ' + mysVersion);
|
||||
AddLine ('To: ' + MsgBase^.GetTo + ' <' + strReplace(MsgBase^.GetTo, ' ', '_') + '@' + bbsConfig.inetDomain + '>');
|
||||
AddLine ('Subject: ' + MsgBase^.GetSubj);
|
||||
AddLine ('Content-Type: text/plain; charset=us-ascii');
|
||||
AddLine ('');
|
||||
|
||||
MailInfo[MailSize].MD5 := GetMessageUID(MsgBase);
|
||||
MailInfo[MailSize].GotRETR := False;
|
||||
MailInfo[MailSize].Deleted := False;
|
||||
While Not MsgBase^.EOM Do
|
||||
AddLine(MsgBase^.GetString(79));
|
||||
|
||||
MsgBase^.YoursNext;
|
||||
MailInfo[MailSize].MD5 := GetMessageUID(MsgBase);
|
||||
MailInfo[MailSize].GotRETR := False;
|
||||
MailInfo[MailSize].Deleted := False;
|
||||
End;
|
||||
|
||||
MsgBase^.SeekNext;
|
||||
End;
|
||||
|
||||
MsgBase^.CloseMsgBase;
|
||||
|
@ -246,7 +257,8 @@ Begin
|
|||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then Begin
|
||||
Dispose (MsgBase, Done);
|
||||
|
@ -255,17 +267,18 @@ Begin
|
|||
|
||||
For Count := 1 to MailSize Do Begin
|
||||
If MailInfo[Count].Deleted or (MailInfo[Count].GotRETR and bbsConfig.inetPOP3Delete) Then Begin
|
||||
MsgBase^.YoursFirst(User.RealName, User.Handle);
|
||||
MsgBase^.SeekFirst(1);
|
||||
|
||||
While MsgBase^.YoursFound Do Begin
|
||||
While MsgBase^.SeekFound Do Begin
|
||||
MsgBase^.MsgStartUp;
|
||||
|
||||
If GetMessageUID(MsgBase) = MailInfo[Count].MD5 Then Begin
|
||||
MsgBase^.DeleteMsg;
|
||||
Break;
|
||||
End;
|
||||
If IsUser(MsgBase^.GetTo) Then
|
||||
If GetMessageUID(MsgBase) = MailInfo[Count].MD5 Then Begin
|
||||
MsgBase^.DeleteMsg;
|
||||
Break;
|
||||
End;
|
||||
|
||||
MsgBase^.YoursNext;
|
||||
MsgBase^.SeekNext;
|
||||
End;
|
||||
End;
|
||||
End;
|
||||
|
|
|
@ -188,12 +188,16 @@ Begin
|
|||
// todo: what happens if they never send an EOL... could still flood
|
||||
|
||||
Client.ReadLine(InData);
|
||||
|
||||
Inc (HackCount);
|
||||
|
||||
If HackCount >= SMTPHackThresh Then Begin
|
||||
EndSession := True; // someone is being a douchebag
|
||||
|
||||
Server.Status('Flood attempt from ' + FromName + ' (' + Client.PeerIP + '); Goodbye');
|
||||
|
||||
MsgText.Free;
|
||||
|
||||
Exit;
|
||||
End;
|
||||
End;
|
||||
|
@ -214,7 +218,8 @@ Begin
|
|||
1 : MsgBase := New(PMsgBaseSquish, Init);
|
||||
End;
|
||||
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetMsgPath (MBase.Path + MBase.FileName);
|
||||
MsgBase^.SetTempFile (TempPath + 'msgbuf.');
|
||||
|
||||
If Not MsgBase^.OpenMsgBase Then
|
||||
If Not MsgBase^.CreateMsgBase (MBase.MaxMsgs, MBase.MaxAge) Then Begin
|
||||
|
|
|
@ -12,6 +12,7 @@ Uses
|
|||
|
||||
Var
|
||||
bbsConfig : RecConfig;
|
||||
TempPath : String;
|
||||
Console : TOutput;
|
||||
Term : TTermAnsi;
|
||||
|
||||
|
|
|
@ -291,7 +291,7 @@ Begin
|
|||
AddProc ({$IFDEF MPLPARSER} 'putthisuser', {$ENDIF} '', iNone); // 538
|
||||
AddProc ({$IFDEF MPLPARSER} 'putuser', {$ENDIF} 'l', iNone); // 539
|
||||
AddProc ({$IFDEF MPLPARSER} 'isuser', {$ENDIF} 's', iBool); // 540
|
||||
AddProc ({$IFDEF MPLPARSER} 'getmbasestats', {$ENDIF} 'lLLL', iBool); // 541
|
||||
AddProc ({$IFDEF MPLPARSER} 'getmbstats', {$ENDIF} 'looLLL', 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
|
||||
|
@ -312,6 +312,8 @@ Begin
|
|||
AddPointer ({$IFDEF MPLPARSER} 'ignoregroups', {$ENDIF} iBool, 1, {$IFNDEF MPLPARSER} @Session.User.IgnoreGroup {$ELSE} NIL {$ENDIF});
|
||||
AddPointer ({$IFDEF MPLPARSER} 'pausepos', {$ENDIF} iByte, 1, {$IFNDEF MPLPARSER} @Session.io.PausePtr {$ELSE} NIL {$ENDIF});
|
||||
AddPointer ({$IFDEF MPLPARSER} 'allowmci', {$ENDIF} iBool, 1, {$IFNDEF MPLPARSER} @Session.io.PausePtr {$ELSE} NIL {$ENDIF});
|
||||
AddPointer ({$IFDEF MPLPARSER} 'userloginname',{$ENDIF} iString, 31, {$IFNDEF MPLPARSER} @Session.UserLoginName {$ELSE} NIL {$ENDIF});
|
||||
AddPointer ({$IFDEF MPLPARSER} 'userloginpw', {$ENDIF} iString, 16, {$IFNDEF MPLPARSER} @Session.UserLoginPW {$ELSE} NIL {$ENDIF});
|
||||
|
||||
{$IFNDEF MPLPARSER} TInterpEngine(S).IdxVarDir := X + 1; {$ENDIF}
|
||||
|
||||
|
|
|
@ -92,7 +92,7 @@ Type
|
|||
|
||||
Procedure GetMBaseVars (Var M: RecMessageBase);
|
||||
Function GetMBaseRecord (Num: LongInt) : Boolean;
|
||||
Function GetMBaseStats (Num: LongInt; Var Total, New, Yours: LongInt) : Boolean;
|
||||
Function GetMBaseStats (Num: LongInt; SkipFrom, SkipRead: Boolean; Var Total, New, Yours: LongInt) : Boolean;
|
||||
|
||||
Procedure GetMGroupVars (Var G: RecGroup);
|
||||
Function GetMGroupRecord (Num: LongInt) : Boolean;
|
||||
|
@ -244,14 +244,15 @@ Begin
|
|||
Move (M.SysopACS, VarData[IdxVarMBase + 5 ]^.Data^, SizeOf(M.SysopACS));
|
||||
End;
|
||||
|
||||
Function TInterpEngine.GetMBaseStats (Num: LongInt; Var Total, New, Yours: LongInt) : Boolean;
|
||||
Function TInterpEngine.GetMBaseStats (Num: LongInt; SkipFrom, SkipRead: Boolean; Var Total, New, Yours: LongInt) : Boolean;
|
||||
Var
|
||||
M : RecMessageBase;
|
||||
T : LongInt;
|
||||
Begin
|
||||
Result := Session.Msgs.GetBaseByNum(Num, M);
|
||||
|
||||
If Result Then
|
||||
Session.Msgs.GetMessageStats(M, Total, New, Yours);
|
||||
Session.Msgs.GetMessageStats(False, False, False, T, M, SkipFrom, SkipRead, Total, New, Yours);
|
||||
End;
|
||||
|
||||
Function TInterpEngine.GetMBaseRecord (Num: LongInt) : Boolean;
|
||||
|
@ -1903,7 +1904,7 @@ Begin
|
|||
Store (TempBool, 1);
|
||||
End;
|
||||
541 : Begin
|
||||
TempBool := GetMBaseStats(Param[1].L, LongInt(Pointer(Param[2].vData)^), LongInt(Pointer(Param[3].vData)^), LongInt(Pointer(Param[4].vData)^));
|
||||
TempBool := GetMBaseStats(Param[1].L, Param[2].O, Param[3].O, LongInt(Pointer(Param[3].vData)^), LongInt(Pointer(Param[4].vData)^), LongInt(Pointer(Param[5].vData)^));
|
||||
Store (TempBool, 1);
|
||||
End;
|
||||
542 : WriteXY (Param[1].B, Param[2].B, Param[3].B, Param[4].S);
|
||||
|
|
|
@ -77,7 +77,7 @@ Type
|
|||
);
|
||||
|
||||
Const
|
||||
mplVer = '11E';
|
||||
mplVer = '11G';
|
||||
mplVersion = '[MPX ' + mplVer +']' + #26;
|
||||
mplVerLength = 10;
|
||||
mplExtSource = '.mps';
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
; list of functions to perform on startup
|
||||
|
||||
Import_FIDONET.NA = true
|
||||
Import_MessageBase = true
|
||||
Import_MessageBase = true
|
||||
Import_FILEBONE.NA = true
|
||||
Import_FILES.BBS = true
|
||||
MassUpload = true
|
||||
|
@ -333,8 +333,8 @@
|
|||
|
||||
[ImportMessageBase]
|
||||
|
||||
; This option scans the message base directory, and creates any messages
|
||||
; bases inside of Mystic that have data files in the directory.
|
||||
; This option scans the message base directory, and creates any messages
|
||||
; bases inside of Mystic that have data files in the directory.
|
||||
|
||||
; The following options define the "default" values used when creating
|
||||
; new message bases. netaddress must match an exiting network
|
||||
|
@ -353,9 +353,9 @@
|
|||
max_msgs = 500
|
||||
max_msgs_age = 365
|
||||
|
||||
; network type (0=local, 1=echomail, 2=newsgroup 3=netmail)
|
||||
; network type (0=local, 1=echomail, 2=newsgroup 3=netmail)
|
||||
|
||||
net_type = 1
|
||||
net_type = 1
|
||||
|
||||
; true/false type values 0=false 1=true (newscan 2=forced)
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ Var
|
|||
Count : Cardinal;
|
||||
Addr : RecEchoMailAddr;
|
||||
Begin
|
||||
FileMode := 66;
|
||||
FileMode := 66;
|
||||
BaseKills := 0;
|
||||
|
||||
Inc (BaseTotal);
|
||||
|
@ -150,8 +150,8 @@ Var
|
|||
3 : NewData^.SetMailType(mmtNetMail);
|
||||
End;
|
||||
|
||||
NewData^.SetOrig(MsgData^.GetOrigAddr);
|
||||
NewData^.SetDest(MsgData^.GetDestAddr);
|
||||
NewData^.SetOrig (MsgData^.GetOrigAddr);
|
||||
NewData^.SetDest (MsgData^.GetDestAddr);
|
||||
|
||||
MsgData^.MsgTxtStartUp;
|
||||
|
||||
|
|
|
@ -362,11 +362,9 @@ Begin
|
|||
End;
|
||||
|
||||
Var
|
||||
Count : Byte;
|
||||
Temp : String[120];
|
||||
UserName : String[30];
|
||||
Password : String[15];
|
||||
Script : String[120];
|
||||
Count : Byte;
|
||||
Temp : String[120];
|
||||
Script : String[120];
|
||||
Begin
|
||||
{$IFDEF DEBUG}
|
||||
SetHeapTraceOutput('mystic.mem');
|
||||
|
@ -411,10 +409,10 @@ Begin
|
|||
Session.UserHostInfo := Copy(ParamStr(Count), 6, Length(Temp))
|
||||
Else
|
||||
If Copy(Temp, 1, 2) = '-U' Then
|
||||
UserName := strReplace(Copy(Temp, 3, Length(Temp)), '_', ' ')
|
||||
Session.UserLoginName := strReplace(Copy(Temp, 3, Length(Temp)), '_', ' ')
|
||||
Else
|
||||
If Copy(Temp, 1, 2) = '-P' Then
|
||||
Password := Copy(Temp, 3, Length(Temp))
|
||||
Session.UserLoginPW := Copy(Temp, 3, Length(Temp))
|
||||
Else
|
||||
If Copy(Temp, 1, 2) = '-X' Then
|
||||
Script := strReplace(Copy(ParamStr(Count), 3, Length(Temp)), '_', ' ')
|
||||
|
@ -489,7 +487,7 @@ Begin
|
|||
//Halt(0);
|
||||
{$ENDIF}
|
||||
|
||||
Session.User.UserLogon1 (UserName, Password, Script);
|
||||
Session.User.UserLogon1 (Script);
|
||||
|
||||
If Session.TimeOffset > 0 Then
|
||||
Session.TimeSaved := Session.User.ThisUser.TimeLeft;
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
Const
|
||||
mysSoftwareID = 'Mystic'; // no idea
|
||||
mysCopyYear = '1997-2013'; // its been a long time!
|
||||
mysVersion = '1.10 A27'; // current version
|
||||
mysVersion = '1.10 A29'; // current version
|
||||
mysDataChanged = '1.10 A11'; // version of last records change
|
||||
|
||||
{$IFDEF WIN32}
|
||||
|
@ -59,7 +59,7 @@ Const
|
|||
mysMaxMenuCmds = 25; // Max menu commands per item
|
||||
mysMaxMenuInput = 12;
|
||||
mysMaxMenuStack = 8;
|
||||
mysMaxThemeText = 503; // Total prompts in theme file
|
||||
mysMaxThemeText = 508;
|
||||
|
||||
fn_SemFileEcho = 'echomail.now';
|
||||
fn_SemFileNews = 'newsmail.now';
|
||||
|
@ -67,6 +67,8 @@ Const
|
|||
fn_tplMsgEdit = 'ansiedit';
|
||||
fn_tplTextEdit = 'ansitext';
|
||||
|
||||
ColumnValue : Array[0..1] of Byte = (80, 40);
|
||||
|
||||
Type
|
||||
SmallWord = System.Word;
|
||||
Integer = SmallInt;
|
||||
|
@ -706,7 +708,8 @@ Type
|
|||
MGroupBar : RecPercent;
|
||||
MAreaList : RecPercent;
|
||||
Colors : Array[0..9] of Byte;
|
||||
Reserved : Array[1..199] of Byte;
|
||||
ColumnSize : Byte;
|
||||
Reserved : Array[1..198] of Byte;
|
||||
End;
|
||||
|
||||
BBSListRec = Record
|
||||
|
|
|
@ -8,6 +8,7 @@ design elements/issues.
|
|||
BUGS AND POSSIBLE ISSUES
|
||||
========================
|
||||
|
||||
! Posting echomail via NNTP is not setting ECHO flag
|
||||
! LBP menus arent scrolling correctly in Linux
|
||||
! MUTIL FILESBBS import is not skipping FILES.BBS?
|
||||
! Make sure MIS in Linux works with DOSEMU
|
||||
|
@ -28,6 +29,9 @@ BUGS AND POSSIBLE ISSUES
|
|||
FUTURE / IDEAS / WORK IN PROGRESS / NOTES
|
||||
=========================================
|
||||
|
||||
- MUTIL create FILES.BBS in the file base directory
|
||||
- MUTILs new DIR import of msg bases could have optional config to reference
|
||||
a series of .NA files to get the name/description of bases.
|
||||
- New Scan/Read message should have option to not update last read when
|
||||
reading personal messages.
|
||||
- Option for QuickScan that only prints a base if it has new messages.
|
||||
|
|
|
@ -1754,12 +1754,14 @@
|
|||
mentioning it just in case.
|
||||
|
||||
+ New MPL function: GetMBaseStats. This can be used as a function or a
|
||||
procedure (returning true if successful). It takes 4 parameters.
|
||||
procedure (returning true if successful). It takes 6 parameters.
|
||||
|
||||
#1: Message base number
|
||||
#2: Total messages (this is a VAR parameter)
|
||||
#3: New messages (this is a VAR parameter)
|
||||
#4: New messages to you (this is a VAR parameter)
|
||||
#2: Exclude messages FROM the current user in stats
|
||||
#3: Exclude messages TO the current user that have already been read
|
||||
#4: Total messages (this is a VAR parameter)
|
||||
#5: New messages (this is a VAR parameter)
|
||||
#6: New messages to you (this is a VAR parameter)
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -1771,7 +1773,7 @@
|
|||
count := 1; //start @1 to skip email base
|
||||
|
||||
while getmbase(count) do begin
|
||||
getmbasestats(count, total, new, yours);
|
||||
getmbstats(count, true, true, total, new, yours);
|
||||
|
||||
writeln('base : ' + mbasename);
|
||||
writeln('total msgs : ' + int2str(total));
|
||||
|
@ -2671,4 +2673,196 @@
|
|||
|
||||
+ E-mail messages are now included in QWK packets.
|
||||
|
||||
<ALPHA 28 RELEASED>
|
||||
+ Added additional support for the QWKE packets. Mystic will now generate
|
||||
the appropriate QWKE data to tell the reader if the message base is
|
||||
public or private, if reading is forced, if real names or handles should
|
||||
be used, and whether or not they have access to post/reply to the area.
|
||||
|
||||
+ Rewrote the status bar on the local console (in Windows) to use the color
|
||||
values set in the configuration.
|
||||
|
||||
+ Message QuickScan (MQ) menu command now has two new options:
|
||||
|
||||
/YOU - Only show base if it has messages address to you
|
||||
/NEW - Only show base if it has new messages
|
||||
|
||||
! Fixed a bug which caused the nodelist text search to not work.
|
||||
|
||||
+ The "startup" MPL program that is executed if it exists after ANSI
|
||||
detection and theme assignment can now set the user login and password
|
||||
to bypass the internal login functions. You must set to two variables:
|
||||
|
||||
UserLoginName
|
||||
UserLoginPW
|
||||
|
||||
So for example if I had a startup.mpx that simply did this:
|
||||
|
||||
Begin
|
||||
UserLoginName := 'g00r00';
|
||||
UserLoginPW := 'mypassword';
|
||||
End;
|
||||
|
||||
It would automatically log in as g00r00 and bypass the normal login/pw
|
||||
stuff. This combined with newuserapp.mpx allows you to completely
|
||||
rewrite login and newuser functions in MPL if you'd like to.
|
||||
|
||||
+ The Read Messages menu command (MR) now has the option to pass /NOLR
|
||||
in the optional data. If this is found, Mystic will not update the
|
||||
users last read pointers after reading.
|
||||
|
||||
You MUST still supply the read type as the first character. So for
|
||||
example:
|
||||
|
||||
Command: MR
|
||||
Optional data: Y /NOLR
|
||||
|
||||
Would read all messages addressed specifically to that user, but would
|
||||
not set their last read pointers.
|
||||
|
||||
+ The Message New Scan (MN) now has the option to supply /NOLR which will
|
||||
cause the users last read pointers to NOT get updated during this
|
||||
message scan.
|
||||
|
||||
+ New Menu Command -R will set the value of the "OK" acs flag. The
|
||||
optional data of 0 will set the OK flag to return false, or 1 will set
|
||||
it to return true.
|
||||
|
||||
+ New ACS function: ON. This returns true if the last performed message
|
||||
"Quick scan" found new messages or if the last performed Email check
|
||||
found unread emails.
|
||||
|
||||
+ New ACS function: OY. This returns true if the last performed message
|
||||
"Quick scan" found new messages addressed to the user.
|
||||
|
||||
+ The Message New Scan (MN) now has the option to supply /NOFROM which
|
||||
will skip over any messages FROM the user. This works in ALL reading
|
||||
modes.
|
||||
|
||||
+ The Read Messages (MR) now has the option to supply /NOFROM which
|
||||
will skip over any messages FROM the user. This works in ALL reading
|
||||
modes.
|
||||
|
||||
+ The Message Quick Scan (MQ) command now has the option to supply
|
||||
/NOFROM which will not count any messages FROM the user in the scan.
|
||||
|
||||
+ Added a new menu "personalscan.mnu" into the default install menu
|
||||
directory which demonstrates many of the new message reading/scanning
|
||||
functions.
|
||||
|
||||
- MPL GetMBaseStats has changed in a few ways. First, it has been renamed
|
||||
to "getmbstats" and now has two additional parameters:
|
||||
|
||||
#1: Message base number
|
||||
#2: Exclude messages FROM the current user in stats? T/F
|
||||
#3: Exclude personal messages that have already been read? T/F
|
||||
#4: Total messages (this is a VAR parameter)
|
||||
#5: New messages (this is a VAR parameter)
|
||||
#6: New messages to you (this is a VAR parameter)
|
||||
|
||||
+ Mystic now tracks if ANY message (public or private) has been read by
|
||||
the user the message is addressed to. You MUST replace your old
|
||||
message header flags prompt with the new one to include the received
|
||||
flag at the end:
|
||||
|
||||
; Msg header flags text one word each separated by a space
|
||||
; 1=Local 2=Echo 3=Private 4=Sent 5=Delete 6=Received
|
||||
490 Local Echo Private Sent Deleted Rcvd
|
||||
|
||||
! Fixed a bug that could cause private messages to not be marked as private
|
||||
when uploading a QWKE REP packet.
|
||||
|
||||
+ Two new prompt info codes added to prompt #127 (read email? prompt):
|
||||
|
||||
&1 = number of emails
|
||||
&2 = number of unread emails
|
||||
|
||||
In addition, the Yes/No prompt defaults to NO if they do not have any
|
||||
unread emails, or YES if they do.
|
||||
|
||||
+ The Read Messages command (RM) now allows for the option /NOREAD which
|
||||
will skip over any message marked as received. A received message is
|
||||
classified as a message addressed to the current user that has already
|
||||
been read.
|
||||
|
||||
+ The Message New Scan (MN) command now allows for the /NOREAD option.
|
||||
|
||||
+ The QuickScan command (MQ) now allows for the /NOREAD option.
|
||||
|
||||
- Removed QuickScan header prompt and /NOHEAD option. It was pointless and
|
||||
could easily be done in a menu if yo someone wanted it.
|
||||
|
||||
+ Added prompts that will be displayed when setting the last read pointer
|
||||
within the message readers. The two new prompts are:
|
||||
|
||||
; Standard message reader: Lastread pointer set &1 = msg number
|
||||
504 |CR|11Last read pointer has been set to message number |&1.|CR|CR|PA
|
||||
|
||||
; Lightbar reader: Lastread pointer set &1 = msg number
|
||||
505 |CR|11Last read pointer has been set to message number |&1.|CR|CR|PA
|
||||
|
||||
+ Added a /LIST option to the QuickScan which will list out messages based
|
||||
on the options presented. The following new prompts need to be added:
|
||||
|
||||
; QuickScan message list header &2=basename
|
||||
506 |15From Base Subject|CR|09=============== ==================== ==========================================
|
||||
|
||||
; QuickScan message list middle
|
||||
; &1=msg# &2=basename &3=from &4=to &5=subject &6=date
|
||||
|
||||
507 |10|$R15|&3 |09|$R20|&2 |11|$R42|&5
|
||||
; QuicScan message list footer
|
||||
|
||||
508 |09|$D79=|CR
|
||||
|
||||
<ALPHA 28 RELEASED>
|
||||
|
||||
+ Prompt #490 has been changed to separate message header flags by comma
|
||||
instead of space. This allows the ability to completely exclude certain
|
||||
flags (ie if you never want a Local flag you can just remove it and leave
|
||||
the comma)
|
||||
|
||||
; Msg header flags text one word each separated by a comma
|
||||
; 1=Local 2=Echo 3=Private 4=Sent 5=Delete, 6=Received
|
||||
490 Local,Echo,Priv,Sent,Del,Read
|
||||
|
||||
! Echo flag was not displaying correctly in the message headers.
|
||||
|
||||
! Fixed a bug in the ANSI file viewer which was causing garbled ANSIs
|
||||
in the gallery and the viewer.
|
||||
|
||||
+ Pressing the SPACE bar in the ANSI viewer now displays the file
|
||||
"normally" with a screenpause at the end.
|
||||
|
||||
+ The ansi viewer now has a help file option. The format of the optional
|
||||
data has changed for the GV menu command so you will need to change it
|
||||
if you are using it.
|
||||
|
||||
<template><helpfile><displayspeed><filename>
|
||||
|
||||
IE:
|
||||
Command: GV
|
||||
Data: ansiviewer;ansivhelp;0;myansi
|
||||
|
||||
! Fixed a bug in Zmodem that could cause a locked node if carrier was
|
||||
dropped at a certain point during Zmodem upload initialization.
|
||||
|
||||
+ Added a different type of line check into the ANSI parsers. If a line
|
||||
ends with a linefeed but didn't have carrage return before it (as is
|
||||
standard), Mystic will now add the carrage return. If this blows up
|
||||
any existing ANSIs it will be changed back.
|
||||
|
||||
! Fixed a bug with pipe color code parsing in the ANSI viewer (GV)
|
||||
|
||||
! The ANSI art gallery would crash if the directory passed to it did not
|
||||
exist.
|
||||
|
||||
+ Mystic now allows the column size to be defined within a theme. Valid
|
||||
values are 40 or 80 columns.
|
||||
|
||||
+ Mystic will now perform text wrapping in the message editors based on
|
||||
the select theme's column size.
|
||||
|
||||
+ Abbreviated Mystic's copyright notice upon connect to be friendly to
|
||||
40 column connections.
|
||||
|
||||
<ALPHA 29 RELEASED>
|
||||
|
|
Loading…
Reference in New Issue