Integrate knock rooms with the public rooms directory (#9359)
This PR implements the ["Changes regarding the Public Rooms Directory"](https://github.com/Sorunome/matrix-doc/blob/soru/knock/proposals/2403-knock.md#changes-regarding-the-public-rooms-directory) section of knocking MSC2403. Specifically, it: * Allows rooms with `join_rule` "knock" to be returned by the query behind the public rooms directory * Adds the field `join_rule` to each room entry returned by a public rooms directory query, so clients can know whether to attempt a join or knock on a room Based on https://github.com/matrix-org/synapse/issues/6739. Complement tests for this change: https://github.com/matrix-org/complement/pull/72
This commit is contained in:
parent
d936371b69
commit
a7a37437bc
|
@ -0,0 +1 @@
|
|||
Implement "room knocking" as per [MSC2403](https://github.com/matrix-org/matrix-doc/pull/2403). Contributed by Sorunome and anoa.
|
|
@ -169,6 +169,7 @@ class RoomListHandler(BaseHandler):
|
|||
"world_readable": room["history_visibility"]
|
||||
== HistoryVisibility.WORLD_READABLE,
|
||||
"guest_can_join": room["guest_access"] == "can_join",
|
||||
"join_rule": room["join_rules"],
|
||||
}
|
||||
|
||||
# Filter out Nones – rather omit the field altogether
|
||||
|
|
|
@ -19,7 +19,7 @@ from abc import abstractmethod
|
|||
from enum import Enum
|
||||
from typing import Any, Dict, List, Optional, Tuple
|
||||
|
||||
from synapse.api.constants import EventTypes
|
||||
from synapse.api.constants import EventTypes, JoinRules
|
||||
from synapse.api.errors import StoreError
|
||||
from synapse.api.room_versions import RoomVersion, RoomVersions
|
||||
from synapse.storage._base import SQLBaseStore, db_to_json
|
||||
|
@ -177,11 +177,13 @@ class RoomWorkerStore(SQLBaseStore):
|
|||
INNER JOIN room_stats_current USING (room_id)
|
||||
WHERE
|
||||
(
|
||||
join_rules = 'public' OR history_visibility = 'world_readable'
|
||||
join_rules = 'public' OR join_rules = '%(knock_join_rule)s'
|
||||
OR history_visibility = 'world_readable'
|
||||
)
|
||||
AND joined_members > 0
|
||||
""" % {
|
||||
"published_sql": published_sql
|
||||
"published_sql": published_sql,
|
||||
"knock_join_rule": JoinRules.KNOCK,
|
||||
}
|
||||
|
||||
txn.execute(sql, query_args)
|
||||
|
@ -303,7 +305,7 @@ class RoomWorkerStore(SQLBaseStore):
|
|||
sql = """
|
||||
SELECT
|
||||
room_id, name, topic, canonical_alias, joined_members,
|
||||
avatar, history_visibility, joined_members, guest_access
|
||||
avatar, history_visibility, guest_access, join_rules
|
||||
FROM (
|
||||
%(published_sql)s
|
||||
) published
|
||||
|
@ -311,7 +313,8 @@ class RoomWorkerStore(SQLBaseStore):
|
|||
INNER JOIN room_stats_current USING (room_id)
|
||||
WHERE
|
||||
(
|
||||
join_rules = 'public' OR history_visibility = 'world_readable'
|
||||
join_rules = 'public' OR join_rules = '%(knock_join_rule)s'
|
||||
OR history_visibility = 'world_readable'
|
||||
)
|
||||
AND joined_members > 0
|
||||
%(where_clause)s
|
||||
|
@ -320,6 +323,7 @@ class RoomWorkerStore(SQLBaseStore):
|
|||
"published_sql": published_sql,
|
||||
"where_clause": where_clause,
|
||||
"dir": "DESC" if forwards else "ASC",
|
||||
"knock_join_rule": JoinRules.KNOCK,
|
||||
}
|
||||
|
||||
if limit is not None:
|
||||
|
|
Loading…
Reference in New Issue