1717#
1818# Partly based on github.com/Cadair/python-appservice-framework (MIT license)
1919from contextlib import contextmanager
20+ from typing import Optional , Callable , Awaitable
2021from aiohttp import web
2122import aiohttp
2223import asyncio
2324import logging
2425
25- from .intent_api import HTTPAPI
26+ from .intent_api import HTTPAPI , IntentAPI
2627from .state_store import StateStore
2728
29+ QueryFunc = Callable [[web .Request ], Awaitable [Optional [web .Response ]]]
30+ HandlerFunc = Callable [[dict ], Awaitable ]
31+
2832
2933class AppService :
30- def __init__ (self , server , domain , as_token , hs_token , bot_localpart , loop = None , log = None ,
31- verify_ssl = True , query_user = None , query_alias = None ):
34+ def __init__ (self , server : str , domain : str , as_token : str , hs_token : str , bot_localpart : str ,
35+ loop : Optional [asyncio .AbstractEventLoop ] = None ,
36+ log : Optional [logging .Logger ] = None , verify_ssl : bool = True ,
37+ query_user : QueryFunc = None , query_alias : QueryFunc = None ):
3238 self .server = server
3339 self .domain = domain
3440 self .verify_ssl = verify_ssl
@@ -64,23 +70,23 @@ async def default_query_handler(_):
6470 self .matrix_event_handler (self .update_state_store )
6571
6672 @property
67- def http_session (self ):
73+ def http_session (self ) -> aiohttp . ClientSession :
6874 if self ._http_session is None :
6975 raise AttributeError ("the http_session attribute can only be used "
7076 "from within the `AppService.run` context manager" )
7177 else :
7278 return self ._http_session
7379
7480 @property
75- def intent (self ):
81+ def intent (self ) -> IntentAPI :
7682 if self ._intent is None :
7783 raise AttributeError ("the intent attribute can only be used from "
7884 "within the `AppService.run` context manager" )
7985 else :
8086 return self ._intent
8187
8288 @contextmanager
83- def run (self , host = "127.0.0.1" , port = 8080 ):
89+ def run (self , host : str = "127.0.0.1" , port : int = 8080 ):
8490 connector = None
8591 if self .server .startswith ("https://" ) and not self .verify_ssl :
8692 connector = aiohttp .TCPConnector (verify_ssl = False )
@@ -95,7 +101,7 @@ def run(self, host="127.0.0.1", port=8080):
95101 self ._http_session .close ()
96102 self ._http_session = None
97103
98- def _check_token (self , request ) :
104+ def _check_token (self , request : web . Request ) -> bool :
99105 try :
100106 token = request .rel_url .query ["access_token" ]
101107 except KeyError :
@@ -106,7 +112,7 @@ def _check_token(self, request):
106112
107113 return True
108114
109- async def _http_query_user (self , request ) :
115+ async def _http_query_user (self , request : web . Request ) -> web . Response :
110116 if not self ._check_token (request ):
111117 return web .Response (status = 401 )
112118
@@ -122,7 +128,7 @@ async def _http_query_user(self, request):
122128 return web .Response (status = 404 )
123129 return web .json_response (response )
124130
125- async def _http_query_alias (self , request ) :
131+ async def _http_query_alias (self , request : web . Request ) -> web . Response :
126132 if not self ._check_token (request ):
127133 return web .Response (status = 401 )
128134
@@ -138,7 +144,7 @@ async def _http_query_alias(self, request):
138144 return web .Response (status = 404 )
139145 return web .json_response (response )
140146
141- async def _http_handle_transaction (self , request ) :
147+ async def _http_handle_transaction (self , request : web . Request ) -> web . Response :
142148 if not self ._check_token (request ):
143149 return web .Response (status = 401 )
144150
@@ -160,24 +166,24 @@ async def _http_handle_transaction(self, request):
160166
161167 return web .json_response ({})
162168
163- async def update_state_store (self , event ):
169+ async def update_state_store (self , event : dict ):
164170 event_type = event ["type" ]
165171 if event_type == "m.room.power_levels" :
166172 self .state_store .set_power_levels (event ["room_id" ], event ["content" ])
167173 elif event_type == "m.room.member" :
168174 self .state_store .set_membership (event ["room_id" ], event ["state_key" ],
169175 event ["content" ]["membership" ])
170176
171- def handle_matrix_event (self , event ):
172- async def try_handle (handler ):
177+ def handle_matrix_event (self , event : dict ):
178+ async def try_handle (handler_func : HandlerFunc ):
173179 try :
174- await handler (event )
180+ await handler_func (event )
175181 except Exception :
176182 self .log .exception ("Exception in Matrix event handler" )
177183
178184 for handler in self .event_handlers :
179185 asyncio .ensure_future (try_handle (handler ), loop = self .loop )
180186
181- def matrix_event_handler (self , func ) :
187+ def matrix_event_handler (self , func : HandlerFunc ) -> HandlerFunc :
182188 self .event_handlers .append (func )
183189 return func
0 commit comments