Beispiel #1
0
 def update_users(self, users):
   # update ppl, free, busy from current database
   for user in users:
     if user['email'] not in self.all:
       p = person(user['email'], user['first_name'])
       self.all.add(user['email'])
       self.meta['new'].add(user['email'])
       self.update_metas_helper(p)
Beispiel #2
0
 def update_users(self, users):
     # update ppl, free, busy from current database
     for user in users:
         if user['email'] not in self.all:
             p = person(user['email'], user['first_name'])
             self.all.add(user['email'])
             self.meta['new'].add(user['email'])
             self.update_metas_helper(p)
Beispiel #3
0
  def update_state(self, d_act):
    info = {'d_act': d_act}
    if len(self.all)==0:
      # this is the first time program is being called, so set the organizer for this meeting
      self.org = d_act['from']['email']
      self.meta['busy'].add(self.org)
      self.meta['ppl'][self.org] = person(self.org, d_act['from']['first_name'], 'busy')

    self.retrieve_users()
    users = d_act['to']+[d_act['from']]
    self.update_users(users)

    if len(d_act['nlu']['outcomes'])>1:
      print 'More than 1 outcome! chk this case..'
      pdb.set_trace()

    #TODO: what happens when wit.ai's output is empty? handle the error cases
    for outcome in d_act['nlu']['outcomes']:
      # Ideally each location should also have an associated preference as should datetime
      if 'location' in outcome['entities']:
        for loc in outcome['entities']['location']:
          self.loc.append({'val': loc['value'], 'from': d_act['from']['email'], 'turn': len(self.turns)})

      if 'local_search_query' in outcome['entities']:
        for loc in outcome['entities']['local_search_query']:
          self.loc.append({'val': loc['value'], 'from': d_act['from']['email'], 'turn': len(self.turns)})

      # TODO: ideally each object in the state's datetime list should have a preference. What if the person says in the subsequent conversation, that
        # "Oh, actually 6p might work better, but if not I can happily meet at 4. ". An extended version of preference could also be dispreference -
        # changing his mind. for instance, "actually, I can only do 6p, sorry."
      if 'datetime' in outcome['entities']:
        for dt in outcome['entities']['datetime']:
          for i, dt_interpret in enumerate(dt['values']):
            dtval = dateutil.parser.parse(dt_interpret['value'])
            wit_ai_bug = False
            if i>0:
              tmpdtval = dateutil.parser.parse(dt['values'][0]['value'])
              if dtval-tmpdtval > datetime.timedelta(days=365):
                wit_ai_bug = True
            if not wit_ai_bug:
              self.update_dt_avail(d_act['from']['email'], dt_interpret)
              # self.s['dt'].append(dt_interpret)
              # self.s['dt'].add(((dt_interpret['value'], ), user_email, preference)


            # in the following attempt, 'grain' information about datetime will be lost.
            # so we cannot distinguish betwn 'tomorrow' and 'tomorrow at 12am'
            # if dt_interpret['type'] == 'value':
            #   from_dt = dateutil.parser.parse(dt_interpret['value'])
            #   self.s['dt'].append((from_dt, ))
            # elif dt_interpret['type'] == 'interval':
            #   from_dt = dateutil.parser.parse(dt_interpret['from']['value'])
            #   to_dt = dateutil.parser.parse(dt_interpret['from']['value'])
            #   self.s['dt'].append((from_dt, to_dt))

      if 'duration' in outcome['entities']:
        for dur in outcome['entities']['duration']:
          self.dur.append({'val': dur, 'from': d_act['from']['email'], 'turn': len(self.turns)})
          # self.s['duration'].append(dur)

    self.turns.append(info)
Beispiel #4
0
 def retrieve_users(self):
   for user_email in self.all:
     p = person(user_email)
     self.update_metas_helper(p)
Beispiel #5
0
    def update_state(self, d_act):
        info = {'d_act': d_act}
        if len(self.all) == 0:
            # this is the first time program is being called, so set the organizer for this meeting
            self.org = d_act['from']['email']
            self.meta['busy'].add(self.org)
            self.meta['ppl'][self.org] = person(self.org,
                                                d_act['from']['first_name'],
                                                'busy')

        self.retrieve_users()
        users = d_act['to'] + [d_act['from']]
        self.update_users(users)

        if len(d_act['nlu']['outcomes']) > 1:
            print 'More than 1 outcome! chk this case..'
            pdb.set_trace()

        #TODO: what happens when wit.ai's output is empty? handle the error cases
        for outcome in d_act['nlu']['outcomes']:
            # Ideally each location should also have an associated preference as should datetime
            if 'location' in outcome['entities']:
                for loc in outcome['entities']['location']:
                    self.loc.append({
                        'val': loc['value'],
                        'from': d_act['from']['email'],
                        'turn': len(self.turns)
                    })

            if 'local_search_query' in outcome['entities']:
                for loc in outcome['entities']['local_search_query']:
                    self.loc.append({
                        'val': loc['value'],
                        'from': d_act['from']['email'],
                        'turn': len(self.turns)
                    })

            # TODO: ideally each object in the state's datetime list should have a preference. What if the person says in the subsequent conversation, that
            # "Oh, actually 6p might work better, but if not I can happily meet at 4. ". An extended version of preference could also be dispreference -
            # changing his mind. for instance, "actually, I can only do 6p, sorry."
            if 'datetime' in outcome['entities']:
                for dt in outcome['entities']['datetime']:
                    for i, dt_interpret in enumerate(dt['values']):
                        dtval = dateutil.parser.parse(dt_interpret['value'])
                        wit_ai_bug = False
                        if i > 0:
                            tmpdtval = dateutil.parser.parse(
                                dt['values'][0]['value'])
                            if dtval - tmpdtval > datetime.timedelta(days=365):
                                wit_ai_bug = True
                        if not wit_ai_bug:
                            self.update_dt_avail(d_act['from']['email'],
                                                 dt_interpret)
                            # self.s['dt'].append(dt_interpret)
                            # self.s['dt'].add(((dt_interpret['value'], ), user_email, preference)

                        # in the following attempt, 'grain' information about datetime will be lost.
                        # so we cannot distinguish betwn 'tomorrow' and 'tomorrow at 12am'
                        # if dt_interpret['type'] == 'value':
                        #   from_dt = dateutil.parser.parse(dt_interpret['value'])
                        #   self.s['dt'].append((from_dt, ))
                        # elif dt_interpret['type'] == 'interval':
                        #   from_dt = dateutil.parser.parse(dt_interpret['from']['value'])
                        #   to_dt = dateutil.parser.parse(dt_interpret['from']['value'])
                        #   self.s['dt'].append((from_dt, to_dt))

            if 'duration' in outcome['entities']:
                for dur in outcome['entities']['duration']:
                    self.dur.append({
                        'val': dur,
                        'from': d_act['from']['email'],
                        'turn': len(self.turns)
                    })
                    # self.s['duration'].append(dur)

        self.turns.append(info)
Beispiel #6
0
 def retrieve_users(self):
     for user_email in self.all:
         p = person(user_email)
         self.update_metas_helper(p)