From 24d281ca88f75f2b5e191b5e7278cdf8c7891e03 Mon Sep 17 00:00:00 2001 From: mysticbbs Date: Mon, 13 Feb 2012 18:23:40 -0500 Subject: [PATCH] Initial import --- mystic/bbs_core.pas | 344 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 344 insertions(+) create mode 100644 mystic/bbs_core.pas diff --git a/mystic/bbs_core.pas b/mystic/bbs_core.pas new file mode 100644 index 0000000..5413728 --- /dev/null +++ b/mystic/bbs_core.pas @@ -0,0 +1,344 @@ +Unit BBS_Core; + +{$I M_OPS.PAS} + +Interface + +Uses + m_FileIO, + m_Strings, + m_DateTime, + m_Socket_Class, + BBS_Common, + BBS_IO, + BBS_MsgBase, + BBS_User, + BBS_FileBase, + BBS_Menus, + MPL_Execute; + +Type + TBBSCore = Class + User : TBBSUser; + Msgs : TMsgBase; + FileBase : TFileBase; + Menu : TMenuSystem; + IO : TBBSIO; + Client : TSocketClass; + EventFile : File of EventRec; + LangFile : File of LangRec; + CommHandle : LongInt; + ShutDown : Boolean; + TempPath : String; + Event : EventRec; + NextEvent : EventRec; + Lang : LangRec; + 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; + HistoryFile : File of HistoryRec; + HistoryEmails : Word; + HistoryPosts : Word; + HistoryDLs : Word; + HistoryDLKB : LongInt; + HistoryULs : Word; + HistoryULKB : LongInt; + PromptFile : File of PromptRec; + Prompt : PromptRec; + + Constructor Create; + Destructor Destroy; Override; + + Procedure UpdateHistory; + Procedure FindNextEvent; + Function GetPrompt (N : Word) : String; + Procedure SystemLog (Str: String); + Function MinutesUntilEvent (ExecTime: Integer): Integer; + Procedure SetTimeLeft (Mins: Integer); + Function ElapsedTime : Integer; + Function TimeLeft : Integer; + Function LoadThemeData (Str: String) : Boolean; + End; + +Var + Session : TBBSCore; + +Implementation + +Constructor TBBSCore.Create; +Begin + Inherited Create; + + HistoryEmails := 0; + HistoryPosts := 0; + HistoryDLs := 0; + HistoryDLKB := 0; + HistoryULs := 0; + HistoryULKB := 0; + ShutDown := False; + CommHandle := -1; + LocalMode := False; + Baud := -1; + ExitLevel := 0; + EventWarn := False; + EventExit := False; + EventRunAfter := False; + NodeNum := 1; + UserHostInfo := ''; + UserIPInfo := ''; + CheckTimeOut := True; + TimeOffset := 0; + TimeSaved := 0; + TimerOn := False; + TimeChecked := False; + ConfigMode := False; + InUserEdit := False; + + {$IFDEF WINDOWS} + Client := TSocketClass.Create; + Client.FTelnetServer := True; + {$ENDIF} + + User := TBBSUser.Create(Pointer(Self)); + IO := TBBSIO.Create(Pointer(Self)); + Msgs := TMsgBase.Create(Pointer(Self)); + FileBase := TFileBase.Create(Pointer(Self)); + Menu := TMenuSystem.Create(Pointer(Self)); +End; + +Destructor TBBSCore.Destroy; +Begin + Msgs.Free; + FileBase.Free; + Menu.Free; + User.Free; + IO.Free; + + Close (PromptFile); + + {$IFDEF WINDOWS} + Client.Free; + {$ENDIF} + + Inherited Destroy; +End; + +Procedure TBBSCore.UpdateHistory; +Var + History : HistoryRec; +Begin + Assign (HistoryFile, Config.DataPath + 'history.dat'); + ioReset (HistoryFile, SizeOf(HistoryRec), fmRWDW); + + If IoResult <> 0 Then ioReWrite(HistoryFile, SizeOf(HistoryRec), fmRWDW); + + History.Date := CurDateDos; + + While Not Eof(HistoryFile) Do Begin + ioRead (HistoryFile, History); + If DateDos2Str(History.Date, 1) = DateDos2Str(CurDateDos, 1) Then Begin + ioSeek (HistoryFile, FilePos(HistoryFile) - 1); + Break; + End; + End; + + If Eof(HistoryFile) Then Begin + FillChar(History, SizeOf(History), 0); + History.Date := CurDateDos; + End; + + Inc (History.Emails, HistoryEmails); + Inc (History.Posts, HistoryPosts); + Inc (History.Downloads, HistoryDLs); + Inc (History.Uploads, HistoryULs); + Inc (History.DownloadKB, HistoryDLKB); + Inc (History.UploadKB, HistoryULKB); + + If Not LocalMode Then Inc (History.Calls, 1); + If User.ThisUser.Calls = 1 Then Inc (History.NewUsers, 1); + + ioWrite (HistoryFile, History); + Close (HistoryFile); +End; + +Procedure TBBSCore.FindNextEvent; +Var + MinCheck : Integer; +Begin + NextEvent.Active := False; + + MinCheck := -1; + + Assign (EventFile, Config.DataPath + 'events.dat'); + ioReset (EventFile, SizeOf(EventRec), fmRWDN); + + If IoResult <> 0 Then ioReWrite (EventFile, SizeOf(EventRec), fmRWDN); + + While Not Eof(EventFile) Do Begin + ioRead (EventFile, Event); + + If MinCheck = -1 Then Begin + If Event.Active and ((Event.Node = 0) or (Event.Node = NodeNum)) Then begin + MinCheck := MinutesUntilEvent(Event.ExecTime); + NextEvent := Event; + End; + End Else + If (Event.Active) and ((Event.Node = 0) or (Event.Node = NodeNum)) and (MinutesUntilEvent(Event.ExecTime) < MinCheck) Then Begin + MinCheck := MinutesUntilEvent(Event.ExecTime); + NextEvent := Event; + End; + End; + + Close (EventFile); +End; + +Function TBBSCore.GetPrompt (N : Word) : String; +Begin + If N >= FileSize(PromptFile) Then Begin + io.OutFull ('|CR|12Error Reading Prompt #' + strI2S(N) + ': Inform SysOp|CR|CR|PA'); + SystemLog ('Error Reading Prompt ' + strI2S(N)); + Halt(1); + End; + + Seek (PromptFile, N); + Read (PromptFile, Prompt); + + If Prompt[1] = '@' Then Begin + io.OutFile (Copy(Prompt, 2, Length(Prompt)), True, 0); + Prompt := ''; + End Else + If Prompt[1] = '!' Then Begin + ExecuteMPL (NIL, Copy(Prompt, 2, Length(Prompt))); + Prompt := ''; + End; + + Result := Prompt; +End; + +Procedure TBBSCore.SystemLog (Str: String); +Var + tLOG : Text; +Begin + Assign (tLOG, Config.LogsPath + 'sysop.' + strI2S(NodeNum)); + {$I-} Append(tLOG); {$I+} + If IoResult <> 0 Then ReWrite (tLOG); + + If Str = '-' Then + WriteLn (tLOG, strRep('-', 50)) + Else + WriteLn (tLOG, DateDos2Str(CurDateDos, 1) + ' ' + TimeDos2Str(CurDateDos, False) + ' ' + Str); + + Close (tLOG); +End; + +Function TBBSCore.MinutesUntilEvent (ExecTime: Integer): Integer; +Begin {exits if 0 mins} + If ExecTime > TimerMinutes Then Result := ExecTime - TimerMinutes Else + If TimerMinutes > ExecTime Then Result := 1440 - TimerMinutes + ExecTime Else + If NextEvent.Active Then Begin + If DateDos2Str(NextEvent.LastRan, 1) = DateDos2Str(CurDateDos, 1) Then Begin + Result := 1440; {if it was already ran...} + Exit; + End; + If NextEvent.Forced Then Begin + EventExit := True; + {$IFDEF UNIX} + io.OutFullLn (GetPrompt(137)); + SystemLog ('User disconnected for system event'); + {$ELSE} + If Not LocalMode Then begin + io.OutFullLn (GetPrompt(137)); + SystemLog('User disconnected for system event'); + End; + {$ENDIF} + + SystemLog('Event: ' + NextEvent.Name); + + Halt (NextEvent.ErrLevel); + End Else + EventRunAfter := True; + End; +End; + +Procedure TBBSCore.SetTimeLeft (Mins: Integer); +Begin + TimerStart := TimerMinutes; + TimerEnd := TimerStart + Mins; + TimerOn := True; +End; + +Function TBBSCore.ElapsedTime : Integer; +Begin + If TimerStart > TimerMinutes Then Begin + Dec (TimerStart, 1440); + Dec (TimerEnd, 1440); + End; + + ElapsedTime := TimerMinutes - TimerStart; +End; + +Function TBBSCore.TimeLeft : Integer; +Begin + If Not TimerOn Then Begin + TimeLeft := 0; + Exit; + End; + + If TimerStart > TimerMinutes Then Begin + Dec (TimerStart, 1440); + Dec (TimerEnd, 1440); + + SetTimeLeft (User.Security.Time); + End; + + TimeLeft := TimerEnd - TimerMinutes; +End; + +Function TBBSCore.LoadThemeData (Str: String) : Boolean; +Begin + Result := False; + + Reset (LangFile); + + While Not Eof(LangFile) Do Begin + Read (LangFile, Lang); + {$IFDEF FS_SENSITIVE} + If Lang.FileName = Str Then Begin + {$ELSE} + If strUpper(Lang.FileName) = strUpper(Str) Then Begin + {$ENDIF} + If Not FileExist(Config.DataPath + Lang.FileName + '.lng') Then Break; + + {$I-} Close (PromptFile); {$I+} + + If IoResult <> 0 Then; + + Assign (PromptFile, Config.DataPath + Lang.FileName + '.lng'); + Reset (PromptFile); + + Result := True; + Break; + End; + End; + + Close (LangFile); +End; + +End.