]> git.giacomolli.uk - onechat/blobdiff - whatsapp.go
Add local context to chat operation failures
[onechat] / whatsapp.go
index df43e8e3d9b6026377e0eba90f3874b91b9277b1..27dd3c3e88a706ee2e6a18e4ad32930c522d736c 100644 (file)
@@ -197,7 +197,7 @@ func openWhatsApp(ctx context.Context, dir string, clock func() time.Time, logge
 
        w.state, err = openWhatsAppState(filepath.Join(w.dir, whatsappStateFileName))
        if err != nil {
-               return nil, err
+               return nil, fmt.Errorf("open WhatsApp state: %w", err)
        }
 
        w.inbox = newWhatsAppInbox(w.state, clock, w.groups, &ImageStore{dir: filepath.Join(dir, imageDirName)}, logger)
@@ -217,7 +217,7 @@ func openWhatsApp(ctx context.Context, dir string, clock func() time.Time, logge
 
        err = w.openSession(ctx)
        if err != nil {
-               return nil, err
+               return nil, fmt.Errorf("open WhatsApp session: %w", err)
        }
 
        if w.device.ID != nil {
@@ -239,7 +239,7 @@ func (w *WhatsApp) sessionPath() string {
 func (w *WhatsApp) openSession(ctx context.Context) error {
        address, err := whatsappSessionAddress(w.sessionPath())
        if err != nil {
-               return err
+               return fmt.Errorf("find WhatsApp session address: %w", err)
        }
 
        container, err := sqlstore.New(ctx, "sqlite", address, waLog.Noop)
@@ -323,14 +323,18 @@ func (w *WhatsApp) Run(ctx context.Context, l *TurnLoop, notify func(Event)) err
        for {
                err := w.inbox.deliver(ctx, l, w.link(), false)
                if err != nil {
-                       return err
+                       return fmt.Errorf("deliver WhatsApp inbox: %w", err)
                }
 
                select {
                case <-ctx.Done():
                        return nil
                case err = <-w.inbox.failures:
-                       return err
+                       if err != nil {
+                               return fmt.Errorf("receive WhatsApp inbox: %w", err)
+                       }
+
+                       return nil
                case <-w.inbox.wake:
                case <-w.inbox.due():
                case <-retry:
@@ -340,7 +344,7 @@ func (w *WhatsApp) Run(ctx context.Context, l *TurnLoop, notify func(Event)) err
 
                        err = w.loggedOut(ctx, l)
                        if err != nil {
-                               return err
+                               return fmt.Errorf("handle WhatsApp logout: %w", err)
                        }
                case request := <-w.requests:
                        cancel()
@@ -355,7 +359,7 @@ func (w *WhatsApp) Run(ctx context.Context, l *TurnLoop, notify func(Event)) err
 
                                err = w.unlink(ctx, l, request.answer)
                                if err != nil {
-                                       return err
+                                       return fmt.Errorf("unlink WhatsApp: %w", err)
                                }
                        case w.isLinked():
                                request.answer("WhatsApp is linked already. Run /whatsapp unlink first.")
@@ -885,7 +889,7 @@ func (w *WhatsApp) newDevice(ctx context.Context) (*store.Device, error) {
 
                err = w.openSession(ctx)
                if err != nil {
-                       return nil, err
+                       return nil, fmt.Errorf("open new WhatsApp session: %w", err)
                }
        }