Renegade-1.19/SOURCE/MAIL2.PAS

1404 lines
46 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{$IFDEF WIN32}
{$I DEFINES.INC}
{$ENDIF}
{$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S+,V-}
UNIT Mail2;
INTERFACE
USES
Common;
PROCEDURE Post(ReplyTo: LongInt; VAR TToI: FromToInfo; PvtMsg: Boolean);
PROCEDURE ReadAllMessages(MenuOption: Str50);
PROCEDURE ScanMessages(MArea: Integer; AskUpDate: Boolean; MenuOption: Str50);
PROCEDURE StartNewScan(MenuOption: Str50);
PROCEDURE ScanYours;
FUNCTION FirstNew: Word;
IMPLEMENTATION
USES
Dos,
Common5,
Mail0,
Mail1,
EMail,
Mail3,
Menus,
ShortMsg,
SysOp2G,
SysOp3,
TimeFunc;
VAR
TempLastRead: LongInt;
PROCEDURE Post(ReplyTo: LongInt; VAR TToI: FromToInfo; PvtMsg: Boolean);
VAR
MHeader: MHeaderRec;
PostOk: Boolean;
BEGIN
LoadMsgArea(MsgArea);
PostOk := TRUE;
IF (NOT AACS(MemMsgArea.PostACS)) THEN
BEGIN
NL;
Print('^7Your access level does not permit you to post in this message area!^1');
PostOk := FALSE;
END
ELSE IF (AccountBalance < General.CreditPost) AND (NOT (FNoCredits IN ThisUser.Flags)) THEN
BEGIN
NL;
Print('^7Insufficient account balance to post a public message!^1');
PostOk := FALSE;
END
ELSE IF (RPost IN ThisUser.Flags) OR (NOT AACS(General.NormPubPost)) THEN
BEGIN
NL;
Print('^7Your access priviledges do not include posting a public messages!^1');
PostOk := FALSE;
END
ELSE IF (PublicPostsToday >= General.MaxPubPost) AND (NOT MsgSysOp) THEN
BEGIN
NL;
Print('^7You have already sent the maximum public messages allowed per day!^1');
PostOk := FALSE;
END;
IF (NOT PostOk) THEN
Exit;
InitMsgArea(MsgArea);
MHeader.Status := [];
MHeader.FileAttached := 0;
IF (ReplyTo <> -1) THEN
BEGIN
MHeader.MTo := TToI;
IF (MHeader.MTo.Anon > 0) THEN
MHeader.MTo.A1S := UseName(MHeader.MTo.Anon,MHeader.MTo.A1S);
END
ELSE
BEGIN
FillChar(MHeader.MTo,SizeOf(MHeader.MTo),0);
InResponseTo := '';
END;
IF (MemMsgArea.PrePostFile <> '') THEN
BEGIN
PrintF(MemMsgArea.PrePostFile);
PauseScr(FALSE);
END;
IF (InputMessage(TRUE,(ReplyTo <> -1),'',MHeader,'',78,500)) THEN
BEGIN
IF (ReplyTo <> -1) THEN
MHeader.ReplyTo := ((HiMsg + 1) - ReplyTo);
IF (PvtMsg) THEN
Include(MHeader.Status,Prvt);
SaveHeader((HiMsg + 1),MHeader);
Print('^1Message posted on ^5'+MemMsgArea.Name+'^1.');
SysOpLog(MHeader.Subject+' posted on ^5'+MemMsgArea.Name);
IF (MHeader.MTo.A1S <> '') THEN
SysOpLog(' To: "'+MHeader.MTo.A1S+'"');
IF (ReplyTo <> -1) THEN
BEGIN
LoadHeader(ReplyTo,MHeader);
Inc(MHeader.Replies);
SaveHeader(ReplyTo,MHeader);
END;
IF (ThisUser.MsgPost < 2147483647) THEN
Inc(ThisUser.MsgPost);
IF (PublicPostsToday < 255) THEN
Inc(PublicPostsToday);
IF (NOT (FNoCredits IN ThisUser.Flags)) THEN
AdjustBalance(General.CreditPost);
SaveURec(ThisUser,UserNum);
Update_Screen;
END;
END;
PROCEDURE ListMessages(Pub: Boolean);
VAR
MHeader: MHeaderRec;
S,
S1: STRING;
TempHiMsg: Word;
ADate: DateTime;
NumDone: Byte;
BEGIN
TempHiMsg := HiMsg;
IF ((Msg_On < 1) OR (Msg_On > TempHiMsg)) THEN
Exit;
Abort := FALSE;
Next := FALSE;
CLS;
PrintACR('<1C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ');
PrintACR('<1C> Msg# <1C> Sender <1C> Receiver <1C> '+'Subject <1C>! Posted <1C>');
PrintACR('<1C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>');
Dec(Msg_On);
NumDone := 0;
WHILE ((NumDone < (PageLength - 7)) AND (Msg_On >= 0) AND (Msg_On < TempHiMsg) AND (NOT Abort) AND (NOT HangUp)) DO
BEGIN
Inc(Msg_On);
LoadHeader(Msg_On,MHeader);
IF ((NOT (UnValidated IN MHeader.Status)) AND (NOT (MDeleted IN MHeader.Status))) OR (MsgSysOp) THEN
BEGIN
IF (MDeleted IN MHeader.Status) THEN
S := '''D'
ELSE IF (UnValidated IN MHeader.Status) THEN
S := '''U'
ELSE IF ToYou(MHeader) OR FromYou(MHeader) THEN
S := '''>'
ELSE IF (Pub) AND (TempLastRead < MHeader.Date) THEN
S := '''*'
ELSE
S := ' ';
S := S + ' "'+PadLeftInt(Msg_On,5)+' #';
IF (MARealName IN MemMsgArea.MAFlags) THEN
S1 := UseName(MHeader.From.Anon,MHeader.From.Real)
ELSE
S1 := UseName(MHeader.From.Anon,MHeader.From.A1S);
S := S + PadLeftStr(S1,18)+' $';
IF ((MARealName IN MemMsgArea.MAFlags) AND (MHeader.MTo.Real <> '')) THEN
S1 := UseName(MHeader.MTo.Anon,MHeader.MTo.Real)
ELSE
S1 := UseName(MHeader.MTo.Anon,MHeader.MTo.A1S);
S := S + PadLeftStr(S1,19)+' % ';
IF (MHeader.FileAttached = 0) THEN
S := S + PadLeftStr(MHeader.Subject,18)
ELSE
S := S + PadLeftStr(Stripname(MHeader.Subject),18);
PackToDate(ADate,MHeader.Date);
S := S + ' &'+ZeroPad(IntToStr(ADate.Month))+'/'+ ZeroPad(IntToStr(ADate.Day))+'/'+ZeroPad(IntToStr(ADate.Year));
IF (AllowMCI IN MHeader.Status) THEN
PrintACR(S)
ELSE
Print(S);
Inc(NumDone);
END;
Wkey;
END;
END;
PROCEDURE MainRead(OncOnly,AskUpdate,Pub: Boolean);
VAR
User: UserRecordType;
MHeader: MHeaderRec;
Cmd,
NewMenuCmd: AStr;
Junk: Str36;
Cmd1: Char;
SaveMenu,
CmdToExec,
Counter: Byte;
MsgNum,
ThreadStart: Word;
Done,
CmdNotHid,
CmdExists,
AskPost,
Contlist,
DoneScan,
HadUnVal: Boolean;
FUNCTION CantBeSeen: Boolean;
BEGIN
CantBeSeen := (NOT MsgSysOp) AND ((UnValidated IN MHeader.Status) OR (MDeleted IN MHeader.Status) OR
((Prvt IN MHeader.Status) AND NOT (ToYou(MHeader) OR FromYou(MHeader))));
END;
BEGIN
AskPost := FALSE;
Contlist := FALSE;
DoneScan := FALSE;
HadUnVal := FALSE;
AllowContinue := TRUE;
ThreadStart := 0;
TReadPrompt := 0;
Abort := FALSE;
Next := FALSE;
SaveMenu := CurMenu;
IF (MemMsgArea.MessageReadMenu <> 0) THEN
CurMenu := MemMsgArea.MessageReadMenu
ELSE
CurMenu := General.MessageReadMenu;
IF (NOT NewMenuToLoad) THEN
LoadMenuPW;
AutoExecCmd('FIRSTCMD');
REPEAT
IF (Contlist) AND (Abort) THEN
BEGIN
Contlist := FALSE;
NL;
Print('Continuous message listing off.');
TReadPrompt := 255;
END;
IF (Msg_On < 1) OR (Msg_On > HiMsg) THEN
BEGIN
IF (NOT Contlist) THEN
BEGIN
DoneScan := TRUE;
IF (Pub) THEN
AskPost := TRUE;
END
ELSE
BEGIN
Contlist := FALSE;
Msg_On := HiMsg;
NL;
Print('Continuous message listing off.');
TReadPrompt := 255;
END;
END;
IF (NOT DoneScan) AND (TReadPrompt IN [0..2,8..10,18]) THEN
BEGIN
IF (Contlist) THEN
Next := TRUE;
LoadHeader(Msg_On,MHeader);
IF (Pub) AND (UnValidated IN MHeader.Status) THEN
HadUnVal := TRUE;
WHILE (((Msg_On < HiMsg) AND (TReadPrompt <> 2)) OR ((Msg_On > 1) AND (TReadPrompt = 2))) AND
(CantBeSeen) DO
BEGIN
IF (TReadPrompt = 2) THEN
Dec(Msg_On)
ELSE
Inc(Msg_On);
LoadHeader(Msg_On,MHeader);
END;
IF ((Msg_On = 1) OR (Msg_On = HiMsg)) AND (CantBeSeen) THEN
BEGIN
DoneScan := TRUE;
IF (Pub) THEN
AskPost := TRUE;
END
ELSE
BEGIN
IF ((CLSMsg IN ThisUser.SFlags) AND (NOT Contlist)) THEN
Cls
ELSE
NL;
ReadMsg(Msg_On,Msg_On,HiMsg);
IF (Pub) AND (TempLastRead < MHeader.Date) AND (MHeader.Date <= GetPackDateTime) THEN
TempLastRead := MHeader.Date;
IF (Pub) THEN
IF (PublicReadThisCall < 32767) THEN
Inc(PublicReadThisCall);
END;
END;
IF (NOT Contlist) AND (NOT DoneScan) THEN
REPEAT
TReadPrompt := 0;
MainMenuHandle(Cmd);
NewMenuCmd := '';
CmdToExec := 0;
Done := FALSE;
REPEAT
FCmd(Cmd,CmdToExec,CmdExists,CmdNotHid);
IF (CmdToExec <> 0) AND (MemCmd^[CmdToExec].CmdKeys <> '-^') AND
(MemCmd^[CmdToExec].CmdKeys <> '-/') AND (MemCmd^[CmdToExec].CmdKeys <> '-\') THEN
DoMenuCommand(Done,
MemCmd^[CmdToExec].CmdKeys,
MemCmd^[CmdToExec].Options,
NewMenuCmd,
MemCmd^[CmdToExec].NodeActivityDesc);
UNTIL (CmdToExec = 0) OR (Done) OR (HangUp);
Abort := FALSE;
Next := FALSE;
CASE TReadPrompt OF
1 : ; { Read Again }
2 : Dec(Msg_On); { Previous Message }
3 : IF (NOT MsgSysOp) THEN
Print('^7You do not have the required access level for this option!^1')
ELSE
MoveMsg(Msg_On);
4 : IF (NOT CoSysOp) THEN
Print('^7You do not have the required access level for this option!^1')
ELSE
ExtractMsgToFile(Msg_On,Mheader);
5 : IF (NOT FromYou(MHeader)) AND (NOT MsgSysOp) THEN
BEGIN
NL;
Print('^7You can only edit messages that you have sent!^1');
END
ELSE
BEGIN
REPEAT
NL;
Prt('Message editing [^5?^4=^5Help^4]: ');
IF (MsgSysOp) THEN
Onek(Cmd1,'QADEFOPRSTV?'^M,TRUE,TRUE)
ELSE
Onek(Cmd1,'QDEFOST?'^M,TRUE,TRUE);
CASE Cmd1 OF
(*
'D' : FOR Counter := 1 TO 6 DO
IF (HeaderLine(MHeader,Msg_On,HiMsg,Counter,Junk) <> '') THEN
PrintACR(Headerline(MHeader,Msg_On,HiMsg,Counter,Junk));
'O' : IF PYNQ('Reload old information? ',0,FALSE) THEN
LoadHeader(Msg_On,MHeader);
'E' : BEGIN
EditMessageText(Msg_On);
LoadHeader(Msg_On,MHeader);
END;
'S' : IF (MHeader.FileAttached = 0) OR (MsgSysOp) THEN
BEGIN
Prt('Subj: ');
InputDefault(MHeader.Subject,MHeader.Subject,40,[ColorsAllowed],FALSE)
END
ELSE
Print('Sorry, you can''t edit that.');
'T' : BEGIN
Print('^11. Posted to : ^5'+MHeader.MTo.A1S);
Print('^12. Real name : ^5'+MHeader.MTo.Real);
Print('^13. System name: ^5'+MHeader.MTo.Name);
NL;
Prt('Edit name (^51^4-^53^4) [^5Q^4]uit: ');
Onek(Cmd1,'Q123'^M,TRUE,TRUE);
IF (NOT (Cmd1 IN ['Q',^M])) THEN
NL;
CASE Cmd1 OF
'1' : BEGIN
Prt('Posted to: ');
InputDefault(MHeader.MTo.A1S,MHeader.MTo.A1S,36,[],FALSE);
END;
'2' : BEGIN
Prt('Real name: ');
InputDefault(MHeader.MTo.Real,MHeader.MTo.Real,36,[],FALSE);
END;
'3' : BEGIN
Prt('System name: ');
InputDefault(MHeader.MTo.Name,MHeader.MTo.Name,36,[],FALSE);
END;
END;
Cmd1 := #0;
END;
'F' : IF (MHeader.From.Anon > 0) OR (MsgSysOp) THEN
BEGIN
Print('^11. Posted to : ^5'+MHeader.From.A1S);
Print('^12. Real name : ^5'+MHeader.From.Real);
Print('^13. System name: ^5'+MHeader.From.Name);
NL;
Prt('Edit name (^51^4-^53^4) [^5Q^4]uit: ');
Onek(Cmd1,'Q123'^M,TRUE,TRUE);
IF (NOT (Cmd1 IN ['Q',^M])) THEN
NL;
CASE Cmd1 OF
'1' : BEGIN
Prt('Posted to: ');
InputDefault(MHeader.From.A1S,MHeader.From.A1S,36,[],FALSE);
END;
'2' : BEGIN
Prt('Real name: ');
InputDefault(MHeader.From.Real,MHeader.From.Real,36,[],FALSE);
END;
'3' : BEGIN
Prt('System name: ');
InputDefault(MHeader.From.Name,MHeader.From.Name,36,[],FALSE);
END;
END;
Cmd1 := #0;
END
ELSE
Print('Sorry, you can''t edit that.');
'A' : IF (MsgSysOp) THEN
BEGIN
IF (MHeader.From.Anon IN [1,2]) THEN
MHeader.From.Anon := 0
ELSE
BEGIN
Loadurec(User,MHeader.From.UserNum);
IF AACS1(User,MHeader.From.UserNum,General.CSOP) THEN
MHeader.From.Anon := 2
ELSE
MHeader.From.Anon := 1;
END;
Print('Message is '+AOnOff((MHeader.From.Anon = 0),'not ','')+'anonymous');
SysOpLog('Message is '+AOnOff((MHeader.From.Anon = 0),'not ','')+'anonymous');
END;
*)
'A' : IF (NOT MsgSysOp) THEN
BEGIN
NL;
Print('^7You do not have the required access level for this option!^1')
END
ELSE
BEGIN
IF (MHeader.From.Anon IN [1,2]) THEN
BEGIN
MHeader.From.Anon := 0;
NL;
Print('Message status is not anonymous.');
SysOpLog('Message status is not anonymous.');
END
ELSE
BEGIN
LoadURec(User,MHeader.From.UserNum);
IF AACS1(User,MHeader.From.UserNum,General.CSOP) THEN
MHeader.From.Anon := 2
ELSE
MHeader.From.Anon := 1;
NL;
Print('Message status is anonymous.');
SysOpLog('Message status is anonymous.');
END;
END;
'D' : BEGIN
NL;
FOR Counter := 1 TO 6 DO
IF (HeaderLine(MHeader,Msg_On,HiMsg,Counter,Junk) <> '') THEN
PrintACR(Headerline(MHeader,Msg_On,HiMsg,Counter,Junk));
END;
'E' : BEGIN
EditMessageText(Msg_On);
LoadHeader(Msg_On,MHeader);
END;
'F' : IF (MHeader.From.Anon > 0) OR (MsgSysOp) THEN
BEGIN
NL;
Print('^11. Posted from: ^5'+MHeader.From.A1S);
Print('^12. Real name : ^5'+MHeader.From.Real);
Print('^13. System name: ^5'+MHeader.From.Name);
NL;
Prt('Edit name [^51^4-^53^4,^5<CR>^4=^5Quit^4]: ');
Onek(Cmd1,^M'123',TRUE,TRUE);
CASE Cmd1 OF
'1' : BEGIN
NL;
Prt('Posted from: ');
InputDefault(MHeader.From.A1S,MHeader.From.A1S,36,[],FALSE);
END;
'2' : BEGIN
NL;
Prt('Real name: ');
InputDefault(MHeader.From.Real,MHeader.From.Real,36,[],FALSE);
END;
'3' : BEGIN
NL;
Prt('System name: ');
InputDefault(MHeader.From.Name,MHeader.From.Name,36,[],FALSE);
END;
END;
Cmd1 := #0;
END;
'O' : BEGIN
NL;
IF PYNQ('Reload old information? ',0,FALSE) THEN
LoadHeader(Msg_On,MHeader);
END;
'P' : IF (NOT Pub) THEN
BEGIN
NL;
Print('^7This option is not available when reading private messages!^1');
END
ELSE IF (NOT MsgSysOp) THEN
BEGIN
NL;
Print('^7You do not have the required access level for this option!^1')
END
ELSE
BEGIN
IF (Permanent IN MHeader.Status) THEN
BEGIN
Exclude(MHeader.Status,Permanent);
NL;
Print('Message status is not permanent.');
SysOpLog('Message status is not permanent.');
END
ELSE
BEGIN
Include(MHeader.Status,Permanent);
NL;
Print('Message status is permanent.');
SysOpLog('Message status is permanent.');
END;
END;
'R' : IF (NOT MsgSysOp) THEN
BEGIN
NL;
Print('^7You do not have the required access level for this option!^1')
END
ELSE
BEGIN
IF (Sent IN MHeader.Status) THEN
BEGIN
Exclude(MHeader.Status,Sent);
IF (PUB) AND (MemMsgArea.MAType IN [1..2]) AND (NOT (MAScanOut IN MemMsgArea.MAFlags)) THEN
UpdateBoard;
NL;
Print('Message status is not sent.');
SysOpLog('Message status is not sent.');
END
ELSE
BEGIN
Include(MHeader.Status,Sent);
NL;
Print('Message status is sent.');
SysOpLog('Message status is sent.');
END;
END;
'S' : IF (NOT MsgSysOp) THEN
BEGIN
NL;
Print('^7You do not have the required access level for this option!^1')
END
ELSE IF (MHeader.FileAttached > 0) THEN
BEGIN
NL;
Print('^7There is no file attached to this message!^1');
END
ELSE
BEGIN
NL;
Prt('Subj: ');
InputDefault(MHeader.Subject,MHeader.Subject,40,[ColorsAllowed],FALSE);
SysOpLog('Message subject has been modified.');
END;
'T' : BEGIN
NL;
Print('^11. Posted to : ^5'+MHeader.MTo.A1S);
Print('^12. Real name : ^5'+MHeader.MTo.Real);
Print('^13. System name: ^5'+MHeader.MTo.Name);
NL;
Prt('Edit name [^51^4-^53^4,^5<CR>^4=^5Quit^4]: ');
Onek(Cmd1,^M'123',TRUE,TRUE);
CASE Cmd1 OF
'1' : BEGIN
NL;
Prt('Posted to: ');
InputDefault(MHeader.MTo.A1S,MHeader.MTo.A1S,36,[],FALSE);
END;
'2' : BEGIN
NL;
Prt('Real name: ');
InputDefault(MHeader.MTo.Real,MHeader.MTo.Real,36,[],FALSE);
END;
'3' : BEGIN
NL;
Prt('System name: ');
InputDefault(MHeader.MTo.Name,MHeader.MTo.Name,36,[],FALSE);
END;
END;
Cmd1 := #0;
END;
'V' : IF (NOT Pub) THEN
BEGIN
NL;
Print('^7This option is not available when reading private messages!^1');
END
ELSE IF (NOT MsgSysOp) THEN
BEGIN
NL;
Print('^7You do not have the required access level for this option!^1')
END
ELSE
BEGIN
IF (UnValidated IN MHeader.Status) THEN
BEGIN
Exclude(MHeader.Status,UnValidated);
NL;
Print('Message status is validated.');
SysOpLog('Message status is validated.');
END
ELSE
BEGIN
Include(MHeader.Status,UnValidated);
NL;
Print('Message status is unvalidated.');
SysOpLog('Message status is unvalidated.');
END;
END;
'?' : BEGIN
NL;
LCmds(15,3,'From','To');
LCmds(15,3,'Subject','Edit text');
LCmds(15,3,'Oops','Display header');
IF (MsgSysOp) THEN
BEGIN
LCmds(15,5,'Permanent','Validation');
LCmds(15,5,'Rescan','Anonymous');
END;
LCmds(15,3,'Quit','');
END;
END;
UNTIL (Cmd1 IN ['Q',^M]) OR (HangUp);
Cmd1 := #0;
SaveHeader(Msg_On,MHeader);
END;
6 : BEGIN
DumpQuote(MHeader);
IF (NOT Pub) THEN
AutoReply(MHeader)
ELSE
BEGIN
NL;
IF (MHeader.From.Anon = 0) OR (AACS(General.AnonPubRead)) THEN
IF PYNQ('Is this to be a private reply? ',0,Prvt IN MHeader.Status) THEN
IF (MAPrivate IN MemMsgArea.MAFlags) THEN
IF PYNQ('Reply in Email? ',0,FALSE) THEN
AutoReply(MHeader)
ELSE
Post(Msg_On,MHeader.From,TRUE)
ELSE
AutoReply(MHeader)
ELSE
Post(Msg_On,MHeader.From,FALSE)
ELSE
Post(Msg_On,MHeader.From,FALSE);
END;
END;
7 : BEGIN
Msg_On := (HiMsg + 1);
IF (Pub) THEN
BEGIN
LoadHeader(HiMsg,MHeader);
IF (MHeader.Date <= GetPackDateTime) THEN
TempLastRead := MHeader.Date;
END;
Next := FALSE;
END;
8 : IF (Pub) AND ((Msg_On - MHeader.ReplyTo) > 0) AND (MHeader.ReplyTo > 0) THEN
BEGIN
IF (ThreadStart = 0) THEN
ThreadStart := Msg_On;
Dec(Msg_On,MHeader.ReplyTo);
END;
9 : IF (Pub) AND ((ThreadStart >= 1) AND (ThreadStart <= HiMsg)) THEN
BEGIN
Msg_On := ThreadStart;
ThreadStart := 0;
END;
10 : BEGIN
Contlist := TRUE;
Abort := FALSE;
NL;
Print('Continuous message listing on.');
END;
11 : IF (Pub) THEN
BEGIN
IF (Permanent IN MHeader.Status) THEN
BEGIN
NL;
Print('^7This is a permanent public message!^1');
END
ELSE
BEGIN
IF (Msg_On >= 1) AND (Msg_On <= HiMsg) AND (MsgSysOp OR FromYou(MHeader)) THEN
BEGIN
LoadHeader(Msg_On,MHeader);
IF (MDeleted IN MHeader.Status) THEN
Exclude(MHeader.Status,MDeleted)
ELSE
Include(MHeader.Status,MDeleted);
SaveHeader(Msg_On,MHeader);
IF (NOT (MDeleted IN MHeader.Status)) THEN
BEGIN
IF FromYou(MHeader) THEN
BEGIN
IF (ThisUser.MsgPost < 2147483647) THEN
Inc(ThisUser.MsgPost);
AdjustBalance(General.Creditpost);
END;
NL;
Print('Public message undeleted.');
SysOpLog('* Undeleted public message: ^5'+MHeader.Subject);
END
ELSE
BEGIN
IF FromYou(MHeader) THEN
BEGIN
IF (ThisUser.MsgPost > 0) THEN
Dec(ThisUser.MsgPost);
AdjustBalance(-General.Creditpost);
END;
NL;
Print('Public message deleted.');
SysOpLog('* Deleted public message: ^5'+MHeader.Subject);
END;
END
ELSE
BEGIN
NL;
Print('^7You can only delete public messages from you!^1');
END;
END;
END
ELSE
BEGIN
IF (Msg_On >= 1) AND (Msg_On <= HiMsg) AND (MsgSysOp OR FromYou(MHeader) OR ToYou(MHeader)) THEN
BEGIN
LoadHeader(Msg_On,MHeader);
IF (MDeleted IN MHeader.Status) THEN
Exclude(MHeader.Status,MDeleted)
ELSE
Include(MHeader.Status,MDeleted);
SaveHeader(Msg_On,MHeader);
IF (NOT (MDeleted IN MHeader.Status)) THEN
BEGIN
LoadURec(User,MHeader.MTo.UserNum);
IF (User.Waiting < 255) THEN
Inc(User.Waiting);
SaveURec(User,MHeader.MTo.UserNum);
NL;
Print('Private message undeleted.');
IF FromYou(MHeader) OR (MsgSysOp) THEN
SysOpLog('* Undeleted private message from: ^5'+Caps(MHeader.From.A1S))
ELSE IF ToYou(MHeader) OR (MsgSysOp) THEN
SysOpLog('* Undeleted private message to: ^5'+Caps(MHeader.MTo.A1S));
END
ELSE
BEGIN
LoadURec(User,MHeader.MTo.UserNum);
IF (User.Waiting > 0) THEN
Dec(User.Waiting);
SaveURec(User,MHeader.MTo.UserNum);
NL;
Print('Private message deleted.');
IF FromYou(MHeader) OR (MsgSysOp) THEN
SysOpLog('* Deleted private message from: ^5'+Caps(MHeader.From.A1S))
ELSE IF ToYou(MHeader) OR (MsgSysOp) THEN
SysOpLog('* Deleted private message to: ^5'+Caps(MHeader.MTo.A1S));
END;
END
ELSE
BEGIN
NL;
Print('^7You can only delete private messages from or to you!^1');
END;
END;
12 : IF (NOT Pub) THEN
BEGIN
NL;
Print('^7This option is not available when reading private messages!^1');
END
ELSE
BEGIN
NL;
Print('Highest-read pointer for this area set to message #'+IntToStr(Msg_On)+'.');
IF (MHeader.Date <= GetPackDateTime) THEN
TempLastRead := MHeader.Date;
END;
13 : BEGIN
IF (Pub) AND (AskUpdate) THEN
BEGIN
NL;
IF PYNQ('Update message read pointers for this area? ',0,FALSE) THEN
BEGIN
LoadLastReadRecord(LastReadRecord);
LastReadRecord.LastRead := GetPackDateTime;
SaveLastReadRecord(LastReadRecord);
END;
END;
DoneScan := TRUE;
Next := TRUE;
END;
14 : BEGIN
DoneScan := TRUE;
Abort := TRUE;
END;
15 : ListMessages(Pub);
16 : IF (NOT CoSysOp) THEN
Print('^7You do not have the required access level for this option!^1')
ELSE IF (LastAuthor < 1) OR (LastAuthor > (MaxUsers - 1)) THEN
Print('^7The sender of this message does not have an account on this BBS!^1')
ELSE IF (CheckPW) THEN
UserEditor(LastAuthor);
17 : IF (NOT PUB) THEN
BEGIN
NL;
Print('^7This option is not available when reading private messages!^1');
END
ELSE
BEGIN
IF (MAForceRead IN MemMsgArea.MAFlags) THEN
BEGIN
NL;
Print('^7This message area can not be removed from your new scan!^1')
END
ELSE
BEGIN
NL;
Print('^5'+MemMsgArea.Name+'^3 '+AOnOff(LastReadRecord.NewScan,'will NOT','WILL')+
' be scanned in future new scans.');
SysOpLog('* Toggled ^5'+MemMsgArea.Name+ '^1 '+AOnOff(LastReadRecord.NewScan,'out of','back in')+
' new scan.');
LoadLastReadRecord(LastReadRecord);
LastReadRecord.NewScan := (NOT LastReadRecord.NewScan);
SaveLastReadRecord(LastReadRecord);
END;
END;
18 : Inc(Msg_On);
19 : IF (NOT CoSysOp) THEN
Print('^7You do not have the required access level for this option!^1')
ELSE IF (LastAuthor < 1) OR (LastAuthor > (MaxUsers - 1)) THEN
Print('^7The sender of this message does not have an account on this BBS!^1.')
ELSE
BEGIN
LoadURec(User,LastAuthor);
ShowUserInfo(1,LastAuthor,User);
END;
20 : IF (NOT CoSysOp) THEN
Print('^7You do not have the required access level for this option!^1')
ELSE IF (LastAuthor < 1) OR (LastAuthor > (MaxUsers - 1)) THEN
Print('^7The sender of this message does not have an account on this BBS!^1')
ELSE
BEGIN
LoadURec(User,LastAuthor);
AutoVal(User,LastAuthor);
END;
21 : ForwardMessage(Msg_On);
END;
UNTIL (TReadPrompt IN [1..2,7..10,13..15,18]) OR (Abort) OR (Next) OR (HangUp)
ELSE
Inc(Msg_On);
IF (OncOnly) AND (TReadPrompt IN [13,14,18]) THEN
DoneScan := TRUE;
UNTIL (DoneScan) OR (HangUp);
CurMenu := SaveMenu;
NewMenuToLoad := TRUE;
AllowContinue := FALSE;
IF ((Pub) AND (HadUnVal) AND (MsgSysOp)) THEN
IF PYNQ('%LFValidate all messages here? ',0,FALSE) THEN
BEGIN
FOR MsgNum := 1 TO HiMsg DO
BEGIN
LoadHeader(MsgNum,MHeader);
IF (UnValidated IN MHeader.Status) THEN
Exclude(MHeader.Status,UnValidated);
SaveHeader(MsgNum,MHeader);
END;
END;
IF ((Pub) AND (AskPost) AND (AACS(MemMsgArea.PostACS)) AND
(NOT (RPost IN ThisUser.Flags)) AND (PublicPostsToday < General.MaxPubPost)) THEN
IF (TReadPrompt <> 7) THEN
IF PYNQ('%LFPost on ^5'+MemMsgArea.Name+'^7? ',0,FALSE) THEN
IF (MAPrivate IN MemMsgArea.MAFlags) THEN
Post(-1,MHeader.From,PYNQ('%LFIs this to be a private message? ',0,FALSE))
ELSE
Post(-1,MHeader.From,FALSE);
END;
PROCEDURE ReadAllMessages(MenuOption: Str50);
VAR
InputStr: AStr;
SaveReadMsgArea: Integer;
BEGIN
SaveReadMsgArea := ReadMsgArea;
Abort := FALSE;
Next := FALSE;
IF (MenuOption = '') THEN
MsgArea := -1;
InitMsgArea(MsgArea);
IF (HiMsg = 0) THEN
BEGIN
Print('%LFNo messages on ^5'+MemMsgArea.Name+'^1.');
IF (Novice IN ThisUser.Flags) THEN
PauseScr(FALSE);
END
ELSE
BEGIN
Msg_On := 1;
Inputstr := '?';
REPEAT
IF (InputStr = '?') THEN
ListMessages(MsgArea <> -1);
NL;
{ Prompt(FString.ReadQ); }
Prt('Select message (^51^4-^5'+IntToStr(HiMsg)+'^4) [^5?^4=^5First^4,^5<CR>^4=^5Next^4,^5Q^4=^5Quit^4)]: ');
(*
lRGLngStr(32,FALSE);
*)
ScanInput(InputStr,'Q?'^M);
IF (InputStr = 'Q') THEN
Msg_On := 0
ELSE
BEGIN
IF (InputStr = ^M) THEN
BEGIN
InputStr := '?';
IF (Msg_On >= HiMsg) THEN
Msg_On := 1;
END
ELSE IF (InputStr = '?') THEN
BEGIN
Msg_On := 1;
InputStr := '?';
END
ELSE
BEGIN
Msg_On := StrToInt(InputStr);
IF (Msg_On >= 1) AND (Msg_On <= HIMsg) THEN
InputStr := 'Q'
ELSE
BEGIN
NL;
Print('^7The range must be from 1 to '+IntToStr(HiMsg)+'^1');
PauseScr(FALSE);
Msg_On := 1;
InputStr := '?';
END;
END;
END;
UNTIL (InputStr = 'Q') OR (HangUp);
IF (Msg_On >= 1) AND (Msg_On <= HiMsg) AND (NOT HangUp) THEN
BEGIN
IF (MsgArea <> -1) THEN
BEGIN
LoadLastReadRecord(LastReadRecord);
TempLastRead := LastReadRecord.LastRead;
END;
MainRead(FALSE,FALSE,(MsgArea <> -1));
IF (MsgArea <> -1) THEN
BEGIN
LastReadRecord.LastRead := TempLastRead;
SaveLastReadRecord(LastReadRecord);
END;
END;
END;
MsgArea := SaveReadMsgArea;
LoadMsgArea(MsgArea);
END;
FUNCTION FirstNew: Word;
VAR
MHeader: MHeaderRec;
MaxMsgs,
MsgNum: Word;
Done: Boolean;
BEGIN
MaxMsgs := HiMsg;
MsgNum := 0;
IF (MaxMsgs > 0) THEN
BEGIN
Done := FALSE;
MsgNum := 1;
WHILE (MsgNum <= MaxMsgs) AND (NOT Done) DO
BEGIN
LoadHeader(MsgNum,MHeader);
IF (LastReadRecord.LastRead < MHeader.Date) THEN
Done := TRUE
ELSE
BEGIN
IF (MsgNum < MaxMsgs) THEN
Inc(MsgNum,1)
ELSE
BEGIN
MsgNum := 0;
Done := TRUE;
END;
END;
END;
END;
FirstNew := MsgNum;
END;
PROCEDURE ScanMessages(MArea: Integer; AskUpdate: Boolean; MenuOption: Str50);
VAR
ScanFor: STRING[40];
Cmd: Char;
SaveMsgArea,
MsgNum: Word;
ScanNew,
ScanGlobal: Boolean;
PROCEDURE Searchboard(MArea1: Integer; Cmd1: Char);
VAR
MsgHeader: MHeaderRec;
Searched: STRING;
TotLoad: Word;
Match,
AnyShown: Boolean;
BEGIN
IF (MsgArea <> MArea1) THEN
ChangeMsgArea(MArea1);
IF (MsgArea = MArea1) THEN
BEGIN
InitMsgArea(MsgArea);
AnyShown := FALSE;
LIL := 0;
CLS;
Prompt('^1Scanning ^5'+MemMsgArea.Name+' #'+IntToStr(CompMsgArea(MsgArea,0))+' ^1...');
Reset(MsgHdrF);
Reset(MsgTxtF,1);
IF (IOResult <> 0) THEN
Exit;
IF (ScanNew) THEN
MsgNum := FirstNew
ELSE
MsgNum := 1;
IF (MsgNum > 0) AND (FileSize(MsgHdrF) > 0) THEN
WHILE (MsgNum <= FileSize(MsgHdrF)) AND (NOT Next) AND (NOT Abort) AND (NOT HangUp) DO
BEGIN
LoadHeader(MsgNum,MsgHeader);
Match := FALSE;
IF (Cmd1 IN ['Y',^M]) THEN
IF ToYou(MsgHeader) THEN
Match := TRUE;
IF (Cmd1 IN ['F','A']) THEN
BEGIN
IF (MARealName IN MemMsgArea.MAFlags) THEN
Searched := MsgHeader.From.Real
ELSE
Searched := MsgHeader.From.A1S;
IF (MemMsgArea.MAtype = 0) THEN
Searched := Searched;
Searched := AllCaps(UseName(MsgHeader.From.Anon,Searched));
IF (Pos(ScanFor,Searched) > 0) THEN
Match := TRUE;
END;
IF (Cmd1 IN ['T','A'] ) THEN
BEGIN
IF (MARealName IN MemMsgArea.MAFlags) THEN
Searched := MsgHeader.MTo.Real
ELSE
Searched := MsgHeader.MTo.A1S;
IF (MemMsgArea.MAtype = 0) THEN
Searched := Searched;
Searched := AllCaps(UseName(MsgHeader.MTo.Anon,Searched));
IF (Pos(ScanFor,Searched) > 0) THEN
Match := TRUE;
END;
IF (Cmd1 IN ['S','A'] ) THEN
IF (Pos(ScanFor,AllCaps(MsgHeader.Subject)) > 0) THEN
Match := TRUE;
IF (Cmd1 = 'A') AND (NOT Match) AND (MsgHeader.TextSize > 0) AND
(((MsgHeader.Pointer - 1) + MsgHeader.TextSize) <= FileSize(MsgTxtF)) AND
(MsgHeader.Pointer > 0) THEN
WITH MsgHeader DO
BEGIN
Seek(MsgTxtF,(Pointer - 1));
TotLoad := 0;
REPEAT
BlockRead(MsgTxtF,Searched[0],1);
BlockRead(MsgTxtF,Searched[1],Ord(Searched[0]));
LastError := IOResult;
Inc(TotLoad,Length(Searched) + 1);
IF (Pos(ScanFor,AllCaps(Searched)) > 0) THEN
Match := TRUE;
UNTIL (TotLoad >= TextSize) OR (Match);
END;
IF (Match) THEN
BEGIN
Close(MsgHdrF);
Close(MsgTxtF);
Msg_On := MsgNum;
NL;
MainRead(TRUE,AskUpdate,(MsgArea <> -1));
NL;
Reset(MsgHdrF);
Reset(MsgTxtF,1);
AnyShown := TRUE;
END;
Wkey;
IF (Next) THEN
Abort := TRUE;
Inc(MsgNum);
END;
Close(MsgHdrF);
Close(MsgTxtF);
IF (NOT AnyShown) THEN
BackErase(14 + Lennmci(MemMsgArea.Name) + Length(IntToStr(CompMsgArea(MsgArea,0))));
END;
END;
BEGIN
SaveMsgArea := MsgArea;
ScanNew := FALSE;
ScanGlobal := FALSE;
MenuOption := AllCaps(MenuOption);
IF (MenuOption <> '') THEN
Cmd := 'Y'
ELSE
Cmd := #0;
IF (Pos('N',MenuOption) > 0) THEN
ScanNew := TRUE;
IF (Pos('G',MenuOption) > 0) THEN
ScanGlobal := TRUE;
IF (Cmd = #0) THEN
REPEAT
NL;
Prt('Scan method (^5?^4=^5Help^4): ');
Onek(Cmd,'QFTSAY?'^M,TRUE,TRUE);
IF (Cmd = '?') THEN
BEGIN
NL;
LCmds(15,5,'From field','To field');
LCmds(15,5,'Subject field','All text');
LCmds(15,5,'Your messages','Quit');
END;
UNTIL (Cmd <> '?') OR (HangUp);
NL;
IF (NOT (Cmd IN ['Q',^M])) THEN
BEGIN
IF (Cmd <> 'Y') THEN
BEGIN
Prt('Text to scan for: ');
Input(ScanFor,40);
IF (ScanFor = '') THEN
Exit;
NL;
END;
IF (MenuOption = '') THEN
ScanNew := PYNQ('Scan new messages only? ',0,TRUE);
IF (ScanGlobal) OR ((MenuOption = '') AND PYNQ('Global scan? ',0,FALSE)) THEN
BEGIN
MArea := 1;
WHILE (MArea >= 1) AND (MArea <= NumMsgAreas) AND (NOT Abort) AND (NOT HangUp) DO
BEGIN
Searchboard(MArea,Cmd);
Wkey;
Inc(MArea);
END;
END
ELSE
Searchboard(MArea,Cmd);
END;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
END;
PROCEDURE ScanYours;
VAR
ScanAllPublicMsgFile: FILE OF Boolean;
MsgHeader: MHeaderRec;
MArea,
SaveMsgArea: Integer;
MsgNum,
PubMsgsFound: Word;
SaveConfSystem,
AnyFound,
FirstTime,
MsgsFound: Boolean;
BEGIN
SaveMsgArea := MsgArea;
SaveConfSystem := ConfSystem;
ConfSystem := FALSE;
IF (SaveConfSystem) THEN
NewCompTables;
Assign(ScanAllPublicMsgFile,TempDir+'SAPM'+IntToStr(ThisNode)+'.DAT');
ReWrite(ScanAllPublicMsgFile);
FOR MArea := 1 TO NumMsgAreas DO
BEGIN
MsgsFound := FALSE;
Write(ScanAllPublicMsgFile,MsgsFound);
END;
Prompt('%LF^5Scanning for your new public messages ... ^1');
FirstTime := TRUE;
AnyFound := FALSE;
MArea := 1;
WHILE (MArea >= 1) AND (MArea <= NumMsgAreas) AND (NOT Abort) AND (NOT HangUp) DO
BEGIN
IF (MsgArea <> MArea) THEN
ChangeMsgArea(MArea);
IF (MsgArea = MArea) THEN
BEGIN
InitMsgArea(MsgArea);
IF (LastReadRecord.NewScan) THEN
BEGIN
Reset(MsgHdrF);
Reset(MsgTxtF,1);
IF (IOResult = 0) THEN
BEGIN
PubMsgsFound := 0;
MsgNum := FirstNew;
IF (MsgNum > 0) AND (FileSize(MsgHdrF) > 0) THEN
WHILE (MsgNum <= FileSize(MsgHdrF)) AND (NOT HangUp) DO
BEGIN
LoadHeader(MsgNum,MsgHeader);
IF (ToYou(MsgHeader)) THEN
BEGIN
Seek(ScanAllPublicMsgFile,(MArea - 1));
MsgsFound := TRUE;
Write(ScanAllPublicMsgFile,MsgsFound);
Inc(PubMsgsFound);
END;
Inc(MsgNum);
END;
Close(MsgHdrF);
Close(MsgTxtF);
IF (PubMsgsFound > 0) THEN
BEGIN
IF (FirstTime) THEN
BEGIN
NL;
NL;
FirstTime := FALSE;
END;
Print('^5'+PadLeftStr(MemMsgArea.Name,30)+' ^1'+IntToStr(PubMsgsFound));
AnyFound := TRUE;
END;
END;
END;
END;
Inc(MArea);
END;
Close(ScanAllPublicMsgFile);
IF (NOT AnyFound) THEN
Print('^5No messages found.^1')
ELSE
BEGIN
Abort := FALSE;
Next := FALSE;
NL;
IF PYNQ('Read your new public messages now? ',0,FALSE) THEN
BEGIN
Assign(ScanAllPublicMsgFile,TempDir+'SAPM'+IntToStr(ThisNode)+'.DAT');
Reset(ScanAllPublicMsgFile);
MArea := 1;
WHILE (MArea >= 1) AND (MArea <= NumMsgAreas) AND (NOT Abort) AND (NOT HangUp) DO
BEGIN
Seek(ScanAllPublicMsgFile,(MArea - 1));
Read(ScanAllPublicMsgFile,MsgsFound);
IF (MsgsFound) THEN
ScanMessages(MArea,TRUE,'N');
WKey;
Inc(MArea);
END;
Close(ScanAllPublicMsgFile);
END;
END;
ConfSystem := SaveConfSystem;
IF (SaveConfSystem) THEN
NewCompTables;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
LastError := IOResult;
END;
PROCEDURE StartNewScan(MenuOption: Str50);
VAR
MArea,
SaveMsgArea: Integer;
Global: Boolean;
PROCEDURE NewScan(MArea1: Integer);
BEGIN
IF (MsgArea <> MArea1) THEN
ChangeMsgArea(MArea1);
IF (MsgArea = MArea1) THEN
BEGIN
InitMsgArea(MsgArea);
IF (LastReadRecord.NewScan) OR ((MAForceRead IN MemMsgArea.MAFlags) AND (NOT CoSysOp)) THEN
BEGIN
TempLastRead := LastReadRecord.LastRead;
Lil := 0;
{ Prompt('^3'+FString.NewScan1);}
lRGLngStr(8,FALSE);
Msg_On := FirstNew;
IF (Msg_On > 0) THEN
MainRead(FALSE,FALSE,(MsgArea <> -1));
LastReadRecord.LastRead := TempLastRead;
SaveLastReadRecord(LastReadRecord);
(* Add backarase *)
END;
END;
END;
BEGIN
SaveMsgArea := MsgArea;
MArea := MsgArea;
Global := FALSE;
Abort := FALSE;
Next := FALSE;
IF (UpCase(MenuOption[1]) = 'C') THEN
MArea := MsgArea
ELSE IF (UpCase(MenuOption[1]) = 'G') THEN
Global := TRUE
ELSE IF (StrToInt(MenuOption) <> 0) THEN
MArea := StrToInt(MenuOption)
ELSE IF (MenuOption = '') THEN
Global := PYNQ('%LFScan all message areas? ',0,FALSE);
IF (NOT Global) THEN
NewScan(MArea)
ELSE
BEGIN
MArea := 1;
WHILE (MArea >= 1) AND (MArea <= NumMsgAreas) AND (NOT Abort) AND (NOT HangUp) DO
BEGIN
NewScan(MArea);
WKey;
Inc(MArea);
END;
SysOpLog('Global new scan of message areas');
END;
MsgArea := SaveMsgArea;
LoadMsgArea(MsgArea);
END;
END.