mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-11 09:55:21 +00:00
Hashable TelegramObject
This commit is contained in:
parent
f3f9b3c27a
commit
531b2a4df7
14 changed files with 54 additions and 50 deletions
|
|
@ -15,11 +15,3 @@ class Audio(base.TelegramObject, mixins.Downloadable):
|
|||
title: base.String = fields.Field()
|
||||
mime_type: base.String = fields.Field()
|
||||
file_size: base.Integer = fields.Field()
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.file_id) + \
|
||||
self.duration + \
|
||||
hash(self.performer) + \
|
||||
hash(self.title) + \
|
||||
hash(self.mime_type) + \
|
||||
self.file_size
|
||||
|
|
|
|||
|
|
@ -42,3 +42,6 @@ class AuthWidgetData(base.TelegramObject):
|
|||
result += ' '
|
||||
result += self.last_name
|
||||
return result
|
||||
|
||||
def __hash__(self):
|
||||
return self.id
|
||||
|
|
|
|||
|
|
@ -244,3 +244,28 @@ class TelegramObject(metaclass=MetaTelegramObject):
|
|||
"""
|
||||
for _, value in self:
|
||||
yield value
|
||||
|
||||
def __hash__(self):
|
||||
def _hash(obj):
|
||||
buf = 0
|
||||
if isinstance(obj, list):
|
||||
for item in obj:
|
||||
buf += _hash(item)
|
||||
elif isinstance(obj, dict):
|
||||
for dict_key, dict_value in obj.items():
|
||||
buf += hash(dict_key) + _hash(dict_value)
|
||||
else:
|
||||
try:
|
||||
buf += hash(obj)
|
||||
except TypeError: # Skip unhashable objects
|
||||
pass
|
||||
return buf
|
||||
|
||||
result = 0
|
||||
for key, value in sorted(self.values.items()):
|
||||
result += hash(key) + _hash(value)
|
||||
|
||||
return result
|
||||
|
||||
def __eq__(self, other):
|
||||
return isinstance(other, self.__class__) and hash(other) == hash(self)
|
||||
|
|
|
|||
|
|
@ -56,3 +56,6 @@ class CallbackQuery(base.TelegramObject):
|
|||
:rtype: :obj:`base.Boolean`"""
|
||||
await self.bot.answer_callback_query(callback_query_id=self.id, text=text,
|
||||
show_alert=show_alert, url=url, cache_time=cache_time)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.id)
|
||||
|
|
|
|||
|
|
@ -28,6 +28,9 @@ class Chat(base.TelegramObject):
|
|||
sticker_set_name: base.String = fields.Field()
|
||||
can_set_sticker_set: base.Boolean = fields.Field()
|
||||
|
||||
def __hash__(self):
|
||||
return self.id
|
||||
|
||||
@property
|
||||
def full_name(self):
|
||||
if self.type == ChatType.PRIVATE:
|
||||
|
|
|
|||
|
|
@ -73,3 +73,6 @@ class ChatPhoto(base.TelegramObject):
|
|||
|
||||
async def get_big_file(self):
|
||||
return await self.bot.get_file(self.big_file_id)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.small_file_id) + hash(self.big_file_id)
|
||||
|
|
|
|||
|
|
@ -19,3 +19,6 @@ class Contact(base.TelegramObject):
|
|||
if self.last_name is not None:
|
||||
name += ' ' + self.last_name
|
||||
return name
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.phone_number)
|
||||
|
|
|
|||
|
|
@ -18,8 +18,8 @@ class MessageEntity(base.TelegramObject):
|
|||
|
||||
def _apply(self, text, func):
|
||||
return text[:self.offset] + \
|
||||
func(text[self.offset:self.offset + self.length]) + \
|
||||
text[self.offset + self.length:]
|
||||
func(text[self.offset:self.offset + self.length]) + \
|
||||
text[self.offset + self.length:]
|
||||
|
||||
def apply_md(self, text):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -44,3 +44,6 @@ class Downloadable:
|
|||
return self
|
||||
else:
|
||||
return await self.bot.get_file(self.file_id)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self.file_id)
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
from . import base
|
||||
from . import fields
|
||||
from . import mixins
|
||||
from .mask_position import MaskPosition
|
||||
from .photo_size import PhotoSize
|
||||
|
||||
|
||||
class Sticker(base.TelegramObject):
|
||||
class Sticker(base.TelegramObject, mixins.Downloadable):
|
||||
"""
|
||||
This object represents a sticker.
|
||||
|
||||
|
|
@ -18,11 +19,3 @@ class Sticker(base.TelegramObject):
|
|||
set_name: base.String = fields.Field()
|
||||
mask_position: MaskPosition = fields.Field(base=MaskPosition)
|
||||
file_size: base.Integer = fields.Field()
|
||||
|
||||
def __hash__(self):
|
||||
return self.file_id
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, type(self)):
|
||||
return other.file_id == self.file_id
|
||||
return self.file_id == other
|
||||
|
|
|
|||
|
|
@ -78,10 +78,7 @@ class User(base.TelegramObject):
|
|||
return await self.bot.get_user_profile_photos(self.id, offset, limit)
|
||||
|
||||
def __hash__(self):
|
||||
return self.id + \
|
||||
hash(self.is_bot) + \
|
||||
hash(self.full_name) + \
|
||||
(hash(self.username) if self.username else 0)
|
||||
return self.id
|
||||
|
||||
def __int__(self):
|
||||
return self.id
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
from . import base
|
||||
from . import fields
|
||||
from . import mixins
|
||||
from .photo_size import PhotoSize
|
||||
|
||||
|
||||
class Video(base.TelegramObject):
|
||||
class Video(base.TelegramObject, mixins.Downloadable):
|
||||
"""
|
||||
This object represents a video file.
|
||||
|
||||
|
|
@ -16,11 +17,3 @@ class Video(base.TelegramObject):
|
|||
thumb: PhotoSize = fields.Field(base=PhotoSize)
|
||||
mime_type: base.String = fields.Field()
|
||||
file_size: base.Integer = fields.Field()
|
||||
|
||||
def __hash__(self):
|
||||
return self.file_id
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, type(self)):
|
||||
return other.file_id == self.file_id
|
||||
return self.file_id == other
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
from . import base
|
||||
from . import fields
|
||||
from . import mixins
|
||||
from .photo_size import PhotoSize
|
||||
|
||||
|
||||
class VideoNote(base.TelegramObject):
|
||||
class VideoNote(base.TelegramObject, mixins.Downloadable):
|
||||
"""
|
||||
This object represents a video message (available in Telegram apps as of v.4.0).
|
||||
|
||||
|
|
@ -14,11 +15,3 @@ class VideoNote(base.TelegramObject):
|
|||
duration: base.Integer = fields.Field()
|
||||
thumb: PhotoSize = fields.Field(base=PhotoSize)
|
||||
file_size: base.Integer = fields.Field()
|
||||
|
||||
def __hash__(self):
|
||||
return self.file_id
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, type(self)):
|
||||
return other.file_id == self.file_id
|
||||
return self.file_id == other
|
||||
|
|
|
|||
|
|
@ -1,8 +1,9 @@
|
|||
from . import base
|
||||
from . import fields
|
||||
from . import mixins
|
||||
|
||||
|
||||
class Voice(base.TelegramObject):
|
||||
class Voice(base.TelegramObject, mixins.Downloadable):
|
||||
"""
|
||||
This object represents a voice note.
|
||||
|
||||
|
|
@ -12,11 +13,3 @@ class Voice(base.TelegramObject):
|
|||
duration: base.Integer = fields.Field()
|
||||
mime_type: base.String = fields.Field()
|
||||
file_size: base.Integer = fields.Field()
|
||||
|
||||
def __hash__(self):
|
||||
return self.file_id
|
||||
|
||||
def __eq__(self, other):
|
||||
if isinstance(other, type(self)):
|
||||
return other.file_id == self.file_id
|
||||
return self.file_id == other
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue