offical_client
简介
做为客户端接入防私服服务器(offical server)
组件接口
offical_client.gs
函数原型 | 函数作用 |
---|---|
void start(map args, function shutdown_callback = nil) | 开启接入 |
样例
import pkg.offical_client;
import pkg.offical_client.client_msgd;
void create()
{
load_static(offical_client, domain.create("offical_client"));
// 这是响应来自防私服服务端的消息
client_msgd.set_handler("msg_request_challenge", (: msg_process :));
client_msgd.set_handler("msg_commit_challenge", (: msg_process :));
}
public void start()
{
function shutdown_callback = () {
// 被防私服机制认定为私服,直接退出
quick_exit();
};
// 加载防私服
map args = {
"ip" : "127.0.0.1",
"port" : 9999,
"port_recv_size" : 1024 * 32,
"auth_info" : (: auth_info_callback :),
};
offical_client.start(args, shutdown_callback);
while (! start_challenge())
{
printf("Failed to pass challenge, retry after 1 second.\n");
coroutine.sleep(1);
}
}
map auth_info_callback(object conn)
{
map system_info = get_system_info();
map m = {
"auth_type" : "token", // 使用令牌认证
"token" : "xxxxx", // 身份认证的令牌
};
return m;
}
bool start_challenge()
{
object conn = nil;
defer {
if (conn)
conn.close();
}
conn = client_netd.connect();
if (! conn)
return false;
// 获取挑战内容
mixed result = conn.send_request("cmd_request_challenge");
if (! result)
return false;
// 计算并回答
let string content = result;
if (! compile_program("/challenge.gs", content, true))
return false;
object challenge_ob = load_static("/challenge.gs", this_domain());
mixed challenge_answer = challenge_ob.main();
mixed commit_result = conn.send_request("cmd_commit_challenge", challenge_answer);
if (! commit_result)
return false;
let bool success = commit_result;
return success;
}
// msg handler
void msg_process(object conn, string cookie, ...)
{
conn.receive_response(cookie, unpack(2));
}