Skip to content

Commit 198dcaf

Browse files
authored
Merge pull request #78 from geotribu/refactor/rename-messages
refactor(models): rename models from Gischat* to QChat*
2 parents 500c0b6 + 4e00d75 commit 198dcaf

File tree

14 files changed

+226
-216
lines changed

14 files changed

+226
-216
lines changed

README.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,28 @@
1212

1313
---
1414

15-
Gischat API backend for chatting with your tribe in GIS tools like QGIS (using [QTribu](https://github.com/geotribu/qtribu) plugin available [from official plugin repository](https://plugins.qgis.org/plugins/qtribu/)), GIS mobile apps (e.g [QField plugin)(https://github.com/geotribu/qchat-qfield-plugin), and other to come!
15+
Gischat API backend for chatting with your tribe in GIS tools.
1616

1717
**No database : messages are not stored. Just stateless websockets.**
1818

19+
## Known clients
20+
21+
Here are the known clients implementing gischat / QChat, at the moment:
22+
23+
- [QChat](https://github.com/geotribu/qchat) QGIS plugin.
24+
- [QTribu](https://github.com/geotribu/qtribu) QGIS plugin, available [from the official QGIS plugin repository](https://plugins.qgis.org/plugins/qtribu/).
25+
- [QField plugin](https://github.com/geotribu/qchat-qfield-plugin).
26+
27+
And other to come!
28+
1929
## Known instances
2030

2131
Following instances are up and running :
2232

2333
| URL | Description | Location |
2434
| :-: | :---------- | :------- |
25-
| <https://gischat.geotribu.net> | "official" international instance | Germany |
26-
| <https://gischat.geotribu.fr> | "official" french-speaking instance | Germany |
35+
| <https://gischat.geotribu.net> | Geotribu's international instance | Germany |
36+
| <https://gischat.geotribu.fr> | Geotribu's fr-speaking instance | Germany |
2737

2838
## Developer information
2939

gischat/app.py

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,20 @@
3131
from gischat.logging import logger
3232
from gischat.models import (
3333
ChannelStatusModel,
34-
GischatBboxMessage,
35-
GischatCrsMessage,
36-
GischatGeojsonLayerMessage,
37-
GischatImageMessage,
38-
GischatLikeMessage,
39-
GischatMessageModel,
40-
GischatMessageTypeEnum,
41-
GischatModelMessage,
42-
GischatNewcomerMessage,
43-
GischatPositionMessage,
44-
GischatTextMessage,
45-
GischatUncompliantMessage,
4634
MatrixRegisterRequest,
4735
MatrixRegisterResponse,
36+
QChatBboxMessage,
37+
QChatCrsMessage,
38+
QChatGeojsonLayerMessage,
39+
QChatImageMessage,
40+
QChatLikeMessage,
41+
QChatMessageModel,
42+
QChatMessageTypeEnum,
43+
QChatModelMessage,
44+
QChatNewcomerMessage,
45+
QChatPositionMessage,
46+
QChatTextMessage,
47+
QChatUncompliantMessage,
4848
QMatrixChatTextMessage,
4949
RulesModel,
5050
StatusModel,
@@ -199,11 +199,9 @@ async def get_last_messages(channel: str) -> list:
199199

200200
@app.put(
201201
"/channel/{channel}/text",
202-
response_model=GischatTextMessage,
202+
response_model=QChatTextMessage,
203203
)
204-
async def put_text_message(
205-
channel: str, message: GischatTextMessage
206-
) -> GischatTextMessage:
204+
async def put_text_message(channel: str, message: QChatTextMessage) -> QChatTextMessage:
207205

208206
if channel not in redis_dispatcher.channels:
209207
raise HTTPException(
@@ -245,11 +243,11 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
245243
payload = await websocket.receive_json()
246244

247245
try:
248-
message = GischatMessageModel(**payload)
246+
message = QChatMessageModel(**payload)
249247

250248
# text message
251-
if message.type == GischatMessageTypeEnum.TEXT:
252-
message = GischatTextMessage(**payload)
249+
if message.type == QChatMessageTypeEnum.TEXT:
250+
message = QChatTextMessage(**payload)
253251

254252
logger.info(f"💬 [{channel}]: ({message.author}): '{message.text}'")
255253
await redis_dispatcher.broadcast_to_redis_channel(channel, message)
@@ -258,8 +256,8 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
258256
redis_dispatcher.store_message(channel, message)
259257

260258
# image message
261-
if message.type == GischatMessageTypeEnum.IMAGE:
262-
message = GischatImageMessage(**payload)
259+
if message.type == QChatMessageTypeEnum.IMAGE:
260+
message = QChatImageMessage(**payload)
263261

264262
# resize image if needed using MAX_IMAGE_SIZE env var
265263
image = Image.open(BytesIO(base64.b64decode(message.image_data)))
@@ -277,15 +275,15 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
277275
redis_dispatcher.store_message(channel, message)
278276

279277
# newcomer message
280-
if message.type == GischatMessageTypeEnum.NEWCOMER:
281-
message = GischatNewcomerMessage(**payload)
278+
if message.type == QChatMessageTypeEnum.NEWCOMER:
279+
message = QChatNewcomerMessage(**payload)
282280

283281
# check if user is already registered
284282
if redis_dispatcher.is_user_present(channel, message.newcomer):
285283
logger.info(
286284
f"❌ User '{message.newcomer}' wants to register but there is already a '{message.newcomer}' in channel {channel}"
287285
)
288-
message = GischatUncompliantMessage(
286+
message = QChatUncompliantMessage(
289287
reason=f"User '{message.newcomer}' already registered in channel {channel}"
290288
)
291289
await websocket.send_json(jsonable_encoder(message))
@@ -296,17 +294,17 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
296294
await redis_dispatcher.notify_newcomer(channel, message.newcomer)
297295

298296
# like message
299-
if message.type == GischatMessageTypeEnum.LIKE:
300-
message = GischatLikeMessage(**payload)
297+
if message.type == QChatMessageTypeEnum.LIKE:
298+
message = QChatLikeMessage(**payload)
301299

302300
logger.info(
303301
f"👍 [{channel}]: {message.liker_author} liked {message.liked_author}'s message ({message.message})"
304302
)
305303
await redis_dispatcher.broadcast_to_redis_channel(channel, message)
306304

307305
# geojson layer message
308-
if message.type == GischatMessageTypeEnum.GEOJSON:
309-
message = GischatGeojsonLayerMessage(**payload)
306+
if message.type == QChatMessageTypeEnum.GEOJSON:
307+
message = QChatGeojsonLayerMessage(**payload)
310308

311309
# check if the number of features is compliant
312310
# must not be greater than the MAX_GEOJSON_FEATURES env variable
@@ -317,7 +315,7 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
317315
f"❌ {message.author} sent a geojson layer ('{message.layer_name}') with too many features ({nb_features}"
318316
)
319317
# notify user with an uncompliant message
320-
message = GischatUncompliantMessage(
318+
message = QChatUncompliantMessage(
321319
reason=f"Too many geojson features : {nb_features} vs max {max_nb_features} allowed"
322320
)
323321
await websocket.send_json(jsonable_encoder(message))
@@ -331,8 +329,8 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
331329
redis_dispatcher.store_message(channel, message)
332330

333331
# crs message
334-
if message.type == GischatMessageTypeEnum.CRS:
335-
message = GischatCrsMessage(**payload)
332+
if message.type == QChatMessageTypeEnum.CRS:
333+
message = QChatCrsMessage(**payload)
336334

337335
logger.info(
338336
f"📐 [{channel}]: ({message.author}): shared crs '{message.crs_authid}'"
@@ -342,8 +340,8 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
342340
redis_dispatcher.store_message(channel, message)
343341

344342
# bbox message
345-
if message.type == GischatMessageTypeEnum.BBOX:
346-
message = GischatBboxMessage(**payload)
343+
if message.type == QChatMessageTypeEnum.BBOX:
344+
message = QChatBboxMessage(**payload)
347345

348346
logger.info(
349347
f"🔳 [{channel}]: ({message.author}): shared bbox using crs '{message.crs_authid}'"
@@ -353,8 +351,8 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
353351
redis_dispatcher.store_message(channel, message)
354352

355353
# position message
356-
if message.type == GischatMessageTypeEnum.POSITION:
357-
message = GischatPositionMessage(**payload)
354+
if message.type == QChatMessageTypeEnum.POSITION:
355+
message = QChatPositionMessage(**payload)
358356

359357
logger.info(
360358
f"📍 [{channel}]: ({message.author}): shared position '{message.x} x {message.y}' using crs '{message.crs_authid}'"
@@ -364,8 +362,8 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
364362
redis_dispatcher.store_message(channel, message)
365363

366364
# graphic model message
367-
if message.type == GischatMessageTypeEnum.MODEL:
368-
message = GischatModelMessage(**payload)
365+
if message.type == QChatMessageTypeEnum.MODEL:
366+
message = QChatModelMessage(**payload)
369367

370368
logger.info(
371369
f"🧮 [{channel}]: ({message.author}): shared graphic model '{message.model_name}'"
@@ -375,7 +373,7 @@ async def websocket_endpoint(websocket: WebSocket, channel: str) -> None:
375373
redis_dispatcher.store_message(channel, message)
376374

377375
except ValidationError as e:
378-
message = GischatUncompliantMessage(reason=str(e))
376+
message = QChatUncompliantMessage(reason=str(e))
379377

380378
logger.error(f"❌ Uncompliant message shared: {e}")
381379
await redis_dispatcher.broadcast_to_redis_channel(channel, message)
@@ -445,10 +443,10 @@ async def matrix_websocket_endpoint(websocket: WebSocket, request_id: UUID) -> N
445443
payload = await websocket.receive_json()
446444

447445
try:
448-
message = GischatMessageModel(**payload)
446+
message = QChatMessageModel(**payload)
449447

450448
# text message
451-
if message.type == GischatMessageTypeEnum.TEXT:
449+
if message.type == QChatMessageTypeEnum.TEXT:
452450
print("payload: ", payload)
453451
message = QMatrixChatTextMessage(**payload)
454452

@@ -462,7 +460,7 @@ async def matrix_websocket_endpoint(websocket: WebSocket, request_id: UUID) -> N
462460
)
463461

464462
except ValidationError as e:
465-
message = GischatUncompliantMessage(reason=str(e))
463+
message = QChatUncompliantMessage(reason=str(e))
466464
logger.error(f"❌ Uncompliant message shared: {e}")
467465
await websocket.send_json(jsonable_encoder(message))
468466

gischat/dispatchers.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
)
1818
from gischat.logging import logger
1919
from gischat.models import (
20-
GischatExiterMessage,
21-
GischatMessageModel,
22-
GischatNbUsersMessage,
23-
GischatNewcomerMessage,
2420
MatrixRegisterRequest,
21+
QChatExiterMessage,
22+
QChatMessageModel,
23+
QChatNbUsersMessage,
24+
QChatNewcomerMessage,
2525
QMatrixChatTextMessage,
26-
parse_gischat_message,
26+
parse_qchat_message,
2727
)
2828

2929

@@ -122,7 +122,7 @@ async def broadcast_to_active_websockets(self, channel: str, message: str) -> No
122122
active_connections.remove(ws)
123123

124124
async def broadcast_to_redis_channel(
125-
self, channel: str, message: GischatMessageModel
125+
self, channel: str, message: QChatMessageModel
126126
) -> None:
127127
await self.redis_pub.publish(
128128
get_redis_channel_key(channel), message.model_dump_json()
@@ -147,7 +147,7 @@ async def notify_nb_users(self, channel: str) -> None:
147147
Notifies connected users in a channel with the number of connected users.
148148
:param channel: channel to notify.
149149
"""
150-
message = GischatNbUsersMessage(nb_users=self.get_nb_connected_users(channel))
150+
message = QChatNbUsersMessage(nb_users=self.get_nb_connected_users(channel))
151151
await self.broadcast_to_redis_channel(channel, message)
152152

153153
async def notify_newcomer(self, channel: str, user: str) -> None:
@@ -156,7 +156,7 @@ async def notify_newcomer(self, channel: str, user: str) -> None:
156156
:param channel: channel to notify.
157157
:param user: nickname of the newcomer.
158158
"""
159-
message = GischatNewcomerMessage(newcomer=user)
159+
message = QChatNewcomerMessage(newcomer=user)
160160
await self.broadcast_to_redis_channel(channel, message)
161161

162162
async def notify_exiter(self, channel: str, user: str) -> None:
@@ -165,7 +165,7 @@ async def notify_exiter(self, channel: str, user: str) -> None:
165165
:param channel: channel to notify.
166166
:param user: nickname of the exiter.
167167
"""
168-
message = GischatExiterMessage(exiter=user)
168+
message = QChatExiterMessage(exiter=user)
169169
await self.broadcast_to_redis_channel(channel, message)
170170

171171
def register_user(self, channel: str, websocket: WebSocket, user: str) -> None:
@@ -196,7 +196,7 @@ def is_user_present(self, channel: str, user: str) -> bool:
196196
return user in users_list
197197

198198
async def notify_user(
199-
self, channel: str, user: str, message: GischatMessageModel
199+
self, channel: str, user: str, message: QChatMessageModel
200200
) -> None:
201201
"""
202202
Notifies a user in a channel with a "private" message.
@@ -215,7 +215,7 @@ async def notify_user(
215215
except KeyError:
216216
continue
217217

218-
def store_message(self, channel: str, message: GischatMessageModel) -> None:
218+
def store_message(self, channel: str, message: QChatMessageModel) -> None:
219219
"""
220220
Stores a message sent in a channel.
221221
Will keep only the last MAX_STORED_MESSAGES (env var).
@@ -228,7 +228,7 @@ def store_message(self, channel: str, message: GischatMessageModel) -> None:
228228
self.redis_connection.lpush(last_message_key, text_value)
229229
self.redis_connection.ltrim(last_message_key, 0, MAX_STORED_MESSAGES - 1)
230230

231-
def get_stored_messages(self, channel: str) -> list[GischatMessageModel]:
231+
def get_stored_messages(self, channel: str) -> list[QChatMessageModel]:
232232
"""
233233
Returns the last messages sent and stored in a channel.
234234
:param channel: channel with stored messages.
@@ -239,7 +239,7 @@ def get_stored_messages(self, channel: str) -> list[GischatMessageModel]:
239239

240240
messages = []
241241
for raw in reversed(raw_stored):
242-
message = parse_gischat_message(json.loads(raw))
242+
message = parse_qchat_message(json.loads(raw))
243243
messages.append(message)
244244

245245
return messages

0 commit comments

Comments
 (0)