Browse Source

feat: add reply message (#95)

* feat: add reply message

* feat: add reply message id in UI
pull/96/head v4.8.0
Aldino Kemal 2 years ago
committed by GitHub
parent
commit
7685f39838
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      docs/openapi.yaml
  2. 2
      src/cmd/root.go
  3. 2
      src/config/settings.go
  4. 15
      src/domains/app/app.go
  5. 6
      src/domains/app/devices.go
  6. 9
      src/domains/app/login.go
  7. 1
      src/domains/send/text.go
  8. 2
      src/go.mod
  9. 24
      src/services/app.go
  10. 32
      src/services/send.go
  11. 10
      src/views/index.html

6
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

2
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)

2
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")

15
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"`
}

6
src/domains/app/devices.go

@ -1,6 +0,0 @@
package app
type FetchDevicesResponse struct {
Name string `json:"name"`
Device string `json:"device"`
}

9
src/domains/app/login.go

@ -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"`
}

1
src/domains/send/text.go

@ -3,6 +3,7 @@ package send
type MessageRequest struct {
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 {

2
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

24
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

32
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"
@ -22,6 +23,7 @@ import (
type serviceSend struct {
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,
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

10
src/views/index.html

@ -248,6 +248,11 @@
aria-label="phone">
<input :value="message_phone_id" disabled aria-label="whatsapp_id">
</div>
<div class="field">
<label>Reply Message ID</label>
<input v-model="message_reply_message_id" type="text" placeholder="Optional: 57D29F74B7FC62F57D8AC2C840279B5B/3EB0288F008D32FCD0A424"
aria-label="reply_message_id">
</div>
<div class="field">
<label>Message</label>
<textarea v-model="message_text" type="text" placeholder="Hello this is message text"
@ -868,6 +873,7 @@
message_type: 'user',
message_phone: '',
message_text: '',
message_reply_message_id: '',
message_loading: false,
}
},
@ -900,6 +906,9 @@
let payload = new FormData();
payload.append("phone", this.message_phone_id)
payload.append("message", this.message_text)
if (this.message_reply_message_id !== '') {
payload.append("reply_message_id", this.message_reply_message_id)
}
let response = await http.post(`/send/message`, payload)
this.sendMessageReset();
resolve(response.data.message)
@ -918,6 +927,7 @@
this.message_phone = '';
this.message_text = '';
this.message_type = 'user';
this.message_reply_message_id = '';
},
}
}

Loading…
Cancel
Save