Merge branch 'tuoyun' of github.com:OpenIMSDK/Open-IM-Server into tuoyun

This commit is contained in:
wangchuxiao 2022-02-28 17:52:25 +08:00
commit 7d8d314962
23 changed files with 187 additions and 140 deletions

@ -1 +1 @@
Subproject commit 992f76df0ee500a0377523b0780d3a85f2275755 Subproject commit 1c6c7af5393b3e9eefbaf16b673519ca863a6c2c

View File

@ -132,7 +132,7 @@ log:
storageLocation: ../logs/ storageLocation: ../logs/
rotationTime: 24 rotationTime: 24
remainRotationCount: 5 #日志数量 remainRotationCount: 5 #日志数量
remainLogLevel: 6 #日志级别 6表示全都打印测试阶段建议设置为6 remainLogLevel: 4 #日志级别 6表示全都打印测试阶段建议设置为6
elasticSearchSwitch: false elasticSearchSwitch: false
elasticSearchAddr: [ 127.0.0.1:9201 ] elasticSearchAddr: [ 127.0.0.1:9201 ]
elasticSearchUser: "" elasticSearchUser: ""
@ -178,10 +178,13 @@ tokenpolicy:
# Token effective time day as a unit # Token effective time day as a unit
accessExpire: 3650 #token过期时间 默认即可 accessExpire: 3650 #token过期时间 默认即可
messagecallback: #暂时不要使用 还需完善 messagecallback:
callbackSwitch: false
callbackUrl: "http://www.xxx.com/msg/judge" callbackUrl: "http://www.xxx.com/msg/judge"
#TimeOut use second as unit #TimeOut use second as unit
callbackTimeOut: 10 callbackTimeOut: 10
messagejudge:
isJudgeFriend: true
# c2c: # c2c:
# callbackBeforeSendMsg: # callbackBeforeSendMsg:
# switch: false # switch: false
@ -255,7 +258,7 @@ notification:
desc: "groupApplicationAccepted desc" desc: "groupApplicationAccepted desc"
ext: "groupApplicationAccepted ext" ext: "groupApplicationAccepted ext"
defaultTips: defaultTips:
tips: "allowed to join the group" # group info changed by xx tips: "was allowed to join the group" # group info changed by xx
groupApplicationRejected: groupApplicationRejected:
conversation: conversation:
@ -267,7 +270,7 @@ notification:
desc: " desc" desc: " desc"
ext: " ext" ext: " ext"
defaultTips: defaultTips:
tips: "rejected into the group" # group info changed by xx tips: "was rejected into the group" # group info changed by xx
groupOwnerTransferred: groupOwnerTransferred:
conversation: conversation:
@ -291,7 +294,7 @@ notification:
desc: "memberKicked desc" desc: "memberKicked desc"
ext: "memberKicked ext" ext: "memberKicked ext"
defaultTips: defaultTips:
tips: "kicked out of the group" # group info changed by xx tips: "was kicked out of the group" # group info changed by xx
memberInvited: memberInvited:
conversation: conversation:
@ -303,7 +306,7 @@ notification:
desc: "memberInvited desc" desc: "memberInvited desc"
ext: "memberInvited ext" ext: "memberInvited ext"
defaultTips: defaultTips:
tips: "invited into the group" # group info changed by xx tips: "was invited into the group" # group info changed by xx
memberEnter: memberEnter:
conversation: conversation:
@ -459,19 +462,20 @@ notification:
#是否启动demo如果自身没有账号体系设置为true #是否启动demo如果自身没有账号体系设置为true
demoswitch: true demoswitch: true
demo: demo:
openImDemoPort: [ 42233 ] #demo对外服务端口默认即可需要开放此端口或做nginx转发 #demo对外服务端口默认即可需要开放此端口或做nginx转发
openImDemoPort: [ 42233 ]
alismsverify: #阿里云短信配置,在阿里云申请成功后修改以下四项,必须修改 alismsverify: #阿里云短信配置,在阿里云申请成功后修改以下四项,必须修改
accessKeyId: LTAI5tJPkn4HuuePdiLdGqe71 accessKeyId: LTAI5tJPkn4HuuePdiLdGqe7
accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV1 accessKeySecret: 4n9OJ7ZCVN1U6KeHDAtOyNeVZcjOuV
signName: OpenIM Corporation signName: 托云信息技术
verificationCodeTemplateCode: SMS_2268101641 verificationCodeTemplateCode: SMS_226810164
superCode: 666666 #超级验证码,建议修改掉,收不到短信验证码时可以用此替代 superCode: 666666 #超级验证码,建议修改掉,收不到短信验证码时可以用此替代
# second # second
codeTTL: 60 codeTTL: 300
mail: #仅支持qq邮箱具体操作参考 https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256 必须修改 mail: #仅支持qq邮箱具体操作参考 https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256 必须修改
title: "openIM" title: "openIM"
senderMail: "1765567899@qq.com" senderMail: "765567899@qq.com"
senderAuthorizationCode: "1gxyausfoevlzbfag" senderAuthorizationCode: "gxyausfoevlzbfag"
smtpAddr: "smtp.qq.com" smtpAddr: "smtp.qq.com"
smtpPort: 25 #需开放此端口 出口方向 smtpPort: 25 #需开放此端口 出口方向

View File

@ -89,7 +89,7 @@ services:
command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new command: /usr/local/bin/etcd --name etcd0 --data-dir /etcd-data --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380 --initial-advertise-peer-urls http://0.0.0.0:2380 --initial-cluster etcd0=http://0.0.0.0:2380 --initial-cluster-token tkn --initial-cluster-state new
open_im_server: open_im_server:
image: openim/open_im_server:v2.0.0 image: openim/open_im_server:v2.0.1
container_name: open_im_server container_name: open_im_server
volumes: volumes:
- ./logs:/Open-IM-Server/logs - ./logs:/Open-IM-Server/logs

View File

@ -7,12 +7,14 @@
package manage package manage
import ( import (
api "Open_IM/pkg/base_info"
"Open_IM/pkg/common/config" "Open_IM/pkg/common/config"
"Open_IM/pkg/common/constant" "Open_IM/pkg/common/constant"
"Open_IM/pkg/common/log" "Open_IM/pkg/common/log"
"Open_IM/pkg/common/token_verify" "Open_IM/pkg/common/token_verify"
"Open_IM/pkg/grpc-etcdv3/getcdv3" "Open_IM/pkg/grpc-etcdv3/getcdv3"
pbChat "Open_IM/pkg/proto/chat" pbChat "Open_IM/pkg/proto/chat"
"Open_IM/pkg/proto/sdk_ws"
open_im_sdk "Open_IM/pkg/proto/sdk_ws" open_im_sdk "Open_IM/pkg/proto/sdk_ws"
"Open_IM/pkg/utils" "Open_IM/pkg/utils"
"context" "context"
@ -40,11 +42,13 @@ func newUserSendMsgReq(params *ManagementSendMsgReq) *pbChat.SendMsgReq {
newContent = utils.StructToJsonString(params.Content) newContent = utils.StructToJsonString(params.Content)
default: default:
} }
options := make(map[string]bool, 2) var options map[string]bool
if params.IsOnlineOnly { if params.IsOnlineOnly {
options = make(map[string]bool, 5)
utils.SetSwitchFromOptions(options, constant.IsOfflinePush, false) utils.SetSwitchFromOptions(options, constant.IsOfflinePush, false)
utils.SetSwitchFromOptions(options, constant.IsHistory, false) utils.SetSwitchFromOptions(options, constant.IsHistory, false)
utils.SetSwitchFromOptions(options, constant.IsPersistent, false) utils.SetSwitchFromOptions(options, constant.IsPersistent, false)
utils.SetSwitchFromOptions(options, constant.IsSenderSync, false)
} }
pbData := pbChat.SendMsgReq{ pbData := pbChat.SendMsgReq{
OperationID: params.OperationID, OperationID: params.OperationID,
@ -152,20 +156,16 @@ func ManagementSendMsg(c *gin.Context) {
log.Info("", "", "api ManagementSendMsg call, api call rpc...") log.Info("", "", "api ManagementSendMsg call, api call rpc...")
reply, err := client.SendMsg(context.Background(), pbData) RpcResp, err := client.SendMsg(context.Background(), pbData)
if err != nil { if err != nil {
log.NewError(params.OperationID, "call delete UserSendMsg rpc server failed", err.Error()) log.NewError(params.OperationID, "call delete UserSendMsg rpc server failed", err.Error())
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call UserSendMsg rpc server failed"}) c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "call UserSendMsg rpc server failed"})
return return
} }
log.Info("", "", "api ManagementSendMsg call end..., [data: %s] [reply: %s]", pbData.String(), reply.String()) log.Info("", "", "api ManagementSendMsg call end..., [data: %s] [reply: %s]", pbData.String(), RpcResp.String())
resp := api.ManagementSendMsgResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}, ResultList: server_api_params.UserSendMsgResp{ServerMsgID: RpcResp.ServerMsgID, ClientMsgID: RpcResp.ClientMsgID, SendTime: RpcResp.SendTime}}
c.JSON(http.StatusOK, gin.H{ log.Info(params.OperationID, "ManagementSendMsg return", resp)
"errCode": reply.ErrCode, c.JSON(http.StatusOK, resp)
"errMsg": reply.ErrMsg,
"sendTime": reply.SendTime,
"msgID": reply.ClientMsgID,
})
} }

View File

@ -3,6 +3,8 @@ package gate
import ( import (
"Open_IM/pkg/common/config" "Open_IM/pkg/common/config"
"Open_IM/pkg/common/log" "Open_IM/pkg/common/log"
"Open_IM/pkg/statistics"
"fmt"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
"sync" "sync"
) )
@ -12,6 +14,7 @@ var (
validate *validator.Validate validate *validator.Validate
ws WServer ws WServer
rpcSvr RPCServer rpcSvr RPCServer
count uint64
) )
func Init(rpcPort, wsPort int) { func Init(rpcPort, wsPort int) {
@ -19,6 +22,7 @@ func Init(rpcPort, wsPort int) {
log.NewPrivateLog(config.Config.ModuleName.LongConnSvrName) log.NewPrivateLog(config.Config.ModuleName.LongConnSvrName)
rwLock = new(sync.RWMutex) rwLock = new(sync.RWMutex)
validate = validator.New() validate = validator.New()
statistics.NewStatistics(&count, config.Config.ModuleName.LongConnSvrName, fmt.Sprintf("%d second recv to msg_gateway count", count), 10)
ws.onInit(wsPort) ws.onInit(wsPort)
rpcSvr.onInit(rpcPort) rpcSvr.onInit(rpcPort)
} }

View File

@ -142,6 +142,7 @@ func (ws *WServer) pullMsgBySeqListResp(conn *UserConn, m *Req, pb *sdk_ws.PullM
} }
func (ws *WServer) sendMsgReq(conn *UserConn, m *Req) { func (ws *WServer) sendMsgReq(conn *UserConn, m *Req) {
count++
log.NewInfo(m.OperationID, "Ws call success to sendMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID) log.NewInfo(m.OperationID, "Ws call success to sendMsgReq start", m.MsgIncr, m.ReqIdentifier, m.SendID)
nReply := new(pbChat.SendMsgResp) nReply := new(pbChat.SendMsgResp)
isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendMsg) isPass, errCode, errMsg, pData := ws.argsValidate(m, constant.WSSendMsg)

View File

@ -8,6 +8,7 @@ import (
"Open_IM/pkg/grpc-etcdv3/getcdv3" "Open_IM/pkg/grpc-etcdv3/getcdv3"
pbMsg "Open_IM/pkg/proto/chat" pbMsg "Open_IM/pkg/proto/chat"
pbPush "Open_IM/pkg/proto/push" pbPush "Open_IM/pkg/proto/push"
"Open_IM/pkg/statistics"
"Open_IM/pkg/utils" "Open_IM/pkg/utils"
"context" "context"
"github.com/Shopify/sarama" "github.com/Shopify/sarama"
@ -20,9 +21,14 @@ type fcb func(msg []byte, msgKey string)
type HistoryConsumerHandler struct { type HistoryConsumerHandler struct {
msgHandle map[string]fcb msgHandle map[string]fcb
historyConsumerGroup *kfk.MConsumerGroup historyConsumerGroup *kfk.MConsumerGroup
singleMsgCount uint64
groupMsgCount uint64
} }
func (mc *HistoryConsumerHandler) Init() { func (mc *HistoryConsumerHandler) Init() {
statistics.NewStatistics(&mc.singleMsgCount, config.Config.ModuleName.MsgTransferName, "singleMsgCount insert to mongo ", 10)
statistics.NewStatistics(&mc.groupMsgCount, config.Config.ModuleName.MsgTransferName, "groupMsgCount insert to mongo ", 10)
mc.msgHandle = make(map[string]fcb) mc.msgHandle = make(map[string]fcb)
mc.msgHandle[config.Config.Kafka.Ws2mschat.Topic] = mc.handleChatWs2Mongo mc.msgHandle[config.Config.Kafka.Ws2mschat.Topic] = mc.handleChatWs2Mongo
mc.historyConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V0_10_2_0, mc.historyConsumerGroup = kfk.NewMConsumerGroup(&kfk.MConsumerGroupConfig{KafkaVersion: sarama.V0_10_2_0,
@ -55,6 +61,7 @@ func (mc *HistoryConsumerHandler) handleChatWs2Mongo(msg []byte, msgKey string)
log.NewError(operationID, "single data insert to mongo err", err.Error(), msgFromMQ.String()) log.NewError(operationID, "single data insert to mongo err", err.Error(), msgFromMQ.String())
return return
} }
mc.singleMsgCount++
log.NewDebug(msgFromMQ.OperationID, "sendMessageToPush cost time ", utils.GetCurrentTimestampByNano()-time) log.NewDebug(msgFromMQ.OperationID, "sendMessageToPush cost time ", utils.GetCurrentTimestampByNano()-time)
} }
if !isSenderSync && msgKey == msgFromMQ.MsgData.SendID { if !isSenderSync && msgKey == msgFromMQ.MsgData.SendID {
@ -70,6 +77,7 @@ func (mc *HistoryConsumerHandler) handleChatWs2Mongo(msg []byte, msgKey string)
log.NewError(operationID, "group data insert to mongo err", msgFromMQ.String(), msgFromMQ.MsgData.RecvID, err.Error()) log.NewError(operationID, "group data insert to mongo err", msgFromMQ.String(), msgFromMQ.MsgData.RecvID, err.Error())
return return
} }
mc.groupMsgCount++
} }
go sendMessageToPush(&msgFromMQ, msgFromMQ.MsgData.RecvID) go sendMessageToPush(&msgFromMQ, msgFromMQ.MsgData.RecvID)
default: default:

View File

@ -20,6 +20,6 @@ func Init() {
} }
func Run() { func Run() {
//register mysqlConsumerHandler to //register mysqlConsumerHandler to
go persistentCH.persistentConsumerGroup.RegisterHandleAndConsumer(&persistentCH) //go persistentCH.persistentConsumerGroup.RegisterHandleAndConsumer(&persistentCH)
go historyCH.historyConsumerGroup.RegisterHandleAndConsumer(&historyCH) go historyCH.historyConsumerGroup.RegisterHandleAndConsumer(&historyCH)
} }

View File

@ -11,6 +11,8 @@ import (
"Open_IM/pkg/common/constant" "Open_IM/pkg/common/constant"
"Open_IM/pkg/common/kafka" "Open_IM/pkg/common/kafka"
"Open_IM/pkg/common/log" "Open_IM/pkg/common/log"
"Open_IM/pkg/statistics"
"fmt"
) )
var ( var (
@ -18,6 +20,7 @@ var (
pushCh PushConsumerHandler pushCh PushConsumerHandler
pushTerminal []int32 pushTerminal []int32
producer *kafka.Producer producer *kafka.Producer
count uint64
) )
func Init(rpcPort int) { func Init(rpcPort int) {
@ -28,6 +31,7 @@ func Init(rpcPort int) {
} }
func init() { func init() {
producer = kafka.NewKafkaProducer(config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.Ws2mschat.Topic) producer = kafka.NewKafkaProducer(config.Config.Kafka.Ws2mschat.Addr, config.Config.Kafka.Ws2mschat.Topic)
statistics.NewStatistics(&count, config.Config.ModuleName.PushName, fmt.Sprintf("%d second push to msg_gateway count", 10), 10)
} }
func Run() { func Run() {

View File

@ -7,16 +7,12 @@
package logic package logic
import ( import (
push "Open_IM/internal/push/jpush"
"Open_IM/pkg/common/config" "Open_IM/pkg/common/config"
"Open_IM/pkg/common/constant"
"Open_IM/pkg/common/log" "Open_IM/pkg/common/log"
"Open_IM/pkg/grpc-etcdv3/getcdv3" "Open_IM/pkg/grpc-etcdv3/getcdv3"
pbPush "Open_IM/pkg/proto/push" pbPush "Open_IM/pkg/proto/push"
pbRelay "Open_IM/pkg/proto/relay" pbRelay "Open_IM/pkg/proto/relay"
"Open_IM/pkg/utils"
"context" "context"
"encoding/json"
"strings" "strings"
) )
@ -34,7 +30,7 @@ type AtContent struct {
func MsgToUser(pushMsg *pbPush.PushMsgReq) { func MsgToUser(pushMsg *pbPush.PushMsgReq) {
var wsResult []*pbRelay.SingleMsgToUser var wsResult []*pbRelay.SingleMsgToUser
isOfflinePush := utils.GetSwitchFromOptions(pushMsg.MsgData.Options, constant.IsOfflinePush) //isOfflinePush := utils.GetSwitchFromOptions(pushMsg.MsgData.Options, constant.IsOfflinePush)
log.InfoByKv("Get msg from msg_transfer And push msg", pushMsg.OperationID, "PushData", pushMsg.String()) log.InfoByKv("Get msg from msg_transfer And push msg", pushMsg.OperationID, "PushData", pushMsg.String())
grpcCons := getcdv3.GetConn4Unique(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOnlineMessageRelayName) grpcCons := getcdv3.GetConn4Unique(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImOnlineMessageRelayName)
//Online push message //Online push message
@ -51,66 +47,67 @@ func MsgToUser(pushMsg *pbPush.PushMsgReq) {
} }
} }
log.InfoByKv("push_result", pushMsg.OperationID, "result", wsResult, "sendData", pushMsg.MsgData) log.InfoByKv("push_result", pushMsg.OperationID, "result", wsResult, "sendData", pushMsg.MsgData)
if isOfflinePush && pushMsg.PushToUserID != pushMsg.MsgData.SendID { count++
for _, v := range wsResult { //if isOfflinePush && pushMsg.PushToUserID != pushMsg.MsgData.SendID {
if v.ResultCode == 0 { // for _, v := range wsResult {
continue // if v.ResultCode == 0 {
} // continue
//supported terminal // }
for _, t := range pushTerminal { // //supported terminal
if v.RecvPlatFormID == t { // for _, t := range pushTerminal {
//Use offline push messaging // if v.RecvPlatFormID == t {
var UIDList []string // //Use offline push messaging
UIDList = append(UIDList, v.RecvID) // var UIDList []string
customContent := OpenIMContent{ // UIDList = append(UIDList, v.RecvID)
SessionType: int(pushMsg.MsgData.SessionType), // customContent := OpenIMContent{
From: pushMsg.MsgData.SendID, // SessionType: int(pushMsg.MsgData.SessionType),
To: pushMsg.MsgData.RecvID, // From: pushMsg.MsgData.SendID,
Seq: pushMsg.MsgData.Seq, // To: pushMsg.MsgData.RecvID,
} // Seq: pushMsg.MsgData.Seq,
bCustomContent, _ := json.Marshal(customContent) // }
jsonCustomContent := string(bCustomContent) // bCustomContent, _ := json.Marshal(customContent)
var content string // jsonCustomContent := string(bCustomContent)
if pushMsg.MsgData.OfflinePushInfo != nil { // var content string
content = pushMsg.MsgData.OfflinePushInfo.Title // if pushMsg.MsgData.OfflinePushInfo != nil {
// content = pushMsg.MsgData.OfflinePushInfo.Title
} else { //
switch pushMsg.MsgData.ContentType { // } else {
case constant.Text: // switch pushMsg.MsgData.ContentType {
content = constant.ContentType2PushContent[constant.Text] // case constant.Text:
case constant.Picture: // content = constant.ContentType2PushContent[constant.Text]
content = constant.ContentType2PushContent[constant.Picture] // case constant.Picture:
case constant.Voice: // content = constant.ContentType2PushContent[constant.Picture]
content = constant.ContentType2PushContent[constant.Voice] // case constant.Voice:
case constant.Video: // content = constant.ContentType2PushContent[constant.Voice]
content = constant.ContentType2PushContent[constant.Video] // case constant.Video:
case constant.File: // content = constant.ContentType2PushContent[constant.Video]
content = constant.ContentType2PushContent[constant.File] // case constant.File:
case constant.AtText: // content = constant.ContentType2PushContent[constant.File]
a := AtContent{} // case constant.AtText:
_ = utils.JsonStringToStruct(string(pushMsg.MsgData.Content), &a) // a := AtContent{}
if utils.IsContain(v.RecvID, a.AtUserList) { // _ = utils.JsonStringToStruct(string(pushMsg.MsgData.Content), &a)
content = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common] // if utils.IsContain(v.RecvID, a.AtUserList) {
} else { // content = constant.ContentType2PushContent[constant.AtText] + constant.ContentType2PushContent[constant.Common]
content = constant.ContentType2PushContent[constant.GroupMsg] // } else {
} // content = constant.ContentType2PushContent[constant.GroupMsg]
default: // }
content = constant.ContentType2PushContent[constant.Common] // default:
} // content = constant.ContentType2PushContent[constant.Common]
} // }
// }
pushResult, err := push.JGAccountListPush(UIDList, content, jsonCustomContent, constant.PlatformIDToName(t)) //
if err != nil { // pushResult, err := push.JGAccountListPush(UIDList, content, jsonCustomContent, constant.PlatformIDToName(t))
log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error(), constant.PlatformIDToName(t)) // if err != nil {
} else { // log.NewError(pushMsg.OperationID, "offline push error", pushMsg.String(), err.Error(), constant.PlatformIDToName(t))
log.NewDebug(pushMsg.OperationID, "offline push return result is ", string(pushResult), pushMsg.MsgData, constant.PlatformIDToName(t)) // } else {
} // log.NewDebug(pushMsg.OperationID, "offline push return result is ", string(pushResult), pushMsg.MsgData, constant.PlatformIDToName(t))
// }
} //
} // }
} // }
// }
} //
//}
} }
//func SendMsgByWS(m *pbChat.WSToMsgSvrChatMsg) { //func SendMsgByWS(m *pbChat.WSToMsgSvrChatMsg) {

View File

@ -245,7 +245,7 @@ func (rpc *rpcChat) sendMsgToKafka(m *pbChat.MsgDataToMQ, key string) error {
} }
func GetMsgID(sendID string) string { func GetMsgID(sendID string) string {
t := time.Now().Format("2006-01-02 15:04:05") t := time.Now().Format("2006-01-02 15:04:05")
return t + "-" + sendID + "-" + strconv.Itoa(rand.Int()) return utils.Md5(t + "-" + sendID + "-" + strconv.Itoa(rand.Int()))
} }
func returnMsg(replay *pbChat.SendMsgResp, pb *pbChat.SendMsgReq, errCode int32, errMsg, serverMsgID string, sendTime int64) (*pbChat.SendMsgResp, error) { func returnMsg(replay *pbChat.SendMsgResp, pb *pbChat.SendMsgReq, errCode int32, errMsg, serverMsgID string, sendTime int64) (*pbChat.SendMsgResp, error) {

View File

@ -2,6 +2,7 @@ package base_info
import ( import (
pbRelay "Open_IM/pkg/proto/relay" pbRelay "Open_IM/pkg/proto/relay"
"Open_IM/pkg/proto/sdk_ws"
pbUser "Open_IM/pkg/proto/user" pbUser "Open_IM/pkg/proto/user"
) )
@ -36,3 +37,8 @@ type AccountCheckResp struct {
CommResp CommResp
ResultList []*pbUser.AccountCheckResp_SingleUserStatus `json:"data"` ResultList []*pbUser.AccountCheckResp_SingleUserStatus `json:"data"`
} }
type ManagementSendMsgResp struct {
CommResp
ResultList server_api_params.UserSendMsgResp `json:"data"`
}

View File

@ -10,7 +10,7 @@ type GetUsersInfoReq struct {
} }
type GetUsersInfoResp struct { type GetUsersInfoResp struct {
CommResp CommResp
UserInfoList []*open_im_sdk.PublicUserInfo UserInfoList []*open_im_sdk.PublicUserInfo `json:"-"`
Data []map[string]interface{} `json:"data"` Data []map[string]interface{} `json:"data"`
} }

View File

@ -11,7 +11,7 @@ func GetRegister(account string) (*db.Register, error) {
return nil, err return nil, err
} }
var r db.Register var r db.Register
return &r, dbConn.Debug().Table("registers").Where("account = ?", return &r, dbConn.Table("registers").Where("account = ?",
account).Take(&r).Error account).Take(&r).Error
} }

View File

@ -26,7 +26,7 @@ func GetFriendRelationshipFromFriend(OwnerUserID, FriendUserID string) (*db.Frie
return nil, err return nil, err
} }
var friend db.Friend var friend db.Friend
err = dbConn.Table("friends").Where("owner_user_id=? and friend_user_id=?", OwnerUserID, FriendUserID).Find(&friend).Error err = dbConn.Table("friends").Where("owner_user_id=? and friend_user_id=?", OwnerUserID, FriendUserID).Take(&friend).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -53,7 +53,7 @@ func GetFriendApplicationByBothUserID(FromUserID, ToUserID string) (*db.FriendRe
return nil, err return nil, err
} }
var friendRequest db.FriendRequest var friendRequest db.FriendRequest
err = dbConn.Table("friend_requests").Where("from_user_id=? and to_user_id=?", FromUserID, ToUserID).Find(&friendRequest).Error err = dbConn.Table("friend_requests").Where("from_user_id=? and to_user_id=?", FromUserID, ToUserID).Take(&friendRequest).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -4,6 +4,7 @@ import (
"Open_IM/pkg/common/constant" "Open_IM/pkg/common/constant"
"Open_IM/pkg/common/db" "Open_IM/pkg/common/db"
"Open_IM/pkg/utils" "Open_IM/pkg/utils"
"errors"
"fmt" "fmt"
"time" "time"
) )
@ -43,6 +44,7 @@ func GetGroupMemberListByUserID(userID string) ([]db.GroupMember, error) {
} }
var groupMemberList []db.GroupMember var groupMemberList []db.GroupMember
err = dbConn.Table("group_members").Where("user_id=?", userID).Find(&groupMemberList).Error err = dbConn.Table("group_members").Where("user_id=?", userID).Find(&groupMemberList).Error
//err = dbConn.Table("group_members").Where("user_id=?", userID).Take(&groupMemberList).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -82,7 +84,7 @@ func GetGroupMemberInfoByGroupIDAndUserID(groupID, userID string) (*db.GroupMemb
return nil, err return nil, err
} }
var groupMember db.GroupMember var groupMember db.GroupMember
err = dbConn.Table("group_members").Where("group_id=? and user_id=? ", groupID, userID).Limit(1).Find(&groupMember).Error err = dbConn.Table("group_members").Where("group_id=? and user_id=? ", groupID, userID).Limit(1).Take(&groupMember).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -149,7 +151,8 @@ func GetGroupOwnerInfoByGroupID(groupID string) (*db.GroupMember, error) {
return &v, nil return &v, nil
} }
} }
return nil, nil
return nil, utils.Wrap(errors.New("no owner"), "")
} }
func IsExistGroupMember(groupID, userID string) bool { func IsExistGroupMember(groupID, userID string) bool {

View File

@ -45,7 +45,7 @@ func GetGroupInfoByGroupID(groupId string) (*db.Group, error) {
return nil, utils.Wrap(err, "") return nil, utils.Wrap(err, "")
} }
var groupInfo db.Group var groupInfo db.Group
err = dbConn.Table("groups").Where("group_id=?", groupId).Find(&groupInfo).Error err = dbConn.Table("groups").Where("group_id=?", groupId).Take(&groupInfo).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -86,7 +86,6 @@ func GetGroups(pageNumber, showNumber int) ([]db.Group, error) {
return groups, nil return groups, nil
} }
func OperateGroupStatus(groupId string, groupStatus int32) error { func OperateGroupStatus(groupId string, groupStatus int32) error {
group := db.Group{ group := db.Group{
GroupID: groupId, GroupID: groupId,
@ -98,7 +97,6 @@ func OperateGroupStatus(groupId string, groupStatus int32) error {
return nil return nil
} }
func DeleteGroup(groupId string) error { func DeleteGroup(groupId string) error {
dbConn, err := db.DB.MysqlDB.DefaultGormDB() dbConn, err := db.DB.MysqlDB.DefaultGormDB()
if err != nil { if err != nil {
@ -129,8 +127,7 @@ func OperateGroupRole(userId, groupId string, roleLevel int32) (string, string,
updateInfo := db.GroupMember{ updateInfo := db.GroupMember{
RoleLevel: roleLevel, RoleLevel: roleLevel,
} }
groupMaster := db.GroupMember{ groupMaster := db.GroupMember{}
}
switch roleLevel { switch roleLevel {
case constant.GroupOwner: case constant.GroupOwner:
err = dbConn.Transaction(func(tx *gorm.DB) error { err = dbConn.Transaction(func(tx *gorm.DB) error {

View File

@ -63,7 +63,7 @@ func GetGroupRequestByGroupIDAndUserID(groupID, userID string) (*db.GroupRequest
return nil, err return nil, err
} }
var groupRequest db.GroupRequest var groupRequest db.GroupRequest
err = dbConn.Table("group_requests").Where("user_id=? and group_id=?", userID, groupID).Find(&groupRequest).Error err = dbConn.Table("group_requests").Where("user_id=? and group_id=?", userID, groupID).Take(&groupRequest).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -128,7 +128,6 @@ func GetUserReqGroupByUserID(userID string) ([]db.GroupRequest, error) {
return groupRequestList, err return groupRequestList, err
} }
// //
//func GroupApplicationResponse(pb *group.GroupApplicationResponseReq) (*group.CommonResp, error) { //func GroupApplicationResponse(pb *group.GroupApplicationResponseReq) (*group.CommonResp, error) {
// //

View File

@ -51,18 +51,6 @@ func UserRegister(user db.User) error {
return nil return nil
} }
type User struct {
UserID string `gorm:"column:user_id;primaryKey;"`
Nickname string `gorm:"column:name"`
FaceUrl string `gorm:"column:icon"`
Gender int32 `gorm:"column:gender"`
PhoneNumber string `gorm:"column:phone_number"`
Birth string `gorm:"column:birth"`
Email string `gorm:"column:email"`
Ex string `gorm:"column:ex"`
CreateTime time.Time `gorm:"column:create_time"`
}
func DeleteUser(userID string) (i int64) { func DeleteUser(userID string) (i int64) {
dbConn, err := db.DB.MysqlDB.DefaultGormDB() dbConn, err := db.DB.MysqlDB.DefaultGormDB()
if err != nil { if err != nil {
@ -78,7 +66,7 @@ func GetUserByUserID(userID string) (*db.User, error) {
return nil, err return nil, err
} }
var user db.User var user db.User
err = dbConn.Table("users").Where("user_id=?", userID).First(&user).Error err = dbConn.Table("users").Where("user_id=?", userID).Take(&user).Error
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -1,6 +1,7 @@
package getcdv3 package getcdv3
import ( import (
"Open_IM/pkg/common/log"
"context" "context"
"fmt" "fmt"
"go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/clientv3"
@ -39,9 +40,9 @@ func RegisterEtcd4Unique(schema, etcdAddr, myHost string, myPort int, serviceNam
func RegisterEtcd(schema, etcdAddr, myHost string, myPort int, serviceName string, ttl int) error { func RegisterEtcd(schema, etcdAddr, myHost string, myPort int, serviceName string, ttl int) error {
cli, err := clientv3.New(clientv3.Config{ cli, err := clientv3.New(clientv3.Config{
Endpoints: strings.Split(etcdAddr, ","), DialTimeout: 5 * time.Second}) Endpoints: strings.Split(etcdAddr, ","), DialTimeout: 5 * time.Second})
fmt.Println("RegisterEtcd")
log.Info("", "RegisterEtcd, ", schema, etcdAddr, myHost, myPort, serviceName, ttl)
if err != nil { if err != nil {
// return fmt.Errorf("grpclb: create clientv3 client failed: %v", err)
return fmt.Errorf("create etcd clientv3 client failed, errmsg:%v, etcd addr:%s", err, etcdAddr) return fmt.Errorf("create etcd clientv3 client failed, errmsg:%v, etcd addr:%s", err, etcdAddr)
} }
@ -66,15 +67,16 @@ func RegisterEtcd(schema, etcdAddr, myHost string, myPort int, serviceName strin
if err != nil { if err != nil {
return fmt.Errorf("keepalive failed, errmsg:%v, lease id:%d", err, resp.ID) return fmt.Errorf("keepalive failed, errmsg:%v, lease id:%d", err, resp.ID)
} }
fmt.Println("RegisterEtcd ok") log.Info("", "RegisterEtcd ok ")
go func() { go func() {
for { for {
select { select {
case v, ok := <-kresp: case v, ok := <-kresp:
if ok == true { if ok == true {
// fmt.Println(" kresp ok ", v) log.Debug("", "KeepAlive kresp ok", v, schema, etcdAddr, myHost, myPort, serviceName, ttl)
} else { } else {
fmt.Println(" kresp failed ", v) log.Error("", "KeepAlive kresp failed", schema, etcdAddr, myHost, myPort, serviceName, ttl)
} }
} }
} }

View File

@ -1,6 +1,7 @@
package getcdv3 package getcdv3
import ( import (
"Open_IM/pkg/common/log"
"context" "context"
"fmt" "fmt"
"go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/clientv3"
@ -102,7 +103,7 @@ func (r *Resolver) Build(target resolver.Target, cc resolver.ClientConn, opts re
if err == nil { if err == nil {
var addrList []resolver.Address var addrList []resolver.Address
for i := range resp.Kvs { for i := range resp.Kvs {
fmt.Println("init addr: ", string(resp.Kvs[i].Value)) log.Debug("", "init addr: ", string(resp.Kvs[i].Value))
addrList = append(addrList, resolver.Address{Addr: string(resp.Kvs[i].Value)}) addrList = append(addrList, resolver.Address{Addr: string(resp.Kvs[i].Value)})
} }
r.cc.UpdateState(resolver.State{Addresses: addrList}) r.cc.UpdateState(resolver.State{Addresses: addrList})
@ -148,27 +149,27 @@ func (r *Resolver) watch(prefix string, addrList []resolver.Address) {
if !exists(addrList, string(ev.Kv.Value)) { if !exists(addrList, string(ev.Kv.Value)) {
flag = 1 flag = 1
addrList = append(addrList, resolver.Address{Addr: string(ev.Kv.Value)}) addrList = append(addrList, resolver.Address{Addr: string(ev.Kv.Value)})
fmt.Println("after add, new list: ", addrList) log.Debug("", "after add, new list: ", addrList)
} }
case mvccpb.DELETE: case mvccpb.DELETE:
fmt.Println("remove addr key: ", string(ev.Kv.Key), "value:", string(ev.Kv.Value)) log.Debug("remove addr key: ", string(ev.Kv.Key), "value:", string(ev.Kv.Value))
i := strings.LastIndexAny(string(ev.Kv.Key), "/") i := strings.LastIndexAny(string(ev.Kv.Key), "/")
if i < 0 { if i < 0 {
return return
} }
t := string(ev.Kv.Key)[i+1:] t := string(ev.Kv.Key)[i+1:]
fmt.Println("remove addr key: ", string(ev.Kv.Key), "value:", string(ev.Kv.Value), "addr:", t) log.Debug("remove addr key: ", string(ev.Kv.Key), "value:", string(ev.Kv.Value), "addr:", t)
if s, ok := remove(addrList, t); ok { if s, ok := remove(addrList, t); ok {
flag = 1 flag = 1
addrList = s addrList = s
fmt.Println("after remove, new list: ", addrList) log.Debug("after remove, new list: ", addrList)
} }
} }
} }
if flag == 1 { if flag == 1 {
r.cc.UpdateState(resolver.State{Addresses: addrList}) r.cc.UpdateState(resolver.State{Addresses: addrList})
fmt.Println("update: ", addrList) log.Debug("update: ", addrList)
} }
} }
} }
@ -176,7 +177,7 @@ func (r *Resolver) watch(prefix string, addrList []resolver.Address) {
func GetConn4Unique(schema, etcdaddr, servicename string) []*grpc.ClientConn { func GetConn4Unique(schema, etcdaddr, servicename string) []*grpc.ClientConn {
gEtcdCli, err := clientv3.New(clientv3.Config{Endpoints: strings.Split(etcdaddr, ",")}) gEtcdCli, err := clientv3.New(clientv3.Config{Endpoints: strings.Split(etcdaddr, ",")})
if err != nil { if err != nil {
fmt.Println("eeeeeeeeeeeee", err.Error()) log.Error("clientv3.New failed", err.Error())
return nil return nil
} }
@ -200,7 +201,7 @@ func GetConn4Unique(schema, etcdaddr, servicename string) []*grpc.ClientConn {
} }
} else { } else {
gEtcdCli.Close() gEtcdCli.Close()
fmt.Println("rrrrrrrrrrr", err.Error()) log.Error("gEtcdCli.Get failed", err.Error())
return nil return nil
} }
gEtcdCli.Close() gEtcdCli.Close()
@ -236,7 +237,7 @@ func GetConnPool(schema, etcdaddr, servicename string) (*ClientConn, error) {
ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(1000*time.Millisecond)) ctx, _ := context.WithDeadline(context.Background(), time.Now().Add(1000*time.Millisecond))
c, err := p.Get(ctx) c, err := p.Get(ctx)
fmt.Println(err) log.Info("", "Get ", err)
return c, err return c, err
} }

View File

@ -0,0 +1,33 @@
package statistics
import (
"Open_IM/pkg/common/log"
"time"
)
type Statistics struct {
Count *uint64
ModuleName string
PrintArgs string
SleepTime int
}
func (s *Statistics) output() {
t := time.NewTicker(time.Duration(s.SleepTime) * time.Second)
defer t.Stop()
var sum uint64
for {
sum = *s.Count
select {
case <-t.C:
}
log.NewWarn(s.ModuleName, s.PrintArgs, *s.Count-sum)
}
}
func NewStatistics(count *uint64, moduleName, printArgs string, sleepTime int) *Statistics {
p := &Statistics{Count: count, ModuleName: moduleName, SleepTime: sleepTime, PrintArgs: printArgs}
go p.output()
return p
}