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 openapi: 3.0.0
info: info:
title: WhatsApp API MultiDevice title: WhatsApp API MultiDevice
version: 3.6.0
version: 3.7.0
description: This API is used for sending whatsapp via API description: This API is used for sending whatsapp via API
servers: servers:
- url: http://localhost:3000 - url: http://localhost:3000
@ -212,6 +212,10 @@ paths:
type: string type: string
example: selamat malam example: selamat malam
description: Message to send description: Message to send
reply_message_id:
type: string
example: 3EB089B9D6ADD58153C561
description: Message ID that you want reply
responses: responses:
'200': '200':
description: OK description: OK

2
src/cmd/root.go

@ -96,7 +96,7 @@ func runRest(_ *cobra.Command, _ []string) {
// Service // Service
appService := services.NewAppService(cli, db) appService := services.NewAppService(cli, db)
sendService := services.NewSendService(cli)
sendService := services.NewSendService(cli, appService)
userService := services.NewUserService(cli) userService := services.NewUserService(cli)
messageService := services.NewMessageService(cli) messageService := services.NewMessageService(cli)
groupService := services.NewGroupService(cli) groupService := services.NewGroupService(cli)

2
src/config/settings.go

@ -6,7 +6,7 @@ import (
) )
var ( var (
AppVersion = "v4.7.4"
AppVersion = "v4.8.0"
AppPort = "3000" AppPort = "3000"
AppDebug = false AppDebug = false
AppOs = fmt.Sprintf("AldinoKemal") AppOs = fmt.Sprintf("AldinoKemal")

15
src/domains/app/app.go

@ -2,11 +2,24 @@ package app
import ( import (
"context" "context"
"time"
) )
type IAppService interface { type IAppService interface {
Login(ctx context.Context) (response LoginResponse, err error) Login(ctx context.Context) (response LoginResponse, err error)
Logout(ctx context.Context) (err error) Logout(ctx context.Context) (err error)
Reconnect(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 { type MessageRequest struct {
Phone string `json:"phone" form:"phone"` Phone string `json:"phone" form:"phone"`
Message string `json:"message" form:"message"` Message string `json:"message" form:"message"`
ReplyMessageID *string `json:"reply_message_id" form:"reply_message_id"`
} }
type MessageResponse struct { type MessageResponse struct {

2
src/go.mod

@ -1,6 +1,6 @@
module github.com/aldinokemal/go-whatsapp-web-multidevice module github.com/aldinokemal/go-whatsapp-web-multidevice
go 1.20
go 1.21
require ( require (
github.com/PuerkitoBio/goquery v1.8.1 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() 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 { if service.WaCli == nil {
return response, pkgError.ErrWaCLI return response, pkgError.ErrWaCLI
} }
@ -151,7 +171,7 @@ func (service serviceApp) FetchDevices(_ context.Context) (response []domainApp.
} }
for _, device := range devices { for _, device := range devices {
var d domainApp.FetchDevicesResponse
var d domainApp.DevicesResponse
d.Device = device.ID.String() d.Device = device.ID.String()
if device.PushName != "" { if device.PushName != "" {
d.Name = device.PushName d.Name = device.PushName

32
src/services/send.go

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/aldinokemal/go-whatsapp-web-multidevice/config" "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" domainSend "github.com/aldinokemal/go-whatsapp-web-multidevice/domains/send"
pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error" pkgError "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/error"
"github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/utils" "github.com/aldinokemal/go-whatsapp-web-multidevice/pkg/utils"
@ -22,6 +23,7 @@ import (
type serviceSend struct { type serviceSend struct {
WaCli *whatsmeow.Client WaCli *whatsmeow.Client
appService app.IAppService
} }
type metadata struct { type metadata struct {
@ -29,9 +31,10 @@ type metadata struct {
Content string Content string
} }
func NewSendService(waCli *whatsmeow.Client) domainSend.ISendService {
func NewSendService(waCli *whatsmeow.Client, appService app.IAppService) domainSend.ISendService {
return &serviceSend{ 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 return response, err
} }
// Send message
msg := &waProto.Message{Conversation: proto.String(request.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) ts, err := service.WaCli.SendMessage(ctx, dataWaRecipient, msg)
if err != nil { if err != nil {
return response, err return response, err

10
src/views/index.html

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

Loading…
Cancel
Save