protected void InternalOnMessage(UserInfo user, string message) { if (IsDisposed) { return; } Logger.Trace("Message '{0}' -> Heyman:{1}", user, message); lock (_sync) { HeymanTalk talk; // try find talk with this user if (_talks.TryGetValue(user.Id, out talk)) { //already talks with this user -> send message ot talk talk.OnMessage(message); } else { // new talk -> try find command by message var cmd = FindCommand(message); if (cmd == null) { Logger.Warn("'{0}' -> Heyman: Unkwnon command '{1}'", user, message); PrintHelp(user.Id, message, _commands); return; } talk = new HeymanTalk(user, this); _talks.Add(user.Id, talk); try { Logger.Info("Begin talk '{0}' with user {1}", cmd.Title, user); //run on current thread talk.Run(cmd, message); } catch (Exception ex) { Logger.Error(ex, "Error to begin talk {0} with", cmd.Title, user); Say(talk.User.Id, ex.Message); } //wait for exit on new thread Task.Factory.StartNew(() => RemoveOnExit(talk), TaskCreationOptions.LongRunning); } } }
private void RemoveOnExit(HeymanTalk talk) { try { talk.WaitExit(); } catch (Exception ex) { Logger.Error(ex, "Error to wait for exit talk with user {0}", talk.User); Say(talk.User.Id, ex.Message); } lock (_sync) { Logger.Info("COMPLETE {0}", talk); _talks.Remove(talk.User.Id); } }
protected void InternalOnMessage(UserInfo user, string message) { if (IsDisposed) return; Logger.Trace("Message '{0}' -> Heyman:{1}",user,message); lock (_sync) { HeymanTalk talk; // try find talk with this user if (_talks.TryGetValue(user.Id, out talk)) { //already talks with this user -> send message ot talk talk.OnMessage(message); } else { // new talk -> try find command by message var cmd = FindCommand(message); if (cmd == null) { Logger.Warn("'{0}' -> Heyman: Unkwnon command '{1}'", user, message); PrintHelp(user.Id, message,_commands); return; } talk = new HeymanTalk(user, this); _talks.Add(user.Id, talk); try { Logger.Info("Begin talk '{0}' with user {1}", cmd.Title, user); //run on current thread talk.Run(cmd,message); } catch (Exception ex) { Logger.Error(ex, "Error to begin talk {0} with", cmd.Title, user); Say(talk.User.Id, ex.Message); } //wait for exit on new thread Task.Factory.StartNew(()=>RemoveOnExit(talk), TaskCreationOptions.LongRunning); } } }
private void RemoveOnExit(HeymanTalk talk) { try { talk.WaitExit(); } catch (Exception ex) { Logger.Error(ex, "Error to wait for exit talk with user {0}", talk.User); Say(talk.User.Id,ex.Message); } lock (_sync) { Logger.Info("COMPLETE {0}", talk); _talks.Remove(talk.User.Id); } }