using System; using System.Collections.Generic; using System.Text.RegularExpressions; namespace ET.Server { /// /// 登陆验证 /// [MessageHandler(SceneType.Realm)] public class C2R_LoginHandler: AMRpcHandler { protected override async ETTask Run(Session session, C2R_Login request, R2C_Login response, Action reply) { if (session.DomainScene().SceneType != SceneType.Realm) { Log.Debug($"请求的Scene错误...SceneType={session.DomainScene().SceneType}"); session.Dispose(); return; } // 移除session自动超时组件 session.RemoveComponent(); // 重复请求 if (session.GetComponent() != null) { response.Error = ErrorCode.ERR_RequestRepeatedly; reply(); return; } session.AddComponent(); // 验证参数 if (string.IsNullOrEmpty(request.Account) || string.IsNullOrEmpty(request.Password)) { Log.Debug($"用户名或密码为空"); response.Error = ErrorCode.ERR_UserNameOrPasswordIsNull; reply(); return; } /*if (!Regex.IsMatch(request.Account.Trim(), @"^[a-zA-Z][a-zA-Z0-9_]{2,19}$")) { Log.Debug($"用户名或密码格式错误"); response.Error = ErrorCode.ERR_UserNameOrPasswordFormatError; reply(); return; }*/ UserInfo userInfo; using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Login, request.Account.Trim().GetHashCode())) { // 账号是否存在 List list = await DBManagerComponent.Instance.GetZoneDB(session.DomainZone()) .Query(d => d.Account.Equals(request.Account.Trim())); if (list != null && list.Count > 0) { userInfo = list[0]; } else { // 创建一个账号 userInfo = new UserInfo(); userInfo.Id = IdGenerater.Instance.GenerateId(); userInfo.Account = request.Account.Trim(); userInfo.Password = request.Password.Trim(); userInfo.Channel = 0; userInfo.SubChannel = 0; userInfo.DeviceID = 0; userInfo.UserType = 0; userInfo.BanType = 0; userInfo.BanBeginTime = 0; userInfo.BanEndTime = 0; userInfo.Ip = session.RemoteAddress.Address.ToString(); userInfo.CreateTime = TimeHelper.ServerNow(); await DBManagerComponent.Instance.GetZoneDB(session.DomainZone()).Save(userInfo); } } if (userInfo == null) { Log.Debug($"登陆错误"); response.Error = ErrorCode.ERR_LoginError; reply(); userInfo.Dispose(); return; } if (!userInfo.Account.Equals(request.Account.Trim()) || (!userInfo.Password.Equals(request.Password.Trim()))) { Log.Debug($"用户名或密码错误"); response.Error = ErrorCode.ERR_UserNameOrPasswordError; reply(); userInfo.Dispose(); return; } if (userInfo.BanType == 1) { Log.Debug($"已被永久封禁"); response.Error = ErrorCode.ERR_UserPermanentBan; reply(); userInfo.Dispose(); return; } if (userInfo.BanType == 2) { Log.Debug( $"已被限时封禁, startTime={TimeHelper.FormatTime(userInfo.BanBeginTime, TimeHelper.yyyyMMddHHmmss)}, endTime={TimeHelper.FormatTime(userInfo.BanEndTime, TimeHelper.yyyyMMddHHmmss)}"); response.Error = ErrorCode.ERR_UserBanTime; reply(); userInfo.Dispose(); return; } // 绑定session session.AddChild(userInfo); // todo 生成token, 后期改成正式token string token = userInfo.Id.ToString().Trim(); // 服务器列表 List gameList = RealmGateAddressHelper.GetAllGame(session.DomainZone()); if (gameList is { Count: > 0 }) { response.Address = new List(); foreach (StartSceneConfig config in gameList) { response.Address.Add(config.InnerIPOutPort.ToString()); } } response.Token = token; response.UserId = userInfo.Id; reply(); userInfo.Dispose(); } } }