Source code for imessagedb.handles

from imessagedb.handle import Handle


[docs]class Handles: """ All handles in the database """ def __init__(self, database) -> None: """ Parameters ---------- database : imessagedb.DB An instance of a connected database """ self._database = database self._handle_list = {} # Handles by rowid self._numbers = {} # Handles by phone number / email self._names = {} # Handles by name (from contact list) self._contacts_by_name = {} self._contacts_by_number = {} # Process the contacts first if self._database.config.has_section('CONTACTS'): for (key, value) in self._database.config.items('CONTACTS'): # Capitalize the first letter of every word, since configparser loses case key = key.title() value = value.replace('\n', '') values = value.split(',') self._contacts_by_name[key] = values for item in values: self._contacts_by_number[item] = key self._get_handles_from_database() return
[docs] def _get_handles_from_database(self): self._database.connection.execute('select rowid, id, service from handle') rows = self._database.connection.fetchall() for row in rows: rowid = row[0] number = row[1] service = row[2] if number in self._contacts_by_number: name = self._contacts_by_number[number] else: name = number new_handle = Handle(self._database, rowid, name, number, service) # Add the handle to the rowid dictionary self._handle_list[new_handle.rowid] = new_handle # Add the handle to the numbers dictionary if new_handle.number in self._numbers: self._numbers[new_handle.number].append(new_handle) else: self._numbers[new_handle.number] = [new_handle] # Add the handle to the names dictionary if new_handle.number in self._contacts_by_number: name = self._contacts_by_number[new_handle.number] if name in self._names: self.names[name].append(new_handle) else: self._names[name] = [new_handle]
[docs] def get_handles(self) -> str: """ Return a string with the list of handles""" number_list = list(self._numbers.keys()) return_string = '\n'.join(number_list) return return_string
@property def handles(self) -> dict: """ Return the list of handles """ return self._handle_list @property def numbers(self) -> dict: """ Return the list of handles indexed by the number """ return self._numbers @property def names(self) -> dict: """ Return the list of handles indexed by the number """ return self._names
[docs] def name_for_number(self, number: str) -> str: if number in self._contacts_by_number: return self._contacts_by_number[number] return None
[docs] def __iter__(self): return self._handle_list
[docs] def __len__(self) -> int: return len(self._handle_list)
[docs] def __repr__(self) -> str: handle_array = [] for i in sorted(self._handle_list.keys()): handle_array.append(self._handle_list[i]) return '\n'.join(map(str, handle_array))
[docs] def __getitem__(self, item: str) -> Handle: if item in self._names: return self._names[item] if item in self._numbers: return self._numbers[item] raise KeyError