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)
err = w.openSession(ctx)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("open WhatsApp session: %w", err)
}
if w.device.ID != nil {
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)
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:
err = w.loggedOut(ctx, l)
if err != nil {
- return err
+ return fmt.Errorf("handle WhatsApp logout: %w", err)
}
case request := <-w.requests:
cancel()
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.")
err = w.openSession(ctx)
if err != nil {
- return nil, err
+ return nil, fmt.Errorf("open new WhatsApp session: %w", err)
}
}