示例#1
0
        /// <summary>
        /// Обратный вызов таймера неактивности
        /// </summary>
        private void InactiveTimerCallback(object state)
        {
            var e = new ChatEventArgs
            {
                CallbackType = CallbackType.DisconnectByTimeout,
                Person       = _person
            };

            _eventHandler.BeginInvoke(this, e, EndAsync, null);
            Logger.Info("{0} отключен по таймауту", _person.Name);

            Leave();
        }
示例#2
0
        /// <summary>
        /// Асинронная отправка сообщения всем подключенным пользователям
        /// </summary>
        private void BroadcastMessage(ChatEventArgs e)
        {
            var temp = ChatEvent;

            if (temp != null)
            {
                foreach (var d in temp.GetInvocationList())
                {
                    var handler = (EventHandler <ChatEventArgs>)d;
                    handler.BeginInvoke(this, e, EndAsync, null);
                }
            }
        }
示例#3
0
        public OperationResult <Person[]> Join(Person person)
        {
            _eventHandler = EventHandler;
            var opResult = new OperationResult <Person[]>();

            lock (SyncObj)
            {
                if (!CheckIfPersonExists(person.Name))
                {
                    _person = person;
                    Persons.Add(person, EventHandler);
                }
                else
                {
                    opResult.Success = false;
                    var em = $"Пользователь с именен {person.Name} уже в чате";
                    opResult.Errors.Add(new OperationError {
                        ErrorMessage = em
                    });
                    Logger.Error(em);

                    return(opResult);
                }
            }

            _callback = OperationContext.Current.GetCallbackChannel <IChatServiceCallback>();
            var e = new ChatEventArgs
            {
                CallbackType = CallbackType.UserEnter,
                Person       = _person
            };

            _inactiveTimer = new Timer(InactiveTimerCallback, null, _inactiveTimeout, TimeSpan.FromMilliseconds(-1));
            Logger.Info("{0} зашел в чат", _person.Name);
            BroadcastMessage(e);
            ChatEvent += _eventHandler;

            opResult.Result = new Person[Persons.Count];
            lock (SyncObj)
            {
                Persons.Keys.CopyTo(opResult.Result, 0);
            }

            opResult.Success = true;
            return(opResult);
        }
示例#4
0
        public OperationResult Say(TextMessage msg)
        {
            var e = new ChatEventArgs
            {
                CallbackType = CallbackType.Receive,
                Person       = msg.From,
                Message      = msg.Text
            };

            ResetTimer();
            Logger.Info("{0}: {1}", msg.From.Name, msg.Text);
            BroadcastMessage(e);

            return(new OperationResult {
                Success = true
            });
        }
示例#5
0
        public OperationResult Whisper(PersonalTextMessage msg)
        {
            var e = new ChatEventArgs
            {
                CallbackType = CallbackType.ReceiveWhisper,
                Person       = msg.From,
                Message      = msg.Text
            };
            var opResult = new OperationResult();


            EventHandler <ChatEventArgs> personTo;

            lock (SyncObj)
            {
                personTo = GetPersonHandler(msg.To.Name);
                if (personTo == null)
                {
                    opResult.Success = false;
                    var em = $"Пользователь с именем {msg.To.Name} не найден";
                    opResult.Errors.Add(new OperationError {
                        ErrorMessage = em
                    });

                    Logger.Error(em);
                    return(opResult);
                }
            }

            ResetTimer();
            personTo.BeginInvoke(this, e, EndAsync, null);
            // предотвращаем повторное появление персонального сообщения у отправителя
            if (personTo != _eventHandler)
            {
                _eventHandler.BeginInvoke(this, e, EndAsync, null);
            }

            Logger.Info("{0} шепнул: {1}", msg.From.Name, msg.Text);

            opResult.Success = true;
            return(opResult);
        }