void Disconnected(WsConnection sender, EventArgs e)
        {
            log.InfoFormat("Unattached socket disconnected, handle = {0}",
                           sender._mySocket.Handle.ToString());

            _unknown.Remove(sender);
        }
예제 #2
0
 public void Disconnected(WsConnection sender, EventArgs e)
 {
     if (AgentDisconnected != null)
     {
         AgentDisconnected(this, EventArgs.Empty);
     }
 }
예제 #3
0
        public void MessageReceived(WsConnection sender,
                                    MessageReceivedEventArgs e)
        {
            if (e.Message.Length >= 1)
            {
                if (e.Message[0] == '\u0003')
                {
                    if (AgentDisconnected != null)
                    {
                        AgentDisconnected(this, EventArgs.Empty);
                    }
                }

                else if (e.Message.Length > 1)
                {
                    string s = e.Message.Substring(0, 1);
                    int    i = 0;
                    if (int.TryParse(s, out i))
                    {
                        WsClientConnection client = _clients[i];
                        if (client != null)
                        {
                            client.SendMessage(e.Message.Substring(2));
                        }
                    }
                }
            }
        }
예제 #4
0
 public WsClientConnection(WsConnection conn,
                           WsAgentConnection agent,
                           int id,
                           string name)
 {
     _connection = conn;
     _agent      = agent;
     _clientID   = id;
     _name       = name;
 }
예제 #5
0
        public WsAgentConnection(WsConnection conn, string name)
        {
            _connection = conn;
            _name       = name;

            // Initialize our client list
            _clients = new Dictionary <int, WsClientConnection>();
            for (int i = 1; i <= 4; i++)
            {
                _clients.Add(i, null);
            }
        }
예제 #6
0
 public void MessageReceived(WsConnection sender,
                             MessageReceivedEventArgs e)
 {
     if (_agent != null && e.Message.Length > 0)
     {
         if (e.Message[0] == '\u0003')
         {
             if (ClientDisconnected != null)
             {
                 ClientDisconnected(this, EventArgs.Empty);
             }
         }
         else
         {
             _agent.SendMessage(_clientID.ToString() + ": " + e.Message);
         }
     }
 }
        private void OnConnect(IAsyncResult asyn)
        {
            // create a new socket for the connection
            Socket socket = _listener.EndAccept(asyn);

            // Perform the necessary handshaking
            PerformHandshake(socket);

            log.InfoFormat("New socket created, handle = {0}",
                           socket.Handle.ToString());

            // Create a WsConnection object for this connection
            WsConnection client = new WsConnection(socket);

            _unknown.Add(client);

            // Wire-up the event handlers
            client.MessageReceived += new MessageReceivedEventHandler(MessageReceived);
            client.Disconnected    += new WsDisconnectedEventHandler(Disconnected);

            // Listen for more connections
            _listener.BeginAccept(new AsyncCallback(OnConnect), null);
        }
        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();
                }
            }
        }