SmartBowNetwork.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. using System;
  2. using System.Collections;
  3. using UnityEngine;
  4. using UnityEngine.Networking;
  5. using Newtonsoft.Json;
  6. using Newtonsoft.Json.Linq;
  7. namespace SmartBowSDK
  8. {
  9. public class SmartBowNetwork : MonoBehaviour
  10. {
  11. public SmartBowHelper smartBowHelper;
  12. // 本地 IP 地址(只在本地环境下生效)
  13. static string localIPAddress = "192.168.0.108";
  14. //是否使用本地环境
  15. static bool isLocal = false;
  16. // 服务器路径
  17. static string serverPath = "/SmartBowBusinessServer";
  18. // 最终服务器地址
  19. static string serverURL => isLocal
  20. ? $"http://{localIPAddress}:11432{serverPath}"
  21. : $"https://xmjssvr.cn{serverPath}";
  22. //private string serverURL = "https://xmjssvr.cn/SmartBowBusinessServer";
  23. //private const string serverURL = "http://127.0.0.1:11332/SmartBowBusinessServer";
  24. private string loginToken;
  25. /// <summary>
  26. /// 运行时设置本地 IP 并启用本地环境
  27. /// </summary>
  28. public static void SetLocal(string ip)
  29. {
  30. isLocal = true;
  31. localIPAddress = ip;
  32. Debug.Log($"[SmartBowNetwork] 设置IP: {ip}");
  33. }
  34. /// <summary>
  35. /// 发送手机验证码
  36. /// </summary>
  37. public void SendPhoneValidateCode(string phone, int language, Action<RequestResult> callback)
  38. {
  39. string url = $"{serverURL}/phoneValidate/sendPhoneValidateCode" +
  40. $"?phone={UnityWebRequest.EscapeURL(phone)}&language={language}";
  41. StartCoroutine(Post(url, new WWWForm(), callback));
  42. }
  43. /// <summary>
  44. /// 验证手机验证码
  45. /// </summary>
  46. public void ValidatePhoneCode(string phone, int code, Action<RequestResult> callback)
  47. {
  48. string url = $"{serverURL}/phoneValidate/validatePhone" +
  49. $"?phone={UnityWebRequest.EscapeURL(phone)}&code={code}";
  50. StartCoroutine(Post(url, new WWWForm(), callback));
  51. }
  52. /// <summary>
  53. /// 发送邮箱验证码
  54. /// </summary>
  55. public void SendEmailValidateCode(string email, int language, Action<RequestResult> callback)
  56. {
  57. string url = $"{serverURL}/emailValidate/sendEmailValidateCode" +
  58. $"?email={UnityWebRequest.EscapeURL(email)}&language={language}";
  59. StartCoroutine(Post(url, new WWWForm(), callback));
  60. }
  61. /// <summary>
  62. /// 验证邮箱验证码
  63. /// </summary>
  64. public void ValidateEmailCode(string email, int code, Action<RequestResult> callback)
  65. {
  66. string url = $"{serverURL}/emailValidate/validateEmail" +
  67. $"?email={UnityWebRequest.EscapeURL(email)}&code={code}";
  68. StartCoroutine(Post(url, new WWWForm(), callback));
  69. }
  70. /// <summary>
  71. /// 用户注册
  72. /// </summary>
  73. /// <param name="serverIndex">服务器索引</param>
  74. /// <param name="username">用户名</param>
  75. /// <param name="password">密码</param>
  76. /// <param name="email">邮箱</param>
  77. /// <param name="phone">手机号</param>
  78. /// <param name="code">当前接收的code,海外用邮箱 serverIndex = 1,国内 serverIndex = 0用手机号</param>
  79. /// <param name="callback">回调</param>
  80. public void RegisterByCode(int serverIndex, string username, string password, string email, string phone,int code, Action<RequestResult> callback)
  81. {
  82. string url = $"{serverURL}/gameLogin/registerByCode" +
  83. $"?serverIndex={serverIndex}" +
  84. $"&username={UnityWebRequest.EscapeURL(username)}" +
  85. $"&password={UnityWebRequest.EscapeURL(password)}" +
  86. $"&email={UnityWebRequest.EscapeURL(email)}" +
  87. $"&phone={UnityWebRequest.EscapeURL(phone)}" +
  88. $"&code={code}";
  89. StartCoroutine(Post(url, new WWWForm(), callback));
  90. }
  91. //public IEnumerator ListUsernamesByEmail(string email, long timestamp, string sign, Action<RequestResult> callback)
  92. //{
  93. // string url = serverURL + "/gameLogin/listUsernamesByEmail";
  94. // WWWForm form = new WWWForm();
  95. // form.AddField("email", email);
  96. // form.AddField("timestamp", timestamp.ToString());
  97. // form.AddField("sign", sign);
  98. // using (UnityWebRequest request = UnityWebRequest.Post(url, form))
  99. // {
  100. // yield return request.SendWebRequest();
  101. // RequestResult requestResult = JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text);
  102. // if (callback != null) callback(requestResult);
  103. // }
  104. //}
  105. //public IEnumerator ListUsernamesByPhone(string phone, long timestamp, string sign, Action<RequestResult> callback)
  106. //{
  107. // string url = serverURL + "/gameLogin/listUsernamesByPhone";
  108. // WWWForm form = new WWWForm();
  109. // form.AddField("phone", phone);
  110. // form.AddField("timestamp", timestamp.ToString());
  111. // form.AddField("sign", sign);
  112. // using (UnityWebRequest request = UnityWebRequest.Post(url, form))
  113. // {
  114. // yield return request.SendWebRequest();
  115. // RequestResult requestResult = JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text);
  116. // if (callback != null) callback(requestResult);
  117. // }
  118. //}
  119. //public IEnumerator ResetPassword(string sign, long timestamp, string username, string password, Action<RequestResult> callback)
  120. //{
  121. // string url = serverURL + "/gameLogin/resetPassword";
  122. // WWWForm form = new WWWForm();
  123. // form.AddField("sign", sign);
  124. // form.AddField("timestamp", timestamp.ToString());
  125. // form.AddField("username", username);
  126. // form.AddField("password", password);
  127. // using (UnityWebRequest request = UnityWebRequest.Post(url, form))
  128. // {
  129. // yield return request.SendWebRequest();
  130. // RequestResult requestResult = JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text);
  131. // if (callback != null) callback(requestResult);
  132. // }
  133. //}
  134. //重置密码
  135. public void ResetPasswordByAccount(int serverIndex,string account, string codeAccount, int code, string newPassword, Action<RequestResult> callback)
  136. {
  137. StartCoroutine(ResetPasswordByAccountCoroutine(serverIndex,account, codeAccount, code, newPassword, callback));
  138. }
  139. /// <summary>
  140. /// 重置密码流程,先验证Code,在获取list,再重置对应的账号。
  141. /// 基本和弓箭app流程一样
  142. /// </summary>
  143. /// <param name="serverIndex"></param>
  144. /// <param name="account"></param>
  145. /// <param name="codeAccount"></param>
  146. /// <param name="code"></param>
  147. /// <param name="newPassword"></param>
  148. /// <param name="callback"></param>
  149. /// <returns></returns>
  150. private IEnumerator ResetPasswordByAccountCoroutine(int serverIndex,string account,string codeAccount, int code, string newPassword, Action<RequestResult> callback)
  151. {
  152. RequestResult validateResult = null;
  153. if (!(serverIndex >= 0 && serverIndex <= 2))
  154. {
  155. callback?.Invoke(new RequestResult
  156. {
  157. code = -10,
  158. msg = "serverIndex 错误!",
  159. });
  160. yield break;
  161. }
  162. bool isPhone = serverIndex == 0 ? true : false;
  163. // 1. 验证验证码
  164. string validateUrl = isPhone
  165. ? $"{serverURL}/phoneValidate/validatePhone?phone={UnityWebRequest.EscapeURL(codeAccount)}&code={code}"
  166. : $"{serverURL}/emailValidate/validateEmail?email={UnityWebRequest.EscapeURL(codeAccount)}&code={code}";
  167. yield return Post(validateUrl, new WWWForm(), result => validateResult = result);
  168. if (validateResult == null || validateResult.code != 0)
  169. {
  170. callback?.Invoke(new RequestResult
  171. {
  172. code = -10,
  173. msg = isPhone ? "手机号验证码验证失败" : "邮箱验证码验证失败"
  174. });
  175. yield break;
  176. }
  177. // 2. 提取验证信息
  178. JObject data = validateResult.data as JObject;
  179. string verifiedAccount = data.Value<string>(isPhone ? "phone" : "email");
  180. long timestamp = data.Value<long>("timestamp");
  181. string sign = data.Value<string>("sign");
  182. // 3. 查询用户名
  183. RequestResult listResult = null;
  184. string listUrl = isPhone
  185. ? $"{serverURL}/gameLogin/listUsernamesByPhone"
  186. : $"{serverURL}/gameLogin/listUsernamesByEmail";
  187. WWWForm listForm = new WWWForm();
  188. listForm.AddField(isPhone ? "phone" : "email", verifiedAccount);
  189. listForm.AddField("timestamp", timestamp.ToString());
  190. listForm.AddField("sign", sign);
  191. yield return Post(listUrl, listForm, result => listResult = result);
  192. if (listResult == null || listResult.code != 0)
  193. {
  194. callback?.Invoke(new RequestResult { code = -11, msg = "未找到绑定的账号" });
  195. yield break;
  196. }
  197. // 4. 精确匹配账号名再重置密码
  198. JArray users = listResult.data as JArray;
  199. bool matched = false;
  200. foreach (var item in users)
  201. {
  202. string username = item.Value<string>("username");
  203. long ts = item.Value<long>("timestamp");
  204. string sgn = item.Value<string>("sign");
  205. SmartBowLogger.Log(this,$"server: {username} vs account: {account}");
  206. if (account.ToLower() == username.ToLower())
  207. {
  208. matched = true;
  209. SmartBowLogger.Log(this,"匹配成功:" + username.ToLower());
  210. // 5. 请求重置密码
  211. string resetUrl = $"{serverURL}/gameLogin/resetPassword";
  212. WWWForm resetForm = new WWWForm();
  213. resetForm.AddField("sign", sgn);
  214. resetForm.AddField("timestamp", ts.ToString());
  215. resetForm.AddField("username", username);
  216. resetForm.AddField("password", newPassword);
  217. yield return Post(resetUrl, resetForm, callback);
  218. break;
  219. }
  220. }
  221. // 6. 如果没有匹配账号,提示
  222. if (!matched)
  223. {
  224. callback?.Invoke(new RequestResult { code = -12, msg = "未找到对应账号绑定" });
  225. }
  226. }
  227. /// <summary>
  228. /// 登录
  229. /// gameID和channelID请询问插件给予者给予
  230. /// </summary>
  231. /// <param name="gameID"></param>
  232. /// <param name="channelID"></param>
  233. /// <param name="username"></param>
  234. /// <param name="password"></param>
  235. /// <param name="callback"></param>
  236. public void Login(string gameID, string channelID, string username, string password, Action<LoginResult> callback)
  237. {
  238. WWWForm form = new WWWForm();
  239. form.AddField("gameID", gameID);
  240. form.AddField("channelID", channelID);
  241. form.AddField("username", username);
  242. form.AddField("password", password);
  243. StartCoroutine(Post(serverURL + "/SmartBowSDK/login", form, (res) =>
  244. {
  245. bool loginSuccess = res.code == 0;
  246. if (loginSuccess) loginToken = res.data as string;
  247. LoginResult loginResult = new LoginResult();
  248. loginResult.success = loginSuccess;
  249. loginResult.message = res.msg;
  250. callback?.Invoke(loginResult);
  251. }));
  252. }
  253. /// <summary>
  254. /// 登出
  255. /// </summary>
  256. /// <param name="callback"></param>
  257. public void Logout(Action<bool> callback)
  258. {
  259. loginToken = null;
  260. callback?.Invoke(true);
  261. }
  262. /// <summary>
  263. /// 获取用户信息
  264. /// </summary>
  265. /// <param name="callback"></param>
  266. public void GetUserInfo(Action<GetUserInfoResult> callback)
  267. {
  268. GetUserInfoResult getUserInfoResult = new GetUserInfoResult();
  269. if (loginToken == null)
  270. {
  271. getUserInfoResult.message = "尚未登录";
  272. callback?.Invoke(getUserInfoResult);
  273. return;
  274. }
  275. WWWForm form = new WWWForm();
  276. form.AddField("token", loginToken);
  277. StartCoroutine(Post(serverURL + "/SmartBowSDK/getUserInfo", form, (res) =>
  278. {
  279. if (res.code == 0)
  280. {
  281. UserInfo userInfo = (res.data as JObject).ToObject<UserInfo>();
  282. getUserInfoResult.success = true;
  283. getUserInfoResult.userInfo = userInfo;
  284. }
  285. getUserInfoResult.message = res.msg;
  286. callback?.Invoke(getUserInfoResult);
  287. }));
  288. }
  289. /// <summary>
  290. /// 设置用户名
  291. /// </summary>
  292. /// <param name="nickname">用户名字</param>
  293. /// <param name="callback"></param>
  294. public void SaveUserName(string nickname, Action<RequestResult> callback)
  295. {
  296. if (loginToken == null)
  297. {
  298. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  299. return;
  300. }
  301. string url = $"{serverURL}/SmartBowSDK/saveUserName?token={loginToken}&nickname={UnityWebRequest.EscapeURL(nickname)}";
  302. StartCoroutine(Post(url, new WWWForm(), callback));
  303. }
  304. /// <summary>
  305. /// 设置用户的多个信息
  306. /// </summary>
  307. /// <param name="userInfo">用户信息对象</param>
  308. /// <param name="callback"></param>
  309. public void SaveUserInfo(UserInfoExtended userInfo, Action<RequestResult> callback)
  310. {
  311. if (loginToken == null)
  312. {
  313. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  314. return;
  315. }
  316. string json = JsonConvert.SerializeObject(userInfo);
  317. UnityWebRequest request = new UnityWebRequest($"{serverURL}/SmartBowSDK/saveUserInfo?token={loginToken}", "POST");
  318. byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(json);
  319. request.uploadHandler = new UploadHandlerRaw(bodyRaw);
  320. request.downloadHandler = new DownloadHandlerBuffer();
  321. request.SetRequestHeader("Content-Type", "application/json");
  322. StartCoroutine(SendRequest(request, callback));
  323. }
  324. /// <summary>
  325. /// 根据密钥上传分数
  326. /// </summary>
  327. /// <param name="secret"></param>
  328. /// <param name="score"></param>
  329. /// <param name="callback"></param>
  330. public void UploadSeasonSinglePlayerGameRes(string secret, int score, Action<RequestResult> callback)
  331. {
  332. if (loginToken == null)
  333. {
  334. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  335. return;
  336. }
  337. string url = $"{serverURL}/SmartBowSDK/UploadSeasonSinglePlayerGameRes?token={loginToken}&secret={UnityWebRequest.EscapeURL(secret)}&score={score}";
  338. StartCoroutine(Post(url, new WWWForm(), callback));
  339. }
  340. /// <summary>
  341. /// 上传赛季PK分数
  342. /// </summary>
  343. /// <param name="roomKey">PK房间ID</param>
  344. /// <param name="secret">密钥,游戏类型(解析得到)</param>
  345. /// <param name="p2ID">对手ID</param>
  346. /// <param name="gameRes">结果(0:我赢;1:他赢;2:平局)</param>
  347. /// <param name="callback">回调</param>
  348. public void UploadSeasonPKGameRes(string roomKey, string secret, int p2ID, int gameRes, Action<RequestResult> callback)
  349. {
  350. if (loginToken == null)
  351. {
  352. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  353. return;
  354. }
  355. string url = $"{serverURL}/SmartBowSDK/UploadSeasonPKGameRes" +
  356. $"?token={loginToken}" +
  357. $"&roomKey={UnityWebRequest.EscapeURL(roomKey)}" +
  358. $"&secret={UnityWebRequest.EscapeURL(secret)}" +
  359. $"&p2ID={p2ID}" +
  360. $"&gameRes={gameRes}";
  361. StartCoroutine(Post(url, new WWWForm(), callback));
  362. }
  363. /// <summary>
  364. /// 根据密钥获取排行榜
  365. /// </summary>
  366. /// <param name="secret">密钥</param>
  367. /// <param name="rankArea">排行区域 3:国,1:省,2市,其他:全球</param>
  368. /// <param name="country">国家</param>
  369. /// <param name="state">省</param>
  370. /// <param name="city">城市</param>
  371. /// <param name="callback"></param>
  372. public void GetSeasonRankListByGameType(string secret, int rankArea, string country, string state, string city, Action<RequestResult> callback)
  373. {
  374. if (loginToken == null)
  375. {
  376. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  377. return;
  378. }
  379. string url = $"{serverURL}/SmartBowSDK/GetSeasonRankListByGameType?" +
  380. $"token={loginToken}" +
  381. $"&rankArea={rankArea}" +
  382. $"&secret={UnityWebRequest.EscapeURL(secret)}" +
  383. $"&countryCode={UnityWebRequest.EscapeURL(country)}" +
  384. $"&stateCode={UnityWebRequest.EscapeURL(state)}" +
  385. $"&cityCode={UnityWebRequest.EscapeURL(city)}";
  386. StartCoroutine(Post(url, new WWWForm(), callback));
  387. }
  388. /// <summary>
  389. /// 根据密钥获取自定义排行榜
  390. /// </summary>
  391. /// <param name="secret">密钥</param>
  392. /// <param name="rankArea">排行区域 3:国,1:省,2市,其他:全球</param>
  393. /// <param name="country">国家</param>
  394. /// <param name="state">省</param>
  395. /// <param name="city">市</param>
  396. /// <param name="rankType">1是降序,其他是升序(不能小于0)</param>
  397. /// <param name="count">数量:不能小于0</param>
  398. /// <param name="callback"></param>
  399. public void GetSeasonRankListByCustom(string secret, int rankArea, string country, string state, string city, int rankType, int count, Action<RequestResult> callback)
  400. {
  401. if (loginToken == null)
  402. {
  403. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  404. return;
  405. }
  406. string url = $"{serverURL}/SmartBowSDK/GetSeasonRankListByCustom?" +
  407. $"token={loginToken}" +
  408. $"&rankArea={rankArea}" +
  409. $"&secret={UnityWebRequest.EscapeURL(secret)}" +
  410. $"&countryCode={UnityWebRequest.EscapeURL(country)}" +
  411. $"&stateCode={UnityWebRequest.EscapeURL(state)}" +
  412. $"&cityCode={UnityWebRequest.EscapeURL(city)}" +
  413. $"&rankType={rankType}" +
  414. $"&count={count}";
  415. StartCoroutine(Post(url, new WWWForm(), callback));
  416. }
  417. /// <summary>
  418. /// 获取自己的用户信息
  419. /// </summary>
  420. /// <param name="secret">密钥</param>
  421. /// <param name="rankArea">排行区域 3:国,1:省,2市,其他:全球</param>
  422. /// <param name="country">国家</param>
  423. /// <param name="state">省</param>
  424. /// <param name="city">市</param>
  425. /// <param name="rankType">1是降序,其他是升序(不能小于0)</param>
  426. /// <param name="count">数量:不能小于0</param>
  427. /// <param name="callback"></param>
  428. public void GetUserRankByGameType(string secret, int rankArea, string country, string state, string city, int rankType, int count, Action<RequestResult> callback)
  429. {
  430. if (loginToken == null)
  431. {
  432. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  433. return;
  434. }
  435. string url = $"{serverURL}/SmartBowSDK/getUserRankByGameType?" +
  436. $"token={loginToken}" +
  437. $"&rankArea={rankArea}" +
  438. $"&secret={UnityWebRequest.EscapeURL(secret)}" +
  439. $"&countryCode={UnityWebRequest.EscapeURL(country)}" +
  440. $"&stateCode={UnityWebRequest.EscapeURL(state)}" +
  441. $"&cityCode={UnityWebRequest.EscapeURL(city)}" +
  442. $"&rankType={rankType}" +
  443. $"&count={count}";
  444. StartCoroutine(Post(url, new WWWForm(), callback));
  445. }
  446. /// <summary>
  447. /// 上传排行榜分数(定制)
  448. /// </summary>
  449. /// <param name="secret">密钥</param>
  450. /// <param name="taskId">任务类型</param>
  451. /// <param name="difficultType">难度</param>
  452. /// <param name="modeType">模式</param>
  453. /// <param name="deviceType">设备类型</param>
  454. /// <param name="score">分数(>=0)</param>
  455. /// <param name="callback">回调</param>
  456. public void UploadCustomLeaderboardScore(string secret, int taskId, int difficultType, int modeType, int deviceType, int score, Action<RequestResult> callback)
  457. {
  458. if (loginToken == null)
  459. {
  460. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  461. return;
  462. }
  463. if (score < 0)
  464. {
  465. callback?.Invoke(new RequestResult { msg = "分数不能小于0" });
  466. return;
  467. }
  468. string url = $"{serverURL}/SmartBowSDK/UploadCustomLeaderboardScore";
  469. WWWForm form = new WWWForm();
  470. form.AddField("token", loginToken);
  471. form.AddField("secret", secret);
  472. form.AddField("taskId", taskId);
  473. form.AddField("difficultType", difficultType);
  474. form.AddField("modeType", modeType);
  475. form.AddField("deviceType", deviceType);
  476. form.AddField("score", score);
  477. StartCoroutine(Post(url, form, callback));
  478. }
  479. /// <summary>
  480. /// 获取排行榜(自定义)
  481. /// </summary>
  482. /// <param name="secret">密钥</param>
  483. /// <param name="taskId">任务类型</param>
  484. /// <param name="difficultType">难度</param>
  485. /// <param name="modeType">模式</param>
  486. /// <param name="deviceType">设备类型</param>
  487. /// <param name="timeType">时间维度</param>
  488. /// <param name="callback">回调</param>
  489. public void GetCustomLeaderboard(string secret, int taskId, int difficultType, int modeType, int deviceType, int timeType, Action<RequestResult> callback)
  490. {
  491. if (loginToken == null)
  492. {
  493. callback?.Invoke(new RequestResult { msg = "尚未登录" });
  494. return;
  495. }
  496. string url = $"{serverURL}/SmartBowSDK/GetCustomLeaderboard";
  497. WWWForm form = new WWWForm();
  498. form.AddField("token", loginToken);
  499. form.AddField("secret", secret);
  500. form.AddField("taskId", taskId);
  501. form.AddField("difficultType", difficultType);
  502. form.AddField("modeType", modeType);
  503. form.AddField("deviceType", deviceType);
  504. form.AddField("timeType", timeType);
  505. StartCoroutine(Post(url, form, callback));
  506. }
  507. private string GetCalibrateDataStorageLocalKey(string mac)
  508. {
  509. string key = "CalibrateDataStorage";
  510. string version = "1.0.0";
  511. return key + "_" + mac + "_" + version;
  512. }
  513. internal void SaveCalibrateRecord(string mac, string record)
  514. {
  515. if (smartBowHelper.calibrateDataStorageMode == CalibrateDataStorageMode.Local)
  516. {
  517. PlayerPrefs.SetString(GetCalibrateDataStorageLocalKey(mac), record == null ? "" : record);
  518. }
  519. else if (smartBowHelper.calibrateDataStorageMode == CalibrateDataStorageMode.Remote)
  520. {
  521. WWWForm form = new WWWForm();
  522. form.AddField("mac", mac);
  523. form.AddField("record", record);
  524. StartCoroutine(Post(serverURL + "/SmartBowSDK/saveCalibrateRecord", form, null));
  525. }
  526. }
  527. internal void GetCalibrateRecord(string mac, Action<string> callback)
  528. {
  529. if (smartBowHelper.calibrateDataStorageMode == CalibrateDataStorageMode.Local)
  530. {
  531. callback?.Invoke(PlayerPrefs.GetString(GetCalibrateDataStorageLocalKey(mac), ""));
  532. }
  533. else if (smartBowHelper.calibrateDataStorageMode == CalibrateDataStorageMode.Remote)
  534. {
  535. WWWForm form = new WWWForm();
  536. form.AddField("mac", mac);
  537. StartCoroutine(Post(serverURL + "/SmartBowSDK/getCalibrateRecord", form, (res) =>
  538. {
  539. if (res.code == 0) callback?.Invoke(res.data as string);
  540. }));
  541. }
  542. }
  543. public static IEnumerator Post(string url, WWWForm form, Action<RequestResult> callback)
  544. {
  545. using (UnityWebRequest request = UnityWebRequest.Post(url, form))
  546. {
  547. yield return request.SendWebRequest();
  548. if (request.result == UnityWebRequest.Result.Success)
  549. callback?.Invoke(JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text));
  550. else
  551. callback?.Invoke(new RequestResult());
  552. }
  553. }
  554. public static IEnumerator LoadSprite(string url, Action<Sprite> callback)
  555. {
  556. using (UnityWebRequest uwr = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET))
  557. {
  558. uwr.downloadHandler = new DownloadHandlerTexture();
  559. yield return uwr.SendWebRequest();
  560. if (uwr.result != UnityWebRequest.Result.Success) yield break;
  561. Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
  562. Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
  563. callback?.Invoke(sprite);
  564. }
  565. }
  566. private IEnumerator SendRequest(UnityWebRequest request, Action<RequestResult> callback)
  567. {
  568. yield return request.SendWebRequest();
  569. if (request.result == UnityWebRequest.Result.Success)
  570. callback?.Invoke(JsonConvert.DeserializeObject<RequestResult>(request.downloadHandler.text));
  571. else
  572. callback?.Invoke(new RequestResult());
  573. }
  574. }
  575. public class RequestResult
  576. {
  577. public int code = -9999;
  578. public object data;
  579. public string msg = "网络出错";
  580. }
  581. public class LoginResult
  582. {
  583. /// <summary>
  584. /// 是否登录成功
  585. /// </summary>
  586. public bool success;
  587. /// <summary>
  588. /// 消息描述
  589. /// </summary>
  590. public string message;
  591. }
  592. public class GetUserInfoResult
  593. {
  594. /// <summary>
  595. /// 是否获取成功
  596. /// </summary>
  597. public bool success;
  598. /// <summary>
  599. /// 消息描述
  600. /// </summary>
  601. public string message;
  602. /// <summary>
  603. /// 用户信息
  604. /// </summary>
  605. public UserInfo userInfo;
  606. }
  607. public class UserInfo
  608. {
  609. /// <summary>
  610. /// 昵称
  611. /// </summary>
  612. public string nickname;
  613. /// <summary>
  614. /// 头像地址
  615. /// </summary>
  616. public string avatarUrl;
  617. /// <summary>
  618. /// 性别(1表示男,2表示女)
  619. /// </summary>
  620. public int gender;
  621. }
  622. /// <summary>
  623. /// 用户数据
  624. /// </summary>
  625. public class UserInfoExtended
  626. {
  627. /// <summary>
  628. /// //头像url
  629. /// </summary>
  630. public string avatarUrl;
  631. /// <summary>
  632. /// //名字
  633. /// </summary>
  634. public string nickname;
  635. /// <summary>
  636. /// //性别 1 男,2女
  637. /// </summary>
  638. public int gender;
  639. /// <summary>
  640. /// 生日
  641. /// </summary>
  642. public string birthday;
  643. /// <summary>
  644. /// 国家
  645. /// </summary>
  646. public string country;
  647. /// <summary>
  648. /// 省
  649. /// </summary>
  650. public string state;
  651. /// <summary>
  652. /// 城市
  653. /// </summary>
  654. public string city;
  655. }
  656. }