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();
}
}
}