public static event EventHandler <VisitorLeaveEventArgs> VisitorLeave; // 访客离开 /// <summary> /// 保存一条新访客会话 /// </summary> /// <param name="session"></param> public static void NewSession(VisitSession session) { Trace.WriteLine(string.Format("VisitSessionService.NewSession : {0}", session.ToString())); if (GetSessionById(session.SessionId) != null) { Trace.WriteLine("Error: chat is aleady exist"); return; } sessions.Add(new VisitSessionHit(session)); Provider.NewSession(session); // if (NewVisiting != null) { NewVisiting(null, new NewVisitingEventArgs(VisitorService.GetVisitorById(session.VisitorId), session)); } if (sessions.Count > MaxVisitorSessionCountInMemory) { for (int i = sessions.Count - 1; i >= 0; i--) { if (sessions[i].Session.Status == VisitSessionStatus.Leave) { sessions.RemoveAt(i); break; } } } }
/// <summary> /// 客服接受访客对话请求 /// </summary> /// <param name="operatorId"></param> /// <param name="chatId"></param> /// <returns></returns> public static int AcceptChatRequest(string operatorId, string chatId) { Trace.WriteLine(string.Format("ChatService.AcceptChatRequest(OperatorId={0},ChatId={1})", operatorId, chatId)); Chat chat = GetChatById(chatId); if (chat == null) { Trace.WriteLine(string.Format("Error: AcceptChatRequest(OperatorId={0},ChatId={1}) error, can't find this chat", operatorId, chatId)); return(AcceptChatRequestReturn_Error_Others); } if (chat.Status == ChatStatus.Accepted) { return(AcceptChatRequestReturn_Error_AcceptedByOthers); } else if (chat.Status == ChatStatus.Requested) { chat.Status = ChatStatus.Accepted; chat.OperatorId = operatorId; chat.AcceptTime = DateTime.Now; if (VisitorChatRequestAccepted != null) { VisitorChatRequestAccepted(null, new VisitorChatRequestAcceptedEventArgs(new VisitorChatRequestEventArgs(chat.VisitorId, chat))); } Message m1 = new Message(); m1.ChatId = chat.ChatId; m1.SentDate = DateTime.Now; m1.Type = MessageType.SystemMessage_ToVisitor; m1.Text = string.Format("客服:{0}已经接受您的对话请求", OperatorService.GetOperatorById(operatorId).NickName); SendMessage(m1); Message m2 = new Message(); m2.ChatId = chat.ChatId; m2.SentDate = DateTime.Now; m2.Type = MessageType.SystemMessage_ToOperator; m2.Text = string.Format("你已经接受访客{0}的对话请求", VisitorService.GetVisitorById(chat.VisitorId).Name); SendMessage(m2); OperatorService.SetOperatorStatus(operatorId, OperatorStatus.Chatting); VisitSession s = VisitSessionService.GetSessionById(VisitorService.GetVisitorById(chat.VisitorId).CurrentSessionId); s.OperatorId = operatorId; s.Status = VisitSessionStatus.Chatting; s.ChatingTime = DateTime.Now; return(AcceptChatRequestReturn_OK); } else if (chat.Status == ChatStatus.Closed) { return(AcceptChatRequestReturn_Error_ChatRequestCanceled); } else { Trace.WriteLine(string.Format("ChatService.AccpetChatRequest({0},{1}) error,status illegal: ChatStatus={2}", operatorId, chatId, chat.Status)); return(AcceptChatRequestReturn_Error_Others); } }
/// <summary> /// 访客接受某客服的对话 to-all /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void ChatService_VisitorChatRequestAccepted(object sender, VisitorChatRequestAcceptedEventArgs e)//tao-no { Visitor visitor = VisitorService.GetVisitorById(e.VisitorChatRequest.VisitorId); List <Socket> ss = new List <Socket>(); foreach (var item in GetOnlineOperatorSockets(visitor.AccountId)) { sh.SendPacket(item, e); } }
void VisitSessionService_VisitorLeave(object sender, VisitorLeaveEventArgs e) { Visitor visitor = VisitorService.GetVisitorById(e.VisitorId); List <Socket> ss = new List <Socket>(); foreach (var item in GetOnlineOperatorSockets(visitor.AccountId)) { sh.SendPacket(item, e); } }
/// <summary> /// 关闭对话信息 /// </summary> /// <param name="chatId"></param> /// <param name="userName"></param> public static bool CloseChat(string chatId, string closeBy) { Trace.WriteLine(string.Format("ChatService.CloseChat(ChatId = {0},CloseBy={1})", chatId, closeBy)); Chat chat = GetChatById(chatId); if (chat == null) { Trace.WriteLine("Waring: ChatService.CloseChat() error ,ChatId " + chatId + " not found"); return(false); } if (chat.Status == ChatStatus.Closed) { Trace.WriteLine("Waring: ChatService.CloseChat() is closed aleady ,ChatId " + chatId); try { Directory.Delete(ChatTempDataDir + chatId, true); } catch (Exception) { } return(true); } if (ChatStatusChanged != null) { ChatStatusChanged(null, new ChatStatusChangedEventArgs(chatId, ChatStatus.Closed)); } Message m = new Message(); m.ChatId = chatId; m.SentDate = DateTime.Now; m.Type = MessageType.SystemMessage_ToBoth; m.Text = string.Format("{0}已关闭对话", closeBy); SendMessage(m); chat.Status = ChatStatus.Closed; chat.CloseTime = DateTime.Now; chat.CloseBy = closeBy; if (chat.OperatorId == null || chat.OperatorId == "") { chat.OperatorId = null; } Provider.CloseChat(chat); VisitSessionService.SetSessionStatus(VisitorService.GetVisitorById(chat.VisitorId).CurrentSessionId, VisitSessionStatus.Visiting); // 注意: IsOperatorHasActiveChat需要在更改chat status后调用 if (!string.IsNullOrEmpty(chat.OperatorId) && !IsOperatorHasActiveChat(chat.OperatorId) && OperatorService.IsOperatorOnline(chat.OperatorId)) { OperatorService.SetOperatorStatus(chat.OperatorId, OperatorStatus.Idle);//关闭时改变客服状态 } return(true); }
/// <summary> /// 访客请请求 to-all /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void ChatService_VisitorChatRequest(object sender, VisitorChatRequestEventArgs e) { Visitor v = VisitorService.GetVisitorById(e.VisitorId); if (v != null) { List <Socket> sockets = GetOnlineOperatorSockets(v.AccountId); foreach (var item in sockets) { sh.SendPacket(item, new VisitorChatRequestEventArgs(e.VisitorId, e.Chat)); } } }
void VisitSessionService_NewVisiting(object sender, NewVisitingEventArgs e) { Visitor visitor = VisitorService.GetVisitorById(e.Visitor.VisitorId); List <Socket> ss = new List <Socket>(); foreach (var item in GetOnlineOperatorSockets(visitor.AccountId)) { if (item.Connected) { sh.SendPacket(item, e); } } }
/// <summary> /// 客服主动邀请对话 /// </summary> /// <param name="operatorId">客服ID</param> /// <param name="visitorId"></param> public static Chat OperatorRequestChat(string operatorId, string visitorId) { Trace.WriteLine(string.Format("ChatService.OperatorRequestChat(OperatorId = {0},VisitorId = {1})", operatorId, visitorId)); Visitor visitor = VisitorService.GetVisitorById(visitorId); Operator op = OperatorService.GetOperatorById(operatorId); if (visitor == null || op == null) { Trace.WriteLine(string.Format("Error: ChatService.OperatorRequestChat({0},{1}) error Opertor or Visitor is null", operatorId, visitorId)); return(null); } Chat chat = new Chat(); chat.IsInviteByOperator = true; chat.CreateBy = op.NickName; chat.CreateTime = DateTime.Now; chat.LastCheckTime = DateTime.Now.Ticks; chat.AccountId = op.AccountId; chat.VisitorId = visitorId; chat.OperatorId = operatorId; chats.Add(chat); Provider.AddChat(chat); op.Status = OperatorStatus.InviteChat;//将客服改为请求中 chat.Status = ChatStatus.Requested; //VisitSessionService.SetSessionStatus(visitor.CurrentSessionId, VisitSessionStatus.ChatRequesting); if (OperatorChatRequest != null) { var req = new OperatorChatRequestEventArgs(operatorId, visitorId, chat); OperatorChatRequest(null, req); } Message m = new Message(); m.ChatId = chat.ChatId; m.Text = "正在邀请访客,请稍等..."; m.Type = MessageType.SystemMessage_ToOperator; SendMessage(m, DateTime.Now.AddMilliseconds(50)); return(chat); }
/// <summary> /// 页面请求对话 /// </summary> /// <param name="CurrentVisitor"></param> /// <returns>ChatId</returns> public static string ChatPageRequestChat(Visitor visitor) { Trace.WriteLine(string.Format("ChatService.ChatPageRequestChat(Visitor = {0})", visitor)); if (!string.IsNullOrEmpty(visitor.Name)) { Visitor vs = VisitorService.GetVisitorById(visitor.VisitorId); vs.Name = visitor.Name; VisitorService.UpdateVisitor(vs); } Chat chatRequest = new Chat(); chatRequest.AccountId = visitor.AccountId; chatRequest.CreateTime = DateTime.Now; chatRequest.Status = ChatStatus.Requested; chatRequest.VisitorId = visitor.VisitorId; chats.Add(chatRequest); Provider.AddChat(chatRequest); VisitSession s = VisitSessionService.GetSessionById(visitor.CurrentSessionId); s.ChatRequestTime = DateTime.Now; s.Status = VisitSessionStatus.ChatRequesting; Message m = new Message(); m.ChatId = chatRequest.ChatId; m.Text = "正在接入客服,请稍等..."; m.Type = MessageType.SystemMessage_ToVisitor; m.Source = "系统"; m.Destination = "访客"; SendMessage(m, DateTime.Now.AddMilliseconds(100)); if (VisitorChatRequest != null) { VisitorChatRequestEventArgs req = new VisitorChatRequestEventArgs(visitor.VisitorId, chatRequest); visitorChatRequests.Add(req); VisitorChatRequest(null, req); } return(chatRequest.ChatId); }
// TODO: 该方法需要重新设计 /// <summary> /// 查询在这个时候之后新加的访客会话信息 /// </summary> /// <param name="lastCheck">会话ID</param> /// <returns>VisitSession对象</returns> /// public static List <VisitSession> GetVisitSessionChange(string accountId, long lastCheck) { Trace.WriteLine(string.Format("{0}({1},{2})", MethodBase.GetCurrentMethod().Name, accountId, lastCheck)); StringBuilder sb = new StringBuilder(); List <VisitSession> vss = new List <VisitSession>(); foreach (VisitSessionHit item in sessions) { Visitor v = VisitorService.GetVisitorById(item.Session.VisitorId); if (v != null && v.AccountId == accountId) { vss.Add(v.CurrentSession); //sb.AppendFormat("SessionId={0},Status={1},VisitId={2} | ",v.CurrentSessionId,v.CurrentSession.Status.ToString(),v.VisitorId); } } Trace.WriteLine(string.Format("Return {0} : {1}", vss.Count, sb.ToString())); return(vss); }
/// <summary> /// 接受客服邀请 /// </summary> /// <param name="chatId"></param> public static void AcceptOperatorInvitation(string chatId) { Trace.WriteLine(string.Format("ChatService.AcceptOperatorInvitation(ChatId = {0})", chatId)); Chat chat = GetChatById(chatId); if (chat != null) { chat.Status = ChatStatus.Accepted; if (chat.OperatorId != null) { OperatorService.GetOperatorById(chat.OperatorId).Status = OperatorStatus.Chatting; } VisitSession s = VisitSessionService.GetSessionById(VisitorService.GetVisitorById(chat.VisitorId).CurrentSessionId); s.Status = VisitSessionStatus.Chatting; //将访客状态改为对话中 s.ChatingTime = DateTime.Now; OperatorChatRequestEventArgs opq = new OperatorChatRequestEventArgs(chat.OperatorId, chat.VisitorId, chat); //tao OperatorChatRequestAccepted(null, new OperatorChatRequestAcceptedEventArgs(opq)); //tao } //SendMessage(new Message(chat.ChatId, "访客已接受对话邀请!", MessageType.SystemMessage_ToOperator)); SendMessage(new Message(chat.ChatId, "您已接受对话邀请!", MessageType.SystemMessage_ToVisitor)); }
/// <summary> /// /// </summary> /// <param name="visitorId"></param> public static void Hit(string visitorId) { //Trace.WriteLine(string.Format("VisitorService.Hit(visitorId = {0})", visitorId)); Visitor v = VisitorService.GetVisitorById(visitorId); if (v != null && v.CurrentSession != null) { if (v.CurrentSession.Status == VisitSessionStatus.Leave) { v.CurrentSession.Status = VisitSessionStatus.Visiting; } // VisitSessionHit h = sessions.Find(sh => sh.Session.SessionId == v.CurrentSessionId); foreach (VisitSessionHit item in sessions) { if (item.Session.SessionId == v.CurrentSessionId) { item.LastHitTime = DateTime.Now; } } //Trace.WriteLine(string.Format("Session {0} Hit", v.CurrentSessionId)); } }