Accounting/Assets/Scripts/FileTranslationManager.cs

218 lines
7.5 KiB
C#
Raw Normal View History

2023-09-24 21:35:44 +08:00
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;
}
}
}