mirror of
https://github.com/BeamMP/BeamMP-Server.git
synced 2025-07-01 23:35:41 +00:00
add onFileChanged (fixes #116)
This commit is contained in:
parent
ad414ec5c9
commit
a2cc629153
@ -220,6 +220,7 @@ void RegisterThread(const std::string& str);
|
|||||||
|
|
||||||
#define beammp_errorf(...) beammp_error(fmt::format(__VA_ARGS__))
|
#define beammp_errorf(...) beammp_error(fmt::format(__VA_ARGS__))
|
||||||
#define beammp_infof(...) beammp_info(fmt::format(__VA_ARGS__))
|
#define beammp_infof(...) beammp_info(fmt::format(__VA_ARGS__))
|
||||||
|
#define beammp_debugf(...) beammp_debug(fmt::format(__VA_ARGS__))
|
||||||
#define beammp_warnf(...) beammp_warn(fmt::format(__VA_ARGS__))
|
#define beammp_warnf(...) beammp_warn(fmt::format(__VA_ARGS__))
|
||||||
#define beammp_tracef(...) beammp_trace(fmt::format(__VA_ARGS__))
|
#define beammp_tracef(...) beammp_trace(fmt::format(__VA_ARGS__))
|
||||||
#define beammp_lua_errorf(...) beammp_lua_error(fmt::format(__VA_ARGS__))
|
#define beammp_lua_errorf(...) beammp_lua_error(fmt::format(__VA_ARGS__))
|
||||||
|
@ -18,6 +18,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
std::shared_ptr<TLuaEngine> mEngine;
|
std::shared_ptr<TLuaEngine> mEngine;
|
||||||
fs::path mPath;
|
fs::path mPath;
|
||||||
std::atomic_bool mShutdown;
|
std::atomic_bool mShutdown { false };
|
||||||
std::unordered_map<std::string, fs::file_time_type> mFileTimes;
|
std::unordered_map<std::string, fs::file_time_type> mFileTimes;
|
||||||
};
|
};
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
TPluginMonitor::TPluginMonitor(const fs::path& Path, std::shared_ptr<TLuaEngine> Engine)
|
TPluginMonitor::TPluginMonitor(const fs::path& Path, std::shared_ptr<TLuaEngine> Engine)
|
||||||
: mEngine(Engine)
|
: mEngine(Engine)
|
||||||
, mPath(Path) {
|
, mPath(Path) {
|
||||||
|
Application::SetSubsystemStatus("PluginMonitor", Application::Status::Starting);
|
||||||
if (!fs::exists(mPath)) {
|
if (!fs::exists(mPath)) {
|
||||||
fs::create_directories(mPath);
|
fs::create_directories(mPath);
|
||||||
}
|
}
|
||||||
@ -28,16 +29,17 @@ TPluginMonitor::TPluginMonitor(const fs::path& Path, std::shared_ptr<TLuaEngine>
|
|||||||
void TPluginMonitor::operator()() {
|
void TPluginMonitor::operator()() {
|
||||||
RegisterThread("PluginMonitor");
|
RegisterThread("PluginMonitor");
|
||||||
beammp_info("PluginMonitor started");
|
beammp_info("PluginMonitor started");
|
||||||
|
Application::SetSubsystemStatus("PluginMonitor", Application::Status::Good);
|
||||||
while (!mShutdown) {
|
while (!mShutdown) {
|
||||||
std::vector<std::string> ToRemove;
|
std::vector<std::string> ToRemove;
|
||||||
for (const auto& Pair : mFileTimes) {
|
for (const auto& Pair : mFileTimes) {
|
||||||
try {
|
try {
|
||||||
auto CurrentTime = fs::last_write_time(Pair.first);
|
auto CurrentTime = fs::last_write_time(Pair.first);
|
||||||
if (CurrentTime != Pair.second) {
|
if (CurrentTime > Pair.second) {
|
||||||
mFileTimes[Pair.first] = CurrentTime;
|
mFileTimes[Pair.first] = CurrentTime;
|
||||||
// grandparent of the path should be Resources/Server
|
// grandparent of the path should be Resources/Server
|
||||||
if (fs::equivalent(fs::path(Pair.first).parent_path().parent_path(), mPath)) {
|
if (fs::equivalent(fs::path(Pair.first).parent_path().parent_path(), mPath)) {
|
||||||
beammp_info("File \"" + Pair.first + "\" changed, reloading");
|
beammp_infof("File \"{}\" changed, reloading", Pair.first);
|
||||||
// is in root folder, so reload
|
// is in root folder, so reload
|
||||||
std::ifstream FileStream(Pair.first, std::ios::in | std::ios::binary);
|
std::ifstream FileStream(Pair.first, std::ios::in | std::ios::binary);
|
||||||
auto Size = std::filesystem::file_size(Pair.first);
|
auto Size = std::filesystem::file_size(Pair.first);
|
||||||
@ -49,30 +51,24 @@ void TPluginMonitor::operator()() {
|
|||||||
auto Res = mEngine->EnqueueScript(StateID, Chunk);
|
auto Res = mEngine->EnqueueScript(StateID, Chunk);
|
||||||
mEngine->AddResultToCheck(Res);
|
mEngine->AddResultToCheck(Res);
|
||||||
mEngine->ReportErrors(mEngine->TriggerLocalEvent(StateID, "onInit"));
|
mEngine->ReportErrors(mEngine->TriggerLocalEvent(StateID, "onInit"));
|
||||||
|
mEngine->ReportErrors(mEngine->TriggerEvent("onFileChanged", "", Pair.first));
|
||||||
} else {
|
} else {
|
||||||
// TODO: trigger onFileChanged event
|
|
||||||
beammp_trace("Change detected in file \"" + Pair.first + "\", event trigger not implemented yet");
|
|
||||||
/*
|
|
||||||
// is in subfolder, dont reload, just trigger an event
|
// is in subfolder, dont reload, just trigger an event
|
||||||
auto Results = mEngine.TriggerEvent("onFileChanged", "", Pair.first);
|
beammp_debugf("File \"{}\" changed, not reloading because it's in a subdirectory. Triggering 'onFileChanged' event instead", Pair.first);
|
||||||
mEngine.WaitForAll(Results);
|
mEngine->ReportErrors(mEngine->TriggerEvent("onFileChanged", "", Pair.first));
|
||||||
for (const auto& Result : Results) {
|
|
||||||
if (Result->Error) {
|
|
||||||
beammp_lua_error(Result->ErrorMessage);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
ToRemove.push_back(Pair.first);
|
ToRemove.push_back(Pair.first);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < 3 && !mShutdown; ++i) {
|
for (size_t i = 0; i < 3 && !mShutdown; ++i) {
|
||||||
std::this_thread::sleep_for(std::chrono::seconds(i));
|
std::this_thread::sleep_for(std::chrono::seconds(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const auto& File : ToRemove) {
|
for (const auto& File : ToRemove) {
|
||||||
mFileTimes.erase(File);
|
mFileTimes.erase(File);
|
||||||
beammp_warn("file '" + File + "' couldn't be accessed, so it was removed from plugin hot reload monitor (probably got deleted)");
|
beammp_warnf("File \"{}\" couldn't be accessed, so it was removed from plugin hot reload monitor (probably got deleted)", File);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Application::SetSubsystemStatus("PluginMonitor", Application::Status::Shutdown);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user