Example #1
0
class Model(object):
    def __init__(self):
        self.email_to_number = {} 
        self.number_to_email = {}
        self.email_to_most_recent_time_used = {}
        self.email_to_alias = {} # TODO: import buddy list to get alias (priority: low)
        self.emails = []
        self.receiver_list = []
        self.random_counter = -1
        self.receiver_index = -1
    
    def addUI(self, ui):
        self.ui = ui
        
    def addBot(self):
        self.bot = Chat(USER, PD)
        self.bot.addModel(self)
        self.bot.run()
    
    def handleIncomingMessage(self, message):
        from_field = message["from"]
        body_field = message["body"]
        email = from_field.bare 
        alias = from_field.user
        if email not in self.receiver_list:
            self.receiver_list.append(email)
        
        self.__register_email(email, alias)
        buddy_number = self.email_to_number[email]
        message_to_show = beautify_incoming_message(alias, buddy_number, body_field)
        # TODO: need to refactor alias, buddy_number, body_field to a class or something (priority: low)
        self.ui.showMessage(message_to_show)
        self.ui.set_current_receiver()
        self.show_composing_message(self.ui.bufferMessage)
        
    def __register_email(self, email, alias):
        if email not in self.email_to_alias:
            self.email_to_alias[email] = alias
            self.emails.append(email)
        self.__register_buddy_number(email)
        self.email_to_most_recent_time_used[email] = time.time()
        
    def __register_buddy_number(self, email):
        if email in self.email_to_number:
            return
        for number in NUMBER_RANGE:
            if not number in self.number_to_email:
                break
        if number in self.number_to_email:
            number = self.__pop_oldest_used_indexnumber()
        self.email_to_number[email] = number
        self.number_to_email[number] = email
    
    def __pop_oldest_used_indexnumber(self): # untested
        number, min_last_used_time = 0, 1e10
        for i in NUMBER_RANGE:
            last_used_time = self.email_to_most_recent_time_used[self.number_to_email[i]]
            if  last_used_time < min_last_used_time:
                number, min_last_used_time = i, last_used_time
        email = self.number_to_email[number]
        del self.number_to_email[number]
        del self.email_to_number[email]

    def get_receiver(self, up_or_down):
        self.receiver_index += up_or_down
        if self.receiver_index < 0: 
            self.receiver_index = 0
        if len(self.receiver_list) <= self.receiver_index:
            self.receiver_list.append(self.get_any_receiver())
        self.__clean_receiver_list()
        return self.receiver_list[self.receiver_index]
    
    def insert_receiver(self, email):
        if self.receiver_list[self.receiver_index] != email:
            self.receiver_index +=1
            self.receiver_list = self.receiver_list[:self.receiver_index] + [email] + \
                                 self.receiver_list[self.receiver_index:]
        self.__clean_receiver_list()
        
    def __clean_receiver_list(self):
        if self.receiver_index > MAX_RECIEVER_LIST_LEN:
            self.receiver_index -= MAX_RECIEVER_LIST_LEN/2
            self.receiver_list = self.receiver_list[MAX_RECIEVER_LIST_LEN/2:]

    def get_any_receiver(self):
        if not self.emails:
            return ''
        self.random_counter += 1
        return self.emails[self.random_counter % len(self.emails)]
    
    def send_message(self, bufferMessage):
        email = bufferMessage.get_receiver()
        self.__register_email(email, default_alias_from_email(email))
        buddy_number = self.email_to_number[email]
        alias = self.email_to_alias[email]
        body_field = bufferMessage.get_body()
        message_to_show = beautify_outgoing_message(alias, buddy_number, body_field)
        self.ui.showMessage(message_to_show)
        self.bot.sendChat(bufferMessage)
        
    def get_email_from_number(self, number):
        if number in self.number_to_email:
            return self.number_to_email[number]
        return self.get_any_receiver()
    
    def show_composing_message(self, bufferMessage):
        email = bufferMessage.get_receiver()
        buddy_number = self.email_to_number.get(email, 0)
        body_field = bufferMessage.get_body()
        message_to_show = beautify_composing_message(email, buddy_number, body_field)
        self.ui.showMessage(message_to_show)
        
    def show_help_message(self):
        self.ui.showMessage(HELP_MESSAGE)
        self.show_composing_message(self.ui.bufferMessage)
        # still need to think about this, the updation of bufferMessage