Ejemplo n.º 1
0
 public WsClientConnection(WsConnection conn,
                           WsAgentConnection agent,
                           int id,
                           string name)
 {
     _connection = conn;
     _agent      = agent;
     _clientID   = id;
     _name       = name;
 }
        void AgentDisconnected(WsAgentConnection sender, EventArgs e)
        {
            log.InfoFormat("Agent {0} socket disconnected, handle = {1}",
                           sender._name, sender._connection._mySocket.Handle.ToString());

            foreach (KeyValuePair <int, WsClientConnection> d in sender._clients)
            {
                if (d.Value != null)
                {
                    _clients.Remove(d.Value);
                    d.Value.SendMessage
                        ("The agent has been disconnected; please reconnect");
                }
            }
            _agents.Remove(sender);
            sender.Dispose();
        }
        void MessageReceived(WsConnection sender, MessageReceivedEventArgs e)
        {
            string msg = e.Message;

            log.Debug("Message received: " + msg);

            if (e.DataLength > 14 && (msg.Substring(0, 14) == "[Agent SignOn:"))
            {
                // This is an agent signing on
                string            name  = msg.Substring(14, e.DataLength - 15);
                WsAgentConnection agent = new WsAgentConnection(sender, name);

                // Re-wire the event handlers
                sender.Disconnected    -= Disconnected;
                sender.MessageReceived -= MessageReceived;
                sender.Disconnected    += agent.Disconnected;
                sender.MessageReceived += agent.MessageReceived;

                agent.AgentDisconnected +=
                    new WsDisconnectedAgentEventHandler(AgentDisconnected);

                // Move this socket to the agent list
                _unknown.Remove(sender);
                _agents.Add(agent);

                log.InfoFormat("Socket attached to agent {0}, handle = {1}",
                               name, sender._mySocket.Handle.ToString());

                // Send a response
                agent.SendMessage("Welcome, " + name);
            }
            else if (e.DataLength > 15 &&
                     (msg.Substring(0, 15) == "[Client SignOn:"))
            {
                // This is a client requesting assistance
                string name = msg.Substring(15, e.DataLength - 16);

                // Find an agent
                WsAgentConnection agent = null;
                int clientID            = 0;
                foreach (WsAgentConnection a in _agents)
                {
                    foreach (KeyValuePair <int, WsClientConnection> d in a._clients)
                    {
                        if (d.Value == null)
                        {
                            agent    = a;
                            clientID = d.Key;
                            break;
                        }
                    }
                    if (agent != null)
                    {
                        break;
                    }
                }

                if (agent != null)
                {
                    WsClientConnection client =
                        new WsClientConnection(sender, agent, clientID, name);

                    log.InfoFormat("Client {0} assigned to agent {1}", name, agent._name);

                    // Re-wire the event handlers
                    sender.Disconnected    -= Disconnected;
                    sender.MessageReceived -= MessageReceived;
                    sender.Disconnected    += client.Disconnected;
                    sender.MessageReceived += client.MessageReceived;

                    client.ClientDisconnected +=
                        new WsDisconnectedClientEventHandler(ClientDisconnected);

                    // Add this to the agent list
                    _unknown.Remove(sender);
                    _clients.Add(client);

                    agent._clients[clientID] = client;

                    // Send a message to the agent
                    agent.SendMessage("[ClientName:" + clientID.ToString() +
                                      name + "]");

                    // Send a response
                    client.SendMessage("Hello! My name is " + agent._name +
                                       ". How may I help you?");
                }
                else
                {
                    // There are no agents available
                    sender.SendMessage("There are no agents currently available;" +
                                       "please try again later");

                    sender.Dispose();
                }
            }
        }