rework ws responses to user, send events to user via ws
This commit is contained in:
+36
-45
@@ -7,7 +7,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"go-socket/Enums/WsMessageFrom"
|
||||
"go-socket/Enums/WsEventType"
|
||||
|
||||
"github.com/coder/websocket"
|
||||
"github.com/coder/websocket/wsjson"
|
||||
@@ -54,21 +54,7 @@ func ServeWsConnection(responseWriter http.ResponseWriter, request *http.Request
|
||||
}
|
||||
}
|
||||
|
||||
func sendMessageStructCloseIfTimeout(user *User, message *Message) {
|
||||
if user.WsConn == nil {
|
||||
return
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancel()
|
||||
|
||||
err := wsjson.Write(ctx, user.WsConn, message)
|
||||
if err != nil {
|
||||
log.Printf("json write error: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func sendMessageCloseIfTimeout(user *User, message *map[string]any) {
|
||||
func WsSendMessageCloseIfTimeout(user *User, message any) {
|
||||
if user.WsConn == nil {
|
||||
return
|
||||
}
|
||||
@@ -94,65 +80,64 @@ func sendToAllMessageCloseIfTimeout(message *map[string]any) {
|
||||
mu.RUnlock()
|
||||
|
||||
for _, user := range users {
|
||||
sendMessageCloseIfTimeout(user, message)
|
||||
WsSendMessageCloseIfTimeout(user, message)
|
||||
}
|
||||
}
|
||||
|
||||
func WsMessageSendToUser(to *User, message *Message) {
|
||||
sendMessageStructCloseIfTimeout(to, message)
|
||||
}
|
||||
|
||||
func WsSendToGroup(group *Group, sender *User, message string) error {
|
||||
func WsSendToGroupAsUser(group *Group, sender *User, message string) error {
|
||||
for groupUserId := range group.Users {
|
||||
groupUser, err := CacheGetUserById(groupUserId)
|
||||
if err != nil || groupUser.Id == sender.Id {
|
||||
continue
|
||||
}
|
||||
|
||||
// TODO update on groups rework
|
||||
var msg = map[string]any{
|
||||
"type": WsMessageFrom.Group,
|
||||
// "type": WsEventType.Group,
|
||||
"from": group.Id,
|
||||
"sender": sender.Id,
|
||||
"content": message,
|
||||
}
|
||||
sendMessageCloseIfTimeout(groupUser, &msg)
|
||||
WsSendMessageCloseIfTimeout(groupUser, &msg)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleAuthenticatedMessage(user *User, userMessage *map[string]any) bool {
|
||||
sendMessageCloseIfTimeout(user, userMessage)
|
||||
WsSendMessageCloseIfTimeout(user, userMessage)
|
||||
return true
|
||||
}
|
||||
|
||||
func handleUnauthenticatedMessage(ctx context.Context, user *User, userMessage *map[string]any) bool {
|
||||
token, ok := (*userMessage)["token"].(string)
|
||||
response := WsEventMessage{Type: WsEventType.Authentication}
|
||||
|
||||
if !ok {
|
||||
var msg = map[string]any{
|
||||
"type": WsMessageFrom.Server,
|
||||
"error": "no token in message",
|
||||
response.Event = WsAuthMessage{
|
||||
Success: false,
|
||||
Error: "no token in message",
|
||||
}
|
||||
sendMessageCloseIfTimeout(user, &msg)
|
||||
WsSendMessageCloseIfTimeout(user, response)
|
||||
return false
|
||||
}
|
||||
|
||||
userId, err := TokenValidateGetId(token)
|
||||
if err != nil {
|
||||
var msg = map[string]any{
|
||||
"type": WsMessageFrom.Server,
|
||||
"error": "invalid token",
|
||||
response.Event = WsAuthMessage{
|
||||
Success: false,
|
||||
Error: "invalid token",
|
||||
}
|
||||
sendMessageCloseIfTimeout(user, &msg)
|
||||
WsSendMessageCloseIfTimeout(user, response)
|
||||
return false
|
||||
}
|
||||
|
||||
userFromCache, err := CacheGetUserById(userId)
|
||||
if err != nil {
|
||||
var msg = map[string]any{
|
||||
"type": WsMessageFrom.Server,
|
||||
"error": "user not found",
|
||||
response.Event = WsAuthMessage{
|
||||
Success: false,
|
||||
Error: "user not found",
|
||||
}
|
||||
sendMessageCloseIfTimeout(user, &msg)
|
||||
WsSendMessageCloseIfTimeout(user, response)
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -166,25 +151,31 @@ func handleUnauthenticatedMessage(ctx context.Context, user *User, userMessage *
|
||||
|
||||
err = DbGroupGetById(ctx, dbGroup)
|
||||
if err != nil {
|
||||
var msg = map[string]any{
|
||||
"type": "server",
|
||||
"error": "invalid user data",
|
||||
response.Event = WsAuthMessage{
|
||||
Success: false,
|
||||
Error: "invalid user data",
|
||||
}
|
||||
sendMessageCloseIfTimeout(user, &msg)
|
||||
WsSendMessageCloseIfTimeout(user, response)
|
||||
return false
|
||||
}
|
||||
err = DbGroupGetMembers(ctx, dbGroup)
|
||||
if err != nil {
|
||||
var msg = map[string]any{
|
||||
"type": "server",
|
||||
"error": "invalid user data",
|
||||
response.Event = WsAuthMessage{
|
||||
Success: false,
|
||||
Error: "invalid user data",
|
||||
}
|
||||
sendMessageCloseIfTimeout(user, &msg)
|
||||
WsSendMessageCloseIfTimeout(user, response)
|
||||
return false
|
||||
}
|
||||
CacheSaveGroup(dbGroup)
|
||||
}
|
||||
}
|
||||
|
||||
response.Event = WsAuthMessage{
|
||||
Success: true,
|
||||
Error: "",
|
||||
}
|
||||
WsSendMessageCloseIfTimeout(user, response)
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user