Browse Source

format whatsapp number for brazilian rules

pull/201/head
Iago Cotta 1 year ago
parent
commit
4a6d4d74b6
  1. 19
      src/config/settings.go
  2. 9
      src/internal/rest/send.go
  3. 21
      src/pkg/utils/general.go
  4. 110
      src/pkg/whatsapp/whatsapp.go
  5. 4
      src/views/components/AccountAvatar.js
  6. 4
      src/views/components/AccountUserInfo.js
  7. 4
      src/views/components/MessageDelete.js
  8. 4
      src/views/components/MessageReact.js
  9. 4
      src/views/components/MessageRevoke.js
  10. 4
      src/views/components/MessageUpdate.js
  11. 4
      src/views/components/SendAudio.js
  12. 4
      src/views/components/SendContact.js
  13. 4
      src/views/components/SendFile.js
  14. 4
      src/views/components/SendImage.js
  15. 4
      src/views/components/SendLocation.js
  16. 4
      src/views/components/SendMessage.js
  17. 4
      src/views/components/SendPoll.js
  18. 4
      src/views/components/SendVideo.js
  19. 25
      src/views/components/funcoes.js

19
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)
}

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

21
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
}
}

110
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
}

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

4
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: {

25
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;
}
Loading…
Cancel
Save