Skip to content

Commit b4e860e

Browse files
committed
Sending Text Message Done
1 parent 9e9fefb commit b4e860e

6 files changed

Lines changed: 225 additions & 12 deletions

File tree

functions/whatsapp/core/interfaces.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ func (connection *WhatsappConnection) eventHandler(evt interface{}) {
115115
connection.Client.Store.Save(ctx)
116116
connection.Number = connection.Client.Store.ID.User
117117
go func() {
118-
whatsapp_config.WhatsappNumberConfigMap.Tokens[connection.Token] = connection.Number
119118
whatsapp_config.WhatsappNumberConfigMap.JID[connection.Token] = connection.Client.Store.ID.String()
120119
whatsapp_config.WhatsappNumberConfigMap.Save()
121120
}()

servers/soham/common/communication.interface.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ type MessageType string
44

55
const (
66
STATUS_MESSAGE MessageType = "STATUS_MESSAGE"
7+
REPSONSE_MESSAGE MessageType = "RESPONSE_MESSAGE"
78
SEND_TEXT_MESSAGE MessageType = "SEND_TEXT_MESSAGE"
89
)
910

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package soham_whatsapp_client_env
2+
3+
import (
4+
"net/url"
5+
6+
"github.com/rpsoftech/golang-servers/env"
7+
whatsapp_config "github.com/rpsoftech/golang-servers/functions/whatsapp/config"
8+
)
9+
10+
const SOCKET_URL_KEY = "SOCKET_URL"
11+
12+
var SocketUrl *url.URL
13+
14+
func InialiseSohamWhatsappClientEnv() {
15+
16+
env.LoadEnv("whatsapp-client.env")
17+
whatsapp_config.InitaliseWhatsappEnvAndConfig()
18+
urlString := env.Env.GetEnv(SOCKET_URL_KEY)
19+
if urlString == "" {
20+
panic("SOCKET_URL not defined in env file")
21+
}
22+
urlObject, err := url.ParseRequestURI(urlString)
23+
if err != nil {
24+
panic("SOCKET_URL is not a valid URL")
25+
}
26+
SocketUrl = urlObject
27+
}

servers/soham/whatsapp-client/main.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
"github.com/rpsoftech/golang-servers/interfaces"
1717
soham_whatsapp_client_apis "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/apis"
1818
whatsapp_client_core "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/core"
19+
soham_whatsapp_client_env "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/env"
20+
soham_whatsapp_client_websocket "github.com/rpsoftech/golang-servers/servers/soham/whatsapp-client/websoceket"
1921
utility_functions "github.com/rpsoftech/golang-servers/utility/functions"
2022
)
2123

@@ -24,8 +26,7 @@ var version string
2426
// var app *fiber.App
2527

2628
func main() {
27-
env.LoadEnv("whatsapp-client.env")
28-
whatsapp_config.InitaliseWhatsappEnvAndConfig()
29+
soham_whatsapp_client_env.InialiseSohamWhatsappClientEnv()
2930
println(version)
3031
go func() {
3132
os.RemoveAll("./tmp")
@@ -39,16 +40,23 @@ func main() {
3940
whatsapp_core.OutPutFilePath = ReturnOutPutFilePath(env.FindAndReturnCurrentDir())
4041
container := whatsapp_core.InitSqlContainer()
4142
if whatsapp_config.Env.AUTO_CONNECT_TO_WHATSAPP {
42-
go func() {
43-
for k, n := range whatsapp_config.WhatsappNumberConfigMap.Tokens {
44-
jidString := whatsapp_config.WhatsappNumberConfigMap.JID[k]
45-
whatsapp_config.WhatsappNumberToIDMap[k] = n
46-
whatsapp_core.ConnectToNumber(jidString, k, container)
43+
for k, n := range whatsapp_config.WhatsappNumberConfigMap.Tokens {
44+
jidString := whatsapp_config.WhatsappNumberConfigMap.JID[k]
45+
whatsapp_config.WhatsappNumberToIDMap[k] = n
46+
go whatsapp_core.ConnectToNumber(jidString, k, container)
47+
websokcetObj := soham_whatsapp_client_websocket.WebsocketConnectionObject{
48+
Url: soham_whatsapp_client_env.SocketUrl,
49+
Conn: nil,
50+
UUID: k,
51+
NUMBER: n,
52+
WhatsappConnectionMap: &whatsapp_core.ConnectionMap,
4753
}
48-
}()
54+
go websokcetObj.InitalizeWebsocket()
55+
go websokcetObj.CheckStatusAndSendResponse()
56+
}
4957
}
50-
InitFiberServer()
5158

59+
InitFiberServer()
5260
}
5361

5462
func InitFiberServer() {
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
package soham_whatsapp_client_websocket
2+
3+
import (
4+
"encoding/json"
5+
"log"
6+
"net/http"
7+
"net/url"
8+
"strconv"
9+
"time"
10+
11+
"github.com/gorilla/websocket"
12+
whatsapp_core "github.com/rpsoftech/golang-servers/functions/whatsapp/core"
13+
"github.com/rpsoftech/golang-servers/interfaces"
14+
soham_common_req_keys "github.com/rpsoftech/golang-servers/servers/soham/common"
15+
)
16+
17+
type WebsocketConnectionObject struct {
18+
Conn *websocket.Conn
19+
Url *url.URL
20+
WhatsappConnectionStatus soham_common_req_keys.ConnectionStatus
21+
connectionCalled bool
22+
connected bool
23+
UUID string
24+
NUMBER string
25+
WhatsappConnectionMap *whatsapp_core.IWhatsappConnectionMap
26+
WhatsappConnectino *whatsapp_core.WhatsappConnection
27+
}
28+
29+
// var connectionCalled = false
30+
31+
func (w *WebsocketConnectionObject) InitalizeWebsocket() {
32+
if w.connectionCalled {
33+
return
34+
}
35+
w.connectionCalled = true
36+
w.connected = false
37+
con, _, err := websocket.DefaultDialer.Dial(w.Url.String(), http.Header{
38+
soham_common_req_keys.WHATSAPP_CLIENT_NUM_KEY: []string{w.NUMBER},
39+
soham_common_req_keys.WHATSAPP_CLIENT_TOKEN_KEY: []string{w.UUID},
40+
})
41+
w.Conn = con
42+
defer con.Close()
43+
if err != nil {
44+
// log connection error
45+
log.Fatal("dial:", err)
46+
}
47+
w.connected = true
48+
done := make(chan int)
49+
go func() {
50+
for {
51+
// Read messages from the connection
52+
_, msg, err := w.Conn.ReadMessage()
53+
if err != nil {
54+
log.Println("read:", err)
55+
break
56+
}
57+
var whatsappClientMessage soham_common_req_keys.WhatsappClientMessage
58+
err = json.Unmarshal(msg, &whatsappClientMessage)
59+
if err != nil {
60+
log.Println("Error unmarshalling message:", err)
61+
continue
62+
}
63+
if whatsappClientMessage.Type == soham_common_req_keys.SEND_TEXT_MESSAGE {
64+
w.SendTextMessage(&whatsappClientMessage)
65+
}
66+
}
67+
done <- 1
68+
}()
69+
<-done
70+
w.connected = false
71+
w.connectionCalled = false
72+
go func() {
73+
time.Sleep(time.Second * 10)
74+
done <- 1
75+
}()
76+
<-done
77+
w.InitalizeWebsocket()
78+
}
79+
80+
func (w *WebsocketConnectionObject) SendTextMessage(wcm *soham_common_req_keys.WhatsappClientMessage) {
81+
reqId := wcm.ReqId
82+
jsonData, err := json.Marshal(wcm.Message)
83+
if err != nil {
84+
w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
85+
ReqId: reqId,
86+
Type: soham_common_req_keys.REPSONSE_MESSAGE,
87+
Message: interfaces.RequestError{Message: "Invalid message type"},
88+
})
89+
return
90+
}
91+
body := new(soham_common_req_keys.SendTextMessage)
92+
err = json.Unmarshal(jsonData, body)
93+
if err != nil {
94+
w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
95+
ReqId: reqId,
96+
Type: soham_common_req_keys.REPSONSE_MESSAGE,
97+
Message: interfaces.RequestError{Message: "Invalid message type"},
98+
})
99+
return
100+
}
101+
if w.WhatsappConnectino == nil {
102+
wc, ok := (*w.WhatsappConnectionMap)[w.UUID]
103+
if !ok {
104+
w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
105+
ReqId: reqId,
106+
Type: soham_common_req_keys.REPSONSE_MESSAGE,
107+
Message: interfaces.RequestError{Message: "Invalid from number"},
108+
})
109+
return
110+
}
111+
w.WhatsappConnectino = wc
112+
}
113+
wc := w.WhatsappConnectino
114+
if wc.ConnectionStatus != 1 {
115+
w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
116+
ReqId: reqId,
117+
Type: soham_common_req_keys.REPSONSE_MESSAGE,
118+
Message: interfaces.RequestError{Message: "Whatsapp not connected"},
119+
})
120+
return
121+
}
122+
toNumber := make([]string, len(body.To))
123+
for i, v := range body.To {
124+
toNumber[i] = strconv.Itoa(v)
125+
}
126+
127+
resp := wc.SendTextMessage(toNumber, body.Message)
128+
w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
129+
ReqId: reqId,
130+
Type: soham_common_req_keys.REPSONSE_MESSAGE,
131+
Message: resp,
132+
})
133+
}
134+
135+
func (w *WebsocketConnectionObject) SendResponse(wcm *soham_common_req_keys.WhatsappClientMessage) bool {
136+
if !w.connected {
137+
return false
138+
}
139+
w.Conn.WriteJSON(wcm)
140+
return true
141+
}
142+
143+
func (w *WebsocketConnectionObject) CheckStatusAndSendResponse() {
144+
time.Sleep(time.Second * 5)
145+
w.WhatsappConnectionStatus = soham_common_req_keys.NOT_LOGGED_IN
146+
if w.WhatsappConnectino == nil {
147+
wc, ok := (*w.WhatsappConnectionMap)[w.UUID]
148+
if !ok {
149+
w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
150+
Type: soham_common_req_keys.REPSONSE_MESSAGE,
151+
Message: interfaces.RequestError{Message: "Invalid from number"},
152+
})
153+
}
154+
w.WhatsappConnectino = wc
155+
}
156+
wc := w.WhatsappConnectino
157+
if wc.ConnectionStatus == 1 && w.WhatsappConnectionStatus != soham_common_req_keys.LOGGED_IN {
158+
if w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
159+
Type: soham_common_req_keys.STATUS_MESSAGE,
160+
Message: soham_common_req_keys.LOGGED_IN,
161+
}) {
162+
w.WhatsappConnectionStatus = soham_common_req_keys.LOGGED_IN
163+
}
164+
}
165+
if wc.ConnectionStatus != 1 && w.WhatsappConnectionStatus != soham_common_req_keys.LOGGED_IN {
166+
if w.SendResponse(&soham_common_req_keys.WhatsappClientMessage{
167+
Type: soham_common_req_keys.STATUS_MESSAGE,
168+
Message: soham_common_req_keys.NOT_LOGGED_IN,
169+
}) {
170+
w.WhatsappConnectionStatus = soham_common_req_keys.NOT_LOGGED_IN
171+
}
172+
}
173+
time.Sleep(time.Second * 5)
174+
w.CheckStatusAndSendResponse()
175+
}

utility/functions/validate-url.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package utility_functions
22

3-
func ValidateUrl(url string) bool {
4-
return true
3+
import "net/url"
4+
5+
func ValidateUrl(urlString string) bool {
6+
_, err := url.ParseRequestURI(urlString)
7+
return err == nil
58
}

0 commit comments

Comments
 (0)