Hashable TelegramObject

This commit is contained in:
Alex Root Junior 2018-02-23 13:19:23 +02:00
parent f3f9b3c27a
commit 531b2a4df7
14 changed files with 54 additions and 50 deletions

View file

@ -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

View file

@ -42,3 +42,6 @@ class AuthWidgetData(base.TelegramObject):
result += ' '
result += self.last_name
return result
def __hash__(self):
return self.id

View file

@ -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)

View file

@ -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)

View file

@ -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:

View file

@ -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)

View file

@ -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)

View file

@ -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):
"""

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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