Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #787 from matrix-org/markjh/liberate_presence_handler
Browse files Browse the repository at this point in the history
Move the presence handler out of the Handlers object
  • Loading branch information
NegativeMjark committed May 17, 2016
2 parents 3fd8a07 + e168abb commit b153f5b
Show file tree
Hide file tree
Showing 12 changed files with 49 additions and 36 deletions.
2 changes: 0 additions & 2 deletions synapse/handlers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
from .events import EventStreamHandler, EventHandler
from .federation import FederationHandler
from .profile import ProfileHandler
from .presence import PresenceHandler
from .directory import DirectoryHandler
from .typing import TypingNotificationHandler
from .admin import AdminHandler
Expand Down Expand Up @@ -53,7 +52,6 @@ def __init__(self, hs):
self.event_handler = EventHandler(hs)
self.federation_handler = FederationHandler(hs)
self.profile_handler = ProfileHandler(hs)
self.presence_handler = PresenceHandler(hs)
self.room_list_handler = RoomListHandler(hs)
self.directory_handler = DirectoryHandler(hs)
self.typing_notification_handler = TypingNotificationHandler(hs)
Expand Down
2 changes: 1 addition & 1 deletion synapse/handlers/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def get_stream(self, auth_user_id, pagin_config, timeout=0,
If `only_keys` is not None, events from keys will be sent down.
"""
auth_user = UserID.from_string(auth_user_id)
presence_handler = self.hs.get_handlers().presence_handler
presence_handler = self.hs.get_presence_handler()

context = yield presence_handler.user_syncing(
auth_user_id, affect_presence=affect_presence,
Expand Down
4 changes: 2 additions & 2 deletions synapse/handlers/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ def send_nonmember_event(self, requester, event, context, ratelimit=True):
)

if event.type == EventTypes.Message:
presence = self.hs.get_handlers().presence_handler
presence = self.hs.get_presence_handler()
yield presence.bump_presence_active_time(user)

def deduplicate_state_event(self, event, context):
Expand Down Expand Up @@ -674,7 +674,7 @@ def _room_initial_sync_joined(self, user_id, room_id, pagin_config,
and m.content["membership"] == Membership.JOIN
]

presence_handler = self.hs.get_handlers().presence_handler
presence_handler = self.hs.get_presence_handler()

@defer.inlineCallbacks
def get_presence():
Expand Down
40 changes: 21 additions & 19 deletions synapse/handlers/presence.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@
from synapse.types import UserID, get_domain_from_id
import synapse.metrics

from ._base import BaseHandler

import logging


Expand Down Expand Up @@ -73,11 +71,11 @@
assert LAST_ACTIVE_GRANULARITY < IDLE_TIMER


class PresenceHandler(BaseHandler):
class PresenceHandler(object):

def __init__(self, hs):
super(PresenceHandler, self).__init__(hs)
self.hs = hs
self.is_mine = hs.is_mine
self.is_mine_id = hs.is_mine_id
self.clock = hs.get_clock()
self.store = hs.get_datastore()
self.wheel_timer = WheelTimer()
Expand Down Expand Up @@ -138,7 +136,7 @@ def __init__(self, hs):
obj=state.user_id,
then=state.last_user_sync_ts + SYNC_ONLINE_TIMEOUT,
)
if self.hs.is_mine_id(state.user_id):
if self.is_mine_id(state.user_id):
self.wheel_timer.insert(
now=now,
obj=state.user_id,
Expand Down Expand Up @@ -228,7 +226,7 @@ def _update_states(self, new_states):

new_state, should_notify, should_ping = handle_update(
prev_state, new_state,
is_mine=self.hs.is_mine_id(user_id),
is_mine=self.is_mine_id(user_id),
wheel_timer=self.wheel_timer,
now=now
)
Expand Down Expand Up @@ -287,7 +285,7 @@ def _handle_timeouts(self):

changes = handle_timeouts(
states,
is_mine_fn=self.hs.is_mine_id,
is_mine_fn=self.is_mine_id,
user_to_num_current_syncs=self.user_to_num_current_syncs,
now=now,
)
Expand Down Expand Up @@ -427,7 +425,7 @@ def _get_interested_parties(self, states):

hosts_to_states = {}
for room_id, states in room_ids_to_states.items():
local_states = filter(lambda s: self.hs.is_mine_id(s.user_id), states)
local_states = filter(lambda s: self.is_mine_id(s.user_id), states)
if not local_states:
continue

Expand All @@ -436,7 +434,7 @@ def _get_interested_parties(self, states):
hosts_to_states.setdefault(host, []).extend(local_states)

for user_id, states in users_to_states.items():
local_states = filter(lambda s: self.hs.is_mine_id(s.user_id), states)
local_states = filter(lambda s: self.is_mine_id(s.user_id), states)
if not local_states:
continue

Expand Down Expand Up @@ -611,14 +609,14 @@ def user_joined_room(self, user, room_id):
# don't need to send to local clients here, as that is done as part
# of the event stream/sync.
# TODO: Only send to servers not already in the room.
if self.hs.is_mine(user):
if self.is_mine(user):
state = yield self.current_state_for_user(user.to_string())

hosts = yield self.store.get_joined_hosts_for_room(room_id)
self._push_to_remotes({host: (state,) for host in hosts})
else:
user_ids = yield self.store.get_users_in_room(room_id)
user_ids = filter(self.hs.is_mine_id, user_ids)
user_ids = filter(self.is_mine_id, user_ids)

states = yield self.current_state_for_users(user_ids)

Expand All @@ -628,7 +626,7 @@ def user_joined_room(self, user, room_id):
def get_presence_list(self, observer_user, accepted=None):
"""Returns the presence for all users in their presence list.
"""
if not self.hs.is_mine(observer_user):
if not self.is_mine(observer_user):
raise SynapseError(400, "User is not hosted on this Home Server")

presence_list = yield self.store.get_presence_list(
Expand Down Expand Up @@ -659,7 +657,7 @@ def send_presence_invite(self, observer_user, observed_user):
observer_user.localpart, observed_user.to_string()
)

if self.hs.is_mine(observed_user):
if self.is_mine(observed_user):
yield self.invite_presence(observed_user, observer_user)
else:
yield self.federation.send_edu(
Expand All @@ -675,11 +673,11 @@ def send_presence_invite(self, observer_user, observed_user):
def invite_presence(self, observed_user, observer_user):
"""Handles new presence invites.
"""
if not self.hs.is_mine(observed_user):
if not self.is_mine(observed_user):
raise SynapseError(400, "User is not hosted on this Home Server")

# TODO: Don't auto accept
if self.hs.is_mine(observer_user):
if self.is_mine(observer_user):
yield self.accept_presence(observed_user, observer_user)
else:
self.federation.send_edu(
Expand Down Expand Up @@ -742,7 +740,7 @@ def drop(self, observed_user, observer_user):
Returns:
A Deferred.
"""
if not self.hs.is_mine(observer_user):
if not self.is_mine(observer_user):
raise SynapseError(400, "User is not hosted on this Home Server")

yield self.store.del_presence_list(
Expand Down Expand Up @@ -834,7 +832,11 @@ def _format_user_presence_state(state, now):

class PresenceEventSource(object):
def __init__(self, hs):
self.hs = hs
# We can't call get_presence_handler here because there's a cycle:
#
# Presence -> Notifier -> PresenceEventSource -> Presence
#
self.get_presence_handler = hs.get_presence_handler
self.clock = hs.get_clock()
self.store = hs.get_datastore()

Expand All @@ -860,7 +862,7 @@ def get_new_events(self, user, from_key, room_ids=None, include_offline=True,
from_key = int(from_key)
room_ids = room_ids or []

presence = self.hs.get_handlers().presence_handler
presence = self.get_presence_handler()
stream_change_cache = self.store.presence_stream_cache

if not room_ids:
Expand Down
2 changes: 1 addition & 1 deletion synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ def incremental_sync_with_gap(self, sync_config, since_token):

# For each newly joined room, we want to send down presence of
# existing users.
presence_handler = self.hs.get_handlers().presence_handler
presence_handler = self.hs.get_presence_handler()
extra_presence_users = set()
for room_id in newly_joined_rooms:
users = yield self.store.get_users_in_room(event.room_id)
Expand Down
2 changes: 1 addition & 1 deletion synapse/replication/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def __init__(self, hs):
self.version_string = hs.version_string
self.store = hs.get_datastore()
self.sources = hs.get_event_sources()
self.presence_handler = hs.get_handlers().presence_handler
self.presence_handler = hs.get_presence_handler()
self.typing_handler = hs.get_handlers().typing_notification_handler
self.notifier = hs.notifier
self.clock = hs.get_clock()
Expand Down
20 changes: 14 additions & 6 deletions synapse/rest/client/v1/presence.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,24 @@
class PresenceStatusRestServlet(ClientV1RestServlet):
PATTERNS = client_path_patterns("/presence/(?P<user_id>[^/]*)/status")

def __init__(self, hs):
super(PresenceStatusRestServlet, self).__init__(hs)
self.presence_handler = hs.get_presence_handler()

@defer.inlineCallbacks
def on_GET(self, request, user_id):
requester = yield self.auth.get_user_by_req(request)
user = UserID.from_string(user_id)

if requester.user != user:
allowed = yield self.handlers.presence_handler.is_visible(
allowed = yield self.presence_handler.is_visible(
observed_user=user, observer_user=requester.user,
)

if not allowed:
raise AuthError(403, "You are not allowed to see their presence.")

state = yield self.handlers.presence_handler.get_state(target_user=user)
state = yield self.presence_handler.get_state(target_user=user)

defer.returnValue((200, state))

Expand Down Expand Up @@ -74,7 +78,7 @@ def on_PUT(self, request, user_id):
except:
raise SynapseError(400, "Unable to parse state")

yield self.handlers.presence_handler.set_state(user, state)
yield self.presence_handler.set_state(user, state)

defer.returnValue((200, {}))

Expand All @@ -85,6 +89,10 @@ def on_OPTIONS(self, request):
class PresenceListRestServlet(ClientV1RestServlet):
PATTERNS = client_path_patterns("/presence/list/(?P<user_id>[^/]*)")

def __init__(self, hs):
super(PresenceListRestServlet, self).__init__(hs)
self.presence_handler = hs.get_presence_handler()

@defer.inlineCallbacks
def on_GET(self, request, user_id):
requester = yield self.auth.get_user_by_req(request)
Expand All @@ -96,7 +104,7 @@ def on_GET(self, request, user_id):
if requester.user != user:
raise SynapseError(400, "Cannot get another user's presence list")

presence = yield self.handlers.presence_handler.get_presence_list(
presence = yield self.presence_handler.get_presence_list(
observer_user=user, accepted=True
)

Expand All @@ -123,7 +131,7 @@ def on_POST(self, request, user_id):
if len(u) == 0:
continue
invited_user = UserID.from_string(u)
yield self.handlers.presence_handler.send_presence_invite(
yield self.presence_handler.send_presence_invite(
observer_user=user, observed_user=invited_user
)

Expand All @@ -134,7 +142,7 @@ def on_POST(self, request, user_id):
if len(u) == 0:
continue
dropped_user = UserID.from_string(u)
yield self.handlers.presence_handler.drop(
yield self.presence_handler.drop(
observer_user=user, observed_user=dropped_user
)

Expand Down
2 changes: 1 addition & 1 deletion synapse/rest/client/v1/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,7 @@ class RoomTypingRestServlet(ClientV1RestServlet):

def __init__(self, hs):
super(RoomTypingRestServlet, self).__init__(hs)
self.presence_handler = hs.get_handlers().presence_handler
self.presence_handler = hs.get_presence_handler()

@defer.inlineCallbacks
def on_PUT(self, request, room_id, user_id):
Expand Down
2 changes: 1 addition & 1 deletion synapse/rest/client/v2_alpha/receipts.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def __init__(self, hs):
self.hs = hs
self.auth = hs.get_auth()
self.receipts_handler = hs.get_handlers().receipts_handler
self.presence_handler = hs.get_handlers().presence_handler
self.presence_handler = hs.get_presence_handler()

@defer.inlineCallbacks
def on_POST(self, request, room_id, receipt_type, event_id):
Expand Down
2 changes: 1 addition & 1 deletion synapse/rest/client/v2_alpha/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ def __init__(self, hs):
self.sync_handler = hs.get_handlers().sync_handler
self.clock = hs.get_clock()
self.filtering = hs.get_filtering()
self.presence_handler = hs.get_handlers().presence_handler
self.presence_handler = hs.get_presence_handler()

@defer.inlineCallbacks
def on_GET(self, request):
Expand Down
5 changes: 5 additions & 0 deletions synapse/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from synapse.notifier import Notifier
from synapse.api.auth import Auth
from synapse.handlers import Handlers
from synapse.handlers.presence import PresenceHandler
from synapse.state import StateHandler
from synapse.storage import DataStore
from synapse.util import Clock
Expand Down Expand Up @@ -78,6 +79,7 @@ def build_DEPENDENCY(self)
'auth',
'rest_servlet_factory',
'state_handler',
'presence_handler',
'notifier',
'distributor',
'client_resource',
Expand Down Expand Up @@ -164,6 +166,9 @@ def build_v1auth(self):
def build_state_handler(self):
return StateHandler(self)

def build_presence_handler(self):
return PresenceHandler(self)

def build_event_sources(self):
return EventSources(self)

Expand Down
2 changes: 1 addition & 1 deletion tests/replication/test_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def test_events_and_state(self):
@defer.inlineCallbacks
def test_presence(self):
get = self.get(presence="-1")
yield self.hs.get_handlers().presence_handler.set_state(
yield self.hs.get_presence_handler().set_state(
self.user, {"presence": "online"}
)
code, body = yield get
Expand Down

0 comments on commit b153f5b

Please sign in to comment.