7
7
from contextlib import suppress
8
8
from datetime import UTC , datetime
9
9
from gettext import ngettext
10
- from pathlib import Path
11
10
from typing import Any , Self , cast , override
12
11
13
12
from gi .repository import Gdk , Gio , GLib , GObject , Gtk
14
13
15
- from . import Notifier , Property , core , tasks
14
+ from . import Notifier , Property , tasks
16
15
from .core import client , messages , model
17
16
from .core .model import Address , WriteError
18
17
from .profile import Profile
@@ -255,14 +254,14 @@ class Message(GObject.Object):
255
254
@Property (bool )
256
255
def trashed (self ) -> bool :
257
256
"""Whether the item is in the trash."""
258
- from .store import settings
259
-
260
257
if self .can_discard or (not self ._message ):
261
258
return False
262
259
260
+ from . import store
261
+
263
262
return any (
264
263
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" )
266
265
)
267
266
268
267
def __init__ (self , message : model .Message | None = None , ** kwargs : Any ):
@@ -380,12 +379,12 @@ def set_from_message(self, msg: model.Message | None, /):
380
379
381
380
def trash (self ):
382
381
"""Move `self` to the trash."""
383
- from .store import settings_add
384
-
385
382
if not self ._message :
386
383
return
387
384
388
- settings_add (
385
+ from . import store
386
+
387
+ store .settings_add (
389
388
"trashed-messages" ,
390
389
f"{ self .unique_id } { datetime .now (UTC ).date ().isoformat ()} " ,
391
390
)
@@ -394,16 +393,16 @@ def trash(self):
394
393
395
394
def restore (self ):
396
395
"""Restore `self` from the trash."""
397
- from .store import settings
398
-
399
396
if not self ._message :
400
397
return
401
398
402
- settings .set_strv (
399
+ from . import store
400
+
401
+ store .settings .set_strv (
403
402
"trashed-messages" ,
404
403
tuple (
405
404
msg
406
- for msg in settings .get_strv ("trashed-messages" )
405
+ for msg in store . settings .get_strv ("trashed-messages" )
407
406
if msg .rsplit (maxsplit = 1 )[0 ] != self .unique_id
408
407
),
409
408
)
@@ -412,34 +411,29 @@ def restore(self):
412
411
413
412
def delete (self ):
414
413
"""Remove `self` from the trash."""
415
- from .store import broadcasts , inbox , sent , settings_add
416
-
417
414
if not self ._message :
418
415
return
419
416
420
- settings_add ( "deleted-messages" , self . unique_id )
417
+ from . import store
421
418
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
+ )
424
426
425
427
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 )
428
429
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
437
433
self .set_from_message (None )
438
434
439
435
async def discard (self ):
440
436
"""Discard `self` and its children."""
441
- from .store import outbox , sent
442
-
443
437
if not self ._message :
444
438
return
445
439
@@ -448,9 +442,11 @@ async def discard(self):
448
442
Notifier .send (_ ("Cannot discard message while sending" ))
449
443
return
450
444
451
- outbox .remove (ident := self .unique_id )
445
+ from . import store
446
+
447
+ store .outbox .remove (ident := self .unique_id )
452
448
with suppress (ValueError ):
453
- sent .remove (ident )
449
+ store . sent .remove (ident )
454
450
455
451
failed = False
456
452
for msg in self ._message , * self ._message .children :
@@ -463,16 +459,14 @@ async def discard(self):
463
459
failed = True
464
460
continue
465
461
466
- await outbox .update ()
467
- await sent .update ()
462
+ await store . outbox .update ()
463
+ await store . sent .update ()
468
464
469
465
def mark_read (self ):
470
466
"""Mark a message as read.
471
467
472
468
Does nothing if `message.new` is already `False`.
473
469
"""
474
- from .store import settings_discard
475
-
476
470
if not self .new :
477
471
return
478
472
@@ -481,20 +475,16 @@ def mark_read(self):
481
475
if not self ._message :
482
476
return
483
477
478
+ from . import store
479
+
484
480
self ._message .new = False
485
- settings_discard ("unread-messages" , self .unique_id )
481
+ store . settings_discard ("unread-messages" , self .unique_id )
486
482
487
483
def _update_trashed_state (self ):
488
484
self .can_trash = not (self .can_discard or self .trashed )
489
485
self .can_reply = self .can_discard or self .can_trash
490
486
self .notify ("trashed" )
491
487
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
-
498
488
499
489
async def send (
500
490
readers : Iterable [Address ],
@@ -511,8 +501,6 @@ async def send(
511
501
512
502
`attachments` is a dictionary of `Gio.File`s and filenames.
513
503
"""
514
- from .store import outbox , sent
515
-
516
504
Notifier ().sending = True
517
505
518
506
files = dict [model .AttachmentProperties , bytes ]()
@@ -536,7 +524,9 @@ async def send(
536
524
)
537
525
] = data
538
526
539
- outbox .add (
527
+ from . import store
528
+
529
+ store .outbox .add (
540
530
message := model .OutgoingMessage (
541
531
readers = list (readers ),
542
532
subject = subject ,
@@ -549,10 +539,10 @@ async def send(
549
539
try :
550
540
await messages .send (message )
551
541
except WriteError :
552
- outbox .remove (message .ident )
542
+ store . outbox .remove (message .ident )
553
543
Notifier .send (_ ("Failed to send message" ))
554
544
Notifier ().sending = False
555
545
raise
556
546
557
- sent .add (message )
547
+ store . sent .add (message )
558
548
Notifier ().sending = False
0 commit comments