C2R_LoginHandler.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text.RegularExpressions;
  4. namespace ET.Server
  5. {
  6. /// <summary>
  7. /// 登陆验证
  8. /// </summary>
  9. [MessageHandler(SceneType.Realm)]
  10. public class C2R_LoginHandler: AMRpcHandler<C2R_Login, R2C_Login>
  11. {
  12. protected override async ETTask Run(Session session, C2R_Login request, R2C_Login response, Action reply)
  13. {
  14. if (session.DomainScene().SceneType != SceneType.Realm)
  15. {
  16. Log.Debug($"请求的Scene错误...SceneType={session.DomainScene().SceneType}");
  17. session.Dispose();
  18. return;
  19. }
  20. // 移除session自动超时组件
  21. session.RemoveComponent<SessionAcceptTimeoutComponent>();
  22. // 重复请求
  23. if (session.GetComponent<SessionLockComponent>() != null)
  24. {
  25. response.Error = ErrorCode.ERR_RequestRepeatedly;
  26. reply();
  27. return;
  28. }
  29. session.AddComponent<SessionLockComponent>();
  30. // 验证参数
  31. if (string.IsNullOrEmpty(request.Account) || string.IsNullOrEmpty(request.Password))
  32. {
  33. Log.Debug($"用户名或密码为空");
  34. response.Error = ErrorCode.ERR_UserNameOrPasswordIsNull;
  35. reply();
  36. return;
  37. }
  38. /*if (!Regex.IsMatch(request.Account.Trim(), @"^[a-zA-Z][a-zA-Z0-9_]{2,19}$"))
  39. {
  40. Log.Debug($"用户名或密码格式错误");
  41. response.Error = ErrorCode.ERR_UserNameOrPasswordFormatError;
  42. reply();
  43. return;
  44. }*/
  45. UserInfo userInfo;
  46. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Login, request.Account.Trim().GetHashCode()))
  47. {
  48. // 账号是否存在
  49. List<UserInfo> list = await DBManagerComponent.Instance.GetZoneDB(session.DomainZone())
  50. .Query<UserInfo>(d => d.Account.Equals(request.Account.Trim()));
  51. if (list != null && list.Count > 0)
  52. {
  53. userInfo = list[0];
  54. }
  55. else
  56. {
  57. // 创建一个账号
  58. userInfo = new UserInfo();
  59. userInfo.Id = IdGenerater.Instance.GenerateId();
  60. userInfo.Account = request.Account.Trim();
  61. userInfo.Password = request.Password.Trim();
  62. userInfo.Channel = 0;
  63. userInfo.SubChannel = 0;
  64. userInfo.DeviceID = 0;
  65. userInfo.UserType = 0;
  66. userInfo.BanType = 0;
  67. userInfo.BanBeginTime = 0;
  68. userInfo.BanEndTime = 0;
  69. userInfo.Ip = session.RemoteAddress.Address.ToString();
  70. userInfo.CreateTime = TimeHelper.ServerNow();
  71. await DBManagerComponent.Instance.GetZoneDB(session.DomainZone()).Save<UserInfo>(userInfo);
  72. }
  73. }
  74. if (userInfo == null)
  75. {
  76. Log.Debug($"登陆错误");
  77. response.Error = ErrorCode.ERR_LoginError;
  78. reply();
  79. userInfo.Dispose();
  80. return;
  81. }
  82. if (!userInfo.Account.Equals(request.Account.Trim()) || (!userInfo.Password.Equals(request.Password.Trim())))
  83. {
  84. Log.Debug($"用户名或密码错误");
  85. response.Error = ErrorCode.ERR_UserNameOrPasswordError;
  86. reply();
  87. userInfo.Dispose();
  88. return;
  89. }
  90. if (userInfo.BanType == 1)
  91. {
  92. Log.Debug($"已被永久封禁");
  93. response.Error = ErrorCode.ERR_UserPermanentBan;
  94. reply();
  95. userInfo.Dispose();
  96. return;
  97. }
  98. if (userInfo.BanType == 2)
  99. {
  100. Log.Debug(
  101. $"已被限时封禁, startTime={TimeHelper.FormatTime(userInfo.BanBeginTime, TimeHelper.yyyyMMddHHmmss)}, endTime={TimeHelper.FormatTime(userInfo.BanEndTime, TimeHelper.yyyyMMddHHmmss)}");
  102. response.Error = ErrorCode.ERR_UserBanTime;
  103. reply();
  104. userInfo.Dispose();
  105. return;
  106. }
  107. // 绑定session
  108. session.AddChild(userInfo);
  109. // todo 生成token, 后期改成正式token
  110. string token = userInfo.Id.ToString().Trim();
  111. // 服务器列表
  112. List<StartSceneConfig> gameList = RealmGateAddressHelper.GetAllGame(session.DomainZone());
  113. if (gameList is { Count: > 0 })
  114. {
  115. response.Address = new List<string>();
  116. foreach (StartSceneConfig config in gameList)
  117. {
  118. response.Address.Add(config.InnerIPOutPort.ToString());
  119. }
  120. }
  121. response.Token = token;
  122. response.UserId = userInfo.Id;
  123. reply();
  124. userInfo.Dispose();
  125. }
  126. }
  127. }