You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
6.7 KiB
245 lines
6.7 KiB
// Copyright © 2023 OpenIM SDK. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package test
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"github.com/openimsdk/openim-sdk-core/v3/internal/util"
|
|
"github.com/openimsdk/openim-sdk-core/v3/pkg/ccontext"
|
|
"github.com/openimsdk/openim-sdk-core/v3/pkg/utils"
|
|
"github.com/openimsdk/openim-sdk-core/v3/sdk_struct"
|
|
"net"
|
|
"os"
|
|
"strconv"
|
|
"sync"
|
|
"time"
|
|
|
|
authPB "github.com/openimsdk/protocol/auth"
|
|
"github.com/openimsdk/protocol/sdkws"
|
|
userPB "github.com/openimsdk/protocol/user"
|
|
"github.com/openimsdk/tools/log"
|
|
)
|
|
|
|
func GenUid(uid int, prefix string) string {
|
|
if getMyIP() == "" {
|
|
log.ZError(ctx, "getMyIP() failed, exit ", errors.New("getMyIP() failed"))
|
|
os.Exit(1)
|
|
}
|
|
UidPrefix := getMyIP() + "_" + prefix + "_"
|
|
return UidPrefix + strconv.FormatInt(int64(uid), 10)
|
|
}
|
|
|
|
func RegisterOnlineAccounts(number int) {
|
|
var wg sync.WaitGroup
|
|
wg.Add(number)
|
|
for i := 0; i < number; i++ {
|
|
go func(t int) {
|
|
userID := GenUid(t, "online")
|
|
register(userID)
|
|
log.ZInfo(ctx, "register ", userID)
|
|
wg.Done()
|
|
}(i)
|
|
|
|
}
|
|
wg.Wait()
|
|
log.ZInfo(ctx, "RegisterAccounts finish ", number)
|
|
}
|
|
|
|
type GetTokenReq struct {
|
|
Secret string `json:"secret"`
|
|
Platform int `json:"platform"`
|
|
Uid string `json:"uid"`
|
|
}
|
|
|
|
type RegisterReq struct {
|
|
Secret string `json:"secret"`
|
|
Platform int `json:"platform"`
|
|
Uid string `json:"uid"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type ResToken struct {
|
|
Data struct {
|
|
ExpiredTime int64 `json:"expiredTime"`
|
|
Token string `json:"token"`
|
|
Uid string `json:"uid"`
|
|
}
|
|
ErrCode int `json:"errCode"`
|
|
ErrMsg string `json:"errMsg"`
|
|
}
|
|
|
|
var AdminToken = ""
|
|
|
|
func init() {
|
|
AdminToken = getToken("openIM123456")
|
|
if err := log.InitFromConfig("open-im-sdk-core", "", int(LogLevel), IsLogStandardOutput, false, LogFilePath, 0, 24, "23432"); err != nil {
|
|
//fmt.Println("123456", "log init failed ", err.Error())
|
|
}
|
|
|
|
}
|
|
|
|
var ctx context.Context
|
|
|
|
func register(uid string) error {
|
|
ctx = ccontext.WithInfo(context.Background(), &ccontext.GlobalConfig{
|
|
UserID: uid,
|
|
Token: AdminToken,
|
|
IMConfig: sdk_struct.IMConfig{
|
|
PlatformID: PlatformID,
|
|
ApiAddr: APIADDR,
|
|
WsAddr: WSADDR,
|
|
LogLevel: LogLevel,
|
|
},
|
|
})
|
|
ctx = ccontext.WithOperationID(ctx, "123456")
|
|
|
|
//ACCOUNTCHECK
|
|
var getAccountCheckReq userPB.AccountCheckReq
|
|
var getAccountCheckResp userPB.AccountCheckResp
|
|
getAccountCheckReq.CheckUserIDs = []string{uid}
|
|
|
|
for {
|
|
err := util.ApiPost(ctx, "/user/account_check", &getAccountCheckReq, &getAccountCheckResp)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if len(getAccountCheckResp.Results) == 1 &&
|
|
getAccountCheckResp.Results[0].AccountStatus == "registered" {
|
|
log.ZWarn(ctx, "account already registered", errors.New("Already registered "), "userIDs", getAccountCheckReq.CheckUserIDs[0],
|
|
"uid", uid, "getAccountCheckResp", getAccountCheckResp)
|
|
userLock.Lock()
|
|
allUserID = append(allUserID, uid)
|
|
userLock.Unlock()
|
|
return nil
|
|
} else if len(getAccountCheckResp.Results) == 1 &&
|
|
getAccountCheckResp.Results[0].AccountStatus == "unregistered" {
|
|
log.ZInfo(ctx, "account not register", "userIDs", getAccountCheckReq.CheckUserIDs[0], "uid", uid, "getAccountCheckResp",
|
|
getAccountCheckResp)
|
|
break
|
|
} else {
|
|
log.ZError(ctx, " failed, continue ", err, "userIDs", getAccountCheckReq.CheckUserIDs[0], "register address",
|
|
REGISTERADDR, "getAccountCheckReq", getAccountCheckReq)
|
|
continue
|
|
}
|
|
}
|
|
|
|
var rreq userPB.UserRegisterReq
|
|
rreq.Users = []*sdkws.UserInfo{{UserID: uid}}
|
|
|
|
for {
|
|
err := util.ApiPost(ctx, "/auth/user_register", &rreq, nil)
|
|
if err != nil {
|
|
log.ZError(ctx, "post failed ,continue ", errors.New("post failed ,continue"), "register address", REGISTERADDR,
|
|
"getAccountCheckReq", getAccountCheckReq)
|
|
time.Sleep(100 * time.Millisecond)
|
|
continue
|
|
} else {
|
|
log.ZInfo(ctx, "register ok ", "register address", REGISTERADDR, "getAccountCheckReq", getAccountCheckReq)
|
|
userLock.Lock()
|
|
allUserID = append(allUserID, uid)
|
|
userLock.Unlock()
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
func getToken(uid string) string {
|
|
ctx = ccontext.WithInfo(context.Background(), &ccontext.GlobalConfig{
|
|
UserID: uid,
|
|
Token: "",
|
|
IMConfig: sdk_struct.IMConfig{
|
|
PlatformID: PlatformID,
|
|
ApiAddr: APIADDR,
|
|
WsAddr: WSADDR,
|
|
LogLevel: LogLevel,
|
|
},
|
|
})
|
|
ctx = ccontext.WithOperationID(ctx, utils.OperationIDGenerator())
|
|
url := TOKENADDR
|
|
req := authPB.UserTokenReq{
|
|
Secret: SECRET,
|
|
PlatformID: PlatformID,
|
|
UserID: uid,
|
|
}
|
|
resp := authPB.UserTokenResp{}
|
|
err := util.ApiPost(ctx, "/auth/user_token", &req, &resp)
|
|
if err != nil {
|
|
log.ZError(ctx, "Post2Api failed ", errors.New("Post2Api failed "), "userID", req.UserID, "url", url, "req", req)
|
|
return ""
|
|
}
|
|
|
|
log.ZInfo(ctx, "get token: ", "userID", req.UserID, "token", resp.Token)
|
|
return resp.Token
|
|
}
|
|
|
|
func RunGetToken(strMyUid string) string {
|
|
var token string
|
|
for true {
|
|
token = getToken(strMyUid)
|
|
if token == "" {
|
|
time.Sleep(time.Duration(100) * time.Millisecond)
|
|
continue
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
return token
|
|
}
|
|
|
|
func getMyIP() string {
|
|
addrs, err := net.InterfaceAddrs()
|
|
if err != nil {
|
|
log.ZError(ctx, "InterfaceAddrs failed ", errors.New("InterfaceAddrs failed "), "addrs", addrs)
|
|
os.Exit(1)
|
|
return ""
|
|
}
|
|
for _, address := range addrs {
|
|
if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
|
|
if ipnet.IP.To4() != nil {
|
|
return ipnet.IP.String()
|
|
}
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func RegisterReliabilityUser(id int, timeStamp string) {
|
|
userID := GenUid(id, "reliability_"+timeStamp)
|
|
register(userID)
|
|
token := RunGetToken(userID)
|
|
coreMgrLock.Lock()
|
|
defer coreMgrLock.Unlock()
|
|
allLoginMgr[id] = &CoreNode{token: token, userID: userID}
|
|
}
|
|
|
|
func WorkGroupRegisterReliabilityUser(id int) {
|
|
userID := GenUid(id, "workgroup")
|
|
// register(userID)
|
|
token := RunGetToken(userID)
|
|
coreMgrLock.Lock()
|
|
defer coreMgrLock.Unlock()
|
|
log.ZInfo(ctx, "WorkGroupRegisterReliabilityUser : ", "userID", userID, "token: ", token)
|
|
allLoginMgr[id] = &CoreNode{token: token, userID: userID}
|
|
}
|
|
|
|
func RegisterPressUser(id int) {
|
|
userID := GenUid(id, "press")
|
|
register(userID)
|
|
token := RunGetToken(userID)
|
|
coreMgrLock.Lock()
|
|
defer coreMgrLock.Unlock()
|
|
allLoginMgr[id] = &CoreNode{token: token, userID: userID}
|
|
}
|
|
|