Skip to content

Commit

Permalink
format whatsapp number for brazilian rules
Browse files Browse the repository at this point in the history
  • Loading branch information
iagocotta committed Oct 9, 2024
1 parent 661a7ce commit 4a6d4d7
Show file tree
Hide file tree
Showing 19 changed files with 173 additions and 67 deletions.
19 changes: 19 additions & 0 deletions src/config/settings.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package config

import (
"encoding/json"
"net/http"
"go.mau.fi/whatsmeow/proto/waCompanionReg"
)

Expand Down Expand Up @@ -28,4 +30,21 @@ var (
WhatsappTypeUser = "@s.whatsapp.net"
WhatsappTypeGroup = "@g.us"
WhatsappAccountValidation = true
IgnoreExtractMedia = false // Skip sync media to storages folder (jpg ...)
IgnoreExtractHistory = false // Skip sync history to storages folder
NumberFormatLocale = "" // Empty to maintain the current process or "Brazil" to use the WhatsApp number pattern for the country
)

func envHandler(w http.ResponseWriter, r *http.Request) { // exposes the NumberFormatLocal variable for use in JS functions
response := map[string]string{
"NumberFormatLocale": NumberFormatLocale,
}

w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response)
}

func config() {
http.HandleFunc("/api/config", envHandler)
http.ListenAndServe(":"+AppPort, nil)
}
9 changes: 9 additions & 0 deletions src/internal/rest/send.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func (controller *Send) SendText(c *fiber.Ctx) error {
err := c.BodyParser(&request)
utils.PanicIfNeeded(err)

request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendText(c.UserContext(), request)
Expand All @@ -54,6 +55,7 @@ func (controller *Send) SendImage(c *fiber.Ctx) error {
utils.PanicIfNeeded(err)

request.Image = file
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendImage(c.UserContext(), request)
Expand All @@ -76,6 +78,7 @@ func (controller *Send) SendFile(c *fiber.Ctx) error {
utils.PanicIfNeeded(err)

request.File = file
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendFile(c.UserContext(), request)
Expand All @@ -98,6 +101,7 @@ func (controller *Send) SendVideo(c *fiber.Ctx) error {
utils.PanicIfNeeded(err)

request.Video = video
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendVideo(c.UserContext(), request)
Expand All @@ -116,6 +120,7 @@ func (controller *Send) SendContact(c *fiber.Ctx) error {
err := c.BodyParser(&request)
utils.PanicIfNeeded(err)

request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendContact(c.UserContext(), request)
Expand All @@ -134,6 +139,7 @@ func (controller *Send) SendLink(c *fiber.Ctx) error {
err := c.BodyParser(&request)
utils.PanicIfNeeded(err)

request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendLink(c.UserContext(), request)
Expand All @@ -152,6 +158,7 @@ func (controller *Send) SendLocation(c *fiber.Ctx) error {
err := c.BodyParser(&request)
utils.PanicIfNeeded(err)

request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendLocation(c.UserContext(), request)
Expand All @@ -174,6 +181,7 @@ func (controller *Send) SendAudio(c *fiber.Ctx) error {
utils.PanicIfNeeded(err)

request.Audio = audio
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendAudio(c.UserContext(), request)
Expand All @@ -192,6 +200,7 @@ func (controller *Send) SendPoll(c *fiber.Ctx) error {
err := c.BodyParser(&request)
utils.PanicIfNeeded(err)

request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone)

response, err := controller.Service.SendPoll(c.UserContext(), request)
Expand Down
21 changes: 21 additions & 0 deletions src/pkg/utils/general.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package utils

import (
"fmt"
"github.com/aldinokemal/go-whatsapp-web-multidevice/config"
"github.com/PuerkitoBio/goquery"
"log"
"net/http"
Expand Down Expand Up @@ -109,3 +110,23 @@ func ContainsMention(message string) []string {
}
return phoneNumbers
}

func NumberFormatLocale(number string) string {

if config.NumberFormatLocale == "Brazil" {
if strings.HasSuffix(number, "@s.whatsapp.net") {
number = strings.TrimSuffix(number, "@s.whatsapp.net")
}

if !strings.HasPrefix(number, "55") {
number = "55" + number
}

if len(number) == 13 && number[4] == '9' {
return number[:4] + number[5:]
}
return number
}else{
return number
}
}
110 changes: 57 additions & 53 deletions src/pkg/whatsapp/whatsapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -282,22 +282,24 @@ func handler(rawEvt interface{}) {
log.Infof("%s is now online", evt.From)
}
case *events.HistorySync:
id := atomic.AddInt32(&historySyncID, 1)
fileName := fmt.Sprintf("%s/history-%d-%s-%d-%s.json", config.PathStorages, startupTime, cli.Store.ID.String(), id, evt.Data.SyncType.String())
file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
log.Errorf("Failed to open file to write history sync: %v", err)
return
}
enc := json.NewEncoder(file)
enc.SetIndent("", " ")
err = enc.Encode(evt.Data)
if err != nil {
log.Errorf("Failed to write history sync: %v", err)
return
if !config.IgnoreExtractHistory{
id := atomic.AddInt32(&historySyncID, 1)
fileName := fmt.Sprintf("%s/history-%d-%s-%d-%s.json", config.PathStorages, startupTime, cli.Store.ID.String(), id, evt.Data.SyncType.String())
file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
log.Errorf("Failed to open file to write history sync: %v", err)
return
}
enc := json.NewEncoder(file)
enc.SetIndent("", " ")
err = enc.Encode(evt.Data)
if err != nil {
log.Errorf("Failed to write history sync: %v", err)
return
}
log.Infof("Wrote history sync to %s", fileName)
_ = file.Close()
}
log.Infof("Wrote history sync to %s", fileName)
_ = file.Close()
case *events.AppState:
log.Debugf("App state event: %+v / %+v", evt.Index, evt.SyncActionValue)
}
Expand Down Expand Up @@ -454,43 +456,45 @@ func extractPhoneNumber(jid string) string {

// ExtractMedia is a helper function to extract media from whatsapp
func ExtractMedia(storageLocation string, mediaFile whatsmeow.DownloadableMessage) (extractedMedia ExtractedMedia, err error) {
if mediaFile == nil {
logrus.Info("Skip download because data is nil")
return extractedMedia, nil
}

data, err := cli.Download(mediaFile)
if err != nil {
return extractedMedia, err
}

switch media := mediaFile.(type) {
case *waE2E.ImageMessage:
extractedMedia.MimeType = media.GetMimetype()
extractedMedia.Caption = media.GetCaption()
case *waE2E.AudioMessage:
extractedMedia.MimeType = media.GetMimetype()
case *waE2E.VideoMessage:
extractedMedia.MimeType = media.GetMimetype()
extractedMedia.Caption = media.GetCaption()
case *waE2E.StickerMessage:
extractedMedia.MimeType = media.GetMimetype()
case *waE2E.DocumentMessage:
extractedMedia.MimeType = media.GetMimetype()
extractedMedia.Caption = media.GetCaption()
}

var extension string
if ext, err := mime.ExtensionsByType(extractedMedia.MimeType); err != nil && len(ext) > 0 {
extension = ext[0]
} else if parts := strings.Split(extractedMedia.MimeType, "/"); len(parts) > 1 {
extension = "." + parts[len(parts)-1]
}

extractedMedia.MediaPath = fmt.Sprintf("%s/%d-%s%s", storageLocation, time.Now().Unix(), uuid.NewString(), extension)
err = os.WriteFile(extractedMedia.MediaPath, data, 0600)
if err != nil {
return extractedMedia, err
}
if !config.IgnoreExtractMedia {
if mediaFile == nil {
logrus.Info("Skip download because data is nil")
return extractedMedia, nil
}

data, err := cli.Download(mediaFile)
if err != nil {
return extractedMedia, err
}

switch media := mediaFile.(type) {
case *waE2E.ImageMessage:
extractedMedia.MimeType = media.GetMimetype()
extractedMedia.Caption = media.GetCaption()
case *waE2E.AudioMessage:
extractedMedia.MimeType = media.GetMimetype()
case *waE2E.VideoMessage:
extractedMedia.MimeType = media.GetMimetype()
extractedMedia.Caption = media.GetCaption()
case *waE2E.StickerMessage:
extractedMedia.MimeType = media.GetMimetype()
case *waE2E.DocumentMessage:
extractedMedia.MimeType = media.GetMimetype()
extractedMedia.Caption = media.GetCaption()
}

var extension string
if ext, err := mime.ExtensionsByType(extractedMedia.MimeType); err != nil && len(ext) > 0 {
extension = ext[0]
} else if parts := strings.Split(extractedMedia.MimeType, "/"); len(parts) > 1 {
extension = "." + parts[len(parts)-1]
}

extractedMedia.MediaPath = fmt.Sprintf("%s/%d-%s%s", storageLocation, time.Now().Unix(), uuid.NewString(), extension)
err = os.WriteFile(extractedMedia.MediaPath, data, 0600)
if err != nil {
return extractedMedia, err
}
}
return extractedMedia, nil
}
4 changes: 3 additions & 1 deletion src/views/components/AccountAvatar.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'AccountAvatar',
data() {
Expand All @@ -12,7 +14,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/AccountUserInfo.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'AccountUserInfo',
data() {
Expand All @@ -15,7 +17,7 @@ export default {

computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/MessageDelete.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'DeleteMessage',
data() {
Expand All @@ -10,7 +12,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/MessageReact.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'ReactMessage',
data() {
Expand All @@ -11,7 +13,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/MessageRevoke.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'Message',
data() {
Expand All @@ -10,7 +12,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/MessageUpdate.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'UpdateMessage',
data() {
Expand All @@ -11,7 +13,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/SendAudio.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'Send',
data() {
Expand All @@ -9,7 +11,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/SendContact.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'SendContact',
data() {
Expand All @@ -11,7 +13,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
4 changes: 3 additions & 1 deletion src/views/components/SendFile.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'

export default {
name: 'SendFile',
props: {
Expand All @@ -16,7 +18,7 @@ export default {
},
computed: {
phone_id() {
return this.type === 'user' ? `${this.phone}@${window.TYPEUSER}` : `${this.phone}@${window.TYPEGROUP}`
return this.type === 'user' ? `${NumberFormatLocale(this.phone)}@${window.TYPEUSER}` : `${NumberFormatLocale(this.phone)}@${window.TYPEGROUP}`
}
},
methods: {
Expand Down
Loading

0 comments on commit 4a6d4d7

Please sign in to comment.