XSteam/src/xsteam_git_fetch.cpp
2024-10-11 19:40:20 +08:00

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