STATRET.PAS

3.5 KB cba762469399a3c4…
{$I DIRECT.INC}
Unit StatRet;

Interface

Uses GenTypes, ConfigRt, GenSubs, Dos, FileLock;

Type
     Minutes = Record
       Started : Boolean;
       Start : Integer;
       Total : LongInt;
     End;

     StatRec = Record
       SysopAvail   : Byte;
       TotalCallers : LongInt;
       AutoMessage  : LongInt;
       TotalFiles   : LongInt;
       TotalMsgs    : LongInt;
       MinutesIdle  : Minutes;
       MinutesUsed  : Minutes;
       MinutesXfer  : Minutes;
       NumDaysUp    : Word;
       CallsToday   : Word;
       NewFeedback  : Word;
       NewDownloads : Word;
       NewUploads   : Word;
       NewCalls     : Word;
       NewPosts     : Word;
       NewMail      : Word;
       EventDone    : SStr;
       LastDayUp    : SStr;
       LastUser     : MStr;
       AMAuthor     : MStr;
     End;

     DailyLogRec = Record
       Day:Sstr;
       Calls,
       DLoads,
       ULoads,
       Posts,
       Feedback,
       NewUsers,
       MinsUsed:Integer;
     End;

VAR Status : StatRec;
    Log : DailyLogRec;

Function Timer : Integer;
Procedure StartTimer (Var M : Minutes);
Function ElapsedTime (Var M : Minutes) : Integer;
Procedure StopTimer (Var M : Minutes);
Procedure WriteStatus;
Procedure ReadStatus;
Procedure WriteDailyLog;
Procedure ReadDailyLog;

Implementation

Function Timer : Integer;
Var R : Registers;
Begin
  R.AX := $2C00;
  Intr ($21,R);
  Timer := (R.CX SHR 8) * 60 + (R.CX AND 255)
End;


Procedure StartTimer (Var M : Minutes);
Begin
  If M.Started Then Exit;
  M.Start := Timer;
  M.Started := True;
End;

Function ElapsedTime (Var M : Minutes) : Integer;
Var N : Integer;
Begin
  If Not M.Started Then Exit;
  N := Timer - M.Start;
  If N < 0 Then Inc(N, 1440);
  ElapsedTime := N;
End;

Procedure StopTimer (Var M : Minutes);
Begin
  If Not M.Started Then Exit;
  M.Start := ElapsedTime(M);
  Inc(M.Total, M.Start);
  M.Started := False;
End;

Procedure WriteStatus;
Var F : File of StatRec;
Begin
  Assign(F,cfg.DataDir + 'STATUS.DAT');
  ResetOrRewrite(F, SizeOf(StatRec));
  NWrite(F, Status);
  Close(F);
End;

Procedure ReadStatus;
Var F : File of StatRec;
Begin
  Assign(F,cfg.DataDir + 'STATUS.DAT');
  ResetOrRewrite(F, SizeOf(StatRec));
  If FileSize(F) = 0 Then
  Begin
    FillChar(Status, SizeOf(Status), 0);
    Status.AutoMessage := -1;
    Status.SysopAvail := 1;
    NWrite(F, Status);
    Close(F);
    Exit;
  End;
  NRead(F,Status);
  Close(F);
End;

Procedure WriteDailyLog;
Var DFile : File Of DailyLogRec;
Begin
  Assign(DFile,cfg.DataDir+'DAILYLOG.DAT');
  ResetOrRewrite(DFile, SizeOf(DailyLogRec));
  If FileSize(DFile) = 0 Then
  Begin
    FillChar(Log,SizeOf(Log),0);
    Log.Day := DateStr(Now);
    NWrite(DFile,Log);
    Close(DFile);
    Exit;
  End;
  If Log.Day<>DateStr(Now) Then
  Begin
    If FileSize(DFile) >= 30 Then DeleteRecs(DFile, 0, 1);
    FillChar(Log,SizeOf(Log),0);
    Log.Day := DateStr(Now);
    Seek(DFile,FileSize(DFile));
    NWrite(DFile,Log);
  End
  Else
  Begin
    Seek(DFile,FileSize(DFile)-1);
    NWrite(DFile,Log);
  End;
  Close(DFile);
End;

Procedure ReadDailyLog;
Var DFile : File Of DailyLogRec;
Begin
  Assign(DFile,cfg.DataDir+'DAILYLOG.DAT');
  ResetOrRewrite(DFile, SizeOf(DailyLogRec));
  If FileSize(DFile) = 0 Then
  Begin
    Close(DFile);
    WriteDailyLog;
    Exit;
  End;
  Seek(DFile,FileSize(DFile)-1);
  NRead(DFile,Log);
  Close(DFile);
  If Log.Day<>DateStr(Now) Then WriteDailyLog;
End;

End.