-
Notifications
You must be signed in to change notification settings - Fork 2.2k
/
Copy pathGetConfigurationMethod.cpp
115 lines (91 loc) · 3.02 KB
/
GetConfigurationMethod.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "StdInc.h"
#include <ClientHttpHandler.h>
#include <ResourceManager.h>
#include <ResourceFilesComponent.h>
#include <ResourceStreamComponent.h>
#include <ResourceMetaDataComponent.h>
#include <ServerInstanceBase.h>
static InitFunction initFunction([]()
{
fx::ServerInstanceBase::OnServerCreate.Connect([](fx::ServerInstanceBase* instance)
{
fx::ResourceManager* resman = instance->GetComponent<fx::ResourceManager>().GetRef();
instance->GetComponent<fx::ClientMethodRegistry>()->AddHandler("getConfiguration", [=](const std::map<std::string, std::string>& postMap, const fwRefContainer<net::HttpRequest>& request, const std::function<void(const json&)>& cb)
{
json resources = json::array();
auto resourceIt = postMap.find("resources");
std::set<std::string_view> filters;
if (resourceIt != postMap.end())
{
std::string_view filterValues = resourceIt->second;
int lastPos = 0;
int pos = -1;
do
{
lastPos = pos + 1;
pos = filterValues.find_first_of(';', pos + 1);
auto thisValue = filterValues.substr(lastPos, (pos - lastPos));
filters.insert(thisValue);
} while (pos != std::string::npos);
}
resman->ForAllResources([&](fwRefContainer<fx::Resource> resource)
{
if (resource->GetName() == "_cfx_internal")
{
return;
}
if (!filters.empty() && filters.find(resource->GetName()) == filters.end())
{
return;
}
if (resource->GetState() != fx::ResourceState::Started && resource->GetState() != fx::ResourceState::Starting)
{
return;
}
auto metaData = resource->GetComponent<fx::ResourceMetaDataComponent>();
auto iv = metaData->GetEntries("server_only");
if (iv.begin() != iv.end())
{
return;
}
json resourceFiles = json::object();
fwRefContainer<fx::ResourceFilesComponent> files = resource->GetComponent<fx::ResourceFilesComponent>();
for (const auto& entry : files->GetFileHashPairs())
{
resourceFiles[entry.first] = entry.second;
}
json resourceStreamFiles = json::object();
fwRefContainer<fx::ResourceStreamComponent> streamFiles = resource->GetComponent<fx::ResourceStreamComponent>();
for (const auto& entry : streamFiles->GetStreamingList())
{
if (!entry.second.isAutoScan)
{
continue;
}
json obj = json::object({
{ "hash", entry.second.hashString },
{ "rscFlags", entry.second.rscFlags },
{ "rscVersion", entry.second.rscVersion },
{ "size", entry.second.size },
});
if (entry.second.isResource)
{
obj["rscPagesVirtual"] = entry.second.rscPagesVirtual;
obj["rscPagesPhysical"] = entry.second.rscPagesPhysical;
}
resourceStreamFiles[entry.first] = obj;
}
resources.push_back(json::object({
{ "name", resource->GetName() },
{ "files", resourceFiles },
{ "streamFiles", resourceStreamFiles }
}));
});
cb(json::object({
{ "fileServer", "https://%s/files" },
{ "resources", resources }
}));
cb(json(nullptr));
});
}, 5000);
});