private void ScanAction(object sender, string data) { try { var scanEventArgs = new ScanEventArgs(data); Task.Run(() => { ScanEvent?.Invoke(sender, scanEventArgs); }); var response = scanEventArgs.Wait(_responseTimeoutInMilliseconds); if (response.ConfirmationReceived) { _serialPort.Write($"OK{Constants.End}"); _serialPort.Write(response.ConfirmationMessage.TextCommandData + Constants.End); if (!response.IsSuccess) { _serialPort.Write(Constants.BeepBadReadTone + Constants.LedRedOn + Constants.End); } } else { ScanConfirmationNotreceivedEvent?.Invoke(this, new ScanConfirmationNotreceivedEventArgs(data)); } } catch (Exception e) { MessageEvent?.Invoke(this, new MessageEventArgs(e)); } }
private void ScanCallback(ScanEvent obj) { var systemobject = SystemObject.GetObject(obj); switch (systemobject.ObjectType) { case ObjectType.Star: HandleStarObject((StarObject)systemobject); break; case ObjectType.Planet: HandlePlanetObject((PlanetObject)systemobject); break; case ObjectType.ClusterBelt: HandleClusterBeltObject((ClusterBeltObject)systemobject); break; case ObjectType.Ring: HandleRingObject((RingObject)systemobject); break; default: break; } }
internal ScanEvent InvokeEvent(ScanEvent arg) { if (_api.ValidateEvent(arg)) { Scan?.Invoke(_api, arg); } return(arg); }
private void FSSScanCallback(ScanEvent obj) { var systemobject = SystemObject.GetObject(obj); _objects.Add(systemobject); SetValue(() => CurrentBodySingals, _objects.Where(m => m.ObjectType == ObjectType.Star || m.ObjectType == ObjectType.Planet).Count()); SetValue(() => CurrentNonBodySingals, _objects.Where(m => m.ObjectType == ObjectType.ClusterBelt).Count()); OnAction("AddObject"); }
internal static ClusterBeltObject CreateCluster(ScanEvent obj) { return(new ClusterBeltObject() { ObjectType = ObjectType.ClusterBelt, Scantype = obj.ScanType, Name = obj.BodyName, Id = obj.BodyId, Parents = obj.Parents, }); }
internal static RingObject CreateRing(ScanEvent obj) { return(new RingObject() { ObjectType = ObjectType.Ring, Scantype = obj.ScanType, Name = obj.BodyName, Id = obj.BodyId, Parents = obj.Parents, }); }
private void HandleError(string scanId, ScanData data, string error, bool fatal) { // TODO: Logging if (fatal) { var msg = $"Error on scanning [{data.Item.ScanSource}]: {error}"; _log.Error(msg); ScanEvent?.Invoke(this, new ScanEventArgs(data.Item.CallbackId, msg)); data.SetError(error); } else { _log.Warning($"Warning for scan [{data.Item.ScanSource}]: {error}"); } }
internal static StarObject CreateStar(ScanEvent obj) { return(new StarObject() { ObjectType = ObjectType.Star, Scantype = obj.ScanType, Name = obj.BodyName, Id = obj.BodyId, Parents = obj.Parents, Age = obj.AgeMY, Subclass = obj.Subclass, Startype = obj.StarType, Luminosity = obj.Luminosity, Landable = obj.Landable, }); }
internal static PlanetObject CreatePlanet(ScanEvent obj) { return(new PlanetObject() { ObjectType = ObjectType.Planet, Scantype = obj.ScanType, Name = obj.BodyName, Id = obj.BodyId, Parents = obj.Parents, PlanetClass = obj.PlanetClass, Mass = obj.MassEm, Landable = obj.Landable, Composition = obj.Composition, Atmosphere = obj.Atmosphere, AtmosphereComposition = obj.AtmosphereComposition, AtmosphereType = obj.AtmosphereType }); }
internal static SystemObject GetObject(ScanEvent obj) { switch (GetObjectType(obj)) { case ObjectType.Star: return(CreateStar(obj)); case ObjectType.Planet: return(CreatePlanet(obj)); case ObjectType.ClusterBelt: return(CreateCluster(obj)); case ObjectType.Ring: return(CreateRing(obj)); default: return(null); } }
private void HandleError(string scanId, ScanData data, string error, bool severe) { const string itemFailed = "Item is failed: scanning skipped"; if (String.IsNullOrEmpty(error)) { error = "Task was cancelled"; severe = false; } if (severe) { data.Errors++; var msg = $"Errors: {data.Errors} in a row on scanning [{data.Item.ScanSource}]: {error}"; _log.Error(msg); data.StateDescription = error; if (data.Errors >= _errorsToFail) { data.State = ScanEventType.Error; ScanEvent?.Invoke(this, new ScanEventArgs(data.Item.CallbackID, ScanEventType.Error, msg + "\n" + itemFailed)); _log.Error(itemFailed); } else { data.State = ScanEventType.Warning; } } else { data.State = ScanEventType.None; data.StateDescription = error; data.Errors = 0; _log.Warning($"Warning for scan [{data.Item.ScanSource}]: {error}"); } }
/// <summary> /// 事件模型 /// </summary> /// <param name="xml"></param> /// <returns></returns> private EventBase GetEventModel(XmlUtils xml) { string eventType = xml.GetValue("/xml/Event").ToLower(); EventBase message = null; switch (eventType) { case "unsubscribe": message = new UnsubscribeEvent(); break; case "subscribe": message = new SubscribeEvent(); break; case "scan": message = new ScanEvent(); break; case "location": message = new LocationEvent(); break; case "click": message = new ClickEvent(); break; case "view": message = new ViewEvent(); break; default: return(null); } return(message); }
internal static ObjectType GetObjectType(ScanEvent obj) { if (!string.IsNullOrEmpty(obj.StarType)) { return(ObjectType.Star); } else if (!string.IsNullOrEmpty(obj.PlanetClass)) { return(ObjectType.Planet); } else if (obj.Parents.Sum(m => m.Ring) > 0) { return(ObjectType.ClusterBelt); } else if (string.IsNullOrEmpty(obj.PlanetClass) || string.IsNullOrEmpty(obj.StarType)) { return(ObjectType.Ring); } else { Debug.WriteLine("Unkown Scan objecttype"); return(0); } }
private void RfidScanned(ScanEventArgs e) { ScanEvent?.Invoke(this, e); }
private async Task ScanAsync(string scanId, ScanData data) { if (data.Error != null) { return; } using (var lck = data.GetLock()) { if (lck.IsCaptured) { data.IncAttempts(); using (var service = CreateService()) { var item = data.Item; var train = await service.FetchTrainAsync(item.Date, item.Source, item.Destination, item.TrainNumber); if (train != null) { if (train.CoachTypes != null && train.CoachTypes.Length > 0) { CoachType[] coachTypes = null; if (!String.IsNullOrEmpty(item.CoachType)) { var coachType = FindCoachType(train, item.CoachType); if (coachType != null) { coachTypes = new[] { coachType }; } //else if (!allowOtherCoachTypes) //{ // HandleError(scanId, data, "No vacant coaches " + item.CoachType, false); // return; //} } if (coachTypes == null) { coachTypes = train.CoachTypes; } var sessionId = await BookAsync(train, coachTypes, item.FirstName, item.LastName); if (!String.IsNullOrEmpty(sessionId)) { var msg = $"Reserved ticket for [{item.ScanSource}]: {sessionId}"; _log.Info(msg); ScanEvent?.Invoke(this, new ScanEventArgs(item.CallbackId, msg)); //Abort(scanId); rebook again in case it is bought by requester return; } } HandleError(scanId, data, "No vacant seats", false); } else { HandleError(scanId, data, $"Train {item.TrainNumber} not found", true); } } } } }
private string DealWithMsg(ScanEvent scanEvent) { return(""); }
protected virtual string ProcessScanEvent(ScanEvent msg) { return(DefaultProcess(msg)); }
protected override Message ProcessScanEvent(ScanEvent msg) { return(base.ProcessScanEvent(msg)); }
/// <summary> /// 从请求中提取微信消息推送的请求数据 /// </summary> /// <param name="request">推送过来的请求</param> /// <returns>消息推送的请求数据</returns> public MsgRequest GetMsgRequestData(WeChatEncryptMsg requestEncryptMsg) { //微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次 //消息排重,推荐使用msgid排重;事件类型消息推荐使用FromUserName + CreateTime 排重 //服务器无法保证在五秒内处理并回复,直接回复success;直接回复空串,微信不再重试 //开发者在5秒内未回复任何内容,开发者回复了异常数据,微信系统提示“该公众号暂时无法提供服务,请稍后再试” if (weChatConfig == null) { throw new NullReferenceException("请使用构造MessageLinkUp(idOrAppId),或初始化Initialize(idOrAppId)"); } string xmlText;//消息 if (weChatConfig.EnCrypt) { //消息是密文,要解密后处理 xmlText = MessageDecrypt(requestEncryptMsg); } else { var stream = requestEncryptMsg.Body; //具体消息数据在请求流里面 StreamReader reader = new StreamReader(stream); xmlText = reader.ReadToEnd(); //消息 reader.Close(); } XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlText); XmlNode rootNode = xmlDoc.SelectSingleNode("xml"); MsgRequest msgRequest = null; if (rootNode["MsgType"] == null) { msgRequest = new MsgRequest(); } else { string msgType = rootNode["MsgType"].InnerText; switch (msgType) { case "text": ContentMsg contentMsg = new ContentMsg(); if (rootNode["MsgId"] != null) { contentMsg.MsgId = Convert.ToInt64(rootNode["MsgId"].InnerText); } if (rootNode["Content"] != null) { contentMsg.Content = rootNode["Content"].InnerText; } msgRequest = contentMsg; break; case "image": PictureMsg pictureMsg = new PictureMsg(); if (rootNode["MsgId"] != null) { pictureMsg.MsgId = Convert.ToInt64(rootNode["MsgId"].InnerText); } if (rootNode["PicUrl"] != null) { pictureMsg.PicUrl = rootNode["PicUrl"].InnerText; } if (rootNode["MediaId"] != null) { pictureMsg.MediaId = rootNode["MediaId"].InnerText; } msgRequest = pictureMsg; break; case "voice": VoiceMsg voiceMsg = new VoiceMsg(); if (rootNode["MsgId"] != null) { voiceMsg.MsgId = Convert.ToInt64(rootNode["MsgId"].InnerText); } if (rootNode["MediaId"] != null) { voiceMsg.MediaId = rootNode["MediaId"].InnerText; } if (rootNode["Format"] != null) { voiceMsg.Format = rootNode["Format"].InnerText; } if (rootNode["Recognition"] != null) { voiceMsg.Recognition = rootNode["Recognition"].InnerText; } msgRequest = voiceMsg; break; case "video": VideoMsg videoMsg = new VideoMsg(); if (rootNode["MsgId"] != null) { videoMsg.MsgId = Convert.ToInt64(rootNode["MsgId"].InnerText); } if (rootNode["MediaId"] != null) { videoMsg.MediaId = rootNode["MediaId"].InnerText; } if (rootNode["ThumbMediaId"] != null) { videoMsg.ThumbMediaId = rootNode["ThumbMediaId"].InnerText; } msgRequest = videoMsg; break; case "shortvideo": ShortVideoMsg shortVideoMsg = new ShortVideoMsg(); if (rootNode["MsgId"] != null) { shortVideoMsg.MsgId = Convert.ToInt64(rootNode["MsgId"].InnerText); } if (rootNode["MediaId"] != null) { shortVideoMsg.MediaId = rootNode["MediaId"].InnerText; } if (rootNode["ThumbMediaId"] != null) { shortVideoMsg.ThumbMediaId = rootNode["ThumbMediaId"].InnerText; } msgRequest = shortVideoMsg; break; case "location": LocationMsg locationMsg = new LocationMsg(); if (rootNode["MsgId"] != null) { locationMsg.MsgId = Convert.ToInt64(rootNode["MsgId"].InnerText); } if (rootNode["Location_X"] != null) { locationMsg.Location_X = Convert.ToDouble(rootNode["Location_X"].InnerText); } if (rootNode["Location_Y"] != null) { locationMsg.Location_Y = Convert.ToDouble(rootNode["Location_Y"].InnerText); } if (rootNode["Scale"] != null) { locationMsg.Scale = int.Parse(rootNode["Scale"].InnerText); } if (rootNode["Label"] != null) { locationMsg.Label = rootNode["Label"].InnerText; } msgRequest = locationMsg; break; case "link": LinkMsg linkMsg = new LinkMsg(); if (rootNode["MsgId"] != null) { linkMsg.MsgId = Convert.ToInt64(rootNode["MsgId"].InnerText); } if (rootNode["Title"] != null) { linkMsg.Title = rootNode["Title"].InnerText; } if (rootNode["Description"] != null) { linkMsg.Description = rootNode["Description"].InnerText; } if (rootNode["Url"] != null) { linkMsg.Url = rootNode["Url"].InnerText; } msgRequest = linkMsg; break; case "event": if (rootNode["Event"] != null) { string eventStr = rootNode["Event"].InnerText.ToLower(); switch (eventStr) { case "subscribe": if (rootNode["EventKey"] != null) { string eventKey = rootNode["EventKey"].InnerText; if (eventKey.StartsWith("qrscene_")) { ScanSubscribeEvent scanSubscribeEvent = new ScanSubscribeEvent(); scanSubscribeEvent.EventKey = eventKey; if (rootNode["Ticket"] != null) { scanSubscribeEvent.Ticket = rootNode["Ticket"].InnerText; } msgRequest = scanSubscribeEvent; } } if (msgRequest == null) { msgRequest = new SubscribeEvent(); } break; case "unsubscribe": msgRequest = new UnSubscribeEvent(); break; case "scan": ScanEvent scanEvent = new ScanEvent(); if (rootNode["EventKey"] != null) { scanEvent.EventKey = rootNode["EventKey"].InnerText; } if (rootNode["Ticket"] != null) { scanEvent.Ticket = rootNode["Ticket"].InnerText; } msgRequest = scanEvent; break; case "location": LocationEvent locationEvent = new LocationEvent(); if (rootNode["Latitude"] != null) { locationEvent.Latitude = double.Parse(rootNode["Latitude"].InnerText); } if (rootNode["Longitude"] != null) { locationEvent.Longitude = double.Parse(rootNode["Longitude"].InnerText); } if (rootNode["Precision"] != null) { locationEvent.Precision = double.Parse(rootNode["Precision"].InnerText); } msgRequest = locationEvent; break; case "click": ClickEvent clickEvent = new ClickEvent(); if (rootNode["EventKey"] != null) { clickEvent.EventKey = rootNode["EventKey"].InnerText; } msgRequest = clickEvent; break; case "view": ViewEvent viewEvent = new ViewEvent(); if (rootNode["EventKey"] != null) { viewEvent.EventKey = rootNode["EventKey"].InnerText; } msgRequest = viewEvent; break; case "masssendjobfinish": //批量发送群发消息处理完成的消息通知 MassSendJobFinishEvent sendJobFinishEvent = new MassSendJobFinishEvent(); if (rootNode["MsgID"] != null) { sendJobFinishEvent.MsgID = int.Parse(rootNode["MsgID"].InnerText); } if (rootNode["Status"] != null) { sendJobFinishEvent.Status = Enum.Parse <MassSendJobStatus>(rootNode["Status"].InnerText); } if (rootNode["TotalCount"] != null) { sendJobFinishEvent.TotalCount = int.Parse(rootNode["TotalCount"].InnerText); } if (rootNode["FilterCount"] != null) { sendJobFinishEvent.FilterCount = int.Parse(rootNode["FilterCount"].InnerText); } if (rootNode["SentCount"] != null) { sendJobFinishEvent.SentCount = int.Parse(rootNode["SentCount"].InnerText); } if (rootNode["ErrorCount"] != null) { sendJobFinishEvent.ErrorCount = int.Parse(rootNode["ErrorCount"].InnerText); } XmlNodeList checkResultList = rootNode["CopyrightCheckResult"]?.ChildNodes; if (checkResultList != null && checkResultList.Count > 0) { XmlNode countNode = rootNode["CopyrightCheckResult"]["Count"]; XmlNode checkStateNode = rootNode["CopyrightCheckResult"]["CheckState"]; XmlNode resultListNode = rootNode["CopyrightCheckResult"]["ResultList"]; if (countNode != null) { sendJobFinishEvent.CopyrightCheckCount = int.Parse(countNode.InnerText); } else if (checkStateNode != null) { sendJobFinishEvent.CheckState = int.Parse(checkStateNode.InnerText); } else if (resultListNode != null) { sendJobFinishEvent.ResultList = new List <ArticleCheckResult>(); foreach (XmlNode itemNode in resultListNode) { sendJobFinishEvent.ResultList.Add(new ArticleCheckResult() { ArticleIdx = int.Parse(itemNode["ArticleIdx"].InnerText), UserDeclareState = int.Parse(itemNode["UserDeclareState"].InnerText), AuditState = int.Parse(itemNode["AuditState"].InnerText), OriginalArticleUrl = itemNode["OriginalArticleUrl"].InnerText, OriginalArticleType = int.Parse(itemNode["OriginalArticleType"].InnerText), CanReprint = bool.Parse(itemNode["CanReprint"].InnerText), NeedReplaceContent = bool.Parse(itemNode["NeedReplaceContent"].InnerText), NeedShowReprintSource = bool.Parse(itemNode["NeedShowReprintSource"].InnerText), }); } } } msgRequest = sendJobFinishEvent; break; case "templatesendjobfinish": TemplateSendJobFinishEvent templateSendFinishEvent = new TemplateSendJobFinishEvent(); if (rootNode["MsgID"] != null) { templateSendFinishEvent.MsgID = int.Parse(rootNode["MsgID"].InnerText); } if (rootNode["Status"] != null) { templateSendFinishEvent.Status = rootNode["Status"].InnerText; } break; default: msgRequest = new MsgRequest(); break; } } break; default: msgRequest = new MsgRequest(); break; } msgRequest.MsgType = msgType; } msgRequest.ToUserName = rootNode["ToUserName"].InnerText; msgRequest.FromUserName = rootNode["FromUserName"].InnerText; msgRequest.CreateTime = int.Parse(rootNode["CreateTime"].InnerText); return(msgRequest); }
//private async Task ScanAsync(string scanId, ScanData data) private async Task ScanAsync(UzService service, string scanId, ScanData data) { if (data.State == ScanEventType.Error) { return; } using (var lck = data.GetLock()) { if (lck.IsCaptured) { data.Attempts++; //using (var service = CreateService()) { var item = data.Item; var trains = await service.ListTrainsAsync(item.Date, item.Source, item.Destination); if (trains != null && trains.Length > 0) { var train = trains.GetByNumber(item.TrainNumber); if (train != null) { if (train.CoachTypes != null && train.CoachTypes.Length > 0) { CoachType[] coachTypes = null; if (!String.IsNullOrEmpty(item.CoachType)) { coachTypes = FindCoachTypes(train, item.CoachType); if (coachTypes.Length == 0 && item.ExactCoachType) { HandleError(scanId, data, "No vacant coaches " + item.CoachType, false); return; } } if (coachTypes == null || coachTypes.Length == 0) { coachTypes = train.CoachTypes; } var(sessionId, coach, seat) = await BookAsync(train, coachTypes, item.FirstName, item.LastName); if (!String.IsNullOrEmpty(sessionId)) { var msg = $"Reserved ticket for [{item.ScanSource}]:\nTrain: {train.Number} Coach: {coach.Number}-{coach.Type} Seat: {seat.Number} Price: {(seat.Price??0)/100m:##.00 UAH}\n{sessionId}"; _log.Info(msg); data.State = ScanEventType.Success; data.StateDescription = sessionId; ScanEvent?.Invoke(this, new ScanEventArgs(item.CallbackID, ScanEventType.Success, msg)); //Abort(scanId); rebook again in case it is bought by requester return; } } HandleError(scanId, data, "No vacant seats", false); } else { HandleError(scanId, data, $"Train {item.TrainNumber} not found", false); } } else { HandleError(scanId, data, "No tickets selling for date/train", false); } } } } }
/// <summary> /// 初始化微信消息处理事件 /// </summary> private void InitEventsHandle() { #region 普通消息 //文本消息 handlerList.Add(MessageType.Text, ReceiveEventType.None, (data) => { ReceiveTextMessage?.Invoke(data.ConvertBodyTo <TextMessage>(), Replier.Create(data)); }); //图片消息 handlerList.Add(MessageType.Image, ReceiveEventType.None, (data) => { ReceiveImageMessage?.Invoke(data.ConvertBodyTo <ImageMessage>(), Replier.Create(data)); }); //语音消息 handlerList.Add(MessageType.Voice, ReceiveEventType.None, (data) => { ReceiveVoiceMessage?.Invoke(data.ConvertBodyTo <VoiceMessage>(), Replier.Create(data)); }); //视频消息 handlerList.Add(MessageType.Video, ReceiveEventType.None, (data) => { ReceiveVideoMessage?.Invoke(data.ConvertBodyTo <VideoMessage>(), Replier.Create(data)); }); //小视频消息 handlerList.Add(MessageType.ShortVideo, ReceiveEventType.None, (data) => { ReceiveShortVideoMessage?.Invoke(data.ConvertBodyTo <ShortVideoMessage>(), Replier.Create(data)); }); //地理位置消息 handlerList.Add(MessageType.Location, ReceiveEventType.None, (data) => { ReceiveLocationMessage?.Invoke(data.ConvertBodyTo <LocationMessage>(), Replier.Create(data)); }); //链接消息 handlerList.Add(MessageType.Link, ReceiveEventType.None, (data) => { ReceiveLinkMessage?.Invoke(data.ConvertBodyTo <LinkMessage>(), Replier.Create(data)); }); #endregion #region 事件消息 //关注事件 handlerList.Add(MessageType.Event, ReceiveEventType.Subscribe, (data) => { var _event = data.ConvertBodyTo <ScanEventArgs>(); if (string.IsNullOrEmpty(_event.EventKey)) { SubscribeEvent?.Invoke(_event, Replier.Create(data)); } else { _event.EventKey = _event.EventKey.Substring("qrscene_".Length); ScanEvent?.Invoke(_event, Replier.Create(data)); } }); //取消关注事件 handlerList.Add(MessageType.Event, ReceiveEventType.UnSubscribe, (data) => { PassReply(data); UnSubscribeEvent?.Invoke(data.ConvertBodyTo <EventArgsBase>()); }); //扫描带参数二维码事件 handlerList.Add(MessageType.Event, ReceiveEventType.Scan, (data) => { ScanEvent?.Invoke(data.ConvertBodyTo <ScanEventArgs>(), Replier.Create(data)); }); //上报地理位置事件 handlerList.Add(MessageType.Event, ReceiveEventType.Location, (data) => { PassReply(data); LocationEvent?.Invoke(data.ConvertBodyTo <LocationEventArgs>()); }); //点击菜单拉取消息事件 handlerList.Add(MessageType.Event, ReceiveEventType.Click, (data) => { MenuClickEvent?.Invoke(data.ConvertBodyTo <WithKeyEventArgs>(), Replier.Create(data)); }); //点击菜单跳转链接事件 handlerList.Add(MessageType.Event, ReceiveEventType.View, (data) => { PassReply(data); ViewEvent?.Invoke(data.ConvertBodyTo <WithKeyEventArgs>()); }); //群发任务完成事件 handlerList.Add(MessageType.Event, ReceiveEventType.MessageEndJobFinish, (data) => { PassReply(data); MessageEndJobFinishEvent?.Invoke(data.ConvertBodyTo <MessageEndJobFinishEventArgs>()); }); //模板消息发送完成事件 handlerList.Add(MessageType.Event, ReceiveEventType.TemplateSendJobFinish, (data) => { PassReply(data); TemplateSendJobFinishEvent?.Invoke(data.ConvertBodyTo <TemplateSendJobFinishEventArgs>()); }); //买单事件推送 handlerList.Add(MessageType.Event, ReceiveEventType.user_pay_from_pay_cell, (data) => { PassReply(data); UserPayFromPayCellEvent?.Invoke(data.ConvertBodyTo <UserPayFromPayCellEventArgs>(), Replier.Create(data)); }); //卡券审核事件 handlerList.Add(MessageType.Event, ReceiveEventType.card_pass_check, (data) => { PassReply(data); CardPassCheckEvent?.Invoke(data.ConvertBodyTo <CardPassCheckEventArgs>(), Replier.Create(data)); }); //卡券领取事件 handlerList.Add(MessageType.Event, ReceiveEventType.user_get_card, (data) => { PassReply(data); UserGetCardEvent?.Invoke(data.ConvertBodyTo <UserGetCardEventArgs>(), Replier.Create(data)); }); //卡券转赠事件 handlerList.Add(MessageType.Event, ReceiveEventType.user_gifting_card, (data) => { PassReply(data); UserGiftingCardEvent?.Invoke(data.ConvertBodyTo <UserGiftingCardEventArgs>(), Replier.Create(data)); }); //卡券删除事件 handlerList.Add(MessageType.Event, ReceiveEventType.user_del_card, (data) => { PassReply(data); UserDelCardEvent?.Invoke(data.ConvertBodyTo <UserDelCardEventArgs>(), Replier.Create(data)); }); //卡券核销事件 handlerList.Add(MessageType.Event, ReceiveEventType.user_consume_card, (data) => { PassReply(data); UserConsumeCardEvent?.Invoke(data.ConvertBodyTo <UserConsumeCardEventArgs>(), Replier.Create(data)); }); //进入会员卡事件 handlerList.Add(MessageType.Event, ReceiveEventType.user_view_card, (data) => { PassReply(data); UserViewCardEvent?.Invoke(data.ConvertBodyTo <UserViewCardEventArgs>(), Replier.Create(data)); }); //从卡券进入公众号会话事件 handlerList.Add(MessageType.Event, ReceiveEventType.user_enter_session_from_card, (data) => { PassReply(data); UserEnterSessionFromCardEvent?.Invoke(data.ConvertBodyTo <UserEnterSessionFromCardEventArgs>(), Replier.Create(data)); }); //会员卡内容更新事件 handlerList.Add(MessageType.Event, ReceiveEventType.update_member_card, (data) => { PassReply(data); UpdateMemberCardEvent?.Invoke(data.ConvertBodyTo <UpdateMemberCardEventArgs>(), Replier.Create(data)); }); //会员卡激活事件推送 handlerList.Add(MessageType.Event, ReceiveEventType.submit_membercard_user_info, (data) => { PassReply(data); SubmitMemberCardUserInfoEvent?.Invoke(data.ConvertBodyTo <SubmitMemberCardUserInfoEventArgs>(), Replier.Create(data)); }); //库存报警事件 handlerList.Add(MessageType.Event, ReceiveEventType.card_sku_remind, (data) => { PassReply(data); CardSkuRemindEvent?.Invoke(data.ConvertBodyTo <CardSkuRemindEventArgs>(), Replier.Create(data)); }); //券点流水详情事件 handlerList.Add(MessageType.Event, ReceiveEventType.card_pay_order, (data) => { PassReply(data); CardPayOrderEvent?.Invoke(data.ConvertBodyTo <CardPayOrderEventArgs>(), Replier.Create(data)); }); #endregion }
protected virtual void OnScanEvent(ScanEventArgs e) { ScanEvent?.Invoke(this, e); }
internal void InvokeScanEvent(ScanEvent arg) { ScanEvent?.Invoke(this, arg); }
private void AssertEvent(ScanEvent @event) { Assert.NotNull(@event); Assert.Equal(DateTime.Parse("2018-02-02T10:43:05Z"), @event.Timestamp); Assert.Equal(EventName, @event.Event); Assert.Equal(DiscoveryScanType.NavBeaconDetail, @event.ScanType); Assert.Equal("Procyon B 3 a", @event.BodyName); Assert.Equal(12, @event.BodyId); Assert.Equal(10048.152344, @event.DistanceFromArrivalLs, 6); Assert.True(@event.TidalLock); Assert.Equal(TerraformState.NotTerraformable, @event.TerraformState); Assert.Equal("Rocky body", @event.PlanetClass); Assert.Equal(string.Empty, @event.Atmosphere); Assert.Equal("None", @event.AtmosphereType); Assert.Equal(2, @event.AtmosphereComposition.Length); Assert.Equal("Hydrogen", @event.AtmosphereComposition[0].Name); Assert.Equal(74.043083, @event.AtmosphereComposition[0].Percent, 6); Assert.Equal(string.Empty, @event.Volcanism); Assert.Equal(0.025342, @event.MassEm, 6); Assert.Equal(2011975.250000, @event.Radius, 6); Assert.Equal(2.495225, @event.SurfaceGravity, 6); Assert.Equal(318.448792, @event.SurfaceTemperature, 6); Assert.Equal(0.000000, @event.SurfacePressure, 6); Assert.True(@event.Landable); Assert.Equal(11, @event.Materials.Length); Assert.Equal("iron", @event.Materials[0].Name); Assert.Equal(19.315084, @event.Materials[0].Percent, 6); Assert.Equal(0.000000, @event.Composition.Ice, 6); Assert.Equal(0.861282, @event.Composition.Rock, 6); Assert.Equal(0.138718, @event.Composition.Metal, 6); Assert.Equal(89655728.000000, @event.SemiMajorAxis, 6); Assert.Equal(0.000000, @event.Eccentricity, 6); Assert.Equal(4.566576, @event.OrbitalInclination, 6); Assert.Equal(309.656799, @event.Periapsis, 6); Assert.Equal(344902.937500, @event.OrbitalPeriod, 6); Assert.Equal(352425.468750, @event.RotationPeriod, 6); Assert.Equal(0.479157, @event.AxialTilt, 6); Assert.True(@event.WasMapped); Assert.True(@event.WasDiscovered); Assert.Equal(11, @event.Parents[0].Planet.Value); Assert.Null(@event.Parents[0].Star); Assert.Null(@event.Parents[0].Null); Assert.Equal(2, @event.Parents[1].Star.Value); Assert.Null(@event.Parents[1].Planet); Assert.Null(@event.Parents[1].Null); Assert.Equal(0, @event.Parents[2].Null.Value); Assert.Null(@event.Parents[2].Planet); Assert.Null(@event.Parents[2].Star); Assert.Equal(2, @event.Rings.Length); Assert.Equal("Imeut AB 2 A Ring", @event.Rings[0].Name); Assert.Equal(RingClass.MetalRich, @event.Rings[0].RingClass); Assert.Equal(2.1371e+09, @event.Rings[0].MassMt); Assert.Equal(5.7442e+07, @event.Rings[0].InnerRad); Assert.Equal(6.0438e+07, @event.Rings[0].OuterRad); Assert.Equal(BodyType.Planet, @event.BodyType); }
internal void InvokeScanEvent(ScanEvent arg) => ScanEvent?.Invoke(null, arg);