Merge branch 'jdshop' of e.coding.net:rosydev/jx-callback into jdshop

This commit is contained in:
邹宗楠
2023-04-27 14:24:51 +08:00
11 changed files with 1076 additions and 1037 deletions

View File

@@ -12,13 +12,13 @@ type ICacher interface {
GetAs(key string, ptr interface{}) error GetAs(key string, ptr interface{}) error
Keys(prefix string) ([]string, error) Keys(prefix string) ([]string, error)
//FlushDB() error FlushDB() error
//Incr(key string) error Incr(key string) error
//LRange(key string) (retVal []string) LRange(key string) (retVal []string)
//Exists(keys ...string) (int64, error) Exists(keys ...string) (int64, error)
//RPush(key string, value interface{}) error RPush(key string, value interface{}) error
//Expire(key string, expiration time.Duration) error Expire(key string, expiration time.Duration) error
//LRem(key string, count int, value interface{}) error LRem(key string, count int, value interface{}) error
//LSet(key string, index int, value interface{}) error LSet(key string, index int, value interface{}) error
//ExpireResult(key string, expiration time.Duration) (bool, error) ExpireResult(key string, expiration time.Duration) (bool, error)
} }

View File

@@ -1,7 +1,11 @@
package ebai package ebai
import ( import (
"encoding/json"
"git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/platformapi/ebaiapi"
"git.rosy.net.cn/jx-callback/business/partner/purchase/im"
"git.rosy.net.cn/jx-callback/globals/api"
) )
const ( const (
@@ -10,9 +14,9 @@ const (
// OnImMessage 用户/骑手 发送/已读消息 回调 // OnImMessage 用户/骑手 发送/已读消息 回调
func (p *PurchaseHandler) OnImMessage(msg *ebaiapi.CallbackMsg) (response *ebaiapi.CallbackResponse) { func (p *PurchaseHandler) OnImMessage(msg *ebaiapi.CallbackMsg) (response *ebaiapi.CallbackResponse) {
//str, err := json.Marshal(msg.Data) str, err := json.Marshal(msg.Data)
//im.ReadMsgFromVendor(IMVendorIDELM, msg.Source, str) im.ReadMsgFromVendor(IMVendorIDELM, msg.Source, str)
return nil //return nil
//return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil) return api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil)
} }

View File

@@ -1,356 +1,361 @@
package im package im
// import (
//import ( "encoding/json"
// "encoding/json" "errors"
// "errors" "fmt"
// "fmt"
// "net/http" "git.rosy.net.cn/jx-callback/globals"
//
// "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/baseapi/platformapi/ebaiapi"
//
// "git.rosy.net.cn/baseapi/platformapi/ebaiapi" "git.rosy.net.cn/baseapi/platformapi/mtwmapi"
// "git.rosy.net.cn/baseapi/utils"
// "git.rosy.net.cn/baseapi/platformapi/mtwmapi" push "git.rosy.net.cn/jx-callback/business/jxutils/unipush"
// "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals/api"
// push "git.rosy.net.cn/jx-callback/business/jxutils/unipush" "github.com/gorilla/websocket"
// "git.rosy.net.cn/jx-callback/globals/api" )
// "github.com/gorilla/websocket"
//) // SendToVendor 向平台发消息
// func SendToVendor(msg []byte) {
//// SendToVendor 向平台发消息 var (
//func SendToVendor(msg []byte) { //w http.ResponseWriter
// var ( sendData SendData
// w http.ResponseWriter err error
// sendData SendData elmAppID = api.EbaiAPI.GetSource()
// err error )
// elmAppID = api.EbaiAPI.GetSource()
// ) //解析数据
// if err = json.Unmarshal(msg, &sendData); err != nil {
// //解析数据 return
// if err = json.Unmarshal(msg, &sendData); err != nil { }
// return
// } //存储数据
// ReadMsgFromClient(sendData.VendorID, elmAppID, sendData.Data)
// //存储数据
// ReadMsgFromClient(sendData.VendorID, elmAppID, sendData.Data) //发送信息
// if sendData.VendorID == VendorIDMT {
// //发送信息 temp, _ := json.Marshal(sendData.Data)
// if sendData.VendorID == VendorIDMT { Send(temp)
// temp, _ := json.Marshal(sendData.Data) }
// Send(temp) if sendData.VendorID == VendorIDELM {
// } param := sendData.Data.(ebaiapi.BusinessSendMsgReq)
// if sendData.VendorID == VendorIDELM { if err := api.EbaiAPI.BusinessSendMsg(&param); err != nil {
// param := sendData.Data.(ebaiapi.BusinessSendMsgReq) globals.SugarLogger.Debugf("elm发送信息错误%v", err)
// if err := api.EbaiAPI.BusinessSendMsg(&param); err != nil { return
// globals.SugarLogger.Debugf("elm发送信息错误%v", err) }
// return }
// }
// } if err != nil {
// ClientRender(Fail, FailMsg, map[string]string{
// if err != nil { "errMsg": fmt.Sprintf("%v", err),
// ClientRender(w, Fail, FailMsg, map[string]string{ })
// "errMsg": fmt.Sprintf("%v", err), return
// }) } else {
// } else { ClientRender(SuccessCode, SuccessMsg, map[string]interface{}{
// ClientRender(w, SuccessCode, SuccessMsg, map[string]interface{}{ "vendorID": sendData.VendorID,
// "vendorID": sendData.VendorID, "msg": "ok",
// "msg": "ok", })
// }) return
// } }
// return }
//}
// func Send(data []byte) {
//func Send(data []byte) { //生成完整url
// //生成完整url fullUrl := GenFullUrl() //clientID暂时不用
// fullUrl := GenFullUrl() //clientID暂时不用
// conn, resp, err := websocket.DefaultDialer.Dial(fullUrl, nil)
// conn, resp, err := websocket.DefaultDialer.Dial(fullUrl, nil) if err != nil || resp.StatusCode != 101 {
// if err != nil || resp.StatusCode != 101 { fmt.Printf("连接失败:%v http响应不成功", err)
// fmt.Printf("连接失败:%v http响应不成功", err) }
// } //关闭
// //关闭 defer func(conn *websocket.Conn) {
// defer func(conn *websocket.Conn) { err := conn.Close()
// err := conn.Close() if err != nil {
// if err != nil { return
// return }
// } }(conn)
// }(conn)
// err = conn.WriteMessage(websocket.TextMessage, data)
// err = conn.WriteMessage(websocket.TextMessage, data) if err != nil {
// if err != nil { fmt.Println(err)
// fmt.Println(err) }
// }
// for {
// for { _, msg, err := conn.ReadMessage()
// _, msg, err := conn.ReadMessage() if err != nil {
// if err != nil { break
// break } else {
// } else { temp := string(msg)
// temp := string(msg) if temp != HeartCheckSuccess {
// if temp != HeartCheckSuccess { ReadMsgFromVendor(VendorIDMT, "", msg)
// ReadMsgFromVendor(VendorIDMT, "", msg) }
// } }
// } fmt.Printf("%s receive: %s\n", conn.RemoteAddr(), string(msg))
// fmt.Printf("%s receive: %s\n", conn.RemoteAddr(), string(msg)) }
// } return
//} }
//
//// ReadMsgFromClient 存储客户端发送的消息 // ReadMsgFromClient 存储客户端发送的消息
//func ReadMsgFromClient(vendorID int, elmAppID string, msg interface{}) { func ReadMsgFromClient(vendorID int, elmAppID string, msg interface{}) {
// var ( var (
// err error err error
// jxMsg = &JXMsg{} jxMsg = &JXMsg{}
// userList = &UserMessageList{} userList = &UserMessageList{}
// ) )
//
// data, err := json.Marshal(msg) data, err := json.Marshal(msg)
// if err != nil { if err != nil {
// return return
// } }
//
// if vendorID == VendorIDMT { if vendorID == VendorIDMT {
// var MtSingleChat = mtwmapi.SingleChat{} var MtSingleChat = mtwmapi.SingleChat{}
// err = json.Unmarshal(data, &MtSingleChat) err = json.Unmarshal(data, &MtSingleChat)
// jxMsg = &JXMsg{ jxMsg = &JXMsg{
// SendType: SendTypeJx, SendType: SendTypeJx,
// Data: MtSingleChat, MsgContent: MtSingleChat,
// } }
// userList = &UserMessageList{ userList = &UserMessageList{
// VendorID: VendorIDMT, VendorID: VendorIDMT,
// UserID: utils.Int2Str(MtSingleChat.OpenUserID), UserID: utils.Int2Str(MtSingleChat.OpenUserID),
// LatestMsg: MtSingleChat.MsgContent, LatestMsg: MtSingleChat.MsgContent,
// LatestTime: MtSingleChat.Cts, LatestTime: MtSingleChat.Cts,
// } }
// } }
// if vendorID == VendorIDELM { if vendorID == VendorIDELM {
// var ElmData = ebaiapi.ImMessageSend{} var ElmData = ebaiapi.ImMessageSend{}
// err = json.Unmarshal(data, &ElmData) err = json.Unmarshal(data, &ElmData)
// jxMsg = &JXMsg{ jxMsg = &JXMsg{
// SendType: SendTypeJx, SendType: SendTypeJx,
// Data: ElmData, MsgContent: ElmData,
// } }
// userList = &UserMessageList{ userList = &UserMessageList{
// VendorID: VendorIDMT, VendorID: VendorIDMT,
// UserID: ElmData.PayLoad.GroupID, UserID: ElmData.PayLoad.GroupID,
// LatestMsg: ElmData.PayLoad.Content, LatestMsg: ElmData.PayLoad.Content,
// LatestTime: int(ElmData.PayLoad.CreateTime), LatestTime: int(ElmData.PayLoad.CreateTime),
// } }
// } }
//
// //1 存储详细聊天记录list //1 存储详细聊天记录list
// if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil { if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil {
// return globals.SugarLogger.Debugf("ReadMsgFromClient SetMessageDetail err:=%v\n", err)
// } //return
// //2 存储展示列表时单条数据 }
// if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil { //2 存储展示列表时单条数据
// return if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil {
// } globals.SugarLogger.Debugf("ReadMsgFromClient SetUserList err:=%v\n", err)
//} //return
// }
//// ReadMsgFromVendor 读取数据并存储到redis }
//func ReadMsgFromVendor(vendorID int, elmAppID string, msg []byte) {
// if string(msg) == "" { // ReadMsgFromVendor 读取数据并存储到redis
// return func ReadMsgFromVendor(vendorID int, elmAppID string, msg []byte) {
// } if string(msg) == "" {
// var ( return
// err error }
// vendorStoreID string var (
// jxMsg = &JXMsg{} err error
// userList = &UserMessageList{} vendorStoreID string
// ) jxMsg = &JXMsg{}
// if vendorID == VendorIDMT { userList = &UserMessageList{}
// var MtSingleChat = mtwmapi.SingleChat{} )
// err = json.Unmarshal(msg, &MtSingleChat) if vendorID == VendorIDMT {
// jxMsg = &JXMsg{ var MtSingleChat = mtwmapi.SingleChat{}
// SendType: SendTypeMt, err = json.Unmarshal(msg, &MtSingleChat)
// Data: MtSingleChat, jxMsg = &JXMsg{
// } SendType: SendTypeMt,
// userList = &UserMessageList{ MsgContent: MtSingleChat,
// VendorID: VendorIDMT, }
// UserID: utils.Int2Str(MtSingleChat.OpenUserID), userList = &UserMessageList{
// LatestMsg: MtSingleChat.MsgContent, VendorID: VendorIDMT,
// LatestTime: MtSingleChat.Cts, UserID: utils.Int2Str(MtSingleChat.OpenUserID),
// } LatestMsg: MtSingleChat.MsgContent,
// vendorStoreID = MtSingleChat.AppPoiCode LatestTime: MtSingleChat.Cts,
// } }
// if vendorID == VendorIDELM { vendorStoreID = MtSingleChat.AppPoiCode
// var ElmData = ebaiapi.ImMessageSend{} }
// err = json.Unmarshal(msg, &ElmData) if vendorID == VendorIDELM {
// jxMsg = &JXMsg{ var ElmData = ebaiapi.ImMessageSend{}
// SendType: SendTypeElm, err = json.Unmarshal(msg, &ElmData)
// Data: ElmData, jxMsg = &JXMsg{
// } SendType: SendTypeElm,
// userList = &UserMessageList{ MsgContent: ElmData,
// VendorID: VendorIDMT, }
// UserID: ElmData.PayLoad.GroupID, userList = &UserMessageList{
// LatestMsg: ElmData.PayLoad.Content, VendorID: VendorIDMT,
// LatestTime: int(ElmData.PayLoad.CreateTime), UserID: ElmData.PayLoad.GroupID,
// } LatestMsg: ElmData.PayLoad.Content,
// } LatestTime: int(ElmData.PayLoad.CreateTime),
// }
// //1 存储详细聊天记录list }
// if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil {
// return //1 存储详细聊天记录list
// } if err = SetMessageDetail(jxMsg, vendorID, elmAppID); err != nil {
// //2 存储展示列表时单条数据 globals.SugarLogger.Debugf("ReadMsgFromVendor SetMessageDetail err:=%v\n", err)
// if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil { //return
// return }
// } //2 存储展示列表时单条数据
// //3 cid推送新消息 if err = SetUserList(jxMsg, userList, vendorID, elmAppID); err != nil {
// err = PushMsgByCid(vendorStoreID, vendorID) globals.SugarLogger.Debugf("ReadMsgFromVendor SetUserList err:=%v\n", err)
// //4 长链接通知给客户端 //return
// ToClientChan <- clientInfo{Code: SuccessCode, Msg: fmt.Sprintf("%v", err), Data: jxMsg} }
//} //3 cid推送新消息
// err = PushMsgByCid(vendorStoreID, vendorID)
//// PushMsgByCid 通过cid push用户 //4 长链接通知给客户端
//func PushMsgByCid(vendorStoreID string, vendorID int) error { ToClientChan <- clientInfo{Code: SuccessCode, Msg: fmt.Sprintf("%v", err), Data: jxMsg}
// if err := push.NotifyImNewMessage(vendorStoreID, vendorID); err != nil { return
// return err }
// }
// return nil // PushMsgByCid 通过cid push用户
//} func PushMsgByCid(vendorStoreID string, vendorID int) error {
// if err := push.NotifyImNewMessage(vendorStoreID, vendorID); err != nil {
//// SetMessageDetail 赋值 return err
////格式 AppID:AppPoiCode:10:OpenUserID }
//func SetMessageDetail(req *JXMsg, vendorID int, elmAppID string) error { return nil
// //生成京西消息ID detail }
// msgID := GenMsgDetailID(req, vendorID, elmAppID)
// // SetMessageDetail 赋值
// data, _ := json.Marshal(req) //格式 AppID:AppPoiCode:10:OpenUserID
// err := rdb.RPush(msgID, string(data)) func SetMessageDetail(req *JXMsg, vendorID int, elmAppID string) error {
// ok, err := rdb.ExpireResult(msgID, ExpireTimeDay) //生成京西消息ID detail
// if err != nil || !ok { msgID := GenMsgDetailID(req, vendorID, elmAppID)
// return err
// } data, _ := json.Marshal(req)
// return nil err := rdb.RPush(msgID, string(data))
//} ok, err := rdb.ExpireResult(msgID, ExpireTimeDay)
// if err != nil || !ok {
//// SetUserList 赋值 return err
////AppPoiCode:10 [userid1:{SingleChat},userid2:{}] }
//func SetUserList(jxMsg *JXMsg, userList *UserMessageList, vendorID int, elmAppID string) error { return nil
// //生成msgID }
// msgID := GenMsgListID(jxMsg, vendorID, elmAppID)
// // SetUserList 赋值
// //获取未读消息条数并删除旧数据 //AppPoiCode:10 [userid1:{SingleChat},userid2:{}]
// cnt, err := GetNewAndTrim(msgID, userList.UserID) func SetUserList(jxMsg *JXMsg, userList *UserMessageList, vendorID int, elmAppID string) error {
// if cnt > 0 { //生成msgID
// userList.NewMessageNum = cnt msgID := GenMsgListID(jxMsg, vendorID, elmAppID)
// } else {
// userList.NewMessageNum = 1 //获取未读消息条数并删除旧数据
// } cnt, err := GetNewAndTrim(msgID, userList.UserID)
// //存储当前数据 if cnt > 0 {
// data, _ := json.Marshal(userList) userList.NewMessageNum = cnt
// err = rdb.RPush(msgID, string(data)) } else {
// userList.NewMessageNum = 1
// ok, err := rdb.ExpireResult(msgID, ExpireTimeDay) }
// if err != nil || !ok { //存储当前数据
// return err data, _ := json.Marshal(userList)
// } err = rdb.RPush(msgID, string(data))
// return nil
//} ok, err := rdb.ExpireResult(msgID, ExpireTimeDay)
// if err != nil || !ok {
//// GetNewAndTrim 获取未读条数并清除旧数据 return err
//func GetNewAndTrim(key string, flag string) (cnt int, err error) { }
// cnt = 0 return nil
// if n, err := rdb.Exists(key); n > 0 && err == nil { }
// s2 := rdb.LRange(key)
// for i := 0; i < len(s2); i++ { // GetNewAndTrim 获取未读条数并清除旧数据
// v := UserMessageList{} func GetNewAndTrim(key string, flag string) (cnt int, err error) {
// _ = json.Unmarshal([]byte(s2[i]), &v) cnt = 0
// if v.UserID == flag { if n, err := rdb.Exists(key); n > 0 && err == nil {
// err = rdb.LSet(key, i, "del") s2 := rdb.LRange(key)
// err = rdb.LRem(key, 0, "del") for i := 0; i < len(s2); i++ {
// s2 = append(s2[:i], s2[i+1:]...) v := UserMessageList{}
// i-- _ = json.Unmarshal([]byte(s2[i]), &v)
// if v.NewMessageNum == 0 { //目前为首条 if v.UserID == flag {
// cnt++ //赋值1 err = rdb.LSet(key, i, "del")
// } else { err = rdb.LRem(key, 0, "del")
// cnt = v.NewMessageNum s2 = append(s2[:i], s2[i+1:]...)
// } i--
// } if v.NewMessageNum == 0 { //目前为首条
// } cnt++ //赋值1
// } else { } else {
// return 0, nil cnt = v.NewMessageNum
// } }
// return cnt, err }
//} }
// } else {
//// GenMsgDetailID 生成查询详细聊天记录ID return 0, nil
//func GenMsgDetailID(jxMsg *JXMsg, vendorID int, elmAppID string) (msgID string) { }
// if vendorID == VendorIDMT { return cnt, err
// var d1 = jxMsg.Data.(mtwmapi.SingleChat) }
// msgID = utils.Int2Str(d1.AppID) + ":" + d1.AppPoiCode + ":10:" + utils.Int2Str(d1.OpenUserID)
// } // GenMsgDetailID 生成查询详细聊天记录ID
// if vendorID == VendorIDELM { func GenMsgDetailID(jxMsg *JXMsg, vendorID int, elmAppID string) (msgID string) {
// var d2 = jxMsg.Data.(ebaiapi.ImMessageSend) if vendorID == VendorIDMT {
// msgID = elmAppID + ":" + d2.PlatformShopID + ":11:" + d2.PayLoad.GroupID var d1 = jxMsg.MsgContent.(mtwmapi.SingleChat)
// } msgID = utils.Int2Str(d1.AppID) + ":" + d1.AppPoiCode + ":10:" + utils.Int2Str(d1.OpenUserID)
// return msgID }
//} if vendorID == VendorIDELM {
// var d2 = jxMsg.MsgContent.(ebaiapi.ImMessageSend)
//// GenMsgListID 生成展示列表时单条数据ID部分 msgID = elmAppID + ":" + d2.PlatformShopID + ":11:" + d2.PayLoad.GroupID
//func GenMsgListID(jxMsg *JXMsg, vendorID int, elmAppID string) (msgID string) { }
// if vendorID == VendorIDMT { return msgID
// var d1 = jxMsg.Data.(mtwmapi.SingleChat) }
// msgID = utils.Int2Str(d1.AppID) + ":" + d1.AppPoiCode + ":10"
// } // GenMsgListID 生成展示列表时单条数据ID部分
// if vendorID == VendorIDELM { func GenMsgListID(jxMsg *JXMsg, vendorID int, elmAppID string) (msgID string) {
// var d2 = jxMsg.Data.(ebaiapi.ImMessageSend) if vendorID == VendorIDMT {
// msgID = elmAppID + ":" + d2.PlatformShopID + ":11" var d1 = jxMsg.MsgContent.(mtwmapi.SingleChat)
// } msgID = utils.Int2Str(d1.AppID) + ":" + d1.AppPoiCode + ":10"
// return msgID }
//} if vendorID == VendorIDELM {
// var d2 = jxMsg.MsgContent.(ebaiapi.ImMessageSend)
//// GetImUserList 获取门店用户聊天列表 msgID = elmAppID + ":" + d2.PlatformShopID + ":11"
//func GetImUserList(req []RelInfo) (retVal []interface{}, err error) { }
// if len(req) == 0 { return msgID
// return nil, errors.New("msgID不允许为空") }
// }
// var keys []string // GetImUserList 获取门店用户聊天列表
// for _, i := range req { func GetImUserList(req []RelInfo) (retVal []interface{}, err error) {
// key := i.AppID + ":" + i.VendorStoreID + ":" + i.VendorID if len(req) == 0 {
// keys = append(keys, key) return nil, errors.New("msgID不允许为空")
// } }
// for _, j := range keys { var keys []string
// temp := rdb.Get(j) for _, i := range req {
// retVal = append(retVal, temp) key := i.AppID + ":" + i.VendorStoreID + ":" + i.VendorID
// } keys = append(keys, key)
// return retVal, err }
//} for _, j := range keys {
// temp := rdb.Get(j)
//// GetImChatDetail 获取门店用户聊天详情 retVal = append(retVal, temp)
//func GetImChatDetail(req []UserRelInfo) (retVal []interface{}, err error) { }
// if len(req) == 0 { return retVal, err
// return nil, errors.New("msgID不允许为空") }
// }
// var keys []string // GetImChatDetail 获取门店用户聊天详情
// for _, i := range req { func GetImChatDetail(req []UserRelInfo) (retVal []interface{}, err error) {
// key := i.AppID + ":" + i.VendorStoreID + ":" + i.VendorID + ":" + i.UserID if len(req) == 0 {
// keys = append(keys, key) return nil, errors.New("msgID不允许为空")
// } }
// for _, j := range keys { var keys []string
// temp := rdb.Get(j) for _, i := range req {
// retVal = append(retVal, temp) key := i.AppID + ":" + i.VendorStoreID + ":" + i.VendorID + ":" + i.UserID
// } keys = append(keys, key)
// return retVal, err }
//} for _, j := range keys {
// temp := rdb.Get(j)
//// SetJxMsgRead 设置jx消息已读 userID(美团openUserID;饿了么groupID) retVal = append(retVal, temp)
//func SetJxMsgRead(appID, vendorStoreID, vendorID, userID string) error { }
// key := appID + ":" + vendorStoreID + ":" + vendorID return retVal, err
// if n, err := rdb.Exists(key); n > 0 && err == nil { }
// s2 := rdb.LRange(key)
// for i := 0; i < len(s2); i++ { // SetJxMsgRead 设置jx消息已读 userID(美团openUserID;饿了么groupID)
// v := UserMessageList{} func SetJxMsgRead(appID, vendorStoreID, vendorID, userID string) error {
// _ = json.Unmarshal([]byte(s2[i]), &v) key := appID + ":" + vendorStoreID + ":" + vendorID
// if v.UserID == userID { if n, err := rdb.Exists(key); n > 0 && err == nil {
// err = rdb.LSet(key, i, "del") s2 := rdb.LRange(key)
// err = rdb.LRem(key, 0, "del") for i := 0; i < len(s2); i++ {
// s2 = append(s2[:i], s2[i+1:]...) v := UserMessageList{}
// i-- _ = json.Unmarshal([]byte(s2[i]), &v)
// } if v.UserID == userID {
// } err = rdb.LSet(key, i, "del")
// } err = rdb.LRem(key, 0, "del")
// return nil s2 = append(s2[:i], s2[i+1:]...)
//} i--
}
}
}
return nil
}

View File

@@ -1,276 +1,286 @@
package im package im
// import (
//import ( "encoding/json"
// "encoding/json" "flag"
// "flag" "fmt"
// "fmt" "io"
// "git.rosy.net.cn/baseapi/utils" "log"
// "io" "net"
// "log" "net/http/httptest"
// "net" "sync"
// "net/http" "time"
// "sync"
// "time" "git.rosy.net.cn/baseapi/platformapi/mtwmapi"
// "git.rosy.net.cn/jx-callback/globals/api"
// "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "github.com/gazeboxu/mapstructure"
// "git.rosy.net.cn/jx-callback/globals/api" "github.com/gorilla/websocket"
// "github.com/gazeboxu/mapstructure" "gopkg.in/ini.v1"
// "github.com/gorilla/websocket" )
// "gopkg.in/ini.v1"
//) // ClientManager 连接管理
// type ClientManager struct {
//// ClientManager 连接管理 ClientIdMap map[string]*Client // 全部的连接
//type ClientManager struct { ClientIdMapLock sync.RWMutex // 读写锁
// ClientIdMap map[string]*Client // 全部的连接
// ClientIdMapLock sync.RWMutex // 读写锁 Connect chan *Client // 连接处理
// DisConnect chan *Client // 断开连接处理
// Connect chan *Client // 连接处理
// DisConnect chan *Client // 断开连接处理 GroupLock sync.RWMutex
// Groups map[string][]string
// GroupLock sync.RWMutex
// Groups map[string][]string SystemClientsLock sync.RWMutex
// SystemClients map[string][]string
// SystemClientsLock sync.RWMutex }
// SystemClients map[string][]string
//} // Client 客户端连接信息
// type Client struct {
//// Client 客户端连接信息 ClientId string // 标识ID
//type Client struct { Socket *websocket.Conn // 用户连接
// ClientId string // 标识ID ConnectTime uint64 // 首次连接时间
// Socket *websocket.Conn // 用户连接 IsDeleted bool // 是否删除或下线
// ConnectTime uint64 // 首次连接时间 UserId string // 业务端标识用户ID
// IsDeleted bool // 是否删除或下线 //Extend string // 扩展字段,用户可以自定义
// UserId string // 业务端标识用户ID //GroupList []string
// //Extend string // 扩展字段,用户可以自定义 }
// //GroupList []string
//} //channel通道结构体
// type clientInfo struct {
////channel通道结构体 ClientId string `json:"clientId" validate:"required"` //链接ID
//type clientInfo struct { Data interface{}
// ClientId string `json:"clientId" validate:"required"` //链接ID SendUserId string
// Data interface{} MessageId string
// SendUserId string Code int
// MessageId string Msg string
// Code int }
// Msg string
//} // RetData 统一返回值结构体
// type RetData struct {
//// RetData 统一返回值结构体 Code int `json:"code"` //响应code
//type RetData struct { Msg string `json:"msg"` //响应msg success/fail
// Code int `json:"code"` //响应code //MsgType string `json:"msgType"` //发送消息方类型mt;elm;jx
// Msg string `json:"msg"` //响应msg success/fail Data interface{} `json:"data"` //信息
// Data interface{} `json:"data"` //信息
// //MessageType string `json:"messageType"` //消息类型 heart-心跳检测send-发送消息receive-接收消息
// //MessageType string `json:"messageType"` //消息类型 heart-心跳检测send-发送消息receive-接收消息 //MessageId string `json:"messageId"` //发送/接收信息 id
// //MessageId string `json:"messageId"` //发送/接收信息 id //UserId string `json:"userId"` //必须是平台方userID
// //UserId string `json:"userId"` //必须是平台方userID }
//}
// type global struct {
//type global struct { LocalHost string //本机内网IP
// LocalHost string //本机内网IP ServerList map[string]string
// ServerList map[string]string ServerListLock sync.RWMutex
// ServerListLock sync.RWMutex }
//} type commonConf struct {
//type commonConf struct { HttpPort string
// HttpPort string RPCPort string
// RPCPort string Cluster bool
// Cluster bool CryptoKey string
// CryptoKey string }
//}
// // SendData 客户端写入参数
//// SendData 客户端写入参数 type SendData struct {
//type SendData struct { //ClientId string `json:"clientId" validate:"required"` //链接ID
// //ClientId string `json:"clientId" validate:"required"` //链接ID VendorID int `json:"vendorID"` //消息来源平台ID 10-美团 11-饿了么
// VendorID int `json:"vendorID"` //消息来源平台ID Data interface{} `json:"data"` //发送给平台 美团/饿了么消息结构体
// Data interface{} `json:"data"` //发送给平台 美团/饿了么消息结构体 //返回值
// //返回值 //Code int `json:"code"`
// //Code int `json:"code"` //Msg string `json:"msg"`
// //Msg string `json:"msg"` //SendUserId string `json:"sendUserId"`
// //SendUserId string `json:"sendUserId"` }
//}
// // JXMsg 京西消息结构体
//// JXMsg 京西消息结构体 type JXMsg struct {
//type JXMsg struct { SendType string `json:"sendType"` //消息发送方 jx-商家mt-美团elm-饿了么
// SendType string `json:"sendType"` //消息发送方 jx-商家mt-美团elm-饿了么 MsgContent interface{} `json:"msgContent"` //美团/饿了么 单聊消息
// Data interface{} `json:"data"` //美团/饿了么 单聊消息 }
//}
// // GetUserListReq 获取门店用户聊天列表
//// GetUserListReq 获取门店用户聊天列表 type GetUserListReq struct {
//type GetUserListReq struct { VendorStoreID string `json:"vendorStoreID"` //平台门店id
// VendorStoreID string `json:"vendorStoreID"` //平台门店id VendorID string `json:"vendorID"` //平台标识id
// VendorID string `json:"vendorID"` //平台标识id AppID string `json:"appID"` //应用ID
// AppID string `json:"appID"` //应用ID }
//}
// type GetChatDetailReq struct {
//type GetChatDetailReq struct { VendorStoreID string `json:"vendorStoreID"` //平台门店id
// VendorStoreID string `json:"vendorStoreID"` //平台门店id VendorID string `json:"vendorID"` //平台标识id
// VendorID string `json:"vendorID"` //平台标识id AppID string `json:"appID"` //应用ID
// AppID string `json:"appID"` //应用ID UserID string `json:"userID"` //userID/groupID
// UserID string `json:"userID"` //userID/groupID }
//}
// // UserMessageList 用户消息列表
//// UserMessageList 用户消息列表 type UserMessageList struct {
//type UserMessageList struct { VendorID int `json:"vendorID"` //平台品牌 10-美团 11-饿了么
// VendorID int `json:"vendorID"` //平台品牌 10-美团 11-饿了么 UserID string `json:"userID"` //用户ID
// UserID string `json:"userID"` //用户ID NewMessageNum int `json:"NewMessageNum"` //新消息数量
// NewMessageNum int `json:"NewMessageNum"` //新消息数量 LatestMsg string `json:"latestMsg"` //最新一条消息
// LatestMsg string `json:"latestMsg"` //最新一条消息 LatestTime int `json:"latestTime"` //最新一条消息发送时间
// LatestTime int `json:"latestTime"` //最新一条消息发送时间 }
//}
// type RelInfo struct {
//type RelInfo struct { VendorStoreID string `json:"vendorStoreID"` //平台门店id
// VendorStoreID string `json:"vendorStoreID"` //平台门店id VendorID string `json:"vendorID"` //平台标识id
// VendorID string `json:"vendorID"` //平台标识id AppID string `json:"appID"` //应用ID
// AppID string `json:"appID"` //应用ID }
//}
// type UserRelInfo struct {
//type UserRelInfo struct { VendorStoreID string `json:"vendorStoreID"` //平台门店id
// VendorStoreID string `json:"vendorStoreID"` //平台门店id VendorID string `json:"vendorID"` //平台标识id
// VendorID string `json:"vendorID"` //平台标识id AppID string `json:"appID"` //应用ID
// AppID string `json:"appID"` //应用ID UserID string `json:"userID"` //用户id/groupID
// UserID string `json:"userID"` //用户id/groupID }
//}
// var (
//var ( cfg *ini.File
// cfg *ini.File rdb = api.Cacher
// rdb = api.Cacher Manager = NewClientManager() // 管理者
// Manager = NewClientManager() // 管理者 CommonSetting = &commonConf{}
// CommonSetting = &commonConf{} GlobalSetting = &global{}
// GlobalSetting = &global{} ToClientChan chan clientInfo
// ToClientChan chan clientInfo heartbeatInterval = 60 * time.Second // 心跳间隔
// heartbeatInterval = 60 * time.Second // 心跳间隔 HeartCheckMsg = "~#HHHBBB#~" //心跳检测消息
// HeartCheckMsg = "~#HHHBBB#~" //心跳检测消息 HeartCheckSuccess = "HB" //成功发送返回心跳消息
// HeartCheckSuccess = "HB" //成功发送返回心跳消息 VendorIDMT = 10 //im美团
// VendorIDMT = 10 //im美团 VendorIDELM = 11 //im饿了么
// VendorIDELM = 11 //im饿了么 SendTypeJx = "jx" //京西客户端发送方标识
// SendTypeJx = "jx" //京西客户端发送方标识 SendTypeMt = "mt" //美团用户发送方标识
// SendTypeMt = "mt" //美团用户发送方标识符 SendTypeElm = "elm" //饿了么用户发送方标识符
// SendTypeElm = "elm" //饿了么用户发送方标识符 MTIMPushUrl = "wss://wpush.meituan.com/websocket" //buildPushConnect建立长连接
// MTIMPushUrl = "wss://wpush.meituan.com/websocket" //buildPushConnect建立长连接 )
//)
// const (
//const ( ExpireTimeDay = 24 * time.Hour //redis一天过期时间
// ExpireTimeDay = 24 * time.Hour //redis一天过期时间 maxMessageSize = 8192 // 最大的消息大小
// maxMessageSize = 8192 // 最大的消息大小 )
//)
// type renderData struct {
//type renderData struct { ClientId string `json:"clientId"`
// ClientId string `json:"clientId"` }
//}
// const (
//const ( SuccessCode = 0
// SuccessCode = 0 SuccessMsg = "success"
// SuccessMsg = "success" Fail = -1
// Fail = -1 FailMsg = "fail"
// FailMsg = "fail"
// SYSTEM_ID_ERROR = -1001
// SYSTEM_ID_ERROR = -1001 ONLINE_MESSAGE_CODE = 1001
// ONLINE_MESSAGE_CODE = 1001 OFFLINE_MESSAGE_CODE = 1002
// OFFLINE_MESSAGE_CODE = 1002 )
//)
// // Render 统一返回值
//// Render 统一返回值 func Render(conn *websocket.Conn, messageId string, code int, message string, data interface{}) error {
//func Render(conn *websocket.Conn, messageId string, code int, message string, data interface{}) error { if data != nil {
// return conn.WriteJSON(RetData{ str, _ := json.Marshal(data)
// Code: code, temp := string(str)
// Msg: message, return conn.WriteJSON(RetData{
// Data: data, Code: code,
// }) Msg: message,
//} //MsgType: temp.SendType,
// Data: temp,
//func ClientRender(w http.ResponseWriter, code int, msg string, data interface{}) (str string) { })
// var retData RetData } else {
// return conn.WriteJSON(RetData{
// retData.Code = code Code: code,
// retData.Msg = msg Msg: message,
// retData.Data = data })
// }
// retJson, _ := json.Marshal(retData) }
// str = string(retJson)
// func ClientRender(code int, msg string, data interface{}) (str string) {
// w.Header().Set("Content-Type", "application/json; charset=utf-8") var retData RetData
// _, _ = io.WriteString(w, str)
// return retData.Code = code
//} retData.Msg = msg
// retData.Data = data
//func ConnRender(conn *websocket.Conn, data interface{}) (err error) {
// err = conn.WriteJSON(RetData{ retJson, _ := json.Marshal(retData)
// Code: SuccessCode, str = string(retJson)
// Msg: "success",
// Data: data, w := httptest.NewRecorder()
// }) w.Header().Set("Content-Type", "application/json; charset=utf-8")
// return _, _ = io.WriteString(w, str)
//} return
// }
//// Default 给默认值
//func Default() { func ConnRender(conn *websocket.Conn, data interface{}) (err error) {
// CommonSetting = &commonConf{ err = conn.WriteJSON(RetData{
// HttpPort: "6000", Code: SuccessCode,
// RPCPort: "7000", Msg: "success",
// Cluster: false, Data: data,
// CryptoKey: "Adba723b7fe06819", })
// } return
// }
// GlobalSetting = &global{
// LocalHost: getIntranetIp(), // Default 给默认值
// ServerList: make(map[string]string), func Default() {
// } CommonSetting = &commonConf{
//} HttpPort: "6000",
// RPCPort: "7000",
//// Setup 初始化全局设置变量 Cluster: false,
//func Setup() { CryptoKey: "Adba723b7fe06819",
// configFile := flag.String("c", "conf/app.ini", "-c conf/app.ini") }
//
// var err error GlobalSetting = &global{
// cfg, err = ini.Load(*configFile) LocalHost: getIntranetIp(),
// if err != nil { ServerList: make(map[string]string),
// log.Fatalf("setting.Setup, fail to parse 'conf/app.ini': %v", err) }
// } }
//
// mapTo("common", CommonSetting) // Setup 初始化全局设置变量
// func Setup() {
// GlobalSetting = &global{ configFile := flag.String("c", "conf/app.ini", "-c conf/app.ini")
// LocalHost: getIntranetIp(),
// ServerList: make(map[string]string), var err error
// } cfg, err = ini.Load(*configFile)
// fmt.Printf("LocalHost=%s\n ServerList=%s\n", GlobalSetting.LocalHost, utils.Format4Output(GlobalSetting.ServerList, false)) if err != nil {
//} log.Fatalf("setting.Setup, fail to parse 'conf/app.ini': %v", err)
// }
//// mapTo map section
//func mapTo(section string, v interface{}) { mapTo("common", CommonSetting)
// err := cfg.Section(section).MapTo(v)
// if err != nil { GlobalSetting = &global{
// log.Fatalf("Cfg.MapTo %s err: %v", section, err) LocalHost: getIntranetIp(),
// } ServerList: make(map[string]string),
//} }
// fmt.Printf("LocalHost=%s\n ", GlobalSetting.LocalHost)
////获取本机IP }
//func getIntranetIp() string {
// addrs, _ := net.InterfaceAddrs() // mapTo map section
// for _, addr := range addrs { func mapTo(section string, v interface{}) {
// // 检查ip地址判断是否回环地址 err := cfg.Section(section).MapTo(v)
// if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if err != nil {
// if ipnet.IP.To4() != nil { log.Fatalf("Cfg.MapTo %s err: %v", section, err)
// return ipnet.IP.String() }
// } }
//
// } //获取本机IP
// } func getIntranetIp() string {
// return "" addrs, _ := net.InterfaceAddrs()
//} for _, addr := range addrs {
// // 检查ip地址判断是否回环地址
//// GenFullUrl 组装完整websocket url以及生成clientID if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
//func GenFullUrl() (fullUrl string) { if ipnet.IP.To4() != nil {
// resp, err := api.MtwmAPI.GetConnectionToken() return ipnet.IP.String()
// if err != nil { }
// return ""
// } }
// retVal := mtwmapi.GetConnTokenResp{} }
// err = mapstructure.Decode(resp, &retVal) return ""
// fullUrl = MTIMPushUrl + "/" + retVal.AppKey + "/" + retVal.ConnectionToken }
// //clientID = api.MtwmAPI.GetAppID() + ":" + retVal.ConnectionToken
// //打印输出 // GenFullUrl 组装完整websocket url以及生成clientID
// //fmt.Printf("Create websocket connect failCount:%d", retVal.UserCount) func GenFullUrl() (fullUrl string) {
// return fullUrl resp, err := api.MtwmAPI.GetConnectionToken()
//} if err != nil {
return ""
}
retVal := mtwmapi.GetConnTokenResp{}
err = mapstructure.Decode(resp, &retVal)
fullUrl = MTIMPushUrl + "/" + retVal.AppKey + "/" + retVal.ConnectionToken
//clientID = api.MtwmAPI.GetAppID() + ":" + retVal.ConnectionToken
//打印输出
//fmt.Printf("Create websocket connect failCount:%d", retVal.UserCount)
return fullUrl
}

View File

@@ -1,264 +1,263 @@
package im package im
// import (
//import ( "errors"
// "errors" "fmt"
// "fmt" "net/http"
// "net/http" "time"
// "time"
// "git.rosy.net.cn/baseapi/utils"
// "git.rosy.net.cn/baseapi/utils"
// "git.rosy.net.cn/jx-callback/globals"
// "git.rosy.net.cn/jx-callback/globals" "github.com/gorilla/websocket"
// "github.com/gorilla/websocket" )
//)
// func Init() {
//func Init() { //初始化
// //初始化 ToClientChan = make(chan clientInfo, 1000)
// ToClientChan = make(chan clientInfo, 1000) //写入全局变量
// //写入全局变量 Setup()
// //Default() //建立长链接
// go Send([]byte(HeartCheckMsg))
// Setup()
// //建立长链接 //启动定时器
// //StartWebSocket(res, req) PingTimer()
// Send([]byte(HeartCheckMsg))
// go WriteMessage()
// //启动定时器
// PingTimer() go Manager.Start()
//
// go WriteMessage() //fmt.Printf("服务器启动成功,端口号:%s\n", CommonSetting.HttpPort)
// }
// go Manager.Start()
// func Run(w http.ResponseWriter, r *http.Request) {
// fmt.Printf("服务器启动成功,端口号:%s\n", CommonSetting.HttpPort) conn, err := (&websocket.Upgrader{
//} ReadBufferSize: 1024,
// WriteBufferSize: 1024,
//func Run(w http.ResponseWriter, r *http.Request) { // 允许所有CORS跨域请求
// conn, err := (&websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool {
// ReadBufferSize: 1024, return true
// WriteBufferSize: 1024, },
// // 允许所有CORS跨域请求 }).Upgrade(w, r, nil)
// CheckOrigin: func(r *http.Request) bool { if err != nil {
// return true globals.SugarLogger.Debugf("upgrade error: %v", err)
// }, http.NotFound(w, r)
// }).Upgrade(w, r, nil) return
// if err != nil { }
// globals.SugarLogger.Debugf("upgrade error: %v", err)
// http.NotFound(w, r) //设置读取消息大小上线
// return conn.SetReadLimit(maxMessageSize)
// }
// //clientID := r.FormValue("clientId")
// //设置读取消息大小上线 clientID := r.Header.Get("Clientid")
// conn.SetReadLimit(maxMessageSize) clientSocket := NewClient(clientID, conn)
//
// clientID := r.FormValue("clientId") //读取客户端消息
// clientSocket := NewClient(clientID, conn) clientSocket.Read()
//
// //读取客户端消息 if err = ConnRender(conn, renderData{ClientId: clientID}); err != nil {
// clientSocket.Read() _ = conn.Close()
// return
// if err = ConnRender(conn, renderData{ClientId: clientID}); err != nil { }
// _ = conn.Close()
// return // 用户连接事件
// } Manager.Connect <- clientSocket
// }
// // 用户连接事件
// Manager.Connect <- clientSocket func StartWebSocket(conn *websocket.Conn, clientID string, err error) {
//}
// //设置读取消息大小上线
//func StartWebSocket(conn *websocket.Conn, clientID string, err error) { conn.SetReadLimit(maxMessageSize)
//
// //设置读取消息大小上线 clientSocket := NewClient(clientID, conn)
// conn.SetReadLimit(maxMessageSize)
// //读取客户端消息
// clientSocket := NewClient(clientID, conn) clientSocket.Read()
//
// //读取客户端消息 if err = ConnRender(conn, renderData{ClientId: clientID}); err != nil {
// clientSocket.Read() _ = conn.Close()
// return
// if err = ConnRender(conn, renderData{ClientId: clientID}); err != nil { }
// _ = conn.Close()
// return // 用户连接事件
// } Manager.Connect <- clientSocket
//
// // 用户连接事件 }
// Manager.Connect <- clientSocket
// // PingTimer 定时器发送心跳
//} func PingTimer() {
// go func() {
//// PingTimer 定时器发送心跳 ticker := time.NewTicker(heartbeatInterval)
//func PingTimer() { defer ticker.Stop()
// go func() { //测试用
// ticker := time.NewTicker(heartbeatInterval) i := 0
// defer ticker.Stop() for {
// //测试用 i++
// i := 0 <-ticker.C
// for { for clientId, conn := range Manager.AllClient() {
// i++ if err := conn.Socket.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(time.Second)); err != nil {
// <-ticker.C Manager.DisConnect <- conn
// for clientId, conn := range Manager.AllClient() { globals.SugarLogger.Debugf("发送心跳失败: %s 总连接数:%d", clientId, Manager.Count())
// if err := conn.Socket.WriteControl(websocket.PingMessage, []byte{}, time.Now().Add(time.Second)); err != nil { }
// Manager.DisConnect <- conn if err := ConnRender(conn.Socket, renderData{ClientId: clientId}); err != nil {
// globals.SugarLogger.Debugf("发送心跳失败: %s 总连接数:%d", clientId, Manager.Count()) return
// } }
// if err := ConnRender(conn.Socket, renderData{ClientId: clientId}); err != nil { globals.SugarLogger.Debugf("clientId=%s,i=%d", clientId, i)
// return }
// } }
// globals.SugarLogger.Debugf("clientId=%s,i=%d", clientId, i) }()
// } }
// }
// }() // WriteMessage 监听并发送给客户端信息
//} func WriteMessage() {
// i := 0
//// WriteMessage 监听并发送给客户端信息 for {
//func WriteMessage() { clientInfo := <-ToClientChan
// i := 0 //广播发送通知所有客户端
// for { i++
// clientInfo := <-ToClientChan fmt.Printf("WriteMessage clientInfo=%s i=%d", utils.Format4Output(clientInfo, false), i)
// //广播发送通知所有客户端 if Manager.AllClient() != nil {
// i++ for _, conn := range Manager.AllClient() {
// fmt.Printf("WriteMessage clientInfo=%s i=%d", utils.Format4Output(clientInfo, false), i) globals.SugarLogger.Debugf("WriteMessage conn.ClientId=%s", conn.ClientId)
// if Manager.AllClient() != nil { if err := Render(conn.Socket, clientInfo.MessageId, clientInfo.Code, clientInfo.Msg, clientInfo.Data); err != nil {
// for _, conn := range Manager.AllClient() { Manager.DisConnect <- conn
// if err := Render(conn.Socket, clientInfo.MessageId, clientInfo.Code, clientInfo.Msg, clientInfo.Data); err != nil { }
// Manager.DisConnect <- conn }
// } } else {
// } globals.SugarLogger.Debugf("无客户端连接,请检查")
// } else { return
// globals.SugarLogger.Debugf("无客户端连接,请检查") }
// return //if conn, err := Manager.GetByClientId(clientInfo.ClientId); err == nil && conn != nil {
// } // if err := Render(conn.Socket, clientInfo.MessageId, clientInfo.Code, clientInfo.Msg, clientInfo.Data); err != nil {
// //if conn, err := Manager.GetByClientId(clientInfo.ClientId); err == nil && conn != nil { // Manager.DisConnect <- conn
// // if err := Render(conn.Socket, clientInfo.MessageId, clientInfo.Code, clientInfo.Msg, clientInfo.Data); err != nil { // }
// // Manager.DisConnect <- conn //}
// // } }
// //} }
// }
//} // Start 管道处理程序
// func (manager *ClientManager) Start() {
//// Start 管道处理程序 for {
//func (manager *ClientManager) Start() { select {
// for { case client := <-manager.Connect:
// select { // 建立连接事件
// case client := <-manager.Connect: manager.EventConnect(client)
// // 建立连接事件 case conn := <-manager.DisConnect:
// manager.EventConnect(client) // 断开连接事件
// case conn := <-manager.DisConnect: manager.EventDisconnect(conn)
// // 断开连接事件 }
// manager.EventDisconnect(conn) }
// } }
// }
//} //从客户端读取数据
// func (c *Client) Read() {
////从客户端读取数据 go func() {
//func (c *Client) Read() { for {
// go func() { messageType, msg, err := c.Socket.ReadMessage()
// for { if err != nil {
// messageType, msg, err := c.Socket.ReadMessage() if messageType == -1 && websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseNormalClosure, websocket.CloseNoStatusReceived) {
// if err != nil { Manager.DisConnect <- c
// if messageType == -1 && websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseNormalClosure, websocket.CloseNoStatusReceived) { return
// Manager.DisConnect <- c } else if messageType != websocket.PingMessage {
// return return
// } else if messageType != websocket.PingMessage { }
// return } else {
// } SendToVendor(msg)
// } else { return
// SendToVendor(msg) }
// } }
// } }()
// }() }
//}
// // 以下为连接事件操作*******************************************
//// 以下为连接事件操作*******************************************
// // EventConnect 建立连接事件
//// EventConnect 建立连接事件 func (manager *ClientManager) EventConnect(client *Client) {
//func (manager *ClientManager) EventConnect(client *Client) { manager.AddClient(client)
// manager.AddClient(client) }
//}
// // EventDisconnect 断开连接事件
//// EventDisconnect 断开连接事件 func (manager *ClientManager) EventDisconnect(client *Client) {
//func (manager *ClientManager) EventDisconnect(client *Client) { //关闭连接
// //关闭连接 _ = client.Socket.Close()
// _ = client.Socket.Close() manager.DelClient(client)
// manager.DelClient(client) //标记销毁
// //标记销毁 client.IsDeleted = true
// client.IsDeleted = true client = nil
// client = nil }
//}
// //以下为客户端Client操作*******************************************
////以下为客户端Client操作*******************************************
// // NewClient 初始化Client
//// NewClient 初始化Client func NewClient(clientId string, socket *websocket.Conn) *Client {
//func NewClient(clientId string, socket *websocket.Conn) *Client { return &Client{
// return &Client{ ClientId: clientId,
// ClientId: clientId, Socket: socket,
// Socket: socket, ConnectTime: uint64(time.Now().Unix()),
// ConnectTime: uint64(time.Now().Unix()), IsDeleted: false,
// IsDeleted: false, }
// } }
//}
// // AddClient 添加客户端
//// AddClient 添加客户端 func (manager *ClientManager) AddClient(client *Client) {
//func (manager *ClientManager) AddClient(client *Client) { manager.ClientIdMapLock.Lock()
// manager.ClientIdMapLock.Lock() defer manager.ClientIdMapLock.Unlock()
// defer manager.ClientIdMapLock.Unlock()
// manager.ClientIdMap[client.ClientId] = client
// manager.ClientIdMap[client.ClientId] = client }
//}
// // DelClient 删除客户端
//// DelClient 删除客户端 func (manager *ClientManager) DelClient(client *Client) {
//func (manager *ClientManager) DelClient(client *Client) { manager.delClientIdMap(client.ClientId)
// manager.delClientIdMap(client.ClientId)
// }
//}
// // 删除clientIdMap
//// 删除clientIdMap func (manager *ClientManager) delClientIdMap(clientId string) {
//func (manager *ClientManager) delClientIdMap(clientId string) { manager.ClientIdMapLock.Lock()
// manager.ClientIdMapLock.Lock() defer manager.ClientIdMapLock.Unlock()
// defer manager.ClientIdMapLock.Unlock()
// delete(manager.ClientIdMap, clientId)
// delete(manager.ClientIdMap, clientId) }
//}
// // GetByClientId 通过clientId获取client
//// GetByClientId 通过clientId获取client func (manager *ClientManager) GetByClientId(clientId string) (*Client, error) {
//func (manager *ClientManager) GetByClientId(clientId string) (*Client, error) { manager.ClientIdMapLock.RLock()
// manager.ClientIdMapLock.RLock() defer manager.ClientIdMapLock.RUnlock()
// defer manager.ClientIdMapLock.RUnlock()
// if client, ok := manager.ClientIdMap[clientId]; !ok {
// if client, ok := manager.ClientIdMap[clientId]; !ok { return nil, errors.New("客户端不存在")
// return nil, errors.New("客户端不存在") } else {
// } else { return client, nil
// return client, nil }
// } }
//}
// // AllClient 获取所有的客户端
//// AllClient 获取所有的客户端 func (manager *ClientManager) AllClient() map[string]*Client {
//func (manager *ClientManager) AllClient() map[string]*Client { manager.ClientIdMapLock.RLock()
// manager.ClientIdMapLock.RLock() defer manager.ClientIdMapLock.RUnlock()
// defer manager.ClientIdMapLock.RUnlock()
// return manager.ClientIdMap
// return manager.ClientIdMap }
//}
// //与客户端的交互操作*************************
////与客户端的交互操作*************************
// // NewClientManager 初始化客户端管理
//// NewClientManager 初始化客户端管理 func NewClientManager() (clientManager *ClientManager) {
//func NewClientManager() (clientManager *ClientManager) { clientManager = &ClientManager{
// clientManager = &ClientManager{ ClientIdMap: make(map[string]*Client),
// ClientIdMap: make(map[string]*Client), Connect: make(chan *Client, 10000),
// Connect: make(chan *Client, 10000), DisConnect: make(chan *Client, 10000),
// DisConnect: make(chan *Client, 10000), Groups: make(map[string][]string, 100),
// Groups: make(map[string][]string, 100), SystemClients: make(map[string][]string, 100),
// SystemClients: make(map[string][]string, 100), }
// }
// return
// return }
//}
// // Count 获取客户端数量
//// Count 获取客户端数量 func (manager *ClientManager) Count() int {
//func (manager *ClientManager) Count() int { manager.ClientIdMapLock.RLock()
// manager.ClientIdMapLock.RLock() defer manager.ClientIdMapLock.RUnlock()
// defer manager.ClientIdMapLock.RUnlock() return len(manager.ClientIdMap)
// return len(manager.ClientIdMap) }
//}

View File

@@ -146,6 +146,9 @@ func (c *EventController) TestWebsocket() {
log.Fatal(err) log.Fatal(err)
} }
defer ws.Close() defer ws.Close()
//var clientID = c.GetString("clientID")
//fmt.Printf("clientID=%s", clientID)
var ( var (
vendorOrderID = c.GetString("vendorOrderID") vendorOrderID = c.GetString("vendorOrderID")
msgMap = make(map[string]*model.ImMessageRecord) msgMap = make(map[string]*model.ImMessageRecord)

View File

@@ -1,106 +1,122 @@
package controllers package controllers
// import (
//import ( "encoding/json"
// "encoding/json"
// "net/http" "git.rosy.net.cn/jx-callback/business/partner/purchase/im"
// "github.com/astaxie/beego/server/web"
// "git.rosy.net.cn/jx-callback/globals" )
//
// "git.rosy.net.cn/jx-callback/business/partner/purchase/im" type IMController struct {
// "github.com/astaxie/beego/server/web" web.Controller
//) }
//
//type IMController struct { var maxMessageSize = int64(8192) // 最大的消息大小
// web.Controller
//} // @Title IM初始化长链接
// // @Description IM初始化长链接
//// @Title IM初始化长链接 // @Success 200 {object} controllers.CallResult
//// @Description IM初始化长链接 // @Failure 200 {object} controllers.CallResult
//// @Success 200 {object} controllers.CallResult // @router /StartWebSocket [get]
//// @Failure 200 {object} controllers.CallResult func (c *IMController) StartWebSocket() {
//// @router /StartWebSocket [get]
//func (c *IMController) StartWebSocket() { im.Run(c.Ctx.ResponseWriter, c.Ctx.Request)
// upgrader.CheckOrigin = func(r *http.Request) bool { //
// return true //upgrader.CheckOrigin = func(r *http.Request) bool {
// } // return true
// ws, err := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil) //}
// if err != nil { //conn, err := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
// globals.SugarLogger.Errorf("upgrade error: %v", err) //if err != nil {
// return // globals.SugarLogger.Errorf("upgrade error: %v", err)
// } // return
// defer ws.Close() //}
// //defer conn.Close()
// clientID := c.GetString("clientID") //
// globals.SugarLogger.Debugf("clientID=%s", clientID) //clientID := c.GetString("clientID")
// //globals.SugarLogger.Debugf("clientID=%s", clientID)
// im.StartWebSocket(ws, clientID, err) //
//} ////设置读取消息大小上线
// //conn.SetReadLimit(maxMessageSize)
//// @Title IM获取门店用户聊天列表 //
//// @Description IM获取门店用户聊天列表 //clientSocket := im.NewClient(clientID, conn)
//// @Param token header string true "认证token" //
//// @Param payLoad formData string true "平台应用映射关系" ////读取客户端消息
//// @Success 200 {object} controllers.CallResult //clientSocket.Read()
//// @Failure 200 {object} controllers.CallResult //
//// @router /GetIMUserList [get] //if err = im.ConnRender(conn, im.RetData{Data: clientID}); err != nil {
//func (c *IMController) GetIMUserList() { // _ = conn.Close()
// c.callGetIMUserList(func(params *tImGetIMUserListParams) (retVal interface{}, errCode string, err error) { // return
// var relInfo []im.RelInfo //}
// if err = json.Unmarshal([]byte(params.PayLoad), &relInfo); err != nil { //
// retVal, err = im.GetImUserList(relInfo) //// 用户连接事件
//im.Manager.Connect <- clientSocket
}
// @Title IM获取门店用户聊天列表
// @Description IM获取门店用户聊天列表
// @Param token header string true "认证token"
// @Param payLoad formData string true "平台应用映射关系"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetIMUserList [get]
func (c *IMController) GetIMUserList() {
c.callGetIMUserList(func(params *tImGetIMUserListParams) (retVal interface{}, errCode string, err error) {
var relInfo []im.RelInfo
if err = json.Unmarshal([]byte(params.PayLoad), &relInfo); err != nil {
retVal, err = im.GetImUserList(relInfo)
}
return retVal, "", err
})
}
// @Title IM获取单个用户聊天详情
// @Description IM获取单个用户聊天详情
// @Param token header string true "认证token"
// @Param payLoad formData string true "平台用户应用映射关系"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /GetImChatDetail [get]
func (c *IMController) GetImChatDetail() {
c.callGetImChatDetail(func(params *tImGetImChatDetailParams) (retVal interface{}, errCode string, err error) {
var temp []im.UserRelInfo
if err = json.Unmarshal([]byte(params.PayLoad), &temp); err == nil {
retVal, err = im.GetImChatDetail(temp)
}
return retVal, "", err
})
}
// @Title IM设置门店与单个用户已读
// @Description IM设置门店与单个用户已读
// @Param token header string true "认证token"
// @Param appID formData string true "应用id"
// @Param vendorStoreID formData string true "平台门店id"
// @Param vendorID formData string true "平台id"
// @Param userID formData string true "用户id/会话id"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SetImMsgRead [post]
func (c *IMController) SetImMsgRead() {
c.callSetImMsgRead(func(params *tImSetImMsgReadParams) (retVal interface{}, errCode string, err error) {
err = im.SetJxMsgRead(params.AppID, params.VendorStoreID, params.VendorID, params.UserID)
return nil, "", err
})
}
// @Title 向平台商发送信息
// @Description 向平台商发送信息
// @Param token header string true "认证token"
// @Param sendData formData string true "平台商消息结构体"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
// @router /SendToVendor [post]
//func (c *IMController) SendToVendor() {
// c.callSendToVendor(func(params *tImSendToVendorParams) (retVal interface{}, errCode string, err error) {
// var sendData im.SendData
// if err = json.Unmarshal([]byte(params.SendData), &sendData); err == nil {
// im.SendToVendor(sendData)
// } // }
// return retVal, "", err
// })
//}
//
//// @Title IM获取单个用户聊天详情
//// @Description IM获取单个用户聊天详情
//// @Param token header string true "认证token"
//// @Param payLoad formData string true "平台用户应用映射关系"
//// @Success 200 {object} controllers.CallResult
//// @Failure 200 {object} controllers.CallResult
//// @router /GetImChatDetail [get]
//func (c *IMController) GetImChatDetail() {
// c.callGetImChatDetail(func(params *tImGetImChatDetailParams) (retVal interface{}, errCode string, err error) {
// var temp []im.UserRelInfo
// if err = json.Unmarshal([]byte(params.PayLoad), &temp); err == nil {
// retVal, err = im.GetImChatDetail(temp)
// }
// return retVal, "", err
// })
//}
//
//// @Title IM设置门店与单个用户已读
//// @Description IM设置门店与单个用户已读
//// @Param token header string true "认证token"
//// @Param appID formData string true "应用id"
//// @Param vendorStoreID formData string true "平台门店id"
//// @Param vendorID formData string true "平台id"
//// @Param userID formData string true "用户id/会话id"
//// @Success 200 {object} controllers.CallResult
//// @Failure 200 {object} controllers.CallResult
//// @router /SetImMsgRead [post]
//func (c *IMController) SetImMsgRead() {
// c.callSetImMsgRead(func(params *tImSetImMsgReadParams) (retVal interface{}, errCode string, err error) {
// err = im.SetJxMsgRead(params.AppID, params.VendorStoreID, params.VendorID, params.UserID)
// return nil, "", err // return nil, "", err
// }) // })
//} //}
//
//// @Title 向平台商发送信息
//// @Description 向平台商发送信息
//// @Param token header string true "认证token"
//// @Param sendData formData string true "平台商消息结构体"
//// @Success 200 {object} controllers.CallResult
//// @Failure 200 {object} controllers.CallResult
//// @router /SendToVendor [post]
////func (c *IMController) SendToVendor() {
//// c.callSendToVendor(func(params *tImSendToVendorParams) (retVal interface{}, errCode string, err error) {
//// var sendData im.SendData
//// if err = json.Unmarshal([]byte(params.SendData), &sendData); err == nil {
//// im.SendToVendor(sendData)
//// }
//// return nil, "", err
//// })
////}

View File

@@ -294,9 +294,9 @@ func Init() {
QiniuAPI = qbox.NewMac(beego.AppConfig.DefaultString("qiniuAK", ""), beego.AppConfig.DefaultString("qiniuSK", "")) QiniuAPI = qbox.NewMac(beego.AppConfig.DefaultString("qiniuAK", ""), beego.AppConfig.DefaultString("qiniuSK", ""))
ShowAPI = showapi.New(beego.AppConfig.DefaultInt("showAppID", 0), beego.AppConfig.DefaultString("showAppSecret", "")) ShowAPI = showapi.New(beego.AppConfig.DefaultInt("showAppID", 0), beego.AppConfig.DefaultString("showAppSecret", ""))
//Cacher = redis.New(beego.AppConfig.DefaultString("redisHost", ""), beego.AppConfig.DefaultInt("redisPort", ""), beego.AppConfig.DefaultString("redisPassword", "")) Cacher = redis.New(beego.AppConfig.DefaultString("redisHost", "localhost"), beego.AppConfig.DefaultInt("redisPort", 0), beego.AppConfig.DefaultString("redisPassword", ""))
//Todo 本地测试用 //Todo 本地测试用
Cacher = redis.New(beego.AppConfig.DefaultString("redisHost", "127.0.0.1"), beego.AppConfig.DefaultInt("redisPort", 6379), beego.AppConfig.DefaultString("redisPassword", "123456")) //Cacher = redis.New(beego.AppConfig.DefaultString("redisHost", "127.0.0.1"), beego.AppConfig.DefaultInt("redisPort", 6379), beego.AppConfig.DefaultString("redisPassword", "123456"))
AliUpcAPI = aliupcapi.New(beego.AppConfig.DefaultString("aliUpcAppCode", "")) AliUpcAPI = aliupcapi.New(beego.AppConfig.DefaultString("aliUpcAppCode", ""))

View File

@@ -8,6 +8,8 @@ import (
"os" "os"
"time" "time"
"git.rosy.net.cn/jx-callback/business/partner/purchase/im"
"git.rosy.net.cn/jx-callback/business/enterprise" "git.rosy.net.cn/jx-callback/business/enterprise"
"git.rosy.net.cn/jx-callback/business/jxcallback/auto_delivery" "git.rosy.net.cn/jx-callback/business/jxcallback/auto_delivery"
@@ -94,12 +96,12 @@ func Init() {
enterprise.Init() // 初始化enterprise key enterprise.Init() // 初始化enterprise key
auto_delivery.Init() // 初始化骑手列表 auto_delivery.Init() // 初始化骑手列表
//im.Init() //初始化ws连接 im.Init() //初始化ws连接
//go http.HandleFunc("/v2/im/StartWebSocket", im.Run) //http.HandleFunc("/ws", im.Run)
//test //test
//mux := http.NewServeMux() //mux := http.NewServeMux()
//mux.HandleFunc("/v2/im/StartWebSocket", im.StartWebSocket) //mux.HandleFunc("/v2/im/Run", im.Run)
//go http.ListenAndServe(":8082", mux) //go http.ListenAndServe(":8082", mux)
} }

View File

@@ -4342,30 +4342,30 @@ func init() {
Filters: nil, Filters: nil,
Params: nil}) Params: nil})
//im //im
//web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"], web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"],
// web.ControllerComments{ web.ControllerComments{
// Method: "GetIMUserList", Method: "GetIMUserList",
// Router: `/GetIMUserList`, Router: `/GetIMUserList`,
// AllowHTTPMethods: []string{"get"}, AllowHTTPMethods: []string{"get"},
// MethodParams: param.Make(), MethodParams: param.Make(),
// Filters: nil, Filters: nil,
// Params: nil}) Params: nil})
//web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"], web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"],
// web.ControllerComments{ web.ControllerComments{
// Method: "GetImChatDetail", Method: "GetImChatDetail",
// Router: `/GetImChatDetail`, Router: `/GetImChatDetail`,
// AllowHTTPMethods: []string{"get"}, AllowHTTPMethods: []string{"get"},
// MethodParams: param.Make(), MethodParams: param.Make(),
// Filters: nil, Filters: nil,
// Params: nil}) Params: nil})
//web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"], web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"],
// web.ControllerComments{ web.ControllerComments{
// Method: "SetImMsgRead", Method: "SetImMsgRead",
// Router: `/SetImMsgRead`, Router: `/SetImMsgRead`,
// AllowHTTPMethods: []string{"post"}, AllowHTTPMethods: []string{"post"},
// MethodParams: param.Make(), MethodParams: param.Make(),
// Filters: nil, Filters: nil,
// Params: nil}) Params: nil})
web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"], web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"] = append(web.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:IMController"],
web.ControllerComments{ web.ControllerComments{
Method: "StartWebSocket", Method: "StartWebSocket",

View File

@@ -165,11 +165,11 @@ func init() {
&controllers.VersionController{}, &controllers.VersionController{},
), ),
), ),
//web.NSNamespace("/im", web.NSNamespace("/im",
// web.NSInclude( web.NSInclude(
// &controllers.IMController{}, &controllers.IMController{},
// ), ),
//), ),
) )
web.AddNamespace(ns) web.AddNamespace(ns)