| 
									
										
										
										
											2024-06-05 02:13:43 +08:00
										 |  |  | import asyncio | 
					
						
							| 
									
										
										
										
											2024-08-28 06:10:27 +08:00
										 |  |  | import socketio | 
					
						
							| 
									
										
										
										
											2024-09-22 08:14:59 +08:00
										 |  |  | import logging | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2024-09-22 08:12:55 +08:00
										 |  |  | import time | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  | from open_webui.models.users import Users, UserNameResponse | 
					
						
							| 
									
										
										
										
											2024-12-23 10:40:01 +08:00
										 |  |  | from open_webui.models.channels import Channels | 
					
						
							| 
									
										
										
										
											2024-12-25 09:03:14 +08:00
										 |  |  | from open_webui.models.chats import Chats | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-21 05:43:22 +08:00
										 |  |  | from open_webui.env import ( | 
					
						
							|  |  |  |     ENABLE_WEBSOCKET_SUPPORT, | 
					
						
							|  |  |  |     WEBSOCKET_MANAGER, | 
					
						
							|  |  |  |     WEBSOCKET_REDIS_URL, | 
					
						
							| 
									
										
										
										
											2025-03-01 08:02:15 +08:00
										 |  |  |     WEBSOCKET_REDIS_LOCK_TIMEOUT, | 
					
						
							| 
									
										
										
										
											2024-09-21 05:43:22 +08:00
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2024-12-09 08:01:56 +08:00
										 |  |  | from open_webui.utils.auth import decode_token | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  | from open_webui.socket.utils import RedisDict, RedisLock | 
					
						
							| 
									
										
										
										
											2024-06-04 14:39:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-22 08:14:59 +08:00
										 |  |  | from open_webui.env import ( | 
					
						
							|  |  |  |     GLOBAL_LOG_LEVEL, | 
					
						
							|  |  |  |     SRC_LOG_LEVELS, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL) | 
					
						
							|  |  |  | log = logging.getLogger(__name__) | 
					
						
							|  |  |  | log.setLevel(SRC_LOG_LEVELS["SOCKET"]) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-21 05:43:22 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | if WEBSOCKET_MANAGER == "redis": | 
					
						
							|  |  |  |     mgr = socketio.AsyncRedisManager(WEBSOCKET_REDIS_URL) | 
					
						
							| 
									
										
										
										
											2024-09-21 08:24:30 +08:00
										 |  |  |     sio = socketio.AsyncServer( | 
					
						
							|  |  |  |         cors_allowed_origins=[], | 
					
						
							|  |  |  |         async_mode="asgi", | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  |         transports=(["websocket"] if ENABLE_WEBSOCKET_SUPPORT else ["polling"]), | 
					
						
							| 
									
										
										
										
											2024-09-21 08:24:30 +08:00
										 |  |  |         allow_upgrades=ENABLE_WEBSOCKET_SUPPORT, | 
					
						
							|  |  |  |         always_connect=True, | 
					
						
							|  |  |  |         client_manager=mgr, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2024-09-21 05:43:22 +08:00
										 |  |  | else: | 
					
						
							|  |  |  |     sio = socketio.AsyncServer( | 
					
						
							|  |  |  |         cors_allowed_origins=[], | 
					
						
							|  |  |  |         async_mode="asgi", | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  |         transports=(["websocket"] if ENABLE_WEBSOCKET_SUPPORT else ["polling"]), | 
					
						
							| 
									
										
										
										
											2024-09-21 05:43:22 +08:00
										 |  |  |         allow_upgrades=ENABLE_WEBSOCKET_SUPPORT, | 
					
						
							|  |  |  |         always_connect=True, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  | # Timeout duration in seconds | 
					
						
							|  |  |  | TIMEOUT_DURATION = 3 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 21:41:23 +08:00
										 |  |  | # Dictionary to maintain the user pool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if WEBSOCKET_MANAGER == "redis": | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  |     log.debug("Using Redis to manage websockets.") | 
					
						
							| 
									
										
										
										
											2024-09-24 21:41:23 +08:00
										 |  |  |     SESSION_POOL = RedisDict("open-webui:session_pool", redis_url=WEBSOCKET_REDIS_URL) | 
					
						
							|  |  |  |     USER_POOL = RedisDict("open-webui:user_pool", redis_url=WEBSOCKET_REDIS_URL) | 
					
						
							|  |  |  |     USAGE_POOL = RedisDict("open-webui:usage_pool", redis_url=WEBSOCKET_REDIS_URL) | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     clean_up_lock = RedisLock( | 
					
						
							|  |  |  |         redis_url=WEBSOCKET_REDIS_URL, | 
					
						
							|  |  |  |         lock_name="usage_cleanup_lock", | 
					
						
							| 
									
										
										
										
											2025-03-01 08:02:15 +08:00
										 |  |  |         timeout_secs=WEBSOCKET_REDIS_LOCK_TIMEOUT, | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2024-12-20 06:15:02 +08:00
										 |  |  |     aquire_func = clean_up_lock.aquire_lock | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  |     renew_func = clean_up_lock.renew_lock | 
					
						
							|  |  |  |     release_func = clean_up_lock.release_lock | 
					
						
							| 
									
										
										
										
											2024-09-24 21:41:23 +08:00
										 |  |  | else: | 
					
						
							|  |  |  |     SESSION_POOL = {} | 
					
						
							|  |  |  |     USER_POOL = {} | 
					
						
							|  |  |  |     USAGE_POOL = {} | 
					
						
							| 
									
										
										
										
											2024-12-20 06:15:02 +08:00
										 |  |  |     aquire_func = release_func = renew_func = lambda: True | 
					
						
							| 
									
										
										
										
											2024-06-04 14:39:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-22 08:12:55 +08:00
										 |  |  | async def periodic_usage_pool_cleanup(): | 
					
						
							| 
									
										
										
										
											2024-12-20 06:15:02 +08:00
										 |  |  |     if not aquire_func(): | 
					
						
							| 
									
										
										
										
											2024-12-07 05:03:01 +08:00
										 |  |  |         log.debug("Usage pool cleanup lock already exists. Not running it.") | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     log.debug("Running periodic_usage_pool_cleanup") | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         while True: | 
					
						
							|  |  |  |             if not renew_func(): | 
					
						
							|  |  |  |                 log.error(f"Unable to renew cleanup lock. Exiting usage pool cleanup.") | 
					
						
							|  |  |  |                 raise Exception("Unable to renew usage pool cleanup lock.") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             now = int(time.time()) | 
					
						
							|  |  |  |             send_usage = False | 
					
						
							|  |  |  |             for model_id, connections in list(USAGE_POOL.items()): | 
					
						
							|  |  |  |                 # Creating a list of sids to remove if they have timed out | 
					
						
							|  |  |  |                 expired_sids = [ | 
					
						
							|  |  |  |                     sid | 
					
						
							|  |  |  |                     for sid, details in connections.items() | 
					
						
							|  |  |  |                     if now - details["updated_at"] > TIMEOUT_DURATION | 
					
						
							|  |  |  |                 ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 for sid in expired_sids: | 
					
						
							|  |  |  |                     del connections[sid] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if not connections: | 
					
						
							|  |  |  |                     log.debug(f"Cleaning up model {model_id} from usage pool") | 
					
						
							|  |  |  |                     del USAGE_POOL[model_id] | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     USAGE_POOL[model_id] = connections | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 send_usage = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if send_usage: | 
					
						
							|  |  |  |                 # Emit updated usage information after cleaning | 
					
						
							|  |  |  |                 await sio.emit("usage", {"models": get_models_in_use()}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             await asyncio.sleep(TIMEOUT_DURATION) | 
					
						
							|  |  |  |     finally: | 
					
						
							|  |  |  |         release_func() | 
					
						
							| 
									
										
										
										
											2024-09-22 08:12:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 21:31:55 +08:00
										 |  |  | app = socketio.ASGIApp( | 
					
						
							|  |  |  |     sio, | 
					
						
							|  |  |  |     socketio_path="/ws/socket.io", | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-22 08:12:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | def get_models_in_use(): | 
					
						
							|  |  |  |     # List models that are currently in use | 
					
						
							|  |  |  |     models_in_use = list(USAGE_POOL.keys()) | 
					
						
							|  |  |  |     return models_in_use | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @sio.on("usage") | 
					
						
							|  |  |  | async def usage(sid, data): | 
					
						
							|  |  |  |     model_id = data["model"] | 
					
						
							|  |  |  |     # Record the timestamp for the last update | 
					
						
							|  |  |  |     current_time = int(time.time()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Store the new usage data and task | 
					
						
							|  |  |  |     USAGE_POOL[model_id] = { | 
					
						
							|  |  |  |         **(USAGE_POOL[model_id] if model_id in USAGE_POOL else {}), | 
					
						
							|  |  |  |         sid: {"updated_at": current_time}, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Broadcast the usage data to all clients | 
					
						
							|  |  |  |     await sio.emit("usage", {"models": get_models_in_use()}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-04 14:39:52 +08:00
										 |  |  | @sio.event | 
					
						
							|  |  |  | async def connect(sid, environ, auth): | 
					
						
							|  |  |  |     user = None | 
					
						
							| 
									
										
										
										
											2024-06-04 15:45:56 +08:00
										 |  |  |     if auth and "token" in auth: | 
					
						
							|  |  |  |         data = decode_token(auth["token"]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if data is not None and "id" in data: | 
					
						
							|  |  |  |             user = Users.get_user_by_id(data["id"]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if user: | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  |             SESSION_POOL[sid] = user.model_dump() | 
					
						
							| 
									
										
										
										
											2024-06-08 08:35:01 +08:00
										 |  |  |             if user.id in USER_POOL: | 
					
						
							| 
									
										
										
										
											2024-12-20 05:46:30 +08:00
										 |  |  |                 USER_POOL[user.id] = USER_POOL[user.id] + [sid] | 
					
						
							| 
									
										
										
										
											2024-06-08 08:35:01 +08:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 USER_POOL[user.id] = [sid] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-12 21:13:21 +08:00
										 |  |  |             # print(f"user {user.name}({user.id}) connected with session ID {sid}") | 
					
						
							| 
									
										
										
										
											2024-12-27 15:29:33 +08:00
										 |  |  |             await sio.emit("user-list", {"user_ids": list(USER_POOL.keys())}) | 
					
						
							| 
									
										
										
										
											2024-06-05 02:38:31 +08:00
										 |  |  |             await sio.emit("usage", {"models": get_models_in_use()}) | 
					
						
							| 
									
										
										
										
											2024-06-04 16:10:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 00:52:27 +08:00
										 |  |  | @sio.on("user-join") | 
					
						
							|  |  |  | async def user_join(sid, data): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auth = data["auth"] if "auth" in data else None | 
					
						
							| 
									
										
										
										
											2024-08-03 21:24:26 +08:00
										 |  |  |     if not auth or "token" not in auth: | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-06-05 00:52:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-03 21:24:26 +08:00
										 |  |  |     data = decode_token(auth["token"]) | 
					
						
							|  |  |  |     if data is None or "id" not in data: | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-06-05 00:52:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-03 21:24:26 +08:00
										 |  |  |     user = Users.get_user_by_id(data["id"]) | 
					
						
							|  |  |  |     if not user: | 
					
						
							|  |  |  |         return | 
					
						
							| 
									
										
										
										
											2024-06-05 00:52:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  |     SESSION_POOL[sid] = user.model_dump() | 
					
						
							| 
									
										
										
										
											2024-08-03 21:24:26 +08:00
										 |  |  |     if user.id in USER_POOL: | 
					
						
							| 
									
										
										
										
											2024-12-20 05:46:30 +08:00
										 |  |  |         USER_POOL[user.id] = USER_POOL[user.id] + [sid] | 
					
						
							| 
									
										
										
										
											2024-08-03 21:24:26 +08:00
										 |  |  |     else: | 
					
						
							|  |  |  |         USER_POOL[user.id] = [sid] | 
					
						
							| 
									
										
										
										
											2024-06-08 08:35:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-23 10:40:01 +08:00
										 |  |  |     # Join all the channels | 
					
						
							|  |  |  |     channels = Channels.get_channels_by_user_id(user.id) | 
					
						
							|  |  |  |     log.debug(f"{channels=}") | 
					
						
							|  |  |  |     for channel in channels: | 
					
						
							|  |  |  |         await sio.enter_room(sid, f"channel:{channel.id}") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-12 21:13:21 +08:00
										 |  |  |     # print(f"user {user.name}({user.id}) connected with session ID {sid}") | 
					
						
							| 
									
										
										
										
											2024-06-05 00:52:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 15:29:33 +08:00
										 |  |  |     await sio.emit("user-list", {"user_ids": list(USER_POOL.keys())}) | 
					
						
							| 
									
										
										
										
											2024-12-25 17:32:47 +08:00
										 |  |  |     return {"id": user.id, "name": user.name} | 
					
						
							| 
									
										
										
										
											2024-06-05 00:52:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-24 05:00:58 +08:00
										 |  |  | @sio.on("join-channels") | 
					
						
							|  |  |  | async def join_channel(sid, data): | 
					
						
							|  |  |  |     auth = data["auth"] if "auth" in data else None | 
					
						
							|  |  |  |     if not auth or "token" not in auth: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     data = decode_token(auth["token"]) | 
					
						
							|  |  |  |     if data is None or "id" not in data: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     user = Users.get_user_by_id(data["id"]) | 
					
						
							|  |  |  |     if not user: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Join all the channels | 
					
						
							|  |  |  |     channels = Channels.get_channels_by_user_id(user.id) | 
					
						
							|  |  |  |     log.debug(f"{channels=}") | 
					
						
							|  |  |  |     for channel in channels: | 
					
						
							|  |  |  |         await sio.enter_room(sid, f"channel:{channel.id}") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  | @sio.on("channel-events") | 
					
						
							|  |  |  | async def channel_events(sid, data): | 
					
						
							|  |  |  |     room = f"channel:{data['channel_id']}" | 
					
						
							|  |  |  |     participants = sio.manager.get_participants( | 
					
						
							|  |  |  |         namespace="/", | 
					
						
							|  |  |  |         room=room, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sids = [sid for sid, _ in participants] | 
					
						
							|  |  |  |     if sid not in sids: | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     event_data = data["data"] | 
					
						
							|  |  |  |     event_type = event_data["type"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if event_type == "typing": | 
					
						
							|  |  |  |         await sio.emit( | 
					
						
							|  |  |  |             "channel-events", | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "channel_id": data["channel_id"], | 
					
						
							| 
									
										
										
										
											2024-12-31 16:51:43 +08:00
										 |  |  |                 "message_id": data.get("message_id", None), | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  |                 "data": event_data, | 
					
						
							|  |  |  |                 "user": UserNameResponse(**SESSION_POOL[sid]).model_dump(), | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             room=room, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 15:29:33 +08:00
										 |  |  | @sio.on("user-list") | 
					
						
							|  |  |  | async def user_list(sid): | 
					
						
							|  |  |  |     await sio.emit("user-list", {"user_ids": list(USER_POOL.keys())}) | 
					
						
							| 
									
										
										
										
											2024-06-05 02:13:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-04 14:39:52 +08:00
										 |  |  | @sio.event | 
					
						
							| 
									
										
										
										
											2024-06-04 16:10:31 +08:00
										 |  |  | async def disconnect(sid): | 
					
						
							| 
									
										
										
										
											2024-06-08 12:38:09 +08:00
										 |  |  |     if sid in SESSION_POOL: | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  |         user = SESSION_POOL[sid] | 
					
						
							| 
									
										
										
										
											2024-06-08 12:38:09 +08:00
										 |  |  |         del SESSION_POOL[sid] | 
					
						
							| 
									
										
										
										
											2024-06-08 08:35:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  |         user_id = user["id"] | 
					
						
							| 
									
										
										
										
											2024-09-22 08:12:55 +08:00
										 |  |  |         USER_POOL[user_id] = [_sid for _sid in USER_POOL[user_id] if _sid != sid] | 
					
						
							| 
									
										
										
										
											2024-06-08 12:38:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if len(USER_POOL[user_id]) == 0: | 
					
						
							|  |  |  |             del USER_POOL[user_id] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 15:29:33 +08:00
										 |  |  |         await sio.emit("user-list", {"user_ids": list(USER_POOL.keys())}) | 
					
						
							| 
									
										
										
										
											2024-06-04 14:39:52 +08:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2024-09-12 21:13:21 +08:00
										 |  |  |         pass | 
					
						
							|  |  |  |         # print(f"Unknown session ID {sid} disconnected") | 
					
						
							| 
									
										
										
										
											2024-07-12 01:40:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 20:35:02 +08:00
										 |  |  | def get_event_emitter(request_info): | 
					
						
							| 
									
										
										
										
											2024-07-12 01:40:10 +08:00
										 |  |  |     async def __event_emitter__(event_data): | 
					
						
							| 
									
										
										
										
											2024-12-19 17:00:32 +08:00
										 |  |  |         user_id = request_info["user_id"] | 
					
						
							| 
									
										
										
										
											2024-12-20 05:11:44 +08:00
										 |  |  |         session_ids = list( | 
					
						
							|  |  |  |             set(USER_POOL.get(user_id, []) + [request_info["session_id"]]) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-12-19 17:00:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         for session_id in session_ids: | 
					
						
							|  |  |  |             await sio.emit( | 
					
						
							|  |  |  |                 "chat-events", | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2025-02-13 16:34:45 +08:00
										 |  |  |                     "chat_id": request_info.get("chat_id", None), | 
					
						
							|  |  |  |                     "message_id": request_info.get("message_id", None), | 
					
						
							| 
									
										
										
										
											2024-12-19 17:00:32 +08:00
										 |  |  |                     "data": event_data, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 to=session_id, | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2024-07-12 01:40:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-25 09:03:14 +08:00
										 |  |  |         if "type" in event_data and event_data["type"] == "status": | 
					
						
							|  |  |  |             Chats.add_message_status_to_chat_by_id_and_message_id( | 
					
						
							|  |  |  |                 request_info["chat_id"], | 
					
						
							|  |  |  |                 request_info["message_id"], | 
					
						
							|  |  |  |                 event_data.get("data", {}), | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-29 11:31:03 +08:00
										 |  |  |         if "type" in event_data and event_data["type"] == "message": | 
					
						
							|  |  |  |             message = Chats.get_message_by_id_and_message_id( | 
					
						
							|  |  |  |                 request_info["chat_id"], | 
					
						
							|  |  |  |                 request_info["message_id"], | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             content = message.get("content", "") | 
					
						
							|  |  |  |             content += event_data.get("data", {}).get("content", "") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Chats.upsert_message_to_chat_by_id_and_message_id( | 
					
						
							|  |  |  |                 request_info["chat_id"], | 
					
						
							|  |  |  |                 request_info["message_id"], | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "content": content, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if "type" in event_data and event_data["type"] == "replace": | 
					
						
							|  |  |  |             content = event_data.get("data", {}).get("content", "") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Chats.upsert_message_to_chat_by_id_and_message_id( | 
					
						
							|  |  |  |                 request_info["chat_id"], | 
					
						
							|  |  |  |                 request_info["message_id"], | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "content": content, | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-12 01:40:10 +08:00
										 |  |  |     return __event_emitter__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 20:35:02 +08:00
										 |  |  | def get_event_call(request_info): | 
					
						
							| 
									
										
										
										
											2025-02-03 11:24:07 +08:00
										 |  |  |     async def __event_caller__(event_data): | 
					
						
							| 
									
										
										
										
											2024-07-12 01:40:10 +08:00
										 |  |  |         response = await sio.call( | 
					
						
							|  |  |  |             "chat-events", | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-02-13 16:34:45 +08:00
										 |  |  |                 "chat_id": request_info.get("chat_id", None), | 
					
						
							|  |  |  |                 "message_id": request_info.get("message_id", None), | 
					
						
							| 
									
										
										
										
											2024-07-12 01:40:10 +08:00
										 |  |  |                 "data": event_data, | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             to=request_info["session_id"], | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         return response | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-03 11:24:07 +08:00
										 |  |  |     return __event_caller__ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | get_event_caller = get_event_call | 
					
						
							| 
									
										
										
										
											2024-12-21 14:54:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_user_id_from_session_pool(sid): | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  |     user = SESSION_POOL.get(sid) | 
					
						
							|  |  |  |     if user: | 
					
						
							|  |  |  |         return user["id"] | 
					
						
							|  |  |  |     return None | 
					
						
							| 
									
										
										
										
											2024-12-25 15:57:39 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_user_ids_from_room(room): | 
					
						
							|  |  |  |     active_session_ids = sio.manager.get_participants( | 
					
						
							|  |  |  |         namespace="/", | 
					
						
							|  |  |  |         room=room, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     active_user_ids = list( | 
					
						
							| 
									
										
										
										
											2024-12-27 13:51:09 +08:00
										 |  |  |         set( | 
					
						
							|  |  |  |             [SESSION_POOL.get(session_id[0])["id"] for session_id in active_session_ids] | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2024-12-25 15:57:39 +08:00
										 |  |  |     ) | 
					
						
							|  |  |  |     return active_user_ids | 
					
						
							| 
									
										
										
										
											2024-12-27 15:29:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_active_status_by_user_id(user_id): | 
					
						
							|  |  |  |     if user_id in USER_POOL: | 
					
						
							|  |  |  |         return True | 
					
						
							|  |  |  |     return False |