local discord = 'https://discord.gg/gYhqMRBeZV' local Fluent = loadstring(game:HttpGet("https://github.com/dawid-scripts/Fluent/releases/latest/download/main.lua"))() local SaveManager = loadstring(game:HttpGet("https://raw.githubusercontent.com/dawid-scripts/Fluent/master/Addons/SaveManager.lua"))() local InterfaceManager = loadstring(game:HttpGet("https://raw.githubusercontent.com/dawid-scripts/Fluent/master/Addons/InterfaceManager.lua"))() local HTTPs = game:GetService"HttpService"; local Market = game:GetService"MarketplaceService" local pending = {} local allowed = {} local allowed2 = {} local request2 = clonefunction(request) local blockedfunctions = { hookfunction, writefile, makefolder, request, Market.PromptPurchase, Market.PromptGamePassPurchase, Market.PromptBundlePurchase, Market.PromptPremiumPurchase, Market.PromptSubscriptionPurchase, Market.PromptProductPurchase, Market.PerformPurchase, Market.PerformPurchaseV2 } local RBX = game:GetService('RbxAnalyticsService'); local Specific = { RbxAnalyticsService = { RBX.GetClientId, RBX.GetSessionId, RBX.GetPlaySessionId }, Requests = { ['syn_backup.request'] = syn_backup ~= nil and syn_backup.request or nil, ['http_request'] = http_request, ['request'] = request, ['http.request'] = http ~= nil and http.request or nil, ['syn.request'] = syn ~= nil and syn.request or nil, ['fluxus.request'] = fluxus ~= nil and fluxus.request or nil } } local Methods = { RBX = { 'GetClientId', 'GetSessionId', 'GetPlaySessionId' } } local path = 'RoTotal' local SelfWriting, SendAsyncAllowed, SendAsyncBlocked = false, false, false function encode(a) HTTPs:JSONEncode(a) end function decode(a) HTTPs:JSONDecode(a) end function getid(list) for i, v in list do if type(v) == 'number' then return v end end end local functions = { URLMain = function(url) local formatted = url:match("https://.+") or url:match("http://.+") formatted = formatted:split("/")[3] return formatted:gsub("https://", ''):gsub('http://', '') end } function TableLoop(thing, indent) if typeof(thing) ~= 'table' then return tostring(thing) end local result = '{\n' for i, v in pairs(thing) do local key = tostring(i) local value = TableLoop(v, indent + 1) local value2 = '' value2 = (typeof(value) == 'string' and ("'%s'"):format(value)) or (typeof(value) == 'number' and tostring(value)) result = result .. string.rep(' ', indent) .. "['" .. key .. "'] = " .. value2 .. ',\n' end return result .. string.rep(' ', indent - 1) .. "}" end function tocURL(args) local cmd = "curl request " .. args.Method .. " \"" .. args.Url .. "\"" if args.Headers then for key, value in args.Headers do cmd = cmd .. " -H \"" .. key .. ": " .. value .. "\"\n" end end if args.Body then cmd = cmd .. " --data-raw '" .. args.Body .. "'" end return cmd end local Window = Fluent:CreateWindow({ Title = "RoTotal", SubTitle = "by vxsty", TabWidth = 160, Size = UDim2.fromOffset(580, 460), Acrylic = true, Theme = "Dark", MinimizeKey = Enum.KeyCode.LeftControl }) local Tabs = { Socials = Window:AddTab({ Title = "Social", Icon = "globe" }) } local Options = Fluent.Options function Notify(title, text, duration) Fluent:Notify({ Title = title, Content = text, Duration = duration }) end SaveManager:SetLibrary(Fluent) InterfaceManager:SetLibrary(Fluent) Tabs.Socials:AddButton({ Title = "Discord", Description = "Join my discord server", Callback = function() local success, err = pcall(setclipboard, discord) if success then Notify("Success", 'Successfully copied discord invite to clipboard!', 5) else Notify("Error!", 'Failed to copy invite to clipboard, Printed error message.', 5) warn(err) end end }) Tabs.Socials:AddButton({ Title = "Other Scripts", Content = "https://scriptblox.com/u/vxsty", Callback = function() setclipboard("https://scriptblox.com/u/vxsty") end }) local old0, old00, old, old2, old3, old4, old5, old6, old7, old8, old9, old10, old11 -- Namecall HttpPost, Anti chat ban, Abusing filesystem (Adding urls to RoTotal/config.json) old0 = hookfunction(game:GetService("Players").LocalPlayer.Kick, newcclosure(function(Self, message) return Notify("AntiKick", 'Kick attempt denied, Kick Message: ' .. tostring(message), 10) end)) old00 = hookfunction(game:GetService("Players").ReportAbuse, newcclosure(function(Self, message) return Notify("ReportAbuse", 'ReportAbuse attempt denied.', 6) end)) old = hookmetamethod(game, "__namecall", newcclosure(function(Self, ...) local Method, Args = getnamecallmethod(), {...} if Method:lower():find('http') and SelfRequesting then return old(Self, ...) end if Method == 'CaptureFocus' then local tab = Window:AddTab({ Title = 'CaptureFocus', Icon = "focus" }) tab:AddParagraph({ Title = 'CaptureFocus access wanted.', Content = (getcallingscript() ~= nil and getcallingscript():GetFullName() or 'unknown') .. ' would like to use CaptureFocus on ' .. tostring(Self) }) tab:AddButton({Title='Allow', Description='Always allows CaptureFocus on this instance', Callback=function() table.insert(allowed2, Self) end}) tab:AddButton({Title='Block', Description='Removes this from the allowed table, Used if you only wanted to allow once or you accidently allowed.', Callback=function() for i, v in allowed2 do if v == Self then v = nil end end end}) elseif Method:sub(1, 8):lower() == 'httppost' and not SelfRequesting then local args = {} args.Url = Args[1] args.Method = 'POST' args.Body = Args[2] or '' args.Headers = Args[3] and { ['Content-Type'] = Args[3] } or {} if not table.find(allowed, args.Url) then local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" }) tab:AddParagraph({ Title = 'Requested With', Content = 'game:' .. Method }) tab:AddParagraph({ Title = "URL", Content = args.Url }) tab:AddParagraph({ Title = "Method", Content = args.Method }) if args.Headers and #args.Headers > 0 then tab:AddParagraph({Title='Headers', Content=TableLoop(args.Headers, 1)}) end if args.Body and args.Body ~= '' then tab:AddParagraph({ Title = "Body", Content = tostring(args.Body) }) end tab:AddButton({Title='Allow', Description="Adds the request url to the allowed urls table (POST REQUEST ONLY).", Callback=function() table.insert(allowed, args.Url) end}) tab:AddButton({Title='Block', Description="Removes the request url from the allowed urls table (if it exists)", Callback=function() for i, v in allowed do if v == args.Url then print("Found,", v) table.remove(allowed, i) end end end}) local drop = tab:AddDropdown("CopyDropdown", { Title = "Copy As", Values = {'', "Source", "cURL"}, Multi = false, Default = '', }) drop:OnChanged(function(val) if val == 'Source' then setclipboard(string.format( '%s({\n Url=\'%s\'\n Method=\'%s\'\n Body = \'%s\'\n Headers=%s\n}', debug.getinfo(v).name or 'request', args.Url, args.Method, args.Body or '', args.Headers and #args.Headers > 0 and TableLoop(args.Headers, 2) or '{}' )) Fluent:Notify({ Title = "Copied", Content = "Successfully copied as source code!", SubContent = "", Duration = 5 }) elseif val == 'cURL' then setclipboard(tocURL(args)) Fluent:Notify({ Title = "Copied", Content = "Successfully copied as cURL!", SubContent = "", Duration = 5 }) end end) return end elseif Method:sub(1, 7):lower() == 'httpget' then local args = {} local Args = {...} args.Url = Args[1] args.Method = 'GET' local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" }) tab:AddParagraph({ Title = 'Requested With', Content = 'game:' .. Method }) tab:AddParagraph({ Title = "URL", Content = args.Url }) tab:AddParagraph({ Title = "Method", Content = args.Method }) local drop = tab:AddDropdown("CopyDropdown", { Title = "Copy As", Values = {'', "Source", "cURL"}, Multi = false, Default = '', }) drop:OnChanged(function(val) if val == 'Source' then setclipboard('game:HttpGet(\''..args.Url..'\');') Fluent:Notify({ Title = "Copied", Content = "Successfully copied as source code!", SubContent = "", Duration = 5 }) elseif val == 'cURL' then setclipboard(tocURL(args)) Fluent:Notify({ Title = "Copied", Content = "Successfully copied as cURL!", SubContent = "", Duration = 5 }) end end) SelfRequesting = true return game.HttpGet(game, Args[1]) elseif Method:sub(1, 9):lower() == 'sendasync' then if not table.find(allowed2, Self) and not BySelf then local tab = Window:AddTab({ Title = 'SendAsync', Icon = "send" }) tab:AddParagraph({ Title = "Channel", Content = Self.Name }) tab:AddParagraph({ Title = "Message", Content = Args[1] }) tab:AddButton({Title='Send', Description='Sends the message in the select channel.', Callback=function() BySelf = true Self:SendAsync(Args[1]) BySelf = false end}) tab:AddButton({Title='Allow', Description="Allows messages to be sent by a script in this channel", Callback=function() table.insert(allowed2, Self) end}) tab:AddButton({Title='Block', Description="Blocks messages being sent by a script in this channel", Callback=function() for i, v in allowed2 do if v == Self then v = nil end end end}) end elseif table.find(Methods.RBX, Method) then return game:GetService("HttpService"):GenerateGUID(false) elseif Method == 'RequestLimitedAsync' then Notify('RequestLimitedAsync', 'Script tried to use RequestLimitedAsync, Denying..', 5) return end return old(Self,...) end)) for i, v in game:GetService("TextChatService"):GetDescendants() do if v:IsA("TextChannel") then local old1111; old1111 = hookfunction(v.SendAsync, newcclosure(function(Self, Message) if not table.find(allowed2, Self) then local tab = Window:AddTab({ Title = 'SendAsync', Icon = "send" }) tab:AddParagraph({ Title = "Channel", Content = Self.Name }) tab:AddParagraph({ Title = "Message", Content = Args[1] }) tab:AddButton({Title='Send', Description='Sends the message in the select channel.', Callback=function() BySelf = true Self:SendAsync(Args[1]) BySelf = false end}) tab:AddButton({Title='Allow', Description="Allows messages to be sent by a script in this channel", Callback=function() table.insert(allowed2, Self) end}) tab:AddButton({Title='Block', Description="Blocks messages being sent by a script in this channel", Callback=function() for i, v in allowed2 do if v == Self then v = nil end end end}) end return old1111(Self, Message) end)) end end old3 = hookfunction(writefile, newcclosure(function(file, content) if not SelfWriting and file == path.."/config.json" then warn("Script tried to access RoTotal/config.json files, Attempt denied.") Notify('Files Accessed', 'Script attempted to access the RoTotal files, Attempt denied.', 8) return end return old3(file, tostring(content)) end)) old4 = hookfunction(makefolder, newcclosure(function(path) if not SelfWriting and file == path then warn("Script tried to recreate the RoTotal folder, Attempt denied.") Notify('Files Accessed', 'Script attempted to access the RoTotal files, Attempt denied.', 8) return end return old4(path) end)) old5 = hookfunction(clonefunction, newcclosure(function(func) if table.find(blockedfunctions, func) or func == clonefunction then Notify('Bypass Attempt', 'Script tried to bypass detections with clonefunction, attempt denied.', 8) return print end return old5(func) end)) old6 = hookfunction(hookfunction, newcclosure(function(func, func2) if func == hookfunction then Notify('Bypass Attempt', 'Script tried to bypass detections with hookfunction, attempt denied.', 8) return print -- Makes script print every function they want to use instead of actually hook xD end return old6(func, func2) end)) old7 = hookfunction(Market.GetRobuxBalance, function(...) return nil -- Error out some scripts. end) local Hook = {game.HttpPostAsync, game.HttpGet, game.HttpGetAsync} for i = 1, 4 do local v; v = hookfunction(Hook[i], function(Self, ...) local args = {} local Args = {...} args.Url = Args[1] args.Method = i <= 2 and 'POST' or 'GET' args.Body = Args[2] or '' args.Headers = Args[3] and { ['Content-Type'] = Args[3] } or {} if not table.find(allowed, args.Url) and not SelfRequesting then local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" }) tab:AddParagraph({ Title = 'Requested With', Content = Hook[i] == game.HttpPost and 'game.HttpPost' or Hook[i] == game.HttpPostAsync and 'game.HttpPostAsync' or Hook[i] == game.HttpGet and 'game.HttpGet' or Hook[i] == game.HttpGetAsync and 'game.HttpGetAsync' }) tab:AddParagraph({ Title = "URL", Content = args.Url }) tab:AddParagraph({ Title = "Method", Content = args.Method }) if args.Headers and #args.Headers > 0 then tab:AddParagraph({Title='Headers', Content=TableLoop(args.Headers, 1)}) end if args.Body and args.Body ~= '' then tab:AddParagraph({ Title = "Body", Content = tostring(args.Body) }) end if args.Method ~= 'GET' then tab:AddButton({Title='Allow', Description="Adds the request url to the allowed urls table (POST REQUEST ONLY).", Callback=function() table.insert(allowed, args.Url) end}) tab:AddButton({Title='Block', Description="Removes the request url from the allowed urls table (if it exists)", Callback=function() for i, v in allowed do if v == args.Url then print("Found,", v) table.remove(allowed, i) end end end}) end local drop = tab:AddDropdown("CopyDropdown", { Title = "Copy As", Values = {'', "Source", "cURL"}, Multi = false, Default = '', }) local POSTSource = ('game:HttpPost("%s", "%s", "%s");'):format(args.Url or '', args.Body or '', Args[3] or '') local GETSource = ('game:HttpGet("%s");'):format(args.Url or '') drop:OnChanged(function(val) if val == 'Source' then setclipboard(args.Method=='POST'and POSTSource or GETSource) Fluent:Notify({ Title = "Copied", Content = "Successfully copied as source code!", SubContent = "", Duration = 5 }) elseif val == 'cURL' then setclipboard(tocURL(args)) Fluent:Notify({ Title = "Copied", Content = "Successfully copied as cURL!", SubContent = "", Duration = 5 }) end end) if args.Method == 'GET' then return v(Self, ...) end print('Not SelfRequesting or found in allowed urls.') return elseif SelfRequesting then SelfRequesting = false return v(Self, ...) end return v(Self, ...) end) end old10 = hookfunction(game:GetService("Players").ReportAbuse, newcclosure(function(Self, ...) local Args = {...} return Notify("ReportAbuse Accessed", 'Script tried to access ReportAbuse and report player '..tostring(Args[1]), 10) end)) for i = 7, #blockedfunctions do local old0 = hookfunction(blockedfunctions[i], newcclosure(function(...) local info = Market:GetProductInfo(getid({...})) local owner = info.CreatorTargetId local Owner = game:GetService('Players'):GetNameFromUserIdAsync(owner); local price = info.PriceInRobux print("Owner:",Owner,"\nPrice:",price,'\nOwner ID:',owner) Notify('MarketplaceService', 'Script attempted to prompt/complete a purchase, printed product info.', 5) return end)) end for i, v in Specific.RbxAnalyticsService do hookfunction(v, function() Notify("RbxAnalyticsService accessed", 'RbxAnalyticsService accessed with member '..tostring(debug.getinfo(v).name)..", returned random GUID", 5) return HTTPs:GenerateGUID(false) end) end for i, v in Specific.Requests do local old0; old0 = hookfunction(v, newcclosure(function(...) if SelfRequesting then SelfRequesting = false return old(...) end local args = {...} if typeof(args) == 'table' and typeof(args[1]) == 'table' then args = args[1] end if not table.find(allowed, args.Url) or not SelfRequesting then local tab = Window:AddTab({ Title = functions.URLMain(args.Url), Icon = "globe" }) tab:AddParagraph({ Title = 'Requested With', Content = typeof(i) ~= 'number' and i or debug.getinfo(v).name or '??' }) tab:AddParagraph({ Title = "URL", Content = args.Url }) tab:AddParagraph({ Title = "Method", Content = args.Method }) tab:AddParagraph({Title='Headers', Content=TableLoop(args.Headers, 1) or 'No Headers'}) tab:AddParagraph({ Title = "Body", Content = args.Body or 'Empty' }) if args.Method ~= 'GET' then tab:AddButton({Title='Allow', Description="Adds the request url to the allowed urls table (POST REQUEST ONLY).", Callback=function() table.insert(allowed, args.Url) end}) tab:AddButton({Title='Block', Description="Removes the request url from the allowed urls table (if it exists)", Callback=function() for i, v in allowed do if v == args.Url then print("Found,", v) table.remove(allowed, i) end end end}) end local drop = tab:AddDropdown("CopyDropdown", { Title = "Copy As", Values = {'', "Source", "cURL"}, Multi = false, Default = '', }) drop:OnChanged(function(val) if val == 'Source' then setclipboard(string.format( '%s({\n Url=\'%s\',\n Method=\'%s\',\n Body = \'%s\',\n Headers=%s\n})', i, args.Url, args.Method, args.Body or '', args.Headers and TableLoop(args.Headers, 2) or '{}' )) Fluent:Notify({ Title = "Copied", Content = "Successfully copied as source code!", SubContent = "", Duration = 5 }) elseif val == 'cURL' then setclipboard(tocURL(args)) Fluent:Notify({ Title = "Copied", Content = "Successfully copied as cURL!", SubContent = "", Duration = 5 }) end end) local r = request2({Url=args.Url, Method='GET'}) local Cookies, Headers = r.Cookies, r.Headers return { StatusCode = r.StatusCode, Success = r.Success, StatusMessage = r.StatusMessage, Cookies = Cookies, Headers = Headers } end return old0(...) end)) end