def add(self, record): question = record['Question'] answer = record['Answer'] self.record.append(record) self.index[norm(question)].append(len(self.record) - 1) self.last_question = question self.last_answer = answer self.last_time = record.get('Datetime')
def add(self, question, answer, datetime=None, **kwargs): time = datetime or dt.datetime.now() record = {'Datetime': time, 'Question': question, 'Answer': answer} if kwargs: record.update(kwargs) self.record.append(record) self.index[norm(question)].append(len(self.record) - 1) self.last_question = question self.last_answer = answer self.last_time = time
def check(self, question, answer): # each additional character over the 10 characters, adds 30 seconds # delay before that AIML string is allowed to repeat. same_answers = [ r for r in self.record if norm(r['Answer']) == norm(answer) ] time_elapsed = ( dt.datetime.utcnow() - same_answers[-1]['Datetime']).seconds if same_answers else 0 if max(0, len(norm(answer)) - 10) * 30 <= time_elapsed: logger.debug("Allow repeat answer {}".format(answer)) logger.debug("Answer length {}, time elapsed {}".format( len(norm(answer)), time_elapsed)) return True if norm(answer) == norm(self.last_answer): logger.debug("Last answer repeat") return False if not self.is_unique(answer): logger.debug("Non unique answer") return False if self.contain(question, answer): logger.debug("Repeat answer") return False return True
def add(self, question, answer, datetime=None, **kwargs): time = datetime or dt.datetime.now() record = { 'Datetime': time, 'Question': question, 'Answer': answer } if kwargs: record.update(kwargs) self.record.append(record) self.index[norm(question)].append(len(self.record) - 1) self.last_question = question self.last_answer = answer self.last_time = time
def process_response(self, response): if response is not None: answer = response.get('text') if not self.ignore_indicator: self.process_indicator(answer) response['text'] = norm(answer) self.last_response = response if self.response_listener is None: self.stdout.write('{}[by {}]: {}\n'.format( self.botname, response.get('botid'), response.get('text'))) else: try: threading.Timer(0, self.response_listener.on_response, (self.session, response)).start() except Exception as ex: logger.error(ex)
def process_response(self, response): if response is not None: self.last_response = response self.last_response_time = dt.datetime.utcnow() tier_response = response['default_response'] if not tier_response: return answer = tier_response['text'] if not self.ignore_indicator: self.process_indicator(answer) tier_response['text'] = norm(answer) self.last_tier_response = tier_response if self.response_listener is None: self.stdout.write('{}[by {}]: {}\n'.format( self.botname, tier_response.get('botid'), tier_response.get('text'))) else: try: threading.Timer(0, self.response_listener.on_response, (self.session, response)).start() except Exception as ex: logger.error(ex)
def check(self, question, answer): # each additional character over the 10 characters, adds 30 seconds # delay before that AIML string is allowed to repeat. same_answers = [r for r in self.record if norm(r['Answer']) == norm(answer)] time_elapsed = (dt.datetime.now() - same_answers[-1]['Datetime'] ).seconds if same_answers else 0 if max(0, len(norm(answer)) - 10) * 30 <= time_elapsed: logger.debug("Allow repeat answer {}".format(answer)) logger.debug("Answer length {}, time elapsed {}".format( len(norm(answer)), time_elapsed)) return True if norm(answer) == norm(self.last_answer): logger.debug("Last answer repeat") return False if not self.is_unique(answer): logger.debug("Non unique answer") return False if self.contain(question, answer): logger.debug("Repeat answer") return False return True
def _get_records(self, question): records = [self.record[i] for i in self.index[norm(question)]] return records
def is_unique(self, answer): answers = [norm(r['Answer']) for r in self.record] return not norm(answer) in answers
def contain(self, question, answer): question = norm(question) answer = norm(answer) records = self._get_records(question) answers = [norm(r['Answer']) for r in records] return answer in answers