121 lines
4.4 KiB
C++
121 lines
4.4 KiB
C++
|
|
// Tencent is pleased to support the open source community by making UnLua available.
|
|||
|
|
//
|
|||
|
|
// Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
|
|||
|
|
//
|
|||
|
|
// Licensed under the MIT License (the "License");
|
|||
|
|
// you may not use this file except in compliance with the License. You may obtain a copy of the License at
|
|||
|
|
//
|
|||
|
|
// http://opensource.org/licenses/MIT
|
|||
|
|
//
|
|||
|
|
// Unless required by applicable law or agreed to in writing,
|
|||
|
|
// software distributed under the License is distributed on an "AS IS" BASIS,
|
|||
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
|
|
// See the License for the specific language governing permissions and limitations under the License.
|
|||
|
|
|
|||
|
|
|
|||
|
|
#include "UnLuaEditorFunctionLibrary.h"
|
|||
|
|
#include "Modules/ModuleManager.h"
|
|||
|
|
#include "DirectoryWatcherModule.h"
|
|||
|
|
#include "IDirectoryWatcher.h"
|
|||
|
|
#include "SocketSubsystem.h"
|
|||
|
|
#include "UnLua.h"
|
|||
|
|
#include "UnLuaEditorSettings.h"
|
|||
|
|
#include "UnLuaFunctionLibrary.h"
|
|||
|
|
#include "Common/UdpSocketBuilder.h"
|
|||
|
|
#include "Interfaces/IPluginManager.h"
|
|||
|
|
|
|||
|
|
void UUnLuaEditorFunctionLibrary::WatchScriptDirectory()
|
|||
|
|
{
|
|||
|
|
FDirectoryWatcherModule& DirectoryWatcherModule = FModuleManager::LoadModuleChecked<FDirectoryWatcherModule>("DirectoryWatcher");
|
|||
|
|
IDirectoryWatcher* DirectoryWatcher = DirectoryWatcherModule.Get();
|
|||
|
|
if (DirectoryWatcher)
|
|||
|
|
{
|
|||
|
|
const auto& Delegate = IDirectoryWatcher::FDirectoryChanged::CreateStatic(&UUnLuaEditorFunctionLibrary::OnLuaFilesModified);
|
|||
|
|
const auto& ScriptRootPath = UUnLuaFunctionLibrary::GetScriptRootPath();
|
|||
|
|
DirectoryWatcher->RegisterDirectoryChangedCallback_Handle(ScriptRootPath, Delegate, DirectoryWatcherHandle);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void UUnLuaEditorFunctionLibrary::FetchNewVersion()
|
|||
|
|
{
|
|||
|
|
Async(EAsyncExecution::ThreadPool, []
|
|||
|
|
{
|
|||
|
|
const auto RemoteAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr();
|
|||
|
|
bool bIsValid;
|
|||
|
|
RemoteAddr->SetIp(TEXT("101.226.141.148"), bIsValid);
|
|||
|
|
RemoteAddr->SetPort(8080);
|
|||
|
|
|
|||
|
|
const auto Client = FUdpSocketBuilder(TEXT("Client")).Build();
|
|||
|
|
if (!Client->Connect(RemoteAddr.Get()))
|
|||
|
|
{
|
|||
|
|
UE_LOG(LogUnLua, Verbose, TEXT("Unable to fetch latest version, could not connect to server."));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
PRAGMA_DISABLE_DEPRECATION_WARNINGS
|
|||
|
|
const FString Msg = FString::Printf(TEXT("cmd=3&tag=glcoud.unlua.update&version=%s&engine=%s&user_name=%s"),
|
|||
|
|
*GetCurrentVersion(),
|
|||
|
|
*FEngineVersion::Current().ToString(),
|
|||
|
|
*FPlatformMisc::GetHashedMacAddressString()
|
|||
|
|
);
|
|||
|
|
PRAGMA_ENABLE_DEPRECATION_WARNINGS
|
|||
|
|
const FTCHARToUTF8 Converted(*Msg);
|
|||
|
|
int32 Sent;
|
|||
|
|
if (!Client->Send((uint8*)Converted.Get(), Converted.Length(), Sent))
|
|||
|
|
{
|
|||
|
|
UE_LOG(LogUnLua, Warning, TEXT("Unable to fetch latest version, data sending error."));
|
|||
|
|
Client->Close();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
TArray<uint8> Bytes;
|
|||
|
|
Bytes.SetNumZeroed(256);
|
|||
|
|
int32 Read = 0;
|
|||
|
|
for (int Tried = 0; Tried < 10; ++Tried)
|
|||
|
|
{
|
|||
|
|
FPlatformProcess::Sleep(0.5f);
|
|||
|
|
if (Client->Recv(Bytes.GetData(), Bytes.Num(), Read))
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Client->Close();
|
|||
|
|
if (Read == 0)
|
|||
|
|
{
|
|||
|
|
UE_LOG(LogUnLua, Warning, TEXT("Unable to fetch latest version, data receiving timeout."));
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const FString Received = UTF8_TO_TCHAR((char*)Bytes.GetData());
|
|||
|
|
const FString CurrentVersion = GetCurrentVersion();
|
|||
|
|
if (Received == CurrentVersion)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
UE_LOG(LogUnLua, Log, TEXT("New version available: %s."), *Received);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
FString UUnLuaEditorFunctionLibrary::GetCurrentVersion()
|
|||
|
|
{
|
|||
|
|
auto& PluginManager = IPluginManager::Get();
|
|||
|
|
auto Plugins = PluginManager.GetDiscoveredPlugins();
|
|||
|
|
for (const auto& Plugin : Plugins)
|
|||
|
|
{
|
|||
|
|
if (Plugin->GetName() == "UnLua")
|
|||
|
|
{
|
|||
|
|
const auto Descriptor = Plugin->GetDescriptor();
|
|||
|
|
return Descriptor.VersionName;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void UUnLuaEditorFunctionLibrary::OnLuaFilesModified(const TArray<FFileChangeData>& FileChanges)
|
|||
|
|
{
|
|||
|
|
const auto& Settings = *GetDefault<UUnLuaEditorSettings>();
|
|||
|
|
if (Settings.HotReloadMode != EHotReloadMode::Auto)
|
|||
|
|
return;
|
|||
|
|
UUnLuaFunctionLibrary::HotReload();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
FDelegateHandle UUnLuaEditorFunctionLibrary::DirectoryWatcherHandle;
|