using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; namespace ET.Server { [FriendOf(typeof (MapDouyinLiveGiftComponent))] public static class MapDouyinLiveGiftComponentSystem { public class MapDouyinLiveGiftComponentAwakeSystem: AwakeSystem { protected override void Awake(MapDouyinLiveGiftComponent self) { Log.Info($"创建抖音直播礼物任务组件..."); } } public class MapDouyinLiveGiftComponentDestroySystem: DestroySystem { protected override void Destroy(MapDouyinLiveGiftComponent self) { Log.Info($"销毁抖音直播礼物任务组件"); self.StopTask(); } } public class MapDouyinLiveGiftComponentUpdateSystem: UpdateSystem { protected override void Update(MapDouyinLiveGiftComponent self) { WNPlayer player = self.GetParent().Player; bool tokenIsNull = player.GetComponent().Data.TokenIsNull; if (tokenIsNull) { return; } // 运行中状态 if (self.Status == 3) { return; } Log.Debug($"检查抖音直播礼物任务状态...Status={self.Status}"); self.Status = self.CheckTaskStatus(); switch (self.Status) { case -1: { // 接口请求出错 Log.Debug($"检查抖音直播礼物任务状态 - 抖音接口请求出错"); break; } case 1: { // 数据推送回调任务不存在 Log.Debug($"检查抖音直播礼物任务状态 - 任务已经被删除,可能是因为主播取消挂载/已关播"); break; } case 2: { // 数据推送回调任务未启动则启动 Log.Debug($"检查抖音直播礼物任务状态 - 任务启动..."); self.StartTask(); break; } case 3: // 数据推送回调任务运行中,不处理 break; } } } /// /// 启动礼物推送任务 /// /// private static void StartTask(this MapDouyinLiveGiftComponent self) { // 请求头 Dictionary head = new Dictionary(); head.Add("access-token", self.GetParent().GetDouyinAccessToken()); // 参数 JObject param = new JObject(); param.Add("roomid", self.GetParent().RoomId.ToString()); param.Add("appid", DouyinConst.Appid); param.Add("msg_type", "live_gift"); string str = HttpHelper.PostRequestByDouyin(DouyinConst.StartTaskUrl, head, param); if (string.IsNullOrEmpty(str)) { Log.Error($"启动礼物推送任务 - StartTaskUrl 请求失败...返回为null"); return; } JObject jObject = JObject.Parse(str); int errNo = Convert.ToInt32(jObject.SelectToken("err_no")); if (errNo != 0) { if (errNo == 40004) { Log.Debug($"启动礼物推送任务 - StartTaskUrl 请求成功 - 40004 容错处理:AccessToken不合法,下一秒重新刷新"); self.GetParent().DomainScene().GetComponent().AccessTokenTime = 0; } else { Log.Error($"启动礼物推送任务 - StartTaskUrl 请求成功...返回错误:{errNo}"); } return; } self.LogId = Convert.ToInt64(jObject.SelectToken("data").SelectToken("logid")); self.TaskId = Convert.ToInt64(jObject.SelectToken("data").SelectToken("task_id")); } /// /// 停止礼物推送任务 /// /// private static void StopTask(this MapDouyinLiveGiftComponent self) { // 请求头 Dictionary head = new Dictionary(); head.Add("access-token", self.GetParent().GetDouyinAccessToken()); // 参数 JObject param = new JObject(); param.Add("roomid", self.GetParent().RoomId.ToString()); param.Add("appid", DouyinConst.Appid); param.Add("msg_type", "live_gift"); string str = HttpHelper.PostRequestByDouyin(DouyinConst.StopTaskUrl, head, param); if (string.IsNullOrEmpty(str)) { Log.Error($"停止礼物推送任务 - StopTaskUrl 请求失败...返回为null"); return; } JObject jObject = JObject.Parse(str); int errNo = Convert.ToInt32(jObject.SelectToken("err_no")); if (errNo != 0) { if (errNo == 40004) { Log.Debug($"停止礼物推送任务 - StopTaskUrl 请求成功 - 40004 容错处理:AccessToken不合法,下一秒重新刷新"); self.GetParent().DomainScene().GetComponent().AccessTokenTime = 0; } else { Log.Error($"停止礼物推送任务 - StopTaskUrl 请求成功...返回错误:{errNo}"); } return; } self.LogId = Convert.ToInt64(jObject.SelectToken("data").SelectToken("logid")); } /// /// 检查礼物推送任务状态 (1-任务不存在, 2-任务未启动, 3-任务运行中) /// /// /// private static int CheckTaskStatus(this MapDouyinLiveGiftComponent self) { Dictionary head = new Dictionary(); head.Add("access-token", self.GetParent().GetDouyinAccessToken()); // 参数 Dictionary param = new Dictionary(); param.Add("roomid", self.GetParent().RoomId.ToString()); param.Add("appid", DouyinConst.Appid); param.Add("msg_type", "live_gift"); string str = HttpHelper.GetRequestByDouyin(DouyinConst.CheckTaskUrl, head, param); if (string.IsNullOrEmpty(str)) { Log.Error($"检查礼物推送任务状态 - CheckTaskUrl 请求失败...返回为null"); return -1; } JObject jObject = JObject.Parse(str); int errNo = Convert.ToInt32(jObject.SelectToken("err_no")); if (errNo != 0) { if (errNo == 40004) { Log.Debug($"检查礼物推送任务状态 - CheckTaskUrl 请求成功 - 40004 容错处理:AccessToken不合法,下一秒重新刷新"); self.GetParent().DomainScene().GetComponent().AccessTokenTime = 0; } else { Log.Error($"检查礼物推送任务状态 - CheckTaskUrl 请求成功...返回错误:{errNo}"); } return -1; } self.LogId = Convert.ToInt64(jObject.SelectToken("data").SelectToken("logid")); return Convert.ToInt32(jObject.SelectToken("data").SelectToken("status")); } } }