using game.PlayerDataStorage; using Newtonsoft.Json; using asap.core; using cfg; using game; using GameCore; using System; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; public class SurveyService { const string SurveyUrl = "https://wesurvey.com/"; const string SurveyData = "SurveyData"; const string SurveyReadSidData = "SurveyReadSidData"; readonly IPlayerSaveStore saveStore; readonly HashSet pendingRewards = new HashSet(); IUserService userService; cfg.Tables tables; List receivedReward = new List(); List readSid = new List(); public SurveyData tableData; public SurveyService(IUserService userService, cfg.Tables tables, IPlayerSaveStore saveStore) { this.userService = userService; this.tables = tables; tableData = null; this.saveStore = saveStore; receivedReward = ReadList(SurveyData); readSid = ReadList(SurveyReadSidData); } List ReadList(string key) { var read = saveStore.Read(key); var json = read.ValueOrThrow(); if (read.Found == false) return new List(); if (string.IsNullOrEmpty(json)) throw new JsonSerializationException("Empty survey save: " + key); return JsonConvert.DeserializeObject>(json) ?? throw new JsonSerializationException("Null survey save: " + key); } public bool IsCurrent => saveStore.IsCurrent && !userService.LoginLifetime.IsCancellationRequested; /// /// 拉取问卷 /// public void GetSurveyMatchlist() { try { if (!IsCurrent) return; PlayerData playerData = GContext.container.Resolve(); List surveyDataTable = tables.TbSurveyData.DataList; ulong userId = Convert.ToUInt64(userService.UserId, saveStore is KVPlayerSaveStore ? 10 : 16); tableData = null; if (surveyDataTable.Count > 0) { for (int i = 0; i < surveyDataTable.Count; i++) { if (!receivedReward.Contains(surveyDataTable[i].ID.ToString())) { if (surveyDataTable[i].LevelCondition >= playerData.lv) { continue; } int tailNumber = (int)(userId % 10); if (!surveyDataTable[i].TailNumberList.Contains(tailNumber)) { continue; } tableData = surveyDataTable[i]; break; } } } ////设置红点 SetRedPoint(); } catch (Exception e) { Debug.LogError("GetSurveyMatchlist:" + e); } } void SetRedPoint() { if (tableData == null) { RedPointManager.Instance.SetRedPointState("menu.survey", false); } else { RedPointManager.Instance.SetRedPointState("menu.survey", true); } } /// /// 请求答题的链接 /// /// public string GetSurveyAnswer() { if (!IsCurrent || tableData == null) { return ""; } string url = $"{SurveyUrl}s2/{tableData.ID}/{tableData.Hash}/?&uid={userService.CustomId}"; //标记已读 var next = new List(readSid); if (!next.Contains(tableData.ID.ToString())) next.Add(tableData.ID.ToString()); saveStore.Write(SurveyReadSidData, JsonConvert.SerializeObject(next)).RequireAccepted(); readSid = next; GetSurveyMatchlist(); return url; } /// /// 检查是否能领奖 /// public async Task GetSurveyCheckAnswer(SurveyData survey) { if (!IsCurrent) throw new OperationCanceledException(); if (survey == null) return; string sid = survey.ID.ToString(); if (pendingRewards.Contains(sid)) throw new InvalidOperationException("Survey reward is pending or requires recovery."); if (receivedReward.Contains(sid)) return; pendingRewards.Add(sid); var items = GContext.container.Resolve(); var player = GContext.container.Resolve(); await PlayerSaveAction.RunAsync(saveStore, "survey:" + sid, () => { items.AddItemByDrop(survey.Reward, null); PlayerSaveAction.Present(() => GContext.Publish(new ShowData())); receivedReward.Add(sid); saveStore.Write(SurveyData, JsonConvert.SerializeObject(receivedReward)).RequireAccepted(); }, () => player.SavePlayerData(), userService.LoginLifetime); if (!IsCurrent) throw new OperationCanceledException(); pendingRewards.Remove(sid); GetSurveyMatchlist(); } }