diff --git a/src/cmd/root.go b/src/cmd/root.go index 42d42a2..750ac5f 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "embed" "fmt" "log" @@ -230,8 +231,9 @@ func runRest(_ *cobra.Command, _ []string) { })) } - db := whatsapp.InitWaDB() - cli := whatsapp.InitWaCLI(db) + ctx := context.Background() + db := whatsapp.InitWaDB(ctx) + cli := whatsapp.InitWaCLI(ctx, db) // Service appService := services.NewAppService(cli, db) diff --git a/src/config/settings.go b/src/config/settings.go index e5aaa6f..7c967d9 100644 --- a/src/config/settings.go +++ b/src/config/settings.go @@ -5,7 +5,7 @@ import ( ) var ( - AppVersion = "v5.6.1" + AppVersion = "v5.6.2" AppPort = "3000" AppDebug = false AppOs = "AldinoKemal" diff --git a/src/go.mod b/src/go.mod index 9cd323f..c9ce1a2 100644 --- a/src/go.mod +++ b/src/go.mod @@ -7,7 +7,7 @@ require ( github.com/disintegration/imaging v1.6.2 github.com/dustin/go-humanize v1.0.1 github.com/go-ozzo/ozzo-validation/v4 v4.3.0 - github.com/gofiber/fiber/v2 v2.52.6 + github.com/gofiber/fiber/v2 v2.52.8 github.com/gofiber/template/html/v2 v2.1.3 github.com/gofiber/websocket/v2 v2.2.1 github.com/google/uuid v1.6.0 @@ -19,8 +19,8 @@ require ( github.com/spf13/viper v1.20.1 github.com/stretchr/testify v1.10.0 github.com/valyala/fasthttp v1.62.0 - go.mau.fi/libsignal v0.1.2 - go.mau.fi/whatsmeow v0.0.0-20250501130609-4c93ee4e6efa + go.mau.fi/libsignal v0.2.0 + go.mau.fi/whatsmeow v0.0.0-20250521125706-91ac75c2f61a golang.org/x/image v0.27.0 google.golang.org/protobuf v1.36.6 ) @@ -55,7 +55,7 @@ require ( github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - go.mau.fi/util v0.8.6 // indirect + go.mau.fi/util v0.8.7 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.38.0 // indirect golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect diff --git a/src/go.sum b/src/go.sum index 7693be3..7f9a58b 100644 --- a/src/go.sum +++ b/src/go.sum @@ -36,6 +36,8 @@ github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlnd github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.52.6 h1:Rfp+ILPiYSvvVuIPvxrBns+HJp8qGLDnLJawAu27XVI= github.com/gofiber/fiber/v2 v2.52.6/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofiber/fiber/v2 v2.52.8 h1:xl4jJQ0BV5EJTA2aWiKw/VddRpHrKeZLF0QPUxqn0x4= +github.com/gofiber/fiber/v2 v2.52.8/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/gofiber/template v1.8.3 h1:hzHdvMwMo/T2kouz2pPCA0zGiLCeMnoGsQZBTSYgZxc= github.com/gofiber/template v1.8.3/go.mod h1:bs/2n0pSNPOkRa5VJ8zTIvedcI/lEYxzV3+YPXdBvq8= github.com/gofiber/template/html/v2 v2.1.3 h1:n1LYBtmr9C0V/k/3qBblXyMxV5B0o/gpb6dFLp8ea+o= @@ -144,8 +146,12 @@ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3i github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mau.fi/libsignal v0.1.2 h1:Vs16DXWxSKyzVtI+EEXLCSy5pVWzzCzp/2eqFGvLyP0= go.mau.fi/libsignal v0.1.2/go.mod h1:JpnLSSJptn/s1sv7I56uEMywvz8x4YzxeF5OzdPb6PE= +go.mau.fi/libsignal v0.2.0 h1:oRXj3OHhEJq51BFEM8/50UZblmWiTYH93hsNTPcbk90= +go.mau.fi/libsignal v0.2.0/go.mod h1:tvjoDsMejgT38CXTXwqaYu8itBiY8O2Mb6biWvZBb9k= go.mau.fi/util v0.8.6 h1:AEK13rfgtiZJL2YsNK+W4ihhYCuukcRom8WPP/w/L54= go.mau.fi/util v0.8.6/go.mod h1:uNB3UTXFbkpp7xL1M/WvQks90B/L4gvbLpbS0603KOE= +go.mau.fi/util v0.8.7 h1:ywKarPxouJQEEijTs4mPlxC7F4AWEKokEpWc+2TYy6c= +go.mau.fi/util v0.8.7/go.mod h1:j6R3cENakc1f8HpQeFl0N15UiSTcNmIfDBNJUbL71RY= go.mau.fi/whatsmeow v0.0.0-20250318233852-06705625cf82 h1:AZlDkXHgoQNW4gd2hnTCvPH7hYznmwc3gPaYqGZ5w8A= go.mau.fi/whatsmeow v0.0.0-20250318233852-06705625cf82/go.mod h1:WNhj4JeQ6YR6dUOEiCXKqmE4LavSFkwRoKmu4atRrRs= go.mau.fi/whatsmeow v0.0.0-20250402091807-b0caa1b76088 h1:ns6nk2NjqdaQnCKrp+Qqwpf+3OI7+nnH56D71+7XzOM= @@ -154,6 +160,8 @@ go.mau.fi/whatsmeow v0.0.0-20250417131650-164ddf482526 h1:i9w16FdM3zmOWdF5nh1l2M go.mau.fi/whatsmeow v0.0.0-20250417131650-164ddf482526/go.mod h1:NlPtoLdpX3RnltqCTCZQ6kIUfprqLirtSK1gHvwoNx0= go.mau.fi/whatsmeow v0.0.0-20250501130609-4c93ee4e6efa h1:+bQKfMtnhX2jVoCSaneH4Ctk51IVT1K2gvjyqfFjVW0= go.mau.fi/whatsmeow v0.0.0-20250501130609-4c93ee4e6efa/go.mod h1:NlPtoLdpX3RnltqCTCZQ6kIUfprqLirtSK1gHvwoNx0= +go.mau.fi/whatsmeow v0.0.0-20250521125706-91ac75c2f61a h1:PYtzz5wdma64I47CiquGicyubzg3HIPkH/jMzpmHu8g= +go.mau.fi/whatsmeow v0.0.0-20250521125706-91ac75c2f61a/go.mod h1:Qy3L3BNBcnxfrAQ09lmFMa0ItZfg8zl9DzxKrptzfU4= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= diff --git a/src/pkg/whatsapp/init.go b/src/pkg/whatsapp/init.go index f5ecc4f..3f28c1a 100644 --- a/src/pkg/whatsapp/init.go +++ b/src/pkg/whatsapp/init.go @@ -53,11 +53,11 @@ var ( ) // InitWaDB initializes the WhatsApp database connection -func InitWaDB() *sqlstore.Container { +func InitWaDB(ctx context.Context) *sqlstore.Container { log = waLog.Stdout("Main", config.WhatsappLogLevel, true) dbLog := waLog.Stdout("Database", config.WhatsappLogLevel, true) - storeContainer, err := initDatabase(dbLog) + storeContainer, err := initDatabase(ctx, dbLog) if err != nil { log.Errorf("Database initialization error: %v", err) panic(pkgError.InternalServerError(fmt.Sprintf("Database initialization error: %v", err))) @@ -67,19 +67,19 @@ func InitWaDB() *sqlstore.Container { } // initDatabase creates and returns a database store container based on the configured URI -func initDatabase(dbLog waLog.Logger) (*sqlstore.Container, error) { +func initDatabase(ctx context.Context, dbLog waLog.Logger) (*sqlstore.Container, error) { if strings.HasPrefix(config.DBURI, "file:") { - return sqlstore.New("sqlite3", config.DBURI, dbLog) + return sqlstore.New(ctx, "sqlite3", config.DBURI, dbLog) } else if strings.HasPrefix(config.DBURI, "postgres:") { - return sqlstore.New("postgres", config.DBURI, dbLog) + return sqlstore.New(ctx, "postgres", config.DBURI, dbLog) } return nil, fmt.Errorf("unknown database type: %s. Currently only sqlite3(file:) and postgres are supported", config.DBURI) } // InitWaCLI initializes the WhatsApp client -func InitWaCLI(storeContainer *sqlstore.Container) *whatsmeow.Client { - device, err := storeContainer.GetFirstDevice() +func InitWaCLI(ctx context.Context, storeContainer *sqlstore.Container) *whatsmeow.Client { + device, err := storeContainer.GetFirstDevice(ctx) if err != nil { log.Errorf("Failed to get device: %v", err) panic(err) @@ -99,46 +99,48 @@ func InitWaCLI(storeContainer *sqlstore.Container) *whatsmeow.Client { cli = whatsmeow.NewClient(device, waLog.Stdout("Client", config.WhatsappLogLevel, true)) cli.EnableAutoReconnect = true cli.AutoTrustIdentity = true - cli.AddEventHandler(handler) + cli.AddEventHandler(func(rawEvt interface{}) { + handler(ctx, rawEvt) + }) return cli } // handler is the main event handler for WhatsApp events -func handler(rawEvt interface{}) { +func handler(ctx context.Context, rawEvt interface{}) { switch evt := rawEvt.(type) { case *events.DeleteForMe: - handleDeleteForMe(evt) + handleDeleteForMe(ctx, evt) case *events.AppStateSyncComplete: - handleAppStateSyncComplete(evt) + handleAppStateSyncComplete(ctx, evt) case *events.PairSuccess: - handlePairSuccess(evt) + handlePairSuccess(ctx, evt) case *events.LoggedOut: - handleLoggedOut() + handleLoggedOut(ctx) case *events.Connected, *events.PushNameSetting: - handleConnectionEvents() + handleConnectionEvents(ctx) case *events.StreamReplaced: - handleStreamReplaced() + handleStreamReplaced(ctx) case *events.Message: - handleMessage(evt) + handleMessage(ctx, evt) case *events.Receipt: - handleReceipt(evt) + handleReceipt(ctx, evt) case *events.Presence: - handlePresence(evt) + handlePresence(ctx, evt) case *events.HistorySync: - handleHistorySync(evt) + handleHistorySync(ctx, evt) case *events.AppState: - handleAppState(evt) + handleAppState(ctx, evt) } } // Event handler functions -func handleDeleteForMe(evt *events.DeleteForMe) { +func handleDeleteForMe(_ context.Context, evt *events.DeleteForMe) { log.Infof("Deleted message %s for %s", evt.MessageID, evt.SenderJID.String()) } -func handleAppStateSyncComplete(evt *events.AppStateSyncComplete) { +func handleAppStateSyncComplete(_ context.Context, evt *events.AppStateSyncComplete) { if len(cli.Store.PushName) > 0 && evt.Name == appstate.WAPatchCriticalBlock { if err := cli.SendPresence(types.PresenceAvailable); err != nil { log.Warnf("Failed to send available presence: %v", err) @@ -148,21 +150,21 @@ func handleAppStateSyncComplete(evt *events.AppStateSyncComplete) { } } -func handlePairSuccess(evt *events.PairSuccess) { +func handlePairSuccess(_ context.Context, evt *events.PairSuccess) { websocket.Broadcast <- websocket.BroadcastMessage{ Code: "LOGIN_SUCCESS", Message: fmt.Sprintf("Successfully pair with %s", evt.ID.String()), } } -func handleLoggedOut() { +func handleLoggedOut(_ context.Context) { websocket.Broadcast <- websocket.BroadcastMessage{ Code: "LIST_DEVICES", Result: nil, } } -func handleConnectionEvents() { +func handleConnectionEvents(_ context.Context) { if len(cli.Store.PushName) == 0 { return } @@ -176,11 +178,11 @@ func handleConnectionEvents() { } } -func handleStreamReplaced() { +func handleStreamReplaced(_ context.Context) { os.Exit(0) } -func handleMessage(evt *events.Message) { +func handleMessage(ctx context.Context, evt *events.Message) { // Log message metadata metaParts := buildMessageMetaParts(evt) log.Infof("Received message %s from %s (%s): %+v", @@ -195,13 +197,13 @@ func handleMessage(evt *events.Message) { utils.RecordMessage(evt.Info.ID, evt.Info.Sender.String(), message) // Handle image message if present - handleImageMessage(evt) + handleImageMessage(ctx, evt) // Handle auto-reply if configured handleAutoReply(evt) // Forward to webhook if configured - handleWebhookForward(evt) + handleWebhookForward(ctx, evt) } func buildMessageMetaParts(evt *events.Message) []string { @@ -221,9 +223,9 @@ func buildMessageMetaParts(evt *events.Message) []string { return metaParts } -func handleImageMessage(evt *events.Message) { +func handleImageMessage(ctx context.Context, evt *events.Message) { if img := evt.Message.GetImageMessage(); img != nil { - if path, err := ExtractMedia(config.PathStorages, img); err != nil { + if path, err := ExtractMedia(ctx, config.PathStorages, img); err != nil { log.Errorf("Failed to download image: %v", err) } else { log.Infof("Image downloaded to %s", path) @@ -244,19 +246,19 @@ func handleAutoReply(evt *events.Message) { } } -func handleWebhookForward(evt *events.Message) { +func handleWebhookForward(ctx context.Context, evt *events.Message) { if len(config.WhatsappWebhook) > 0 && !strings.Contains(evt.Info.SourceString(), "broadcast") && !isFromMySelf(evt.Info.SourceString()) { go func(evt *events.Message) { - if err := forwardToWebhook(evt); err != nil { + if err := forwardToWebhook(ctx, evt); err != nil { logrus.Error("Failed forward to webhook: ", err) } }(evt) } } -func handleReceipt(evt *events.Receipt) { +func handleReceipt(_ context.Context, evt *events.Receipt) { if evt.Type == types.ReceiptTypeRead || evt.Type == types.ReceiptTypeReadSelf { log.Infof("%v was read by %s at %s", evt.MessageIDs, evt.SourceString(), evt.Timestamp) } else if evt.Type == types.ReceiptTypeDelivered { @@ -264,7 +266,7 @@ func handleReceipt(evt *events.Receipt) { } } -func handlePresence(evt *events.Presence) { +func handlePresence(_ context.Context, evt *events.Presence) { if evt.Unavailable { if evt.LastSeen.IsZero() { log.Infof("%s is now offline", evt.From) @@ -276,7 +278,7 @@ func handlePresence(evt *events.Presence) { } } -func handleHistorySync(evt *events.HistorySync) { +func handleHistorySync(_ context.Context, evt *events.HistorySync) { id := atomic.AddInt32(&historySyncID, 1) fileName := fmt.Sprintf("%s/history-%d-%s-%d-%s.json", config.PathStorages, @@ -303,6 +305,6 @@ func handleHistorySync(evt *events.HistorySync) { log.Infof("Wrote history sync to %s", fileName) } -func handleAppState(evt *events.AppState) { +func handleAppState(ctx context.Context, evt *events.AppState) { log.Debugf("App state event: %+v / %+v", evt.Index, evt.SyncActionValue) } diff --git a/src/pkg/whatsapp/utils.go b/src/pkg/whatsapp/utils.go index a4e84ca..2205126 100644 --- a/src/pkg/whatsapp/utils.go +++ b/src/pkg/whatsapp/utils.go @@ -1,6 +1,7 @@ package whatsapp import ( + "context" "crypto/hmac" "crypto/sha256" "encoding/hex" @@ -23,13 +24,13 @@ import ( ) // ExtractMedia is a helper function to extract media from whatsapp -func ExtractMedia(storageLocation string, mediaFile whatsmeow.DownloadableMessage) (extractedMedia ExtractedMedia, err error) { +func ExtractMedia(ctx context.Context, storageLocation string, mediaFile whatsmeow.DownloadableMessage) (extractedMedia ExtractedMedia, err error) { if mediaFile == nil { logrus.Info("Skip download because data is nil") return extractedMedia, nil } - data, err := cli.Download(mediaFile) + data, err := cli.Download(ctx, mediaFile) if err != nil { return extractedMedia, err } diff --git a/src/pkg/whatsapp/webhook.go b/src/pkg/whatsapp/webhook.go index 5a1dc24..d70a16d 100644 --- a/src/pkg/whatsapp/webhook.go +++ b/src/pkg/whatsapp/webhook.go @@ -2,6 +2,7 @@ package whatsapp import ( "bytes" + "context" "encoding/json" "fmt" "net/http" @@ -14,9 +15,9 @@ import ( ) // forwardToWebhook is a helper function to forward event to webhook url -func forwardToWebhook(evt *events.Message) error { +func forwardToWebhook(ctx context.Context, evt *events.Message) error { logrus.Info("Forwarding event to webhook:", config.WhatsappWebhook) - payload, err := createPayload(evt) + payload, err := createPayload(ctx, evt) if err != nil { return err } @@ -31,7 +32,7 @@ func forwardToWebhook(evt *events.Message) error { return nil } -func createPayload(evt *events.Message) (map[string]interface{}, error) { +func createPayload(ctx context.Context, evt *events.Message) (map[string]interface{}, error) { message := buildEventMessage(evt) waReaction := buildEventReaction(evt) forwarded := buildForwarded(evt) @@ -61,7 +62,7 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) { } if audioMedia := evt.Message.GetAudioMessage(); audioMedia != nil { - path, err := ExtractMedia(config.PathMedia, audioMedia) + path, err := ExtractMedia(ctx, config.PathMedia, audioMedia) if err != nil { logrus.Errorf("Failed to download audio from %s: %v", evt.Info.SourceString(), err) return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download audio: %v", err)) @@ -74,7 +75,7 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) { } if documentMedia := evt.Message.GetDocumentMessage(); documentMedia != nil { - path, err := ExtractMedia(config.PathMedia, documentMedia) + path, err := ExtractMedia(ctx, config.PathMedia, documentMedia) if err != nil { logrus.Errorf("Failed to download document from %s: %v", evt.Info.SourceString(), err) return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download document: %v", err)) @@ -83,7 +84,7 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) { } if imageMedia := evt.Message.GetImageMessage(); imageMedia != nil { - path, err := ExtractMedia(config.PathMedia, imageMedia) + path, err := ExtractMedia(ctx, config.PathMedia, imageMedia) if err != nil { logrus.Errorf("Failed to download image from %s: %v", evt.Info.SourceString(), err) return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download image: %v", err)) @@ -108,7 +109,7 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) { } if stickerMedia := evt.Message.GetStickerMessage(); stickerMedia != nil { - path, err := ExtractMedia(config.PathMedia, stickerMedia) + path, err := ExtractMedia(ctx, config.PathMedia, stickerMedia) if err != nil { logrus.Errorf("Failed to download sticker from %s: %v", evt.Info.SourceString(), err) return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download sticker: %v", err)) @@ -117,7 +118,7 @@ func createPayload(evt *events.Message) (map[string]interface{}, error) { } if videoMedia := evt.Message.GetVideoMessage(); videoMedia != nil { - path, err := ExtractMedia(config.PathMedia, videoMedia) + path, err := ExtractMedia(ctx, config.PathMedia, videoMedia) if err != nil { logrus.Errorf("Failed to download video from %s: %v", evt.Info.SourceString(), err) return nil, pkgError.WebhookError(fmt.Sprintf("Failed to download video: %v", err)) diff --git a/src/services/app.go b/src/services/app.go index a52b66a..51466dc 100644 --- a/src/services/app.go +++ b/src/services/app.go @@ -107,7 +107,7 @@ func (service serviceApp) LoginWithCode(ctx context.Context, phoneNumber string) // reconnect first _ = service.Reconnect(ctx) - loginCode, err = service.WaCli.PairPhone(phoneNumber, true, whatsmeow.PairClientChrome, "Chrome (Linux)") + loginCode, err = service.WaCli.PairPhone(ctx, phoneNumber, true, whatsmeow.PairClientChrome, "Chrome (Linux)") if err != nil { logrus.Errorf("Error when pairing phone: %s", err.Error()) return loginCode, err @@ -117,7 +117,7 @@ func (service serviceApp) LoginWithCode(ctx context.Context, phoneNumber string) return loginCode, nil } -func (service serviceApp) Logout(_ context.Context) (err error) { +func (service serviceApp) Logout(ctx context.Context) (err error) { // delete history files, err := filepath.Glob(fmt.Sprintf("./%s/history-*", config.PathStorages)) if err != nil { @@ -158,7 +158,7 @@ func (service serviceApp) Logout(_ context.Context) (err error) { } } - err = service.WaCli.Logout() + err = service.WaCli.Logout(ctx) return } @@ -172,7 +172,7 @@ func (service serviceApp) FirstDevice(ctx context.Context) (response domainApp.D return response, pkgError.ErrWaCLI } - devices, err := service.db.GetFirstDevice() + devices, err := service.db.GetFirstDevice(ctx) if err != nil { return response, err } @@ -187,12 +187,12 @@ func (service serviceApp) FirstDevice(ctx context.Context) (response domainApp.D return response, nil } -func (service serviceApp) FetchDevices(_ context.Context) (response []domainApp.DevicesResponse, err error) { +func (service serviceApp) FetchDevices(ctx context.Context) (response []domainApp.DevicesResponse, err error) { if service.WaCli == nil { return response, pkgError.ErrWaCLI } - devices, err := service.db.GetAllDevices() + devices, err := service.db.GetAllDevices(ctx) if err != nil { return nil, err } diff --git a/src/services/message.go b/src/services/message.go index 9d16da1..9433fac 100644 --- a/src/services/message.go +++ b/src/services/message.go @@ -131,7 +131,7 @@ func (service serviceMessage) DeleteMessage(ctx context.Context, request domainM }}, } - if err = service.WaCli.SendAppState(patchInfo); err != nil { + if err = service.WaCli.SendAppState(ctx, patchInfo); err != nil { return err } return nil @@ -176,7 +176,7 @@ func (service serviceMessage) StarMessage(ctx context.Context, request domainMes patchInfo := appstate.BuildStar(dataWaRecipient.ToNonAD(), *service.WaCli.Store.ID, request.MessageID, isFromMe, request.IsStarred) - if err = service.WaCli.SendAppState(patchInfo); err != nil { + if err = service.WaCli.SendAppState(ctx, patchInfo); err != nil { return err } return nil diff --git a/src/services/user.go b/src/services/user.go index 12e7f1f..91a6bad 100644 --- a/src/services/user.go +++ b/src/services/user.go @@ -146,10 +146,10 @@ func (service userService) MyListNewsletter(_ context.Context) (response domainU return response, nil } -func (service userService) MyPrivacySetting(_ context.Context) (response domainUser.MyPrivacySettingResponse, err error) { +func (service userService) MyPrivacySetting(ctx context.Context) (response domainUser.MyPrivacySettingResponse, err error) { whatsapp.MustLogin(service.WaCli) - resp, err := service.WaCli.TryFetchPrivacySettings(true) + resp, err := service.WaCli.TryFetchPrivacySettings(ctx, true) if err != nil { return } @@ -164,7 +164,7 @@ func (service userService) MyPrivacySetting(_ context.Context) (response domainU func (service userService) MyListContacts(ctx context.Context) (response domainUser.MyListContactsResponse, err error) { whatsapp.MustLogin(service.WaCli) - contacts, err := service.WaCli.Store.Contacts.GetAllContacts() + contacts, err := service.WaCli.Store.Contacts.GetAllContacts(ctx) if err != nil { return } @@ -236,7 +236,7 @@ func (service userService) ChangeAvatar(ctx context.Context, request domainUser. func (service userService) ChangePushName(ctx context.Context, request domainUser.ChangePushNameRequest) (err error) { whatsapp.MustLogin(service.WaCli) - err = service.WaCli.SendAppState(appstate.BuildSettingPushName(request.PushName)) + err = service.WaCli.SendAppState(ctx, appstate.BuildSettingPushName(request.PushName)) if err != nil { return err }