GAME TRACKER HUB
Masuk untuk mengakses dashboard
MASUK
Loading...
C
ETFB
GAG 2
Scripts
Refresh
Logout
Global Items
—
Hidden:
Daftar Akun
Online
0
Offline
0
Total
0
Detail Akun
Pilih akun
—
✕
Popup Logs
Semua Log
Hanya DUPED
Selain Duped
Clear
Daftar Akun
Online
0
Offline
0
Total
0
Detail Akun
Pilih akun dulu
—
✕
Global Items
—
Hidden:
Popup Logs
Semua Log
Hanya DUPED
Selain Duped
Clear
Plaza Live Logs
Clear
Global Items
—
Hidden:
Daftar Akun
Online
0
Offline
0
Total
0
Detail Akun
Pilih akun
—
✕
Daftar Akun
Online
0
Offline
0
Total
0
Detail Akun
Pilih akun dulu
—
✕
Global Items
—
Hidden:
Bot Scripts
Script Tracker (Farming Bot)
Copy Tracker
-- ===================================================================== -- CATHLEEN PRO TRACKER - ETFB (Escape Tsunami Farming Bot) -- ===================================================================== local SUPABASE_URL = "https://kojfzfblyueopjzrzdil.supabase.co" local SUPABASE_KEY = "sb_publishable_mOB4oa0BTuTlnAOoE0iLOA_GMa7sfxX" local HttpService = game:GetService("HttpService") local Players = game:GetService("Players") local LocalPlayer = Players.LocalPlayer local UPDATE_INTERVAL = 60 local Mutations = { "Blood","Crimson","Diamond","Electric","Gold","Emerald","Radioactive", "Admin","UFO","Hacker","Lucky","Money","Gamer","Candy","Doom","Fire", "Ice","Phantom","Shamrock","Showtime","Eggsplosion","Tidal","Miner" } local request_func = (syn and syn.request) or (http and http.request) or http_request or (Fluxus and Fluxus.request) or (request) local function cleanName(name) for _, mut in ipairs(Mutations) do name = name:gsub("^" .. mut .. "%s+", ""):gsub("%s+" .. mut .. "$" , "") end return name:match("^%s*(.-)%s*$") end local function getInventory() local bp = LocalPlayer:FindFirstChild("Backpack") if not bp then return "Kosong" end local counts = {} for _, item in ipairs(bp:GetChildren()) do if item:IsA("Tool") or item:IsA("Model") then local rawName = item:GetAttribute("DisplayName") or item.Name local name = cleanName(rawName) if name:find("Lucky Block") then name = "Lucky Block" end counts[name] = (counts[name] or 0) + 1 end end local list = {} for n, c in pairs(counts) do table.insert(list, n .. " (" .. c .. ")") end table.sort(list) return #list > 0 and table.concat(list, "\n") or "Kosong" end local function sendTrackerLog(message) if not request_func then return end pcall(function() request_func({ Url = SUPABASE_URL .. "/rest/v1/tracker_logs", Method = "POST", Headers = { ["apikey"] = SUPABASE_KEY, ["Authorization"] = "Bearer " .. SUPABASE_KEY, ["Content-Type"] = "application/json", ["Prefer"] = "return=minimal" }, Body = HttpService:JSONEncode({ username = LocalPlayer.Name, message = tostring(message) }) }) end) end local function anyToString(val) if val == nil then return "nil" end local t = type(val) if t == "string" then return val end if t == "number" or t == "boolean" then return tostring(val) end if t == "table" then local msg = val.message or val.Message or val.text or val.Text or val.msg or val.Msg or val.content or val.Content if msg then return tostring(msg) end local parts = {} for k, v in pairs(val) do table.insert(parts, tostring(k) .. "=" .. tostring(v)) end return "{" .. table.concat(parts, ", ") .. "}" end return tostring(val) end local function hookDisplayPopup() local ok, remote = pcall(function() return game:GetService("ReplicatedStorage") :WaitForChild("Shared", 10) :WaitForChild("Remotes", 10) :WaitForChild("Networking", 10) :WaitForChild("RE/Misc/DisplayPopup", 10) end) if not ok or not remote then warn("[CathleenTracker] RE/Misc/DisplayPopup not found!"); return end print("[CathleenTracker] Hooked DisplayPopup ✅") remote.OnClientEvent:Connect(function(...) local args = {...} local parts = {} for i, v in ipairs(args) do table.insert(parts, anyToString(v)) end local fullMsg = table.concat(parts, " | ") if fullMsg == "" then return end if not fullMsg:match("^Info") then return end sendTrackerLog(fullMsg) print("[CathleenTracker] Popup: " .. fullMsg) end) end local function sendData() local money = LocalPlayer:FindFirstChild("leaderstats") and ( LocalPlayer.leaderstats:FindFirstChild("MoneyBags") or LocalPlayer.leaderstats:FindFirstChild("Money") or LocalPlayer.leaderstats:FindFirstChild("Cash") ) local moneyVal = money and tostring(money.Value) or "0" local slot = "N/A" for _, v in ipairs(LocalPlayer.PlayerGui:GetDescendants()) do if v:IsA("TextLabel") and v.Text:match("%d+/%d+") then local _, max = v.Text:match("(%d+)/(%d+)") if max and tonumber(max) >= 80 then slot = v.Text; break end end end local inv = getInventory() if request_func then request_func({ Url = SUPABASE_URL .. "/rest/v1/player_stats", Method = "POST", Headers = { ["apikey"] = SUPABASE_KEY, ["Authorization"] = "Bearer " .. SUPABASE_KEY, ["Content-Type"] = "application/json", ["Prefer"] = "resolution=merge-duplicates" }, Body = HttpService:JSONEncode({ username = LocalPlayer.Name, money = moneyVal, slot_tas = slot, isi_tas = inv, last_update = os.date("!%Y-%m-%dT%H:%M:%SZ") }) }) end end task.spawn(function() print("✅ Cathleen ETFB Tracker Active!") pcall(hookDisplayPopup) while true do pcall(sendData) task.wait(UPDATE_INTERVAL) end end)
Script Plaza (Auto Booth + Auto Restock - v18)
Copy Plaza
-- // ============================================ \\ -- -- // AUTO BOOTH + AUTO LISTING \\ -- -- // ============================================ \\ -- local Players = game:GetService("Players") local ReplicatedStorage = game:GetService("ReplicatedStorage") local HttpService = game:GetService("HttpService") local Player = Players.LocalPlayer local BoothsFolder = workspace.GameObjects.Booths local Networking = ReplicatedStorage.Shared.Remotes.Networking -- // BOOTH CONFIG \\ -- local CLAIM_REMOTE = Networking:WaitForChild("RF/ClaimBooth") local SHUFFLE_REMOTE = Networking:WaitForChild("RE/TradingBooths/ShuffleTeleport") local SCAN_DELAY = 3 local PORTAL_POSITION = Vector3.new(-1234.20, 0, -82.36) -- // LISTING CONFIG \\ -- local SUPABASE_URL = "https://kojfzfblyueopjzrzdil.supabase.co/rest/v1" local SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImtvamZ6ZmJseXVlb3BqenJ6ZGlsIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc3NjczMzQyNywiZXhwIjoyMDkyMzA5NDI3fQ.w21A6H88GOAzDVxIYuPl_RjU6bTMYQYUusJO9aX9LgI" local DISCORD_WEBHOOK = "https://webhook-cathy.vercel.app/api/webhooks/1496693380493869108/d_Asq17-cDNSzPyH6k3IIpiSfWpSpWBKXOyn5aY4GMmwnfIhQPvNHF2AV_yaOjHrJ03l" local TokenPath = Player:WaitForChild("leaderstats"):WaitForChild("Trade Tokens") local RemoteRestock = Networking:WaitForChild("RF/ListBoothOffering") -- // STATE \\ -- local claimed = false local isSyncing = false local lastTokenValue = tonumber((string.gsub(tostring(TokenPath.Value), "[^%d.-]", ""))) or 0 local LIVE_PRICE = nil local ITEM_PRICES = {} local lastPurchaseTime = tick() local IDLE_TIMEOUT = 45 * 60 -- ============================================ \\ -- BOOTH FUNCTIONS \\ -- ============================================ \\ local function getOwnerText(boothModel) local info = boothModel:FindFirstChild("Info") if not info then return nil end local gui = info:FindFirstChild("SurfaceGui") if not gui then return nil end local frame = gui:FindFirstChild("Frame") if not frame then return nil end local owner = frame:FindFirstChild("Owner") if not owner then return nil end return owner.Text end local function isUnclaimed(ownerText) return ownerText == "Unclaimed Booth" end local function getBoothPosition(boothModel) local primary = boothModel.PrimaryPart or boothModel:FindFirstChildWhichIsA("BasePart") if primary then return primary.Position end return nil end local function classifyBooth(pos) local zDiff = pos.Z - PORTAL_POSITION.Z local side = zDiff < 0 and "Kiri" or "Kanan" local level = pos.Y > -22 and "Atas" or "Bawah" return side, level end local function findNearestBooths() local booths = {} for _, booth in pairs(BoothsFolder:GetChildren()) do local pos = getBoothPosition(booth) if pos then local dist = (Vector3.new(pos.X, 0, pos.Z) - Vector3.new(PORTAL_POSITION.X, 0, PORTAL_POSITION.Z)).Magnitude local side, level = classifyBooth(pos) local ownerText = getOwnerText(booth) or "Unknown" table.insert(booths, { model = booth, name = booth.Name, pos = pos, dist = dist, side = side, level = level, owner = ownerText, isFree = isUnclaimed(ownerText) }) end end table.sort(booths, function(a, b) return a.dist < b.dist end) local nearest = {} for i = 1, math.min(4, #booths) do table.insert(nearest, booths[i]) end return nearest end local function tryClaim() if claimed then return end local nearestBooths = findNearestBooths() print("[AutoBooth] Scanning 4 nearest booths to portal...") for _, b in ipairs(nearestBooths) do local status = b.isFree and "FREE" or "TAKEN" print(string.format("[AutoBooth] %s %s | %s | %s | %s", b.side, b.level, b.name:sub(1,8), b.owner, status)) end for _, b in ipairs(nearestBooths) do if b.isFree then local success, result = pcall(function() return CLAIM_REMOTE:InvokeServer(b.name) end) if success then print("[AutoBooth] Claimed: " .. b.side .. " " .. b.level .. " | UUID: " .. b.name) claimed = true task.spawn(function() task.wait(2) local char = Player.Character or Player.CharacterAdded:Wait() local hum = char and char:FindFirstChildOfClass("Humanoid") if hum then hum.Health = 0 print("[AutoBooth] Respawning to spawn near booth...") local newChar = Player.CharacterAdded:Wait() local newHum = newChar:WaitForChild("Humanoid", 10) if newHum then task.wait(4) local bp = Player:FindFirstChild("Backpack") local brainrot = nil if bp then for _, item in pairs(bp:GetChildren()) do if item:GetAttribute("BrainrotName") then brainrot = item break end end end if brainrot then brainrot.Parent = newChar print("[AutoBooth] Equipped brainrot: " .. brainrot.Name) else print("[AutoBooth] No brainrot found, listing first...") end local newRoot = newChar:FindFirstChild("HumanoidRootPart") if newRoot then newRoot.Anchored = true print("[AutoBooth] Character anchored at booth") end end end end) return true else warn("[AutoBooth] Failed to claim " .. b.side .. " " .. b.level .. " | Error: " .. tostring(result)) end end end return false end local function shuffleServer() print("[AutoBooth] All 4 booths claimed, shuffling server...") pcall(function() SHUFFLE_REMOTE:FireServer() end) end -- ============================================ \\ -- LISTING FUNCTIONS \\ -- ============================================ \\ local function pushDiscord(title, desc, color) task.spawn(function() local request = (syn and syn.request) or (http and http.request) or http_request or request local success, res = pcall(function() return request({ Url = DISCORD_WEBHOOK, Method = "POST", Headers = { ["Content-Type"] = "application/json" }, Body = HttpService:JSONEncode({ embeds = {{ title = title, description = desc, color = color or 1752220, footer = { text = "Cathleen Plaza • " .. os.date("%H:%M:%S") } }} }) }) end) if not success then warn("Discord Script Error: " .. tostring(res)) elseif res and res.StatusCode ~= 200 and res.StatusCode ~= 204 then warn("Discord Webhook Ditolak (" .. tostring(res.StatusCode) .. "): " .. tostring(res.Body)) end end) end local function getPureName(item) local n = item:GetAttribute("DisplayName") or item:GetAttribute("ItemName") or item.Name local mutations = { "Blood", "Crimson", "Diamond", "Electric", "Gold", "Emerald", "Radioactive", "Admin", "UFO", "Hacker", "Lucky", "Money", "Gamer", "Candy", "Doom", "Fire", "Ice", "Phantom", "Shamrock", "Showtime", "Eggsplosion", "Tidal", "Miner" } for _, m in pairs(mutations) do n = n:gsub(m .. "%s*", "") end return n:gsub("Lv%.%d+", ""):gsub("^%s+", ""):gsub("%s+$", "") end local function doRequest(method, endpoint, body, extraHeaders) local request = (syn and syn.request) or (http and http.request) or http_request or request local headers = { ["apikey"] = SUPABASE_KEY, ["Authorization"] = "Bearer " .. SUPABASE_KEY, ["Content-Type"] = "application/json", ["Prefer"] = "return=representation" } if extraHeaders then for k, v in pairs(extraHeaders) do headers[k] = v end end local success, res = pcall(function() return request({ Url = SUPABASE_URL .. endpoint, Method = method, Headers = headers, Body = body and HttpService:JSONEncode(body) or nil }) end) if not success then warn("Supabase Request Error:", res) return false, nil elseif res and res.StatusCode >= 400 then warn("Supabase API Error: " .. tostring(res.Body)) end return success, res end local function pushLog(msg) task.spawn(function() doRequest("POST", "/plaza_logs", { ["bot_name"] = Player.Name, ["message"] = msg }) end) end local function pushPlazaData() if isSyncing then return end isSyncing = true task.spawn(function() local currentTokens = tostring(TokenPath.Value) local counts = {} for _, v in pairs(Player.Backpack:GetChildren()) do local name = getPureName(v) if #name > 2 then counts[name] = (counts[name] or 0) + 1 end end local inv = "" for n, c in pairs(counts) do inv = inv .. n .. " (" .. c .. ")\n" end if inv == "" then inv = "Empty Bag" end local body = { ["username"] = Player.Name, ["tokens"] = currentTokens, ["isi_tas"] = inv, ["last_update"] = "now()" } local ok, res = doRequest("GET", "/plaza_stats?username=eq." .. Player.Name .. "&select=username", nil) if ok and res then pcall(function() local data = HttpService:JSONDecode(res.Body) if data and #data > 0 then doRequest("PATCH", "/plaza_stats?username=eq." .. Player.Name, body) else doRequest("POST", "/plaza_stats", body) end end) end isSyncing = false print("[AutoListing] Plaza Synced! Tokens: " .. currentTokens) end) end local function fetchPrices() local ok, res = doRequest("GET", "/plaza_stats?username=eq." .. Player.Name .. "&select=target_price,item_prices", nil) if ok and res and res.StatusCode == 200 then pcall(function() local data = HttpService:JSONDecode(res.Body) if data[1] then if data[1].target_price then LIVE_PRICE = tonumber(data[1].target_price) end if data[1].item_prices then local ip = data[1].item_prices if type(ip) == "string" then local s, parsed = pcall(function() return HttpService:JSONDecode(ip) end); if s then ip = parsed end end if type(ip) == "table" then ITEM_PRICES = ip end else ITEM_PRICES = {} end end end) end end local function autoRestock() if not LIVE_PRICE then return end local bp = Player:FindFirstChild("Backpack") if not bp then return end for _, item in pairs(bp:GetChildren()) do local id = item:GetAttribute("UUID") or item.Name local name = getPureName(item) local finalPrice = LIVE_PRICE if ITEM_PRICES and ITEM_PRICES[name] then finalPrice = tonumber(ITEM_PRICES[name]) or LIVE_PRICE end pcall(function() RemoteRestock:InvokeServer(id, finalPrice) end) task.wait(0.5) end end -- ============================================ \\ -- MAIN FLOW \\ -- ============================================ \\ local function boothPhase() print("[AutoBooth] Auto Select Booth started!") print("[AutoBooth] Target: 4 booths nearest to portal") while not claimed do local success = tryClaim() if not success and not claimed then shuffleServer() end task.wait(SCAN_DELAY) end print("[AutoBooth] Booth claimed successfully!") end local function listingPhase() print("[AutoListing] Starting auto listing...") task.spawn(function() while true do fetchPrices() task.wait(10) end end) task.spawn(function() while true do if claimed then autoRestock() end task.wait(5) end end) TokenPath:GetPropertyChangedSignal("Value"):Connect(function() local rawNewVal = TokenPath.Value local newValNum = tonumber((string.gsub(tostring(rawNewVal), "[^%d.-]", ""))) or 0 local diff = newValNum - lastTokenValue lastTokenValue = newValNum if diff == 0 then return end local arah = diff > 0 and "+" or "" local msg = "Token " .. arah .. tostring(diff) .. " | Total: " .. tostring(newValNum) pushLog(msg) if diff > 0 then lastPurchaseTime = tick() pushDiscord("ADA YANG BELI! — " .. Player.Name, "**+" .. tostring(diff) .. " tokens**\nTotal: **" .. tostring(newValNum) .. "**", 1752220) end task.spawn(function() task.wait(0.5) pushPlazaData() end) print("[AutoListing] Token changed! " .. arah .. tostring(diff)) end) task.spawn(function() while true do pushPlazaData() task.wait(30) end end) task.spawn(function() while true do task.wait(60) if claimed and (tick() - lastPurchaseTime) >= IDLE_TIMEOUT then pushLog("Idle 45 menit tanpa pembeli — shuffle server") print("[AutoListing] Idle timeout, shuffling server...") claimed = false pcall(function() SHUFFLE_REMOTE:FireServer() end) task.wait(5) boothPhase() lastPurchaseTime = tick() end end end) task.wait(2) pushPlazaData() pushLog("Bot online: " .. Player.Name) print("[AutoListing] Plaza Hub v18 (Auto Booth + Listing) Loaded!") end -- // START \\ -- boothPhase() listingPhase()
Script Tracker (GAG 2 Bot)
Copy Tracker
-- ===================================================================== -- CATHLEEN PRO TRACKER - GAG 2 (Grow a Garden 2) -- Tested: GameId 97598239454123 -- ===================================================================== local SUPABASE_URL = "https://kojfzfblyueopjzrzdil.supabase.co" local SUPABASE_KEY = "sb_publishable_mOB4oa0BTuTlnAOoE0iLOA_GMa7sfxX" local HttpService = game:GetService("HttpService") local Players = game:GetService("Players") local LocalPlayer = Players.LocalPlayer local UPDATE_INTERVAL = 60 -- Whitelist valid seed names (GAG 2) _G.GAG_PET_CACHE = _G.GAG_PET_CACHE or {} local VALID_SEEDS = { ["Carrot"]=true, ["Strawberry"]=true, ["Blueberry"]=true, ["Tulip"]=true, ["Tomato"]=true, ["Apple"]=true, ["Bamboo"]=true, ["Corn"]=true, ["Cactus"]=true, ["Pineapple"]=true, ["Mushroom"]=true, ["Green Bean"]=true, ["Banana"]=true, ["Grape"]=true, ["Coconut"]=true, ["Mango"]=true, ["Dragon Fruit"]=true, ["Acorn"]=true, ["Cherry"]=true, ["Sunflower"]=true, ["Venus Fly Trap"]=true, ["Pomegranate"]=true, ["Poison Apple"]=true, ["Moon Bloom"]=true, ["Dragon's Breath"]=true, ["Ghost Pepper"]=true, ["Poison Ivy"]=true, ["Baby Cactus"]=true, ["Glow Mushroom"]=true, ["Romanesco"]=true, ["Horned Melon"]=true, } -- Auto-generate "X Seed" variants for n in pairs(VALID_SEEDS) do VALID_SEEDS[n .. " Seed"] = true end local function trim(s) return (s or ""):match("^%s*(.-)%s*$") end local function formatList(tbl) local parts = {} for name, qty in pairs(tbl) do if qty > 0 then table.insert(parts, name .. " (" .. qty .. ")") end end return table.concat(parts, ", ") end local function collectData() -- Money: leaderstats.Sheckles local money = "0" local ls = LocalPlayer:FindFirstChild("leaderstats") if ls then local sh = ls:FindFirstChild("Sheckles") if sh then money = tostring(sh.Value) end end local pgui = LocalPlayer:WaitForChild("PlayerGui") local petCount = {} local seedCount = {} -- PET: server replica Inventory.Pets (UUID → {Name, Id, ...}) -- Fallback: LP.Backpack + LP.Character tools with attribute("Pet") local ReplicatedStorage = game:GetService("ReplicatedStorage") local PlayerStateClient = require(ReplicatedStorage:WaitForChild("ClientModules"):WaitForChild("PlayerStateClient")) local replica = PlayerStateClient:GetLocalReplica() if replica and not replica.Data then for _ = 1, 30 do if replica.Data then break end wait(0.5) end end local inv = replica and replica.Data and replica.Data.Inventory if inv and type(inv.Pets) == "table" and next(inv.Pets) then for petId, petData in pairs(inv.Pets) do if type(petData) == "table" then local name = petData.Name or petData.Species if type(name) == "string" and name ~= "" then petCount[name] = (petCount[name] or 0) + 1 end end end else -- Fallback: scan tools for attribute("Pet") local function scanToolsForPet(container) if not container then return end for _, tool in pairs(container:GetChildren()) do if tool:IsA("Tool") and tool:GetAttribute("Pet") then local n = tool:GetAttribute("Pet") if type(n) == "string" and n ~= "" then petCount[n] = (petCount[n] or 0) + 1 end end end end scanToolsForPet(LocalPlayer:FindFirstChild("Backpack")) scanToolsForPet(LocalPlayer.Character) end -- SEED: Inventory.Seeds + tools with attribute("SeedTool") or attribute("Fruit") if inv and type(inv.Seeds) == "table" then for name, count in pairs(inv.Seeds) do if type(name) == "string" and type(count) == "number" and count > 0 then local clean = name:gsub(" Seed$", "") if VALID_SEEDS[clean] then seedCount[clean] = (seedCount[clean] or 0) + count end end end end local function scanContainer(container) if not container then return end for _, tool in pairs(container:GetChildren()) do if tool:IsA("Tool") then local n = nil if tool:GetAttribute("SeedTool") then n = tool:GetAttribute("SeedTool") elseif tool:GetAttribute("Fruit") then n = tool:GetAttribute("Fruit") end if type(n) == "string" and n ~= "" then local clean = n:gsub(" Seed$", "") if VALID_SEEDS[clean] then seedCount[clean] = (seedCount[clean] or 0) + 1 end end end end end scanContainer(LocalPlayer:FindFirstChild("Backpack")) scanContainer(LocalPlayer.Character) return money, formatList(petCount), formatList(seedCount) end -- DEBUG: print scan result local function debugDump() local _, pet, seed = collectData() local cacheSize = 0 for _ in pairs(_G.GAG_PET_CACHE or {}) do cacheSize = cacheSize + 1 end print(string.format("[CATHLEEN-GAG2] DEBUG pet=%s | seed=%s | pet_cache=%d", pet, seed, cacheSize)) end local function push() local money, pet, seed = collectData() local username = LocalPlayer.Name local body = HttpService:JSONEncode({ username = username, money = money, pet = (pet ~= "" and pet) or "Kosong", seed = (seed ~= "" and seed) or "Kosong", last_update = "now()" }) local headers = { ["apikey"] = SUPABASE_KEY, ["Authorization"] = "Bearer " .. SUPABASE_KEY, ["Prefer"] = "resolution=merge-duplicates", ["Content-Type"] = "application/json" } local ok, err if HttpService and HttpService.PostAsync then ok, err = pcall(function() HttpService:PostAsync( SUPABASE_URL .. "/rest/v1/gag_player_stats?on_conflict=username", body, Enum.HttpContentType.ApplicationJson, false, headers ) end) end if not ok and request then ok, err = pcall(function() request({ Url = SUPABASE_URL .. "/rest/v1/gag_player_stats?on_conflict=username", Method = "POST", Body = body, Headers = headers }) end) end if not ok and syn and syn.request then ok, err = pcall(function() syn.request({ Url = SUPABASE_URL .. "/rest/v1/gag_player_stats?on_conflict=username", Method = "POST", Body = body, Headers = headers }) end) end if ok then print("[CATHLEEN-GAG2] ✓ Pushed: " .. username .. " | $" .. money) else warn("[CATHLEEN-GAG2] ✗ Push failed: " .. tostring(err)) end end print("[CATHLEEN-GAG2] Tracker started. Update every " .. UPDATE_INTERVAL .. "s.") while true do local ok, err = pcall(push) if not ok then warn("[CATHLEEN-GAG2] Push failed: " .. tostring(err)) end wait(UPDATE_INTERVAL) end