· last year · Apr 10, 2024, 08:30 AM
1local API = {}
2local API_URL = "https://anaminus.github.io/rbx/json/api/latest.json"
3function FetchAPI()
4 local successGetAsync, data = pcall(function()
5 return game:GetService("HttpService"):GetAsync(API_URL, true, nil)
6 end)
7 if (not successGetAsync) then
8 warn("Failed to fetch Roblox API: " .. tostring(data))
9 return
10 end
11 local successParse, dataArray = pcall(function()
12 return game:GetService("HttpService"):JSONDecode(data)
13 end)
14 if (not successParse) then
15 warn("Failed to parse Roblox API: " .. tostring(dataArray))
16 return
17 end
18 return dataArray
19end
20function BuildClasses(api)
21 local classes, classesByName = {}, {}
22 local function ApplyTags(item)
23 if (item.tags) then
24 for i = 1,#item.tags do
25 local tag = item.tags[i]
26 if (tag:match("Security$")) then
27 item.Security = tag
28 elseif (tag == "readonly") then
29 item.ReadOnly = true
30 elseif (tag == "hidden") then
31 item.Hidden = true
32 elseif (tag == "notCreatable") then
33 item.NotCreatable = true
34 elseif (tag == "notbrowsable") then
35 item.NotBrowsable = true
36 end
37 end
38 end
39 end
40 -- Collect all classes:
41 for i = 1,#api do
42 local item = api[i]
43 if (item.type == "Class") then
44 classes[#classes + 1] = item
45 classesByName[item.Name] = item
46 item.Subclasses = {}
47 item.Properties = {}
48 item.Methods = {}
49 item.Events = {}
50 ApplyTags(item)
51 for _,key in pairs{"Properties", "Methods", "Events"} do
52 setmetatable(item[key], {
53 __index = function(self, index)
54 return item.Superclass and item.Superclass[key][index]
55 end;
56 })
57 end
58 function item:GetAllProperties(discludeSecure)
59 local properties = {}
60 local class = item
61 while (class) do
62 for propName,propInfo in pairs(class.Properties) do
63 if ((not propInfo.Security) or (not discludeSecure)) then
64 properties[propName] = propInfo
65 end
66 end
67 class = class.Superclass
68 end
69 return properties
70 end
71 end
72 end
73 -- Reference superclasses:
74 for i = 1,#classes do
75 local class = classes[i]
76 if (class.Superclass) then
77 class.Superclass = classesByName[class.Superclass]
78 table.insert(class.Superclass.Subclasses, class)
79 end
80 end
81 -- Collect properties, methods, and events:
82 for i = 1,#api do
83 local item = api[i]
84 if (item.type == "Property") then
85 local class = classesByName[item.Class]
86 ApplyTags(item)
87 class.Properties[item.Name] = item
88 elseif (item.type == "Function") then
89 local class = classesByName[item.Class]
90 ApplyTags(item)
91 class.Methods[item.Name] = item
92 elseif (item.type == "Event") then
93 local class = classesByName[item.Class]
94 ApplyTags(item)
95 class.Events[item.Name] = item
96 end
97 end
98 return classes, classesByName
99end
100function BuildEnums(api)
101 local enums, enumsByName = {}, {}
102 -- Collect enums:
103 for i = 1,#api do
104 local item = api[i]
105 if (item.type == "Enum") then
106 enums[#enums + 1] = item
107 enumsByName[item.Name] = item
108 item.EnumItems = {}
109 end
110 end
111 -- Collect enum items:
112 for i = 1,#api do
113 local item = api[i]
114 if (item.type == "EnumItem") then
115 local enum = enumsByName[item.Enum]
116 table.insert(enum.EnumItems, item)
117 end
118 end
119 return enums, enumsByName
120end
121function API:Fetch()
122 if (self._fetched) then
123 warn("API already fetched")
124 return
125 end
126 if (self._fetching) then
127 warn("API is already in the process of being fetched")
128 return
129 end
130 self._fetching = true
131 local api = FetchAPI()
132 self._fetching = nil
133 if (not api) then return end
134 API.Classes, API.ClassesByName = BuildClasses(api)
135 API.Enums, API.EnumsByName = BuildEnums(api)
136 self._fetched = true
137 return true
138end
139return API