2013-02-07 10:23:11 -08:00
|
|
|
|
{$IFDEF WIN32}
|
|
|
|
|
{$I DEFINES.INC}
|
|
|
|
|
{$ENDIF}
|
|
|
|
|
|
2013-02-04 15:56:58 -08:00
|
|
|
|
{$A+,B-,D+,E-,F+,I-,L+,N-,O+,R-,S+,V-}
|
|
|
|
|
|
|
|
|
|
UNIT EMail;
|
|
|
|
|
|
|
|
|
|
INTERFACE
|
|
|
|
|
|
|
|
|
|
USES
|
|
|
|
|
Common;
|
|
|
|
|
|
|
|
|
|
PROCEDURE SSMail(MenuOption: Str50);
|
|
|
|
|
PROCEDURE SMail(MassMail: Boolean);
|
|
|
|
|
PROCEDURE SEMail(UNum: Integer; ReplyHeader: MHeaderRec);
|
|
|
|
|
PROCEDURE AutoReply(ReplyHeader: MHeaderRec);
|
|
|
|
|
PROCEDURE ReadMail;
|
|
|
|
|
PROCEDURE ShowEmail;
|
|
|
|
|
|
|
|
|
|
IMPLEMENTATION
|
|
|
|
|
|
|
|
|
|
USES
|
|
|
|
|
Dos,
|
|
|
|
|
Common5,
|
|
|
|
|
File6,
|
|
|
|
|
Mail0,
|
|
|
|
|
Mail1,
|
|
|
|
|
Mail3,
|
|
|
|
|
SysOp2G,
|
|
|
|
|
SysOp3,
|
|
|
|
|
ShortMsg,
|
|
|
|
|
TimeFunc,
|
|
|
|
|
NodeList,
|
|
|
|
|
MiscUser;
|
|
|
|
|
|
|
|
|
|
PROCEDURE SSMail(MenuOption: Str50);
|
|
|
|
|
VAR
|
|
|
|
|
MHeader: MHeaderRec;
|
|
|
|
|
BEGIN
|
|
|
|
|
InResponseTo := '';
|
|
|
|
|
IF (Pos(';',MenuOption) = 0) AND (MenuOption <> '') THEN
|
|
|
|
|
InResponseTo := #1'FeedBack'
|
|
|
|
|
ELSE IF (MenuOption <> '') THEN
|
|
|
|
|
IF (MenuOption[Pos(';', MenuOption) + 1] = '\') THEN
|
|
|
|
|
InResponseTo := '\'+#1+Copy(MenuOption,(Pos(';',MenuOption) + 2),255)
|
|
|
|
|
ELSE
|
|
|
|
|
InResponseTo := #1+Copy(MenuOption,(Pos(';',MenuOption) + 1),255);
|
|
|
|
|
IF (StrToInt(MenuOption) < 1) THEN
|
|
|
|
|
SMail(FALSE)
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
MHeader.Status := [];
|
|
|
|
|
SEMail(StrToInt(MenuOption),MHeader);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE SMail(MassMail: Boolean);
|
|
|
|
|
VAR
|
|
|
|
|
MaxMailListArray: ARRAY [1..255] OF Integer;
|
|
|
|
|
User: UserRecordType;
|
|
|
|
|
MHeader: MHeaderRec;
|
|
|
|
|
SysOpName: STRING[36];
|
|
|
|
|
MassACS: ACString;
|
|
|
|
|
Cmd: Char;
|
|
|
|
|
Counter,
|
|
|
|
|
NumMassMailList: Byte;
|
|
|
|
|
UNum: Integer;
|
|
|
|
|
SaveEmailSent,
|
|
|
|
|
Fee: Word;
|
|
|
|
|
EmailOK: Boolean;
|
|
|
|
|
|
|
|
|
|
PROCEDURE CheckItOut(VAR UNum1: Integer; ShowIt: Boolean);
|
|
|
|
|
VAR
|
|
|
|
|
User1: UserRecordType;
|
|
|
|
|
ForUsrUNum,
|
|
|
|
|
SaveUNum1,
|
|
|
|
|
UNum2: Integer;
|
|
|
|
|
BEGIN
|
|
|
|
|
SaveUnum1 := UNum1;
|
|
|
|
|
IF ((UNum1 < 1) OR (UNum1 > (MaxUsers - 1))) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
UNum1 := 0;
|
|
|
|
|
Exit;
|
|
|
|
|
END;
|
|
|
|
|
LoadURec(User,UNum1);
|
|
|
|
|
IF (User.Waiting >= General.MaxWaiting) OR (NoMail IN User.Flags) AND (NOT CoSysOp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
UNum1 := 0;
|
|
|
|
|
{ Print(FString.CantEmail); }
|
|
|
|
|
lRGLngStr(46,FALSE);
|
|
|
|
|
Exit;
|
|
|
|
|
END;
|
|
|
|
|
ForUsrUNum := User.ForUsr;
|
|
|
|
|
IF (ForUsrUNum < 1) OR (ForUsrUNum > (MaxUsers - 1)) THEN
|
|
|
|
|
ForUsrUNum := 0;
|
|
|
|
|
IF (ForUsrUNum <> 0) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User1,ForUsrUNum);
|
|
|
|
|
IF (ShowIt) THEN
|
|
|
|
|
Print('[> '+Caps(User.Name)+' #'+IntToStr(UNum1)+': message forwarded to '+Caps(User1.Name)+'.');
|
|
|
|
|
UNum1 := ForUsrUNum;
|
|
|
|
|
END;
|
|
|
|
|
IF (ShowIt) THEN
|
|
|
|
|
FOR UNum2 := 1 TO NumMassMailList DO
|
|
|
|
|
IF (MaxMailListArray[UNum2] = UNum1) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
IF (ShowIt) THEN
|
|
|
|
|
Print('[> '+Caps(User.Name)+' #'+IntToStr(UNum1)+': Can''t send more than once.');
|
|
|
|
|
UNum1 := 0;
|
|
|
|
|
Exit;
|
|
|
|
|
END;
|
|
|
|
|
IF (SaveUNum1 <> UNum1) THEN
|
|
|
|
|
IF ((SaveUNum1 >= 1) AND (SaveUNum1 <= (MaxUsers - 1))) THEN
|
|
|
|
|
LoadURec(User,SaveUNum1);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE SendIt(UNum1: Integer);
|
|
|
|
|
BEGIN
|
|
|
|
|
CheckItOut(UNum1,FALSE);
|
|
|
|
|
IF (UNum1 = 0) OR (UNum1 = UserNum) THEN
|
|
|
|
|
Exit;
|
|
|
|
|
IF ((UNum1 >= 1) AND (UNum1 <= (MaxUsers - 1))) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,UNum1);
|
|
|
|
|
IF (UNum1 = 1) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Inc(ThisUser.FeedBack);
|
|
|
|
|
|
|
|
|
|
IF (FeedBackPostsToday < 255) THEN
|
|
|
|
|
Inc(FeedBackPostsToday);
|
|
|
|
|
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
Inc(ThisUser.EmailSent);
|
|
|
|
|
AdjustBalance(General.CreditEmail);
|
|
|
|
|
|
|
|
|
|
IF (PrivatePostsToday < 255) THEN
|
|
|
|
|
Inc(PrivatePostsToday);
|
|
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
Inc(User.Waiting);
|
|
|
|
|
SaveURec(User,UNum1);
|
|
|
|
|
END;
|
|
|
|
|
WITH MHeader.MTO DO
|
|
|
|
|
BEGIN
|
|
|
|
|
UserNum := UNum1;
|
|
|
|
|
A1S := AllCaps(User.Name);
|
|
|
|
|
Real := AllCaps(User.RealName);
|
|
|
|
|
Name := AllCaps(User.Name);
|
|
|
|
|
END;
|
|
|
|
|
SaveHeader((HiMsg + 1),MHeader);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE DoIt(Cmd1: Char);
|
|
|
|
|
VAR
|
|
|
|
|
UNum1: Integer;
|
|
|
|
|
BEGIN
|
|
|
|
|
InitMsgArea(-1);
|
|
|
|
|
FillChar(MHeader,SizeOf(MHeader),0);
|
|
|
|
|
MHeader.MTO.A1S := 'Mass private message';
|
|
|
|
|
MHeader.MTO.Real := MHeader.MTO.A1S;
|
|
|
|
|
IF (NOT InputMessage(FALSE,TRUE,'',MHeader,'',78,500)) THEN
|
|
|
|
|
Exit;
|
|
|
|
|
CASE Cmd1 OF
|
|
|
|
|
'1' : BEGIN
|
|
|
|
|
{ Print(FString.MassEmail); }
|
|
|
|
|
lRGLngStr(48,FALSE);
|
|
|
|
|
SysOpLog('Mass-private message sent to: (by ACS "'+MassACS+'")');
|
|
|
|
|
FOR UNum1 := 1 TO (MaxUsers - 1) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,UNum1);
|
|
|
|
|
IF (AACS1(User,UNum1,MassACS)) AND (UNum1 <> UserNum) AND (NOT (Deleted IN User.SFlags))
|
|
|
|
|
AND (NOT (LockedOut IN User.SFlags)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
SendIt(UNum1);
|
|
|
|
|
SysOpLog(' '+Caps(User.Name));
|
|
|
|
|
Print(' '+Caps(User.Name));
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
'2' : BEGIN
|
|
|
|
|
{ Print(FString.MassEmailAll); }
|
|
|
|
|
lRGLngStr(49,FALSE);
|
|
|
|
|
SysOpLog('Mass-private message sent to ALL USERS.');
|
|
|
|
|
FOR UNum1 := 1 TO (MaxUsers - 1) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,UNum1);
|
|
|
|
|
IF (UNum1 <> UserNum) AND (NOT (Deleted IN User.SFlags))
|
|
|
|
|
AND (NOT (LockedOut IN User.SFlags)) THEN
|
|
|
|
|
SendIt(UNum1);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
'3' : BEGIN
|
|
|
|
|
{ Print(FString.MassEmail); }
|
|
|
|
|
lRGLngStr(48,FALSE);
|
|
|
|
|
SysOpLog('Mass-private message sent to:');
|
|
|
|
|
FOR UNum1 := 1 TO NumMassMailList DO
|
|
|
|
|
BEGIN
|
|
|
|
|
SendIt(MaxMailListArray[UNum1]);
|
|
|
|
|
SysOpLog(' '+Caps(User.Name));
|
|
|
|
|
Print(' '+Caps(User.Name));
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
|
EmailOK := TRUE;
|
|
|
|
|
|
|
|
|
|
IF ((REmail IN ThisUser.Flags) OR (NOT AACS(General.NormPrivPost))) AND (NOT CoSysOp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7Your access privledges do not include sending private messages!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END
|
|
|
|
|
ELSE IF ((PrivatePostsToday >= General.MaxPrivPost) AND (NOT CoSysOp)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7You have already sent the maximum private messages allowed per day!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END
|
|
|
|
|
ELSE IF (AccountBalance < General.CreditEmail) AND (General.CreditEmail > 0) AND (NOT (FNoCredits IN ThisUser.Flags)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7Insufficient account balance to send private messages!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF (NOT EmailOk) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
IF (InWFCMenu) THEN
|
|
|
|
|
PauseScr(FALSE);
|
|
|
|
|
Exit;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF (NOT MassMail) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
IF (AACS(General.NetMailACS)) AND PYNQ(lRGLngStr(51,TRUE){FString.IsNetMail},0,FALSE) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
|
PrintF('NETMHELP');
|
|
|
|
|
|
|
|
|
|
SysOpName := '';
|
|
|
|
|
|
|
|
|
|
WITH MHeader.From DO
|
|
|
|
|
GetNetAddress(SysOpName,Zone,Net,Node,Point,Fee,FALSE);
|
|
|
|
|
|
|
|
|
|
IF (SysOpName = '') THEN
|
|
|
|
|
Exit;
|
|
|
|
|
|
|
|
|
|
MHeader.From.Name := SysOpName;
|
|
|
|
|
|
|
|
|
|
MHeader.Status := [NetMail];
|
|
|
|
|
|
|
|
|
|
SaveEmailSent := ThisUser.EmailSent;
|
|
|
|
|
|
|
|
|
|
SEMail(0,MHeader);
|
|
|
|
|
|
|
|
|
|
IF (ThisUser.EmailSent > SaveEmailSent) THEN
|
|
|
|
|
Inc(ThisUser.Debit,Fee);
|
|
|
|
|
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
|
{ Print(FString.SendEMail); }
|
|
|
|
|
lRGLngStr(47,FALSE);
|
|
|
|
|
NL;
|
|
|
|
|
Print('Enter User Number, Name, or Partial Search String.');
|
|
|
|
|
Prt(': ');
|
|
|
|
|
lFindUserWS(UNum);
|
|
|
|
|
IF (UNum < 1) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
PauseScr(FALSE);
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
MHeader.Status := [];
|
|
|
|
|
SEMail(UNum,MHeader);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
InResponseTo := '';
|
|
|
|
|
NumMassMailList := 0;
|
|
|
|
|
FillChar(MaxMailListArray,SizeOf(MaxMailListArray),0);
|
|
|
|
|
NL;
|
|
|
|
|
Print('Mass private message: Send message to multiple users.');
|
|
|
|
|
IF (NOT CoSysOp) THEN
|
|
|
|
|
Cmd := '3'
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('(1) Send to users with a certain ACS.');
|
|
|
|
|
Print('(2) Send to all system users.');
|
|
|
|
|
Print('(3) Send private messages to a list of users.');
|
|
|
|
|
NL;
|
|
|
|
|
Prt('Your choice [^51^4-^53^4,^5Q^4=^5Quit^4]: ');
|
|
|
|
|
OneK(Cmd,'Q123',TRUE,TRUE);
|
|
|
|
|
END;
|
|
|
|
|
CASE Cmd OF
|
|
|
|
|
'1' : BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Prt('Enter ACS: ');
|
|
|
|
|
MPL((SizeOf(ACString) - 1));
|
|
|
|
|
InputL(MassACS,(SizeOf(ACString) - 1));
|
|
|
|
|
IF (MassACS <> '') THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('Users marked by ACS "'+MassACS+'":');
|
|
|
|
|
Abort := FALSE;
|
|
|
|
|
Next := FALSE;
|
|
|
|
|
Reset(UserFile);
|
|
|
|
|
UNum := 1;
|
|
|
|
|
WHILE (UNum <= (MaxUsers - 1)) AND (NOT Abort) AND (NOT HangUp) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,UNum);
|
|
|
|
|
IF (AACS1(User,UNum,MassACS)) AND (UNum <> UserNum) AND (NOT (Deleted IN User.SFlags))
|
|
|
|
|
AND (NOT (LockedOut IN User.SFlags)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
PrintACR(' '+Caps(User.Name));
|
|
|
|
|
Inc(NumMassMailList);
|
|
|
|
|
END;
|
|
|
|
|
Inc(UNum);
|
|
|
|
|
WKey;
|
|
|
|
|
END;
|
|
|
|
|
Close(UserFile);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
'2' : BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('All users marked for mass-private messages.');
|
|
|
|
|
Abort := FALSE;
|
|
|
|
|
Next := FALSE;
|
|
|
|
|
Reset(UserFile);
|
|
|
|
|
UNum := 1;
|
|
|
|
|
WHILE (UNum <= (MaxUsers - 1)) AND (NOT Abort) AND (NOT HangUp) DO (* Was X - 1 *)
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,UNum);
|
|
|
|
|
IF (UNum <> UserNum) AND (NOT (Deleted IN User.SFlags)) AND (NOT (LockedOut IN User.SFlags)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
PrintACR(' '+Caps(User.Name));
|
|
|
|
|
Inc(NumMassMailList);
|
|
|
|
|
END;
|
|
|
|
|
Inc(UNum);
|
|
|
|
|
WKey;
|
|
|
|
|
END;
|
|
|
|
|
Close(UserFile);
|
|
|
|
|
END;
|
|
|
|
|
'3' : BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('You can send mass private messages to '
|
|
|
|
|
+AOnOff(CoSysOp,'255',IntToStr(General.MaxMassMailList))+' user''s');
|
|
|
|
|
Print('Enter a blank line to stop entering names.');
|
|
|
|
|
UNum := 1;
|
|
|
|
|
WHILE (UNum <> 0) AND (NumMassMailList < General.MaxMassMailList) OR (UNum <> 0) AND (NumMassMailList < 255)
|
|
|
|
|
AND (CoSysOp) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('Enter User Number, Name, or Partial Search String.');
|
|
|
|
|
Prt(': ');
|
|
|
|
|
lFindUserWS(UNum);
|
|
|
|
|
FOR Counter := 1 TO NumMassMailList DO
|
|
|
|
|
IF (MaxMailListArray[Counter] = UNum) THEN
|
|
|
|
|
UNum := 0;
|
|
|
|
|
IF (UNum = UserNum) THEN
|
|
|
|
|
UNum := 0;
|
|
|
|
|
IF (UNum > 0) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,UNum);
|
|
|
|
|
IF (LockedOut IN User.SFlags) OR (Deleted IN User.SFlags) THEN
|
|
|
|
|
UNum := 0
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
Inc(NumMassMailList);
|
|
|
|
|
MaxMailListArray[NumMassMailList] := UNum;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
IF (NumMassMailList > 0) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('Users marked:');
|
|
|
|
|
Abort := FALSE;
|
|
|
|
|
Next := FALSE;
|
|
|
|
|
Reset(UserFile);
|
|
|
|
|
UNum := 1;
|
|
|
|
|
WHILE (UNum <= NumMassMailList) AND (NOT Abort) AND (NOT HangUp) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,MaxMailListArray[UNum]);
|
|
|
|
|
PrintACR(' '+Caps(User.Name));
|
|
|
|
|
Inc(UNum);
|
|
|
|
|
WKey;
|
|
|
|
|
END;
|
|
|
|
|
Close(UserFile);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
IF (Cmd <> 'Q') THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('Total users listed: '+IntToStr(NumMassMailList));
|
|
|
|
|
IF (NumMassMailList > 0) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
IF PYNQ('Send mass-private messages to the above list? ',0,FALSE) THEN
|
|
|
|
|
DoIt(Cmd);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
SaveURec(ThisUser,UserNum);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE SEMail(UNum: Integer; ReplyHeader: MHeaderRec);
|
|
|
|
|
VAR
|
|
|
|
|
User: UserRecordType;
|
|
|
|
|
MHeader: MHeaderRec;
|
|
|
|
|
Counter,
|
|
|
|
|
Counter1: Byte;
|
|
|
|
|
SaveReadMsgArea: Integer;
|
|
|
|
|
EmailOk: Boolean;
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
|
IF (NOT (NetMail IN ReplyHeader.Status)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
|
IF (UNum < 1) OR (UNum > (MaxUsers - 1)) THEN
|
|
|
|
|
Exit;
|
|
|
|
|
|
|
|
|
|
LoadURec(User,UNum);
|
|
|
|
|
|
|
|
|
|
MHeader.Status := [];
|
|
|
|
|
|
|
|
|
|
EmailOk := TRUE;
|
|
|
|
|
|
|
|
|
|
IF ((REmail IN ThisUser.Flags) OR (NOT AACS(General.NormPrivPost))) AND (NOT CoSysOp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7Your access privledges do not include sending private messages!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END
|
|
|
|
|
ELSE IF (AccountBalance < General.CreditEmail) AND (General.CreditEmail > 0) AND (NOT (FNoCredits IN ThisUser.Flags)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7Insufficient account balance to send private messages!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END
|
|
|
|
|
ELSE IF (PrivatePostsToday >= General.MaxPrivPost) AND (NOT CoSysOp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7You have already sent the maximum private messages allowed per day!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END
|
|
|
|
|
ELSE IF ((UNum = 1) AND (FeedbackPostsToday >= General.MaxFBack) AND (NOT CoSysOp)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7You have already sent the maximum allowed feedback per day!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END
|
|
|
|
|
ELSE IF (User.Waiting >= General.MaxWaiting) AND (NOT CoSysOp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7The mailbox for this user is full!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END
|
|
|
|
|
ELSE IF (NoMail IN User.Flags) AND (NOT CoSysOp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7The mailbox for this user is closed!^1');
|
|
|
|
|
EmailOk := FALSE;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF (NOT EmailOk) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
IF (INWFCMenu) THEN
|
|
|
|
|
PauseScr(FALSE);
|
|
|
|
|
Exit;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF ((User.ForUsr < 1) OR (User.ForUsr > (MaxUsers - 1))) THEN
|
|
|
|
|
User.ForUsr := 0;
|
|
|
|
|
|
|
|
|
|
IF (User.ForUsr > 0) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
UNum := User.ForUsr;
|
|
|
|
|
LoadURec(User,UNum);
|
|
|
|
|
IF (CoSysOp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
IF (NOT PYNQ('Send private message to '+Caps(User.Name)+'? ',0,FALSE)) THEN
|
|
|
|
|
Exit;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
|
IF (NOT AACS(General.NetMailACS)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
{ Print(FString.NoNetMail); }
|
|
|
|
|
lRGLngStr(50,FALSE);
|
|
|
|
|
PauseScr(FALSE);
|
|
|
|
|
Exit;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
User.Name := ReplyHeader.From.Name;
|
|
|
|
|
User.RealName := ReplyHeader.From.Name;
|
|
|
|
|
UNum := 0;
|
|
|
|
|
MHeader.Status := [NetMail];
|
|
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
SaveReadMsgArea := ReadMsgArea;
|
|
|
|
|
|
|
|
|
|
InitMsgArea(-1);
|
|
|
|
|
|
|
|
|
|
WITH MHeader.MTO DO
|
|
|
|
|
BEGIN
|
|
|
|
|
UserNum := UNum;
|
|
|
|
|
A1S := AllCaps(User.Name);
|
|
|
|
|
Real := AllCaps(User.RealName);
|
|
|
|
|
Name := AllCaps(User.Name);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF (InputMessage(FALSE,TRUE,'',MHeader,'',78,500)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
|
IF (NetMail IN ReplyHeader.Status) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Include(MHeader.Status,NetMail);
|
|
|
|
|
|
|
|
|
|
MHeader.NetAttribute := General.NetAttribute * [Intransit,Private,Crash,KillSent,Hold,Local];
|
|
|
|
|
|
|
|
|
|
ChangeFlags(MHeader);
|
|
|
|
|
|
|
|
|
|
Counter1 := 0;
|
|
|
|
|
Counter := 0;
|
|
|
|
|
WHILE (Counter <= 19) AND (Counter1 = 0) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
IF (General.AKA[Counter].Zone = ReplyHeader.From.Zone) AND (General.AKA[Counter].Zone <> 0) THEN
|
|
|
|
|
Counter1 := Counter;
|
|
|
|
|
Inc(Counter);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF (CoSysop) AND (General.AKA[Counter1].Zone <> ReplyHeader.From.Zone) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
FOR Counter := 0 TO 19 DO
|
|
|
|
|
IF (General.AKA[Counter].Net > 0) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
PrintACR(PadLeftInt((Counter + 1),2)+'. '+
|
|
|
|
|
IntToStr(General.AKA[Counter].Zone)+':'+
|
|
|
|
|
IntToStr(General.AKA[Counter].Net)+'/'+
|
|
|
|
|
IntToStr(General.AKA[Counter].Node)+
|
|
|
|
|
AOnOff((General.AKA[Counter].Point > 0),'.'+IntToStr(General.AKA[Counter].Point),''));
|
|
|
|
|
END;
|
|
|
|
|
InputByteWOC('%LFUse which AKA',Counter,[NumbersOnly],1,20);
|
|
|
|
|
IF (Counter >= 1) OR (Counter <= 20) THEN
|
|
|
|
|
Counter1 := (Counter - 1);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
WITH MHeader.From DO
|
|
|
|
|
BEGIN
|
|
|
|
|
Zone := General.AKA[Counter1].Zone;
|
|
|
|
|
Net := General.AKA[Counter1].Net;
|
|
|
|
|
Node := General.AKA[Counter1].Node;
|
|
|
|
|
Point := General.AKA[Counter1].Point;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
WITH MHeader.MTO DO
|
|
|
|
|
BEGIN
|
|
|
|
|
Zone := ReplyHeader.From.Zone;
|
|
|
|
|
Net := ReplyHeader.From.Net;
|
|
|
|
|
Node := ReplyHeader.From.Node;
|
|
|
|
|
Point := ReplyHeader.From.Point;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF (UNum = 1) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Inc(ThisUser.FeedBack);
|
|
|
|
|
|
|
|
|
|
IF (FeedBackPostsToday < 255) THEN
|
|
|
|
|
Inc(FeedbackPostsToday);
|
|
|
|
|
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
Inc(ThisUser.EmailSent);
|
|
|
|
|
AdjustBalance(General.CreditEmail);
|
|
|
|
|
|
|
|
|
|
IF (PrivatePostsToday < 255) THEN
|
|
|
|
|
Inc(PrivatePostsToday);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
IF (UNum >= 1) AND (UNum <= (MaxUsers - 1)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,UNum);
|
|
|
|
|
Inc(User.Waiting);
|
|
|
|
|
SaveURec(User,UNum);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
SaveHeader((HiMsg + 1),MHeader);
|
|
|
|
|
|
|
|
|
|
IF (UserOn) THEN
|
|
|
|
|
SysOpLog(AOnOff((NetMail IN MHeader.Status),'Netmail','Private message')+' sent to ^5'+Caps(User.Name)+'.');
|
|
|
|
|
|
|
|
|
|
Print('^1'+AOnOff((NetMail IN MHeader.Status),'Netmail','Private message')+' sent to ^5'+Caps(User.Name)+'^1.');
|
|
|
|
|
|
|
|
|
|
Update_Screen;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
InitMsgArea(SaveReadMsgArea);
|
|
|
|
|
|
|
|
|
|
SaveURec(ThisUser,UserNum);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE AutoReply(ReplyHeader: MHeaderRec);
|
|
|
|
|
VAR
|
|
|
|
|
SysOpName: Str36;
|
|
|
|
|
Fee: Word;
|
|
|
|
|
TotPrivMsg: LongInt;
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
|
IF AACS(General.NetMailACS) AND (NOT (NetMail IN ReplyHeader.Status)) AND
|
|
|
|
|
PYNQ(lRGLngStr(51,TRUE){FString.IsNetMail},0,FALSE) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
ReplyHeader.Status := [NetMail];
|
|
|
|
|
LastAuthor := 0;
|
|
|
|
|
SysOpName := UseName(ReplyHeader.From.Anon,
|
|
|
|
|
AOnOff(MARealName IN MemMsgArea.MAFlags,
|
|
|
|
|
ReplyHeader.From.Real,
|
|
|
|
|
ReplyHeader.From.A1S));
|
|
|
|
|
WITH ReplyHeader.From DO
|
|
|
|
|
GetNetAddress(SysOpName,Zone,Net,Node,Point,Fee,FALSE);
|
|
|
|
|
IF (SysOpName = '') THEN
|
|
|
|
|
Exit;
|
|
|
|
|
ReplyHeader.From.Name := SysOpName;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
TotPrivMsg := (ThisUser.EmailSent + ThisUser.FeedBack);
|
|
|
|
|
|
|
|
|
|
IF (LastAuthor = 0) AND (NOT (NetMail IN ReplyHeader.Status)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
LastAuthor := SearchUser(ReplyHeader.From.A1S,TRUE);
|
|
|
|
|
IF (LastAuthor = 0) THEN
|
|
|
|
|
Print('^7That user does not have an account on this BBS!^1')
|
|
|
|
|
ELSE
|
|
|
|
|
SEMail(LastAuthor,ReplyHeader);
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
SEMail(LastAuthor,ReplyHeader);
|
|
|
|
|
IF ((ThisUser.EmailSent + ThisUser.FeedBack) > TotPrivMsg) THEN
|
|
|
|
|
IF (NetMail IN ReplyHeader.Status) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
WITH ReplyHeader.From DO
|
|
|
|
|
GetNetAddress(SysOpName,Zone,Net,Node,Point,Fee,TRUE);
|
|
|
|
|
Inc(ThisUser.Debit,Fee)
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
SendShortMessage(ReplyHeader.From.UserNum,
|
|
|
|
|
Caps(ThisUser.Name)+' replied to "'+AOnOff((ReplyHeader.FileAttached > 0),
|
|
|
|
|
StripName(ReplyHeader.Subject),ReplyHeader.Subject)+'" on '+DateStr+' '+TimeStr+'.');
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE ReadMail;
|
|
|
|
|
TYPE
|
2013-02-07 11:17:50 -08:00
|
|
|
|
MessageArrayType = ARRAY [1..255] OF SmallWord;
|
2013-02-04 15:56:58 -08:00
|
|
|
|
VAR
|
|
|
|
|
MessageArray: MessageArrayType;
|
|
|
|
|
User: UserRecordType;
|
|
|
|
|
MHeader: MHeaderRec;
|
|
|
|
|
InputStr: AStr;
|
|
|
|
|
Cmd: Char;
|
|
|
|
|
SNum,
|
|
|
|
|
MNum: Byte;
|
|
|
|
|
UNum,
|
|
|
|
|
SaveReadMsgArea: Integer;
|
|
|
|
|
DeleteOk,
|
|
|
|
|
ReplyOk: Boolean;
|
|
|
|
|
|
|
|
|
|
PROCEDURE RemoveCurrent(VAR SNum1,MNum1: Byte; VAR MessageArray1: MessageArrayType);
|
|
|
|
|
VAR
|
|
|
|
|
MsgNum: Byte;
|
|
|
|
|
BEGIN
|
|
|
|
|
Dec(MNum1);
|
|
|
|
|
FOR MsgNum := SNum1 TO MNum1 DO
|
|
|
|
|
MessageArray1[MsgNum] := MessageArray1[MsgNum + 1];
|
|
|
|
|
IF (SNum1 > MNum1) THEN
|
|
|
|
|
SNum1 := MNum1;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE ReScan(VAR MNum1: Byte; VAR MessageArray1: MessageArrayType);
|
|
|
|
|
VAR
|
|
|
|
|
MsgNum: Word;
|
|
|
|
|
BEGIN
|
|
|
|
|
FillChar(MessageArray1,SizeOf(MessageArray1),0);
|
|
|
|
|
MNum1 := 0;
|
|
|
|
|
MsgNum := 1;
|
|
|
|
|
WHILE (MsgNum <= HiMsg) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadHeader(MsgNum,MHeader);
|
|
|
|
|
IF (MHeader.MTO.UserNum = UserNum) AND (NOT (MDeleted IN MHeader.Status)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Inc(MNum1);
|
|
|
|
|
MessageArray1[MNum1] := MsgNum;
|
|
|
|
|
END;
|
|
|
|
|
Inc(MsgNum);
|
|
|
|
|
END;
|
|
|
|
|
ThisUser.Waiting := 0;
|
|
|
|
|
SaveURec(ThisUser,UserNum);
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE ListYourEmail(VAR SNum1: Byte; MNum1: Byte; MessageArray1: MessageArrayType);
|
|
|
|
|
VAR
|
|
|
|
|
DT: DateTime;
|
|
|
|
|
TempStr: AStr;
|
|
|
|
|
j,
|
|
|
|
|
NumDone: Byte;
|
|
|
|
|
BEGIN
|
|
|
|
|
IF (SNum1 < 1) OR (SNum1 > MNum1) THEN
|
|
|
|
|
SNum1 := 1;
|
|
|
|
|
Abort := FALSE;
|
|
|
|
|
Next := FALSE;
|
|
|
|
|
(*
|
|
|
|
|
CLS;
|
|
|
|
|
PrintACR('<13><><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>Ŀ');
|
|
|
|
|
PrintACR('<13><><13> Num <13><><13> Date/Time <13><><13> Sender <13><><13> Subject <13><>');
|
|
|
|
|
PrintACR('<13><><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><EFBFBD><EFBFBD>');
|
|
|
|
|
*)
|
|
|
|
|
lRGLngStr(60,FALSE);
|
|
|
|
|
NumDone := 1;
|
|
|
|
|
WHILE (NumDone < (PageLength - 5)) AND (SNum1 >= 1) AND (SNum1 <= MNum) AND (NOT Abort) AND (NOT HangUp) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadHeader(MessageArray1[SNum1],MHeader);
|
|
|
|
|
TempStr := '<13>'+PadRightInt(SNum1,5);
|
|
|
|
|
IF (MHeader.From.Anon IN [1,2]) THEN
|
|
|
|
|
TempStr := TempStr + ' <13>[Unknown] '
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
PackToDate(DT,MHeader.Date);
|
|
|
|
|
j := DT.Hour;
|
|
|
|
|
IF (j > 12) THEN
|
|
|
|
|
Dec(j,12);
|
|
|
|
|
IF (j = 0) THEN
|
|
|
|
|
j := 12;
|
|
|
|
|
TempStr := TempStr + ' <13>'+ZeroPad(IntToStr(DT.Day))+
|
|
|
|
|
' '+Copy(MonthString[DT.Month],1,3)+
|
|
|
|
|
' '+IntToStr(DT.Year)+
|
|
|
|
|
' '+ZeroPad(IntToStr(j))+
|
|
|
|
|
':'+ZeroPad(IntToStr(DT.Min))+
|
|
|
|
|
AOnOff((DT.Hour >= 12),'p','a');
|
|
|
|
|
END;
|
|
|
|
|
TempStr := TempStr + ' <13>'+PadLeftStr(UseName(MHeader.From.Anon,MHeader.From.A1S),23);
|
|
|
|
|
IF (MHeader.FileAttached = 0) THEN
|
|
|
|
|
TempStr := TempStr + ' <13>'+Copy(MHeader.Subject,1,25)
|
|
|
|
|
ELSE
|
|
|
|
|
TempStr := TempStr + ' <13>'+StripName(Copy(MHeader.Subject,1,25));
|
|
|
|
|
PrintACR(TempStr);
|
|
|
|
|
WKey;
|
|
|
|
|
Inc(SNum1);
|
|
|
|
|
Inc(NumDone);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
BEGIN
|
|
|
|
|
ReadingMail := TRUE;
|
|
|
|
|
SaveReadMsgArea := ReadMsgArea;
|
|
|
|
|
InitMsgArea(-1);
|
|
|
|
|
ReScan(MNum,MessageArray);
|
|
|
|
|
IF (MNum = 0) THEN
|
|
|
|
|
lRGLngStr(52,FALSE) { Print(FString.NoMailWaiting); }
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
Abort := FALSE;
|
|
|
|
|
Next := FALSE;
|
|
|
|
|
SNum := 1;
|
|
|
|
|
Cmd := 'L';
|
|
|
|
|
REPEAT
|
|
|
|
|
|
|
|
|
|
REPEAT
|
|
|
|
|
IF (Cmd = 'L') THEN
|
|
|
|
|
ListYourEmail(SNum,MNum,MessageArray);
|
|
|
|
|
NL;
|
|
|
|
|
Prt('Select message (^51^4-^5'+IntToStr(MNum)+'^4) [^5?^4=^5First^4,^5<CR>^4=^5Next^4,^5Q^4=^5Quit^4)]: ');
|
|
|
|
|
MPL(Length(IntToStr(MNum)));
|
|
|
|
|
ScanInput(InputStr,'Q?'^M);
|
|
|
|
|
Cmd := InputStr[1];
|
|
|
|
|
IF (Cmd = 'Q') THEN
|
|
|
|
|
SNum := 0
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
IF (Cmd IN ['-',^M]) THEN
|
|
|
|
|
Cmd := 'L'
|
|
|
|
|
ELSE IF (Cmd = '?') THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
SNum := 1;
|
|
|
|
|
Cmd := 'L';
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
SNum := StrToInt(InputStr);
|
|
|
|
|
IF (SNum >= 1) AND (SNum <= MNum) THEN
|
|
|
|
|
Cmd := 'Q'
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^7The range must be from 1 to '+IntToStr(MNum)+'^1');
|
|
|
|
|
PauseScr(FALSE);
|
|
|
|
|
SNum := 1;
|
|
|
|
|
Cmd := 'L';
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
UNTIL (Cmd = 'Q') OR (HangUp);
|
|
|
|
|
|
|
|
|
|
IF (SNum >= 1) AND (SNum <= MNum) AND (NOT HangUp) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Cmd := #0;
|
|
|
|
|
REPEAT
|
|
|
|
|
LoadHeader(MessageArray[SNum],MHeader);
|
|
|
|
|
IF (Cmd <> '?') THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
CLS;
|
|
|
|
|
ReadMsg(MessageArray[SNum],SNum,MNum);
|
|
|
|
|
END;
|
|
|
|
|
{ Prt(FString.ReadingEmail); }
|
|
|
|
|
LOneK(lRGLngStr(13,TRUE),Cmd,'Q-ADFGLNRSUVXZM?'^M,TRUE,TRUE);
|
|
|
|
|
CASE Cmd OF
|
|
|
|
|
'-' : IF (SNum > 1) THEN
|
|
|
|
|
Dec(SNum)
|
|
|
|
|
ELSE
|
|
|
|
|
SNum := MNum;
|
|
|
|
|
'A' : ;
|
|
|
|
|
'D' : BEGIN
|
|
|
|
|
DeleteOk := TRUE;
|
|
|
|
|
IF (MHeader.FileAttached > 0) THEN
|
|
|
|
|
IF (CheckBatchDL(MHeader.Subject)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('If you delete this message, you will not be able to download');
|
|
|
|
|
Print('the attached file currently in your batch queue.');
|
|
|
|
|
NL;
|
|
|
|
|
IF NOT PYNQ('Continue with deletion? ',0,FALSE) THEN
|
|
|
|
|
DeleteOk := FALSE;
|
|
|
|
|
END;
|
|
|
|
|
IF (DeleteOk) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Include(MHeader.Status,MDeleted);
|
|
|
|
|
SaveHeader(MessageArray[SNum],MHeader);
|
|
|
|
|
IF (MHeader.FileAttached = 1) THEN
|
|
|
|
|
Kill(MHeader.Subject);
|
|
|
|
|
|
|
|
|
|
IF (NOT (NetMail IN Mheader.Status)) AND
|
|
|
|
|
(MHeader.From.UserNum >= 1) AND
|
|
|
|
|
(MHeader.From.UserNum >= (MaxUsers - 1)) THEN
|
|
|
|
|
SendShortMessage(MHeader.From.UserNum,Caps(ThisUser.Name)+' read "'+StripName(MHeader.Subject)+
|
|
|
|
|
'" on '+DateStr+' '+TimeStr+'.');
|
|
|
|
|
RemoveCurrent(SNum,MNum,MessageArray);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
'F' : ForwardMessage(MessageArray[SNum]);
|
|
|
|
|
'G' : InputByteWOC('%LFGoto message',SNum,[NumbersOnly],1,MNum);
|
|
|
|
|
'M' : IF (NOT MsgSysOp) THEN
|
|
|
|
|
Print('%LF^7You do not have the required access level for this option!^1%LF%PA')
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
MoveMsg(MessageArray[SNum]);
|
|
|
|
|
LoadHeader(MessageArray[SNum],MHeader);
|
|
|
|
|
IF (MDeleted IN MHeader.Status) THEN
|
|
|
|
|
RemoveCurrent(SNum,MNum,MessageArray);
|
|
|
|
|
END;
|
|
|
|
|
'R' : BEGIN
|
|
|
|
|
ReplyOk := TRUE;
|
|
|
|
|
IF (MHeader.From.Anon IN [1,2]) THEN
|
|
|
|
|
CASE MHeader.From.Anon OF
|
|
|
|
|
1 : ReplyOk := AACS(General.AnonPrivRead);
|
|
|
|
|
2 : ReplyOk := AACS(General.CSOP);
|
|
|
|
|
END;
|
|
|
|
|
IF (NOT ReplyOk) THEN
|
|
|
|
|
Print('%LF^7You can not reply to an anonymous message!^1%LF%PA')
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
DumpQuote(MHeader);
|
|
|
|
|
AutoReply(MHeader);
|
|
|
|
|
DeleteOk := TRUE;
|
|
|
|
|
NL;
|
|
|
|
|
IF (NOT PYNQ('Delete original message? ',0,TRUE)) THEN
|
|
|
|
|
DeleteOk := FALSE;
|
|
|
|
|
IF (DeleteOk) AND (MHeader.FileAttached > 0) THEN
|
|
|
|
|
IF (CheckBatchDL(MHeader.Subject)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('If you delete this message, you will not be able to download the attached');
|
|
|
|
|
Print('file currently in your batch queue.');
|
|
|
|
|
NL;
|
|
|
|
|
IF NOT PYNQ('Continue with deletion? ',0,FALSE) THEN
|
|
|
|
|
DeleteOk := FALSE;
|
|
|
|
|
END;
|
|
|
|
|
IF (DeleteOk) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Include(MHeader.Status,MDeleted);
|
|
|
|
|
IF (MHeader.FileAttached = 1) THEN
|
|
|
|
|
Kill(MHeader.Subject);
|
|
|
|
|
SaveHeader(MessageArray[SNum],MHeader);
|
|
|
|
|
RemoveCurrent(SNum,MNum,MessageArray);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
'S' : IF (NOT CoSysOp) THEN
|
|
|
|
|
Print('%LF^7You do not have the required access level for this option!^1%LF%PA')
|
|
|
|
|
ELSE IF (LastAuthor < 1) OR (LastAuthor > (MaxUsers - 1)) THEN
|
|
|
|
|
Print('%LF^7The sender of this message does not have an account on this BBS!^1%LF%PA')
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,LastAuthor);
|
|
|
|
|
ShowUserInfo(1,LastAuthor,User);
|
|
|
|
|
NL;
|
|
|
|
|
PauseScr(FALSE);
|
|
|
|
|
END;
|
|
|
|
|
'U' : IF (NOT CoSysOp) THEN
|
|
|
|
|
Print('%LF^7You do not have the required access level for this option!^1%LF%PA')
|
|
|
|
|
ELSE IF (LastAuthor < 1) OR (LastAuthor > (MaxUsers - 1)) THEN
|
|
|
|
|
Print('%LF^7The sender of this message does not have an account on this BBS!^1%LF%PA')
|
|
|
|
|
ELSE IF (CheckPW) THEN
|
|
|
|
|
UserEditor(LastAuthor);
|
|
|
|
|
'V' : IF (NOT CoSysOp) THEN
|
|
|
|
|
Print('%LF^7You do not have the required access level for this option!^1%LF%PA')
|
|
|
|
|
ELSE IF (LastAuthor < 1) OR (LastAuthor > (MaxUsers - 1)) THEN
|
|
|
|
|
Print('%LF^7The sender of this message does not have an account on this BBS!^1%LF%PA')
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadURec(User,LastAuthor);
|
|
|
|
|
AutoVal(User,LastAuthor);
|
|
|
|
|
END;
|
|
|
|
|
'X' : IF (NOT CoSysOp) THEN
|
|
|
|
|
Print('%LF^7You do not have the required access level for this option!^1%LF%PA')
|
|
|
|
|
ELSE
|
|
|
|
|
ExtractMsgToFile(MessageArray[SNum],MHeader);
|
|
|
|
|
'Z' : IF (NOT MsgSysOp) THEN
|
|
|
|
|
Print('%LF^7You do not have the required access level for this option!^1%LF%PA')
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
DeleteOk := TRUE;
|
|
|
|
|
IF (MHeader.FileAttached > 0) THEN
|
|
|
|
|
IF CheckBatchDL(MHeader.Subject) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('If you zap this message, you will not be able to download the attached');
|
|
|
|
|
Print('file currently in your batch queue.');
|
|
|
|
|
NL;
|
|
|
|
|
IF NOT PYNQ('Continue with zapping? ',0,FALSE) THEN
|
|
|
|
|
DeleteOk := FALSE;
|
|
|
|
|
END;
|
|
|
|
|
IF (DeleteOk) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Include(MHeader.Status,MDeleted);
|
|
|
|
|
SaveHeader(MessageArray[SNum],MHeader);
|
|
|
|
|
IF (MHeader.FileAttached = 1) THEN
|
|
|
|
|
Kill(MHeader.Subject);
|
|
|
|
|
RemoveCurrent(SNum,MNum,MessageArray);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
'?' : BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
LCmds(17,3,'-Read previous','Again');
|
|
|
|
|
LCmds(17,3,'Delete message','Forward messages');
|
|
|
|
|
LCmds(17,3,'Goto message','List messages');
|
|
|
|
|
LCmds(17,3,'Move message','Next message');
|
|
|
|
|
LCmds(17,3,'Reply to message','Show user');
|
|
|
|
|
LCmds(17,3,'User editor','Validate user');
|
|
|
|
|
LCmds(17,3,'Xtract to file','Zap (Delete w/o reciept)');
|
|
|
|
|
LCmds(17,3,'Quit','');
|
|
|
|
|
END;
|
|
|
|
|
ELSE
|
|
|
|
|
IF (SNum < MNum) THEN
|
|
|
|
|
Inc(SNum)
|
|
|
|
|
ELSE
|
|
|
|
|
SNum := 1;
|
|
|
|
|
END;
|
|
|
|
|
IF (MNum = 0) THEN
|
|
|
|
|
Cmd := 'Q';
|
|
|
|
|
UNTIL (Cmd IN ['L','Q']) OR (HangUp);
|
|
|
|
|
END;
|
|
|
|
|
IF (Cmd = 'Q') THEN
|
|
|
|
|
IF (RMsg IN ThisUser.Flags) AND (NOT CoSysOp) AND (MNum > 0) AND (NOT InWFCMenu) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
{ Print(FString.SorryReply); }
|
|
|
|
|
lRGLngStr(53,FALSE);
|
|
|
|
|
SNum := 1;
|
|
|
|
|
Cmd := 'L';
|
|
|
|
|
END;
|
|
|
|
|
UNTIL (Cmd = 'Q') OR (HangUp);
|
|
|
|
|
END;
|
|
|
|
|
Inc(ThisUser.Waiting,MNum);
|
|
|
|
|
SaveURec(ThisUser,UserNum);
|
|
|
|
|
LoadMsgArea(SaveReadMsgArea);
|
|
|
|
|
ReadingMail := FALSE;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
PROCEDURE ShowEmail;
|
|
|
|
|
VAR
|
|
|
|
|
User: UserRecordType;
|
|
|
|
|
MHeader: MHeaderRec;
|
|
|
|
|
Cmd: Char;
|
|
|
|
|
SaveReadMsgArea: Integer;
|
|
|
|
|
MsgNum,
|
|
|
|
|
PreviousMsgNum,
|
|
|
|
|
MaxMsgs: Word;
|
|
|
|
|
AnyFound: Boolean;
|
|
|
|
|
BEGIN
|
|
|
|
|
ReadingMail := TRUE;
|
|
|
|
|
SaveReadMsgArea := ReadMsgArea;
|
|
|
|
|
InitMsgArea(-1);
|
|
|
|
|
Abort := FALSE;
|
|
|
|
|
Next := FALSE;
|
|
|
|
|
AnyFound := FALSE;
|
|
|
|
|
Cmd := #0;
|
|
|
|
|
MaxMsgs := HiMsg;
|
|
|
|
|
MsgNum := 1;
|
|
|
|
|
WHILE ((MsgNum <= MaxMsgs) AND (Cmd <> 'Q') AND (NOT HangUp)) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadHeader(MsgNum,MHeader);
|
|
|
|
|
IF (MHeader.From.UserNum <> UserNum) THEN
|
|
|
|
|
Inc(MsgNum)
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
AnyFound := TRUE;
|
|
|
|
|
IF (Cmd <> '?') THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
CLS;
|
|
|
|
|
ReadMsg(MsgNum,MsgNum,MaxMsgs);
|
|
|
|
|
END;
|
|
|
|
|
NL;
|
|
|
|
|
Prt('Private messages sent [^5?^4=^5Help^4]: ');
|
|
|
|
|
IF (CoSysOp) THEN
|
|
|
|
|
OneK(Cmd,'Q-ADENX?'^M,TRUE,TRUE)
|
|
|
|
|
ELSE
|
|
|
|
|
OneK(Cmd,'Q-ADEN?'^M,TRUE,TRUE);
|
|
|
|
|
CASE Cmd OF
|
|
|
|
|
'-' : BEGIN
|
|
|
|
|
PreviousMsgNum := (MsgNum - 1);
|
|
|
|
|
WHILE (PreviousMsgNum >= 1) AND (PreviousMsgNum <> MsgNum) DO
|
|
|
|
|
BEGIN
|
|
|
|
|
LoadHeader(PreviousMsgNum,MHeader);
|
|
|
|
|
IF (MHeader.From.UserNum <> UserNum) THEN
|
|
|
|
|
Dec(PreviousMsgNum)
|
|
|
|
|
ELSE
|
|
|
|
|
MsgNum := PreviousMsgNum;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
'A' : ;
|
|
|
|
|
'D' : IF (NOT (MDeleted IN MHeader.Status)) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
Include(MHeader.Status,MDeleted);
|
|
|
|
|
SaveHeader(MsgNum,MHeader);
|
|
|
|
|
LoadURec(User,MHeader.MTO.UserNum);
|
|
|
|
|
IF (User.Waiting > 0) THEN
|
|
|
|
|
Dec(User.Waiting);
|
|
|
|
|
SaveURec(User,MHeader.MTO.UserNum);
|
|
|
|
|
Print('%LFPrivate message deleted.');
|
|
|
|
|
SysOpLog('* Deleted private message to '+Caps(MHeader.From.A1S));
|
|
|
|
|
END
|
|
|
|
|
ELSE
|
|
|
|
|
BEGIN
|
|
|
|
|
Exclude(MHeader.Status,MDeleted);
|
|
|
|
|
SaveHeader(MsgNum,MHeader);
|
|
|
|
|
LoadURec(User,MHeader.MTO.UserNum);
|
|
|
|
|
IF (User.Waiting < 255) THEN
|
|
|
|
|
Inc(User.Waiting);
|
|
|
|
|
SaveURec(User,MHeader.MTO.UserNum);
|
|
|
|
|
Print('%LFPrivate message undeleted.');
|
|
|
|
|
SysOpLog('* Undeleted private message to '+Caps(MHeader.From.A1S));
|
|
|
|
|
END;
|
|
|
|
|
'E' : EditMessageText(MsgNum);
|
|
|
|
|
'X' : IF (NOT CoSysOp) THEN
|
|
|
|
|
Print('%LF^7You do not have the required access level for this option!^1%LF%PA')
|
|
|
|
|
ELSE
|
|
|
|
|
ExtractMsgToFile(MsgNum,MHeader);
|
|
|
|
|
'?' : BEGIN
|
|
|
|
|
Print('%LF<^3CR^1>Next message');
|
|
|
|
|
LCmds(20,3,'Again','Edit message');
|
|
|
|
|
LCmds(20,3,'Delete message','-Previous message');
|
|
|
|
|
IF (CoSysOp) THEN
|
|
|
|
|
LCmds(20,3,'Xtract to file','Quit')
|
|
|
|
|
ELSE
|
|
|
|
|
LCmds(20,3,'Quit','');
|
|
|
|
|
END;
|
|
|
|
|
ELSE
|
|
|
|
|
Inc(MsgNum);
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
END;
|
|
|
|
|
IF (NOT AnyFound) THEN
|
|
|
|
|
BEGIN
|
|
|
|
|
NL;
|
|
|
|
|
Print('^3No private messages sent.');
|
|
|
|
|
END;
|
|
|
|
|
LoadMsgArea(SaveReadMsgArea);
|
|
|
|
|
ReadingMail := FALSE;
|
|
|
|
|
END;
|
|
|
|
|
|
|
|
|
|
END.
|