
KeylessUniversal

local Players = game:GetService("Players")
local TextChatService = game:GetService("TextChatService")
local UserInputService = game:GetService("UserInputService")
local HttpService = game:GetService("HttpService")
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
--//==================================================
--// SETTINGS
--//==================================================
local messages = {}
local autoRandomEnabled = false
local AUTO_RANDOM_DELAY = 5
local lastRandomIndex = nil
local uiScale = 1
local transparency = 0
local accentColor = Color3.fromRGB(55, 55, 62)
-- Floating quick sentences
local quickSentencesEnabled = true
local quickConfig = {}
-- quickConfig["message"] = {
-- x = number,
-- y = number,
-- locked = boolean
-- }
local quickFrames = {}
local quickDragConnections = {}
local SAVE_FILE = "ChatSenderYe_Messages.json"
local SETTINGS_FILE = "ChatSenderYe_Settings.json"
--//==================================================
--// REMOVE OLD GUI IF SCRIPT IS RAN AGAIN
--//==================================================
local oldGui = playerGui:FindFirstChild("ChatSenderYe_UPD")
if oldGui then
oldGui:Destroy()
end
--//==================================================
--// FILE FUNCTIONS
--//==================================================
local function loadMessages()
if isfile and readfile and isfile(SAVE_FILE) then
local success, data = pcall(function()
return HttpService:JSONDecode(readfile(SAVE_FILE))
end)
if success and type(data) == "table" then
messages = {}
for _, message in ipairs(data) do
if type(message) == "string" and message ~= "" then
table.insert(messages, message)
end
end
end
end
end
local function saveMessages()
if writefile then
pcall(function()
writefile(SAVE_FILE, HttpService:JSONEncode(messages))
end)
end
end
local function loadSettings()
if isfile and readfile and isfile(SETTINGS_FILE) then
local success, data = pcall(function()
return HttpService:JSONDecode(readfile(SETTINGS_FILE))
end)
if success and type(data) == "table" then
if tonumber(data.uiScale) then
uiScale = math.clamp(tonumber(data.uiScale), 0.7, 1.4)
end
if tonumber(data.transparency) then
transparency = math.clamp(tonumber(data.transparency), 0, 0.7)
end
if type(data.quickSentencesEnabled) == "boolean" then
quickSentencesEnabled = data.quickSentencesEnabled
end
if type(data.quickConfig) == "table" then
quickConfig = {}
for message, config in pairs(data.quickConfig) do
if type(message) == "string" and type(config) == "table" then
quickConfig[message] = {
x = tonumber(config.x) or 10,
y = tonumber(config.y) or 150,
locked = config.locked == true
}
end
end
end
end
end
end
local function saveSettings()
if writefile then
pcall(function()
writefile(
SETTINGS_FILE,
HttpService:JSONEncode({
uiScale = uiScale,
transparency = transparency,
quickSentencesEnabled = quickSentencesEnabled,
quickConfig = quickConfig
})
)
end)
end
end
loadMessages()
loadSettings()
--//==================================================
--// HELPERS
--//==================================================
local function messageExists(message)
for _, savedMessage in ipairs(messages) do
if savedMessage == message then
return true
end
end
return false
end
local function getDefaultQuickPosition(index)
local camera = workspace.CurrentCamera
local x = 10
local y = 120 + ((index - 1) * 50)
if camera then
local viewport = camera.ViewportSize
if y > viewport.Y - 55 then
y = 100
end
end
return x, y
end
local function clampQuickPosition(frame, x, y)
local camera = workspace.CurrentCamera
if not camera then
return x, y
end
local viewport = camera.ViewportSize
local maxX = math.max(0, viewport.X - frame.AbsoluteSize.X)
local maxY = math.max(0, viewport.Y - frame.AbsoluteSize.Y)
return math.clamp(x, 0, maxX),
math.clamp(y, 0, maxY)
end
--//==================================================
--// SEND MESSAGE
--//==================================================
local function sendMessage(message)
if not message or message == "" then
return
end
pcall(function()
local channels = TextChatService:FindFirstChild("TextChannels")
if channels then
local general = channels:FindFirstChild("RBXGeneral")
if general then
general:SendAsync(message)
end
end
end)
end
--//==================================================
--// GUI
--//==================================================
local gui = Instance.new("ScreenGui")
gui.Name = "ChatSenderYe_UPD"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = false
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.DisplayOrder = 20
gui.Parent = playerGui
--//==================================================
--// MAIN WINDOW
--//==================================================
local main = Instance.new("Frame")
main.Name = "Main"
main.Size = UDim2.fromOffset(280, 350)
main.Position = UDim2.new(0.5, -140, 0.5, -175)
main.BackgroundColor3 = Color3.fromRGB(25, 25, 29)
main.BackgroundTransparency = transparency
main.BorderSizePixel = 0
main.ZIndex = 10
main.Parent = gui
Instance.new("UICorner", main).CornerRadius = UDim.new(0, 18)
--//==================================================
--// HEADER
--//==================================================
local header = Instance.new("Frame")
header.Size = UDim2.new(1, 0, 0, 62)
header.BackgroundTransparency = 1
header.ZIndex = 11
header.Parent = main
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -105, 1, 0)
title.Position = UDim2.fromOffset(18, 0)
title.BackgroundTransparency = 1
title.Text = "*chat sender ye [UPD]"
title.TextColor3 = Color3.fromRGB(235, 235, 240)
title.TextSize = 20
title.Font = Enum.Font.Gotham
title.TextXAlignment = Enum.TextXAlignment.Left
title.ZIndex = 12
title.Parent = header
local settingsButton = Instance.new("TextButton")
settingsButton.Size = UDim2.fromOffset(45, 45)
settingsButton.Position = UDim2.new(1, -98, 0, 8)
settingsButton.BackgroundTransparency = 1
settingsButton.Text = "⚙"
settingsButton.TextColor3 = Color3.fromRGB(150, 160, 170)
settingsButton.TextSize = 28
settingsButton.Font = Enum.Font.GothamBold
settingsButton.ZIndex = 12
settingsButton.Parent = header
local minimizeButton = Instance.new("TextButton")
minimizeButton.Size = UDim2.fromOffset(40, 40)
minimizeButton.Position = UDim2.new(1, -48, 0, 10)
minimizeButton.BackgroundTransparency = 1
minimizeButton.Text = "×"
minimizeButton.TextColor3 = Color3.fromRGB(190, 190, 195)
minimizeButton.TextSize = 25
minimizeButton.Font = Enum.Font.Gotham
minimizeButton.ZIndex = 12
minimizeButton.Parent = header
--//==================================================
--// MESSAGE INPUT
--//==================================================
local inputBox = Instance.new("TextBox")
inputBox.Name = "MessageInput"
inputBox.Size = UDim2.new(1, -30, 0, 58)
inputBox.Position = UDim2.fromOffset(15, 65)
inputBox.BackgroundColor3 = Color3.fromRGB(34, 34, 40)
inputBox.BackgroundTransparency = transparency
inputBox.BorderSizePixel = 0
inputBox.PlaceholderText = "TextBox"
inputBox.PlaceholderColor3 = Color3.fromRGB(175, 175, 180)
inputBox.Text = ""
inputBox.TextColor3 = Color3.fromRGB(240, 240, 240)
inputBox.TextSize = 18
inputBox.Font = Enum.Font.Gotham
inputBox.ClearTextOnFocus = false
inputBox.ZIndex = 11
inputBox.Parent = main
Instance.new("UICorner", inputBox).CornerRadius = UDim.new(0, 14)
--//==================================================
--// QUICK + AUTO BUTTONS
--//==================================================
local quickToggle = Instance.new("TextButton")
quickToggle.Size = UDim2.fromOffset(95, 36)
quickToggle.Position = UDim2.fromOffset(15, 130)
quickToggle.BackgroundColor3 = accentColor
quickToggle.BackgroundTransparency = transparency
quickToggle.BorderSizePixel = 0
quickToggle.TextColor3 = Color3.fromRGB(235, 235, 240)
quickToggle.TextSize = 13
quickToggle.Font = Enum.Font.GothamMedium
quickToggle.ZIndex = 11
quickToggle.Parent = main
Instance.new("UICorner", quickToggle).CornerRadius = UDim.new(0, 12)
local autoButton = Instance.new("TextButton")
autoButton.Size = UDim2.fromOffset(165, 36)
autoButton.Position = UDim2.fromOffset(115, 130)
autoButton.BackgroundColor3 = Color3.fromRGB(34, 34, 40)
autoButton.BackgroundTransparency = transparency
autoButton.BorderSizePixel = 0
autoButton.TextColor3 = Color3.fromRGB(215, 215, 220)
autoButton.TextSize = 13
autoButton.Font = Enum.Font.GothamMedium
autoButton.ZIndex = 11
autoButton.Parent = main
Instance.new("UICorner", autoButton).CornerRadius = UDim.new(0, 12)
--//==================================================
--// SAVED MESSAGE SCROLL
--//==================================================
local messageScroll = Instance.new("ScrollingFrame")
messageScroll.Name = "SavedMessages"
messageScroll.Size = UDim2.new(1, -30, 0, 164)
messageScroll.Position = UDim2.fromOffset(15, 175)
messageScroll.BackgroundTransparency = 1
messageScroll.BorderSizePixel = 0
messageScroll.ScrollBarThickness = 3
messageScroll.ScrollBarImageColor3 = Color3.fromRGB(90, 90, 100)
messageScroll.CanvasSize = UDim2.new(0, 0, 0, 0)
messageScroll.ZIndex = 11
messageScroll.Parent = main
local messageLayout = Instance.new("UIListLayout")
messageLayout.Padding = UDim.new(0, 8)
messageLayout.SortOrder = Enum.SortOrder.LayoutOrder
messageLayout.Parent = messageScroll
messageLayout:GetPropertyChangedSignal("AbsoluteContentSize"):Connect(function()
messageScroll.CanvasSize = UDim2.fromOffset(
0,
messageLayout.AbsoluteContentSize.Y + 5
)
end)
--//==================================================
--// ADD MESSAGE BUTTON
--//==================================================
local addButton = Instance.new("TextButton")
addButton.Size = UDim2.fromOffset(55, 55)
addButton.Position = UDim2.new(1, -70, 1, -70)
addButton.BackgroundColor3 = accentColor
addButton.BackgroundTransparency = transparency
addButton.BorderSizePixel = 0
addButton.Text = "+"
addButton.TextColor3 = Color3.fromRGB(245, 245, 245)
addButton.TextSize = 28
addButton.Font = Enum.Font.GothamMedium
addButton.ZIndex = 12
addButton.Parent = main
Instance.new("UICorner", addButton).CornerRadius = UDim.new(1, 0)
--//==================================================
--// MINIMIZED CIRCLE
--//==================================================
local miniCircle = Instance.new("TextButton")
miniCircle.Name = "MiniCircle"
miniCircle.Size = UDim2.fromOffset(55, 55)
miniCircle.Position = UDim2.new(0, 20, 0.5, -27)
miniCircle.BackgroundColor3 = Color3.fromRGB(35, 35, 40)
miniCircle.BackgroundTransparency = transparency
miniCircle.BorderSizePixel = 0
miniCircle.Text = "C"
miniCircle.TextColor3 = Color3.fromRGB(235, 235, 240)
miniCircle.TextSize = 20
miniCircle.Font = Enum.Font.GothamBold
miniCircle.Visible = false
miniCircle.ZIndex = 20
miniCircle.Parent = gui
Instance.new("UICorner", miniCircle).CornerRadius = UDim.new(1, 0)
--//==================================================
--// SETTINGS PANEL
--//==================================================
local settingsPanel = Instance.new("Frame")
settingsPanel.Name = "Settings"
settingsPanel.Size = UDim2.fromOffset(280, 220)
settingsPanel.Position = UDim2.new(0.5, -140, 0.5, -110)
settingsPanel.BackgroundColor3 = Color3.fromRGB(25, 25, 29)
settingsPanel.BackgroundTransparency = transparency
settingsPanel.BorderSizePixel = 0
settingsPanel.Visible = false
settingsPanel.ZIndex = 50
settingsPanel.Parent = gui
Instance.new("UICorner", settingsPanel).CornerRadius = UDim.new(0, 18)
local settingsTitle = Instance.new("TextLabel")
settingsTitle.Size = UDim2.new(1, -60, 0, 50)
settingsTitle.Position = UDim2.fromOffset(18, 5)
settingsTitle.BackgroundTransparency = 1
settingsTitle.Text = "options"
settingsTitle.TextColor3 = Color3.fromRGB(235, 235, 240)
settingsTitle.TextSize = 20
settingsTitle.Font = Enum.Font.GothamMedium
settingsTitle.TextXAlignment = Enum.TextXAlignment.Left
settingsTitle.ZIndex = 51
settingsTitle.Parent = settingsPanel
local settingsClose = Instance.new("TextButton")
settingsClose.Size = UDim2.fromOffset(45, 45)
settingsClose.Position = UDim2.new(1, -50, 0, 5)
settingsClose.BackgroundTransparency = 1
settingsClose.Text = "×"
settingsClose.TextColor3 = Color3.fromRGB(190, 190, 195)
settingsClose.TextSize = 25
settingsClose.Font = Enum.Font.Gotham
settingsClose.ZIndex = 52
settingsClose.Parent = settingsPanel
-- Scale
local scaleLabel = Instance.new("TextLabel")
scaleLabel.Size = UDim2.new(1, -30, 0, 35)
scaleLabel.Position = UDim2.fromOffset(15, 60)
scaleLabel.BackgroundTransparency = 1
scaleLabel.TextColor3 = Color3.fromRGB(215, 215, 220)
scaleLabel.TextSize = 14
scaleLabel.Font = Enum.Font.Gotham
scaleLabel.TextXAlignment = Enum.TextXAlignment.Left
scaleLabel.ZIndex = 51
scaleLabel.Parent = settingsPanel
local scaleMinus = Instance.new("TextButton")
scaleMinus.Size = UDim2.fromOffset(45, 35)
scaleMinus.Position = UDim2.fromOffset(15, 95)
scaleMinus.BackgroundColor3 = accentColor
scaleMinus.BorderSizePixel = 0
scaleMinus.Text = "−"
scaleMinus.TextColor3 = Color3.fromRGB(235, 235, 240)
scaleMinus.TextSize = 20
scaleMinus.ZIndex = 51
scaleMinus.Parent = settingsPanel
Instance.new("UICorner", scaleMinus).CornerRadius = UDim.new(0, 9)
local scalePlus = Instance.new("TextButton")
scalePlus.Size = UDim2.fromOffset(45, 35)
scalePlus.Position = UDim2.fromOffset(220, 95)
scalePlus.BackgroundColor3 = accentColor
scalePlus.BorderSizePixel = 0
scalePlus.Text = "+"
scalePlus.TextColor3 = Color3.fromRGB(235, 235, 240)
scalePlus.TextSize = 20
scalePlus.ZIndex = 51
scalePlus.Parent = settingsPanel
Instance.new("UICorner", scalePlus).CornerRadius = UDim.new(0, 9)
-- Transparency
local transparencyLabel = Instance.new("TextLabel")
transparencyLabel.Size = UDim2.new(1, -30, 0, 35)
transparencyLabel.Position = UDim2.fromOffset(15, 140)
transparencyLabel.BackgroundTransparency = 1
transparencyLabel.TextColor3 = Color3.fromRGB(215, 215, 220)
transparencyLabel.TextSize = 14
transparencyLabel.Font = Enum.Font.Gotham
transparencyLabel.TextXAlignment = Enum.TextXAlignment.Left
transparencyLabel.ZIndex = 51
transparencyLabel.Parent = settingsPanel
local transparencyMinus = Instance.new("TextButton")
transparencyMinus.Size = UDim2.fromOffset(45, 35)
transparencyMinus.Position = UDim2.fromOffset(15, 175)
transparencyMinus.BackgroundColor3 = accentColor
transparencyMinus.BorderSizePixel = 0
transparencyMinus.Text = "−"
transparencyMinus.TextColor3 = Color3.fromRGB(235, 235, 240)
transparencyMinus.TextSize = 20
transparencyMinus.ZIndex = 51
transparencyMinus.Parent = settingsPanel
Instance.new("UICorner", transparencyMinus).CornerRadius = UDim.new(0, 9)
local transparencyPlus = Instance.new("TextButton")
transparencyPlus.Size = UDim2.fromOffset(45, 35)
transparencyPlus.Position = UDim2.fromOffset(220, 175)
transparencyPlus.BackgroundColor3 = accentColor
transparencyPlus.BorderSizePixel = 0
transparencyPlus.Text = "+"
transparencyPlus.TextColor3 = Color3.fromRGB(235, 235, 240)
transparencyPlus.TextSize = 20
transparencyPlus.ZIndex = 51
transparencyPlus.Parent = settingsPanel
Instance.new("UICorner", transparencyPlus).CornerRadius = UDim.new(0, 9)
--//==================================================
--// QUICK STATUS
--//==================================================
local function updateQuickToggle()
if quickSentencesEnabled then
quickToggle.Text = "QUICK • ON"
quickToggle.BackgroundColor3 = accentColor
else
quickToggle.Text = "QUICK • OFF"
quickToggle.BackgroundColor3 = Color3.fromRGB(34, 34, 40)
end
end
local function updateSettingsLabels()
scaleLabel.Text = "UI SCALE • " .. string.format("%.1f", uiScale)
transparencyLabel.Text = "TRANSPARENCY • " ..
math.floor(transparency * 100) .. "%"
end
--//==================================================
--// MAIN DRAG FUNCTION
--//==================================================
local function makeDraggable(object, dragArea)
local dragging = false
local dragStart
local startPosition
dragArea.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPosition = object.Position
end
end)
UserInputService.InputChanged:Connect(function(input)
if not dragging then
return
end
if input.UserInputType ~= Enum.UserInputType.MouseMovement
and input.UserInputType ~= Enum.UserInputType.Touch then
return
end
local delta = input.Position - dragStart
object.Position = UDim2.new(
startPosition.X.Scale,
startPosition.X.Offset + delta.X,
startPosition.Y.Scale,
startPosition.Y.Offset + delta.Y
)
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end)
end
makeDraggable(main, header)
makeDraggable(settingsPanel, settingsTitle)
makeDraggable(miniCircle, miniCircle)
--//==================================================
--// FORWARD DECLARATIONS
--//==================================================
local refreshMessages
local refreshQuickMinis
local createQuickMini
--//==================================================
--// DESTROY QUICK DRAG CONNECTIONS
--//==================================================
local function clearQuickDragConnections(frame)
local connections = quickDragConnections[frame]
if connections then
for _, connection in ipairs(connections) do
pcall(function()
connection:Disconnect()
end)
end
end
quickDragConnections[frame] = nil
end
--//==================================================
--// CREATE FLOATING QUICK SENTENCE
--//==================================================
createQuickMini = function(message, index)
if not quickSentencesEnabled then
return
end
if not quickConfig[message] then
local x, y = getDefaultQuickPosition(index)
quickConfig[message] = {
x = x,
y = y,
locked = false
}
saveSettings()
end
local config = quickConfig[message]
local frame = Instance.new("Frame")
frame.Name = "Quick_" .. tostring(index)
frame.Size = UDim2.fromOffset(240, 42)
frame.Position = UDim2.fromOffset(
config.x or 10,
config.y or 120
)
frame.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
frame.BackgroundTransparency = math.clamp(transparency, 0, 0.7)
frame.BorderSizePixel = 0
frame.Active = true
frame.ZIndex = 30
frame.Parent = gui
Instance.new("UICorner", frame).CornerRadius = UDim.new(0, 12)
quickFrames[message] = frame
-- Sentence button
local sendButton = Instance.new("TextButton")
sendButton.Size = UDim2.new(1, -76, 1, 0)
sendButton.Position = UDim2.fromOffset(0, 0)
sendButton.BackgroundTransparency = 1
sendButton.Text = message
sendButton.TextColor3 = Color3.fromRGB(235, 235, 240)
sendButton.TextSize = 13
sendButton.Font = Enum.Font.GothamMedium
sendButton.TextTruncate = Enum.TextTruncate.AtEnd
sendButton.TextXAlignment = Enum.TextXAlignment.Left
sendButton.ZIndex = 31
sendButton.Parent = frame
local textPadding = Instance.new("UIPadding")
textPadding.PaddingLeft = UDim.new(0, 12)
textPadding.PaddingRight = UDim.new(0, 5)
textPadding.Parent = sendButton
-- Lock
local lockButton = Instance.new("TextButton")
lockButton.Size = UDim2.fromOffset(35, 34)
lockButton.Position = UDim2.new(1, -70, 0, 4)
lockButton.BackgroundColor3 = Color3.fromRGB(48, 48, 55)
lockButton.BackgroundTransparency = transparency
lockButton.BorderSizePixel = 0
lockButton.Text = config.locked and "🔒" or "🔓"
lockButton.TextColor3 = Color3.fromRGB(230, 230, 235)
lockButton.TextSize = 14
lockButton.Font = Enum.Font.Gotham
lockButton.ZIndex = 32
lockButton.Parent = frame
Instance.new("UICorner", lockButton).CornerRadius = UDim.new(0, 9)
-- Remove floating button
local removeButton = Instance.new("TextButton")
removeButton.Size = UDim2.fromOffset(35, 34)
removeButton.Position = UDim2.new(1, -35, 0, 4)
removeButton.BackgroundColor3 = Color3.fromRGB(48, 48, 55)
removeButton.BackgroundTransparency = transparency
removeButton.BorderSizePixel = 0
removeButton.Text = "×"
removeButton.TextColor3 = Color3.fromRGB(235, 80, 80)
removeButton.TextSize = 19
removeButton.Font = Enum.Font.GothamBold
removeButton.ZIndex = 32
removeButton.Parent = frame
Instance.new("UICorner", removeButton).CornerRadius = UDim.new(0, 9)
-- Send
sendButton.Activated:Connect(function()
sendMessage(message)
end)
-- Lock/unlock
lockButton.Activated:Connect(function()
config.locked = not config.locked
if config.locked then
lockButton.Text = "🔒"
else
lockButton.Text = "🔓"
end
saveSettings()
end)
-- Remove floating version only
removeButton.Activated:Connect(function()
quickConfig[message] = nil
clearQuickDragConnections(frame)
quickFrames[message] = nil
frame:Destroy()
saveSettings()
end)
--==================================================
-- DRAGGING
--==================================================
local dragging = false
local dragInput = nil
local dragStart = nil
local startPosition = nil
local c1 = sendButton.InputBegan:Connect(function(input)
if config.locked then
return
end
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPosition = frame.Position
end
end)
local c2 = sendButton.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch then
dragInput = input
end
end)
local c3 = UserInputService.InputChanged:Connect(function(input)
if not dragging then
return
end
if input ~= dragInput then
return
end
local delta = input.Position - dragStart
local newX = startPosition.X.Offset + delta.X
local newY = startPosition.Y.Offset + delta.Y
newX, newY = clampQuickPosition(frame, newX, newY)
frame.Position = UDim2.fromOffset(newX, newY)
end)
local c4 = UserInputService.InputEnded:Connect(function(input)
if not dragging then
return
end
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
config.x = frame.Position.X.Offset
config.y = frame.Position.Y.Offset
saveSettings()
end
end)
quickDragConnections[frame] = {
c1,
c2,
c3,
c4
}
end
--//==================================================
--// REFRESH ALL FLOATING QUICK SENTENCES
--//==================================================
refreshQuickMinis = function()
-- Remove old floating buttons
for message, frame in pairs(quickFrames) do
clearQuickDragConnections(frame)
if frame then
frame:Destroy()
end
quickFrames[message] = nil
end
if not quickSentencesEnabled then
return
end
local seen = {}
local index = 0
for _, message in ipairs(messages) do
if quickConfig[message] and not seen[message] then
seen[message] = true
index += 1
createQuickMini(message, index)
end
end
end
--//==================================================
--// REFRESH SAVED MESSAGE LIST
--//==================================================
refreshMessages = function()
for _, child in ipairs(messageScroll:GetChildren()) do
if child:IsA("Frame") then
child:Destroy()
end
end
for index, message in ipairs(messages) do
local row = Instance.new("Frame")
row.Size = UDim2.new(1, -5, 0, 42)
row.BackgroundColor3 = Color3.fromRGB(34, 34, 40)
row.BackgroundTransparency = transparency
row.BorderSizePixel = 0
row.LayoutOrder = index
row.ZIndex = 12
row.Parent = messageScroll
Instance.new("UICorner", row).CornerRadius = UDim.new(0, 11)
-- Sentence
local messageButton = Instance.new("TextButton")
messageButton.Size = UDim2.new(1, -72, 1, 0)
messageButton.Position = UDim2.fromOffset(0, 0)
messageButton.BackgroundTransparency = 1
messageButton.Text = message
messageButton.TextColor3 = Color3.fromRGB(225, 225, 230)
messageButton.TextSize = 13
messageButton.Font = Enum.Font.Gotham
messageButton.TextTruncate = Enum.TextTruncate.AtEnd
messageButton.TextXAlignment = Enum.TextXAlignment.Left
messageButton.ZIndex = 13
messageButton.Parent = row
local messagePadding = Instance.new("UIPadding")
messagePadding.PaddingLeft = UDim.new(0, 12)
messagePadding.PaddingRight = UDim.new(0, 5)
messagePadding.Parent = messageButton
-- FAST / QUICK BUTTON
local quickButton = Instance.new("TextButton")
quickButton.Size = UDim2.fromOffset(32, 32)
quickButton.Position = UDim2.new(1, -67, 0, 5)
quickButton.BackgroundColor3 = accentColor
quickButton.BackgroundTransparency = transparency
quickButton.BorderSizePixel = 0
quickButton.Text = "⚡"
quickButton.TextColor3 = Color3.fromRGB(245, 220, 90)
quickButton.TextSize = 17
quickButton.Font = Enum.Font.GothamBold
quickButton.ZIndex = 14
quickButton.Parent = row
Instance.new("UICorner", quickButton).CornerRadius = UDim.new(0, 8)
-- DELETE SAVED SENTENCE
local deleteButton = Instance.new("TextButton")
deleteButton.Size = UDim2.fromOffset(32, 32)
deleteButton.Position = UDim2.new(1, -34, 0, 5)
deleteButton.BackgroundColor3 = Color3.fromRGB(48, 48, 55)
deleteButton.BackgroundTransparency = transparency
deleteButton.BorderSizePixel = 0
deleteButton.Text = "×"
deleteButton.TextColor3 = Color3.fromRGB(235, 80, 80)
deleteButton.TextSize = 18
deleteButton.Font = Enum.Font.GothamBold
deleteButton.ZIndex = 14
deleteButton.Parent = row
Instance.new("UICorner", deleteButton).CornerRadius = UDim.new(0, 8)
-- Send normally
messageButton.Activated:Connect(function()
sendMessage(message)
end)
-- Create floating quick sentence
quickButton.Activated:Connect(function()
if quickConfig[message] then
-- Already exists: just make sure it is visible
quickSentencesEnabled = true
updateQuickToggle()
refreshQuickMinis()
saveSettings()
return
end
local x, y = getDefaultQuickPosition(index)
quickConfig[message] = {
x = x,
y = y,
locked = false
}
quickSentencesEnabled = true
saveSettings()
updateQuickToggle()
refreshQuickMinis()
end)
-- Delete saved sentence
deleteButton.Activated:Connect(function()
-- Also remove its floating version
quickConfig[message] = nil
for i = #messages, 1, -1 do
if messages[i] == message then
table.remove(messages, i)
break
end
end
saveMessages()
saveSettings()
refreshMessages()
refreshQuickMinis()
end)
end
end
--//==================================================
--// ADD SAVED MESSAGE
--//==================================================
local function addMessage()
local text = inputBox.Text
if not text or text == "" then
return
end
text = text:gsub("^%s+", "")
text = text:gsub("%s+$", "")
if text == "" then
return
end
table.insert(messages, text)
inputBox.Text = ""
saveMessages()
refreshMessages()
end
--//==================================================
--// ADD BUTTON
--//==================================================
addButton.Activated:Connect(function()
addMessage()
end)
inputBox.FocusLost:Connect(function(enterPressed)
if enterPressed then
addMessage()
end
end)
--//==================================================
--// QUICK TOGGLE
--//==================================================
quickToggle.Activated:Connect(function()
quickSentencesEnabled = not quickSentencesEnabled
updateQuickToggle()
saveSettings()
refreshQuickMinis()
end)
--//==================================================
--// AUTO RANDOM
--//==================================================
autoButton.Activated:Connect(function()
autoRandomEnabled = not autoRandomEnabled
if autoRandomEnabled then
autoButton.Text = "AUTO RANDOM • ON"
autoButton.BackgroundColor3 = accentColor
else
autoButton.Text = "AUTO RANDOM • OFF"
autoButton.BackgroundColor3 = Color3.fromRGB(34, 34, 40)
end
end)
task.spawn(function()
while gui.Parent do
task.wait(AUTO_RANDOM_DELAY)
if autoRandomEnabled and #messages > 0 then
local randomIndex
if #messages == 1 then
randomIndex = 1
else
repeat
randomIndex = math.random(1, #messages)
until randomIndex ~= lastRandomIndex
end
lastRandomIndex = randomIndex
sendMessage(messages[randomIndex])
end
end
end)
--//==================================================
--// SETTINGS
--//==================================================
settingsButton.Activated:Connect(function()
settingsPanel.Visible = not settingsPanel.Visible
end)
settingsClose.Activated:Connect(function()
settingsPanel.Visible = false
end)
scaleMinus.Activated:Connect(function()
uiScale = math.clamp(uiScale - 0.1, 0.7, 1.4)
saveSettings()
updateSettingsLabels()
gui:FindFirstChildOfClass("UIScale").Scale = uiScale
end)
scalePlus.Activated:Connect(function()
uiScale = math.clamp(uiScale + 0.1, 0.7, 1.4)
saveSettings()
updateSettingsLabels()
gui:FindFirstChildOfClass("UIScale").Scale = uiScale
end)
transparencyMinus.Activated:Connect(function()
transparency = math.clamp(transparency - 0.05, 0, 0.7)
saveSettings()
updateSettingsLabels()
main.BackgroundTransparency = transparency
settingsPanel.BackgroundTransparency = transparency
inputBox.BackgroundTransparency = transparency
quickToggle.BackgroundTransparency = transparency
autoButton.BackgroundTransparency = transparency
addButton.BackgroundTransparency = transparency
miniCircle.BackgroundTransparency = transparency
refreshMessages()
refreshQuickMinis()
end)
transparencyPlus.Activated:Connect(function()
transparency = math.clamp(transparency + 0.05, 0, 0.7)
saveSettings()
updateSettingsLabels()
main.BackgroundTransparency = transparency
settingsPanel.BackgroundTransparency = transparency
inputBox.BackgroundTransparency = transparency
quickToggle.BackgroundTransparency = transparency
autoButton.BackgroundTransparency = transparency
addButton.BackgroundTransparency = transparency
miniCircle.BackgroundTransparency = transparency
refreshMessages()
refreshQuickMinis()
end)
--//==================================================
--// MINIMIZE MAIN UI
--//==================================================
minimizeButton.Activated:Connect(function()
main.Visible = false
settingsPanel.Visible = false
miniCircle.Visible = true
end)
miniCircle.Activated:Connect(function()
main.Visible = true
miniCircle.Visible = false
end)
--//==================================================
--// UISCALE
--//==================================================
local uiScaleObject = Instance.new("UIScale")
uiScaleObject.Scale = uiScale
uiScaleObject.Parent = gui
--//==================================================
--// INITIALIZE
--//==================================================
updateQuickToggle()
updateSettingsLabels()
refreshMessages()
refreshQuickMinis()No comments yet for this script.



