{$IFDEF WIN32} {$I DEFINES.INC} {$ENDIF} {$A+,B-,D+,E-,F+,I-,L+,N-,O-,R-,S+,V-} UNIT Menus; INTERFACE USES Common, MyIO; PROCEDURE AutoExecCmd(AutoCmd: AStr); PROCEDURE MenuExec; PROCEDURE LoadMenuPW; PROCEDURE MainMenuHandle(VAR Cmd: AStr); PROCEDURE FCmd(CONST Cmd: AStr; VAR CmdToExec: Byte; VAR CmdExists,CmdNotHid: Boolean); PROCEDURE DoMenuExec(Cmd: AStr; VAR NewMenuCmd: AStr); PROCEDURE DoMenuCommand(VAR Done: Boolean; Cmd, MenuOption: AStr; VAR NewMenuCmd: AStr; NodeActivityDesc: AStr); IMPLEMENTATION USES Arcview, Archive1, Archive2, Archive3, Automsg, BBSList, Boot, Bulletin, CUser, Doors, Email, Events, File0, File1, File2, File3, File5, File6, File7, File8, File9, File10, File11, File12, File13, File14, Mail0, Mail1, Mail2, Mail3, Mail4, Menus2, Menus3, MiscUser, MsgPack, Multnode, OffLine, Script, Stats, LineChat, Sysop1, Sysop2, SysOp2G, Sysop3, Sysop4, SysOp5, Sysop6, Sysop7, Sysop8, Sysop9, Sysop10, Sysop11, SysOp12, TimeBank, TimeFunc, Vote, OneLiner; (* I := 1; Newmenucmd := ''; while ((I <= Noc) and (Newmenucmd = '') ) do begin if (Menucommand^[I].Ckeys = 'FIRSTCMD') then begin if (Aacs(Menucommand^[I].Acs)) then begin Newmenucmd := 'FIRSTCMD'; Domenuexec(Cmd,Newmenucmd); end; end; inc(I); end; *) PROCEDURE AutoExecCmd(AutoCmd: AStr); VAR NewMenuCmd: AStr; Counter: Byte; Done: Boolean; BEGIN NewMenuCmd := ''; Done := FALSE; Counter := 1; WHILE (Counter <= NumCmds) AND (NewMenuCmd = '') AND (NOT Done) AND (NOT HangUp) DO BEGIN IF (MemCmd^[Counter].Ckeys = AutoCmd) then IF (AACS(MemCmd^[Counter].ACS)) THEN BEGIN NewMenuCmd := AutoCmd; DoMenuCommand(Done, MemCmd^[Counter].CmdKeys, MemCmd^[Counter].Options, NewMenuCmd, MemCmd^[Counter].NodeActivityDesc); END; Inc(Counter); END; END; PROCEDURE MenuExec; VAR Cmd, NewMenuCmd: AStr; Done: Boolean; BEGIN MainMenuHandle(Cmd); IF ((Copy(Cmd,1,2) = '\\') AND (SysOp)) THEN BEGIN DoMenuCommand(Done,Copy(Cmd,1,2),Copy(Cmd,3,Length(Cmd) - 2),NewMenuCmd,'Activating SysOp Cmd'); IF (NewMenuCmd <> '') THEN Cmd := NewMenuCmd ELSE Cmd := ''; END; NewMenuCmd := ''; REPEAT DoMenuExec(Cmd,NewMenuCmd) UNTIL (NewMenuCmd = '') OR (HangUp); END; PROCEDURE CheckHelpLevel; BEGIN IF (MemMenu.ForceHelpLevel <> 0) THEN CurHelpLevel := MemMenu.ForceHelpLevel ELSE IF (Novice IN ThisUser.Flags) OR (OkRIP) THEN CurHelpLevel := 2 ELSE CurHelpLevel := 1; END; PROCEDURE LoadMenuPW; VAR s: Str20; NACC: Boolean; BEGIN LoadMenu; NACC := FALSE; IF (NOT AACS(MemMenu.ACS)) OR (MemMenu.Password <> '') THEN BEGIN NACC := TRUE; IF (MemMenu.Password <> '') THEN BEGIN NL; Prt('Password: '); GetPassword(s,20); IF (s = MemMenu.Password) THEN NACC := FALSE; END; IF (NACC) THEN BEGIN PrintF('NOACCESS'); IF (NoFile) THEN BEGIN NL; Print('Access denied.'); PauseScr(FALSE); END; CurMenu := FallBackMenu; LoadMenu; END; END; IF (NOT NACC) THEN CheckHelpLevel; END; PROCEDURE CheckForceLevel; BEGIN IF (CurHelpLevel < MemMenu.ForceHelpLevel) THEN CurHelpLevel := MemMenu.ForceHelpLevel; END; PROCEDURE GetCmd(VAR Cmd: AStr); VAR S1, SS, SaveSS, SHas0, SHas1: AStr; C: Char; CmdToExec, Counter, SaveCurrentColor: Byte; Key: Word; GotCmd, Has0, Has1, Has2: Boolean; BEGIN Cmd := ''; IF (Buf <> '') THEN IF (Buf[1] = '`') THEN BEGIN Buf := Copy(Buf,2,(Length(Buf) - 1)); Counter := Pos('`',Buf); IF (Counter <> 0) THEN BEGIN Cmd := AllCaps(Copy(Buf,1,(Counter - 1))); Buf := Copy(Buf,(Counter + 1),(Length(Buf) - Counter)); NL; Exit; END; END; SHas0 := '?'; SHas1 := ''; Has0 := FALSE; Has1 := FALSE; Has2 := FALSE; FOR CmdToExec := 1 TO NumCmds DO IF ((CmdToExec <= (NumCmds - GlobalCmds)) OR NOT (NoGlobalUsed IN MemMenu.MenuFlags)) THEN IF (AACS(MemCmd^[CmdToExec].ACS)) THEN IF (MemCmd^[CmdToExec].CKeys[0] = #1) THEN BEGIN Has0 := TRUE; SHas0 := SHas0 + MemCmd^[CmdToExec].CKeys; END ELSE IF ((MemCmd^[CmdToExec].CKeys[1] = '/') AND (MemCmd^[CmdToExec].CKeys[0] = #2)) THEN BEGIN Has1 := TRUE; SHas1 := SHas1 + MemCmd^[CmdToExec].CKeys[2]; END ELSE Has2 := TRUE; SaveCurrentColor := CurrentColor; GotCmd := FALSE; SS := ''; IF (Trapping) THEN Flush(TrapFile); IF (NOT (HotKey IN ThisUser.Flags)) OR (ForceLine IN MemMenu.MenuFlags) THEN InputMain(Cmd,60,[UpperOnly,NoLineFeed]) ELSE BEGIN REPEAT Key := GetKey; IF (Key = F_UP) OR (Key = F_DOWN) OR (Key = F_LEFT) OR (Key = F_RIGHT) THEN BEGIN CASE Key OF F_UP : IF (Pos(#255,MenuKeys) > 0) THEN BEGIN Cmd := 'UP_ARROW'; GotCmd := TRUE; Exit; END; F_DOWN : IF (Pos(#254,MenuKeys) > 0) THEN BEGIN Cmd := 'DOWN_ARROW'; GotCmd := TRUE; Exit; END; F_LEFT : IF (Pos(#253,MenuKeys) > 0) THEN BEGIN Cmd := 'LEFT_ARROW'; GotCmd := TRUE; Exit; END; F_RIGHT : IF (Pos(#252,MenuKeys) > 0) THEN BEGIN Cmd := 'RIGHT_ARROW'; GotCmd := TRUE; Exit; END; END; END; C := UpCase(Char(Key)); SaveSS := SS; IF (SS = '') THEN BEGIN IF (C = #13) THEN GotCmd := TRUE; IF ((C = '/') AND ((Has1) OR (Has2) OR (SysOp))) THEN SS := '/'; IF (((FQArea) OR (RQArea) OR (MQArea) OR (VQArea)) AND (C IN ['0'..'9'])) THEN BEGIN SS := C; IF (RQArea) AND (HiMsg <= 9) THEN GotCmd := TRUE ELSE IF (FQArea) AND (NumFileAreas <= 9) THEN GotCmd := TRUE ELSE IF (MQArea) AND (NumMsgAreas <= 9) THEN GotCmd := TRUE ELSE IF (VQArea) AND (GetTopics <= 9) THEN GotCmd := TRUE; END ELSE IF (Pos(C,SHas0) <> 0) THEN BEGIN GotCmd := TRUE; SS := C; END; END ELSE IF (SS = '/') THEN BEGIN IF (C = ^H) THEN SS := ''; IF ((C = '/') AND ((Has2) OR (SysOp))) THEN SS := SS + '/'; IF ((Pos(C,SHas1) <> 0) AND (Has1)) THEN BEGIN GotCmd := TRUE; SS := SS + C; END; END ELSE IF (Copy(SS,1,2) = '//') THEN BEGIN IF (C = #13) THEN GotCmd := TRUE ELSE IF (C = ^H) THEN Dec(SS[0]) ELSE IF (C = ^X) THEN BEGIN FOR Counter := 1 TO (Length(SS) - 2) DO BackSpace; SS := '//'; SaveSS := SS; END ELSE IF ((Length(SS) < 62) AND (C >= #32) AND (C <= #127)) THEN SS := SS + C; END ELSE IF ((Length(SS) >= 1) AND (SS[1] IN ['0'..'9']) AND ((FQArea) OR (RQArea) OR (MQArea) OR (VQArea))) THEN BEGIN IF (C = ^H) THEN Dec(SS[0]); IF (C = #13) THEN GotCmd := TRUE; IF (C IN ['0'..'9']) THEN BEGIN SS := SS + C; IF (VQArea) AND (Length(SS) = Length(IntToStr(GetTopics))) THEN GotCmd := TRUE ELSE IF (RQArea) AND (Length(SS) = Length(IntToStr(HiMsg))) THEN GotCmd := TRUE ELSE IF (MQArea) AND (Length(SS) = Length(IntToStr(NumMsgAreas))) THEN GotCmd := TRUE ELSE IF (FQArea) AND (Length(SS) = Length(IntToStr(NumFileAreas))) THEN GotCmd := TRUE; END; END; IF ((Length(SS) = 1) AND (Length(SaveSS) = 2)) THEN SetC(SaveCurrentColor); IF (SaveSS <> SS) AND (NOT (NoMenuPrompt IN MemMenu.MenuFlags)) THEN BEGIN IF (Length(SS) > Length(SaveSS)) THEN Prompt(SS[Length(SS)]); IF (Length(SS) < Length(SaveSS)) THEN BackSpace; END; IF ((NOT (SS[1] IN ['0'..'9'])) AND ((Length(SS) = 2) AND (Length(SaveSS) = 1))) THEN UserColor(6); UNTIL ((GotCmd) OR (HangUp)); CursorOn(TRUE); UserColor(1); IF (Copy(SS,1,2) = '//') THEN SS := Copy(SS,3,(Length(SS) - 2)); Cmd := SS; END; (* Test *) IF (CurMenu <> General.FileListingMenu) THEN NL; IF (Pos(';',Cmd) <> 0) THEN IF (Copy(Cmd,1,2) <> '\\') THEN BEGIN IF (HotKey IN ThisUser.Flags) THEN BEGIN S1 := Copy(Cmd,2,(Length(Cmd) - 1)); IF (Copy(S1,1,1) = '/') THEN Cmd := Copy(S1,1,2) ELSE Cmd := S1[1]; S1 := Copy(S1,(Length(Cmd) + 1),(Length(S1) - Length(Cmd))); END ELSE BEGIN S1 := Copy(Cmd,(Pos(';',Cmd) + 1),(Length(Cmd) - Pos(';',Cmd))); Cmd := Copy(Cmd,1,(Pos(';',Cmd) - 1)); END; WHILE (Pos(';',S1) <> 0) DO S1[Pos(';',S1)] := ^M; Buf := S1; END; END; PROCEDURE MainMenuHandle(VAR Cmd: AStr); VAR NewArea: Integer; BEGIN TLeft; CheckForceLevel; IF ((ForcePause IN MemMenu.MenuFlags) AND (CurHelpLevel > 1) AND (LastCommandGood)) THEN PauseScr(FALSE); LastCommandGood := FALSE; MenuAborted := FALSE; Abort := FALSE; ShowThisMenu; AutoExecCmd('EVERYTIME'); IF (General.MultiNode) THEN Check_Status; IF ((NOT (NoMenuPrompt IN MemMenu.MenuFlags)) AND (NOT MenuAborted)) AND NOT (OKAnsi AND (NoGenericAnsi IN MemMenu.MenuFlags) AND NOT (OkAvatar OR OKRIP)) AND NOT (OkAvatar AND (NoGenericAvatar IN MemMenu.MenuFlags) AND NOT OkRIP) AND NOT (OkRIP AND (NoGenericRIP IN MemMenu.MenuFlags)) THEN BEGIN IF (CurMenu <> General.FileListingMenu) THEN NL; IF (AutoTime IN MemMenu.MenuFlags) THEN Print('^3[Time Left:'+CTim(NSL)+']'); Prompt(MemMenu.MenuPrompt); END; TempPause := (Pause IN ThisUser.Flags); GetCmd(Cmd); IF (Cmd = '') AND (Pos(#13,MenuKeys) > 0) THEN Cmd := 'ENTER'; IF (Cmd = '?') THEN BEGIN Cmd := ''; Inc(CurHelpLevel); IF (CurHelpLevel > 3) THEN CurHelpLevel := 3; END ELSE CheckHelpLevel; CheckForceLevel; IF (FQArea) OR (MQArea) OR (VQArea) OR (RQArea) THEN BEGIN NewArea := StrToInt(Cmd); IF ((NewArea <> 0) OR (Cmd[1] = '0')) THEN BEGIN IF (FQArea) AND (NewArea >= 1) AND (NewArea <= NumFileAreas) THEN ChangeFileArea(CompFileArea(NewArea,1)) ELSE IF (MQArea) AND (NewArea >= 1) AND (NewArea <= NumMsgAreas) THEN ChangeMsgArea(CompMsgArea(NewArea,1)) ELSE IF (VQArea) AND (NewArea >= 1) AND (NewArea <= NumVotes) THEN VoteOne(NewArea) ELSE IF (RQArea) AND (NewArea >= 1) AND (NewArea <= HiMsg) THEN IF NOT (MAForceRead IN MemMsgArea.MAFlags) OR (NewArea <= Msg_On) THEN BEGIN Msg_On := (NewArea - 1); TReadPrompt := 18; END ELSE Print('You must read all of the messages in this area.'); Cmd := ''; END; END; END; PROCEDURE FCmd(CONST Cmd: AStr; VAR CmdToExec: Byte; VAR CmdExists,CmdNotHid: Boolean); VAR Done: Boolean; BEGIN Done := FALSE; REPEAT Inc(CmdToExec); IF (CmdToExec <= NumCmds) AND (Cmd = MemCmd^[CmdToExec].CKeys) THEN BEGIN CmdExists := TRUE; IF (OkSecurity(CmdToExec,CmdNotHid)) THEN Done := TRUE; END; IF ((CmdToExec > (NumCmds - GlobalCmds)) AND (NoGlobalUsed IN MemMenu.MenuFlags)) THEN BEGIN CmdToExec := 0; CmdExists := FALSE; Done := TRUE; END; UNTIL (CmdToExec > NumCmds) OR (Done) OR (HangUp); IF (CmdToExec > NumCmds) THEN CmdToExec := 0; END; PROCEDURE DoMenuExec(Cmd: AStr; VAR NewMenuCmd: AStr); VAR CmdToExec: Byte; CmdACS, CmdNotHid, CmdExists, Done: Boolean; BEGIN IF (NewMenuCmd <> '') THEN BEGIN Cmd := NewMenuCmd; NewMenuCmd := ''; END; CmdACS := FALSE; CmdExists := FALSE; CmdNotHid := FALSE; Done := FALSE; CmdToExec := 0; REPEAT FCmd(Cmd,CmdToExec,CmdExists,CmdNotHid); IF (CmdToExec <> 0) THEN BEGIN CmdACS := TRUE; DoMenuCommand(Done, MemCmd^[CmdToExec].CmdKeys, MemCmd^[CmdToExec].Options, NewMenuCmd, MemCmd^[CmdToExec].NodeActivityDesc); END; UNTIL ((CmdToExec = 0) OR (Done) OR (HangUp)); IF (NOT Done) AND (Cmd <> '') THEN IF ((NOT CmdACS) AND (Cmd <> '')) THEN BEGIN NL; IF ((CmdNotHid) AND (CmdExists)) THEN Print('Insufficient clearence for this command.') ELSE Print('Invalid command.'); END; END; PROCEDURE DoMenuCommand(VAR Done: Boolean; Cmd, MenuOption: AStr; VAR NewMenuCmd: AStr; NodeActivityDesc: AStr); VAR MHeader: MHeaderRec; TempStr: AStr; SaveMenu: Byte; NoCmd: Boolean; BEGIN NewMenuToLoad := FALSE; NewMenuCmd := ''; NoCmd := FALSE; Abort := FALSE; LastCommandOvr := FALSE; IF ((Cmd[1] + Cmd[2]) <> 'NW') THEN Update_Node(NodeActivityDesc,TRUE); CASE Cmd[1] OF '$' : CASE Cmd[2] OF 'D' : Deposit; 'W' : Withdraw; '+' : Inc(ThisUser.lCredit,StrToInt(MenuOption)); '-' : Inc(ThisUser.Debit,StrToInt(MenuOption)); ELSE NoCmd := TRUE; END; '/' : CASE Cmd[2] OF 'F': BEGIN MCIAllowed := FALSE; PrintF(MCI(MenuOption)); MCIAllowed := TRUE; END; ELSE NoCmd := TRUE; END; '-' : CASE Cmd[2] OF 'C' : lStatus_Screen(100,MenuOption,FALSE,MenuOption); 'F' : PrintF(MCI(MenuOption)); 'L' : Prompt(MenuOption); 'Q' : ReadQ(General.MiscPath+MenuOption); 'R' : ReadASW1(MenuOption); 'S' : SysOpLog(MCI(MenuOption)); ';' : BEGIN TempStr := MenuOption; WHILE (Pos(';',TempStr) > 0) DO TempStr[Pos(';',TempStr)] := ^M; Buf := TempStr; END; '$' : IF (SemiCmd(MenuOption,1) <> '') THEN BEGIN IF (SemiCmd(MenuOption,2) = '') THEN Prt(': ') ELSE Prt(SemiCmd(MenuOption,2)); GetPassword(TempStr,20); IF (TempStr <> SemiCmd(MenuOption,1)) THEN BEGIN Done := TRUE; IF (SemiCmd(MenuOption,3) <> '') THEN Print(SemiCmd(MenuOption,3)); END; END; 'Y' : IF (SemiCmd(MenuOption,1) <> '') AND NOT (PYNQ(SemiCmd(MenuOption,1),0,FALSE)) THEN BEGIN Done := TRUE; IF (SemiCmd(MenuOption,2) <> '') THEN Print(SemiCmd(MenuOption,2)); END; 'N' : IF (SemiCmd(MenuOption,1) <> '') AND (PYNQ(SemiCmd(MenuOption,1),0,FALSE)) THEN BEGIN Done := TRUE; IF (SemiCmd(MenuOption,2) <> '') THEN Print(SemiCmd(MenuOption,2)); END; '^','/','\' : DoChangeMenu(Done,NewMenuCmd,Cmd[2],MenuOption); ELSE NoCmd := TRUE; END; '1' : CASE Cmd[2] OF 'L' : DoOneLiners; END; 'A' : CASE Cmd[2] OF 'A','C','M','T' : DoArcCommand(Cmd[2]); 'E' : ExtractToTemp; 'G' : UserArchive; 'R' : ReZipStuff; ELSE NoCmd := TRUE; END; 'B' : CASE Cmd[2] OF '?' : BatchDLULInfo; 'C' : IF (UpCase(MenuOption[1]) = 'U') THEN ClearBatchULQueue ELSE ClearBatchDLQueue; 'D' : BatchDownload; 'L' : IF (UpCase(MenuOption[1]) = 'U') THEN ListBatchULFiles ELSE ListBatchDLFiles; 'R' : IF (UpCase(MenuOption[1]) = 'U') THEN RemoveBatchULFiles ELSE RemoveBatchDLFiles; 'U' : BatchUpload(FALSE,0); ELSE NoCmd := TRUE; END; 'D' : CASE Cmd[2] OF 'P','C','D','G','S','W','-','3' : DoDoorFunc(Cmd[2],MenuOption); ELSE NoCmd := TRUE; END; 'F' : CASE Cmd[2] OF 'A' : FileAreaChange(Done,MenuOption); 'B' : DownloadFile(MenuOption,[lIsAddDLBatch]); 'C' : CheckFilesBBS; 'D' : DownloadFile(MenuOption,[]); 'F' : SearchFileDescriptions; 'L' : ListFileSpec(MenuOption); 'N' : NewFilesScanSearchType(MenuOption); 'P' : SetFileAreaNewScanDate; 'S' : SearchFileSpec; 'U' : UploadFile; 'V' : ViewDirInternalArchive; 'Z' : ToggleFileAreaScanFlags; '@' : CreateTempDir; '#' : BEGIN NL; Print('Enter the number of a file area to change to.'); IF (Novice IN ThisUser.Flags) THEN PauseScr(FALSE); END; ELSE NoCmd := TRUE; END; 'H' : CASE Cmd[2] OF 'C' : IF PYNQ(MenuOption,0,FALSE) THEN BEGIN CLS; PrintF('LOGOFF'); HangUp := TRUE; HungUp := FALSE; END; 'I' : HangUp := TRUE; 'M' : BEGIN NL; Print(MenuOption); HangUp := TRUE; END; ELSE NoCmd := TRUE; END; 'L' : CASE Cmd[2] OF '1' : TFilePrompt := 1; '2' : TFilePrompt := 2; '3' : TFilePrompt := 3; '4' : TFilePrompt := 4; '5' : TFilePrompt := 5; '6' : TFilePrompt := 6; '7' : TFilePrompt := 7; '8' : TFilePrompt := 8; ELSE NoCmd := TRUE; END; 'M' : CASE Cmd[2] OF 'A' : MessageAreaChange(Done,MenuOption); 'E' : SSMail(MenuOption); 'K' : ShowEMail; 'L' : SMail(TRUE); 'M' : ReadMail; 'N' : StartNewScan(MenuOption); 'P' : IF (ReadMsgArea = -1) THEN BEGIN NL; Print('^7This option is not available when reading private messages!^1'); END ELSE BEGIN IF (MAPrivate IN MemMsgArea.MAFlags) THEN BEGIN NL; Post(-1,MHeader.From,PYNQ('Is this to be a private message? ',0,FALSE)) END ELSE Post(-1,MHeader.From,FALSE); END; 'R' : ReadAllMessages(MenuOption); 'S' : BEGIN Abort := FALSE; Next := FALSE; ScanMessages(MsgArea,FALSE,MenuOption); END; 'U' : BEGIN LoadMsgArea(MsgArea); UList(MemMsgArea.ACS); END; 'Y' : ScanYours; 'Z' : ToggleMsgAreaScanFlags; '#' : BEGIN NL; Print('Enter the number of a message area to change to.'); IF (Novice IN ThisUser.Flags) THEN PauseScr(FALSE); END; ELSE NoCmd := TRUE; END; 'N' : CASE Cmd[2] OF 'A' : ToggleChatAvailability; 'D' : Dump_Node; 'O' : BEGIN LListNodes; IF (Novice IN ThisUser.Flags) THEN PauseScr(FALSE); END; 'P' : Page_User; 'G' : MultiLine_Chat; 'S' : LSend_Message(MenuOption); 'T' : IF AACS(General.Invisible) THEN BEGIN IsInvisible := NOT IsInvisible; LoadNode(ThisNode); IF (IsInvisible) THEN Include(NodeR.Status,NInvisible) ELSE Exclude(NodeR.Status,NInvisible); SaveNode(ThisNode); NL; Print('Invisible mode is now '+ShowOnOff(IsInvisible)); END; (* Consider deleting this cmd *) 'W' : BEGIN LoadNode(ThisNode); NodeR.ActivityDesc := MenuOption; SaveNode(ThisNode); END; ELSE NoCmd := TRUE; END; 'O' : CASE Cmd[2] OF '1','2' : TShuttleLogon := Ord(Cmd[2]) - 48; 'A' : AutoValidationCmd(MenuOption); 'B' : GetUserStats(MenuOption); 'C' : RequestSysOpChat(MenuOption); 'F' : ChangeARFlags(MenuOption); 'G' : ChangeACFlags(MenuOption); 'L' : BEGIN IF (Pos(';',MenuOption) > 0) THEN BEGIN MenuOption := Copy(MenuOption,Pos(';',MenuOption) + 1,(Length(MenuOption)) - (Pos(';',MenuOption))); TempStr := Copy(MenuOption,1,(Pos(';',MenuOption) - 1)); END ELSE TempStr := '0'; TodaysCallers(StrToInt(TempStr),MenuOption); END; 'P' : CStuff(StrToInt(MenuOption),2,ThisUser); 'R' : ChangeConference(MenuOption); 'S' : Bulletins(MenuOption); 'U' : UList(MenuOption); ELSE NoCmd := TRUE; END; 'Q' : CASE Cmd[2] OF 'Q' : RGQuote(MenuOption); ELSE NoCmd := TRUE; END; 'R' : CASE Cmd[2] OF '#' : BEGIN NL; Print('Enter the number of a message to read it.'); END; 'A' : TReadPrompt := 1; '-' : IF (Msg_On > 1) THEN TReadPrompt := 2 ELSE BEGIN NL; Print('You are already at the first message.'); END; 'M' : TReadPrompt := 3; 'X' : TReadPrompt := 4; 'E' : TReadPrompt := 5; 'R' : TReadPrompt := 6; 'I' : IF (NOT (MAForceRead IN MemMsgArea.MAFlags)) OR (CoSysOp) THEN TReadPrompt := 7 ELSE Print('You must read all of the messages in this area.'); 'B' : TReadPrompt := 8; 'F' : TReadPrompt := 9; 'C' : TReadPrompt := 10; 'D' : TReadPrompt := 11; 'H' : TReadPrompt := 12; 'G' : IF (NOT (MAForceRead IN MemMsgArea.MAFlags)) OR (CoSysOp) THEN TReadPrompt := 13 ELSE Print('^7You must read all of the messages in this area!^1'); 'Q' : IF (NOT (MAForceRead IN MemMsgArea.MAFlags)) OR (CoSysOp) THEN TReadPrompt := 14 ELSE Print('^7You must read all of the messages in this area!^1'); 'L' : TReadPrompt := 15; 'U' : TReadPrompt := 16; 'T' : TReadPrompt := 17; 'N' : TReadPrompt := 18; 'S' : TReadPrompt := 19; 'V' : TReadPrompt := 20; 'J' : TReadPrompt := 21; ELSE NoCmd := TRUE; END; 'U' : CASE Cmd[2] OF 'A' : ReplyAutoMsg; 'R' : ReadAutoMsg; 'W' : WriteAutoMsg; ELSE NoCmd := TRUE; END; 'V' : CASE Cmd[2] OF '#' : BEGIN NL; Print('Enter the number of the topic to vote on.'); IF (Novice IN ThisUser.Flags) THEN PauseScr(FALSE); END; 'A' : AddTopic; 'L' : ListTopics(TRUE); 'R' : Results(FALSE); 'T' : TrackUser; 'U' : Results(TRUE); 'V' : VoteAll; ELSE NoCmd := TRUE; END; 'T' : CASE Cmd[2] OF 'A' : BBSList_Add; 'E' : BBSList_Edit; 'D' : BBSList_Delete; 'V' : BBSList_View; 'X' : BBSList_xView; ELSE NoCmd := TRUE; END; '!' : CASE Cmd[2] OF 'P' : SetMessageAreaNewScanDate; 'D' : DownloadPacket; 'U' : UploadPacket(FALSE); ELSE NoCmd := TRUE; END; '*' : CASE Cmd[2] OF '=' : ShowCmds(MenuOption); 'B' : IF (CheckPW) THEN BEGIN SysOpLog('* Message Area Editor'); MessageAreaEditor; END; 'C' : IF (CheckPW) THEN ChangeUser; 'D' : IF (CheckPW) THEN BEGIN SysOpLog('* Entered Dos Emulator'); MiniDOS; END; 'E' : IF (CheckPW) THEN BEGIN SysOpLog('* Event Editor'); EventEditor; END; 'F' : IF (CheckPW) THEN BEGIN SysOpLog('* File Area Editor'); FileAreaEditor; END; 'V' : IF (CheckPW) THEN BEGIN SysOpLog('* Vote Editor'); VotingEditor; END; 'L' : IF (CheckPW) THEN ShowLogs; 'N' : TEdit1; 'P' : IF (CheckPW) THEN BEGIN SysOpLog('* System Configuration Editor'); SystemConfigurationEditor; END; 'R' : IF (CheckPW) THEN BEGIN SysOpLog('* Conference Editor'); ConferenceEditor; END; 'T' : IF (CheckPW) THEN BEGIN mem[Seg0040:$0017] := mem[Seg0040:$0017] XOR 16; IF (SysOpAvailable) THEN BEGIN SysOpLog('* Turned on chat availablity'); END ELSE BEGIN SysOpLog('* Turned off chat availablity'); END; END; 'U' : IF (CheckPW) THEN BEGIN SysOpLog('* User Editor'); UserEditor(UserNum); END; 'X' : IF (CheckPW) THEN BEGIN SysOpLog('* Protocol Editor'); ProtocolEditor; END; 'Z' : BEGIN SysOpLog('* History Editor'); HistoryEditor; END; '1' : BEGIN SysOpLog('* Edited Files'); EditFiles; END; '2' : BEGIN SysOpLog('* Sorted Files'); Sort; END; '3' : IF (CheckPW) THEN BEGIN SysOpLog('* Read Private Messages'); ReadAllMessages(''); END; '4' : IF (MenuOption = '') THEN Do_Unlisted_Download ELSE UnlistedDownload(MenuOption); '5' : BEGIN SysOpLog('* Rechecked files'); ReCheck; END; '6' : IF (CheckPW) THEN UploadAll; '7' : ValidateFiles; '8' : AddGIFSpecs; '9' : PackMessageAreas; '#' : IF (CheckPW) THEN BEGIN SysOpLog('* Menu Editor'); SaveMenu := CurMenu; MenuEditor; CurMenu := SaveMenu; LoadMenu; END; '$' : DirF(TRUE); '%' : DirF(FALSE); ELSE NoCmd := TRUE; END; ELSE NoCmd := TRUE; END; LastCommandGood := NOT NoCmd; IF (LastCommandOvr) THEN LastCommandGood := FALSE; IF (NoCmd) THEN IF (CoSysOp) THEN BEGIN TempStr := 'Invalid command keys: '+Cmd[1]+Cmd[2]+' '+Cmd; NL; Print(TempStr); SysOpLog(TempStr); END; IF ((Cmd[1] + Cmd[2]) <> 'NW') THEN Update_Node('',FALSE); IF (NewMenuToLoad) THEN BEGIN LoadMenuPW; LastCommandGood := FALSE; IF (NewMenuCmd = '') THEN AutoExecCmd('FIRSTCMD'); END; END; END.