mirror of
https://github.com/element-hq/synapse
synced 2024-08-19 23:10:20 +00:00
Fix up push to use get_current_state_ids
This commit is contained in:
parent
0e1900d819
commit
7356d52e73
4 changed files with 87 additions and 57 deletions
|
@ -245,7 +245,7 @@ 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(
|
ctx = yield push_tools.get_context_for_event(
|
||||||
self.state_handler, event, self.user_id
|
self.store, self.state_handler, event, self.user_id
|
||||||
)
|
)
|
||||||
|
|
||||||
d = {
|
d = {
|
||||||
|
|
|
@ -22,7 +22,7 @@ from email.mime.text import MIMEText
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
|
||||||
from synapse.util.async import concurrently_execute
|
from synapse.util.async import concurrently_execute
|
||||||
from synapse.util.presentable_names import (
|
from synapse.push.presentable_names import (
|
||||||
calculate_room_name, name_from_member_event, descriptor_from_member_events
|
calculate_room_name, name_from_member_event, descriptor_from_member_events
|
||||||
)
|
)
|
||||||
from synapse.types import UserID
|
from synapse.types import UserID
|
||||||
|
@ -139,7 +139,7 @@ class Mailer(object):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def _fetch_room_state(room_id):
|
def _fetch_room_state(room_id):
|
||||||
room_state = yield self.state_handler.get_current_state(room_id)
|
room_state = yield self.state_handler.get_current_state_ids(room_id)
|
||||||
state_by_room[room_id] = room_state
|
state_by_room[room_id] = room_state
|
||||||
|
|
||||||
# Run at most 3 of these at once: sync does 10 at a time but email
|
# Run at most 3 of these at once: sync does 10 at a time but email
|
||||||
|
@ -160,7 +160,8 @@ class Mailer(object):
|
||||||
rooms.append(roomvars)
|
rooms.append(roomvars)
|
||||||
|
|
||||||
reason['room_name'] = calculate_room_name(
|
reason['room_name'] = calculate_room_name(
|
||||||
state_by_room[reason['room_id']], user_id, fallback_to_members=True
|
self.store, state_by_room[reason['room_id']], user_id,
|
||||||
|
fallback_to_members=True
|
||||||
)
|
)
|
||||||
|
|
||||||
summary_text = self.make_summary_text(
|
summary_text = self.make_summary_text(
|
||||||
|
@ -203,12 +204,15 @@ class Mailer(object):
|
||||||
)
|
)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_room_vars(self, room_id, user_id, notifs, notif_events, room_state):
|
def get_room_vars(self, room_id, user_id, notifs, notif_events, room_state_ids):
|
||||||
my_member_event = room_state[("m.room.member", user_id)]
|
my_member_event_id = room_state_ids[("m.room.member", user_id)]
|
||||||
|
my_member_event = yield self.store.get_event(my_member_event_id)
|
||||||
is_invite = my_member_event.content["membership"] == "invite"
|
is_invite = my_member_event.content["membership"] == "invite"
|
||||||
|
|
||||||
|
room_name = yield calculate_room_name(self.store, room_state_ids, user_id)
|
||||||
|
|
||||||
room_vars = {
|
room_vars = {
|
||||||
"title": calculate_room_name(room_state, user_id),
|
"title": room_name,
|
||||||
"hash": string_ordinal_total(room_id), # See sender avatar hash
|
"hash": string_ordinal_total(room_id), # See sender avatar hash
|
||||||
"notifs": [],
|
"notifs": [],
|
||||||
"invite": is_invite,
|
"invite": is_invite,
|
||||||
|
@ -218,7 +222,7 @@ class Mailer(object):
|
||||||
if not is_invite:
|
if not is_invite:
|
||||||
for n in notifs:
|
for n in notifs:
|
||||||
notifvars = yield self.get_notif_vars(
|
notifvars = yield self.get_notif_vars(
|
||||||
n, user_id, notif_events[n['event_id']], room_state
|
n, user_id, notif_events[n['event_id']], room_state_ids
|
||||||
)
|
)
|
||||||
|
|
||||||
# merge overlapping notifs together.
|
# merge overlapping notifs together.
|
||||||
|
@ -243,7 +247,7 @@ class Mailer(object):
|
||||||
defer.returnValue(room_vars)
|
defer.returnValue(room_vars)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_notif_vars(self, notif, user_id, notif_event, room_state):
|
def get_notif_vars(self, notif, user_id, notif_event, room_state_ids):
|
||||||
results = yield self.store.get_events_around(
|
results = yield self.store.get_events_around(
|
||||||
notif['room_id'], notif['event_id'],
|
notif['room_id'], notif['event_id'],
|
||||||
before_limit=CONTEXT_BEFORE, after_limit=CONTEXT_AFTER
|
before_limit=CONTEXT_BEFORE, after_limit=CONTEXT_AFTER
|
||||||
|
@ -261,17 +265,19 @@ class Mailer(object):
|
||||||
the_events.append(notif_event)
|
the_events.append(notif_event)
|
||||||
|
|
||||||
for event in the_events:
|
for event in the_events:
|
||||||
messagevars = self.get_message_vars(notif, event, room_state)
|
messagevars = yield self.get_message_vars(notif, event, room_state_ids)
|
||||||
if messagevars is not None:
|
if messagevars is not None:
|
||||||
ret['messages'].append(messagevars)
|
ret['messages'].append(messagevars)
|
||||||
|
|
||||||
defer.returnValue(ret)
|
defer.returnValue(ret)
|
||||||
|
|
||||||
def get_message_vars(self, notif, event, room_state):
|
@defer.inlineCallbacks
|
||||||
|
def get_message_vars(self, notif, event, room_state_ids):
|
||||||
if event.type != EventTypes.Message:
|
if event.type != EventTypes.Message:
|
||||||
return None
|
return
|
||||||
|
|
||||||
sender_state_event = room_state[("m.room.member", event.sender)]
|
sender_state_event_id = room_state_ids[("m.room.member", event.sender)]
|
||||||
|
sender_state_event = yield self.store.get_event(sender_state_event_id)
|
||||||
sender_name = name_from_member_event(sender_state_event)
|
sender_name = name_from_member_event(sender_state_event)
|
||||||
sender_avatar_url = sender_state_event.content.get("avatar_url")
|
sender_avatar_url = sender_state_event.content.get("avatar_url")
|
||||||
|
|
||||||
|
@ -299,7 +305,7 @@ class Mailer(object):
|
||||||
if "body" in event.content:
|
if "body" in event.content:
|
||||||
ret["body_text_plain"] = event.content["body"]
|
ret["body_text_plain"] = event.content["body"]
|
||||||
|
|
||||||
return ret
|
defer.returnValue(ret)
|
||||||
|
|
||||||
def add_text_message_vars(self, messagevars, event):
|
def add_text_message_vars(self, messagevars, event):
|
||||||
msgformat = event.content.get("format")
|
msgformat = event.content.get("format")
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
from twisted.internet import defer
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
@ -25,7 +27,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,
|
@defer.inlineCallbacks
|
||||||
|
def calculate_room_name(store, room_state_ids, user_id, fallback_to_members=True,
|
||||||
fallback_to_single_member=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
|
||||||
|
@ -42,59 +45,79 @@ def calculate_room_name(room_state, user_id, fallback_to_members=True,
|
||||||
(string or None) A human readable name for the room.
|
(string or None) A human readable name for the room.
|
||||||
"""
|
"""
|
||||||
# does it have a name?
|
# does it have a name?
|
||||||
if ("m.room.name", "") in room_state:
|
if ("m.room.name", "") in room_state_ids:
|
||||||
m_room_name = room_state[("m.room.name", "")]
|
m_room_name = yield store.get_event(
|
||||||
if m_room_name.content and m_room_name.content["name"]:
|
room_state_ids[("m.room.name", "")], allow_none=True
|
||||||
return m_room_name.content["name"]
|
)
|
||||||
|
if m_room_name and m_room_name.content and m_room_name.content["name"]:
|
||||||
|
defer.returnValue(m_room_name.content["name"])
|
||||||
|
|
||||||
# does it have a canonical alias?
|
# does it have a canonical alias?
|
||||||
if ("m.room.canonical_alias", "") in room_state:
|
if ("m.room.canonical_alias", "") in room_state_ids:
|
||||||
canon_alias = room_state[("m.room.canonical_alias", "")]
|
canon_alias = yield store.get_event(
|
||||||
|
room_state_ids[("m.room.canonical_alias", "")], allow_none=True
|
||||||
|
)
|
||||||
|
canon_alias = room_state_ids[("m.room.canonical_alias", "")]
|
||||||
if (
|
if (
|
||||||
canon_alias.content and canon_alias.content["alias"] and
|
canon_alias and canon_alias.content and canon_alias.content["alias"] and
|
||||||
_looks_like_an_alias(canon_alias.content["alias"])
|
_looks_like_an_alias(canon_alias.content["alias"])
|
||||||
):
|
):
|
||||||
return canon_alias.content["alias"]
|
defer.returnValue(canon_alias.content["alias"])
|
||||||
|
|
||||||
# at this point we're going to need to search the state by all state keys
|
# at this point we're going to need to search the state by all state keys
|
||||||
# for an event type, so rearrange the data structure
|
# for an event type, so rearrange the data structure
|
||||||
room_state_bytype = _state_as_two_level_dict(room_state)
|
room_state_bytype_ids = _state_as_two_level_dict(room_state_ids)
|
||||||
|
|
||||||
# right then, any aliases at all?
|
# right then, any aliases at all?
|
||||||
if "m.room.aliases" in room_state_bytype:
|
if "m.room.aliases" in room_state_bytype_ids:
|
||||||
m_room_aliases = room_state_bytype["m.room.aliases"]
|
m_room_aliases = room_state_bytype_ids["m.room.aliases"]
|
||||||
if len(m_room_aliases.values()) > 0:
|
for alias_id in m_room_aliases.values():
|
||||||
first_alias_event = m_room_aliases.values()[0]
|
alias_event = yield store.get_event(
|
||||||
if first_alias_event.content and first_alias_event.content["aliases"]:
|
alias_id, allow_none=True
|
||||||
the_aliases = first_alias_event.content["aliases"]
|
)
|
||||||
|
if alias_event and alias_event.content and alias_event.get("aliases"):
|
||||||
|
the_aliases = alias_event.content["aliases"]
|
||||||
if len(the_aliases) > 0 and _looks_like_an_alias(the_aliases[0]):
|
if len(the_aliases) > 0 and _looks_like_an_alias(the_aliases[0]):
|
||||||
return the_aliases[0]
|
defer.returnValue(the_aliases[0])
|
||||||
|
|
||||||
if not fallback_to_members:
|
if not fallback_to_members:
|
||||||
return None
|
defer.returnValue(None)
|
||||||
|
|
||||||
my_member_event = None
|
my_member_event = None
|
||||||
if ("m.room.member", user_id) in room_state:
|
if ("m.room.member", user_id) in room_state_ids:
|
||||||
my_member_event = room_state[("m.room.member", user_id)]
|
my_member_event = yield store.get_event(
|
||||||
|
room_state_ids[("m.room.member", user_id)], allow_none=True
|
||||||
|
)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
my_member_event is not None and
|
my_member_event is not None and
|
||||||
my_member_event.content['membership'] == "invite"
|
my_member_event.content['membership'] == "invite"
|
||||||
):
|
):
|
||||||
if ("m.room.member", my_member_event.sender) in room_state:
|
if ("m.room.member", my_member_event.sender) in room_state_ids:
|
||||||
inviter_member_event = room_state[("m.room.member", my_member_event.sender)]
|
inviter_member_event = yield store.get_event(
|
||||||
if fallback_to_single_member:
|
room_state_ids[("m.room.member", my_member_event.sender)],
|
||||||
return "Invite from %s" % (name_from_member_event(inviter_member_event),)
|
allow_none=True,
|
||||||
else:
|
)
|
||||||
return None
|
if inviter_member_event:
|
||||||
|
if fallback_to_single_member:
|
||||||
|
defer.returnValue(
|
||||||
|
"Invite from %s" % (
|
||||||
|
name_from_member_event(inviter_member_event),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return
|
||||||
else:
|
else:
|
||||||
return "Room Invite"
|
defer.returnValue("Room Invite")
|
||||||
|
|
||||||
# we're going to have to generate a name based on who's in the room,
|
# we're going to have to generate a name based on who's in the room,
|
||||||
# so find out who is in the room that isn't the user.
|
# so find out who is in the room that isn't the user.
|
||||||
if "m.room.member" in room_state_bytype:
|
if "m.room.member" in room_state_bytype_ids:
|
||||||
|
member_events = yield store.get_events(
|
||||||
|
room_state_bytype_ids["m.room.member"].values()
|
||||||
|
)
|
||||||
all_members = [
|
all_members = [
|
||||||
ev for ev in room_state_bytype["m.room.member"].values()
|
ev for ev in member_events.values()
|
||||||
if ev.content['membership'] == "join" or ev.content['membership'] == "invite"
|
if ev.content['membership'] == "join" or ev.content['membership'] == "invite"
|
||||||
]
|
]
|
||||||
# Sort the member events oldest-first so the we name people in the
|
# Sort the member events oldest-first so the we name people in the
|
||||||
|
@ -111,9 +134,9 @@ def calculate_room_name(room_state, user_id, fallback_to_members=True,
|
||||||
# self-chat, peeked room with 1 participant,
|
# self-chat, peeked room with 1 participant,
|
||||||
# or inbound invite, or outbound 3PID invite.
|
# or inbound invite, or outbound 3PID invite.
|
||||||
if all_members[0].sender == user_id:
|
if all_members[0].sender == user_id:
|
||||||
if "m.room.third_party_invite" in room_state_bytype:
|
if "m.room.third_party_invite" in room_state_bytype_ids:
|
||||||
third_party_invites = (
|
third_party_invites = (
|
||||||
room_state_bytype["m.room.third_party_invite"].values()
|
room_state_bytype_ids["m.room.third_party_invite"].values()
|
||||||
)
|
)
|
||||||
|
|
||||||
if len(third_party_invites) > 0:
|
if len(third_party_invites) > 0:
|
||||||
|
@ -126,17 +149,17 @@ def calculate_room_name(room_state, user_id, fallback_to_members=True,
|
||||||
# return "Inviting %s" % (
|
# return "Inviting %s" % (
|
||||||
# descriptor_from_member_events(third_party_invites)
|
# descriptor_from_member_events(third_party_invites)
|
||||||
# )
|
# )
|
||||||
return "Inviting email address"
|
defer.returnValue("Inviting email address")
|
||||||
else:
|
else:
|
||||||
return ALL_ALONE
|
defer.returnValue(ALL_ALONE)
|
||||||
else:
|
else:
|
||||||
return name_from_member_event(all_members[0])
|
defer.returnValue(name_from_member_event(all_members[0]))
|
||||||
else:
|
else:
|
||||||
return ALL_ALONE
|
defer.returnValue(ALL_ALONE)
|
||||||
elif len(other_members) == 1 and not fallback_to_single_member:
|
elif len(other_members) == 1 and not fallback_to_single_member:
|
||||||
return None
|
return
|
||||||
else:
|
else:
|
||||||
return descriptor_from_member_events(other_members)
|
defer.returnValue(descriptor_from_member_events(other_members))
|
||||||
|
|
||||||
|
|
||||||
def descriptor_from_member_events(member_events):
|
def descriptor_from_member_events(member_events):
|
|
@ -14,7 +14,7 @@
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from synapse.util.presentable_names import (
|
from synapse.push.presentable_names import (
|
||||||
calculate_room_name, name_from_member_event
|
calculate_room_name, name_from_member_event
|
||||||
)
|
)
|
||||||
from synapse.util.logcontext import preserve_fn, preserve_context_over_deferred
|
from synapse.util.logcontext import preserve_fn, preserve_context_over_deferred
|
||||||
|
@ -49,21 +49,22 @@ def get_badge_count(store, user_id):
|
||||||
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_context_for_event(state_handler, ev, user_id):
|
def get_context_for_event(store, state_handler, ev, user_id):
|
||||||
ctx = {}
|
ctx = {}
|
||||||
|
|
||||||
room_state = yield state_handler.get_current_state(ev.room_id)
|
room_state_ids = yield state_handler.get_current_state_ids(ev.room_id)
|
||||||
|
|
||||||
# we no longer bother setting room_alias, and make room_name the
|
# we no longer bother setting room_alias, and make room_name the
|
||||||
# human-readable name instead, be that m.room.name, an alias or
|
# human-readable name instead, be that m.room.name, an alias or
|
||||||
# a list of people in the room
|
# a list of people in the room
|
||||||
name = calculate_room_name(
|
name = yield calculate_room_name(
|
||||||
room_state, user_id, fallback_to_single_member=False
|
store, room_state_ids, user_id, fallback_to_single_member=False
|
||||||
)
|
)
|
||||||
if name:
|
if name:
|
||||||
ctx['name'] = name
|
ctx['name'] = name
|
||||||
|
|
||||||
sender_state_event = room_state[("m.room.member", ev.sender)]
|
sender_state_event_id = room_state_ids[("m.room.member", ev.sender)]
|
||||||
|
sender_state_event = yield store.get_event(sender_state_event_id)
|
||||||
ctx['sender_display_name'] = name_from_member_event(sender_state_event)
|
ctx['sender_display_name'] = name_from_member_event(sender_state_event)
|
||||||
|
|
||||||
defer.returnValue(ctx)
|
defer.returnValue(ctx)
|
||||||
|
|
Loading…
Reference in a new issue