From 271ee6f75ab608a596bcf77258f72f4ab78a97cc Mon Sep 17 00:00:00 2001 From: Aldino Kemal Date: Wed, 8 Feb 2023 21:44:50 +0700 Subject: [PATCH] feat: add reaction --- src/config/settings.go | 2 +- src/domains/send/reaction.go | 12 ++++++++++++ src/domains/send/send.go | 1 + src/internal/rest/send.go | 20 ++++++++++++++++++++ src/services/send.go | 28 ++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/domains/send/reaction.go diff --git a/src/config/settings.go b/src/config/settings.go index e1d5ad0..329a3a3 100644 --- a/src/config/settings.go +++ b/src/config/settings.go @@ -6,7 +6,7 @@ import ( ) var ( - AppVersion = "v4.4.6" + AppVersion = "v4.5.0" AppPort = "3000" AppDebug = false AppOs = fmt.Sprintf("AldinoKemal") diff --git a/src/domains/send/reaction.go b/src/domains/send/reaction.go new file mode 100644 index 0000000..ad5f09b --- /dev/null +++ b/src/domains/send/reaction.go @@ -0,0 +1,12 @@ +package send + +type ReactionRequest struct { + MessageID string `json:"message_id" form:"message_id"` + Phone string `json:"phone" form:"phone"` + Emoji string `json:"emoji" form:"emoji"` +} + +type ReactionResponse struct { + MessageID string `json:"message_id"` + Status string `json:"status"` +} diff --git a/src/domains/send/send.go b/src/domains/send/send.go index ddcc0b0..306898d 100644 --- a/src/domains/send/send.go +++ b/src/domains/send/send.go @@ -12,6 +12,7 @@ type ISendService interface { SendContact(ctx context.Context, request ContactRequest) (response ContactResponse, err error) SendLink(ctx context.Context, request LinkRequest) (response LinkResponse, err error) SendLocation(ctx context.Context, request LocationRequest) (response LocationResponse, err error) + SendReaction(ctx context.Context, request ReactionRequest) (response ReactionResponse, err error) Revoke(ctx context.Context, request RevokeRequest) (response RevokeResponse, err error) UpdateMessage(ctx context.Context, request UpdateMessageRequest) (response UpdateMessageResponse, err error) } diff --git a/src/internal/rest/send.go b/src/internal/rest/send.go index 0559e29..c5ccbe8 100644 --- a/src/internal/rest/send.go +++ b/src/internal/rest/send.go @@ -20,6 +20,7 @@ func InitRestSend(app *fiber.App, service domainSend.ISendService) Send { app.Post("/send/contact", rest.SendContact) app.Post("/send/link", rest.SendLink) app.Post("/send/location", rest.SendLocation) + app.Post("/message/:message_id/reaction", rest.ReactionMessage) app.Post("/message/:message_id/revoke", rest.RevokeMessage) app.Post("/message/:message_id/update", rest.UpdateMessage) return rest @@ -202,3 +203,22 @@ func (controller *Send) UpdateMessage(c *fiber.Ctx) error { Results: response, }) } + +func (controller *Send) ReactionMessage(c *fiber.Ctx) error { + var request domainSend.ReactionRequest + err := c.BodyParser(&request) + utils.PanicIfNeeded(err) + + request.MessageID = c.Params("message_id") + whatsapp.SanitizePhone(&request.Phone) + + response, err := controller.Service.SendReaction(c.UserContext(), request) + utils.PanicIfNeeded(err) + + return c.JSON(utils.ResponseData{ + Status: 200, + Code: "SUCCESS", + Message: response.Status, + Results: response, + }) +} diff --git a/src/services/send.go b/src/services/send.go index 04e1652..587d8d6 100644 --- a/src/services/send.go +++ b/src/services/send.go @@ -19,6 +19,7 @@ import ( "net/http" "os" "os/exec" + "time" ) type serviceSend struct { @@ -399,6 +400,33 @@ func (service serviceSend) SendLocation(ctx context.Context, request domainSend. return response, nil } +func (service serviceSend) SendReaction(ctx context.Context, request domainSend.ReactionRequest) (response domainSend.ReactionResponse, err error) { + dataWaRecipient, err := whatsapp.ValidateJidWithLogin(service.WaCli, request.Phone) + if err != nil { + return response, err + } + + msg := &waProto.Message{ + ReactionMessage: &waProto.ReactionMessage{ + Key: &waProto.MessageKey{ + FromMe: proto.Bool(true), + Id: proto.String(request.MessageID), + RemoteJid: proto.String(dataWaRecipient.String()), + }, + Text: proto.String(request.Emoji), + SenderTimestampMs: proto.Int64(time.Now().UnixMilli()), + }, + } + ts, err := service.WaCli.SendMessage(ctx, dataWaRecipient, msg) + if err != nil { + return response, err + } + + response.MessageID = ts.ID + response.Status = fmt.Sprintf("Reaction sent to %s (server timestamp: %s)", request.Phone, ts) + return response, nil +} + func (service serviceSend) Revoke(ctx context.Context, request domainSend.RevokeRequest) (response domainSend.RevokeResponse, err error) { err = validations.ValidateRevokeMessage(ctx, request) if err != nil {