Exemplo n.º 1
0
        private ChannelQuestionAndAnswer FindQuestionAndAnswer(string message)
        {
            if (string.IsNullOrEmpty(message))
            {
                return(null);
            }
            if (_qas.ContainsKey(message))
            {
                return(_qas[message]);
            }
            var timeLength    = TimeFormat.Length;
            var qHeaderLength = QuestionHeader.Length;
            var aHeaderLenght = AnswerHeader.Length;

            if (message.Length >= (timeLength + qHeaderLength))
            {
                DateTime time;
                if (DateTime.TryParse(message.Substring(0, timeLength), out time))
                {
                    var header = message.Substring(timeLength, qHeaderLength);
                    if (header == QuestionHeader)
                    {
                        var content      = message.Substring(timeLength + qHeaderLength);
                        var isQuestioner = false;
                        var key          = GetQuestionAndAnswerKey(time, isQuestioner);
                        lock (_qaLocker)
                        {
                            if (_qas.ContainsKey(key))
                            {
                                return(_qas[key]);
                            }
                            var qa = new ChannelQuestionAndAnswer(this, content, time, isQuestioner);
                            _qas.Add(key, qa);
                            return(qa);
                        }
                    }
                    else
                    {
                        header = message.Substring(timeLength, aHeaderLenght);
                        if (header == AnswerHeader)
                        {
                            var content      = message.Substring(timeLength + aHeaderLenght);
                            var isQuestioner = true;
                            var key          = GetQuestionAndAnswerKey(time, isQuestioner);
                            lock (_qaLocker)
                            {
                                if (_qas.ContainsKey(key))
                                {
                                    var qa = _qas[key];
                                    qa.Answer     = content;
                                    qa.AnswerTime = DateTime.Now;
                                    return(qa);
                                }
                            }
                        }
                    }
                }
            }
            return(null);
        }
Exemplo n.º 2
0
        public async Task <IAnswerResult> Request(string question, int timeoutMilliseconds)
        {
            RefreshQA();

            var qa      = new ChannelQuestionAndAnswer(this, question, DateTime.Now, true);
            var key     = this.GetQuestionAndAnswerKey(qa);
            var message = GetQuestionMessage(qa);

            lock (_qaLocker)
            {
                if (_qas.ContainsKey(key) == false)
                {
                    _qas.Add(key, qa);
                }
                else
                {
                    return(new AnswerResult(false, "请求重复!"));
                }
            }
            var time = 0;

            do
            {
                await this.Send(message);

                await Task.Delay(500);

                time += 500;
            } while (qa.IsAnswered == false && time < timeoutMilliseconds);
            var isAnswered = qa.IsAnswered;
            var response   = isAnswered ? qa.Answer : "超时未响应";

            return(new AnswerResult(isAnswered, response));
        }
Exemplo n.º 3
0
 public async Task Answer(ChannelQuestionAndAnswer answer)
 {
     if (answer != null && answer.IsAnswered)
     {
         var message = GetAnswerMessage(answer);
         await this.Send(message);
     }
 }
Exemplo n.º 4
0
 public string GetAnswerMessage(ChannelQuestionAndAnswer answer) => answer.IsAnswered ? $"{answer.QuestionTime.ToString(TimeFormat)}{AnswerHeader}{answer.Answer}" : null;
Exemplo n.º 5
0
 public string GetQuestionMessage(ChannelQuestionAndAnswer answer) => $"{answer.QuestionTime.ToString(TimeFormat)}{QuestionHeader}{answer.Question}";
Exemplo n.º 6
0
 private string GetQuestionAndAnswerKey(ChannelQuestionAndAnswer answer) => $"{answer.QuestionTime.ToString(TimeFormat)}{(answer.IsQuestioner ? "Q" : "A")}";