mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-11-01 00:17:47 +03:00 
			
		
		
		
	Add more abstraction
This commit is contained in:
		
							parent
							
								
									d9a73744a4
								
							
						
					
					
						commit
						118d9b10e8
					
				|  | @ -18,8 +18,8 @@ class Session(ABC): | ||||||
|         self._report_errors = True |         self._report_errors = True | ||||||
|         self._flood_sleep_threshold = 60 |         self._flood_sleep_threshold = 60 | ||||||
| 
 | 
 | ||||||
|     def clone(self): |     def clone(self, to_instance=None): | ||||||
|         cloned = self.__class__() |         cloned = to_instance or self.__class__() | ||||||
|         cloned._device_model = self.device_model |         cloned._device_model = self.device_model | ||||||
|         cloned._system_version = self.system_version |         cloned._system_version = self.system_version | ||||||
|         cloned._app_version = self.app_version |         cloned._app_version = self.app_version | ||||||
|  | @ -27,6 +27,7 @@ class Session(ABC): | ||||||
|         cloned._system_lang_code = self.system_lang_code |         cloned._system_lang_code = self.system_lang_code | ||||||
|         cloned._report_errors = self.report_errors |         cloned._report_errors = self.report_errors | ||||||
|         cloned._flood_sleep_threshold = self.flood_sleep_threshold |         cloned._flood_sleep_threshold = self.flood_sleep_threshold | ||||||
|  |         return cloned | ||||||
| 
 | 
 | ||||||
|     @abstractmethod |     @abstractmethod | ||||||
|     def set_dc(self, dc_id, server_address, port): |     def set_dc(self, dc_id, server_address, port): | ||||||
|  |  | ||||||
|  | @ -111,8 +111,41 @@ class MemorySession(Session): | ||||||
|     def list_sessions(cls): |     def list_sessions(cls): | ||||||
|         raise NotImplementedError |         raise NotImplementedError | ||||||
| 
 | 
 | ||||||
|     @staticmethod |     def _entity_values_to_row(self, id, hash, username, phone, name): | ||||||
|     def _entities_to_rows(tlo): |         return id, hash, username, phone, name | ||||||
|  | 
 | ||||||
|  |     def _entity_to_row(self, e): | ||||||
|  |         if not isinstance(e, TLObject): | ||||||
|  |             return | ||||||
|  |         try: | ||||||
|  |             p = utils.get_input_peer(e, allow_self=False) | ||||||
|  |             marked_id = utils.get_peer_id(p) | ||||||
|  |         except ValueError: | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         if isinstance(p, (InputPeerUser, InputPeerChannel)): | ||||||
|  |             if not p.access_hash: | ||||||
|  |                 # Some users and channels seem to be returned without | ||||||
|  |                 # an 'access_hash', meaning Telegram doesn't want you | ||||||
|  |                 # to access them. This is the reason behind ensuring | ||||||
|  |                 # that the 'access_hash' is non-zero. See issue #354. | ||||||
|  |                 # Note that this checks for zero or None, see #392. | ||||||
|  |                 return | ||||||
|  |             else: | ||||||
|  |                 p_hash = p.access_hash | ||||||
|  |         elif isinstance(p, InputPeerChat): | ||||||
|  |             p_hash = 0 | ||||||
|  |         else: | ||||||
|  |             return | ||||||
|  | 
 | ||||||
|  |         username = getattr(e, 'username', None) or None | ||||||
|  |         if username is not None: | ||||||
|  |             username = username.lower() | ||||||
|  |         phone = getattr(e, 'phone', None) | ||||||
|  |         name = utils.get_display_name(e) or None | ||||||
|  |         return self._entity_values_to_row(marked_id, p_hash, username, phone, name) | ||||||
|  | 
 | ||||||
|  |     def _entities_to_rows(self, tlo): | ||||||
|         if not isinstance(tlo, TLObject) and utils.is_list_like(tlo): |         if not isinstance(tlo, TLObject) and utils.is_list_like(tlo): | ||||||
|             # This may be a list of users already for instance |             # This may be a list of users already for instance | ||||||
|             entities = tlo |             entities = tlo | ||||||
|  | @ -127,35 +160,9 @@ class MemorySession(Session): | ||||||
| 
 | 
 | ||||||
|         rows = []  # Rows to add (id, hash, username, phone, name) |         rows = []  # Rows to add (id, hash, username, phone, name) | ||||||
|         for e in entities: |         for e in entities: | ||||||
|             if not isinstance(e, TLObject): |             row = self._entity_to_row(e) | ||||||
|                 continue |             if row: | ||||||
|             try: |                 rows.append(row) | ||||||
|                 p = utils.get_input_peer(e, allow_self=False) |  | ||||||
|                 marked_id = utils.get_peer_id(p) |  | ||||||
|             except ValueError: |  | ||||||
|                 continue |  | ||||||
| 
 |  | ||||||
|             if isinstance(p, (InputPeerUser, InputPeerChannel)): |  | ||||||
|                 if not p.access_hash: |  | ||||||
|                     # Some users and channels seem to be returned without |  | ||||||
|                     # an 'access_hash', meaning Telegram doesn't want you |  | ||||||
|                     # to access them. This is the reason behind ensuring |  | ||||||
|                     # that the 'access_hash' is non-zero. See issue #354. |  | ||||||
|                     # Note that this checks for zero or None, see #392. |  | ||||||
|                     continue |  | ||||||
|                 else: |  | ||||||
|                     p_hash = p.access_hash |  | ||||||
|             elif isinstance(p, InputPeerChat): |  | ||||||
|                 p_hash = 0 |  | ||||||
|             else: |  | ||||||
|                 continue |  | ||||||
| 
 |  | ||||||
|             username = getattr(e, 'username', None) or None |  | ||||||
|             if username is not None: |  | ||||||
|                 username = username.lower() |  | ||||||
|             phone = getattr(e, 'phone', None) |  | ||||||
|             name = utils.get_display_name(e) or None |  | ||||||
|             rows.append((marked_id, p_hash, username, phone, name)) |  | ||||||
|         return rows |         return rows | ||||||
| 
 | 
 | ||||||
|     def process_entities(self, tlo): |     def process_entities(self, tlo): | ||||||
|  |  | ||||||
|  | @ -120,8 +120,8 @@ class SQLiteSession(MemorySession): | ||||||
|             c.close() |             c.close() | ||||||
|             self.save() |             self.save() | ||||||
| 
 | 
 | ||||||
|     def clone(self): |     def clone(self, to_instance=None): | ||||||
|         cloned = super().clone() |         cloned = super().clone(to_instance) | ||||||
|         cloned.save_entities = self.save_entities |         cloned.save_entities = self.save_entities | ||||||
|         return cloned |         return cloned | ||||||
| 
 | 
 | ||||||
|  | @ -180,9 +180,7 @@ class SQLiteSession(MemorySession): | ||||||
|     # Data from sessions should be kept as properties |     # Data from sessions should be kept as properties | ||||||
|     # not to fetch the database every time we need it |     # not to fetch the database every time we need it | ||||||
|     def set_dc(self, dc_id, server_address, port): |     def set_dc(self, dc_id, server_address, port): | ||||||
|         self._dc_id = dc_id |         super().set_dc(dc_id, server_address, port) | ||||||
|         self._server_address = server_address |  | ||||||
|         self._port = port |  | ||||||
|         self._update_session_table() |         self._update_session_table() | ||||||
| 
 | 
 | ||||||
|         # Fetch the auth_key corresponding to this data center |         # Fetch the auth_key corresponding to this data center | ||||||
|  | @ -287,16 +285,19 @@ class SQLiteSession(MemorySession): | ||||||
|             'select id, hash from entities where phone=?', (phone,)) |             'select id, hash from entities where phone=?', (phone,)) | ||||||
| 
 | 
 | ||||||
|     def get_entity_rows_by_username(self, username): |     def get_entity_rows_by_username(self, username): | ||||||
|         self._fetchone_entity('select id, hash from entities where username=?', |         return self._fetchone_entity( | ||||||
|                               (username,)) |             'select id, hash from entities where username=?', | ||||||
|  |             (username,)) | ||||||
| 
 | 
 | ||||||
|     def get_entity_rows_by_name(self, name): |     def get_entity_rows_by_name(self, name): | ||||||
|         self._fetchone_entity('select id, hash from entities where name=?', |         return self._fetchone_entity( | ||||||
|                               (name,)) |             'select id, hash from entities where name=?', | ||||||
|  |             (name,)) | ||||||
| 
 | 
 | ||||||
|     def get_entity_rows_by_id(self, id): |     def get_entity_rows_by_id(self, id): | ||||||
|         self._fetchone_entity('select id, hash from entities where id=?', |         return self._fetchone_entity( | ||||||
|                               (id,)) |             'select id, hash from entities where id=?', | ||||||
|  |             (id,)) | ||||||
| 
 | 
 | ||||||
|     # File processing |     # File processing | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user