def extend_ubx_payload(dialect: int, backend: Backend, user: User, ctc_sess: 'BackendSession') -> str: response = '' ctc_machineguid = ctc_sess.front_data.get('msn_machineguid') pop_id_ctc = ctc_sess.front_data.get('msn_pop_id') if dialect >= 13 and ctc_machineguid: response += '<MachineGuid>{}</MachineGuid>'.format(ctc_machineguid) if dialect >= 16: response += '{}<SignatureSound>{}</SignatureSound>{}'.format( ('<DDP>{}</DDP>'.format( encode_xml_he(ctc_sess.front_data.get('msn_msnobj_ddp'), dialect) or '') if dialect >= 18 else ''), encode_xml_he(ctc_sess.front_data.get('msn_sigsound'), dialect) or '', ('<Scene>{}</Scene><ColorScheme>{}</ColorScheme>'.format( encode_xml_he(ctc_sess.front_data.get('msn_msnobj_scene'), dialect) or '', ctc_sess.front_data.get('msn_colorscheme') or '') if dialect >= 18 else ''), ) if pop_id_ctc: response += EPDATA_PAYLOAD.format( mguid='{' + pop_id_ctc + '}', capabilities=encode_capabilities_capabilitiesex( ((ctc_sess.front_data.get('msn_capabilities') or 0) if ctc_sess.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC), ctc_sess.front_data.get('msn_capabilitiesex') or 0)) for ctc_sess_other in backend.util_get_sessions_by_user( ctc_sess.user): pop_id = ctc_sess_other.front_data.get('msn_pop_id') or '' if pop_id.lower() == pop_id_ctc.lower(): continue response += EPDATA_PAYLOAD.format( mguid='{' + pop_id + '}', capabilities=encode_capabilities_capabilitiesex( ((ctc_sess.front_data.get('msn_capabilities') or 0) if ctc_sess.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC), ctc_sess_other.front_data.get('msn_capabilitiesex') or 0)) if ctc_sess.user is user: for ctc_sess_other in backend.util_get_sessions_by_user( ctc_sess.user): if ctc_sess_other.front_data.get('msn_pop_id') is None: continue response += PRIVATEEPDATA_PAYLOAD.format( mguid='{' + (ctc_sess_other.front_data.get('msn_pop_id') or '') + '}', ped_data=_list_private_endpoint_data(ctc_sess_other)) return response
def build_presence_notif( trid: Optional[str], ctc_head: User, user_me: User, dialect: int, backend: Backend, iln_sent: bool, *, self_presence: bool = False, bs_other: Optional['BackendSession'] = None, groupchat: Optional['GroupChat'] = None) -> Iterable[Tuple[Any, ...]]: detail = user_me.detail assert detail is not None if not iln_sent: return nfy_rst = '' if not groupchat: if not self_presence and ctc_head is not user_me: ctc = detail.contacts.get(ctc_head.uuid) assert ctc is not None status = ctc.status head = ctc.head else: head = user_me status = head.status else: head = ctc_head status = head.status is_offlineish = status.is_offlineish() if is_offlineish and trid is not None: return ctc_sess = None # type: Optional['BackendSession'] ctc_sess = first_in_iterable(backend.util_get_sessions_by_user(head)) #if dialect == 21: # cm = None # type: Optional[str] # pop_id_ctc = None # type: Optional[str] # # substatus = status.substatus # # if is_offlineish and head is not user_me: # # In case `ctc` is going `HDN`; make sure other people don't receive `HDN` as status # substatus = Substatus.Offline # # if not substatus is Substatus.Offline: # assert ctc_sess is not None # # cm = NFY_PUT_PRESENCE_USER_S_CM.format(cm = encode_xml_he(status.media or '', dialect)) # nfy_rst += NFY_PUT_PRESENCE_USER_S_PE.format( # msnobj = encode_xml_he(ctc_sess.front_data.get('msn_msnobj') or '', dialect), # name = status.name or head.email, message = status.message, # ddp = encode_xml_he(ctc_sess.front_data.get('msn_msnobj_ddp') or '', dialect), colorscheme = encode_xml_he(ctc_sess.front_data.get('msn_colorscheme') or '', dialect), scene = encode_xml_he(ctc_sess.front_data.get('msn_msnobj_scene') or '', dialect), sigsound = encode_xml_he(ctc_sess.front_data.get('msn_sigsound') or '', dialect), # ) # if ctc_sess.front_data.get('msn_pop_id') is not None: # pop_id_ctc = '{' + ctc_sess.front_data['msn_pop_id'] + '}' # nfy_rst += NFY_PUT_PRESENCE_USER_SEP_IM.format( # epid_attrib = (NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = pop_id_ctc or '') if pop_id_ctc is not None else ''), capabilities = encode_capabilities_capabilitiesex(((ctc_sess.front_data.get('msn_capabilities') or 0) if ctc_sess.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC), ctc_sess.front_data.get('msn_capabilitiesex') or 0), # ) # if ctc_sess.front_data.get('msn_PE'): # pe_data = '' # pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_VER.format(ver = ctc_sess.front_data.get('msn_PE_VER') or '') # pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_TYP.format(typ = ctc_sess.front_data.get('msn_PE_TYP') or '') # pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_CAP.format(pe_capabilities = encode_capabilities_capabilitiesex(ctc_sess.front_data.get('msn_PE_capabilities') or 0, ctc_sess.front_data.get('msn_PE_capabilitiesex') or 0)) # nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PE.format( # epid_attrib = (NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = pop_id_ctc or '') if pop_id_ctc is not None else ''), pe_data = pe_data, # ) # if pop_id_ctc is not None: # nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PD.format( # mguid = pop_id_ctc, ped_data = _list_private_endpoint_data(ctc_sess), # ) # # for ctc_sess_other in backend.util_get_sessions_by_user(ctc_sess.user): # if ctc_sess_other is ctc_sess: continue # if ctc_sess_other.front_data.get('msn_pop_id') is None: continue # # nfy_rst += NFY_PUT_PRESENCE_USER_SEP_IM.format( # epid_attrib = NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = '{' + ctc_sess_other.front_data['msn_pop_id'] + '}'), capabilities = encode_capabilities_capabilitiesex(((ctc_sess_other.front_data.get('msn_capabilities') or 0) if ctc_sess_other.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC), ctc_sess_other.front_data.get('msn_capabilitiesex') or 0), # ) # if ctc_sess_other.front_data.get('msn_PE'): # pe_data = '' # pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_VER.format(ver = ctc_sess_other.front_data.get('msn_PE_VER') or '') # pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_TYP.format(typ = ctc_sess_other.front_data.get('msn_PE_TYP') or '') # pe_data += NFY_PUT_PRESENCE_USER_SEP_PE_CAP.format(capabilities = encode_capabilities_capabilitiesex(ctc_sess_other.front_data.get('msn_PE_capabilities') or 0, ctc_sess_other.front_data.get('msn_PE_capabilitiesex') or 0)) # nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PE.format( # epid_attrib = NFY_PUT_PRESENCE_USER_SEP_EPID.format(mguid = '{' + ctc_sess_other.front_data['msn_pop_id'] + '}'), pe_data = pe_data, # ) # nfy_rst += NFY_PUT_PRESENCE_USER_SEP_PD.format( # mguid = '{' + ctc_sess_other.front_data['msn_pop_id'] + '}', ped_data = _list_private_endpoint_data(ctc_sess_other) # ) # # msn_status = MSNStatus.FromSubstatus(substatus) # # nfy_presence_body = NFY_PUT_PRESENCE_USER.format( # substatus = msn_status.name, cm = cm or '', rst = nfy_rst, # ) # # nfy_payload = encode_payload(NFY_PUT_PRESENCE, # to = user_me.email, from_email = head.email, cl = len(nfy_presence_body), payload = nfy_presence_body, # ) # # yield ('NFY', 'PUT', nfy_payload) # return if is_offlineish and not head is user_me: if dialect >= 18: reply = ('FLN', encode_email_networkid(head.email, None, groupchat=groupchat) ) # type: Tuple[Any, ...] else: reply = ('FLN', head.email) if 13 <= dialect <= 17: # Mypy incorrectly gives a type error here. Must be a bug. reply += (int(NetworkID.WINDOWS_LIVE), ) # type: ignore if 13 <= dialect <= 15: reply += ('0', ) elif dialect >= 16: reply += ('0:0', ) yield reply return assert ctc_sess is not None msn_status = MSNStatus.FromSubstatus(status.substatus) if trid and dialect < 18: frst = ('ILN', trid) # type: Tuple[Any, ...] else: frst = ('NLN', ) rst = [] if 8 <= dialect <= 15: rst.append(((ctc_sess.front_data.get('msn_capabilities') or 0) if ctc_sess.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC)) elif dialect >= 16: rst.append( ('0:0' if groupchat is not None and head.uuid == user_me.uuid else encode_capabilities_capabilitiesex( ((ctc_sess.front_data.get('msn_capabilities') or 0) if ctc_sess.front_data.get('msn') is True else MAX_CAPABILITIES_BASIC), ctc_sess.front_data.get('msn_capabilitiesex') or 0))) if dialect >= 9: rst.append( encode_msnobj( ctc_sess.front_data.get('msn_msnobj') or '<msnobj/>')) if dialect >= 18: yield (*frst, msn_status.name, encode_email_networkid(head.email, None, groupchat=groupchat), status.name, *rst) else: yield (*frst, msn_status.name, head.email, (int(NetworkID.WINDOWS_LIVE) if 14 <= dialect <= 17 else None), status.name, *rst) if dialect < 11: return if dialect >= 18 and (groupchat is not None and head.uuid == user_me.uuid): return ubx_payload = '<Data><PSM>{}</PSM><CurrentMedia>{}</CurrentMedia>{}</Data>'.format( (encode_xml_he(status.message, dialect) if dialect >= 13 else encode_xml_ne(status.message)) or '', (encode_xml_he(status.media, dialect) if dialect >= 13 else encode_xml_ne(status.media)) or '', extend_ubx_payload(dialect, backend, user_me, ctc_sess)).encode('utf-8') if dialect >= 18: yield ('UBX', encode_email_networkid(head.email, None, groupchat=groupchat), ubx_payload) else: yield ('UBX', head.email, (int(NetworkID.WINDOWS_LIVE) if 14 <= dialect <= 17 else None), ubx_payload)