Example #1
0
    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;
                }
            }
        }
    }
Example #2
0
    /// <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);
        }
    }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
    /// <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);
    }
Example #6
0
        /// <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));
                }
            }
        }
Example #7
0
        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);
                }
            }
        }
Example #8
0
    /// <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);
    }
Example #9
0
    /// <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);
    }
Example #10
0
    // 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);
    }
Example #11
0
    /// <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));
    }
Example #12
0
    /// <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));
        }
    }