This commit is contained in:
retoor 2025-08-18 22:28:14 +02:00
parent 486d78610c
commit 6f61fa323b
5 changed files with 53 additions and 54 deletions

View File

@ -1,3 +1,6 @@
import faulthandler
faulthandler.enable()
import asyncio
import logging
import pathlib
@ -24,7 +27,7 @@ from aiohttp_session import (
from aiohttp_session.cookie_storage import EncryptedCookieStorage
from app.app import Application as BaseApplication
from jinja2 import FileSystemLoader
from snek.system.session import SQLiteSessionStorage
from snek.forum import setup_forum
from snek.mapper import get_mappers
from snek.service import get_services
@ -151,7 +154,8 @@ class Application(BaseApplication):
**kwargs,
)
self.db = AsyncDataSet(kwargs["db_path"].replace("sqlite:///", ""))
session_setup(self, EncryptedCookieStorage(SESSION_KEY))
self.session_storage = SQLiteSessionStorage(SESSION_KEY)
session_setup(self, self.session_storage)
self.tasks = asyncio.Queue()
self._middlewares.append(session_middleware)
self._middlewares.append(auth_middleware)
@ -179,12 +183,17 @@ class Application(BaseApplication):
self.ip2location = IP2Location.IP2Location(
base_path.joinpath("IP2LOCATION-LITE-DB11.BIN")
)
self.on_startup.append(self.prepare_session_storage)
self.on_startup.append(self.prepare_stats)
self.on_startup.append(self.prepare_asyncio)
self.on_startup.append(self.start_user_availability_service)
self.on_startup.append(self.start_ssh_server)
# self.on_startup.append(self.prepare_database)
async def prepare_session_storage(self, app):
await self.session_storage.setup()
print("Session storage prepared", flush=True)
async def prepare_stats(self, app):
app["stats"] = create_stats_structure()
print("Stats prepared", flush=True)

View File

@ -12,8 +12,8 @@ class ChannelMemberService(BaseService):
async def get_user_uids(self, channel_uid):
async for model in self.mapper.query(
"SELECT user_uid FROM channel_member WHERE channel_uid=:channel_uid",
{"channel_uid": channel_uid},
"SELECT user_uid FROM channel_member WHERE channel_uid=?",
channel_uid
):
yield model["user_uid"]
@ -46,17 +46,16 @@ class ChannelMemberService(BaseService):
async def get_dm(self, from_user, to_user):
async for model in self.query(
"SELECT channel_member.* FROM channel_member INNER JOIN channel ON (channel.uid = channel_member.channel_uid and channel.tag = 'dm') INNER JOIN channel_member AS channel_member2 ON(channel_member2.channel_uid = channel.uid AND channel_member2.user_uid = :to_user) WHERE channel_member.user_uid=:from_user ",
{"from_user": from_user, "to_user": to_user},
"SELECT channel_member.* FROM channel_member INNER JOIN channel ON (channel.uid = channel_member.channel_uid and channel.tag = 'dm') INNER JOIN channel_member AS channel_member2 ON(channel_member2.channel_uid = channel.uid AND channel_member2.user_uid = ?) WHERE channel_member.user_uid=?",
to_user, from_user
):
return model
if not from_user == to_user:
return None
async for model in self.query(
"SELECT channel_member.* FROM channel_member INNER JOIN channel ON (channel.uid = channel_member.channel_uid and channel.tag = 'dm') LEFT JOIN channel_member AS channel_member2 ON(channel_member2.channel_uid = NULL AND channel_member2.user_uid = NULL) WHERE channel_member.user_uid=:from_user ",
{"from_user": from_user, "to_user": to_user},
"SELECT channel_member.* FROM channel_member INNER JOIN channel ON (channel.uid = channel_member.channel_uid and channel.tag = 'dm') LEFT JOIN channel_member AS channel_member2 ON(channel_member2.channel_uid IS NULL AND channel_member2.user_uid IS NULL) WHERE channel_member.user_uid=?",
to_user
):
return model
async def get_other_dm_user(self, channel_uid, user_uid):
@ -72,3 +71,4 @@ class ChannelMemberService(BaseService):
result = await self.create(channel_uid, from_user_uid)
await self.create(channel_uid, to_user_uid)
return result

View File

@ -12,7 +12,7 @@ class ChannelMessageService(BaseService):
self._configured_indexes = False
async def maintenance(self):
for message in self.mapper.db["channel_message"].find():
for message in await self.mapper.db.find("channel_message"):
print(message)
try:
message = await self.get(uid=message["uid"])
@ -21,8 +21,7 @@ class ChannelMessageService(BaseService):
html = message["html"]
await self.save(message)
self.mapper.db["channel_message"].upsert(
{
self.mapper.db.upsert("channel_message",{
"uid": message["uid"],
"updated_at": updated_at,
},
@ -78,18 +77,19 @@ class ChannelMessageService(BaseService):
if await super().save(model):
if not self._configured_indexes:
if not self.mapper.db["channel_message"].has_index(
["is_final", "user_uid", "channel_uid"]
):
self.mapper.db["channel_message"].create_index(
["is_final", "user_uid", "channel_uid"], unique=False
)
if not self.mapper.db["channel_message"].has_index(["uid"]):
self.mapper.db["channel_message"].create_index(["uid"], unique=True)
if not self.mapper.db["channel_message"].has_index(["deleted_at"]):
self.mapper.db["channel_message"].create_index(
["deleted_at"], unique=False
)
pass
#if not self.mapper.db["channel_message"].has_index(
# ["is_final", "user_uid", "channel_uid"]
#):
# self.mapper.db["channel_message"].create_index(
# ["is_final", "user_uid", "channel_uid"], unique=False
# )
#if not self.mapper.db["channel_message"].has_index(["uid"]):
# self.mapper.db["channel_message"].create_index(["uid"], unique=True)
#if not self.mapper.db["channel_message"].has_index(["deleted_at"]):
# self.mapper.db["channel_message"].create_index(
# ["deleted_at"], unique=False
#)
self._configured_indexes = True
return model
raise Exception(f"Failed to create channel message: {model.errors}.")
@ -99,10 +99,6 @@ class ChannelMessageService(BaseService):
if not user:
return {}
# if not message["html"].startswith("<chat-message"):
# message = await self.get(uid=message["uid"])
# await self.save(message)
return {
"uid": message["uid"],
"color": user["color"],
@ -138,40 +134,33 @@ class ChannelMessageService(BaseService):
return []
history_start_filter = ""
if channel["history_start"]:
history_start_filter = f" AND created_at > '{channel['history_start']}'"
history_start_filter = f" AND created_at > ?"
results = []
offset = page * page_size
try:
if timestamp:
async for model in self.query(
f"SELECT * FROM channel_message WHERE channel_uid=:channel_uid AND created_at < :timestamp {history_start_filter} ORDER BY created_at DESC LIMIT :page_size OFFSET :offset",
{
"channel_uid": channel_uid,
"page_size": page_size,
"offset": offset,
"timestamp": timestamp,
},
f"SELECT * FROM channel_message WHERE channel_uid=? AND created_at < ? {history_start_filter} ORDER BY created_at DESC LIMIT ? OFFSET ?",
channel_uid,
timestamp,
page_size,
offset
):
results.append(model)
elif page > 0:
async for model in self.query(
f"SELECT * FROM channel_message WHERE channel_uid=:channel_uid WHERE created_at < :timestamp {history_start_filter} ORDER BY created_at DESC LIMIT :page_size",
*{
"channel_uid": channel_uid,
"page_size": page_size,
"offset": offset,
"timestamp": timestamp,
}.values(),
f"SELECT * FROM channel_message WHERE channel_uid=? AND created_at < ? {history_start_filter} ORDER BY created_at DESC LIMIT ?",
channel_uid,
timestamp,
page_size
):
results.append(model)
else:
async for model in self.query(
f"SELECT * FROM channel_message WHERE channel_uid=:channel_uid {history_start_filter} ORDER BY created_at DESC LIMIT :page_size OFFSET :offset",
*{
"channel_uid": channel_uid,
"page_size": page_size,
"offset": offset,
}.values(),
f"SELECT * FROM channel_message WHERE channel_uid=? {history_start_filter} ORDER BY created_at DESC LIMIT ? OFFSET ?",
channel_uid,
page_size,
offset
):
results.append(model)
@ -179,3 +168,4 @@ class ChannelMessageService(BaseService):
print(ex)
results.sort(key=lambda x: x["created_at"])
return results

View File

@ -72,11 +72,9 @@ class ChatInputComponent extends NjetComponent {
focus() {
this.textarea.focus();
}
getAuthors() {
return this.users.flatMap((user) => [user.username, user.nick]);
return this.users && this.users.flatMap ? this.users.flatMap(user => [user.username, user.nick]).filter(Boolean) : [];
}
extractMentions(text) {
return Array.from(text.matchAll(/@([a-zA-Z0-9_-]+)/g), m => m[1]);
}
@ -254,6 +252,7 @@ textToLeetAdvanced(text) {
app.rpc.getRecentUsers(this.channelUid).then(users => {
this.users = users;
console.info(users)
});
this.messageUid = null;

View File

@ -525,6 +525,7 @@ class RPCView(BaseView):
except Exception as ex:
print(str(ex), flush=True)
logger.exception(ex)
traceback.print_exc()
await self._send_json(
{"callId": call_id, "success": False, "data": str(ex)}
)