11import asyncio
22import datetime
33import math
4+ import os
45from typing import Optional , cast
56
67import platformdirs
@@ -283,7 +284,22 @@ async def action_download(self):
283284
284285 download_path = platformdirs .user_downloads_path ()
285286 hashes = [msg .hash for msg in self .selected ]
286- filenames = [msg .text for msg in files ]
287+ filenames = []
288+ for msg in files :
289+ filename = msg .text
290+ # Remove invalid characters
291+ filename = "" .join (c for c in filename if c not in r'\/:*?"<>|' )
292+ if not filename :
293+ filename = msg .hash
294+ # Ensure the filename is unique
295+ file_path = os .path .join (download_path , filename )
296+ if os .path .exists (file_path ):
297+ base , ext = os .path .splitext (filename )
298+ i = 1
299+ while os .path .exists (os .path .join (download_path , f"{ base } ({ i } ){ ext } " )):
300+ i += 1
301+ filename = f"{ base } ({ i } ){ ext } "
302+ filenames .append (filename )
287303 await self .app .data .group .download_files (hashes , filenames , download_path )
288304
289305 @staticmethod
@@ -298,7 +314,7 @@ class ChatScreen(Screen):
298314 SCREEN_NAME = "Chat"
299315 CSS_PATH = "../../styles/chat.tcss"
300316
301- LIMIT = 100
317+ LIMIT = 10
302318
303319 BINDINGS = [("ctrl+s" , "select_msg" , "Select message" )]
304320
@@ -396,7 +412,7 @@ async def on_change_group(self, event: ListView.Selected) -> None:
396412 else :
397413 # A new group, we only get the newest LIMIT messages
398414 # from_id=0, old_to_new=False means pull the latest messages
399- gen = self .group .receive_text ( from_id = 0 , old_to_new = False , sync = False , limit = self .LIMIT )
415+ gen = self .group .receive_latest_text ( limit = self .LIMIT )
400416 msgs = [x async for x in gen ][::- 1 ]
401417 for msg in msgs :
402418 message = db .add_message (
@@ -442,8 +458,8 @@ async def on_no_more_message(self, _event: TopDetectingScroll.ScrolledToTop):
442458 else :
443459 # There's no more messages in the database, try to pull from server
444460 oldest_msgid = db .get_group_msgid (self .group .group_id , self .app .data .server_db .id , False )
445- gen = self .group .receive_text (from_id = oldest_msgid , old_to_new = False , sync = False , limit = self .LIMIT )
446- msgs = [x async for x in gen ][:: - 1 ]
461+ gen = self .group .receive_text (from_id = oldest_msgid , sync = False , limit = self .LIMIT )
462+ msgs = [x async for x in gen ]
447463 self .log (msgs )
448464 for msg in msgs :
449465 message = db .add_message (
@@ -605,23 +621,21 @@ async def get_messages(self, messages: VerticalScroll) -> None:
605621 group_id = self .group .group_id
606622
607623 while True :
608- latest_msgid = db .get_group_msgid (group_id , server_id )
609624 try :
610- gen = self .group .receive_text ( from_id = latest_msgid )
625+ gen = self .group .receive_new_text ( limit = self . LIMIT )
611626 async for message in gen :
612627 msg = db .add_message (
613628 server_id , group_id , message .type .value ,
614629 message .msg .replace ("\n " , "\n \n " ),
615630 datetime .datetime .fromtimestamp (int (message .time )), message .username ,
616631 message .msgid , message .hash
617632 )
618- db .update_group_msgid (group_id , server_id , message .msgid )
619633
620- if message .type != MessageType .Recall :
621- await self .add_message (messages , self .build_msg_from_db (msg ))
622- else :
623- db .recall_message (server_id , group_id , message .msgid )
624- await self .recall_message (messages , message .msgid )
634+ # if message.type != MessageType.Recall:
635+ await self .add_message (messages , self .build_msg_from_db (msg ))
636+ # else:
637+ # db.recall_message(server_id, group_id, message.msgid)
638+ # await self.recall_message(messages, message.msgid)
625639 except RuntimeError :
626640 pass
627641 except asyncio .CancelledError :
0 commit comments