def wrapper(*args, **kwargs): has_error = kwargs.get('has_error') response = func(*args, **kwargs) r = response.json() logging.debug('response: %s', pp.pformat(r)) if 'error' not in r: return logging.warning('Facebook send api error: %s', pp.pformat(r)) user_status = args[0] user = user_status.user # 2018065: over 24hours # 2018108 ,1545041: User blocked or left and we can't send message. if r['error'].get('error_subcode') in (2018108, 1545041, 2018065): MatchingQueue.remove(user) if user.partner: pc = UserContext(user.partner) pc.send_btn( pc._("Stranger has disconnected."), [pc.new_chat(), pc.langb()], action.TALKING__ERROR_AND_DISCONNECTED) user.partner.partner = None user_status.delegate.on_match_ended(user_status, pc) # don't send message if this is called by error elif not has_error: user_status.send_message( user_status._('Sending failed. Try it again later.'), action.FB_ERROR_RETURNED, has_error=True)
def test_match_last_matched(mocker, monkeypatch): fix_matcher_rand(mocker) from chatty.domain.user_state import ( User, ) from chatty.domain.model.match import Language, MatchingQueue import requests mock_request(monkeypatch, requests) session = Session() english = (session.query(Language).get('en_US') or Language(id='en_US', name='English')) user = User('TEST-01') user.languages = [english] partner = User('TEST-02') partner.languages = [english] session.add(user) session.add(partner) session.commit() MatchingQueue.push(partner) assert MatchingQueue.match_partner(user) == partner MatchingQueue.remove(partner) user.partner = None user.last_matched = partner.id MatchingQueue.push(partner) assert MatchingQueue.match_partner(user) == None user.last_matched = "other" assert MatchingQueue.match_partner(user) == partner
def test_match_gender(mocker, monkeypatch): fix_matcher_rand(mocker) from chatty.domain.user_state import ( User, ) from chatty.domain.model.match import Language, MatchingQueue import requests mock_request(monkeypatch, requests) session = Session() english = (session.query(Language).get('en_US') or Language(id='en_US', name='English')) user = User('TEST-01') user.languages = [english] user.gender = "male" partner = User('TEST-02') partner.languages = [english] partner.gender = "female" partner.finding_genders = "male,female" user.finding_genders = "female" session.add(user) session.add(partner) session.commit() MatchingQueue.push(partner) assert MatchingQueue.match_partner(user) == partner MatchingQueue.remove(partner) user.partner = None MatchingQueue.push(partner) user.finding_genders = "male" assert MatchingQueue.match_partner(user) == None user.finding_genders = "male,female" assert MatchingQueue.match_partner(user) == partner user.partner = None MatchingQueue.remove(partner) MatchingQueue.push(partner) partner.finding_genders = "female" assert MatchingQueue.match_partner(user) == None user.gender = "undefined" assert MatchingQueue.match_partner(user) == None
def match_user(self, partner, message): logging.debug('match user %s and %s', self.user.id, partner.id) session = Session() try: pc = UserContext(partner) self.user.partner = partner partner.partner = self.user self.user.last_matched = partner.id partner.last_matched = self.user.id record = MatchingQueue.remove(partner) # パートナーと関連が可能かを確認するためにコミットする session.commit() self.delegate.on_found_partner(self, pc, record) title = "You're now chatting with someone new!\n" subtitle = "Choose 'Menu' from the menu '≡'" \ " in the corner or tap the button bellow" \ " to terminate your conversation." def send_matched(userc1, userc2, event): if userc1.user.version >= "2.0" and userc2.user.version >= "2.0": return userc1.send_action(fb.generic_template_itsb( userc1.user.id, userc1._(title), userc1._(subtitle), fb.profile_picture(userc2.user.fb_id), [b(userc1._("End Chat"), END_CONVERSATION), b(userc1._("Share Your Profile"), SHARE_PROFILE_PRE)]), event) else: return userc1.send_action( fb.generic_template_b( userc1.user.id, userc1._(title), userc1._(subtitle), [ b(userc1._("End Chat"), END_CONVERSATION), b(userc1._("Share Your Profile"), SHARE_PROFILE_PRE)]), event) send_matched(pc, self, action.IDLE__ACTION_SEARCH_FOUND_PASSIVE) # if partner block us, we handle error occured above and user.partner is deleted. if self.user.partner: send_matched(self, pc, action.IDLE__ACTION_SEARCH_FOUND) else: self.do_search(message) except IntegrityError as e: session.rollback() logging.exception(e) self.do_search(message)
def cancel_search(self, message): MatchingQueue.remove(self.user) self.send_btn( self._("Searching interrupted."), [self.langb(), self.new_chat()], action.SEARCHING__ACTION_CANCEL)