mysticbbs/mystic/bbs_sysopchat.pas

315 lines
9.9 KiB
ObjectPascal

Unit bbs_SysOpChat;
// ====================================================================
// Mystic BBS Software Copyright 1997-2013 By James Coyle
// ====================================================================
//
// This file is part of Mystic BBS.
//
// Mystic BBS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Mystic BBS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Mystic BBS. If not, see <http://www.gnu.org/licenses/>.
//
// ====================================================================
{$I M_OPS.PAS}
Interface
Procedure OpenChat (Split : Boolean);
Implementation
Uses
m_Types,
m_Strings,
m_DateTime,
bbs_Common,
bbs_DataBase,
bbs_Core,
bbs_User;
Var
tFile : Text;
Procedure Split_Chat;
Var
Update : LongInt = 0;
LastUser : Boolean;
UserStr : String;
SysopStr : String;
Temp1,
Temp2 : String;
Ch : Char;
UserX,
UserY : Byte;
SysopX,
SysopY : Byte;
X, Y, A : Byte;
Procedure Total_ReDraw;
Begin
Session.io.PromptInfo[1] := Session.User.ThisUser.Handle;
Session.io.PromptInfo[2] := bbsCfg.SysopName;
Session.io.ScreenInfo[9].X := 0;
Session.io.ScreenInfo[0].X := 0;
Session.io.OutFile ('ansichat', True, 0);
UserStr := '';
UserX := Session.io.ScreenInfo[3].X;
UserY := Session.io.ScreenInfo[1].Y;
SysopX := Session.io.ScreenInfo[7].X;
SysopY := Session.io.ScreenInfo[5].Y;
SysopStr := '';
Session.io.AnsiGotoXY (SysopX, SysopY);
Session.io.AnsiColor (Session.io.ScreenInfo[5].A);
LastUser := False;
End;
Begin
Total_ReDraw;
Repeat
If Update <> TimerMinutes Then Begin
X := Console.CursorX;
Y := Console.CursorY;
A := Console.TextAttr;
If Session.io.ScreenInfo[9].X <> 0 Then Begin
Session.io.AnsiGotoXY (Session.io.ScreenInfo[9].X, Session.io.ScreenInfo[9].Y);
Session.io.AnsiColor (Session.io.ScreenInfo[9].A);
Session.io.OutFull ('|$L04|TL');
End;
If Session.io.ScreenInfo[0].X <> 0 Then Begin
Session.io.AnsiGotoXY (Session.io.ScreenInfo[0].X, Session.io.ScreenInfo[0].Y);
Session.io.AnsiColor (Session.io.ScreenInfo[0].A);
Session.io.OutFull ('|TI');
End;
Session.io.AnsiGotoXY (X, Y);
Session.io.AnsiColor (A);
Update := TimerMinutes;
End;
Ch := Session.io.GetKey;
If Not Session.io.LocalInput and Not LastUser Then Begin
Session.io.AnsiGotoXY (UserX, UserY);
Session.io.AnsiColor (Session.io.ScreenInfo[1].A);
LastUser := True;
End Else
If Session.io.LocalInput and LastUser Then Begin
Session.io.AnsiGotoXY (SysopX, SysopY);
Session.io.AnsiColor (Session.io.ScreenInfo[5].A);
LastUser := False;
End;
Case Ch of
#00 : If Session.io.LocalInput Then ProcessSysopCommand(Keyboard.ReadKey);
^R : If Session.io.LocalInput Then Total_ReDraw;
#08 : If Session.io.LocalInput Then Begin
If SysopX > Session.io.ScreenInfo[7].X Then Begin
Session.io.OutBS (1, True);
Dec (SysopX);
Dec (SysopStr[0]);
End;
End Else Begin
If UserX > Session.io.ScreenInfo[3].X Then Begin
Session.io.OutBS (1, True);
Dec (UserX);
Dec (UserStr[0]);
End;
End;
#10 : ;
#13 : If Session.io.LocalInput Then Begin
sysopx := Session.io.ScreenInfo[7].x;
if sysopy = Session.io.ScreenInfo[6].y then begin
for sysopy := Session.io.ScreenInfo[6].y downto Session.io.ScreenInfo[5].y do begin
Session.io.AnsiGotoXY(Session.io.ScreenInfo[7].x, sysopy);
Session.io.OutRaw (strRep(' ', Session.io.ScreenInfo[8].x - Session.io.ScreenInfo[7].x + 1));
Session.io.AnsiGotoXY(Session.io.ScreenInfo[7].x, sysopy);
end;
Session.io.OutRaw(sysopstr);
end;
If bbsCfg.ChatLogging Then WriteLn (tFile, 'S> ' + SysopSTR);
inc (sysopy);
sysopstr := '';
Session.io.AnsiGotoXY (sysopx, sysopy);
End Else Begin
userx := Session.io.ScreenInfo[3].x;
if usery = Session.io.ScreenInfo[2].y then begin
for usery := Session.io.ScreenInfo[2].y downto Session.io.ScreenInfo[1].y do begin
Session.io.AnsiGotoXY(userx, usery);
Session.io.OutRaw (strRep(' ', Session.io.ScreenInfo[4].x - Session.io.ScreenInfo[3].x + 1));
Session.io.AnsiGotoXY(userx, usery);
end;
Session.io.OutRaw(userstr);
end;
inc (usery);
If bbsCfg.ChatLogging Then WriteLn (tFile, 'U> ' + UserSTR);
userstr := '';
Session.io.AnsiGotoXY (userx, usery);
End;
#27 : If Session.io.LocalInput Then Break;
Else
If Session.io.LocalInput Then Begin
Session.io.BufAddChar (ch);
inc (sysopx);
sysopstr := sysopstr + ch;
if sysopx > Session.io.ScreenInfo[8].x then begin
strwrap (sysopstr, temp2, Session.io.ScreenInfo[8].x - session.io.screeninfo[7].x + 1);
temp1 := sysopstr;
If bbsCfg.ChatLogging Then WriteLn (tFile, 'S> ' + SysopSTR);
sysopstr := temp2;
Session.io.OutBS (length(temp2), True);
if sysopy=Session.io.ScreenInfo[6].y then begin
for sysopy := Session.io.ScreenInfo[6].y downto Session.io.ScreenInfo[5].y do begin
Session.io.AnsiGotoXY(Session.io.ScreenInfo[7].x, sysopy);
Session.io.OutRaw (strRep(' ', Session.io.ScreenInfo[8].x - Session.io.ScreenInfo[7].x + 1));
end;
Session.io.AnsiGotoXY(Session.io.ScreenInfo[7].x, sysopy);
Session.io.OutRaw(temp1);
end;
inc (sysopy);
Session.io.AnsiGotoXY(Session.io.ScreenInfo[7].x, sysopy);
Session.io.OutRaw (sysopstr);
sysopx := Console.CursorX;
end;
End Else Begin
Session.io.BufAddChar (ch);
inc (userx);
userstr := userstr + ch;
if userx > Session.io.ScreenInfo[4].x then begin
strwrap (userstr, temp2, Session.io.ScreenInfo[4].x - session.io.screeninfo[3].x + 1);
temp1 := userstr;
If bbsCfg.ChatLogging Then WriteLn (tFile, 'U> ' + UserSTR);
userstr := temp2;
Session.io.OutBS (length(temp2), True);
if usery=Session.io.ScreenInfo[2].y then begin
for usery := Session.io.ScreenInfo[2].y downto Session.io.ScreenInfo[1].y do begin
Session.io.AnsiGotoXY(Session.io.ScreenInfo[3].x, usery);
Session.io.OutRaw (strRep(' ', Session.io.ScreenInfo[4].x - Session.io.ScreenInfo[3].x + 1));
end;
Session.io.AnsiGotoXY(Session.io.ScreenInfo[3].x, usery);
Session.io.OutRawln(temp1);
end;
inc(usery);
Session.io.AnsiGotoXY (Session.io.ScreenInfo[3].x, usery);
Session.io.OutRaw(userstr);
userx := Console.CursorX;
end;
end;
End;
Until False;
Session.io.AnsiGotoXY (1, Session.User.ThisUser.ScreenSize);
Session.io.OutFull ('|16' + Session.GetPrompt(27));
End;
Procedure Line_Chat;
Var
Ch : Char;
Str1 : String[160];
Str2 : String[160];
Begin
Str1 := '';
Str2 := '';
Session.io.OutFullLn (Session.GetPrompt(26));
Repeat
Ch := Session.io.GetKey;
Case Ch of
#27 : If Session.io.LocalInput Then Break;
#13 : Begin
If bbsCfg.ChatLogging Then WriteLn (tFile, Str1);
Session.io.OutRawLn('');
Str1 := '';
End;
#8 : If Str1 <> '' Then Begin
Session.io.OutBS(1, True);
Dec(Str1[0]);
End;
Else
Str1 := Str1 + Ch;
Session.io.BufAddChar(Ch);
If Length(Str1) > 78 Then Begin
strWrap (Str1, Str2, 78);
Session.io.OutBS(Length(Str2), True);
Session.io.OutRawLn ('');
Session.io.OutRaw (Str2);
If bbsCfg.ChatLogging Then WriteLn (tFile, Str1);
Str1 := Str2;
End;
End;
Until False;
Session.io.OutFull (Session.GetPrompt(27));
End;
Procedure OpenChat (Split: Boolean);
Var
Image : TConsoleImageRec;
Begin
Session.User.InChat := True;
Console.GetScreenImage(1,1,79,24,Image);
UpdateStatusLine (0, '(ESC) to Quit, (Ctrl-R) to Redraw');
If bbsCfg.ChatLogging Then Begin
Assign (tFile, bbsCfg.LogsPath + 'chat.log');
{$I-} Append (tFile); {$I+}
If IoResult <> 0 Then ReWrite (tFile);
WriteLn (tFile, '');
WriteLn (tFile, 'Chat recorded ' + DateDos2Str(CurDateDos, 1) + ' ' + TimeDos2Str(CurDateDos, 1) +
' with ' + Session.User.ThisUser.Handle);
WriteLn (tFile, strRep('-', 70));
End;
If ((Split) And (Session.io.Graphics > 0)) Then Split_Chat Else Line_Chat;
If bbsCfg.ChatLogging Then Begin
WriteLn (tFile, strRep('-', 70));
Close (tFile);
End;
Session.User.InChat := False;
Session.TimeOut := TimerSeconds;
Session.io.RemoteRestore(Image);
UpdateStatusLine (Session.StatusPtr, '');
End;
End.