Accounting/Assets/Scripts/FileTranslationManager.cs

218 lines
7.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Threading.Tasks;
using TouchSocket.Core;
using TouchSocket.Rpc.TouchRpc;
using TouchSocket.Sockets;
namespace DragonSoul.Logic
{
public class FileTranslationManager
{
private static FileTranslationManager _fileTranslationManager = new FileTranslationManager();
public static FileTranslationManager instance => _fileTranslationManager;
private bool _active;
private FileTranslationAgent _agent = new FileTranslationAgent();
public async Task<IResult> UploadFile(string groupName, string fileName)
{
if (_active)
return Result.Canceled;
this._active = true;
this._agent.Initialize();
__Log.InfoFile($"start upload:{fileName}");
var result = await this._agent.UploadFile(groupName, fileName);
__Log.InfoFile("upload end");
_active = false;
return result;
}
public async Task<IResult> DownloadFile(string groupName, string fileName)
{
if (_active)
return Result.Canceled;
FileTranslationAgent agent = new FileTranslationAgent();
agent.Initialize();
__Log.InfoFile($"start download:{fileName}");
var result = await agent.DownloadFile(groupName, fileName);
__Log.InfoFile("download end");
_active = false;
return result;
}
}
public class FileTranslationAgent
{
private TcpTouchRpcClient _client;
public void Initialize()
{
if(_client!=null)
return;
this._client = new TouchSocketConfig()
.SetRemoteIPHost($"{MiscUtility.GetConfigIP()}:7789")
.SetVerifyToken("FileTranslation")
.UsePlugin()
.SetRootPath(MiscUtility.GetBasePath())
.ConfigureContainer(a => { ((LoggerGroup) a.Resolve<ILog>()).AddLogger((TouchSocket.Core.ILog) new TouchLogger()); })
.ConfigurePlugins(a => { a.UseTouchRpcHeartbeat<TcpTouchRpcClient>(); })
.BuildWithTcpTouchRpcClient();
this._client.Logger.Info("连接成功");
}
public void Dispose()
{
var clientID = this._client.ID;
try
{
__Log.Info($"Close agent:{clientID}");
_client.Close();
}
catch (Exception e)
{
__Log.Error(e.ToString());
}
try
{
__Log.Info($"Dispose agent:{clientID}");
_client.Dispose();
}
catch (Exception e)
{
__Log.Error(e.ToString());
}
__Log.Info($"dispose agent:{clientID}");
}
public async Task SendFileToOtherClient(string targetId, string fileName)
{
FileOperator fileOperator = new FileOperator() //实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = fileName, //保存路径
ResourcePath = fileName, //请求路径
};
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
LoopAction loopAction = LoopAction.CreateLoopAction(-1, 1000, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
if (_client == null || _client.Logger == null)
{
__Log.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
}
else
_client.Logger.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
});
loopAction.RunAsync();
//此方法会阻塞直到传输结束也可以使用PullFileAsync
IResult result = await this._client.PullFileAsync(targetId, fileOperator);
_client.Logger.Info(result.ToString());
}
public async Task<IResult> UploadFile(string groupName, string fileName)
{
FileOperator fileOperator = new FileOperator() //实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = $"{groupName}/{fileName}", //保存路径
ResourcePath = MiscUtility.GetValidPath(fileName), //请求路径
};
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
LoopAction loopAction = LoopAction.CreateLoopAction(-1, 100, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
if (_client == null || _client.Logger == null)
{
__Log.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
}
else
_client.Logger.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
});
try
{
loopAction.RunAsync();
}
catch (Exception e)
{
__Log.Error(e.ToString());
}
IResult result = null;
try
{
//此方法会阻塞直到传输结束也可以使用PullFileAsync
result = await this._client.PushFileAsync(fileOperator);
}
catch (Exception e)
{
__Log.Error(e.ToString());
}
_client.Logger.Info(result.ToString());
return result;
}
public async Task<IResult> DownloadFile(string groupName, string fileName)
{
FileOperator fileOperator = new FileOperator() //实例化本次传输的控制器,用于获取传输进度、速度、状态等。
{
SavePath = MiscUtility.GetValidPath(fileName), //保存路径
ResourcePath = $"{groupName}/{fileName}", //请求路径
};
//此处的作用相当于Timer定时每秒输出当前的传输进度和速度。
LoopAction loopAction = LoopAction.CreateLoopAction(-1, 100, (loop) =>
{
if (fileOperator.Result.ResultCode != ResultCode.Default)
{
loop.Dispose();
}
if (_client == null || _client.Logger == null)
{
__Log.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
}
else
_client.Logger.Info($"进度:{fileOperator.Progress},速度:{fileOperator.Speed()}");
});
try
{
loopAction.RunAsync();
}
catch (Exception e)
{
__Log.Error(e.ToString());
}
IResult result = null;
try
{
//此方法会阻塞直到传输结束也可以使用PullFileAsync
result = await this._client.PullFileAsync(fileOperator);
}
catch (Exception e)
{
__Log.Error(e.ToString());
}
_client.Logger.Info(result.ToString());
return result;
}
}
}