/// <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(); }
/// <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); } } }
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); }
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 }); }
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); }