mirror of
https://mau.dev/maunium/synapse.git
synced 2024-12-15 16:53:51 +01:00
03caba6577
* Split up the documentation in several files rather than one huge one * Add examples for each callback category * Other niceties like fixing https://github.com/matrix-org/synapse/issues/10632 * Add titles to callbacks so they're easier to find in the navigation panels and link to
90 lines
3.2 KiB
Markdown
90 lines
3.2 KiB
Markdown
# Presence router callbacks
|
|
|
|
Presence router callbacks allow module developers to specify additional users (local or remote)
|
|
to receive certain presence updates from local users. Presence router callbacks can be
|
|
registered using the module API's `register_presence_router_callbacks` method.
|
|
|
|
## Callbacks
|
|
|
|
The available presence router callbacks are:
|
|
|
|
### `get_users_for_states`
|
|
|
|
```python
|
|
async def get_users_for_states(
|
|
state_updates: Iterable["synapse.api.UserPresenceState"],
|
|
) -> Dict[str, Set["synapse.api.UserPresenceState"]]
|
|
```
|
|
**Requires** `get_interested_users` to also be registered
|
|
|
|
Called when processing updates to the presence state of one or more users. This callback can
|
|
be used to instruct the server to forward that presence state to specific users. The module
|
|
must return a dictionary that maps from Matrix user IDs (which can be local or remote) to the
|
|
`UserPresenceState` changes that they should be forwarded.
|
|
|
|
Synapse will then attempt to send the specified presence updates to each user when possible.
|
|
|
|
### `get_interested_users`
|
|
|
|
```python
|
|
async def get_interested_users(
|
|
user_id: str
|
|
) -> Union[Set[str], "synapse.module_api.PRESENCE_ALL_USERS"]
|
|
```
|
|
**Requires** `get_users_for_states` to also be registered
|
|
|
|
Called when determining which users someone should be able to see the presence state of. This
|
|
callback should return complementary results to `get_users_for_state` or the presence information
|
|
may not be properly forwarded.
|
|
|
|
The callback is given the Matrix user ID for a local user that is requesting presence data and
|
|
should return the Matrix user IDs of the users whose presence state they are allowed to
|
|
query. The returned users can be local or remote.
|
|
|
|
Alternatively the callback can return `synapse.module_api.PRESENCE_ALL_USERS`
|
|
to indicate that the user should receive updates from all known users.
|
|
|
|
## Example
|
|
|
|
The example below is a module that implements both presence router callbacks, and ensures
|
|
that `@alice:example.org` receives all presence updates from `@bob:example.com` and
|
|
`@charlie:somewhere.org`, regardless of whether Alice shares a room with any of them.
|
|
|
|
```python
|
|
from typing import Dict, Iterable, Set, Union
|
|
|
|
from synapse.module_api import ModuleApi
|
|
|
|
|
|
class CustomPresenceRouter:
|
|
def __init__(self, config: dict, api: ModuleApi):
|
|
self.api = api
|
|
|
|
self.api.register_presence_router_callbacks(
|
|
get_users_for_states=self.get_users_for_states,
|
|
get_interested_users=self.get_interested_users,
|
|
)
|
|
|
|
async def get_users_for_states(
|
|
self,
|
|
state_updates: Iterable["synapse.api.UserPresenceState"],
|
|
) -> Dict[str, Set["synapse.api.UserPresenceState"]]:
|
|
res = {}
|
|
for update in state_updates:
|
|
if (
|
|
update.user_id == "@bob:example.com"
|
|
or update.user_id == "@charlie:somewhere.org"
|
|
):
|
|
res.setdefault("@alice:example.com", set()).add(update)
|
|
|
|
return res
|
|
|
|
async def get_interested_users(
|
|
self,
|
|
user_id: str,
|
|
) -> Union[Set[str], "synapse.module_api.PRESENCE_ALL_USERS"]:
|
|
if user_id == "@alice:example.com":
|
|
return {"@bob:example.com", "@charlie:somewhere.org"}
|
|
|
|
return set()
|
|
```
|