class Items(VElement): elementName = 'items' items = fields.ElementNode(Item, listed=True, required=False) node = fields.StringAttr('node') max_items = fields.StringAttr('max_items', required=False) retracts = fields.ElementNode(Retract, listed=True, required=False)
class VCardQuery(Query): """ Extends Query class from twilix.stanzas. Contains fields with nodes for personal info. """ elementName = 'vCard' elementUri = 'vcard-temp' full_name = fields.StringNode('FN', required=False) name_ = fields.ElementNode('N', Name, required=False, listed=False) nickname = fields.StringNode('NICKNAME', required=False) url = fields.StringNode('URL', required=False) birthday = fields.StringNode('BDAY', required=False) organization = fields.ElementNode('ORG', Organization, required=False, listed=False) title = fields.StringNode('TITLE', required=False) role = fields.StringNode('ROLE', required=False) # telephones TODO # addresses TODO # emails TODO jid = fields.StringNode('JABBERID', required=False) description = fields.StringNode('DESC', required=False) photo = fields.ElementNode('PHOTO', Photo, required=False, listed=False)
class XHtmlIm(VElement): """ Extends VElement class from twilix.base Realize element according xhtml-im protocol. """ elementName = 'html' elementUri = 'http://jabber.org/protocol/xhtml-im' body = fields.ElementNode(HtmlBody) head = fields.ElementNode(HtmlHead, required=False)
class DiscoInfoQuery(Query): """ Extends Query class. Contains information about features and identities. """ elementUri = 'http://jabber.org/protocol/disco#info' identities = fields.ElementNode(Identity, required=False, listed=True, unique=True) features = fields.ElementNode(Feature, required=False, listed=True, unique=True) node = fields.StringAttr('node', required=False)
class Subscriptions(VElement): elementName = 'subscriptions' node = fields.StringAttr('node', required=False) subscriptions = fields.ElementNode(Subscription, listed=True, required=False)
class Message(Stanza): """ Stanza-inheritor class that implements a message transfer with other entities. Contains fields corresponding to the protocol. Attributes: body -- string node 'body' subject -- string node 'subject' thread -- string attribue 'thread' html -- element node with XHtmlIm element """ elementName = 'message' body = fields.StringNode('body', required=False) #? subject = fields.StringNode('subject', required=False) thread = fields.StringNode('thread', required=False) html = fields.ElementNode(XHtmlIm, required=False) def clean_type_(self, value): """ Filters stanzas by type. Sets some correct type for invalid stanzas. """ if not value in ('normal', 'chat', 'groupchat', 'headline', 'error'): return 'normal' return value
class FileRequest(File): name_ = fields.StringAttr('name') size = fields.IntegerAttr('size') hash_ = fields.StringAttr('hash', required=False) date = fields.DateTimeAttr('date', required=False) description = fields.StringNode('desc', required=False) range_ = fields.ElementNode(Range, required=False)
class ErrorStanza(Stanza): """ Stanza-inheritor class for any errors. Contains fields corresponding to the protocol. Attributes: error -- element node with Error element. """ error = fields.ElementNode(Error)
class UserItem(VElement): """ VElement-inheritor class container for user info class. Attributes : item -- UserItemInfo-type user's info class """ elementName = 'x' elementUri = 'http://jabber.org/protocol/muc#user' item = fields.ElementNode(UserItemInfo, required=False)
class PubsubQuery(Query): elementName = 'pubsub' elementUri = 'http://jabber.org/protocol/pubsub' create_node = fields.ElementNode(CreateNodeElement, required=False) publish = fields.ElementNode(PublishElement, required=False) subscribe = fields.ElementNode(SubscribeElement, required=False) unsubscribe = fields.ElementNode(UnsubscribeElement, required=False) items = fields.ElementNode(Items, required=False) subscriptions = fields.ElementNode(Subscriptions, required=False) retract = fields.ElementNode(Retract, required=False)
class Field(VElement): elementName = 'field' fieldType = None # To be redefined in derived classes type_ = fields.StringAttr('type') label = fields.StringAttr('label', required=False) var = fields.StringAttr('var') required = fields.FlagNode('required', default=False, required=False) values = fields.StringNode('value', listed=True, required=False) options = fields.ElementNode(Option, listed=True, required=False) def __init__(self, value=None, *args, **kwargs): self.kwargs = kwargs super(Field, self).__init__(*args, **kwargs) self.type_ = self.fieldType self.value = value def prepare_to_submit(self): self.label = None self.options = () self.required = None def restore_for_validation(self, kwargs): self.options = kwargs.get('options') def clean_type_(self, value): if value == self.fieldType: return value raise WrongElement def fclean(self, values): if self.kwargs.get('required') and not values: raise ElementParseError, "Form field %s %s is required" % \ (self.var, self.type_) return values def _get_value(self): return self.values def _set_value(self, value): self.values = value def _del_value(self, value): self.values = () value = property(_get_value, _set_value, _del_value)
class FTSIRequest(SIRequest): file_ = fields.ElementNode(FileRequest) @defer.inlineCallbacks def setHandler(self): reply, deferred, meta = self.make_reply(self.host.si) buf = yield self.host.cb(self, deferred) if buf is None: # TODO: application specific error raise errors.ForbiddenException meta.update({ 'buf': buf, 'size': self.file_.size, 'bytes_read': 0, 'deferred': deferred, }) defer.returnValue(reply)
class DiscoItemsQuery(Query): """ Extends Query class. Attibutes: items -- element node with DiscoItem node -- string attribute 'node' """ elementUri = 'http://jabber.org/protocol/disco#items' items = fields.ElementNode(DiscoItem, required=False, listed=True, unique=True) node = fields.StringAttr('node', required=False)
class AdminQuery(Query): """ Query-inheritor class for administrator's queries. These queries used for change role or affiliation of chat users. Attributes : item -- not required UserItemInfo-type element node. Methods : makeAdminQuery -- method sends query stanza and returns result stanza. """ elementUri = 'http://jabber.org/protocol/muc#admin' item = fields.ElementNode(UserItemInfo, required=False)
class UserPresence(Presence): """ Presence-inheritor class for multi user chat occupant's info. Also handles user online/offline presences. Attributes : user -- UserItem-type node for information about user. Methods : anyHandler -- handles all of this type presences. """ user = fields.ElementNode(UserItem, required=False) def anyHandler(self): """ Changes list of info about users in chat. There is addition in roster for 'available'-type presences and deletion from roster for 'unavailable'-type. Also sends 'user_available'/'user_unavailbale' signals for dispatcher (from pydispatch module). """ if self.user is None: return room_jid = self.from_.bare() if room_jid not in self.host.roster: return self.host.roster[room_jid] = filter(lambda el: el.from_.resource != self.from_.resource, self.host.roster[room_jid]) if self.type_ == 'unavailable': dispatcher.send(self.host.user_unavailable, user=self) else: self.host.roster[room_jid].append(self) dispatcher.send(self.host.user_available, user=self)
class RosterQuery(Query): """ Class for xml roster queries. Inheritor of Query. Class attributes: items -- list of RosterItem instances (i.e. list of contacts) """ elementUri = 'jabber:iq:roster' items = fields.ElementNode(RosterItem, listed=True, unique=True, required=False) def __init__(self, **kwargs): super(RosterQuery, self).__init__(**kwargs) def setHandler(self): """ Update roster when server pushes some changes. """ self.iq.from_ = None self.host.updateRoster(self) return self.iq.makeResult() def getHandler(self): """ Method for handle get-type roster queries. Not acceptable. Raise error stanza. :raises: NotAcceptableException """ self.iq.from_ = None raise errors.NotAcceptableException()
class Retract(VElement): elementName = 'retract' node = fields.StringAttr('node') items = fields.ElementNode(Item, listed=True)
class StreamHostUsedQuery(Socks5QueryWithSid): streamhost_used = fields.ElementNode(StreamHostUsed)
class SIElement(Query): elementName = 'si' elementUri = 'http://jabber.org/protocol/si' feature = fields.ElementNode(Feature)
class PublishElement(VElement): elementName = 'publish' node = fields.StringAttr('node') item = fields.ElementNode(Item)
class IncomingEvent(Message): event = fields.ElementNode(Event, required=False)
class Event(VElement): elementName = 'event' elementUri = 'http://jabber.org/protocol/pubsub#event' items = fields.ElementNode(Items, required=False)
class PubsubOwnerQuery(PubsubQuery): elementUri = 'http://jabber.org/protocol/pubsub#owner' delete_node = fields.ElementNode(DeleteNodeElement, required=False) configure_node = fields.ElementNode(ConfigureNode, required=False)
class StreamHostQuery(Socks5QueryWithSid): result_class = StreamHostUsedQuery streamhosts = fields.ElementNode(StreamHost, listed=True)
class GotStreamHost(Socks5Query): streamhost = fields.ElementNode(StreamHost)
class Feature(VElement): elementName = 'feature' elementUri = 'http://jabber.org/protocol/feature-neg' methods = fields.ElementNode(FeatureForm)