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 }