local HttpService = game:GetService("HttpService")
local Players = game:GetService("Players")
local TextService = game:GetService("TextService")
local UserInputService = game:GetService("UserInputService")
local VoiceChatService = game:GetService("VoiceChatService")
local player = Players.LocalPlayer
shared.__FAKE_CHAT_BUS = shared.__FAKE_CHAT_BUS or { Messages = {}, Event = Instance.new("BindableEvent") }
local ChatBus = shared.__FAKE_CHAT_BUS
local gui = Instance.new("ScreenGui")
gui.Name = "TopbarPlusChat"
gui.ResetOnSpawn = false
gui.Parent = game.CoreGui
local topButton = Instance.new("ImageButton")
topButton.Size = UDim2.new(0,36,0,36)
topButton.BackgroundColor3 = Color3.fromRGB(30,30,30)
topButton.BorderSizePixel = 0
topButton.Image = "rbxassetid://88317614019211"
topButton.Parent = gui
Instance.new("UICorner", topButton).CornerRadius = UDim.new(1,0)
local function updateTopbarPosition()
local hasVoice = false
pcall(function()
hasVoice = VoiceChatService:IsVoiceEnabledForUserId(player.UserId)
end)
if hasVoice then
topButton.AnchorPoint = Vector2.new(0.5,0)
topButton.Position = UDim2.new(0.5,0,0,6)
else
topButton.AnchorPoint = Vector2.new(0,0)
topButton.Position = UDim2.new(0,6,0,6)
end
end
task.spawn(function()
while true do
updateTopbarPosition()
task.wait(5)
end
end)
local chatFrame = Instance.new("Frame")
chatFrame.Size = UDim2.new(0, math.min(300, workspace.CurrentCamera.ViewportSize.X * 0.9), 0, math.min(320, workspace.CurrentCamera.ViewportSize.Y * 0.8))
chatFrame.Position = UDim2.new(0.05,0,0.1,0)
chatFrame.BackgroundColor3 = Color3.fromRGB(20,20,20)
chatFrame.BackgroundTransparency = 0.4
chatFrame.Visible = false
chatFrame.Parent = gui
Instance.new("UICorner", chatFrame).CornerRadius = UDim.new(0,12)
local title = Instance.new("TextLabel")
title.Text = "SpectyChat Box"
title.Size = UDim2.new(1,-10,0,30)
title.Position = UDim2.new(0,5,0,5)
title.BackgroundTransparency = 1
title.TextColor3 = Color3.new(1,1,1)
title.Font = Enum.Font.Arial
title.TextSize = 16
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = chatFrame
local infoButton = Instance.new("ImageButton")
infoButton.Size = UDim2.new(0,22,0,22)
infoButton.Position = UDim2.new(1,-32,0,9)
infoButton.BackgroundColor3 = Color3.fromRGB(0,0,0)
infoButton.BorderSizePixel = 0
infoButton.Image = "rbxassetid://5832745500"
infoButton.Parent = chatFrame
Instance.new("UICorner", infoButton).CornerRadius = UDim.new(1,0)
local scroll = Instance.new("ScrollingFrame")
scroll.Position = UDim2.new(0,10,0,40)
scroll.Size = UDim2.new(1,-20,1,-120)
scroll.CanvasSize = UDim2.new(0,0,0,0)
scroll.BackgroundTransparency = 1
scroll.BorderSizePixel = 0
scroll.ScrollBarImageTransparency = 0.4
scroll.Parent = chatFrame
local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0,6)
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Parent = scroll
local infoFrame = Instance.new("Frame")
infoFrame.Size = scroll.Size
infoFrame.Position = scroll.Position
infoFrame.BackgroundTransparency = 1
infoFrame.Visible = false
infoFrame.Parent = chatFrame
local infoScroll = Instance.new("ScrollingFrame")
infoScroll.Size = UDim2.new(1,0,1,0)
infoScroll.CanvasSize = UDim2.new(0,0,0,0)
infoScroll.ScrollBarImageTransparency = 0.4
infoScroll.BackgroundTransparency = 1
infoScroll.BorderSizePixel = 0
infoScroll.Parent = infoFrame
local infoLayout = Instance.new("UIListLayout")
infoLayout.Padding = UDim.new(0,10)
infoLayout.Parent = infoScroll
local function addInfoText(text)
local lbl = Instance.new("TextLabel")
lbl.Size = UDim2.new(1,-10,0,0)
lbl.BackgroundTransparency = 1
lbl.TextWrapped = true
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextYAlignment = Enum.TextYAlignment.Top
lbl.Font = Enum.Font.Arial
lbl.TextSize = 14
lbl.TextColor3 = Color3.new(1,1,1)
lbl.Text = text
lbl.Parent = infoScroll
local width = infoScroll.AbsoluteSize.X
if width == 0 then width = 300 end
lbl.Size = UDim2.new(1,-10,0,TextService:GetTextSize(text,14,lbl.Font,Vector2.new(width,9999)).Y+4)
infoScroll.CanvasSize = UDim2.new(0,0,0,infoLayout.AbsoluteContentSize.Y+6)
end
addInfoText("1. Friends appear in RED.")
addInfoText("2. Bots appear in WHITE.")
addInfoText("3. Made by SpectravaxISBACK.")
local box = Instance.new("TextBox")
box.Size = UDim2.new(1,-90,0,34)
box.Position = UDim2.new(0,10,1,-90)
box.BackgroundColor3 = Color3.fromRGB(25,25,25)
box.TextColor3 = Color3.new(1,1,1)
box.PlaceholderText = "Tap here to chat or press the / key..."
box.ClearTextOnFocus = false
box.Font = Enum.Font.Arial
box.TextSize = 14
box.Parent = chatFrame
Instance.new("UICorner", box).CornerRadius = UDim.new(0,8)
local send = Instance.new("TextButton")
send.Size = UDim2.new(0,60,0,34)
send.Position = UDim2.new(1,-70,1,-90)
send.Text = "Send"
send.Font = Enum.Font.Arial
send.TextSize = 14
send.TextColor3 = Color3.new(1,1,1)
send.BackgroundColor3 = Color3.fromRGB(40,40,40)
send.Parent = chatFrame
Instance.new("UICorner", send).CornerRadius = UDim.new(0,8)
local typingLabel = Instance.new("TextLabel")
typingLabel.Size = UDim2.new(1,-20,0,20)
typingLabel.Position = UDim2.new(0,10,1,-55)
typingLabel.BackgroundTransparency = 1
typingLabel.TextColor3 = Color3.new(1,1,1)
typingLabel.Font = Enum.Font.Arial
typingLabel.TextSize = 14
typingLabel.TextXAlignment = Enum.TextXAlignment.Left
typingLabel.Text = ""
typingLabel.Parent = chatFrame
topButton.MouseButton1Click:Connect(function()
chatFrame.Visible = not chatFrame.Visible
end)
-- Bot Names/Phrases with fallback
local botNamesUrl = "https://raw.githubusercontent.com/deedlemcdoodledeedlemcdoodle-creator/Names_and_Phrases/refs/heads/main/bot_names.txt"
local botPhrasesUrl = "https://raw.githubusercontent.com/deedlemcdoodledeedlemcdoodle-creator/Names_and_Phrases/refs/heads/main/bot_phrases.txt"
local botNames, botPhrases = {}, {}
pcall(function()
botNames = string.split(HttpService:GetAsync(botNamesUrl), "\n")
botPhrases = string.split(HttpService:GetAsync(botPhrasesUrl), "\n")
end)
if #botNames == 0 then
botNames = {"NoodleLUCKisreal:", "WhoAteMyToaster:", "MrBreasty:", "iCantChat:", "jfjdjsidjcbsjsba:", "V4MP:", "ST4R:"}
end
if #botPhrases == 0 then
botPhrases = {
"Hello everyone!", "What's up?", "Anyone here?", "Nice chat!",
"Finally, we don't need face id!!", "This is awesome, good job!", "I love this game!",
"Who wants to play some Roblox together?", "Just finished a really fun obby!",
"This chat is so cool!", "Can't believe we can finally chat without restrictions!",
"I just got a new skin, looks awesome!", "Anyone up for a race?", "Wow, this place is amazing!",
"I found a secret area in the game!", "Who wants to trade items?", "This game reminds me of the good old days!",
"I love hanging out here with friends!", "Finally, no face id needed!", "Let's start a group game!",
"Who wants to explore together?", "LOL, that was funny!", "I just got the highest score!",
"This is so relaxing!", "I love customizing my avatar!", "Who else is playing this today?",
"Finally, chat is back!", "I can't stop laughing!", "Anyone knows a good obby?",
"This game is perfect for chill time!", "I just found a rare item!", "Finally, we can all chat freely!",
"Who's up for some mini-games?", "I love the community here!", "Just joined, hi everyone!",
"Finally, no more face id problems!", "Let's play together!", "This is the best script ever!",
"I just completed a challenge!", "Who's online right now?", "I found a cool trick in this game!",
"This chat is so fun!", "Finally, we can chat without limits!", "Anyone wants to team up?",
"I love how smooth everything is!", "Who wants to join my game?", "Finally, we can enjoy chatting!",
"This makes the game way more fun!", "I just unlocked a new area!", "Let's have some fun!",
"I love the graphics in this game!", "Anyone wants to build something together?", "Finally, chatting made easy!",
"LOL, that was hilarious!", "I just got a new badge!", "Who's ready for a game night?",
"I love playing with friends here!", "Finally, no more restrictions!", "Let's make a team!",
"This chat is amazing!", "I just discovered something cool!", "Who wants to hang out?",
"Finally, free chat for everyone!", "This game is super fun!", "I love exploring here!",
"Anyone wants to race?", "Finally, no face id needed again!", "Let's have some fun together!",
"I just got a rare pet!", "This script is so useful!", "Who wants to join a party?",
"Finally, we can chat without worries!", "I love the friendly vibes here!", "This game is so cozy!",
"Anyone wants to trade?", "Finally, chat for everyone!", "I just leveled up!",
"Let's play some fun games!", "This is so relaxing and fun!", "I love hanging out in this chat!",
"Finally, no face id troubles anymore!"
}
end
-- Friends
local friends = {}
pcall(function()
for _,f in ipairs(player:GetFriendsAsync():GetCurrentPage()) do
friends[f.Username] = true
friends[f.DisplayName] = true
end
end)
-- Add Message
local function addMessage(name,text)
local isRed = friends[name] == true
local lbl = Instance.new("TextLabel")
lbl.BackgroundTransparency = 1
lbl.TextWrapped = true
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextYAlignment = Enum.TextYAlignment.Top
lbl.Font = Enum.Font.Arial
lbl.TextSize = 14
lbl.RichText = true
local width = scroll.AbsoluteSize.X
if width == 0 then width = 300 end
if isRed then
lbl.Text = string.format('%s: %s',name,text)
else
lbl.Text = string.format('%s: %s',name,text)
end
lbl.Size = UDim2.new(1,-10,0,TextService:GetTextSize(text,14,lbl.Font,Vector2.new(width,9999)).Y+4)
lbl.Parent = scroll
scroll.CanvasSize = UDim2.new(0,0,0,layout.AbsoluteContentSize.Y+6)
scroll.CanvasPosition = Vector2.new(0,math.max(0,scroll.CanvasSize.Y.Offset-scroll.AbsoluteWindowSize.Y))
end
-- Send Button
send.MouseButton1Click:Connect(function()
if box.Text ~= "" then
local msg = {name=player.DisplayName,text=box.Text}
table.insert(ChatBus.Messages,msg)
ChatBus.Event:Fire(msg)
box.Text = ""
end
end)
-- Listen for new messages
ChatBus.Event.Event:Connect(function(msg)
addMessage(msg.name,msg.text)
end)
-- Display old messages
for _,msg in ipairs(ChatBus.Messages) do
addMessage(msg.name,msg.text)
end
-- Bot Messages
task.spawn(function()
while true do
local name = botNames[math.random(#botNames)]
local text = botPhrases[math.random(#botPhrases)]
local msg = {name=name,text=text}
table.insert(ChatBus.Messages,msg)
ChatBus.Event:Fire(msg)
task.wait(math.random(1,4))
end
end)
-- Typing Label
task.spawn(function()
while true do
local typingUsers = {}
local numTyping = math.random(1,6)
for i=1,numTyping do
table.insert(typingUsers, botNames[math.random(#botNames)])
end
if #typingUsers == 0 then
typingLabel.Text = ""
elseif #typingUsers == 1 then
typingLabel.Text = typingUsers[1].." is typing..."
elseif #typingUsers > 4 then
typingLabel.Text = "Several users are typing..."
else
local text = table.concat(typingUsers,", ")
text = text:gsub(", ([^,]+)$"," and %1")
typingLabel.Text = text.." are typing..."
end
task.wait(math.random(2,5))
typingLabel.Text = ""
task.wait(math.random(1,2))
end
end)
-- Info Button
local showingInfo = false
infoButton.MouseButton1Click:Connect(function()
showingInfo = not showingInfo
if showingInfo then
title.Text = "Informations"
scroll.Visible = false
infoFrame.Visible = true
else
title.Text = "SpectyChat Box"
scroll.Visible = true
infoFrame.Visible = false
end
end)
-- Slash Key Open
UserInputService.InputBegan:Connect(function(input,gp)
if gp then return end
if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == Enum.KeyCode.Slash then
if not chatFrame.Visible then chatFrame.Visible = true end
box:CaptureFocus()
end
end)