superduper.gateway
#
The gateway
Module Contents#
Classes#
This is instantiated once by the slidge entrypoint. |
- class superduper.gateway.Gateway#
This is instantiated once by the slidge entrypoint.
By customizing the class attributes, we customize the registration process, and display name of the component.
- ROSTER_GROUP: str = 'slidge'#
Roster entries added by the plugin in the user’s roster will be part of the group specified here.
- SEARCH_FIELDS: Sequence[slidge.command.base.FormField]#
Fields used for searching items via the component, through XEP-0055 (jabber search). A common use case is to allow users to search for legacy contacts by something else than their usernames, eg their phone number.
Plugins should implement search by overriding
BaseSession.search()
, effectively restricting search to registered users by default.If there is only one field, it can also be used via the
jabber:iq:gateway
protocol described in XEP-0100. Limitation: this only works if the search request returns one result item, and if this item has a ‘jid’ var.
- WELCOME_MESSAGE = "Thank you for registering. Type 'help' to list the available commands, or just start messaging away!"#
A welcome message displayed to users on registration. This is useful notably for clients that don’t consider component JIDs as a valid recipient in their UI, yet still open a functional chat window on incoming messages from components.
- PROPER_RECEIPTS = False#
Set this to True if the legacy service provides a real equivalent of message delivery receipts (XEP-0184), meaning that there is an event thrown when the actual device of a contact receives a message. Make sure to call Contact.received() adequately if this is set to True.
- async validate(user_jid, registration_form)#
This function receives the values of the form defined in
REGISTRATION_FIELDS
. Here, since we setREGISTRATION_TYPE
to “2FA”, if this method does not raise any exception, the wannabe user will be prompted for their 2FA code.
- async validate_two_factor_code(user, code)#
This function receives the 2FA code entered by the aspiring user.
It should raise something if the 2FA does not permit logging in to the legacy service.
- Parameters:
user (slidge.GatewayUser) –
code (str) –
- async unregister(user)#
Optionally override this if you need to clean additional stuff after a user has been removed from the permanent user_store.
By default, this just calls session.logout()
- Parameters:
user (slidge.util.db.GatewayUser) –
- async input(jid, text=None, mtype='chat', **msg_kwargs)#
Request arbitrary user input using a simple chat message, and await the result.
You shouldn’t need to call directly bust instead use
BaseSession.input()
to directly target a user.- Parameters:
jid (slixmpp.JID) – The JID we want input from
text – A prompt to display for the user
mtype (slixmpp.types.MessageTypes) – Message type
- Returns:
The user’s reply
- Return type:
- async send_qr(text, **msg_kwargs)#
Sends a QR Code to a JID
You shouldn’t need to call directly bust instead use
BaseSession.send_qr()
to directly target a user.- Parameters:
text (str) – The text that will be converted to a QR Code
msg_kwargs – Optional additional arguments to pass to
BaseGateway.send_file()
, such as the recipient of the QR code.
- abstract async get_qr_text(user)#
This is where slidge gets the QR code content for the QR-based registration process. It will turn it into a QR code image and send it to the not-yet-fully-registered .GatewayUser
Only used in when
BaseGateway.REGISTRATION_TYPE
isRegistrationType.QR_CODE
.- Parameters:
user (slidge.util.db.GatewayUser) – The not-yet-fully-registered GatewayUser. Use its
GatewayUser.bare_jid
and/orGatewayUser.registration_form
attributes to get follow up on the process.- Return type:
- async confirm_qr(user_bare_jid, exception=None)#
This should be called to finalize QR code-based registration flows.
- invite_to(muc, reason=None, password=None, **send_kwargs)#
Send an invitation to join a group (XEP-0249) to the user, emanating from this contact
- Parameters:
muc (slidge.group.LegacyMUC) – the muc the user is invited to
reason (Optional[str]) – a text explaining why the user should join this muc
password (Optional[str]) – maybe this will make sense later? not sure
send_kwargs – additional kwargs to be passed to _send() (internal use by slidge)
- composing(**kwargs)#
Send a “composing” (ie “typing notification”) chat state (XEP-0085) from this contact to the user.
- paused(**kwargs)#
Send a “paused” (ie “typing paused notification”) chat state (XEP-0085) from this contact to the user.
- inactive(**kwargs)#
Send an “inactive” (ie “contact has not interacted with the chat session interface for an intermediate period of time”) chat state (XEP-0085) from this contact to the user.
- gone(**kwargs)#
Send a “gone” (ie “contact has not interacted with the chat session interface, system, or device for a relatively long period of time”) chat state (XEP-0085) from this contact to the user.
- ack(legacy_msg_id, **kwargs)#
Send an “acknowledged” message marker (XEP-0333) from this contact to the user.
- Parameters:
legacy_msg_id (slidge.util.types.LegacyMessageType) – The message this marker refers to
- received(legacy_msg_id, **kwargs)#
Send a “received” message marker (XEP-0333) from this contact to the user. For LegacyContacts, also send a delivery receipt marker (XEP-0184)
- Parameters:
legacy_msg_id (slidge.util.types.LegacyMessageType) – The message this marker refers to
- displayed(legacy_msg_id, **kwargs)#
Send a “displayed” message marker (XEP-0333) from this contact to the user.
- Parameters:
legacy_msg_id (slidge.util.types.LegacyMessageType) – The message this marker refers to
- send_text(body, legacy_msg_id=None, *, when=None, reply_to=None, thread=None, hints=None, carbon=False, archive_only=False, correction=False, correction_event_id=None, **send_kwargs)#
Transmit a message from the entity to the user
- Parameters:
body (str) – Content of the message
legacy_msg_id (Optional[slidge.util.types.LegacyMessageType]) – If you want to be able to transport read markers from the gateway user to the legacy network, specify this
when (Optional[datetime.datetime]) – when the message was sent, for a “delay” tag (XEP-0203)
reply_to (Optional[slidge.util.types.MessageReference]) – Quote another message (XEP-0461)
hints (Optional[Iterable[slidge.util.types.ProcessingHint]]) –
thread (Optional[slidge.util.types.LegacyThreadType]) –
carbon – (only in 1:1) Reflect a message sent to this
Contact
by the user. Use this to synchronize outgoing history for legacy official apps.correction – whether this message is a correction or not
correction_event_id (Optional[slidge.util.types.LegacyMessageType]) – in the case where an ID is associated with the legacy ‘correction event’, specify it here to use it on the XMPP side. If not specified, a random ID will be used.
archive_only – (only in groups) Do not send this message to user, but store it in the archive. Meant to be used during
MUC.backfill()
- correct(legacy_msg_id, new_text, *, when=None, reply_to=None, thread=None, hints=None, carbon=False, archive_only=False, correction_event_id=None, **send_kwargs)#
Call this when a legacy contact has modified his last message content.
Uses last message correction (XEP-0308)
- Parameters:
new_text (str) – New content of the message
legacy_msg_id (slidge.util.types.LegacyMessageType) – The legacy message ID of the message to correct
when (Optional[datetime.datetime]) – when the message was sent, for a “delay” tag (XEP-0203)
reply_to (Optional[slidge.util.types.MessageReference]) – Quote another message (XEP-0461)
hints (Optional[Iterable[slidge.util.types.ProcessingHint]]) –
thread (Optional[slidge.util.types.LegacyThreadType]) –
carbon – (only in 1:1) Reflect a message sent to this
Contact
by the user. Use this to synchronize outgoing history for legacy official apps.archive_only – (only in groups) Do not send this message to user, but store it in the archive. Meant to be used during
MUC.backfill()
correction_event_id (Optional[slidge.util.types.LegacyMessageType]) – in the case where an ID is associated with the legacy ‘correction event’, specify it here to use it on the XMPP side. If not specified, a random ID will be used.
- react(legacy_msg_id, emojis=(), thread=None, **kwargs)#
Call this when a legacy contact reacts to a message
- Parameters:
legacy_msg_id (slidge.util.types.LegacyMessageType) – The message which the reaction refers to.
emojis (Iterable[str]) – An iterable of emojis used as reactions
thread (Optional[slidge.util.types.LegacyThreadType]) –
- retract(legacy_msg_id, thread=None, **kwargs)#
Call this when a legacy contact retracts (XEP-0424) a message
- Parameters:
legacy_msg_id (slidge.util.types.LegacyMessageType) – Legacy ID of the message to delete
thread (Optional[slidge.util.types.LegacyThreadType]) –
- async send_file(file_path=None, legacy_msg_id=None, *, data_stream=None, data=None, file_url=None, file_name=None, content_type=None, reply_to=None, when=None, caption=None, legacy_file_id=None, thread=None, **kwargs)#
Send a message with an attachment
- Parameters:
file_path (Optional[Union[pathlib.Path, str]]) – Path to the attachment
data_stream (Optional[IO[bytes]]) – Alternatively, a stream of bytes (such as a File object)
data (Optional[bytes]) – Alternatively, a bytes object
file_url (Optional[str]) – Alternatively, a URL
file_name (Optional[str]) – How the file should be named.
content_type (Optional[str]) – MIME type, inferred from filename if not given
legacy_msg_id (Optional[slidge.util.types.LegacyMessageType]) – If you want to be able to transport read markers from the gateway user to the legacy network, specify this
reply_to (Optional[slidge.util.types.MessageReference]) – Quote another message (XEP-0461)
when (Optional[datetime.datetime]) – when the file was sent, for a “delay” tag (XEP-0203)
caption (Optional[str]) – an optional text that is linked to the file
legacy_file_id (Optional[Union[str, int]]) – A unique identifier for the file on the legacy network. Plugins should try their best to provide it, to avoid duplicates.
thread (Optional[slidge.util.types.LegacyThreadType]) –
- Return type: