FEEDBACK.PAS

10.3 KB a8d32332aa9fb0c6…
{$I DIRECT.INC}
Unit FeedBack;

Interface

Uses GenTypes;

Const CurFeedBack : Integer = 0;
Var FBack : MailRec;

Procedure ReadFNum(N : Word);
Procedure WriteCurFeedBack;
Procedure DelFeedBack;
Procedure EditFeedBackUser;
Procedure FeedBackInfoForm;
Procedure NextFeedBack;
Procedure ReadAgain;
Procedure ReplyFeedBack;
Procedure ListFeedBack;
Procedure QuickFeedBackRead (newonly : boolean);
Function NumFeedback : Word;
Procedure AddFeedback (Var M : MailRec);

Implementation

Uses GenSubs, ConfigRT, Subs1, TextRet, Subs2, SubsOvr, StatRet,
     UserRet, MainR2, MyComman, OverRet1, FileLock;

Var FFile : File of MailRec;

Procedure AddFeedback (Var M : MailRec);
Begin
  Assign (FFile, cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile, SizeOf(MailRec));
  Seek (FFile, FileSize(FFile));
  NWrite (FFile, M);
  Close (FFile);
  Inc(Status.NewFeedback);
End;

Function NumFeedback : Word;
Begin
  Assign(FFile,cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile,SizeOf(MailRec));
  NumFeedBack := FileSize(FFile);
  Close(FFile);
End;

Function CheckCur : Boolean;
Begin
  If (CurFeedBack < 1) Or (CurFeedBack > FileSize(FFile)) Then
  Begin
    SendCr(^M'Feedback out of range!');
    CurFeedBack := 0;
    CheckCur := True;
  End
  Else
  Begin
    CheckCur := False;
    Seek(FFile,CurFeedBack - 1);
    NRead(FFile, FBack)
  End;
End;

Procedure ReadFNum(N : Word);
Begin
  Assign(FFile,cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile,SizeOf(MailRec));
  CurFeedBack := N;
  Inpt := '';
  If CheckCur Then
  Begin
    Close(FFile);
    Exit;
  End;
  Sr.C[1] := '|#'; Sr.S[1] := Strr(CurFeedback);     Sr.T[1] := 2;
  Sr.C[2] := '|T'; Sr.S[2] := FBack.Title;           Sr.T[2] := 30;
  Sr.C[3] := '|D'; Sr.S[3] := DateStr(fback.When);   Sr.T[3] := 9;
  Sr.C[4] := '|W'; Sr.S[4] := TimeStr(fback.When);   Sr.T[4] := 8;
  Sr.C[5] := '|S'; Sr.S[5] := FBack.SentBy;          Sr.T[5] := 30;
  Sr.C[6] := '|N'; Sr.S[6] := YesNo(FBack.Read);     Sr.T[6] := 3;
  Sr.C[7] := '|A'; Sr.S[7] := Strr(FileSize(FFile)); Sr.T[7] := 2;
  DataFile(cfg.TextFileDir + 'FBHDR.ANS');
  If Break Then
  Begin
    Close(FFile);
    Exit;
  End;
  PrintText ('FEEDBACK.TXT','FEEDBACK.MAP',FBack.Line);
  If FBack.Return Then
  Begin
    FBack.Return := False;
    Notice(FBack.SentBy,'Your feedback "'+fback.Title+'" was read...');
    Seek(FFile,CurFeedback-1);
    NWrite(FFile,FBack);
  End;
  Close(FFile);
End;

Procedure WriteCurFeedBack;
Begin
  Assign(FFile,cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile,SizeOf(MailRec));
  If (CurFeedBack < 1) Or (CurFeedBack > FileSize(FFile))
    Then CurFeedBack := 0;
  SendFull(^B^M^R'Current msg: '^S);
  If CurFeedBack = 0 Then SendFull('None')
  Else
  Begin
    Seek(FFile,CurFeedBack - 1);
    NRead(FFile,FBack);
    SendFull(FBack.Title+' by '+FBack.Sentby)
  End;
  Close(FFile);
end;

Procedure DelFeedBack;
Begin
  Assign(FFile,cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile,SizeOf(MailRec));
  If CheckCur Then Exit;
  DeleteText ('FEEDBACK.TXT','FEEDBACK.MAP',FBack.Line);
  DeleteRecs(FFile, CurFeedBack - 1, 1);
  If CurFeedBack >= FileSize(FFile) Then Dec(CurFeedBack);
  Close(FFile);
End;

Procedure EditFeedBackUser;
Var N : Word;
Begin
  Assign(FFile,cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile,SizeOf(MailRec));
  If Checkcur Then
  Begin
    Close(FFile);
    Exit;
  End;
  N := LookUpUser(FBack.SentBy);
  If N = 0 Then SendCr('User disappeared!') Else EditUser(N);
  Close(FFile);
End;

Procedure FeedBackInfoForm;
Var X : Byte;
Begin
  Assign(FFile,cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile,SizeOf(MailRec));
  If CheckCur Then
  Begin
    Close(FFile);
    Exit;
  End;
  Close(FFile);
  WriteStr(^R'Show which infoform? '^O'['^P'1 - 5'^O']:*');
  X := Valu(Inpt);
  If (X > 0) And (X < 6) Then ShowInfoForms(FBack.Sentby,X)
End;

Procedure NextFeedBack;
Begin
  Assign (FFile, cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile, SizeOf(MailRec));
  Inc(CurFeedBack);
  If CurFeedBack > FileSize(FFile) Then
  Begin
    SendCr(^M^R'That was the last feedback.');
    CurFeedBack := 0;
    Exit;
    Close(FFile);
  End;
  Close(FFile);
  ReadFNum(CurFeedBack)
End;

Procedure ReadAgain;
Begin
  Assign (FFile, cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile, SizeOf(MailRec));
  If CheckCur Then
  Begin
    Close(FFile);
    Exit;
  End;
  Close(FFile);
  ReadFNum(CurFeedBack)
End;

Procedure ReplyFeedBack;
Begin
  Assign (FFile, cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile, SizeOf(MailRec));
  If CheckCur Then
  Begin
    Close(FFile);
    Exit;
  End;
  Close(FFile);
  Quoting.AllowQuote := True;
  Quoting.MsgNum := FBack.Line;
  Quoting.MsgSec := False;
  Quoting.Anon := FBack.Anon;
  Quoting.From := FBack.SentBy;
  Quoting.SendTo:= 'Management';
  Quoting.Title:= FBack.Title;
  Quoting.When := FBack.When;
  Quoting.TxtFile := 'FEEDBACK.TXT';
  Quoting.MailFile := 'FEEDBACK.MAP';
  SendMailTo (FBack.SentBy,FBack.Title,False,True);
  Quoting.AllowQuote := False
End;

Procedure ListFeedBack;
Var Cnt : Word;
Begin
  Assign (FFile, cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile, SizeOf(MailRec));
  Cnt := 0;
  If FileSize(FFile) = 0 Then
  Begin
    Close(FFile);
    Exit;
  End;
  ThereAre (FileSize(FFile),'piece of feedback','pieces of feedback');
  Header('#   Title                          Author ');
  While Not EOF(FFile) Do
  Begin
    Inc(Cnt);
    NRead (FFile,FBack);
    SendFull(^S);
    Tab (Strr(Cnt),4);
    SendFull(^A);
    Tab (FBack.Title,31);
    SendFull(^R);
    SendCr(FBack.SentBy);
    If Break Then
    Begin
      Close(FFile);
      Exit;
    End;
  End;
  Close(FFile);
End;

Procedure Write_To_File;
Begin
  If Not IsSysop Then Exit;
  SendCr(^S^R^M);
  With FBack Do
    TextToFile('FEEDBACK.TXT','FEEDBACK.MAP',Line,Title,SentBy,LookUpUName(SentTo));
End;

Procedure QuickFeedBackRead (NewOnly : Boolean);
Const Names : Array[1..9] Of String[7] =
      (' Next ',' Kill ',' Reply ',' Again ',' Jump ',
       ' List ',' Edit ',' Form ',' Quit ');

      Return : Array[1..9] Of Char = ('N','K','R','A','J','L','E','F','Q');

Var X : Byte;

  Procedure GetInput;

    Procedure PlaceBar(Hi:Boolean);
    Const Cols : Array[1..9] Of Byte = (2,8,14,21,28,34,40,46,52);
    Begin
      If Hi
        Then Ansicolor(Urec.Color7)
        Else Ansicolor(Urec.Color3);
      SendStr(#13#27 + '[' + Strr(Cols[X] - 1) + 'C' + Names[X]);
    End;

  Var K : Char;
      Done : Boolean;
  Begin
    If Not BARS_OK Then
    Begin
      SendFull(^R'('^S'Feedback'^R') ');
      WriteStr(^S'K'^P'ill '^S'N'^P'ext '^S'R'^P'eply '^S'A'^P'gain '+
      ^S+'J'^P'ump '^S'L'^P'ist '^S'E'^P'dit '^S'F'^P'orm '^S'Q'^P'uit : *');
      Exit;
    End;
    Done := False;
    NoBreak:=True;
    ClearChain;
    Inpt[0]:=#0;
    SendFull(^B^O+cfg.BarChar[1]+' '^P'Next  Kill  Reply  Again  Jump  List  Edit  Form  Quit '^O+cfg.BarChar[2]);
    If NewOnly
      Then SendFull(^R' ('^S'New Feedback'^R')')
      Else SendFull(^R' ('^S'All Feedback'^R')');
    PlaceBar(True);
    Repeat
      K := Upcase(ArrowKey(True));
      Case K Of
        ^A,
        ^D,
        '8',
        '4' : Begin
                Nobreak:=True;
                PlaceBar(False);
                Dec(x);
                If X < 1 Then X := 9;
                PlaceBar(True);
                NoBreak := False;
              End;
        #32,
        ^B,
        ^C,
        '6',
        '2' : Begin
                NoBreak:=True;
                PlaceBar(False);
                Inc(x);
                If X > 9 Then X := 1;
                PlaceBar(True);
                NoBreak:=False;
              End;
        'K',
        'N',
        'R',
        'A',
        'J',
        'L',
        'E',
        'F',
        'Q',
        '+'  : Begin
                 Done:=True;
                 Inpt := K;
               End;
        #13  : Begin
                 Inpt := Return[X];
                 Done := True;
               End;
      End;
    Until (HungUpOn) Or (Done);
    SendCr(^S);
  End;

Var Done : Boolean;
    TotalRead : Byte;
    B : Byte;
Begin
  Assign (FFile, cfg.DATADIR + 'FEEDBACK');
  ResetOrRewrite(FFile, SizeOf(MailRec));
  CurFeedback := 0;
  Done := False;
  TotalRead := 0;
  Repeat
    Inc(CurFeedBack);
    SendCr('');
    If CurFeedback > FileSize(FFile) Then
    Begin
      CurFeedback := 0;
      If (NewOnly) And (TotalRead < 1)
        Then SendCr(^M^S + 'No new feedback found!');
      Close(FFile);
      Exit;
    End;
    If Not CheckCur Then
      If (NewOnly = False) Or ( (NewOnly) And (FBack.Read = False) ) Then
      Begin
        Inc(TotalRead);
        X := 1;
        Close(FFile);
        ReadFNum (CurFeedback);
        ResetOrReWrite(FFile, SizeOf(MailRec));
        Repeat
          GetInput;
          If Inpt = '' Then Inpt := 'N';
          Close(FFile);
          Case Upcase(Inpt[1]) Of
            'R' : ReplyFeedback;
            'A' : ReadfNum(CurFeedback);
            'K' : Begin
                    SendCr(^S^R);
                    DelFeedback;
                    Dec(CurFeedback);
                    Inpt := 'N';
                  End;
            'J' : Begin
                    ResetOrReWrite(FFile, SizeOf(MailRec));
                    SendCr(^R^S);
                    SendFull(^R'Mail # to Jump to ');
                    WriteStr('('^A'1-'+Strr(FileSize(FFile))+^R') : *');
                    B := Valu(Inpt);
                    If (B > 0) And (B <= FileSize(FFile))
                      Then CurFeedBack := B - 1;
                    Inpt := 'N';
                  End;
            'L' : ListFeedback;
            'E' : EditFeedbackUser;
            'F' : FeedbackInfoForm;
            '+' : Write_To_File;
            'Q' : Done := True;
          End;
          ResetOrReWrite(FFile, SizeOf(MailRec));
          If FileSize(FFile) = 0 Then
          Begin
            Close(FFile);
            Exit;
          End;
        Until (Match(Inpt,'N')) Or (Done) Or HungUpon;
        If Done Then
        Begin
          Close(FFile);
          Exit;
        End;
      End;
  Until HungUpon;
  Close(FFile);
End;

End.