internal static async Task <string> RequestMatch(this MatchConfiguration conf)
        {
            if (!conf.IsValid)
            {
                return(null);
            }
            string matchID = null;

            do
            {
                Logger.Log(LogLevel.Info, "尝试向 Botzone 发起对局请求……");
                var req = new HttpRequestMessage(HttpMethod.Get, Credentials.BotzoneRunMatchURL());
                req.Headers.Add("X-Game", conf.Game.Name);
                req.Headers.Add("X-Initdata", conf.Initdata is string?conf.Initdata: JsonConvert.SerializeObject(conf.Initdata));
                req.Headers.Add("X-UseSimpleIO", LocalProgramRunner.IsSimpleIO ? "true" : "false");
                req.Headers.Add("X-Timelimit", Properties.Settings.Default.TimeLimit.TotalSeconds.ToString());
                for (int i = 0; i < conf.Count; i++)
                {
                    req.Headers.Add("X-Player-" + i, conf[i].Type == PlayerType.BotzoneBot ? conf[i].ID : "me");
                }
                var res = await client.SendAsync(req);

                matchID = await res.Content.ReadAsStringAsync();

                if (CheckResponse(res, matchID))
                {
                    break;
                }

                Logger.Log(LogLevel.InfoTip, "5秒后重试……");
                await Task.Delay(5000);
            } while (true);

            Logger.Log(LogLevel.OK, "成功创建了新对局:" + matchID);
            return(matchID);
        }