Source code for slixmpp.plugins.xep_0054.stanza

import base64
import datetime as dt

from slixmpp.util import bytes
from slixmpp.xmlstream import ElementBase, ET, register_stanza_plugin, JID
from slixmpp.plugins import xep_0082


[docs] class VCardTemp(ElementBase): name = 'vCard' namespace = 'vcard-temp' plugin_attrib = 'vcard_temp' interfaces = {'FN', 'VERSION'} sub_interfaces = {'FN', 'VERSION'}
[docs] class Name(ElementBase): name = 'N' namespace = 'vcard-temp' plugin_attrib = name interfaces = {'FAMILY', 'GIVEN', 'MIDDLE', 'PREFIX', 'SUFFIX'} sub_interfaces = interfaces def _set_component(self, name, value): if isinstance(value, list): value = ','.join(value) if value is not None: self._set_sub_text(name, value, keep=True) else: self._del_sub(name) def _get_component(self, name): value = self._get_sub_text(name, '') if ',' in value: value = [v.strip() for v in value.split(',')] return value
[docs] def set_family(self, value): self._set_component('FAMILY', value)
[docs] def get_family(self): return self._get_component('FAMILY')
[docs] def set_given(self, value): self._set_component('GIVEN', value)
[docs] def get_given(self): return self._get_component('GIVEN')
[docs] def set_middle(self, value): print(value) self._set_component('MIDDLE', value)
[docs] def get_middle(self): return self._get_component('MIDDLE')
[docs] def set_prefix(self, value): self._set_component('PREFIX', value)
[docs] def get_prefix(self): return self._get_component('PREFIX')
[docs] def set_suffix(self, value): self._set_component('SUFFIX', value)
[docs] def get_suffix(self): return self._get_component('SUFFIX')
[docs] class Nickname(ElementBase): name = 'NICKNAME' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'nicknames' interfaces = {name} is_extension = True
[docs] def set_nickname(self, value): if not value: self.xml.text = '' return if not isinstance(value, list): value = [value] self.xml.text = ','.join(value)
[docs] def get_nickname(self): if self.xml.text: return self.xml.text.split(',')
[docs] class Email(ElementBase): name = 'EMAIL' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'emails' interfaces = {'HOME', 'WORK', 'INTERNET', 'PREF', 'X400', 'USERID'} sub_interfaces = {'USERID'} bool_interfaces = {'HOME', 'WORK', 'INTERNET', 'PREF', 'X400'}
[docs] class Address(ElementBase): name = 'ADR' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'addresses' interfaces = {'HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INTL', 'PREF', 'POBOX', 'EXTADD', 'STREET', 'LOCALITY', 'REGION', 'PCODE', 'CTRY'} sub_interfaces = {'POBOX', 'EXTADD', 'STREET', 'LOCALITY', 'REGION', 'PCODE', 'CTRY'} bool_interfaces = {'HOME', 'WORK', 'DOM', 'INTL', 'PREF'}
[docs] class Telephone(ElementBase): name = 'TEL' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'telephone_numbers' interfaces = {'HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', 'MSG', 'CELL', 'VIDEO', 'BBS', 'MODEM', 'ISDN', 'PCS', 'PREF', 'NUMBER'} sub_interfaces = {'NUMBER'} bool_interfaces = {'HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', 'MSG', 'CELL', 'VIDEO', 'BBS', 'MODEM', 'ISDN', 'PCS', 'PREF'}
[docs] def setup(self, xml=None): super().setup(xml=xml)
## this blanks out numbers received from server ##self._set_sub_text('NUMBER', '', keep=True)
[docs] def set_number(self, value): self._set_sub_text('NUMBER', value, keep=True)
[docs] def del_number(self): self._set_sub_text('NUMBER', '', keep=True)
[docs] class Label(ElementBase): name = 'LABEL' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'labels' interfaces = {'HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INT', 'PREF', 'lines'} bool_interfaces = {'HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INT', 'PREF'}
[docs] def add_line(self, value): line = ET.Element('{%s}LINE' % self.namespace) line.text = value self.xml.append(line)
[docs] def get_lines(self): lines = self.xml.find('{%s}LINE' % self.namespace) if lines is None: return [] return [line.text for line in lines]
[docs] def set_lines(self, values): self.del_lines() for line in values: self.add_line(line)
[docs] def del_lines(self): lines = self.xml.find('{%s}LINE' % self.namespace) if lines is None: return for line in lines: self.xml.remove(line)
[docs] class Geo(ElementBase): name = 'GEO' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'geolocations' interfaces = {'LAT', 'LON'} sub_interfaces = interfaces
[docs] class Org(ElementBase): name = 'ORG' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'organizations' interfaces = {'ORGNAME', 'ORGUNIT', 'orgunits'} sub_interfaces = {'ORGNAME', 'ORGUNIT'}
[docs] def add_orgunit(self, value): orgunit = ET.Element('{%s}ORGUNIT' % self.namespace) orgunit.text = value self.xml.append(orgunit)
[docs] def get_orgunits(self): orgunits = self.xml.find('{%s}ORGUNIT' % self.namespace) if orgunits is None: return [] return [orgunit.text for orgunit in orgunits]
[docs] def set_orgunits(self, values): self.del_orgunits() for orgunit in values: self.add_orgunit(orgunit)
[docs] def del_orgunits(self): orgunits = self.xml.find('{%s}ORGUNIT' % self.namespace) if orgunits is None: return for orgunit in orgunits: self.xml.remove(orgunit)
[docs] class Photo(ElementBase): name = 'PHOTO' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'photos' interfaces = {'TYPE', 'EXTVAL'} sub_interfaces = interfaces
[docs] class Sound(ElementBase): name = 'SOUND' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'sounds' interfaces = {'PHONETC', 'EXTVAL'} sub_interfaces = interfaces
[docs] class BinVal(ElementBase): name = 'BINVAL' namespace = 'vcard-temp' plugin_attrib = name interfaces = {'BINVAL'} is_extension = True
[docs] def setup(self, xml=None): self.xml = ET.Element('') return True
[docs] def set_binval(self, value): self.del_binval() parent = self.parent() if value: xml = ET.Element('{%s}BINVAL' % self.namespace) xml.text = bytes(base64.b64encode(value)).decode('utf-8') parent.append(xml)
[docs] def get_binval(self): parent = self.parent() xml = parent.xml.find('{%s}BINVAL' % self.namespace) if xml is not None: return base64.b64decode(bytes(xml.text)) return b''
[docs] def del_binval(self): self.parent()._del_sub('{%s}BINVAL' % self.namespace)
[docs] class Classification(ElementBase): name = 'CLASS' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'classifications' interfaces = {'PUBLIC', 'PRIVATE', 'CONFIDENTIAL'} bool_interfaces = interfaces
[docs] class Categories(ElementBase): name = 'CATEGORIES' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'categories' interfaces = {name} is_extension = True
[docs] def set_categories(self, values): self.del_categories() for keyword in values: item = ET.Element('{%s}KEYWORD' % self.namespace) item.text = keyword self.xml.append(item)
[docs] def get_categories(self): items = self.xml.findall('{%s}KEYWORD' % self.namespace) if items is None: return [] keywords = [] for item in items: keywords.append(item.text) return keywords
[docs] def del_categories(self): items = self.xml.findall('{%s}KEYWORD' % self.namespace) for item in items: self.xml.remove(item)
[docs] class Birthday(ElementBase): name = 'BDAY' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'birthdays' interfaces = {name} is_extension = True
[docs] def set_bday(self, value): if isinstance(value, dt.datetime): value = xep_0082.format_datetime(value) self.xml.text = value
[docs] def get_bday(self): if not self.xml.text: return None try: return xep_0082.parse(self.xml.text) except ValueError: return self.xml.text
[docs] class Rev(ElementBase): name = 'REV' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'revision_dates' interfaces = {name} is_extension = True
[docs] def set_rev(self, value): if isinstance(value, dt.datetime): value = xep_0082.format_datetime(value) self.xml.text = value
[docs] def get_rev(self): if not self.xml.text: return None try: return xep_0082.parse(self.xml.text) except ValueError: return self.xml.text
[docs] class Title(ElementBase): name = 'TITLE' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'titles' interfaces = {name} is_extension = True
[docs] def set_title(self, value): self.xml.text = value
[docs] def get_title(self): return self.xml.text
[docs] class Role(ElementBase): name = 'ROLE' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'roles' interfaces = {name} is_extension = True
[docs] def set_role(self, value): self.xml.text = value
[docs] def get_role(self): return self.xml.text
[docs] class Note(ElementBase): name = 'NOTE' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'notes' interfaces = {name} is_extension = True
[docs] def set_note(self, value): self.xml.text = value
[docs] def get_note(self): return self.xml.text
[docs] class Desc(ElementBase): name = 'DESC' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'descriptions' interfaces = {name} is_extension = True
[docs] def set_desc(self, value): self.xml.text = value
[docs] def get_desc(self): return self.xml.text
[docs] class URL(ElementBase): name = 'URL' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'urls' interfaces = {name} is_extension = True
[docs] def set_url(self, value): self.xml.text = value
[docs] def get_url(self): return self.xml.text
[docs] class UID(ElementBase): name = 'UID' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'uids' interfaces = {name} is_extension = True
[docs] def set_uid(self, value): self.xml.text = value
[docs] def get_uid(self): return self.xml.text
[docs] class ProdID(ElementBase): name = 'PRODID' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'product_ids' interfaces = {name} is_extension = True
[docs] def set_prodid(self, value): self.xml.text = value
[docs] def get_prodid(self): return self.xml.text
[docs] class Mailer(ElementBase): name = 'MAILER' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'mailers' interfaces = {name} is_extension = True
[docs] def set_mailer(self, value): self.xml.text = value
[docs] def get_mailer(self): return self.xml.text
[docs] class SortString(ElementBase): name = 'SORT-STRING' namespace = 'vcard-temp' plugin_attrib = 'SORT_STRING' plugin_multi_attrib = 'sort_strings' interfaces = {name} is_extension = True
[docs] def set_sort_string(self, value): self.xml.text = value
[docs] def get_sort_string(self): return self.xml.text
[docs] class Agent(ElementBase): name = 'AGENT' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'agents' interfaces = {'EXTVAL'} sub_interfaces = interfaces
[docs] class JabberID(ElementBase): name = 'JABBERID' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'jids' interfaces = {name} is_extension = True
[docs] def set_jabberid(self, value): self.xml.text = JID(value).bare
[docs] def get_jabberid(self): return JID(self.xml.text)
[docs] class TimeZone(ElementBase): name = 'TZ' namespace = 'vcard-temp' plugin_attrib = name plugin_multi_attrib = 'timezones' interfaces = {name} is_extension = True
[docs] def set_tz(self, value): time = xep_0082.time(offset=value) if time[-1] == 'Z': self.xml.text = 'Z' else: self.xml.text = time[-6:]
[docs] def get_tz(self): if not self.xml.text: return xep_0082.tzutc() try: time = xep_0082.parse('00:00:00%s' % self.xml.text) return time.tzinfo except ValueError: return self.xml.text
register_stanza_plugin(VCardTemp, Name) register_stanza_plugin(VCardTemp, Address, iterable=True) register_stanza_plugin(VCardTemp, Agent, iterable=True) register_stanza_plugin(VCardTemp, Birthday, iterable=True) register_stanza_plugin(VCardTemp, Categories, iterable=True) register_stanza_plugin(VCardTemp, Desc, iterable=True) register_stanza_plugin(VCardTemp, Email, iterable=True) register_stanza_plugin(VCardTemp, Geo, iterable=True) register_stanza_plugin(VCardTemp, JabberID, iterable=True) register_stanza_plugin(VCardTemp, Label, iterable=True) register_stanza_plugin(VCardTemp, Logo, iterable=True) register_stanza_plugin(VCardTemp, Mailer, iterable=True) register_stanza_plugin(VCardTemp, Note, iterable=True) register_stanza_plugin(VCardTemp, Nickname, iterable=True) register_stanza_plugin(VCardTemp, Org, iterable=True) register_stanza_plugin(VCardTemp, Photo, iterable=True) register_stanza_plugin(VCardTemp, ProdID, iterable=True) register_stanza_plugin(VCardTemp, Rev, iterable=True) register_stanza_plugin(VCardTemp, Role, iterable=True) register_stanza_plugin(VCardTemp, SortString, iterable=True) register_stanza_plugin(VCardTemp, Sound, iterable=True) register_stanza_plugin(VCardTemp, Telephone, iterable=True) register_stanza_plugin(VCardTemp, Title, iterable=True) register_stanza_plugin(VCardTemp, TimeZone, iterable=True) register_stanza_plugin(VCardTemp, UID, iterable=True) register_stanza_plugin(VCardTemp, URL, iterable=True) register_stanza_plugin(Photo, BinVal) register_stanza_plugin(Logo, BinVal) register_stanza_plugin(Sound, BinVal) register_stanza_plugin(Agent, VCardTemp)