github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/game/internal/user_login.go (about)

     1  package internal
     2  
     3  import (
     4  	"common"
     5  	"conf"
     6  	"msg"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/name5566/leaf/log"
    11  	mgo "gopkg.in/mgo.v2"
    12  	"gopkg.in/mgo.v2/bson"
    13  )
    14  
    15  func (user *User) wechatLogin(info *msg.C2S_WeChatLogin) {
    16  	userData := new(UserData)
    17  	firstLogin := false
    18  	skeleton.Go(func() {
    19  		db := mongoDB.Ref()
    20  		defer mongoDB.UnRef(db)
    21  		// load userData
    22  		err := db.DB(DB).C("users").Find(bson.M{"unionid": info.UnionID}).One(userData)
    23  		if err == nil {
    24  			return
    25  		}
    26  		if err == mgo.ErrNotFound {
    27  			firstLogin = true
    28  		} else {
    29  			log.Error("load unionid %v data error: %v", info.UnionID, err)
    30  			userData = nil
    31  			user.WriteMsg(&msg.S2C_Close{Error: msg.S2C_Close_InnerError})
    32  			user.Close()
    33  			return
    34  		}
    35  		// new
    36  		err = userData.initValue(info.Channel)
    37  		if err != nil {
    38  			log.Error("load unionid %v data error: %v", info.UnionID, err)
    39  			userData = nil
    40  			user.WriteMsg(&msg.S2C_Close{Error: msg.S2C_Close_InnerError})
    41  			user.Close()
    42  			return
    43  		}
    44  	}, func() {
    45  		if userData == nil || user.state == userLogout {
    46  			return
    47  		}
    48  		if userData.Role == roleBlack {
    49  			user.WriteMsg(&msg.S2C_Close{
    50  				Error:        msg.S2C_Close_RoleBlack,
    51  				WeChatNumber: landlordConfigData.WeChatNumber,
    52  			})
    53  			user.Close()
    54  			return
    55  		}
    56  		anotherLogin := false
    57  		if oldUser, ok := userIDUsers[userData.UserID]; ok {
    58  			if oldUser.baseData.userData.Serial != info.Serial {
    59  				anotherLogin = true
    60  			}
    61  			oldUser.WriteMsg(&msg.S2C_Close{Error: msg.S2C_Close_LoginRepeated})
    62  			oldUser.Close()
    63  			log.Debug("userID: %v 重复登录", userData.UserID)
    64  			if oldUser == user {
    65  				return
    66  			}
    67  			user.baseData = oldUser.baseData
    68  			userData = oldUser.baseData.userData
    69  		}
    70  		userIDUsers[userData.UserID] = user
    71  		if common.OneDay0ClockTimestamp(time.Now()) > userData.UpdatedAt {
    72  			WriteSougouActivityRecord()
    73  		}
    74  		userData.updateWeChatInfo(info)
    75  		user.baseData.userData = userData
    76  		user.onLogin(firstLogin, anotherLogin)
    77  		if firstLogin {
    78  			inviteTask(user.baseData.userData.UnionID)
    79  			log.Debug("userID: %v WeChat首次登录 unionid: %v, 在线人数: %v", user.baseData.userData.UserID, user.baseData.userData.UnionID, len(userIDUsers))
    80  		} else {
    81  			log.Debug("userID: %v WeChat登录 unionid: %v, 在线人数: %v", user.baseData.userData.UserID, user.baseData.userData.UnionID, len(userIDUsers))
    82  		}
    83  	})
    84  }
    85  
    86  func (user *User) tokenLogin(token string) {
    87  	userData := new(UserData)
    88  	skeleton.Go(func() {
    89  		db := mongoDB.Ref()
    90  		defer mongoDB.UnRef(db)
    91  
    92  		err := db.DB(DB).C("users").Find(bson.M{"token": token, "expireat": bson.M{"$gt": time.Now().Unix()}}).One(userData)
    93  		if err != nil {
    94  			log.Debug("find token %v error: %v", token, err)
    95  			userData = nil
    96  			user.WriteMsg(&msg.S2C_Close{Error: msg.S2C_Close_TokenInvalid})
    97  			user.Close()
    98  		}
    99  	}, func() {
   100  		if userData == nil || user.state == userLogout {
   101  			return
   102  		}
   103  		if userData.Role == roleBlack {
   104  			user.WriteMsg(&msg.S2C_Close{
   105  				Error:        msg.S2C_Close_RoleBlack,
   106  				WeChatNumber: landlordConfigData.WeChatNumber,
   107  			})
   108  			user.Close()
   109  			return
   110  		}
   111  		ip := strings.Split(user.RemoteAddr().String(), ":")[0]
   112  		if oldUser, ok := userIDUsers[userData.UserID]; ok {
   113  			log.Debug("userID: %v 已经登录 %v %v", userData.UserID, oldUser.baseData.userData.LoginIP, ip)
   114  			if ip == oldUser.baseData.userData.LoginIP {
   115  				oldUser.Close()
   116  			} else {
   117  				user.WriteMsg(&msg.S2C_Close{Error: msg.S2C_Close_IPChanged})
   118  				user.Close()
   119  				return
   120  			}
   121  			user.baseData = oldUser.baseData
   122  			userData = oldUser.baseData.userData
   123  		}
   124  		userIDUsers[userData.UserID] = user
   125  		user.baseData.userData = userData
   126  		user.onLogin(false, false)
   127  		log.Debug("userID: %v Token登录, 在线人数: %v", userData.UserID, len(userIDUsers))
   128  	})
   129  }
   130  
   131  func (user *User) usernamePasswordLogin(username string, password string) {
   132  	userData := new(UserData)
   133  	skeleton.Go(func() {
   134  		db := mongoDB.Ref()
   135  		defer mongoDB.UnRef(db)
   136  		// load
   137  		err := db.DB(DB).C("users").Find(bson.M{"username": username, "password": password}).One(userData)
   138  		if err != nil {
   139  			log.Error("用户名: %v, 密码不正确: %v", username, err)
   140  			userData = nil
   141  			user.WriteMsg(&msg.S2C_Close{Error: msg.S2C_Close_UsernameInvalid})
   142  			user.Close()
   143  		}
   144  	}, func() {
   145  		if userData == nil || user.state == userLogout {
   146  			return
   147  		}
   148  		if userData.Role == -1 {
   149  			user.WriteMsg(&msg.S2C_Close{
   150  				Error:        msg.S2C_Close_RoleBlack,
   151  				WeChatNumber: landlordConfigData.WeChatNumber,
   152  			})
   153  			user.Close()
   154  			return
   155  		}
   156  		if oldUser, ok := userIDUsers[userData.UserID]; ok {
   157  			oldUser.WriteMsg(&msg.S2C_Close{Error: msg.S2C_Close_LoginRepeated})
   158  			oldUser.Close()
   159  			log.Debug("userID: %v 重复登录", userData.UserID)
   160  			if oldUser == user {
   161  				return
   162  			}
   163  			user.baseData = oldUser.baseData
   164  			userData = oldUser.baseData.userData
   165  		}
   166  		userIDUsers[userData.UserID] = user
   167  		user.baseData.userData = userData
   168  		user.onLogin(false, false)
   169  		log.Debug("用户名: %v 密码登录", username)
   170  	})
   171  }
   172  
   173  func (user *User) logout() {
   174  	if user.heartbeatTimer != nil {
   175  		user.heartbeatTimer.Stop()
   176  	}
   177  	if user.baseData == nil {
   178  		return
   179  	}
   180  	if existUser, ok := userIDUsers[user.baseData.userData.UserID]; ok {
   181  		if existUser == user {
   182  			log.Debug("userID: %v 登出", user.baseData.userData.UserID)
   183  			user.onLogout()
   184  			delete(userIDUsers, user.baseData.userData.UserID)
   185  			user.baseData.userData.Online = false
   186  			saveUserData(user.baseData.userData)
   187  		}
   188  	}
   189  }
   190  
   191  func (user *User) onLogin(firstLogin bool, anotherLogin bool) {
   192  	if !user.isRobot() {
   193  		user.baseData.userData.LoginIP = strings.Split(user.RemoteAddr().String(), ":")[0]
   194  		user.baseData.userData.Token = common.GetToken(32)
   195  		user.baseData.userData.ExpireAt = time.Now().Add(2 * time.Hour).Unix()
   196  	}
   197  	if conf.Server.FamilyActivity {
   198  		now := time.Now()
   199  		if user.baseData.userData.CollectDeadLine < now.Unix() {
   200  			next := now.Add(24 * time.Hour)
   201  			//零点计算
   202  			user.baseData.userData.CardCode = ""
   203  			user.baseData.userData.Taken = false
   204  			user.baseData.userData.CollectDeadLine = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location()).Unix()
   205  			user.baseData.userData.PlayTimes = 0
   206  			updateUserData(user.baseData.userData.UserID, bson.M{"$set": bson.M{
   207  				"cardcode":        user.baseData.userData.CardCode,
   208  				"taken":           user.baseData.userData.Taken,
   209  				"collectdeadline": user.baseData.userData.CollectDeadLine,
   210  				"playtimes":       user.baseData.userData.PlayTimes,
   211  			},
   212  			})
   213  		}
   214  	}
   215  	user.baseData.userData.Online = true
   216  	if firstLogin {
   217  		saveUserData(user.baseData.userData)
   218  	} else {
   219  		updateUserData(user.baseData.userData.UserID, bson.M{"$set": bson.M{"token": user.baseData.userData.Token, "online": user.baseData.userData.Online}})
   220  	}
   221  	user.autoHeartbeat()
   222  	user.WriteMsg(&msg.S2C_Login{
   223  		AccountID:       user.baseData.userData.AccountID,
   224  		Nickname:        user.baseData.userData.Nickname,
   225  		Headimgurl:      user.baseData.userData.Headimgurl,
   226  		Sex:             user.baseData.userData.Sex,
   227  		Role:            user.baseData.userData.Role,
   228  		Token:           user.baseData.userData.Token,
   229  		AnotherLogin:    anotherLogin,
   230  		AnotherRoom:     userIDRooms[user.baseData.userData.UserID] != nil,
   231  		FirstLogin:      firstLogin,
   232  		Radio:           landlordConfigData.Radio,
   233  		WeChatNumber:    landlordConfigData.WeChatNumber,
   234  		CardCode:        user.baseData.userData.CardCode,
   235  		Taken:           user.baseData.userData.Taken,
   236  		CardCodeDesc:    conf.GetCfgDDZ().CardCodeDesc,
   237  		PlayTimes:       user.baseData.userData.PlayTimes,
   238  		Total:           conf.GetCfgCard().PlayTimes,
   239  		Parentid:        user.baseData.userData.ParentId,
   240  		GivenChips:      conf.Server.Chips,      //绑定赠送的金币数量
   241  		FirstLoginChips: conf.Server.FirstLogin, //首次登录赠送的金币
   242  	})
   243  
   244  	if conf.Server.FamilyActivity {
   245  		user.WriteMsg(&msg.S2C_CardMa{
   246  			Code:      user.baseData.userData.CardCode,
   247  			Total:     conf.GetCfgCard().PlayTimes,
   248  			PlayTimes: user.baseData.userData.PlayTimes,
   249  			Completed: user.baseData.userData.CardCode != "",
   250  		})
   251  	}
   252  	user.WriteMsg(&msg.S2C_CircleLink{
   253  		Url: conf.GetCfgLink().CircleLink,
   254  	})
   255  	if user.baseData.userData.Level == 0 {
   256  		user.baseData.userData.Level = 1
   257  	}
   258  	//红包任务
   259  	user.sendRedpacketTask(user.baseData.userData.Level)
   260  	//红包记录
   261  	user.redpacketTaskRecord()
   262  	//请求圈圈
   263  	user.requestCircleID()
   264  	user.ShareInfo()
   265  
   266  	user.sendDailySignItems()
   267  	/*
   268  		user.sendTaskList(firstLogin, func() {
   269  			user.WriteMsg(&msg.S2C_Login{
   270  				AccountID:    user.baseData.userData.AccountID,
   271  				Nickname:     user.baseData.userData.Nickname,
   272  				Headimgurl:   user.baseData.userData.Headimgurl,
   273  				Sex:          user.baseData.userData.Sex,
   274  				Role:         user.baseData.userData.Role,
   275  				Token:        user.baseData.userData.Token,
   276  				AnotherLogin: anotherLogin,
   277  				AnotherRoom:  userIDRooms[user.baseData.userData.UserID] != nil,
   278  				FirstLogin:   firstLogin,
   279  				Radio:        landlordConfigData.Radio,
   280  				WeChatNumber: landlordConfigData.WeChatNumber,
   281  				CardCode:     user.baseData.userData.CardCode,
   282  				Taken:        user.baseData.userData.Taken,
   283  				CardCodeDesc: conf.GetCfgDDZ().CardCodeDesc,
   284  				PlayTimes:    user.baseData.userData.PlayTimes,
   285  				Total:        conf.GetCfgCard().PlayTimes,
   286  			})
   287  			if conf.Server.FamilyActivity {
   288  				user.WriteMsg(&msg.S2C_CardMa{
   289  					Code:      user.baseData.userData.CardCode,
   290  					Total:     conf.GetCfgCard().PlayTimes,
   291  					PlayTimes: user.baseData.userData.PlayTimes,
   292  					Completed: user.baseData.userData.CardCode != "",
   293  				})
   294  			}
   295  			user.redpacketTaskRecord()
   296  			user.requestCircleID()
   297  			//user.requestCheckCircleUserBlack()
   298  			user.doTask(1000)
   299  			user.offerSubsidy()
   300  		})
   301  
   302  	*/
   303  }
   304  
   305  func (user *User) onLogout() {
   306  	if r, ok := userIDRooms[user.baseData.userData.UserID]; ok {
   307  		user.exitRoom(r, false)
   308  	}
   309  	//user.saveTaskList()
   310  }