diff --git a/src/domains/send/audio.go b/src/domains/send/audio.go index 16da723..5d37080 100644 --- a/src/domains/send/audio.go +++ b/src/domains/send/audio.go @@ -3,6 +3,7 @@ package send import "mime/multipart" type AudioRequest struct { - Phone string `json:"phone" form:"phone"` - Audio *multipart.FileHeader `json:"audio" form:"audio"` + Phone string `json:"phone" form:"phone"` + Audio *multipart.FileHeader `json:"audio" form:"audio"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/domains/send/contact.go b/src/domains/send/contact.go index dacadcf..8840e80 100644 --- a/src/domains/send/contact.go +++ b/src/domains/send/contact.go @@ -4,4 +4,5 @@ type ContactRequest struct { Phone string `json:"phone" form:"phone"` ContactName string `json:"contact_name" form:"contact_name"` ContactPhone string `json:"contact_phone" form:"contact_phone"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/domains/send/file.go b/src/domains/send/file.go index ca57790..663fea2 100644 --- a/src/domains/send/file.go +++ b/src/domains/send/file.go @@ -3,7 +3,8 @@ package send import "mime/multipart" type FileRequest struct { - Phone string `json:"phone" form:"phone"` - File *multipart.FileHeader `json:"file" form:"file"` - Caption string `json:"caption" form:"caption"` + Phone string `json:"phone" form:"phone"` + File *multipart.FileHeader `json:"file" form:"file"` + Caption string `json:"caption" form:"caption"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/domains/send/image.go b/src/domains/send/image.go index b6baf95..18450b2 100644 --- a/src/domains/send/image.go +++ b/src/domains/send/image.go @@ -3,10 +3,11 @@ package send import "mime/multipart" type ImageRequest struct { - Phone string `json:"phone" form:"phone"` - Caption string `json:"caption" form:"caption"` - Image *multipart.FileHeader `json:"image" form:"image"` - ImageURL *string `json:"image_url" form:"image_url"` - ViewOnce bool `json:"view_once" form:"view_once"` - Compress bool `json:"compress"` + Phone string `json:"phone" form:"phone"` + Caption string `json:"caption" form:"caption"` + Image *multipart.FileHeader `json:"image" form:"image"` + ImageURL *string `json:"image_url" form:"image_url"` + ViewOnce bool `json:"view_once" form:"view_once"` + Compress bool `json:"compress"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/domains/send/link.go b/src/domains/send/link.go index c0bf49e..7979bf1 100644 --- a/src/domains/send/link.go +++ b/src/domains/send/link.go @@ -1,7 +1,8 @@ package send type LinkRequest struct { - Phone string `json:"phone" form:"phone"` - Caption string `json:"caption"` - Link string `json:"link"` + Phone string `json:"phone" form:"phone"` + Caption string `json:"caption"` + Link string `json:"link"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/domains/send/location.go b/src/domains/send/location.go index 43660bd..3d8a661 100644 --- a/src/domains/send/location.go +++ b/src/domains/send/location.go @@ -1,7 +1,8 @@ package send type LocationRequest struct { - Phone string `json:"phone" form:"phone"` - Latitude string `json:"latitude" form:"latitude"` - Longitude string `json:"longitude" form:"longitude"` + Phone string `json:"phone" form:"phone"` + Latitude string `json:"latitude" form:"latitude"` + Longitude string `json:"longitude" form:"longitude"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/domains/send/presence.go b/src/domains/send/presence.go index 301e3e3..baeed08 100644 --- a/src/domains/send/presence.go +++ b/src/domains/send/presence.go @@ -1,5 +1,6 @@ package send type PresenceRequest struct { - Type string `json:"type" form:"type"` + Type string `json:"type" form:"type"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/domains/send/text.go b/src/domains/send/text.go index 332762f..d5a15c3 100644 --- a/src/domains/send/text.go +++ b/src/domains/send/text.go @@ -3,5 +3,6 @@ package send type MessageRequest struct { Phone string `json:"phone" form:"phone"` Message string `json:"message" form:"message"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` ReplyMessageID *string `json:"reply_message_id" form:"reply_message_id"` } diff --git a/src/domains/send/video.go b/src/domains/send/video.go index 5ba739d..818a9e4 100644 --- a/src/domains/send/video.go +++ b/src/domains/send/video.go @@ -3,9 +3,10 @@ package send import "mime/multipart" type VideoRequest struct { - Phone string `json:"phone" form:"phone"` - Caption string `json:"caption" form:"caption"` - Video *multipart.FileHeader `json:"video" form:"video"` - ViewOnce bool `json:"view_once" form:"view_once"` - Compress bool `json:"compress"` + Phone string `json:"phone" form:"phone"` + Caption string `json:"caption" form:"caption"` + Video *multipart.FileHeader `json:"video" form:"video"` + ViewOnce bool `json:"view_once" form:"view_once"` + Compress bool `json:"compress"` + IsForwarded bool `json:"is_forwarded" form:"is_forwarded"` } diff --git a/src/services/send.go b/src/services/send.go index bdfdd10..48a0383 100644 --- a/src/services/send.go +++ b/src/services/send.go @@ -59,18 +59,23 @@ func (service serviceSend) SendText(ctx context.Context, request domainSend.Mess return response, err } - // Send message + // Create base message msg := &waE2E.Message{ ExtendedTextMessage: &waE2E.ExtendedTextMessage{ - Text: proto.String(request.Message), + Text: proto.String(request.Message), + ContextInfo: &waE2E.ContextInfo{}, }, } + // Add forwarding context if IsForwarded is true + if request.IsForwarded { + msg.ExtendedTextMessage.ContextInfo.IsForwarded = proto.Bool(true) + msg.ExtendedTextMessage.ContextInfo.ForwardingScore = proto.Uint32(100) + } + parsedMentions := service.getMentionFromText(ctx, request.Message) if len(parsedMentions) > 0 { - msg.ExtendedTextMessage.ContextInfo = &waE2E.ContextInfo{ - MentionedJID: parsedMentions, - } + msg.ExtendedTextMessage.ContextInfo.MentionedJID = parsedMentions } // Reply message @@ -207,6 +212,13 @@ func (service serviceSend) SendImage(ctx context.Context, request domainSend.Ima ViewOnce: proto.Bool(request.ViewOnce), }} + if request.IsForwarded { + msg.ImageMessage.ContextInfo = &waE2E.ContextInfo{ + IsForwarded: proto.Bool(true), + ForwardingScore: proto.Uint32(100), + } + } + caption := "🖼️ Image" if request.Caption != "" { caption = "🖼️ " + request.Caption @@ -259,6 +271,14 @@ func (service serviceSend) SendFile(ctx context.Context, request domainSend.File DirectPath: proto.String(uploadedFile.DirectPath), Caption: proto.String(request.Caption), }} + + if request.IsForwarded { + msg.DocumentMessage.ContextInfo = &waE2E.ContextInfo{ + IsForwarded: proto.Bool(true), + ForwardingScore: proto.Uint32(100), + } + } + caption := "📄 Document" if request.Caption != "" { caption = "📄 " + request.Caption @@ -371,6 +391,14 @@ func (service serviceSend) SendVideo(ctx context.Context, request domainSend.Vid ThumbnailSHA256: dataWaThumbnail, ThumbnailDirectPath: proto.String(uploaded.DirectPath), }} + + if request.IsForwarded { + msg.VideoMessage.ContextInfo = &waE2E.ContextInfo{ + IsForwarded: proto.Bool(true), + ForwardingScore: proto.Uint32(100), + } + } + caption := "🎥 Video" if request.Caption != "" { caption = "🎥 " + request.Caption @@ -408,6 +436,13 @@ func (service serviceSend) SendContact(ctx context.Context, request domainSend.C Vcard: proto.String(msgVCard), }} + if request.IsForwarded { + msg.ContactMessage.ContextInfo = &waE2E.ContextInfo{ + IsForwarded: proto.Bool(true), + ForwardingScore: proto.Uint32(100), + } + } + content := "👤 " + request.ContactName ts, err := service.wrapSendMessage(ctx, dataWaRecipient, msg, content) @@ -451,6 +486,13 @@ func (service serviceSend) SendLink(ctx context.Context, request domainSend.Link JPEGThumbnail: metadata.ImageThumb, }} + if request.IsForwarded { + msg.ExtendedTextMessage.ContextInfo = &waE2E.ContextInfo{ + IsForwarded: proto.Bool(true), + ForwardingScore: proto.Uint32(100), + } + } + // If we have a thumbnail image, upload it to WhatsApp's servers if len(metadata.ImageThumb) > 0 && metadata.Height != nil && metadata.Width != nil { uploadedThumb, err := service.uploadMedia(ctx, whatsmeow.MediaLinkThumbnail, metadata.ImageThumb, dataWaRecipient) @@ -499,6 +541,13 @@ func (service serviceSend) SendLocation(ctx context.Context, request domainSend. }, } + if request.IsForwarded { + msg.LocationMessage.ContextInfo = &waE2E.ContextInfo{ + IsForwarded: proto.Bool(true), + ForwardingScore: proto.Uint32(100), + } + } + content := "📍 " + request.Latitude + ", " + request.Longitude // Send WhatsApp Message Proto @@ -543,6 +592,13 @@ func (service serviceSend) SendAudio(ctx context.Context, request domainSend.Aud }, } + if request.IsForwarded { + msg.AudioMessage.ContextInfo = &waE2E.ContextInfo{ + IsForwarded: proto.Bool(true), + ForwardingScore: proto.Uint32(100), + } + } + content := "🎵 Audio" ts, err := service.wrapSendMessage(ctx, dataWaRecipient, msg, content) @@ -567,7 +623,9 @@ func (service serviceSend) SendPoll(ctx context.Context, request domainSend.Poll content := "📊 " + request.Question - ts, err := service.wrapSendMessage(ctx, dataWaRecipient, service.WaCli.BuildPollCreation(request.Question, request.Options, request.MaxAnswer), content) + msg := service.WaCli.BuildPollCreation(request.Question, request.Options, request.MaxAnswer) + + ts, err := service.wrapSendMessage(ctx, dataWaRecipient, msg, content) if err != nil { return response, err } diff --git a/src/views/components/SendAudio.js b/src/views/components/SendAudio.js index b68f63e..ca4452d 100644 --- a/src/views/components/SendAudio.js +++ b/src/views/components/SendAudio.js @@ -10,7 +10,8 @@ export default { phone: '', type: window.TYPEUSER, loading: false, - selectedFileName: null + selectedFileName: null, + is_forwarded: false } }, computed: { @@ -27,7 +28,7 @@ export default { }).modal('show'); }, isValidForm() { - if (this.type !== window.TYPESTATUS && !this.phone.trim()) { + if (this.type !== window.TYPEUSER && !this.phone.trim()) { return false; } @@ -55,6 +56,7 @@ export default { try { let payload = new FormData(); payload.append("phone", this.phone_id) + payload.append("is_forwarded", this.is_forwarded) payload.append("audio", $("#file_audio")[0].files[0]) const response = await window.http.post(`/send/audio`, payload) this.handleReset(); @@ -71,6 +73,7 @@ export default { handleReset() { this.phone = ''; this.type = window.TYPEUSER; + this.is_forwarded = false; $("#file_audio").val(''); this.selectedFileName = null; }, @@ -101,6 +104,13 @@ export default {