mirror of
https://github.com/element-hq/synapse
synced 2024-09-01 18:00:21 +00:00
91 lines
3.2 KiB
Markdown
91 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()
|
||
|
```
|