136 lines
4.9 KiB
C++
136 lines
4.9 KiB
C++
#include "xsteam_git_fetch.h"
|
|
|
|
xsteam_git_fetch::xsteam_git_fetch(QObject *parent) : QObject(parent)
|
|
{
|
|
}
|
|
|
|
xsteam_git_fetch::~xsteam_git_fetch()
|
|
{
|
|
}
|
|
void xsteam_git_fetch::free_git_fetch()
|
|
{
|
|
if(x_git!=nullptr){
|
|
delete x_git;
|
|
x_git = nullptr;
|
|
}
|
|
if(x_curl!=nullptr){
|
|
delete x_curl;
|
|
x_curl = nullptr;
|
|
}
|
|
}
|
|
void xsteam_git_fetch::fecth_uid_to_steam(InputData& i_data,UidData& u_data)
|
|
{
|
|
x_git = new xsteam_git();
|
|
x_curl = new xsteam_curl();
|
|
/*
|
|
// 获取远程仓库tag
|
|
emit signal_fetch_return_msg("获取远程仓库列表");
|
|
if (i_data.t_f_array)
|
|
{
|
|
if (!x_git->branch_or_tags_remote_array())
|
|
{
|
|
free_git_fetch();
|
|
return;
|
|
}
|
|
}
|
|
*/
|
|
emit signal_fetch_return_msg("连接Steam API获取uid对应游戏信息...");
|
|
if (!xsteam_curl_steam_id_app_info(i_data.t_g_uid, u_data))
|
|
{
|
|
emit signal_fetch_return_msg("连接Steam API获取游戏信息失败");
|
|
free_git_fetch();
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
emit signal_fetch_return_msg("通过Steam API获取游戏信息完毕!");
|
|
}
|
|
emit signal_fetch_return_msg("正在uid对应文件清单...");
|
|
// fetch remote library data
|
|
|
|
x_git->branch_or_tags_set_opts(i_data.t_g_uid, i_data.t_s_name);
|
|
if (!x_git->branch_or_tags_clone_ext(u_data))
|
|
{
|
|
emit signal_fetch_return_msg("拉取uid对应文件清单失败!");
|
|
free_git_fetch();
|
|
return;
|
|
}
|
|
// vdf dir & vdf file path
|
|
QString vdf_dir = ex_base_exe_ex + QString::fromStdString(i_data.t_g_uid);
|
|
QString vdf_key_file = vdf_dir + "/Key.vdf";
|
|
QString vdf_config_file = QString::fromStdString(_data.x_config.steam_dir) + "/config/config.vdf";
|
|
// check fetch dir exists
|
|
if (!QDir(vdf_dir).exists())
|
|
{
|
|
emit signal_fetch_return_msg("目录:" + vdf_dir.toStdString() + "不存在");
|
|
return;
|
|
}
|
|
// check fetch dir key.vdf file exists
|
|
if (!QFile(vdf_key_file).exists())
|
|
{
|
|
emit signal_fetch_return_msg("文件:" + vdf_key_file.toStdString() + "不存在");
|
|
return;
|
|
}
|
|
if (!QFile(vdf_config_file).exists())
|
|
{
|
|
emit signal_fetch_return_msg("文件:" + vdf_config_file.toStdString() + "不存在");
|
|
return;
|
|
}
|
|
vdf::object vdf_data;
|
|
try
|
|
{
|
|
emit signal_fetch_return_msg("读取Key.vdf文件数据...");
|
|
// return fetch dir key.vdf file uid key data
|
|
xsteam_vdf_read_key(xsteam_vdf_read(vdf_key_file), u_data);
|
|
// return tetch dir manifest file name
|
|
emit signal_fetch_return_msg("获取manifest文件清单...");
|
|
xsteam_vdf_manifest_name(vdf_dir, u_data);
|
|
// return steam user config.vdf data
|
|
emit signal_fetch_return_msg("读取steam->config.vdf文件...");
|
|
vdf_data = xsteam_vdf_read(vdf_config_file);
|
|
auto conf_data = vdf_data.childs.find("Software")->second->childs.find("valve")->second->childs.find("Steam")->second->childs.find("depots");
|
|
for (auto &[u, w] : u_data.uid_key)
|
|
{
|
|
qDebug() << "u:" << QString::fromStdString(u) << "w:" << QString::fromStdString(w);
|
|
vdf::object *obj = new vdf::object();
|
|
std::unique_ptr<vdf::object> _child = std::make_unique<vdf::object>(*obj);
|
|
_child->set_name(u);
|
|
_child->add_attribute("DecryptionKey", w);
|
|
conf_data->second->add_child(std::move(_child));
|
|
delete obj;
|
|
obj = nullptr;
|
|
}
|
|
// download game ico
|
|
emit signal_fetch_return_msg("正在下载游戏ico图标...");
|
|
if(x_curl->get_steam_header_ico(_data.x_config.steam_logo_url,u_data.uid)){
|
|
free_git_fetch();
|
|
}
|
|
u_data.ico = u_data.uid+".png";
|
|
// lua to luapaker .st to steamtools dir
|
|
emit signal_fetch_return_msg("生成游戏入库lua脚本...");
|
|
if (xsteam_lua_to_com(u_data))
|
|
{
|
|
// move manifest to steam depots cache
|
|
emit signal_fetch_return_msg("移动manifest文件到steam depotscache目录...");
|
|
xsteam_vdf_manifest_move(u_data);
|
|
// key写入config.vdf文件
|
|
emit signal_fetch_return_msg("写入key到steam的config.vdf...");
|
|
xsteam_vdf_write(vdf_config_file, vdf_data);
|
|
u_data.i_time= (QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss")).toStdString();
|
|
}
|
|
if (QDir(vdf_dir).exists())
|
|
{
|
|
QDir(vdf_dir).removeRecursively();
|
|
}
|
|
free_git_fetch();
|
|
emit signal_fetch_return_msg(u_data.uid+"入库完毕!");
|
|
emit signal_fetch_return_data(u_data);
|
|
return;
|
|
}
|
|
catch (std::runtime_error &e)
|
|
{
|
|
std::cerr << "解析错误:" << e.what() << std::endl;
|
|
return;
|
|
}
|
|
}
|