Var Plyr : UserRec
Var ChatLines : Array [1..CLBuffer] of String[160]
Var WinTL, WinTT, WinBL, WinBB : Byte
Var WinAttr : Byte
Var WinSize : Integer
Var PromptX : Byte
Var PromptY : Byte
Var PromptAttr : Byte
Var RoomX, RoomY: Byte
Var RoomAttr : Byte
Var TopicX, TopicY: Byte
Var TopicAttr : Byte
Var MyNamePrompt: String
Var MyChatRoom : Integer = 1
Var Loop : Integer = 1
Var SiteTag : String
Var UserTag : String
Var MyRoom : String = ''
Var MyTopic : String = ''
Var ServFile : MRCRec
Var BBSTempStub : String
Var ChatLog : String
Var PInUse : String
Var UserFile : String = JustPath(Progname)+'mrcusers.dat'
Var ChatSeed : Integer
Var TChars : Array [1..80] of Char
Var TAttrs : Array [1..80] of Byte
//Include chat.inc
Function ReadPlyr(I:Integer):Boolean
Var Ret : Boolean = False
Var Fptr : File
Begin
fAssign(Fptr,UserFile,66)
fReset(Fptr)
If IoResult = 0 Then Begin
fSeek(Fptr,(I-1)*SizeOf(Plyr))
If Not fEof(fptr) Then Begin
fReadRec(Fptr,Plyr)
Ret:=True
End
fClose(Fptr)
End
ReadPlyr:=Ret
End
Procedure SavePlyr(I:Integer)
Var Fptr : File
Begin
fAssign(Fptr,Userfile,66)
fReset(Fptr)
If IoResult = 0 Then
fSeek(Fptr,(I-1)*SizeOf(Plyr))
Else Begin
Plyr.RecIdx:=1
fReWrite(Fptr)
End
fWriteRec(Fptr,Plyr)
fClose(Fptr)
End
Function FindPlyr:Integer
Var X,Ret : Integer = 0
Var Done : Boolean = False
Var UN : String
Begin
X:=1
UN:=Upper(StripMCI(Replace(UserAlias,' ','_')))
While ReadPlyr(X) And Not Done Do Begin
If StripMCI(Upper(Plyr.Name)) = UN Then Begin
Done:=True
Ret:=X
End
X:=X+1
End
FindPlyr:=Ret
End
Procedure NewPlyr
Var I : Integer
Begin
I:=0
While ReadPlyr(I+1) Do I:=I+1
Plyr.RecIdx:=I+1
Plyr.PermIdx:=UserIndex
Plyr.EnterChatMe :='|07- |10You have entered chat'
Plyr.EnterChatRoom :='|07- |02%1 |14has arrived!'
Plyr.LeaveChatMe :='|07- |12You have left chat.'
Plyr.LeaveChatRoom :='|07- |12%1 |04has left chat.'
Plyr.EnterRoomMe :='|07- |10You are now in |02%3'
Plyr.LeaveRoomRoom :='|07- |02%1 |10has left the room.'
Plyr.LeaveRoomMe :='|07- |10You have left room |02%3'
Plyr.EnterRoomRoom :='|07- |02%1 |10has entered the room.'
Plyr.Defaultroom :='lobby'
Plyr.NameColor :='|10'
Plyr.LtBracket :='|02<'
Plyr.RtBracket :='|02>'
Plyr.UseClock :=True
Plyr.ClockFormat :=False
Plyr.Name:=StripMCI(Replace(UserAlias,' ','_'))
SavePlyr(Plyr.RecIdx)
End
Procedure CleanOutTempDir
Begin
FindFirst(CfgTempPath+'*.mrc',66)
While DosError = 0 Do Begin
If FileExist(CfgTempPath+DirName) Then
FileErase(CfgTempPath+DirName)
End
FindClose
If FileExist(PInUse) Then
fileErase(PInUse)
If FileExist(ChatLog) Then
fileErase(ChatLog)
End
Function AmIFirst:Boolean
Var D,X : Integer
Var Ret : Boolean = False
Var S : String
Begin
D:=0
For X:=1 To CfgTnNodes Do Begin
S:=BBSTempStub+Int2Str(X)+PathChar+'tchat.inuse'
If FileExist(S) And D=0 Then Begin
D:=X
End
End
If D = NodeNum Then Ret:=True
AmIFirst:=Ret
End
Procedure UpdateScreen
Var X : Integer
Begin
WriteXY(RoomX,RoomY,RoomAttr,PadRt('#'+MyRoom,30,' '))
WriteXY(TopicX,TopicY,TopicAttr,PadRt(MyTopic,40,' '))
End
Procedure ShowChat(Top:Integer)
Var C,T,L,Y,X : Integer
Var G,V,W : String = ''
Var N2D : Boolean = True
Begin
Y:=CLBuffer-WinSize-Top
For X:=1 To WinSize+1 Do Begin
GoToXy(1,WinTT+X-1)
Write(ChatLines[Y]+'|16|07|$X80 ')
Y:=Y+1
End
End
Function ParseChat(S:String) : MrcREc
Var MR : MrcRec
Begin
MR.FromUser:=WordGet(1,S,'~')
MR.FromSite:=WordGet(2,S,'~')
//MR.FromRoom:=Str2Int(WordGet(3,S,'~'))
MR.FromRoom:=WordGet(3,S,'~')
MR.ToUser:=WordGet(4,S,'~')
MR.ToSite:=WordGet(5,S,'~')
//MR.ToRoom:=Str2Int(WordGet(6,S,'~'))
MR.ToRoom:=WordGet(6,S,'~')
MR.Message:=WordGet(7,S,'~')
ParseChat:=MR
End
Procedure RedrawScreen
Begin
DispFile('mrcmain')
UpdateScreen
ShowChat(0)
End
Procedure Add2Chat(S:String)
Var E,W,L,B,A,X : Integer
Var DS,S1,S2,S3 : String=''
Begin
If Plyr.UseClock Then Begin
DS:=TimeStr(DateTime,Plyr.ClockFormat)
If Not Plyr.ClockFormat Then
Delete(DS,6,3)
S:='|07'+DS+'|16|00.|07'+S
End
S1:=WordGet(1,S,' ')
E:=Length(StripMCI(S1))+1
While E>0 Do Begin
S3:=S3+' '
E:=E-1
End
S1:=S
Repeat
B:=Length(S1)
A:=Length(StripMCI(S1))
L:=79-(A-B)
S2:=''
W:=StrWrap(S1,S2,L)
For X:=2 To CLBuffer Do
ChatLines[X-1]:=ChatLines[X]
ChatLines[CLBuffer]:=S1
AppendText(ChatLog,ChatLines[CLBuffer])
S1:='|07'+S3+S2
Until S2=''
End
Procedure MakeChatEntry(S:String)
Var Fil : String = CfgDataPath+'mrc'+PathChar+Int2Str(ChatSeed)+Int2Str(Random(9))+Int2Str(Random(9))+'.mrc'
Begin
AppendText(Fil,S)
ChatSeed:=ChatSeed+1
End
Procedure SendOut(FU,FS,FR,TU,TS,TR,S:String)
Var TX : String
Begin
TX:=FU+'~'+FS+'~'+FR+'~'+TU+'~'+TS+'~'+TR+'~'+S+'~'
MakeChatEntry(TX)
End
Procedure SendToMe(S:String)
Var Me : String = UserTag+'~'+SiteTag+'~'+MyRoom+'~'+UserTag+'~'+SiteTag+'~'+MyRoom+'~'+S+'~'
Begin
MakeChatEntry(Me)
End
Procedure SendToAllNotMe(S:String)
Begin
SendOut(UserTag,SiteTag,MyRoom,'NOTME','','',S)
End
Procedure SendToRoomNotMe(S:String)
Begin
SendOut(UserTag,SiteTag,MyRoom,'NOTME','',MyRoom,S)
End
Procedure SendToAll(S:String)
Begin
SendOut(UserTag,SiteTag,MyRoom,'','','',S)
End
Procedure SendToRoom(S:String)
Begin
SendOut(UserTag,SiteTag,MyRoom,'','',MyRoom,S)
End
Procedure SendToUser(U,S:String)
Begin
SendOut(UserTag,SiteTag,MyRoom,U,'','',S)
End
Procedure SendToClient(S:String)
Begin
SendOut(UserTag,SiteTag,MyRoom,'CLIENT',SiteTag,MyRoom,S)
End
Procedure SendToServer(S:String)
Begin
SendOut(UserTag,SiteTag,MyRoom,'SERVER',SiteTag,MyRoom,S)
End
Procedure ProcessChat(MR:MRCRec)
Var Ok2Send : Boolean = True
Var Command,Opt1,Opt2: String
Begin
If Pos('ROOMTOPIC',Mr.Message) > 0 Then Begin
Command:=WordGet(1,Mr.Message,':')
opt1:=WordGet(2,Mr.Message,':')
opt2:=WordGet(3,Mr.Message,':')
If Opt1 = MyRoom Then Begin
MyTopic:=Opt2
UpdateScreen
Ok2Send:=False
End
End
If MR.ToRoom <> '' Then
if Upper(MR.ToRoom) <> Upper(MyRoom) Then
Ok2Send:=False
If MR.ToUser <> '' Then
If Mr.ToUser <> 'NOTME' Then
If Length(Mr.ToUser) > 3 Then
If Pos(Upper(MR.ToUser),Upper(UserTag))=0
Then Ok2Send:=False
Else
If Mr.ToUser <> 'NOTME' Then
If Upper(Mr.FromUser) = Upper(UserTag) Then
Ok2Send:=False
If Ok2Send Then
Add2Chat(MR.Message)
End
Procedure ReadChatFiles
Var F1 : File
Var S : String
Var Ret : Boolean = False
Begin
FindFirst(CfgTempPath+'*.mrc',66)
While DOSError = 0 Do Begin
Ret:=True
fAssign(F1,CfgTempPath+DirName,66)
fReset(F1)
While Not fEof(F1) Do Begin
fReadLn(F1,S)
ServFile:=ParseChat(S)
ProcessChat(ServFile)
End
fClose(F1)
fileErase(CfgTempPath+DirName)
FindNext
End
FindClose
If Ret Then ShowChat(0)
End
Function UpdateStrings(S,M,U,NR,OR:String):String
Begin
S:=Replace(S,'%1',M)
S:=Replace(S,'%2',U)
S:=Replace(S,'%3','#'+NR)
S:=Replace(S,'%4','#'+OR)
UpdateStrings:=S
End
Procedure JoinRoom(S:String;B:Boolean)
Var NewRoom,OldRoom:String
Begin
If Length(S) > 0 Then Begin
OldRoom:=MyRoom
NewRoom:=lower(S)
StripB(S,'#')
SendToServer('NEWROOM:'+MyRoom+':'+S)
If B Then Begin
Delay(100)
SendToMe(UpdateStrings(Plyr.LeaveRoomMe,Plyr.Name,'',NewRoom,OldRoom))
Delay(100)
SendToRoomNotMe(UpdateStrings(Plyr.LeaveRoomRoom,Plyr.Name,'',NewRoom,OldRoom))
Delay(100)
MyRoom:=NewRoom
SendToMe(UpdateStrings(Plyr.EnterRoomMe,Plyr.Name,'',NewRoom,OldRoom))
Delay(100)
SendToRoomNotMe(UpdateStrings(Plyr.EnterRoomRoom,Plyr.Name,'',NewRoom,OldRoom))
End
MyRoom:=S
SetPromptInfo(4,'#'+S)
UpdateScreen
End
End
Procedure ChangeNick(LRNC,N:String;Announce:Boolean)
Var ON : String
Begin
Case LRNC Of
// 'N': Plyr.Name:=N
'L': Plyr.LtBracket:=N
'R': Plyr.RtBracket:=N
'C': Plyr.NameColor:=N
End
SavePlyr(Plyr.RecIdx)
MyNamePrompt:=Plyr.LtBracket+Plyr.NameColor+StripMCI(Plyr.Name)+Plyr.RtBracket+'|16|07 '
End
Procedure Init
Var X,Y: Integer
Var K,S : String = ''
Begin
S:=Int2Str(NodeNum)
For X:=1 To 3 Do
S:=S+Int2Str(Random(9))
ChatSeed:=Str2Int(S)
ChatLog:=CfgTempPath+'mrcchat.log'
PInUse:=CfgTempPath+'tchat.inuse'
BBSTempStub:=CfgTempPath
Y:=Pos(Int2Str(NodeNum),BBSTempStub)
If Y > 0 Then
Delete(BBSTempStub,Y,Length(Int2Str(NodeNum))+1)
Y:=FindPlyr
If Y = 0 Then NewPlyr
Else ReadPlyr(Y)
AppendText(PInUse,'0')
MenuCmd('NA','Mystic Relay Chatting')
End
Procedure DoHelp
Begin
Write('|16|11')
DispFile('mrchelp')
RedrawScreen
End
Procedure DoWho
Begin
Write('|16|11')
MenuCmd('NW','')
RedrawScreen
End
Procedure ChangeTopic(S:String)
Var R : String
Begin
SendToServer('NEWTOPIC:'+MyRoom+':'+S)
UpdateScreen
End
Procedure DoPrivateMsg(S:String)
Var M,U : String
Var L : Integer
Begin
U:=Upper(WordGet(2,S,' '))
L:=Pos(U,Upper(S))
L:=L+Length(U)+1
M:='|02<|10'+Plyr.Name+'|02 private> |07'+Copy(S,L,Length(S)-L+1)
SendToUser(U,M)
End
Procedure DoBroadcast(S:String)
Var M : String
Begin
M:='|05<|13'+Plyr.Name+'|05 broadcast> |07'+Copy(S,4,Length(S)-3)
SendToAll(M)
End
Procedure DoMeAction(S:String)
Var R : String
Begin
R:=Copy(S,5,Length(S)-4)
SendToRoom('|13* '+Plyr.Name+' ' + R)
End
Function InputLine:String
Var IX,UL : Integer
Var Ch : Char = #13
Begin
UL:=Length(StripMCI(MyNamePrompt))
IX:=PromptX+Length(StripMCI(MyNamePrompt))
GoToXy(PromptX,PromptY)
Write('|16'+MyNamePrompt+'|17|15|$X79 ')
GoToXy(PromptX,PromptY)
Write('|16'+MyNamePrompt)
While Ch = #13 Or Ch = #32 Do Begin
While Not Keypressed Do Begin
ReadChatFiles
Delay(100)
Loop:=Loop+1
If Loop > 10000 Then Loop:=1
If Loop % 2345 = 0 Then Begin
SendToServer('IAMHERE')
End
End
Ch:=ReadKey
End
StuffKey(ch)
GoToXy(PromptX,PromptY)
Write('|16'+MyNamePrompt+'|17|15|$X79 ')
GoToXy(PromptX,PromptY)
Write('|16'+MyNamePrompt)
InputLine:=Input(79-UL,InputSize,11,'')
GoToXy(PromptX,PromptY)
Write('|16'+MyNamePrompt+'|17|15|$X79 ')
End
Procedure DoCls
Var X : Integer
Begin
For X:=1 To CLBuffer Do Begin
ChatLines[X]:=''
End
End
Procedure DoScrollBack
Begin
MenuCmd('GV','mrcscrl;x;y;'+ChatLog)
RedrawScreen
End
Procedure EnterChat
Begin
Add2Chat(UpdateStrings(Plyr.EnterChatMe,Plyr.Name,'',MyRoom,MyRoom))
SendToAllNotMe(UpdateStrings(Plyr.EnterChatRoom,Plyr.Name,'',MyRoom,MyRoom))
SendToServer('IAMHERE')
SendtoServer('MOTD')
End
Procedure LeaveChat
Var Str1 : String
Begin
Add2Chat(UpdateStrings(Plyr.LeaveChatMe,Plyr.Name,'',MyRoom,MyRoom))
SendToAllNotMe(UpdateStrings(Plyr.LeaveChatRoom,Plyr.Name,'',MyRoom,MyRoom))
SendToServer('LOGOFF');
End
Procedure DoSetList
Var R,S : String
Begin
S:='False'
If Plyr.UseClock Then
S:='True'
R:='12Hour (HH:MMa or HHMMp)'
If Not Plyr.ClockFormat Then
R:='24Hour (HH:MM)'
Procedure DoSetHelp
Var B : Boolean
Begin
B:=Plyr.UseClock
Plyr.UseClock:=False
Add2Chat('|07/SET <tag> <text>')
Add2Chat('|07Use SET to set various fields to your account')
Add2Chat('|07<tag> HELP, LIST, ENTERCHATME, ENTERCHATROOM, ENTERROOMME, ENTERROOMROOM, LEAVECHATME, LEAVECHATROOM, LEAVEROOMROOM, LEAVEROOMME, DEFAULTROOM, NAMECOLOR, LTBRACKET, RTBRACKET, USECLOCK, CLOCKFORMAT')
Add2Chat('|07HELP This helps message')
Add2Chat('|07LIST List all fields and tabs')
Add2Chat('|07ENTERCHATME Displayed to me when I enter chat.')
Add2Chat('|07ENTERCHATROOM Displayed to room when I enter chat.')
Add2Chat('|07ENTERROOMME Displayed to me when I enter room.' )
Add2Chat('|07ENTERROOMROOM Displayed to room when I enter room.' )
Add2Chat('|07LEAVECHATME Displayed to me when I leave chat.' )
Add2Chat('|07LEAVECHATROOM Displayed to room when I leave chat.' )
Add2Chat('|07LEAVEROOMME Displayed to me when I leave room.')
Add2Chat('|07LEAVEROOMROOM Displayed to room when I leave room.')
Add2Chat('|07DEFAULTROOM Join this room when you join chat.')
Add2Chat('|07NICKCOLOR Change my nickname color (MCI Pipe codes.' )
Add2Chat('|07LTBRACKET Change my left bracket / color (MCI Pipe codes.' )
Add2Chat('|07RTBRACKET Change my right bracket / color (MCI Pipe codes.' )
Add2Chat('|07USECLOCK (Y/N) Use timestamp in chat')
Add2Chat('|07CLOCKFORMAT 12 or 24 hour clock format')
ShowChat(0)
Plyr.UseClock:=B
End
Procedure ChangeClock(T:Integer;S:String)
Begin
S:=StripB(Upper(S),' ')
Case T Of
1: Begin
If Pos('YE',S) > 0 Or Pos('TR',S) > 0 Then Begin
Plyr.UseClock:=True
Add2Chat('|07CLOCKFORMAT |08: |07True')
End Else Begin
If Pos('NO',S) > 0 Or Pos('FA',S) > 0 Then Begin
Plyr.UseClock:=False
Add2Chat('|07CLOCKFORMAT |08: |07False')
End Else
Add2Chat('Usage: /SET USECLOCK YES||TRUE or /SET USECLOCK NO||FALSE')
End
ShowChat(0)
End
2: Begin
If S = '12' Then Begin
Plyr.ClockFormat:=True
Add2Chat('|07CLOCKFORMAT |08: |0712 hour')
End Else Begin
If S = '24' Then Begin
Plyr.ClockFormat:=False
Add2Chat('|07CLOCKFORMAT |08: |0724 hour')
End Else
Add2Chat('Usage: "/SET CLOCKFORMAT 12" or "/SET CLOCKFORMAT 24"')
End
ShowChat(0)
End
End
SavePlyr(Plyr.RecIdx)
End
Procedure DoSet(Line:String)
Var Tag,Txt : String
Var P : Integer
Begin
Tag:=WordGet(1,Line,' ')
P:=Length(Tag)+1
Delete(Line,1,P)
StripB(line,' ')
Procedure DLChatLog
Var X,Y,TS,DS,TempChat : String
Var fptr : File
Begin
DS:=Replace(DateStr(DateTime,1),'/','')
TS:=Replace(TimeStr(DateTime,False),':','')
TempChat:=CfgTempPath+'mrc_chat_'+Replace(SiteTag,' ','_')+'_'+DS+'_'+TS+'.log'
Write('|16|11|CL')
If InputYN('Strip MCI color codes? ') Then Begin
fAssign(fptr,ChatLog,66)
fReset(Fptr)
While Not fEof(Fptr) Do Begin
fReadLn(Fptr,X)
Y:=StripMCI(X)
AppendText(TempChat,Y)
End
fClose(Fptr)
End Else
FileCopy(ChatLog,TempChat)
MenuCmd('F3',TempChat);
FileErase(TempChat)
RedrawScreen;
End
Procedure Main
Var Done : Boolean = False
Var RestOfLine, W1,W2,UIL : String
Var IL : String
Begin
Loop:=1
UpdateScreen
Repeat
IL:=InputLine
If Pos('/',IL) = 1 Then Begin
W1:=Upper(WordGet(1,IL,' '))
W2:=WordGet(2,IL,' ')
RestOfLine:=IL
Delete(RestOfLine,1,Length(W1))
RestOfLine:=StripB(RestOfLine,' ')
Case W1 Of
'/?' : DoHelp
'/B' : DoBroadcast(IL)
'/BBSES' : SendToServer('CONNECTED')
'/CHANNEL' : SendToServer('CHANNEL')
'/CHATTERS' : SendToServer('CHATTERS')
'/CLS' : DoCls
'/DLCHATLOG': DLChatLog
'/JOIN' : JoinRoom(W2,True)
'/LIST' : SendToServer('LIST')
'/ME' : DoMeAction(IL)
'/Q','/QUIT': Begin LeaveChat; Done:=True; End
'/ROOMS' : SendToServer('LIST')
'/SCROLL' : DoScrollBack
'/SET' : DoSet(RestOfLine)
'/TOPIC' : ChangeTopic(RestOfLine)
'/T','/MSG',
'/TELL' : DoPrivateMsg(IL)
'/USERS' : SendToServer('USERS')
'/WHO' : DoWho
'/WHOON' : SendToServer('WHOON')
'/MOTD' : SendToServer('MOTD')
'/VERSION' : Begin
SendToServer('VERSION')
Add2Chat('|07- |13'+MRCVersion)
End
End
End Else Begin
If Length(IL) > 0 Then
SendToRoom(MyNamePrompt+IL)
End
Until Done
End
Begin
GetThisUser
Init
RedrawScreen
EnterChat
JoinRoom(Plyr.DefaultRoom,False)
Main
Write('|16|11|CL')
CleanOutTempDir
End