77from contextlib import suppress
88from datetime import UTC , datetime
99from gettext import ngettext
10- from pathlib import Path
1110from typing import Any , Self , cast , override
1211
1312from gi .repository import Gdk , Gio , GLib , GObject , Gtk
1413
15- from . import Notifier , Property , core , tasks
14+ from . import Notifier , Property , tasks
1615from .core import client , messages , model
1716from .core .model import Address , WriteError
1817from .profile import Profile
@@ -255,14 +254,14 @@ class Message(GObject.Object):
255254 @Property (bool )
256255 def trashed (self ) -> bool :
257256 """Whether the item is in the trash."""
258- from .store import settings
259-
260257 if self .can_discard or (not self ._message ):
261258 return False
262259
260+ from . import store
261+
263262 return any (
264263 msg .rsplit (maxsplit = 1 )[0 ] == self .unique_id
265- for msg in settings .get_strv ("trashed-messages" )
264+ for msg in store . settings .get_strv ("trashed-messages" )
266265 )
267266
268267 def __init__ (self , message : model .Message | None = None , ** kwargs : Any ):
@@ -380,12 +379,12 @@ def set_from_message(self, msg: model.Message | None, /):
380379
381380 def trash (self ):
382381 """Move `self` to the trash."""
383- from .store import settings_add
384-
385382 if not self ._message :
386383 return
387384
388- settings_add (
385+ from . import store
386+
387+ store .settings_add (
389388 "trashed-messages" ,
390389 f"{ self .unique_id } { datetime .now (UTC ).date ().isoformat ()} " ,
391390 )
@@ -394,16 +393,16 @@ def trash(self):
394393
395394 def restore (self ):
396395 """Restore `self` from the trash."""
397- from .store import settings
398-
399396 if not self ._message :
400397 return
401398
402- settings .set_strv (
399+ from . import store
400+
401+ store .settings .set_strv (
403402 "trashed-messages" ,
404403 tuple (
405404 msg
406- for msg in settings .get_strv ("trashed-messages" )
405+ for msg in store . settings .get_strv ("trashed-messages" )
407406 if msg .rsplit (maxsplit = 1 )[0 ] != self .unique_id
408407 ),
409408 )
@@ -412,34 +411,29 @@ def restore(self):
412411
413412 def delete (self ):
414413 """Remove `self` from the trash."""
415- from .store import broadcasts , inbox , sent , settings_add
416-
417414 if not self ._message :
418415 return
419416
420- settings_add ( "deleted-messages" , self . unique_id )
417+ from . import store
421418
422- envelopes_dir = self ._get_data_dir ("envelopes" , self ._message )
423- messages_dir = self ._get_data_dir ("messages" , self ._message )
419+ model = (
420+ store .sent
421+ if self ._message .author == client .user .address
422+ else store .broadcasts
423+ if self ._message .is_broadcast
424+ else store .inbox
425+ )
424426
425427 for child in self ._message , * self ._message .children :
426- (envelopes_dir / f"{ child .ident } .json" ).unlink (missing_ok = True )
427- (messages_dir / child .ident ).unlink (missing_ok = True )
428+ messages .remove_from_disk (child )
428429
429- (
430- sent
431- if self ._message .author == client .user .address
432- else broadcasts
433- if self ._message .is_broadcast
434- else inbox
435- ).remove (self .unique_id )
436- self .restore ()
430+ store .settings_add ("deleted-messages" , self .unique_id )
431+ model .remove (self .unique_id )
432+ self .restore () # Since it is deleted, there is no reason to keep it in trash
437433 self .set_from_message (None )
438434
439435 async def discard (self ):
440436 """Discard `self` and its children."""
441- from .store import outbox , sent
442-
443437 if not self ._message :
444438 return
445439
@@ -448,9 +442,11 @@ async def discard(self):
448442 Notifier .send (_ ("Cannot discard message while sending" ))
449443 return
450444
451- outbox .remove (ident := self .unique_id )
445+ from . import store
446+
447+ store .outbox .remove (ident := self .unique_id )
452448 with suppress (ValueError ):
453- sent .remove (ident )
449+ store . sent .remove (ident )
454450
455451 failed = False
456452 for msg in self ._message , * self ._message .children :
@@ -463,16 +459,14 @@ async def discard(self):
463459 failed = True
464460 continue
465461
466- await outbox .update ()
467- await sent .update ()
462+ await store . outbox .update ()
463+ await store . sent .update ()
468464
469465 def mark_read (self ):
470466 """Mark a message as read.
471467
472468 Does nothing if `message.new` is already `False`.
473469 """
474- from .store import settings_discard
475-
476470 if not self .new :
477471 return
478472
@@ -481,20 +475,16 @@ def mark_read(self):
481475 if not self ._message :
482476 return
483477
478+ from . import store
479+
484480 self ._message .new = False
485- settings_discard ("unread-messages" , self .unique_id )
481+ store . settings_discard ("unread-messages" , self .unique_id )
486482
487483 def _update_trashed_state (self ):
488484 self .can_trash = not (self .can_discard or self .trashed )
489485 self .can_reply = self .can_discard or self .can_trash
490486 self .notify ("trashed" )
491487
492- @staticmethod
493- def _get_data_dir (name : str , message : model .Message ) -> Path :
494- host , local = message .author .host_part , message .author .local_part
495- suffix = "broadcasts" if message .is_broadcast else ""
496- return core .data_dir / name / host / local / suffix
497-
498488
499489async def send (
500490 readers : Iterable [Address ],
@@ -511,8 +501,6 @@ async def send(
511501
512502 `attachments` is a dictionary of `Gio.File`s and filenames.
513503 """
514- from .store import outbox , sent
515-
516504 Notifier ().sending = True
517505
518506 files = dict [model .AttachmentProperties , bytes ]()
@@ -536,7 +524,9 @@ async def send(
536524 )
537525 ] = data
538526
539- outbox .add (
527+ from . import store
528+
529+ store .outbox .add (
540530 message := model .OutgoingMessage (
541531 readers = list (readers ),
542532 subject = subject ,
@@ -549,10 +539,10 @@ async def send(
549539 try :
550540 await messages .send (message )
551541 except WriteError :
552- outbox .remove (message .ident )
542+ store . outbox .remove (message .ident )
553543 Notifier .send (_ ("Failed to send message" ))
554544 Notifier ().sending = False
555545 raise
556546
557- sent .add (message )
547+ store . sent .add (message )
558548 Notifier ().sending = False
0 commit comments