Merge pull request #894 from matrix-org/dbkr/push_room_naming
Use similar naming we use in email notifs for push
This commit is contained in:
commit
db74dcda5b
|
@ -38,6 +38,7 @@ class HttpPusher(object):
|
||||||
self.hs = hs
|
self.hs = hs
|
||||||
self.store = self.hs.get_datastore()
|
self.store = self.hs.get_datastore()
|
||||||
self.clock = self.hs.get_clock()
|
self.clock = self.hs.get_clock()
|
||||||
|
self.state_handler = self.hs.get_state_handler()
|
||||||
self.user_id = pusherdict['user_name']
|
self.user_id = pusherdict['user_name']
|
||||||
self.app_id = pusherdict['app_id']
|
self.app_id = pusherdict['app_id']
|
||||||
self.app_display_name = pusherdict['app_display_name']
|
self.app_display_name = pusherdict['app_display_name']
|
||||||
|
@ -237,7 +238,9 @@ class HttpPusher(object):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _build_notification_dict(self, event, tweaks, badge):
|
def _build_notification_dict(self, event, tweaks, badge):
|
||||||
ctx = yield push_tools.get_context_for_event(self.hs.get_datastore(), event)
|
ctx = yield push_tools.get_context_for_event(
|
||||||
|
self.state_handler, event, self.user_id
|
||||||
|
)
|
||||||
|
|
||||||
d = {
|
d = {
|
||||||
'notification': {
|
'notification': {
|
||||||
|
@ -269,8 +272,8 @@ class HttpPusher(object):
|
||||||
if 'content' in event:
|
if 'content' in event:
|
||||||
d['notification']['content'] = event.content
|
d['notification']['content'] = event.content
|
||||||
|
|
||||||
if len(ctx['aliases']):
|
# We no longer send aliases separately, instead, we send the human
|
||||||
d['notification']['room_alias'] = ctx['aliases'][0]
|
# readable name of the room, which may be an alias.
|
||||||
if 'sender_display_name' in ctx and len(ctx['sender_display_name']) > 0:
|
if 'sender_display_name' in ctx and len(ctx['sender_display_name']) > 0:
|
||||||
d['notification']['sender_display_name'] = ctx['sender_display_name']
|
d['notification']['sender_display_name'] = ctx['sender_display_name']
|
||||||
if 'name' in ctx and len(ctx['name']) > 0:
|
if 'name' in ctx and len(ctx['name']) > 0:
|
||||||
|
|
|
@ -14,6 +14,9 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
|
from synapse.util.presentable_names import (
|
||||||
|
calculate_room_name, name_from_member_event
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
@ -45,24 +48,21 @@ def get_badge_count(store, user_id):
|
||||||
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_context_for_event(store, ev):
|
def get_context_for_event(state_handler, ev, user_id):
|
||||||
name_aliases = yield store.get_room_name_and_aliases(
|
ctx = {}
|
||||||
ev.room_id
|
|
||||||
)
|
|
||||||
|
|
||||||
ctx = {'aliases': name_aliases[1]}
|
room_state = yield state_handler.get_current_state(ev.room_id)
|
||||||
if name_aliases[0] is not None:
|
|
||||||
ctx['name'] = name_aliases[0]
|
|
||||||
|
|
||||||
their_member_events_for_room = yield store.get_current_state(
|
# we no longer bother setting room_alias, and make room_name the
|
||||||
room_id=ev.room_id,
|
# human-readable name instead, be that m.room.namer, an alias or
|
||||||
event_type='m.room.member',
|
# a list of people in the room
|
||||||
state_key=ev.user_id
|
name = calculate_room_name(
|
||||||
|
room_state, user_id, fallback_to_single_member=False
|
||||||
)
|
)
|
||||||
for mev in their_member_events_for_room:
|
if name:
|
||||||
if mev.content['membership'] == 'join' and 'displayname' in mev.content:
|
ctx['name'] = name
|
||||||
dn = mev.content['displayname']
|
|
||||||
if dn is not None:
|
sender_state_event = room_state[("m.room.member", ev.sender)]
|
||||||
ctx['sender_display_name'] = dn
|
ctx['sender_display_name'] = name_from_member_event(sender_state_event)
|
||||||
|
|
||||||
defer.returnValue(ctx)
|
defer.returnValue(ctx)
|
||||||
|
|
|
@ -18,7 +18,6 @@ from ._slaved_id_tracker import SlavedIdTracker
|
||||||
from synapse.api.constants import EventTypes
|
from synapse.api.constants import EventTypes
|
||||||
from synapse.events import FrozenEvent
|
from synapse.events import FrozenEvent
|
||||||
from synapse.storage import DataStore
|
from synapse.storage import DataStore
|
||||||
from synapse.storage.room import RoomStore
|
|
||||||
from synapse.storage.roommember import RoomMemberStore
|
from synapse.storage.roommember import RoomMemberStore
|
||||||
from synapse.storage.event_federation import EventFederationStore
|
from synapse.storage.event_federation import EventFederationStore
|
||||||
from synapse.storage.event_push_actions import EventPushActionsStore
|
from synapse.storage.event_push_actions import EventPushActionsStore
|
||||||
|
@ -64,7 +63,6 @@ class SlavedEventStore(BaseSlavedStore):
|
||||||
|
|
||||||
# Cached functions can't be accessed through a class instance so we need
|
# Cached functions can't be accessed through a class instance so we need
|
||||||
# to reach inside the __dict__ to extract them.
|
# to reach inside the __dict__ to extract them.
|
||||||
get_room_name_and_aliases = RoomStore.__dict__["get_room_name_and_aliases"]
|
|
||||||
get_rooms_for_user = RoomMemberStore.__dict__["get_rooms_for_user"]
|
get_rooms_for_user = RoomMemberStore.__dict__["get_rooms_for_user"]
|
||||||
get_users_in_room = RoomMemberStore.__dict__["get_users_in_room"]
|
get_users_in_room = RoomMemberStore.__dict__["get_users_in_room"]
|
||||||
get_latest_event_ids_in_room = EventFederationStore.__dict__[
|
get_latest_event_ids_in_room = EventFederationStore.__dict__[
|
||||||
|
@ -202,7 +200,6 @@ class SlavedEventStore(BaseSlavedStore):
|
||||||
self.get_rooms_for_user.invalidate_all()
|
self.get_rooms_for_user.invalidate_all()
|
||||||
self.get_users_in_room.invalidate((event.room_id,))
|
self.get_users_in_room.invalidate((event.room_id,))
|
||||||
# self.get_joined_hosts_for_room.invalidate((event.room_id,))
|
# self.get_joined_hosts_for_room.invalidate((event.room_id,))
|
||||||
self.get_room_name_and_aliases.invalidate((event.room_id,))
|
|
||||||
|
|
||||||
self._invalidate_get_event_cache(event.event_id)
|
self._invalidate_get_event_cache(event.event_id)
|
||||||
|
|
||||||
|
@ -246,9 +243,3 @@ class SlavedEventStore(BaseSlavedStore):
|
||||||
self._get_current_state_for_key.invalidate((
|
self._get_current_state_for_key.invalidate((
|
||||||
event.room_id, event.type, event.state_key
|
event.room_id, event.type, event.state_key
|
||||||
))
|
))
|
||||||
|
|
||||||
if event.type in [EventTypes.Name, EventTypes.Aliases]:
|
|
||||||
self.get_room_name_and_aliases.invalidate(
|
|
||||||
(event.room_id,)
|
|
||||||
)
|
|
||||||
pass
|
|
||||||
|
|
|
@ -355,7 +355,6 @@ class EventsStore(SQLBaseStore):
|
||||||
txn.call_after(self.get_rooms_for_user.invalidate_all)
|
txn.call_after(self.get_rooms_for_user.invalidate_all)
|
||||||
txn.call_after(self.get_users_in_room.invalidate, (event.room_id,))
|
txn.call_after(self.get_users_in_room.invalidate, (event.room_id,))
|
||||||
txn.call_after(self.get_joined_hosts_for_room.invalidate, (event.room_id,))
|
txn.call_after(self.get_joined_hosts_for_room.invalidate, (event.room_id,))
|
||||||
txn.call_after(self.get_room_name_and_aliases.invalidate, (event.room_id,))
|
|
||||||
|
|
||||||
# Add an entry to the current_state_resets table to record the point
|
# Add an entry to the current_state_resets table to record the point
|
||||||
# where we clobbered the current state
|
# where we clobbered the current state
|
||||||
|
@ -666,12 +665,6 @@ class EventsStore(SQLBaseStore):
|
||||||
(event.room_id, event.type, event.state_key,)
|
(event.room_id, event.type, event.state_key,)
|
||||||
)
|
)
|
||||||
|
|
||||||
if event.type in [EventTypes.Name, EventTypes.Aliases]:
|
|
||||||
txn.call_after(
|
|
||||||
self.get_room_name_and_aliases.invalidate,
|
|
||||||
(event.room_id,)
|
|
||||||
)
|
|
||||||
|
|
||||||
self._simple_upsert_txn(
|
self._simple_upsert_txn(
|
||||||
txn,
|
txn,
|
||||||
"current_state_events",
|
"current_state_events",
|
||||||
|
|
|
@ -18,7 +18,6 @@ from twisted.internet import defer
|
||||||
from synapse.api.errors import StoreError
|
from synapse.api.errors import StoreError
|
||||||
|
|
||||||
from ._base import SQLBaseStore
|
from ._base import SQLBaseStore
|
||||||
from synapse.util.caches.descriptors import cachedInlineCallbacks
|
|
||||||
from .engines import PostgresEngine, Sqlite3Engine
|
from .engines import PostgresEngine, Sqlite3Engine
|
||||||
|
|
||||||
import collections
|
import collections
|
||||||
|
@ -192,49 +191,6 @@ class RoomStore(SQLBaseStore):
|
||||||
# This should be unreachable.
|
# This should be unreachable.
|
||||||
raise Exception("Unrecognized database engine")
|
raise Exception("Unrecognized database engine")
|
||||||
|
|
||||||
@cachedInlineCallbacks()
|
|
||||||
def get_room_name_and_aliases(self, room_id):
|
|
||||||
def get_room_name(txn):
|
|
||||||
sql = (
|
|
||||||
"SELECT name FROM room_names"
|
|
||||||
" INNER JOIN current_state_events USING (room_id, event_id)"
|
|
||||||
" WHERE room_id = ?"
|
|
||||||
" LIMIT 1"
|
|
||||||
)
|
|
||||||
|
|
||||||
txn.execute(sql, (room_id,))
|
|
||||||
rows = txn.fetchall()
|
|
||||||
if rows:
|
|
||||||
return rows[0][0]
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
return [row[0] for row in txn.fetchall()]
|
|
||||||
|
|
||||||
def get_room_aliases(txn):
|
|
||||||
sql = (
|
|
||||||
"SELECT content FROM current_state_events"
|
|
||||||
" INNER JOIN events USING (room_id, event_id)"
|
|
||||||
" WHERE room_id = ?"
|
|
||||||
)
|
|
||||||
txn.execute(sql, (room_id,))
|
|
||||||
return [row[0] for row in txn.fetchall()]
|
|
||||||
|
|
||||||
name = yield self.runInteraction("get_room_name", get_room_name)
|
|
||||||
alias_contents = yield self.runInteraction("get_room_aliases", get_room_aliases)
|
|
||||||
|
|
||||||
aliases = []
|
|
||||||
|
|
||||||
for c in alias_contents:
|
|
||||||
try:
|
|
||||||
content = json.loads(c)
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
|
|
||||||
aliases.extend(content.get('aliases', []))
|
|
||||||
|
|
||||||
defer.returnValue((name, aliases))
|
|
||||||
|
|
||||||
def add_event_report(self, room_id, event_id, user_id, reason, content,
|
def add_event_report(self, room_id, event_id, user_id, reason, content,
|
||||||
received_ts):
|
received_ts):
|
||||||
next_id = self._event_reports_id_gen.get_next()
|
next_id = self._event_reports_id_gen.get_next()
|
||||||
|
|
|
@ -25,7 +25,8 @@ ALIAS_RE = re.compile(r"^#.*:.+$")
|
||||||
ALL_ALONE = "Empty Room"
|
ALL_ALONE = "Empty Room"
|
||||||
|
|
||||||
|
|
||||||
def calculate_room_name(room_state, user_id, fallback_to_members=True):
|
def calculate_room_name(room_state, user_id, fallback_to_members=True,
|
||||||
|
fallback_to_single_member=True):
|
||||||
"""
|
"""
|
||||||
Works out a user-facing name for the given room as per Matrix
|
Works out a user-facing name for the given room as per Matrix
|
||||||
spec recommendations.
|
spec recommendations.
|
||||||
|
@ -129,6 +130,8 @@ def calculate_room_name(room_state, user_id, fallback_to_members=True):
|
||||||
return name_from_member_event(all_members[0])
|
return name_from_member_event(all_members[0])
|
||||||
else:
|
else:
|
||||||
return ALL_ALONE
|
return ALL_ALONE
|
||||||
|
elif len(other_members) == 1 and not fallback_to_single_member:
|
||||||
|
return None
|
||||||
else:
|
else:
|
||||||
return descriptor_from_member_events(other_members)
|
return descriptor_from_member_events(other_members)
|
||||||
|
|
||||||
|
|
|
@ -58,47 +58,6 @@ class SlavedEventStoreTestCase(BaseSlavedStoreTestCase):
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
[unpatch() for unpatch in self.unpatches]
|
[unpatch() for unpatch in self.unpatches]
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
|
||||||
def test_room_name_and_aliases(self):
|
|
||||||
create = yield self.persist(type="m.room.create", key="", creator=USER_ID)
|
|
||||||
yield self.persist(type="m.room.member", key=USER_ID, membership="join")
|
|
||||||
yield self.persist(type="m.room.name", key="", name="name1")
|
|
||||||
yield self.persist(
|
|
||||||
type="m.room.aliases", key="blue", aliases=["#1:blue"]
|
|
||||||
)
|
|
||||||
yield self.replicate()
|
|
||||||
yield self.check(
|
|
||||||
"get_room_name_and_aliases", (ROOM_ID,), ("name1", ["#1:blue"])
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set the room name.
|
|
||||||
yield self.persist(type="m.room.name", key="", name="name2")
|
|
||||||
yield self.replicate()
|
|
||||||
yield self.check(
|
|
||||||
"get_room_name_and_aliases", (ROOM_ID,), ("name2", ["#1:blue"])
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set the room aliases.
|
|
||||||
yield self.persist(
|
|
||||||
type="m.room.aliases", key="blue", aliases=["#2:blue"]
|
|
||||||
)
|
|
||||||
yield self.replicate()
|
|
||||||
yield self.check(
|
|
||||||
"get_room_name_and_aliases", (ROOM_ID,), ("name2", ["#2:blue"])
|
|
||||||
)
|
|
||||||
|
|
||||||
# Leave and join the room clobbering the state.
|
|
||||||
yield self.persist(type="m.room.member", key=USER_ID, membership="leave")
|
|
||||||
yield self.persist(
|
|
||||||
type="m.room.member", key=USER_ID, membership="join",
|
|
||||||
reset_state=[create]
|
|
||||||
)
|
|
||||||
yield self.replicate()
|
|
||||||
|
|
||||||
yield self.check(
|
|
||||||
"get_room_name_and_aliases", (ROOM_ID,), (None, [])
|
|
||||||
)
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def test_room_members(self):
|
def test_room_members(self):
|
||||||
create = yield self.persist(type="m.room.create", key="", creator=USER_ID)
|
create = yield self.persist(type="m.room.create", key="", creator=USER_ID)
|
||||||
|
|
Loading…
Reference in New Issue