diff --git a/src/snek/service/channel_member.py b/src/snek/service/channel_member.py index 407d0b7..f34f08b 100644 --- a/src/snek/service/channel_member.py +++ b/src/snek/service/channel_member.py @@ -28,7 +28,6 @@ class ChannelMemberService(BaseService): model["is_read_only"] = is_read_only model["is_muted"] = is_muted model["is_banned"] = is_banned - print(model.record, flush=True) if await self.save(model): return model raise Exception(f"Failed to create channel member: {model.errors}.") @@ -42,13 +41,9 @@ class ChannelMemberService(BaseService): channel_member = await self.get(channel_uid=channel_uid, user_uid=user_uid) channel = await self.services.channel.get(uid=channel_member['channel_uid']) if channel["tag"] != "dm": - print("NONT!\n", flush=True) return None - print("YEAHH",flush=True) async for model in self.services.channel_member.find(channel_uid=channel_uid): - print("huh!!!",model['uid'],flush=True) if model["uid"] != channel_member['uid']: - print("GOOOD!!",flush=True) return await self.services.user.get(uid=model["user_uid"]) async def create_dm(self,channel_uid, from_user_uid, to_user_uid): diff --git a/src/snek/service/channel_message.py b/src/snek/service/channel_message.py index 7607f03..c421b5e 100644 --- a/src/snek/service/channel_message.py +++ b/src/snek/service/channel_message.py @@ -38,7 +38,6 @@ class ChannelMessageService(BaseService): async def to_extended_dict(self, message): user = await self.services.user.get(uid=message["user_uid"]) if not user: - print("User not found!", flush=True) return {} return { "uid": message["uid"], @@ -52,10 +51,11 @@ class ChannelMessageService(BaseService): "username": user['username'] } - async def offset(self, channel_uid, offset=0): + async def offset(self, channel_uid, page=0, page_size=30): results = [] + offset = page * page_size try: - async for model in self.query("SELECT * FROM channel_message WHERE channel_uid=:channel_uid ORDER BY created_at DESC LIMIT 60 OFFSET :offset",dict(channel_uid=channel_uid, offset=offset)): + async for model in self.query("SELECT * FROM channel_message WHERE channel_uid=:channel_uid ORDER BY created_at DESC LIMIT :page_size OFFSET :offset",dict(channel_uid=channel_uid, page_size=page_size, offset=offset)): results.append(model) except: pass diff --git a/src/snek/service/socket.py b/src/snek/service/socket.py index b058044..a0f1e9b 100644 --- a/src/snek/service/socket.py +++ b/src/snek/service/socket.py @@ -1,4 +1,4 @@ - +from snek.model.user import UserModel from snek.system.service import BaseService @@ -6,35 +6,58 @@ from snek.system.service import BaseService class SocketService(BaseService): - def __init__(self, app): - super().__init__(app) - self.sockets = set() - self.subscriptions = {} + class Socket: + def __init__(self, ws, user: UserModel): + self.ws = ws + self.is_connected = True + self.user = user - async def add(self, ws): - self.sockets.add(ws) - - async def subscribe(self, ws, channel_uid): - if not channel_uid in self.subscriptions: - self.subscriptions[channel_uid] = set() - self.subscriptions[channel_uid].add(ws) - - async def broadcast(self, channel_uid, message): - print("BROADCAT!",message) - count = 0 - subscriptions = set(self.subscriptions.get(channel_uid,[])) - for ws in subscriptions: + async def send_json(self, data): + if not self.is_connected: + return False try: - await ws.send_json(message) + await self.ws.send_json(data) except Exception as ex: print(ex,flush=True) - print("Deleting socket.",flush=True) - self.subscriptions[channel_uid].remove(ws) + self.is_connected = False + return True + + async def close(self): + if not self.is_connected: + return True + + await self.ws.close() + self.is_connected = False + + return True + + + def __init__(self, app): + super().__init__(app) + self.sockets = [] + self.subscriptions = {} + + async def add(self, ws, user_uid): + self.sockets.append(self.Socket(ws, await self.app.services.user.get(uid=user_uid))) + + async def subscribe(self, ws,channel_uid, user_uid): + if not channel_uid in self.subscriptions: + self.subscriptions[channel_uid] = set() + s = self.Socket(ws,await self.app.services.user.get(uid=user_uid)) + self.subscriptions[channel_uid].add(s) + + async def broadcast(self, channel_uid, message): + count = 0 + subscriptions = set(self.subscriptions.get(channel_uid,[])) + for s in subscriptions: + if not await s.send_json(message): + self.subscriptions[channel_uid].remove(s) continue count += 1 return count async def delete(self, ws): - try: - self.sockets.remove(ws) - except : - pass + for s in self.sockets: + if s.ws == ws: + await s.close() + self.sockets.remove(s) + \ No newline at end of file diff --git a/src/snek/system/http.py b/src/snek/system/http.py index cd8a9b1..a1e87a4 100644 --- a/src/snek/system/http.py +++ b/src/snek/system/http.py @@ -86,18 +86,17 @@ async def repair_links(base_url, html_content): async def is_html_content(content: bytes): + if not content: + return False try: content = content.decode(errors="ignore") except: pass marks = ["