protected void Dispatch(NetworkMessage message, object token)
        {
            if (message == null) throw new ArgumentNullException("message");

            try
            {
                if (message.Destinations.HasFlag(ListenerEntry.Local))
                {
                    InternalDispatch(message, token);
                }

                if (Client != null && message.Destinations.HasFlag(ListenerEntry.Client))
                {
                    Client.Send(message);
                }

                if (Server != null && message.Destinations.HasFlag(ListenerEntry.Server))
                {
                    Server.Send(message);
                }

                message.OnDispatched();
                OnMessageDispatched(message);
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("Cannot dispatch {0}", message), ex);
            }
        }
        private void OnServerMessageReceived(ServerConnection server, NetworkMessage message)
        {
            message.From = ListenerEntry.Server;
            message.Destinations = ListenerEntry.Client | ListenerEntry.Local;

            base.OnMessageReceived(message);
        }
示例#3
0
 public override void Send(NetworkMessage message)
 {
     if (message.Destinations.HasFlag(ListenerEntry.Server))
         SendToServer(message);
     if (message.Destinations.HasFlag(ListenerEntry.Client))
         base.Send(message);
     else if (message.Destinations == ListenerEntry.Undefined)
         base.Send(message);
 }
示例#4
0
        /// <summary>
        /// Send a message
        /// </summary>
        /// <param name="message">Network Message</param>
        public void SendMessage(NetworkMessage message)
        {
            if (message == null) throw new ArgumentNullException("message");
            m_bot.SendToServer(message);

            if (message is ChatClientPrivateMessage)
                logger.Debug("Private Message Sent to Server");
            else
                logger.Debug("Message Sent to Server");
        }
        private void InternalDispatch(NetworkMessage message, object token)
        {
            if (message == null) throw new ArgumentNullException("message");
            var handlers = GetHandlers(message.GetType(), token);

            foreach (var handler in handlers)
            {
                if (handler.Attribute.DestinationFilter != ListenerEntry.Undefined &&
                    handler.Attribute.DestinationFilter != message.Destinations &&
                    (handler.Attribute.DestinationFilter & message.Destinations) == ListenerEntry.Undefined)
                    continue;

                if (handler.Attribute.FromFilter != ListenerEntry.Undefined &&
                    handler.Attribute.FromFilter != message.From &&
                    (handler.Attribute.FromFilter & message.From) == ListenerEntry.Undefined)
                    continue;

                handler.Action(handler.Container, token, message);

                if (message.Canceled)
                    break;
            }
        }
示例#6
0
        public void Send(NetworkMessage message, ListenerEntry dest)
        {
            if (message == null) throw new ArgumentNullException("message");
            message.Destinations = dest;
            message.From = ListenerEntry.Local;

            Dispatcher.Enqueue(message, this);
        }
示例#7
0
        private void OnWorldClientMessageReceived(Client client, NetworkMessage message)
        {
            if (!( client is ConnectionMITM ))
                throw new ArgumentException("client is not of type ConnectionMITM");

            var mitm = client as ConnectionMITM;

            if (message is AuthenticationTicketMessage && mitm.Bot == null)
            {
                // special handling to connect and retrieve the bot instance
                HandleAuthenticationTicketMessage(mitm, message as AuthenticationTicketMessage);
            }
            else
            {
                if (mitm.Bot == null)
                    throw new NullReferenceException("mitm.Bot");

                if (mitm.Bot.Dispatcher.Stopped)
                    logger.Warn("Enqueue a message but the dispatcher is stopped !");

                mitm.Bot.Dispatcher.Enqueue(message, mitm.Bot);
            }

            logger.Debug("{0} FROM {1}", message, message.From);
        }
示例#8
0
        private void OnAuthClientMessageReceived(Client client, NetworkMessage message)
        {
            if (!( client is ConnectionMITM ))
                throw new ArgumentException("client is not of type ConnectionMITM");

            var mitm = client as ConnectionMITM;

            if (mitm.Bot == null)
                throw new NullReferenceException("mitm.Bot");

            mitm.Bot.Dispatcher.Enqueue(message, mitm.Bot);

            logger.Debug("{0} FROM {1}", message, message.From);
        }
示例#9
0
        public void SendToServer(NetworkMessage message)
        {
            if (!IsBoundToServer)
                throw new InvalidOperationException("Client is not bound to server");

            Server.Send(message);
        }
示例#10
0
        public void Send(NetworkMessage message, ListenerEntry dest)
        {
            if (message == null) throw new ArgumentNullException("message");
            message.Destinations = dest;
            message.From = ListenerEntry.Local;

            Dispatcher.Enqueue(message, this);

            if (Disposed)
                logger.Error("Error the message {0} wont be dispatched because the bot {1} is disposed !", message, this);
            else if (!Running)
                logger.Warn("Warning, enqueue {0} but the bot is stopped, the message will be processed once the bot {1} restart", message, this);
        }
示例#11
0
 private void OnMessageSended(NetworkMessage message)
 {
     var handler = MessageSent;
     if (handler != null)
         handler(this, message);
 }
示例#12
0
 private void OnMessageReceived(NetworkMessage message)
 {
     var handler = MessageReceived;
     if (handler != null)
         handler(this, message);
 }
示例#13
0
        public void Send(NetworkMessage message)
        {
            lock (this)
            {
                if (!IsConnected)
                    return;

                var args = new SocketAsyncEventArgs();
                args.Completed += OnSendCompleted;
                args.UserToken = message;

                byte[] data;
                using (var writer = new BigEndianWriter())
                {
                    message.Pack(writer);
                    data = writer.Data;
                }

                args.SetBuffer(data, 0, data.Length);

                if (!Socket.SendAsync(args))
                {
                    OnMessageSended(message);
                    args.Dispose();
                }

                LastActivity = DateTime.Now;
            }
        }
示例#14
0
 protected virtual void OnMessageSended(NetworkMessage message)
 {
     var handler = MessageSent;
     if (handler != null)
         handler(this, message);
 }
示例#15
0
 public void SendLocal(NetworkMessage message)
 {
     Send(message, ListenerEntry.Local);
 }
示例#16
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="message"></param>
 /// <param name="direct">If true it doesn't reprocess the message internally</param>
 public void SendToServer(NetworkMessage message, bool direct = false)
 {
     if (message == null) throw new ArgumentNullException("message");
     if (direct)
         Send(message, ListenerEntry.Server);
     else
         Send(message, ListenerEntry.Server | ListenerEntry.Local);
 }
示例#17
0
        protected override void OnMessageReceived(NetworkMessage message)
        {
            message.From = ListenerEntry.Client;
            message.Destinations = ListenerEntry.Server | ListenerEntry.Local;

            base.OnMessageReceived(message);
        }