mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-11-04 09:57:29 +03:00 
			
		
		
		
	Add a basic EntityDatabase class
This commit is contained in:
		
							parent
							
								
									56e81c05d6
								
							
						
					
					
						commit
						5be9df0eec
					
				
							
								
								
									
										75
									
								
								telethon/entity_database.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								telethon/entity_database.py
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,75 @@
 | 
				
			||||||
 | 
					from . import utils
 | 
				
			||||||
 | 
					from .tl import TLObject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EntityDatabase:
 | 
				
			||||||
 | 
					    def __init__(self, enabled=True):
 | 
				
			||||||
 | 
					        self.enabled = enabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self._entities = {}  # marked_id: user|chat|channel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # TODO Allow disabling some extra mappings
 | 
				
			||||||
 | 
					        self._username_id = {}  # username: marked_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def add(self, entity):
 | 
				
			||||||
 | 
					        if not self.enabled:
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Adds or updates the given entity
 | 
				
			||||||
 | 
					        marked_id = utils.get_peer_id(entity, add_mark=True)
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            old_entity = self._entities[marked_id]
 | 
				
			||||||
 | 
					            old_entity.__dict__.update(entity)  # Keep old references
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            # Update must delete old username
 | 
				
			||||||
 | 
					            username = getattr(old_entity, 'username', None)
 | 
				
			||||||
 | 
					            if username:
 | 
				
			||||||
 | 
					                del self._username_id[username.lower()]
 | 
				
			||||||
 | 
					        except KeyError:
 | 
				
			||||||
 | 
					            # Add new entity
 | 
				
			||||||
 | 
					            self._entities[marked_id] = entity
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Always update username if any
 | 
				
			||||||
 | 
					        username = getattr(entity, 'username', None)
 | 
				
			||||||
 | 
					        if username:
 | 
				
			||||||
 | 
					            self._username_id[username.lower()] = marked_id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __getitem__(self, key):
 | 
				
			||||||
 | 
					        """Accepts a digit only string as phone number,
 | 
				
			||||||
 | 
					           otherwise it's treated as an username.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           If an integer is given, it's treated as the ID of the desired User.
 | 
				
			||||||
 | 
					           The ID given won't try to be guessed as the ID of a chat or channel,
 | 
				
			||||||
 | 
					           as there may be an user with that ID, and it would be unreliable.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           If a Peer is given (PeerUser, PeerChat, PeerChannel),
 | 
				
			||||||
 | 
					           its specific entity is retrieved as User, Chat or Channel.
 | 
				
			||||||
 | 
					           Note that megagroups are channels with .megagroup = True.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        if isinstance(key, str):
 | 
				
			||||||
 | 
					            # TODO Parse phone properly, currently only usernames
 | 
				
			||||||
 | 
					            key = key.lstrip('@').lower()
 | 
				
			||||||
 | 
					            # TODO Use the client to return from username if not found
 | 
				
			||||||
 | 
					            return self._entities[self._username_id[key]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if isinstance(key, int):
 | 
				
			||||||
 | 
					            return self._entities[key]  # normal IDs are assumed users
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if isinstance(key, TLObject) and type(key).SUBCLASS_OF_ID == 0x2d45687:
 | 
				
			||||||
 | 
					            return self._entities[utils.get_peer_id(key, add_mark=True)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        raise KeyError(key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __delitem__(self, key):
 | 
				
			||||||
 | 
					        target = self[key]
 | 
				
			||||||
 | 
					        del self._entities[key]
 | 
				
			||||||
 | 
					        if getattr(target, 'username'):
 | 
				
			||||||
 | 
					            del self._username_id[target.username]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # TODO Allow search by name by tokenizing the input and return a list
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def clear(self, target=None):
 | 
				
			||||||
 | 
					        if target is None:
 | 
				
			||||||
 | 
					            self._entities.clear()
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            del self[target]
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user