diff --git a/src/config/settings.go b/src/config/settings.go index eb33bb0..348ea92 100644 --- a/src/config/settings.go +++ b/src/config/settings.go @@ -1,6 +1,8 @@ package config import ( + "encoding/json" + "net/http" "go.mau.fi/whatsmeow/proto/waCompanionReg" ) @@ -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) +} diff --git a/src/internal/rest/send.go b/src/internal/rest/send.go index e0eb827..3190e18 100644 --- a/src/internal/rest/send.go +++ b/src/internal/rest/send.go @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) diff --git a/src/pkg/utils/general.go b/src/pkg/utils/general.go index af43d31..ab5ae2f 100644 --- a/src/pkg/utils/general.go +++ b/src/pkg/utils/general.go @@ -2,6 +2,7 @@ package utils import ( "fmt" + "github.com/aldinokemal/go-whatsapp-web-multidevice/config" "github.com/PuerkitoBio/goquery" "log" "net/http" @@ -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 + } +} diff --git a/src/pkg/whatsapp/whatsapp.go b/src/pkg/whatsapp/whatsapp.go index d0f4953..adda1d7 100644 --- a/src/pkg/whatsapp/whatsapp.go +++ b/src/pkg/whatsapp/whatsapp.go @@ -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) } @@ -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 } diff --git a/src/views/components/AccountAvatar.js b/src/views/components/AccountAvatar.js index 2e602cb..956a79c 100644 --- a/src/views/components/AccountAvatar.js +++ b/src/views/components/AccountAvatar.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'AccountAvatar', data() { @@ -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: { diff --git a/src/views/components/AccountUserInfo.js b/src/views/components/AccountUserInfo.js index a034990..11bdeb6 100644 --- a/src/views/components/AccountUserInfo.js +++ b/src/views/components/AccountUserInfo.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'AccountUserInfo', data() { @@ -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: { diff --git a/src/views/components/MessageDelete.js b/src/views/components/MessageDelete.js index cb6f46d..fad015a 100644 --- a/src/views/components/MessageDelete.js +++ b/src/views/components/MessageDelete.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'DeleteMessage', data() { @@ -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: { diff --git a/src/views/components/MessageReact.js b/src/views/components/MessageReact.js index d588965..e0648b8 100644 --- a/src/views/components/MessageReact.js +++ b/src/views/components/MessageReact.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'ReactMessage', data() { @@ -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: { diff --git a/src/views/components/MessageRevoke.js b/src/views/components/MessageRevoke.js index 959919b..c0917be 100644 --- a/src/views/components/MessageRevoke.js +++ b/src/views/components/MessageRevoke.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'Message', data() { @@ -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: { diff --git a/src/views/components/MessageUpdate.js b/src/views/components/MessageUpdate.js index 0138b64..0a25d9f 100644 --- a/src/views/components/MessageUpdate.js +++ b/src/views/components/MessageUpdate.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'UpdateMessage', data() { @@ -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: { diff --git a/src/views/components/SendAudio.js b/src/views/components/SendAudio.js index 7651ddd..44c60b7 100644 --- a/src/views/components/SendAudio.js +++ b/src/views/components/SendAudio.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'Send', data() { @@ -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: { diff --git a/src/views/components/SendContact.js b/src/views/components/SendContact.js index 2123962..28442db 100644 --- a/src/views/components/SendContact.js +++ b/src/views/components/SendContact.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'SendContact', data() { @@ -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: { diff --git a/src/views/components/SendFile.js b/src/views/components/SendFile.js index 7039f72..e7af0d9 100644 --- a/src/views/components/SendFile.js +++ b/src/views/components/SendFile.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'SendFile', props: { @@ -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: { diff --git a/src/views/components/SendImage.js b/src/views/components/SendImage.js index 04ae09e..2d08029 100644 --- a/src/views/components/SendImage.js +++ b/src/views/components/SendImage.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'SendImage', data() { @@ -13,7 +15,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: { diff --git a/src/views/components/SendLocation.js b/src/views/components/SendLocation.js index ce6c479..ebb34f0 100644 --- a/src/views/components/SendLocation.js +++ b/src/views/components/SendLocation.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'SendLocation', data() { @@ -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: { diff --git a/src/views/components/SendMessage.js b/src/views/components/SendMessage.js index 88235ea..31ad3ee 100644 --- a/src/views/components/SendMessage.js +++ b/src/views/components/SendMessage.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'SendMessage', data() { @@ -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: { diff --git a/src/views/components/SendPoll.js b/src/views/components/SendPoll.js index 5ef2ce7..765237f 100644 --- a/src/views/components/SendPoll.js +++ b/src/views/components/SendPoll.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + // export Vue Component export default { name: 'SendPoll', @@ -13,7 +15,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: { diff --git a/src/views/components/SendVideo.js b/src/views/components/SendVideo.js index 5574e50..43075e0 100644 --- a/src/views/components/SendVideo.js +++ b/src/views/components/SendVideo.js @@ -1,3 +1,5 @@ +import { NumberFormatLocale } from './funcoes.js' + export default { name: 'SendVideo', // define props @@ -19,7 +21,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: { diff --git a/src/views/components/funcoes.js b/src/views/components/funcoes.js new file mode 100644 index 0000000..0ac2c48 --- /dev/null +++ b/src/views/components/funcoes.js @@ -0,0 +1,25 @@ +async function getNumberFormatLocale() { + try { + const response = await fetch('/api/config'); + const config = await response.json(); + + console.log(config.NumberFormatLocale); + } catch (error) { + console.error('Error fetching the config:', error); + } +} + +export function NumberFormatLocale(number) { + if (getNumberFormatLocale() == "Brazil") { + if (!number.startsWith('55')) { + number = '55' + number; + } + + if (number.length === 13 && number[4] === '9') { + return number.slice(0, 4) + number.slice(5); + } + return number; + } + return number; +} +