diff options
Diffstat (limited to 'sleekxmpp/plugins/xep_0054/stanza.py')
-rw-r--r-- | sleekxmpp/plugins/xep_0054/stanza.py | 512 |
1 files changed, 512 insertions, 0 deletions
diff --git a/sleekxmpp/plugins/xep_0054/stanza.py b/sleekxmpp/plugins/xep_0054/stanza.py new file mode 100644 index 00000000..38f8d43b --- /dev/null +++ b/sleekxmpp/plugins/xep_0054/stanza.py @@ -0,0 +1,512 @@ +import base64 +import datetime as dt + +from sleekxmpp.thirdparty.suelta.util import bytes + +from sleekxmpp.xmlstream import ElementBase, ET, register_stanza_plugin, JID +from sleekxmpp.plugins import xep_0082 + + +class VCardTemp(ElementBase): + name = 'vCard' + namespace = 'vcard-temp' + plugin_attrib = 'vcard_temp' + interfaces = set(['FN', 'VERSION']) + sub_interfaces = set(['FN', 'VERSION']) + + +class Name(ElementBase): + name = 'N' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['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 + + def set_family(self, value): + self._set_component('FAMILY', value) + + def get_family(self): + return self._get_component('FAMILY') + + def set_given(self, value): + self._set_component('GIVEN', value) + + def get_given(self): + return self._get_component('GIVEN') + + def set_middle(self, value): + print(value) + self._set_component('MIDDLE', value) + + def get_middle(self): + return self._get_component('MIDDLE') + + def set_prefix(self, value): + self._set_component('PREFIX', value) + + def get_prefix(self): + return self._get_component('PREFIX') + + def set_suffix(self, value): + self._set_component('SUFFIX', value) + + def get_suffix(self): + return self._get_component('SUFFIX') + + +class Email(ElementBase): + name = 'EMAIL' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['HOME', 'WORK', 'INTERNET', 'PREF', 'X400', 'USERID']) + sub_interfaces = set(['USERID']) + bool_interfaces = set(['HOME', 'WORK', 'INTERNET', 'PREF', 'X400']) + + +class Address(ElementBase): + name = 'ADR' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INTL', + 'PREF', 'POBOX', 'EXTADD', 'STREET', 'LOCALITY', + 'REGION', 'PCODE', 'CTRY']) + sub_interfaces = set(['POBOX', 'EXTADD', 'STREET', 'LOCALITY', + 'REGION', 'PCODE', 'CTRY']) + bool_interfaces = set(['HOME', 'WORK', 'DOM', 'INTL', 'PREF']) + + +class Telephone(ElementBase): + name = 'TEL' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', 'MSG', + 'CELL', 'VIDEO', 'BBS', 'MODEM', 'ISDN', 'PCS', + 'PREF', 'NUMBER']) + sub_interfaces = set(['NUMBER']) + bool_interfaces = set(['HOME', 'WORK', 'VOICE', 'FAX', 'PAGER', + 'MSG', 'CELL', 'VIDEO', 'BBS', 'MODEM', + 'ISDN', 'PCS', 'PREF']) + + def setup(self, xml=None): + super(Telephone, self).setup(xml=xml) + self._set_sub_text('NUMBER', '', keep=True) + + def set_number(self, value): + self._set_sub_text('NUMBER', value, keep=True) + + def del_number(self): + self._set_sub_text('NUMBER', '', keep=True) + + +class Label(ElementBase): + name = 'LABEL' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', 'INT', + 'PREF', 'lines']) + bool_interfaces = set(['HOME', 'WORK', 'POSTAL', 'PARCEL', 'DOM', + 'INT', 'PREF']) + + def add_line(self, value): + line = ET.Element('{%s}LINE' % self.namespace) + line.text = value + self.xml.append(line) + + def get_lines(self): + lines = self.xml.find('{%s}LINE' % self.namespace) + if lines is None: + return [] + return [line.text for line in lines] + + def set_lines(self, values): + self.del_lines() + for line in values: + self.add_line(line) + + 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) + + +class Geo(ElementBase): + name = 'GEO' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['LAT', 'LON']) + sub_interfaces = interfaces + + +class Org(ElementBase): + name = 'ORG' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['ORGNAME', 'ORGUNIT', 'orgunits']) + sub_interfaces = set(['ORGNAME', 'ORGUNIT']) + + def add_orgunit(self, value): + orgunit = ET.Element('{%s}ORGUNIT' % self.namespace) + orgunit.text = value + self.xml.append(orgunit) + + def get_orgunits(self): + orgunits = self.xml.find('{%s}ORGUNIT' % self.namespace) + if orgunits is None: + return [] + return [orgunit.text for orgunit in orgunits] + + def set_orgunits(self, values): + self.del_orgunits() + for orgunit in values: + self.add_orgunit(orgunit) + + 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) + + +class Photo(ElementBase): + name = 'PHOTO' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['TYPE', 'EXTVAL']) + sub_interfaces = interfaces + + +class Logo(ElementBase): + name = 'LOGO' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['TYPE', 'EXTVAL']) + sub_interfaces = interfaces + + +class Sound(ElementBase): + name = 'LOGO' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['PHONETC', 'EXTVAL']) + sub_interfaces = interfaces + + +class BinVal(ElementBase): + name = 'BINVAL' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['BINVAL']) + is_extension = True + + def setup(self, xml=None): + self.xml = ET.Element('') + return True + + 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) + + def get_binval(self): + parent = self.parent() + xml = parent.find('{%s}BINVAL' % self.namespace) + if xml is not None: + return base64.b64decode(bytes(xml.text)) + return b'' + + def del_binval(self): + self.parent()._del_sub('{%s}BINVAL' % self.namespace) + + +class Classification(ElementBase): + name = 'CLASS' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['PUBLIC', 'PRIVATE', 'CONFIDENTIAL']) + bool_interfaces = interfaces + + +class Categories(ElementBase): + name = 'CATEGORIES' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + 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) + + 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 + + def del_categories(self): + items = self.xml.findall('{%s}KEYWORD' % self.namespace) + for item in items: + self.xml.remove(item) + + +class Birthday(ElementBase): + name = 'BDAY' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_bday(self, value): + if isinstance(value, dt.datetime): + value = xep_0082.format_datetime(value) + self.xml.text = value + + def get_bday(self): + if not self.xml.text: + return None + return xep_0082.parse(self.xml.text) + + +class Rev(ElementBase): + name = 'REV' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_rev(self, value): + if isinstance(value, dt.datetime): + value = xep_0082.format_datetime(value) + self.xml.text = value + + def get_rev(self): + if not self.xml.text: + return None + return xep_0082.parse(self.xml.text) + + +class Title(ElementBase): + name = 'TITLE' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_title(self, value): + self.xml.text = value + + def get_title(self): + return self.xml.text + + +class Role(ElementBase): + name = 'ROLE' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_role(self, value): + self.xml.text = value + + def get_role(self): + return self.xml.text + + +class Note(ElementBase): + name = 'NOTE' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_note(self, value): + self.xml.text = value + + def get_note(self): + return self.xml.text + + +class Desc(ElementBase): + name = 'DESC' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_desc(self, value): + self.xml.text = value + + def get_desc(self): + return self.xml.text + + +class URL(ElementBase): + name = 'URL' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_url(self, value): + self.xml.text = value + + def get_url(self): + return self.xml.text + + +class UID(ElementBase): + name = 'UID' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_uid(self, value): + self.xml.text = value + + def get_uid(self): + return self.xml.text + + +class ProdID(ElementBase): + name = 'PRODID' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_prodid(self, value): + self.xml.text = value + + def get_prodid(self): + return self.xml.text + + +class Mailer(ElementBase): + name = 'MAILER' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_mailer(self, value): + self.xml.text = value + + def get_mailer(self): + return self.xml.text + + +class SortString(ElementBase): + name = 'SORT-STRING' + namespace = 'vcard-temp' + plugin_attrib = 'SORT_STRING' + interfaces = set([name]) + is_extension = True + + def set_sort_string(self, value): + self.xml.text = value + + def get_sort_string(self): + return self.xml.text + + +class Agent(ElementBase): + name = 'AGENT' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set(['EXTVAL']) + sub_interfaces = interfaces + + +class JabberID(ElementBase): + name = 'JABBERID' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + def set_jabberid(self, value): + self.xml.text = JID(value).bare + + def get_jabberid(self): + return JID(self.xml.text) + + +class TimeZone(ElementBase): + name = 'TZ' + namespace = 'vcard-temp' + plugin_attrib = name + interfaces = set([name]) + is_extension = True + + 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:] + + def get_tz(self): + if not self.xml.text: + return xep_0082.tzutc() + time = xep_0082.parse('00:00:00%s' % self.xml.text) + return time.tzinfo + + +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, 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) |