diff --git a/modules/playme/browser.py b/modules/playme/browser.py index 7add15f6..471b2abf 100644 --- a/modules/playme/browser.py +++ b/modules/playme/browser.py @@ -21,6 +21,7 @@ import re from weboob.browser import DomainBrowser +from weboob.browser.exceptions import ClientError from weboob.browser.pages import HTMLPage from weboob.browser.profiles import Profile from weboob.exceptions import BrowserIncorrectPassword @@ -30,6 +31,9 @@ from weboob.tools.json import json __all__ = ['PlayMeBrowser', 'FacebookBrowser'] +class NoCredits(Exception): pass + + class FacebookBrowser(DomainBrowser): BASEURL = 'https://graph.facebook.com' @@ -89,7 +93,7 @@ class PlayMeBrowser(DomainBrowser): self.my_name = me['name'] def get_threads(self): - return self.request('/users/%s/contacts' % self.my_id) + return reversed(self.request('/users/%s/contacts' % self.my_id)) def get_thread_messages(self, contact_id): return self.request('/messages/%s' % contact_id) @@ -106,3 +110,30 @@ class PlayMeBrowser(DomainBrowser): r = self.location(*args, **kwargs) return json.loads(r.content) + + def find_users(self, lat, lon): + r = self.request('/users/?lat=%s&lon=%s&type=full' % (lat, lon)) + return r['pending'] + r['history'] + + def get_theme(self): + r = self.request('/questions') + for t in r: + if t['theme']['is_vip']: + continue + return t + + def challenge(self, user_id): + try: + r = self.request('/users/%s/challenge/%s' % (self.my_id, user_id)) + except ClientError as e: + r = json.loads(e.response.content) + raise NoCredits(r['credits']['next_restore_in_seconds']) + + t = self.get_theme() + + data = {} + data['theme'] = {'id': t['theme']['id'], 'is_vip': 0} + data['questions'] = [q['id'] for q in t['questions']] + data['answers'] = [{'duration': 1000, 'result': 1} for q in t['questions']] + + self.request('/users/%s/challenge/%s' % (self.my_id, user_id), data=data) diff --git a/modules/playme/module.py b/modules/playme/module.py index 08644e05..d999ede1 100644 --- a/modules/playme/module.py +++ b/modules/playme/module.py @@ -21,17 +21,66 @@ import datetime from weboob.capabilities.messages import CapMessages, CapMessagesPost, Thread, Message -from weboob.capabilities.dating import CapDating +from weboob.capabilities.dating import CapDating, Optimization from weboob.tools.backend import Module, BackendConfig from weboob.tools.value import Value, ValueBackendPassword from weboob.tools.date import local2utc +from weboob.tools.log import getLogger -from .browser import PlayMeBrowser, FacebookBrowser +from .browser import PlayMeBrowser, FacebookBrowser, NoCredits __all__ = ['PlayMeModule'] +class ProfilesWalker(Optimization): + def __init__(self, sched, storage, browser): + self._sched = sched + self._storage = storage + self._browser = browser + self._logger = getLogger('walker', browser.logger) + + self._view_cron = None + + def start(self): + self._view_cron = self._sched.schedule(1, self.view_profile) + return True + + def stop(self): + self._sched.cancel(self._view_cron) + self._view_cron = None + return True + + def set_config(self, params): + pass + + def is_running(self): + return self._view_cron is not None + + def view_profile(self): + delay = 900 + try: + challenged = self._storage.get('challenged', default=[]) + for user in self._browser.find_users(48.883989, 2.367168): + if user['id'] in challenged: + continue + + try: + self._browser.challenge(user['id']) + except NoCredits as e: + delay = int(str(e)) + self._logger.info('No more credits (next try in %d minutes)' % (delay/60)) + else: + self._logger.info('Challenged %s' % user['name']) + challenged.append(user['id']) + self._storage.set('challenged', challenged) + self._storage.save() + break + finally: + if self._view_cron is not None: + self._view_cron = self._sched.schedule(delay, self.view_profile) + + class PlayMeModule(Module, CapMessages, CapMessagesPost, CapDating): NAME = 'playme' DESCRIPTION = u'PlayMe dating mobile application' @@ -44,6 +93,7 @@ class PlayMeModule(Module, CapMessages, CapMessagesPost, CapDating): BROWSER = PlayMeBrowser STORAGE = {'contacts': {}, + 'challenged': [], } def create_default_browser(self): @@ -52,6 +102,11 @@ class PlayMeModule(Module, CapMessages, CapMessagesPost, CapDating): self.config['password'].get()) return PlayMeBrowser(facebook) + # ---- CapDating methods ----------------------- + + def init_optimizations(self): + self.add_optimization('PROFILE_WALKER', ProfilesWalker(self.weboob.scheduler, self.storage, self.browser)) + # ---- CapMessages methods --------------------- def fill_thread(self, thread, fields):