146 lines
4.3 KiB
Go
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"`
|
|
}
|