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. 4
      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 package config
import ( import (
"encoding/json"
"net/http"
"go.mau.fi/whatsmeow/proto/waCompanionReg" "go.mau.fi/whatsmeow/proto/waCompanionReg"
) )
@ -28,4 +30,21 @@ var (
WhatsappTypeUser = "@s.whatsapp.net" WhatsappTypeUser = "@s.whatsapp.net"
WhatsappTypeGroup = "@g.us" WhatsappTypeGroup = "@g.us"
WhatsappAccountValidation = true 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) err := c.BodyParser(&request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendText(c.UserContext(), request) response, err := controller.Service.SendText(c.UserContext(), request)
@ -54,6 +55,7 @@ func (controller *Send) SendImage(c *fiber.Ctx) error {
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Image = file request.Image = file
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendImage(c.UserContext(), request) response, err := controller.Service.SendImage(c.UserContext(), request)
@ -76,6 +78,7 @@ func (controller *Send) SendFile(c *fiber.Ctx) error {
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.File = file request.File = file
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendFile(c.UserContext(), request) response, err := controller.Service.SendFile(c.UserContext(), request)
@ -98,6 +101,7 @@ func (controller *Send) SendVideo(c *fiber.Ctx) error {
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Video = video request.Video = video
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendVideo(c.UserContext(), request) response, err := controller.Service.SendVideo(c.UserContext(), request)
@ -116,6 +120,7 @@ func (controller *Send) SendContact(c *fiber.Ctx) error {
err := c.BodyParser(&request) err := c.BodyParser(&request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendContact(c.UserContext(), request) response, err := controller.Service.SendContact(c.UserContext(), request)
@ -134,6 +139,7 @@ func (controller *Send) SendLink(c *fiber.Ctx) error {
err := c.BodyParser(&request) err := c.BodyParser(&request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendLink(c.UserContext(), request) response, err := controller.Service.SendLink(c.UserContext(), request)
@ -152,6 +158,7 @@ func (controller *Send) SendLocation(c *fiber.Ctx) error {
err := c.BodyParser(&request) err := c.BodyParser(&request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendLocation(c.UserContext(), request) response, err := controller.Service.SendLocation(c.UserContext(), request)
@ -174,6 +181,7 @@ func (controller *Send) SendAudio(c *fiber.Ctx) error {
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Audio = audio request.Audio = audio
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendAudio(c.UserContext(), request) response, err := controller.Service.SendAudio(c.UserContext(), request)
@ -192,6 +200,7 @@ func (controller *Send) SendPoll(c *fiber.Ctx) error {
err := c.BodyParser(&request) err := c.BodyParser(&request)
utils.PanicIfNeeded(err) utils.PanicIfNeeded(err)
request.Phone = utils.NumberFormatLocale(request.Phone)
whatsapp.SanitizePhone(&request.Phone) whatsapp.SanitizePhone(&request.Phone)
response, err := controller.Service.SendPoll(c.UserContext(), request) response, err := controller.Service.SendPoll(c.UserContext(), request)

21
src/pkg/utils/general.go

@ -2,6 +2,7 @@ package utils
import ( import (
"fmt" "fmt"
"github.com/aldinokemal/go-whatsapp-web-multidevice/config"
"github.com/PuerkitoBio/goquery" "github.com/PuerkitoBio/goquery"
"log" "log"
"net/http" "net/http"
@ -109,3 +110,23 @@ func ContainsMention(message string) []string {
} }
return phoneNumbers 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
}
}

4
src/pkg/whatsapp/whatsapp.go

@ -282,6 +282,7 @@ func handler(rawEvt interface{}) {
log.Infof("%s is now online", evt.From) log.Infof("%s is now online", evt.From)
} }
case *events.HistorySync: case *events.HistorySync:
if !config.IgnoreExtractHistory{
id := atomic.AddInt32(&historySyncID, 1) 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()) 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) file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE, 0600)
@ -298,6 +299,7 @@ func handler(rawEvt interface{}) {
} }
log.Infof("Wrote history sync to %s", fileName) log.Infof("Wrote history sync to %s", fileName)
_ = file.Close() _ = file.Close()
}
case *events.AppState: case *events.AppState:
log.Debugf("App state event: %+v / %+v", evt.Index, evt.SyncActionValue) log.Debugf("App state event: %+v / %+v", evt.Index, evt.SyncActionValue)
} }
@ -454,6 +456,7 @@ func extractPhoneNumber(jid string) string {
// ExtractMedia is a helper function to extract media from whatsapp // ExtractMedia is a helper function to extract media from whatsapp
func ExtractMedia(storageLocation string, mediaFile whatsmeow.DownloadableMessage) (extractedMedia ExtractedMedia, err error) { func ExtractMedia(storageLocation string, mediaFile whatsmeow.DownloadableMessage) (extractedMedia ExtractedMedia, err error) {
if !config.IgnoreExtractMedia {
if mediaFile == nil { if mediaFile == nil {
logrus.Info("Skip download because data is nil") logrus.Info("Skip download because data is nil")
return extractedMedia, nil return extractedMedia, nil
@ -492,5 +495,6 @@ func ExtractMedia(storageLocation string, mediaFile whatsmeow.DownloadableMessag
if err != nil { if err != nil {
return extractedMedia, err return extractedMedia, err
} }
}
return extractedMedia, nil return extractedMedia, nil
} }

4
src/views/components/AccountAvatar.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'AccountAvatar', name: 'AccountAvatar',
data() { data() {
@ -12,7 +14,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/AccountUserInfo.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'AccountUserInfo', name: 'AccountUserInfo',
data() { data() {
@ -15,7 +17,7 @@ export default {
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/MessageDelete.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'DeleteMessage', name: 'DeleteMessage',
data() { data() {
@ -10,7 +12,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/MessageReact.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'ReactMessage', name: 'ReactMessage',
data() { data() {
@ -11,7 +13,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/MessageRevoke.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'Message', name: 'Message',
data() { data() {
@ -10,7 +12,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/MessageUpdate.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'UpdateMessage', name: 'UpdateMessage',
data() { data() {
@ -11,7 +13,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendAudio.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'Send', name: 'Send',
data() { data() {
@ -9,7 +11,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendContact.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'SendContact', name: 'SendContact',
data() { data() {
@ -11,7 +13,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendFile.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'SendFile', name: 'SendFile',
props: { props: {
@ -16,7 +18,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendImage.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'SendImage', name: 'SendImage',
data() { data() {
@ -13,7 +15,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendLocation.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'SendLocation', name: 'SendLocation',
data() { data() {
@ -11,7 +13,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendMessage.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'SendMessage', name: 'SendMessage',
data() { data() {
@ -11,7 +13,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendPoll.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
// export Vue Component // export Vue Component
export default { export default {
name: 'SendPoll', name: 'SendPoll',
@ -13,7 +15,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { methods: {

4
src/views/components/SendVideo.js

@ -1,3 +1,5 @@
import { NumberFormatLocale } from './funcoes.js'
export default { export default {
name: 'SendVideo', name: 'SendVideo',
// define props // define props
@ -19,7 +21,7 @@ export default {
}, },
computed: { computed: {
phone_id() { 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: { 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