import time import jsonpickle from vk_messages_bot import db from vk_messages_bot.vk import Vk from vk_messages_bot.vk_user import Vk_user class Vk_chat(): def __init__(self, chat_id=None, title='', type='', admin_id=None, users=[], created_at=time.time(), **kwargs): self.id = chat_id self.title = title self.admin_id = admin_id self.photo = None self.created_at = created_at self.users = [Vk_user(**u) for u in users] for u in self.users: u.persist() def __hash__(self): return abs(hash('chat-' + str(self.id))) % (10 ** 8) def __eq__(self, other): return self.__hash__() == other.__hash__() @staticmethod def DB_KEY(chat_id): return 'VK-CHAT-' + str(chat_id) def empty(self): return self.id == None def get_name(self): if len(self.title) > 0: return self.title return 'Chat #' + self.id def name_from(self, uid_str): uid = int(float(uid_str)) return next((u.get_name() + ' in ' for u in self.users if u.uid == uid), '') + self.get_name() def participants(self): return ', '.join([u.get_name() for u in self.users]) def db_key(self): return Vk_chat.DB_KEY(self.id) def persist(self): db.set(self.db_key(), self.to_json()) db.sync() def outdated(self): one_week = 60 * 24 * 7 return self.created_at < time.time() - one_week def should_fetch(self): return self.empty() or self.outdated() def to_json(self): return jsonpickle.encode(self) def send_message(self, token, message): params = {'chat_id': self.id, 'message': message} message_id = Vk.api('messages.send', token, params) @staticmethod def from_json(json_str): return jsonpickle.decode(json_str) @staticmethod def from_api(token, params): chat = Vk.api('messages.getChat', token, params) if chat == None: return Vk_chat() vk_chat = Vk_chat(**chat) vk_chat.persist() return vk_chat @staticmethod def fetch(token, chat_id): key = Vk_chat.DB_KEY(chat_id) if key in db.dict(): chat = Vk_chat.from_json(db.get(key)) if not chat.outdated(): return chat params = {'chat_id': chat_id, 'fields': 'first_name, last_name, photo_400_orig'} return Vk_chat.from_api(token, params)