From 127b71e65c69827621b7e41ee0d678196be126cb Mon Sep 17 00:00:00 2001 From: Aldino Kemal Date: Wed, 11 Oct 2023 14:00:32 +0700 Subject: [PATCH] feat: add reply message --- docs/openapi.yaml | 6 +++++- src/cmd/root.go | 2 +- src/config/settings.go | 2 +- src/domains/app/app.go | 15 ++++++++++++++- src/domains/app/devices.go | 6 ------ src/domains/app/login.go | 9 --------- src/domains/send/text.go | 5 +++-- src/go.mod | 2 +- src/services/app.go | 24 ++++++++++++++++++++++-- src/services/send.go | 36 +++++++++++++++++++++++++++++++++--- 10 files changed, 80 insertions(+), 27 deletions(-) delete mode 100644 src/domains/app/devices.go delete mode 100644 src/domains/app/login.go diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 155a5dd..8157d22 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: title: WhatsApp API MultiDevice - version: 3.6.0 + version: 3.7.0 description: This API is used for sending whatsapp via API servers: - url: http://localhost:3000 @@ -212,6 +212,10 @@ paths: type: string example: selamat malam description: Message to send + reply_message_id: + type: string + example: 3EB089B9D6ADD58153C561 + description: Message ID that you want reply responses: '200': description: OK diff --git a/src/cmd/root.go b/src/cmd/root.go index 7c0c872..2cc7055 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -96,7 +96,7 @@ func runRest(_ *cobra.Command, _ []string) { // Service appService := services.NewAppService(cli, db) - sendService := services.NewSendService(cli) + sendService := services.NewSendService(cli, appService) userService := services.NewUserService(cli) messageService := services.NewMessageService(cli) groupService := services.NewGroupService(cli) diff --git a/src/config/settings.go b/src/config/settings.go index f0b3a49..319ca6d 100644 --- a/src/config/settings.go +++ b/src/config/settings.go @@ -6,7 +6,7 @@ import ( ) var ( - AppVersion = "v4.7.4" + AppVersion = "v4.8.0" AppPort = "3000" AppDebug = false AppOs = fmt.Sprintf("AldinoKemal") diff --git a/src/domains/app/app.go b/src/domains/app/app.go index 03b7be0..8c00e8f 100644 --- a/src/domains/app/app.go +++ b/src/domains/app/app.go @@ -2,11 +2,24 @@ package app import ( "context" + "time" ) type IAppService interface { Login(ctx context.Context) (response LoginResponse, err error) Logout(ctx context.Context) (err error) Reconnect(ctx context.Context) (err error) - FetchDevices(ctx context.Context) (response []FetchDevicesResponse, err error) + FirstDevice(ctx context.Context) (response DevicesResponse, err error) + FetchDevices(ctx context.Context) (response []DevicesResponse, err error) +} + +type DevicesResponse struct { + Name string `json:"name"` + Device string `json:"device"` +} + +type LoginResponse struct { + ImagePath string `json:"image_path"` + Duration time.Duration `json:"duration"` + Code string `json:"code"` } diff --git a/src/domains/app/devices.go b/src/domains/app/devices.go deleted file mode 100644 index 34c6406..0000000 --- a/src/domains/app/devices.go +++ /dev/null @@ -1,6 +0,0 @@ -package app - -type FetchDevicesResponse struct { - Name string `json:"name"` - Device string `json:"device"` -} diff --git a/src/domains/app/login.go b/src/domains/app/login.go deleted file mode 100644 index fc8f98b..0000000 --- a/src/domains/app/login.go +++ /dev/null @@ -1,9 +0,0 @@ -package app - -import "time" - -type LoginResponse struct { - ImagePath string `json:"image_path"` - Duration time.Duration `json:"duration"` - Code string `json:"code"` -} diff --git a/src/domains/send/text.go b/src/domains/send/text.go index 90484b0..c572f36 100644 --- a/src/domains/send/text.go +++ b/src/domains/send/text.go @@ -1,8 +1,9 @@ package send type MessageRequest struct { - Phone string `json:"phone" form:"phone"` - Message string `json:"message" form:"message"` + Phone string `json:"phone" form:"phone"` + Message string `json:"message" form:"message"` + ReplyMessageID *string `json:"reply_message_id" form:"reply_message_id"` } type MessageResponse struct { diff --git a/src/go.mod b/src/go.mod index d651912..5851100 100644 --- a/src/go.mod +++ b/src/go.mod @@ -1,6 +1,6 @@ module github.com/aldinokemal/go-whatsapp-web-multidevice -go 1.20 +go 1.21 require ( github.com/PuerkitoBio/goquery v1.8.1 diff --git a/src/services/app.go b/src/services/app.go index 27c0993..9cf9d40 100644 --- a/src/services/app.go +++ b/src/services/app.go @@ -140,7 +140,27 @@ func (service serviceApp) Reconnect(_ context.Context) (err error) { return service.WaCli.Connect() } -func (service serviceApp) FetchDevices(_ context.Context) (response []domainApp.FetchDevicesResponse, err error) { +func (service serviceApp) FirstDevice(ctx context.Context) (response domainApp.DevicesResponse, err error) { + if service.WaCli == nil { + return response, pkgError.ErrWaCLI + } + + devices, err := service.db.GetFirstDevice() + if err != nil { + return response, err + } + + response.Device = devices.ID.String() + if devices.PushName != "" { + response.Name = devices.PushName + } else { + response.Name = devices.BusinessName + } + + return response, nil +} + +func (service serviceApp) FetchDevices(_ context.Context) (response []domainApp.DevicesResponse, err error) { if service.WaCli == nil { return response, pkgError.ErrWaCLI } @@ -151,7 +171,7 @@ func (service serviceApp) FetchDevices(_ context.Context) (response []domainApp. } for _, device := range devices { - var d domainApp.FetchDevicesResponse + var d domainApp.DevicesResponse d.Device = device.ID.String() if device.PushName != "" { d.Name = device.PushName diff --git a/src/services/send.go b/src/services/send.go index b1170d2..7e090fc 100644 --- a/src/services/send.go +++ b/src/services/send.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "github.com/aldinokemal/go-whatsapp-web-multidevice/config" + "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/app" domainSend "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/send" pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/utils" @@ -21,7 +22,8 @@ import ( ) type serviceSend struct { - WaCli *whatsmeow.Client + WaCli *whatsmeow.Client + appService app.IAppService } type metadata struct { @@ -29,9 +31,10 @@ type metadata struct { Content string } -func NewSendService(waCli *whatsmeow.Client) domainSend.ISendService { +func NewSendService(waCli *whatsmeow.Client, appService app.IAppService) domainSend.ISendService { return &serviceSend{ - WaCli: waCli, + WaCli: waCli, + appService: appService, } } @@ -45,7 +48,34 @@ func (service serviceSend) SendText(ctx context.Context, request domainSend.Mess return response, err } + // Send message msg := &waProto.Message{Conversation: proto.String(request.Message)} + + // Reply message + if request.ReplyMessageID != nil && *request.ReplyMessageID != "" { + participantJID := dataWaRecipient.String() + if len(*request.ReplyMessageID) < 28 { + firstDevice, err := service.appService.FirstDevice(ctx) + if err != nil { + return response, err + } + participantJID = firstDevice.Device + } + + msg = &waProto.Message{ + ExtendedTextMessage: &waProto.ExtendedTextMessage{ + Text: proto.String(request.Message), + ContextInfo: &waProto.ContextInfo{ + StanzaId: request.ReplyMessageID, + Participant: proto.String(participantJID), + QuotedMessage: &waProto.Message{ + Conversation: proto.String(request.Message), + }, + }, + }, + } + } + ts, err := service.WaCli.SendMessage(ctx, dataWaRecipient, msg) if err != nil { return response, err