forked from MirrorHub/synapse
Refactor public rooms to not pull out the full state for each room
This commit is contained in:
parent
baffe96d95
commit
772c6067a3
2 changed files with 33 additions and 16 deletions
|
@ -18,7 +18,7 @@ from twisted.internet import defer
|
||||||
from ._base import BaseHandler
|
from ._base import BaseHandler
|
||||||
|
|
||||||
from synapse.api.constants import (
|
from synapse.api.constants import (
|
||||||
EventTypes, JoinRules, Membership,
|
EventTypes, JoinRules,
|
||||||
)
|
)
|
||||||
from synapse.api.errors import SynapseError
|
from synapse.api.errors import SynapseError
|
||||||
from synapse.util.async import concurrently_execute
|
from synapse.util.async import concurrently_execute
|
||||||
|
@ -56,7 +56,35 @@ class RoomListHandler(BaseHandler):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def handle_room(room_id):
|
def handle_room(room_id):
|
||||||
current_state = yield self.state_handler.get_current_state(room_id)
|
joined_users = yield self.state_handler.get_current_user_in_room(room_id)
|
||||||
|
num_joined_users = len(joined_users)
|
||||||
|
if num_joined_users == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
result = {
|
||||||
|
"room_id": room_id,
|
||||||
|
"num_joined_members": num_joined_users,
|
||||||
|
}
|
||||||
|
|
||||||
|
current_state_ids = yield self.state_handler.get_current_state_ids(room_id)
|
||||||
|
|
||||||
|
event_map = yield self.store.get_events([
|
||||||
|
event_id for key, event_id in current_state_ids.items()
|
||||||
|
if key[0] in (
|
||||||
|
EventTypes.JoinRules,
|
||||||
|
EventTypes.Name,
|
||||||
|
EventTypes.Topic,
|
||||||
|
EventTypes.CanonicalAlias,
|
||||||
|
EventTypes.RoomHistoryVisibility,
|
||||||
|
EventTypes.GuestAccess,
|
||||||
|
"m.room.avatar",
|
||||||
|
)
|
||||||
|
])
|
||||||
|
|
||||||
|
current_state = {
|
||||||
|
(ev.type, ev.state_key): ev
|
||||||
|
for ev in event_map.values()
|
||||||
|
}
|
||||||
|
|
||||||
# Double check that this is actually a public room.
|
# Double check that this is actually a public room.
|
||||||
join_rules_event = current_state.get((EventTypes.JoinRules, ""))
|
join_rules_event = current_state.get((EventTypes.JoinRules, ""))
|
||||||
|
@ -65,18 +93,6 @@ class RoomListHandler(BaseHandler):
|
||||||
if join_rule and join_rule != JoinRules.PUBLIC:
|
if join_rule and join_rule != JoinRules.PUBLIC:
|
||||||
defer.returnValue(None)
|
defer.returnValue(None)
|
||||||
|
|
||||||
result = {"room_id": room_id}
|
|
||||||
|
|
||||||
num_joined_users = len([
|
|
||||||
1 for _, event in current_state.items()
|
|
||||||
if event.type == EventTypes.Member
|
|
||||||
and event.membership == Membership.JOIN
|
|
||||||
])
|
|
||||||
if num_joined_users == 0:
|
|
||||||
return
|
|
||||||
|
|
||||||
result["num_joined_members"] = num_joined_users
|
|
||||||
|
|
||||||
aliases = yield self.store.get_aliases_for_room(room_id)
|
aliases = yield self.store.get_aliases_for_room(room_id)
|
||||||
if aliases:
|
if aliases:
|
||||||
result["aliases"] = aliases
|
result["aliases"] = aliases
|
||||||
|
|
|
@ -156,8 +156,9 @@ class StateHandler(object):
|
||||||
defer.returnValue(state)
|
defer.returnValue(state)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_current_user_in_room(self, room_id):
|
def get_current_user_in_room(self, room_id, latest_event_ids=None):
|
||||||
latest_event_ids = yield self.store.get_latest_event_ids_in_room(room_id)
|
if not latest_event_ids:
|
||||||
|
latest_event_ids = yield self.store.get_latest_event_ids_in_room(room_id)
|
||||||
entry = yield self.resolve_state_groups(room_id, latest_event_ids)
|
entry = yield self.resolve_state_groups(room_id, latest_event_ids)
|
||||||
joined_users = yield self.store.get_joined_users_from_state(
|
joined_users = yield self.store.get_joined_users_from_state(
|
||||||
room_id, entry.state_id, entry.state
|
room_id, entry.state_id, entry.state
|
||||||
|
|
Loading…
Reference in a new issue