fonchain-fiee/pkg/common/ws/wsMessageHandle.go
2025-06-12 19:31:40 +08:00

146 lines
4.3 KiB
Go

// Package ws -----------------------------
// @file : handler.go
// @author : JJXu
// @contact : wavingbear@163.com
// @time : 2022/10/23 11:13:43
// -------------------------------------------
package ws
import (
"context"
"encoding/json"
"fonchain-fiee/api/account"
"fonchain-fiee/api/accountFiee"
"fonchain-fiee/pkg/config"
"fonchain-fiee/pkg/e"
"fonchain-fiee/pkg/service"
"fonchain-fiee/pkg/utils/secret"
)
func AuthorizationVerify(sourceData []byte) (userInfo *accountFiee.ChatUserData, ok bool, err error) {
var msg AuthorizationInfo
err = json.Unmarshal(sourceData, &msg)
if err != nil {
return
}
if msg.Type != AuthorizationType {
return
}
if msg.Content.Auth == "" {
return
}
var ctx = context.Background()
var accountInfo accountFiee.ChatUserData
switch msg.Content.Domain {
case config.Domain:
//fiee token校验
msg.Content.Auth, err = secret.GetJwtFromStr(msg.Content.Auth)
if err != nil {
return
}
var fieeJwtInfo *accountFiee.DecryptJwtResponse
fieeJwtInfo, err = service.AccountFieeProvider.DecryptJwt(ctx, &accountFiee.DecryptJwtRequest{Token: msg.Content.Auth, Domain: msg.Content.Domain})
if err != nil || fieeJwtInfo.IsOffline {
return
}
accountInfo.Origin = msg.Content.Domain
accountInfo.OriginId = int64(fieeJwtInfo.ID)
accountInfo.Account = fieeJwtInfo.Account
accountInfo.NickName = fieeJwtInfo.NickName
case "fontree":
//erp token校验
msg.Content.Auth, err = secret.GetJwtFromStr(msg.Content.Auth)
if err != nil {
return
}
var fontreeJwtInfo *account.DecryptJwtResponse
fontreeJwtInfo, err = service.AccountProvider.DecryptJwt(ctx, &account.DecryptJwtRequest{Token: msg.Content.Auth, Domain: msg.Content.Domain})
if err != nil || fontreeJwtInfo.IsOffline {
return
}
accountInfo.Origin = msg.Content.Domain
accountInfo.OriginId = int64(fontreeJwtInfo.ID)
accountInfo.Account = fontreeJwtInfo.Account
accountInfo.NickName = fontreeJwtInfo.NickName
}
//查询是否已经注册
var chatUserQuery *accountFiee.GetChatUserListResp
chatUserQuery, err = service.AccountFieeProvider.GetChatUserList(ctx, &accountFiee.GetChatUserListRequest{
Query: &accountFiee.ChatUserData{OriginId: int64(accountInfo.ID), Origin: msg.Content.Domain},
Page: 1,
PageSize: 1,
})
//如果找不到聊天用户则创建
if err != nil || chatUserQuery.Total > 0 {
//注册客服
var createUserRes *accountFiee.CreateChatUserResp
createUserRes, err = service.AccountFieeProvider.CreateChatUser(ctx, &accountFiee.ChatUserData{
NickName: accountInfo.NickName,
Account: accountInfo.Account,
Role: 2,
Origin: msg.Content.Domain,
OriginId: int64(accountInfo.ID),
})
if err != nil {
return
}
userInfo = createUserRes.GetData()
}
ok = true
return
}
func HandleMessage(sourceData []byte, cli *Client) {
var msg WsInfo
err := json.Unmarshal(sourceData, &msg)
if err != nil {
cli.Send <- WsErrorInvalidDataFormat(msg.From)
return
}
switch msg.Type {
default:
cli.Send <- WsErrorUnknownMessageType(msg.From)
case TestType:
var newMsg = WsInfo{
Type: TestType,
Content: msg.Content,
From: "0",
To: msg.From,
}
byteMsg, _ := json.Marshal(newMsg)
cli.Send <- byteMsg
case ChatType:
if msg.From == "" {
//客户端id不能为空
cli.Send <- WsErrorMessage(ChatType, "null", e.ErrInvalidClientId, nil)
return
}
var chatInfo ChatInfo
_ = json.Unmarshal(sourceData, &chatInfo)
//解析Content
if clients, ok := cli.Room.clients[chatInfo.Content.TargetUserId]; ok {
for _, targetObj := range clients {
if targetObj != nil {
targetObj.Send <- WsChatMessage(msg.From, chatInfo.Content.TargetClientId, chatInfo.Content.Msg)
}
}
} else {
//对方不在线
cli.Send <- WsErrorMessage(ChatType, msg.From, e.ErrTargetOutLine, nil)
}
}
}
type ChatInfo struct {
Type WsType `json:"type"` //消息类型
Content ChatContent `json:"content"` //消息内容
From string `json:"from"` //发送者 0为服务端,客户端填写clientId
To string `json:"to"` //接收者 接收消息的用户id
}
type ChatContent struct {
TargetUuid string `json:"targetUuid"`
TargetUserId int64 `json:"targetUserId"`
TargetClientId string `json:"targetClientId"`
Msg string `json:"msg"`
}