Run it
Copy the script and paste it into your executor.
Players = :()
StarterGui = :()
TextService = :()
player = Players.LocalPlayer
showTimestamps =
showDisplayName =
messageHistory = {}
maxHistory =
currentSearch =
()
screenGui = .()
screenGui.Name =
screenGui.ResetOnSpawn =
screenGui.Parent = player:()
mainFrame = .()
mainFrame.Name =
mainFrame.Size = .(, , , )
mainFrame.Position = .(, , , )
mainFrame.BackgroundColor3 = .(, , )
mainFrame.BorderSizePixel =
mainFrame.Active =
mainFrame.Draggable =
mainFrame.Parent = screenGui
mainCorner = .()
mainCorner.CornerRadius = .(, )
mainCorner.Parent = mainFrame
mainPadding = .()
mainPadding.PaddingTop = .(, )
mainPadding.PaddingLeft = .(, )
mainPadding.PaddingRight = .(, )
mainPadding.PaddingBottom = .(, )
mainPadding.Parent = mainFrame
titleBar = .()
titleBar.Name =
titleBar.Size = .(, , , )
titleBar.Position = .(, , , )
titleBar.BackgroundColor3 = .(, , )
titleBar.BorderSizePixel =
titleBar.Parent = mainFrame
titleCorner = .()
titleCorner.CornerRadius = .(, )
titleCorner.Parent = titleBar
titleGradient = .()
titleGradient.Color = ColorSequence.({
ColorSequenceKeypoint.(, .(, , )),
ColorSequenceKeypoint.(, .(, , )),
})
titleGradient.Parent = titleBar
titleStroke = .()
titleStroke.Color = .(, , )
titleStroke.Transparency =
titleStroke.Parent = titleBar
(btn, baseColor, hoverColor)
corner = .()
corner.CornerRadius = .(, )
corner.Parent = btn
btn.BackgroundColor3 = baseColor
btn.MouseEnter:(()
btn.BackgroundColor3 = hoverColor
)
btn.MouseLeave:(()
btn.BackgroundColor3 = baseColor
)
titleLabel = .()
titleLabel.Name =
titleLabel.Size = .(, -, , )
titleLabel.Position = .(, , , )
titleLabel.BackgroundTransparency =
titleLabel.Text =
titleLabel.TextColor3 = .(, , )
titleLabel.TextScaled =
titleLabel.TextSize =
titleLabel.Font = .Font.Code
titleLabel.TextXAlignment = .TextXAlignment.Left
titleLabel.TextWrapped =
titleLabel.Parent = titleBar
closeButton = .()
closeButton.Name =
closeButton.Size = .(, , , )
closeButton.Position = .(, -, , )
closeButton.BackgroundColor3 = .(, , )
closeButton.BorderSizePixel =
closeButton.Text =
closeButton.TextColor3 = .(, , )
closeButton.TextScaled =
closeButton.TextSize =
closeButton.Font = .Font.SourceSansBold
closeButton.Parent = titleBar
(closeButton, .(,,), .(,,))
refreshButton = .()
refreshButton.Name =
refreshButton.Size = .(, , , )
refreshButton.Position = .(, -, , )
refreshButton.BackgroundColor3 = .(, , )
refreshButton.BorderSizePixel =
refreshButton.Text =
refreshButton.TextColor3 = .(, , )
refreshButton.TextScaled =
refreshButton.TextSize =
refreshButton.Font = .Font.SourceSansBold
refreshButton.Parent = titleBar
(refreshButton, .(,,), .(,,))
timestampButton = .()
timestampButton.Name =
timestampButton.Size = .(, , , )
timestampButton.Position = .(, -, , )
timestampButton.BackgroundColor3 = .(, , )
timestampButton.BorderSizePixel =
timestampButton.Text =
timestampButton.TextColor3 = .(, , )
timestampButton.TextScaled =
timestampButton.TextSize =
timestampButton.Font = .Font.SourceSansBold
timestampButton.Parent = titleBar
(timestampButton, .(,,), .(,,))
displayNameButton = .()
displayNameButton.Name =
displayNameButton.Size = .(, , , )
displayNameButton.Position = .(, -, , )
displayNameButton.BackgroundColor3 = .(, , )
displayNameButton.BorderSizePixel =
displayNameButton.Text =
displayNameButton.TextColor3 = .(, , )
displayNameButton.TextScaled =
displayNameButton.TextSize =
displayNameButton.Font = .Font.SourceSansBold
displayNameButton.Parent = titleBar
(displayNameButton, .(,,), .(,,))
searchBox = .()
searchBox.Name =
searchBox.Size = .(, -, , )
searchBox.Position = .(, , , )
searchBox.PlaceholderText =
searchBox.BackgroundColor3 = .(, , )
searchBox.TextColor3 = .(, , )
searchBox.ClearTextOnFocus =
searchBox.Parent = mainFrame
scrollingFrame = .()
scrollingFrame.Name =
scrollingFrame.Size = .(, -, , -)
scrollingFrame.Position = .(, , , )
scrollingFrame.BackgroundColor3 = .(, , )
scrollingFrame.BorderSizePixel =
scrollingFrame.ScrollBarThickness =
scrollingFrame.ScrollBarImageColor3 = .(, , )
scrollingFrame.CanvasSize = .(, , , )
scrollingFrame.AutomaticCanvasSize = .AutomaticSize.Y
scrollingFrame.Parent = mainFrame
scrollPadding = .()
scrollPadding.PaddingTop = .(, )
scrollPadding.PaddingLeft = .(, )
scrollPadding.PaddingRight = .(, )
scrollPadding.PaddingBottom = .(, )
scrollPadding.Parent = scrollingFrame
scrollCorner = .()
scrollCorner.CornerRadius = .(, )
scrollCorner.Parent = scrollingFrame
listLayout = .()
listLayout.SortOrder = .SortOrder.LayoutOrder
listLayout.Padding = .(, )
listLayout.Parent = scrollingFrame
clearButton = .()
clearButton.Name =
clearButton.Size = .(, , , )
clearButton.Position = .(, -, , )
clearButton.BackgroundColor3 = .(, , )
clearButton.BorderSizePixel =
clearButton.Text =
clearButton.TextColor3 = .(, , )
clearButton.TextScaled =
clearButton.Font = .Font.SourceSansBold
clearButton.Parent = titleBar
exportButton = .()
exportButton.Name =
exportButton.Size = .(, , , )
exportButton.Position = .(, -, , )
exportButton.BackgroundColor3 = .(, , )
exportButton.BorderSizePixel =
exportButton.Text =
exportButton.TextColor3 = .(, , )
exportButton.TextScaled =
exportButton.Font = .Font.SourceSansBold
exportButton.Parent = titleBar
screenGui, scrollingFrame, listLayout, closeButton, refreshButton, timestampButton, displayNameButton, clearButton, exportButton, searchBox
screenGui, scrollingFrame, listLayout, closeButton, refreshButton, timestampButton, displayNameButton, clearButton, exportButton, searchBox = ()
()
time = .()
.(, time.hour, time.min, time.sec)
(scrollingFrame, listLayout, playerName, message, skipHistory)
skipHistory
.(messageHistory, {
playerName = playerName,
message = message,
timestamp = .()
})
#messageHistory > maxHistory
.(messageHistory, )
playerObj = Players:(playerName)
displayName = playerObj playerObj.DisplayName playerName
messageText
showTimestamps
showDisplayName
messageText = () .. .. displayName .. .. message
messageText = () .. .. playerName .. .. message
showDisplayName
messageText = .. displayName .. .. message
messageText = .. playerName .. .. message
messageLabel = .()
messageLabel.Name =
messageLabel.Size = .(, -, , )
messageLabel.BackgroundTransparency =
messageLabel.Text = messageText
messageLabel.TextColor3 = .(, , )
messageLabel.TextScaled =
messageLabel.TextSize =
messageLabel.Font = .Font.SourceSans
messageLabel.TextXAlignment = .TextXAlignment.Left
messageLabel.TextYAlignment = .TextYAlignment.Top
messageLabel.TextWrapped =
messageLabel.Parent = scrollingFrame
textSize = TextService:(messageLabel.Text, messageLabel.TextSize, messageLabel.Font, .(scrollingFrame.AbsoluteSize.X - , .huge))
messageLabel.Size = .(, -, , textSize.Y)
:().Heartbeat:()
.()
scrollingFrame scrollingFrame.CanvasSize
scrollingFrame.CanvasPosition = .(, scrollingFrame.CanvasSize.Y.Offset)
.()
scrollingFrame
maxY =
_, child scrollingFrame:()
child:()
maxY = maxY + child.AbsoluteSize.Y +
scrollingFrame.CanvasPosition = .(, maxY)
(scrollingFrame)
_, child scrollingFrame:()
child:()
child:()
(scrollingFrame, listLayout)
(scrollingFrame)
filter = currentSearch:()
_, msgData (messageHistory)
playerObj = Players:(msgData.playerName)
displayName = playerObj playerObj.DisplayName msgData.playerName
combined = (msgData.playerName .. .. displayName .. .. msgData.message):()
filter == combined:(filter, , )
(scrollingFrame, listLayout, msgData.playerName, msgData.message, )
closeButton.MouseButton1Click:(()
screenGui:()
)
refreshButton.MouseButton1Click:(()
(scrollingFrame, listLayout)
)
clearButton
clearButton.MouseButton1Click:(()
(scrollingFrame)
messageHistory = {}
(scrollingFrame, listLayout, , )
)
exportButton
exportButton.MouseButton1Click:(()
lines = {}
_, msgData (messageHistory)
timeStr = .(, msgData.timestamp)
.(lines, .(, timeStr, msgData.playerName, msgData.message))
exportText = .(lines, )
ok, err = (()
setclipboard
(exportText)
setclipboard == (setclipboard) ==
(exportText)
()
)
ok
(scrollingFrame, listLayout, , )
modal = .()
modal.Name =
modal.Size = .(, , , )
modal.Position = .(, -, , -)
modal.BackgroundColor3 = .(, , )
modal.BorderSizePixel =
modal.Parent = screenGui
box = .()
box.Name =
box.Size = .(, -, , -)
box.Position = .(, , , )
box.Text = exportText
box.TextWrapped =
box.TextXAlignment = .TextXAlignment.Left
box.TextYAlignment = .TextYAlignment.Top
box.MultiLine =
box.ClearTextOnFocus =
box.TextEditable =
box.Parent = modal
closeB = .()
closeB.Name =
closeB.Size = .(, , , )
closeB.Position = .(, -, , -)
closeB.Text =
closeB.Parent = modal
closeB.MouseButton1Click:(()
modal:()
)
(scrollingFrame, listLayout, , )
)
timestampButton.MouseButton1Click:(()
showTimestamps = showTimestamps
showTimestamps
timestampButton.BackgroundColor3 = .(, , )
(scrollingFrame, listLayout)
timestampButton.BackgroundColor3 = .(, , )
(scrollingFrame, listLayout)
)
displayNameButton.MouseButton1Click:(()
showDisplayName = showDisplayName
showDisplayName
displayNameButton.BackgroundColor3 = .(, , )
(scrollingFrame, listLayout)
displayNameButton.BackgroundColor3 = .(, , )
(scrollingFrame, listLayout)
)
(scrollingFrame, listLayout, , )
(playerToConnect)
playerToConnect.Chatted:((message)
(scrollingFrame, listLayout, playerToConnect.Name, message)
)
(player)
_, otherPlayer Players:()
otherPlayer ~= player
(otherPlayer)
Players.PlayerAdded:((newPlayer)
(newPlayer)
)
searchBox
searchBox:():(()
currentSearch = searchBox.Text
(scrollingFrame, listLayout)
)
works in all games and logs chats

Universal