/// <summary> /// 执行API /// </summary> /// <param name="response"></param> /// <param name="materialData"></param> /// <param name="requestMessage"></param> /// <param name="accessTokenOrAppId"></param> /// <param name="openId"></param> /// <returns></returns> public async Task <ApiResult> ExecuteApi(Response response, MaterialData materialData, IRequestMessageBase requestMessage, string accessTokenOrAppId, string openId, IMessageHandlerEnlightener enlightener) { if (response == null) { return(new ApiResult(-1, "未获取到响应消息设置", null)); } ApiResult apiResult = null; try { switch (response.Type) { case ResponseMsgType.Unknown: break; case ResponseMsgType.Text: var cotnent = NeuralNodeHelper.FillTextMessage(response.GetMaterialContent(materialData)); apiResult = await ApiEnlighten.SendText(accessTokenOrAppId, openId, cotnent); break; case ResponseMsgType.News: { var articles = NeuralNodeHelper.FillNewsMessage(response.MaterialId /*"9DAAC45C|6309EAD9"*/, materialData); if (articles == null) { apiResult = await ApiEnlighten.SendText(accessTokenOrAppId, openId, "您要查找的素材不存在,或格式定义错误!"); } else { apiResult = await ApiEnlighten.SendNews(accessTokenOrAppId, openId, articles); } } break; case ResponseMsgType.Music: break; case ResponseMsgType.Image: var mediaId = NeuralNodeHelper.GetImageMessageMediaId(requestMessage, response.GetMaterialContent(materialData)); SenparcTrace.SendCustomLog("ExecuteApi-Image", $"mediaId:{mediaId}"); if (true) { //TODO:其他mediaId的情况 } apiResult = await ApiEnlighten.SendImage(accessTokenOrAppId, openId, mediaId); break; case ResponseMsgType.Voice: break; case ResponseMsgType.Video: break; case ResponseMsgType.Transfer_Customer_Service: break; case ResponseMsgType.MpNews: break; case ResponseMsgType.MultipleNews: break; case ResponseMsgType.LocationMessage: break; case ResponseMsgType.NoResponse: break; case ResponseMsgType.SuccessResponse: break; case ResponseMsgType.UseApi: apiResult = await ApiEnlighten.CustomApi(response, materialData, requestMessage.FromUserName); break; default: apiResult = new ApiResult(-1, "未找到支持的响应消息类型", null); break; } } catch (Exception ex) { new MessageHandlerException("NeuChar API调用过程发生错误:" + ex.Message, ex); return(new ApiResult(-1, "API调用过程发生错误!", null)); } return(apiResult); }
/// <summary> /// 执行NeuChar判断过程,获取响应消息 /// </summary> /// <param name="requestMessage"></param> /// <param name="messageHandler"></param> /// <param name="accessTokenOrApi"></param> /// <returns></returns> public IResponseMessageBase Execute(IRequestMessageBase requestMessage, IMessageHandlerEnlightener messageHandler, string accessTokenOrApi) { //SenparcTrace.SendCustomLog("neuchar trace", "2"); //if (accessTokenOrApi == null) //{ // throw new ArgumentNullException(nameof(accessTokenOrApi)); //} IResponseMessageBase responseMessage = null; //SenparcTrace.SendCustomLog("neuchar trace", "3"); switch (requestMessage.MsgType) { case RequestMsgType.Text: { try { //SenparcTrace.SendCustomLog("neuchar trace", "3.1"); var textRequestMessage = requestMessage as IRequestMessageText; //遍历所有的消息设置 foreach (var messagePair in Config.MessagePair.Where(z => z.Request.Type == RequestMsgType.Text)) { //遍历每一个消息设置中的关键词 var pairSuccess = messagePair.Request.Keywords.Exists(keyword => keyword.Equals(textRequestMessage.Content, StringComparison.OrdinalIgnoreCase)); if (pairSuccess) { responseMessage = GetResponseMessage(requestMessage, messagePair.Responses, messageHandler, accessTokenOrApi); } if (responseMessage != null) { break; } } } catch (Exception ex) { SenparcTrace.SendCustomLog("neuchar text error", ex.Message + "\r\n|||\r\n" + (ex.InnerException != null ? ex.InnerException.ToString() : "")); } } break; case RequestMsgType.Image: { var imageRequestMessage = requestMessage as IRequestMessageImage; //遍历所有的消息设置 foreach (var messagePair in Config.MessagePair.Where(z => z.Request.Type == RequestMsgType.Image)) { responseMessage = GetResponseMessage(requestMessage, messagePair.Responses, messageHandler, accessTokenOrApi); if (responseMessage != null) { break; } } } break; case RequestMsgType.Event: { //菜单或其他系统事件 if (requestMessage is IRequestMessageEvent eventRequestMessage) { var eventType = eventRequestMessage.EventName.ToUpper(); //构造返回结果 List <Response> responses = new List <Response>(); switch (eventType) { case "CLICK" when requestMessage is IRequestMessageEventKey clickRequestMessage: { //TODO:暂时只支持CLICK,因此在这里遍历 foreach (var messagePair in Config.MessagePair.Where(z => z.Request.Type == RequestMsgType.Event)) { var pairSuccess = messagePair.Request.Keywords.Exists(keyword => keyword.Equals(clickRequestMessage.EventKey, StringComparison.OrdinalIgnoreCase)); if (pairSuccess) { try { SenparcTrace.SendCustomLog("CLICK 跟踪 1.0", clickRequestMessage.EventKey); responseMessage = GetResponseMessage(requestMessage, messagePair.Responses, messageHandler, accessTokenOrApi); } catch (Exception ex) { SenparcTrace.SendCustomLog("CLICK 跟踪 1.1", ex.Message + "\r\n" + ex.StackTrace); } } if (responseMessage != null) { break; } } } break; default: break; } } else { //下级模块中没有正确处理 requestMessage 类型 } } break; default: //不作处理 //throw new UnknownRequestMsgTypeException("NeuChar未支持的的MsgType请求类型:"+ requestMessage.MsgType, null); break; } //SenparcTrace.SendCustomLog("neuchar trace", "4"); return(responseMessage); }
/// <summary> /// 获取响应消息 /// </summary> /// <param name="requestMessage"></param> /// <param name="responseConfigs"></param> /// <param name="messageHandler"></param> /// <param name="accessTokenOrApi"></param> /// <returns></returns> private IResponseMessageBase GetResponseMessage(IRequestMessageBase requestMessage, List <Response> responseConfigs, IMessageHandlerEnlightener messageHandler, string accessTokenOrApi) { IResponseMessageBase responseMessage = null; responseConfigs = responseConfigs ?? new List <Response>(); if (responseConfigs.Count == 0) { return(null); } //扩展响应,会在消息回复之前发送 var extendReponses = responseConfigs.Count > 1 ? responseConfigs.Take(responseConfigs.Count - 1).ToList() : new List <Response>(); //获取最后一个响应设置 var lastResponse = responseConfigs.Last();//取最后一个 //处理特殊情况 if (messageHandler.MessageEntityEnlightener.PlatformType == PlatformType.WeChat_MiniProgram) { //小程序,所有的请求都使用客服消息接口,回填取出的最后一个 extendReponses.Add(lastResponse); lastResponse = new Response() { Type = ResponseMsgType.SuccessResponse }; //返回成功信息 responseMessage = new SuccessResponseMessage(); } //第一项,优先使用消息回复 switch (lastResponse.Type) { case ResponseMsgType.Text: responseMessage = RenderResponseMessageText(requestMessage, lastResponse, messageHandler.MessageEntityEnlightener); break; case ResponseMsgType.News: responseMessage = RenderResponseMessageNews(requestMessage, lastResponse, messageHandler.MessageEntityEnlightener); break; case ResponseMsgType.Music: break; case ResponseMsgType.Image: responseMessage = RenderResponseMessageImage(requestMessage, lastResponse, messageHandler.MessageEntityEnlightener); break; case ResponseMsgType.Voice: break; case ResponseMsgType.Video: break; case ResponseMsgType.Transfer_Customer_Service: break; case ResponseMsgType.MultipleNews: break; case ResponseMsgType.LocationMessage: break; case ResponseMsgType.NoResponse: responseMessage = RenderResponseMessageNoResponse(requestMessage, lastResponse, messageHandler.MessageEntityEnlightener); break; case ResponseMsgType.SuccessResponse: responseMessage = RenderResponseMessageSuccessResponse(requestMessage, lastResponse, messageHandler.MessageEntityEnlightener); break; case ResponseMsgType.UseApi: //常规官方平台转发的请求不会到达这里 break; default: break; } //使用客服接口(高级接口)发送 ExecuteApi(extendReponses, requestMessage, messageHandler.ApiEnlightener, accessTokenOrApi, requestMessage.FromUserName); return(responseMessage); }
/// <summary> /// 执行NeuChar判断过程,获取响应消息 /// </summary> /// <param name="requestMessage"></param> /// <returns></returns> public async Task <IResponseMessageBase> ExecuteAsync(IRequestMessageBase requestMessage, IMessageHandlerEnlightener messageHandler, string accessTokenOrApi) { //SenparcTrace.SendCustomLog("neuchar trace","1"); return(await Task.Run(() => Execute(requestMessage, messageHandler, accessTokenOrApi))); }
/// <summary> /// 执行API高级接口回复 /// </summary> /// <param name="responses"></param> /// <param name="requestMessage"></param> /// <param name="enlightener"></param> /// <param name="accessTokenOrApi"></param> /// <param name="openId"></param> /// <returns></returns> private List <ApiResult> ExecuteApi(List <Response> responses, IRequestMessageBase requestMessage, IMessageHandlerEnlightener enlightener, string accessTokenOrApi, string openId) { List <ApiResult> results = new List <ApiResult>(); if (responses == null || responses.Count == 0) { return(results); } ApiHandler apiHandler = new ApiHandler(enlightener.ApiEnlightener); foreach (var response in responses) { ApiResult apiResult = apiHandler.ExecuteApi(response, MaterialData, requestMessage, accessTokenOrApi, openId, enlightener); results.Add(apiResult); } return(results); }
/// <summary> /// 执行NeuChar判断过程,获取响应消息 /// </summary> /// <param name="requestMessage"></param> /// <param name="messageHandler"></param> /// <param name="accessTokenOrApi"></param> /// <returns></returns> public IResponseMessageBase Execute(IRequestMessageBase requestMessage, IMessageHandlerEnlightener messageHandler, string accessTokenOrApi) { //SenparcTrace.SendCustomLog("neuchar trace", "2"); if (accessTokenOrApi == null) { throw new ArgumentNullException(nameof(accessTokenOrApi)); } IResponseMessageBase responseMessage = null; //SenparcTrace.SendCustomLog("neuchar trace", "3"); switch (requestMessage.MsgType) { case RequestMsgType.Text: { try { //SenparcTrace.SendCustomLog("neuchar trace", "3.1"); var textRequestMessage = requestMessage as IRequestMessageText; //遍历所有的消息设置 foreach (var messagePair in Config.MessagePair.Where(z => z.Request.Type == RequestMsgType.Text)) { //遍历每一个消息设置中的关键词 foreach (var keyword in messagePair.Request.Keywords) { if (keyword.Equals(textRequestMessage.Content, StringComparison.OrdinalIgnoreCase)) //TODO:加入大小写敏感设计 { responseMessage = GetResponseMessage(requestMessage, messagePair.Responses, messageHandler, accessTokenOrApi); break; } } if (responseMessage != null) { break; } } } catch (Exception ex) { SenparcTrace.SendCustomLog("neuchar text error", ex.Message + "\r\n|||\r\n" + (ex.InnerException != null ? ex.InnerException.ToString() : "")); } } break; case RequestMsgType.Image: { var imageRequestMessage = requestMessage as IRequestMessageImage; //遍历所有的消息设置 foreach (var messagePair in Config.MessagePair.Where(z => z.Request.Type == RequestMsgType.Image)) { responseMessage = GetResponseMessage(requestMessage, messagePair.Responses, messageHandler, accessTokenOrApi); if (responseMessage != null) { break; } } } break; default: //不作处理 //throw new UnknownRequestMsgTypeException("NeuChar未支持的的MsgType请求类型:"+ requestMessage.MsgType, null); break; } //SenparcTrace.SendCustomLog("neuchar trace", "4"); return(responseMessage); }