You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
341 lines
9.3 KiB
Go
341 lines
9.3 KiB
Go
package model
|
|
|
|
import (
|
|
"context"
|
|
"mygo/utils"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
type GameUser struct {
|
|
ID primitive.ObjectID `json:"_id" bson:"_id"`
|
|
UID int `json:"uid" bson:"uid"`
|
|
ParentID string `json:"parent_id" bson:"parent_id"`
|
|
Nickname string `json:"nickname" bson:"nickname"`
|
|
Avatar string `json:"avatar" bson:"avatar"`
|
|
OnlineStatus int `json:"online_status" bson:"online_status"`
|
|
MaxLevel int `json:"max_level" bson:"max_level"`
|
|
Regionid int `json:"regionid" bson:"regionid"`
|
|
Serverid int `json:"serverid" bson:"serverid"`
|
|
AccountStatus int `json:"account_status" bson:"account_status"`
|
|
AgentStatus int `json:"agent_status" bson:"agent_status"`
|
|
Money float64 `json:"money" bson:"money"`
|
|
FreezeReason string `json:"freeze_reason" bson:"freeze_reason"`
|
|
FreezeDate string `json:"freeze_date" bson:"freeze_date"`
|
|
LastLoginTime string `json:"last_login_time" bson:"last_login_time"`
|
|
LastLogoutTime string `json:"last_logout_time" bson:"last_logout_time"`
|
|
Created_at string `json:"created_at" bson:"created_at"`
|
|
Updated_at string `json:"updated_at" bson:"updated_at"`
|
|
}
|
|
|
|
func GetGameUserList(collection *mongo.Collection, uid int64, offset int64, limit int64) ([]GameUser, int64, error) {
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
opts := options.Find().SetLimit(limit).SetSkip(offset).SetSort(bson.D{{Key: "max_level", Value: -1}})
|
|
var filter = bson.D{}
|
|
if uid > 0 {
|
|
filter = bson.D{{Key: "uid", Value: uid}}
|
|
}
|
|
cur, err := collection.Find(ctx, filter, opts)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
defer cur.Close(ctx)
|
|
users := []GameUser{}
|
|
err = cur.All(context.Background(), &users)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
count, err := collection.CountDocuments(ctx, filter)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return users, count, nil
|
|
}
|
|
|
|
func SetAccountStatus(collection *mongo.Collection, uid int64, status int64, freeze_season, freeze_date string) error {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
filter := bson.D{{Key: "uid", Value: uid}}
|
|
update := bson.D{{Key: "$set", Value: bson.D{{Key: "account_status", Value: status}, {Key: "freeze_reason", Value: freeze_season}, {Key: "freeze_date", Value: freeze_date}}}}
|
|
_, err := collection.UpdateOne(ctx, filter, update)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func GetOnlineUserCount(collection *mongo.Collection) (int64, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
var filter = bson.D{{Key: "online_status", Value: 1}}
|
|
count, err := collection.CountDocuments(ctx, filter)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func GetAgentChildList(collection *mongo.Collection, agent_id string, offset int64, limit int64) ([]GameUser, int64, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
opts := options.Find().SetLimit(limit).SetSkip(offset).SetSort(bson.D{{Key: "max_level", Value: -1}})
|
|
var filter = bson.D{{Key: "parent_id", Value: agent_id}}
|
|
cur, err := collection.Find(ctx, filter, opts)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
defer cur.Close(ctx)
|
|
users := []GameUser{}
|
|
err = cur.All(ctx, &users)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
count, err := collection.CountDocuments(ctx, filter)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
return users, count, nil
|
|
}
|
|
|
|
func GetAgentChildCount(collection *mongo.Collection, agent_id string) (int64, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
var filter = bson.D{{Key: "parent_id", Value: agent_id}}
|
|
count, err := collection.CountDocuments(ctx, filter)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func GetTodayCreateCount(collection *mongo.Collection) (int64, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
today := time.Now().Format("2006-01-02")
|
|
filter := bson.M{"created_at": bson.M{"$regex": primitive.Regex{Pattern: "^" + today}}}
|
|
count, err := collection.CountDocuments(ctx, filter)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func GetTotalCreateCount(collection *mongo.Collection) (int64, error) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
filter := bson.D{}
|
|
count, err := collection.CountDocuments(ctx, filter)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return count, nil
|
|
}
|
|
|
|
func CountGameUsersByRegionIDsAndTimeRange(collection *mongo.Collection, ids []int, start_time, end_time string) (map[int]int, error) {
|
|
|
|
query := bson.M{}
|
|
|
|
if len(ids) > 0 {
|
|
query["regionid"] = bson.M{"$in": ids}
|
|
}
|
|
|
|
if start_time != "" {
|
|
startTime, err := utils.ParseTimeString(start_time)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
query["created_at"] = bson.M{"$gte": startTime}
|
|
}
|
|
|
|
if end_time != "" {
|
|
endTime, err := utils.ParseTimeString(end_time)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if _, ok := query["created_at"]; !ok {
|
|
query["created_at"] = bson.M{}
|
|
}
|
|
query["created_at"].(bson.M)["$lte"] = endTime
|
|
}
|
|
|
|
matchStage := bson.M{"$match": query}
|
|
|
|
groupStage := bson.M{
|
|
"$group": bson.M{
|
|
"_id": "$regionid",
|
|
"user_count": bson.M{"$sum": 1},
|
|
},
|
|
}
|
|
pipeline := []bson.M{
|
|
matchStage, groupStage,
|
|
}
|
|
cursor, err := collection.Aggregate(context.Background(), pipeline, options.Aggregate().SetAllowDiskUse(true))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer cursor.Close(context.Background())
|
|
|
|
userCounts := make(map[int]int)
|
|
for cursor.Next(context.Background()) {
|
|
var result struct {
|
|
RegionID int `bson:"_id"`
|
|
UserCount int `bson:"user_count"`
|
|
}
|
|
if err := cursor.Decode(&result); err != nil {
|
|
return nil, err
|
|
}
|
|
userCounts[result.RegionID] = result.UserCount
|
|
}
|
|
return userCounts, nil
|
|
}
|
|
|
|
func CountGameOnlineUsersByRegionIDs(collection *mongo.Collection, ids []int) (map[int]int, error) {
|
|
|
|
query := bson.M{}
|
|
|
|
if len(ids) > 0 {
|
|
query["regionid"] = bson.M{"$in": ids}
|
|
|
|
}
|
|
|
|
query["online_status"] = bson.M{"$eq": 1}
|
|
|
|
matchStage := bson.M{"$match": query}
|
|
|
|
groupStage := bson.M{
|
|
"$group": bson.M{
|
|
"_id": "$regionid",
|
|
"user_count": bson.M{"$sum": 1},
|
|
},
|
|
}
|
|
|
|
pipeline := []bson.M{
|
|
matchStage, groupStage,
|
|
}
|
|
cursor, err := collection.Aggregate(context.Background(), pipeline, options.Aggregate().SetAllowDiskUse(true))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer cursor.Close(context.Background())
|
|
|
|
userCounts := make(map[int]int)
|
|
for cursor.Next(context.Background()) {
|
|
var result struct {
|
|
RegionId int `bson:"_id"`
|
|
UserCount int `bson:"user_count"`
|
|
}
|
|
if err := cursor.Decode(&result); err != nil {
|
|
return nil, err
|
|
}
|
|
userCounts[result.RegionId] = result.UserCount
|
|
}
|
|
return userCounts, nil
|
|
}
|
|
|
|
func CountGameUsersByServerIDsAndTimeRange(collection *mongo.Collection, ids []int, start_time, end_time string) (map[int]int, error) {
|
|
|
|
query := bson.M{}
|
|
|
|
if len(ids) > 0 {
|
|
query["serverid"] = bson.M{"$in": ids}
|
|
}
|
|
|
|
if start_time != "" {
|
|
startTime, err := utils.ParseTimeString(start_time)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
query["created_at"] = bson.M{"$gte": startTime}
|
|
}
|
|
|
|
if end_time != "" {
|
|
endTime, err := utils.ParseTimeString(end_time)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if _, ok := query["created_at"]; !ok {
|
|
query["created_at"] = bson.M{}
|
|
}
|
|
query["created_at"].(bson.M)["$lte"] = endTime
|
|
}
|
|
|
|
matchStage := bson.M{"$match": query}
|
|
|
|
groupStage := bson.M{
|
|
"$group": bson.M{
|
|
"_id": "$serverid",
|
|
"user_count": bson.M{"$sum": 1},
|
|
},
|
|
}
|
|
pipeline := []bson.M{
|
|
matchStage, groupStage,
|
|
}
|
|
cursor, err := collection.Aggregate(context.Background(), pipeline, options.Aggregate().SetAllowDiskUse(true))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer cursor.Close(context.Background())
|
|
|
|
userCounts := make(map[int]int)
|
|
for cursor.Next(context.Background()) {
|
|
var result struct {
|
|
ServerId int `bson:"_id"`
|
|
UserCount int `bson:"user_count"`
|
|
}
|
|
if err := cursor.Decode(&result); err != nil {
|
|
return nil, err
|
|
}
|
|
userCounts[result.ServerId] = result.UserCount
|
|
}
|
|
return userCounts, nil
|
|
}
|
|
|
|
func CountGameOnlineUsersByServerIDs(collection *mongo.Collection, ids []int) (map[int]int, error) {
|
|
|
|
query := bson.M{}
|
|
|
|
if len(ids) > 0 {
|
|
query["serverid"] = bson.M{"$in": ids}
|
|
|
|
}
|
|
|
|
query["online_status"] = bson.M{"$eq": 1}
|
|
|
|
matchStage := bson.M{"$match": query}
|
|
|
|
groupStage := bson.M{
|
|
"$group": bson.M{
|
|
"_id": "$serverid",
|
|
"user_count": bson.M{"$sum": 1},
|
|
},
|
|
}
|
|
|
|
pipeline := []bson.M{
|
|
matchStage, groupStage,
|
|
}
|
|
cursor, err := collection.Aggregate(context.Background(), pipeline, options.Aggregate().SetAllowDiskUse(true))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer cursor.Close(context.Background())
|
|
|
|
userCounts := make(map[int]int)
|
|
for cursor.Next(context.Background()) {
|
|
var result struct {
|
|
ServerId int `bson:"_id"`
|
|
UserCount int `bson:"user_count"`
|
|
}
|
|
if err := cursor.Decode(&result); err != nil {
|
|
return nil, err
|
|
}
|
|
userCounts[result.ServerId] = result.UserCount
|
|
}
|
|
return userCounts, nil
|
|
}
|