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;
 |