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

Commit dc22090

Browse files
authored
Add type hints to synapse.handlers.room (#8090)
1 parent 6b7ce1d commit dc22090

File tree

3 files changed

+69
-39
lines changed

3 files changed

+69
-39
lines changed

changelog.d/8090.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add type hints to `synapse.handlers.room`.

synapse/handlers/room.py

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import math
2323
import string
2424
from collections import OrderedDict
25-
from typing import Awaitable, Optional, Tuple
25+
from typing import TYPE_CHECKING, Any, Awaitable, Dict, List, Optional, Tuple
2626

2727
from synapse.api.constants import (
2828
EventTypes,
@@ -32,11 +32,14 @@
3232
RoomEncryptionAlgorithms,
3333
)
3434
from synapse.api.errors import AuthError, Codes, NotFoundError, StoreError, SynapseError
35+
from synapse.api.filtering import Filter
3536
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersion
37+
from synapse.events import EventBase
3638
from synapse.events.utils import copy_power_levels_contents
3739
from synapse.http.endpoint import parse_and_validate_server_name
3840
from synapse.storage.state import StateFilter
3941
from synapse.types import (
42+
JsonDict,
4043
Requester,
4144
RoomAlias,
4245
RoomID,
@@ -53,6 +56,9 @@
5356

5457
from ._base import BaseHandler
5558

59+
if TYPE_CHECKING:
60+
from synapse.server import HomeServer
61+
5662
logger = logging.getLogger(__name__)
5763

5864
id_server_scheme = "https://"
@@ -61,7 +67,7 @@
6167

6268

6369
class RoomCreationHandler(BaseHandler):
64-
def __init__(self, hs):
70+
def __init__(self, hs: "HomeServer"):
6571
super(RoomCreationHandler, self).__init__(hs)
6672

6773
self.spam_checker = hs.get_spam_checker()
@@ -92,7 +98,7 @@ def __init__(self, hs):
9298
"guest_can_join": False,
9399
"power_level_content_override": {},
94100
},
95-
}
101+
} # type: Dict[str, Dict[str, Any]]
96102

97103
# Modify presets to selectively enable encryption by default per homeserver config
98104
for preset_name, preset_config in self._presets_dict.items():
@@ -215,6 +221,9 @@ async def _upgrade_room(
215221

216222
old_room_state = await tombstone_context.get_current_state_ids()
217223

224+
# We know the tombstone event isn't an outlier so it has current state.
225+
assert old_room_state is not None
226+
218227
# update any aliases
219228
await self._move_aliases_to_new_room(
220229
requester, old_room_id, new_room_id, old_room_state
@@ -528,17 +537,21 @@ async def _move_aliases_to_new_room(
528537
logger.error("Unable to send updated alias events in new room: %s", e)
529538

530539
async def create_room(
531-
self, requester, config, ratelimit=True, creator_join_profile=None
540+
self,
541+
requester: Requester,
542+
config: JsonDict,
543+
ratelimit: bool = True,
544+
creator_join_profile: Optional[JsonDict] = None,
532545
) -> Tuple[dict, int]:
533546
""" Creates a new room.
534547
535548
Args:
536-
requester (synapse.types.Requester):
549+
requester:
537550
The user who requested the room creation.
538-
config (dict) : A dict of configuration options.
539-
ratelimit (bool): set to False to disable the rate limiter
551+
config : A dict of configuration options.
552+
ratelimit: set to False to disable the rate limiter
540553
541-
creator_join_profile (dict|None):
554+
creator_join_profile:
542555
Set to override the displayname and avatar for the creating
543556
user in this room. If unset, displayname and avatar will be
544557
derived from the user's profile. If set, should contain the
@@ -601,6 +614,7 @@ async def create_room(
601614
Codes.UNSUPPORTED_ROOM_VERSION,
602615
)
603616

617+
room_alias = None
604618
if "room_alias_name" in config:
605619
for wchar in string.whitespace:
606620
if wchar in config["room_alias_name"]:
@@ -611,8 +625,6 @@ async def create_room(
611625

612626
if mapping:
613627
raise SynapseError(400, "Room alias already taken", Codes.ROOM_IN_USE)
614-
else:
615-
room_alias = None
616628

617629
invite_list = config.get("invite", [])
618630
for i in invite_list:
@@ -771,31 +783,38 @@ async def create_room(
771783

772784
async def _send_events_for_new_room(
773785
self,
774-
creator, # A Requester object.
775-
room_id,
776-
preset_config,
777-
invite_list,
778-
initial_state,
779-
creation_content,
780-
room_alias=None,
781-
power_level_content_override=None, # Doesn't apply when initial state has power level state event content
782-
creator_join_profile=None,
786+
creator: Requester,
787+
room_id: str,
788+
preset_config: str,
789+
invite_list: List[str],
790+
initial_state: StateMap,
791+
creation_content: JsonDict,
792+
room_alias: Optional[RoomAlias] = None,
793+
power_level_content_override: Optional[JsonDict] = None,
794+
creator_join_profile: Optional[JsonDict] = None,
783795
) -> int:
784796
"""Sends the initial events into a new room.
785797
798+
`power_level_content_override` doesn't apply when initial state has
799+
power level state event content.
800+
786801
Returns:
787802
The stream_id of the last event persisted.
788803
"""
789804

790-
def create(etype, content, **kwargs):
805+
creator_id = creator.user.to_string()
806+
807+
event_keys = {"room_id": room_id, "sender": creator_id, "state_key": ""}
808+
809+
def create(etype: str, content: JsonDict, **kwargs) -> JsonDict:
791810
e = {"type": etype, "content": content}
792811

793812
e.update(event_keys)
794813
e.update(kwargs)
795814

796815
return e
797816

798-
async def send(etype, content, **kwargs) -> int:
817+
async def send(etype: str, content: JsonDict, **kwargs) -> int:
799818
event = create(etype, content, **kwargs)
800819
logger.debug("Sending %s in new room", etype)
801820
(
@@ -808,10 +827,6 @@ async def send(etype, content, **kwargs) -> int:
808827

809828
config = self._presets_dict[preset_config]
810829

811-
creator_id = creator.user.to_string()
812-
813-
event_keys = {"room_id": room_id, "sender": creator_id, "state_key": ""}
814-
815830
creation_content.update({"creator": creator_id})
816831
await send(etype=EventTypes.Create, content=creation_content)
817832

@@ -852,7 +867,7 @@ async def send(etype, content, **kwargs) -> int:
852867
"kick": 50,
853868
"redact": 50,
854869
"invite": 50,
855-
}
870+
} # type: JsonDict
856871

857872
if config["original_invitees_have_ops"]:
858873
for invitee in invite_list:
@@ -906,7 +921,7 @@ async def send(etype, content, **kwargs) -> int:
906921
return last_sent_stream_id
907922

908923
async def _generate_room_id(
909-
self, creator_id: str, is_public: str, room_version: RoomVersion,
924+
self, creator_id: str, is_public: bool, room_version: RoomVersion,
910925
):
911926
# autogen room IDs and try to create it. We may clash, so just
912927
# try a few times till one goes through, giving up eventually.
@@ -930,23 +945,30 @@ async def _generate_room_id(
930945

931946

932947
class RoomContextHandler(object):
933-
def __init__(self, hs):
948+
def __init__(self, hs: "HomeServer"):
934949
self.hs = hs
935950
self.store = hs.get_datastore()
936951
self.storage = hs.get_storage()
937952
self.state_store = self.storage.state
938953

939-
async def get_event_context(self, user, room_id, event_id, limit, event_filter):
954+
async def get_event_context(
955+
self,
956+
user: UserID,
957+
room_id: str,
958+
event_id: str,
959+
limit: int,
960+
event_filter: Optional[Filter],
961+
) -> Optional[JsonDict]:
940962
"""Retrieves events, pagination tokens and state around a given event
941963
in a room.
942964
943965
Args:
944-
user (UserID)
945-
room_id (str)
946-
event_id (str)
947-
limit (int): The maximum number of events to return in total
966+
user
967+
room_id
968+
event_id
969+
limit: The maximum number of events to return in total
948970
(excluding state).
949-
event_filter (Filter|None): the filter to apply to the events returned
971+
event_filter: the filter to apply to the events returned
950972
(excluding the target event_id)
951973
952974
Returns:
@@ -1033,12 +1055,18 @@ def filter_evts(events):
10331055

10341056

10351057
class RoomEventSource(object):
1036-
def __init__(self, hs):
1058+
def __init__(self, hs: "HomeServer"):
10371059
self.store = hs.get_datastore()
10381060

10391061
async def get_new_events(
1040-
self, user, from_key, limit, room_ids, is_guest, explicit_room_id=None
1041-
):
1062+
self,
1063+
user: UserID,
1064+
from_key: str,
1065+
limit: int,
1066+
room_ids: List[str],
1067+
is_guest: bool,
1068+
explicit_room_id: Optional[str] = None,
1069+
) -> Tuple[List[EventBase], str]:
10421070
# We just ignore the key for now.
10431071

10441072
to_key = self.get_current_key()
@@ -1096,7 +1124,7 @@ class RoomShutdownHandler(object):
10961124
)
10971125
DEFAULT_ROOM_NAME = "Content Violation Notification"
10981126

1099-
def __init__(self, hs):
1127+
def __init__(self, hs: "HomeServer"):
11001128
self.hs = hs
11011129
self.room_member_handler = hs.get_room_member_handler()
11021130
self._room_creation_handler = hs.get_room_creation_handler()

tox.ini

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ commands=
169169
skip_install = True
170170
deps =
171171
{[base]deps}
172-
mypy==0.750
172+
mypy==0.782
173173
mypy-zope
174174
env =
175175
MYPYPATH = stubs/
@@ -190,6 +190,7 @@ commands = mypy \
190190
synapse/handlers/message.py \
191191
synapse/handlers/oidc_handler.py \
192192
synapse/handlers/presence.py \
193+
synapse/handlers/room.py \
193194
synapse/handlers/room_member.py \
194195
synapse/handlers/room_member_worker.py \
195196
synapse/handlers/saml_handler.py \

0 commit comments

Comments
 (0)