mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-12-05 08:09:03 +00:00
修改架构 (#24)
* 添加ServerController;DataRequest添加GetNotice * DataRequest添加Reg * 添加RoomS * 修改架构之Connect * 迁移其他的Socket业务至DataRequest * 更新连接服务器的逻辑 * 修改架构之Login * 更新Core * 修复IntoRoom Bug * 修复ForceLogOut Bug * 修复CreateRoom QuitRoom IntoRoom * 修复QuitRoom Bug和进入房间的广播 * 添加查看列表指令,完善kick和forcelogout * 数量显示错误 * 修复QuitRoom ConnectingCount Bug
This commit is contained in:
parent
9f19821e1d
commit
7a6b40800d
@ -1,6 +1,8 @@
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
|
using System.Data;
|
||||||
using Milimoe.FunGame.Core.Api.Transmittal;
|
using Milimoe.FunGame.Core.Api.Transmittal;
|
||||||
using Milimoe.FunGame.Core.Api.Utility;
|
using Milimoe.FunGame.Core.Api.Utility;
|
||||||
|
using Milimoe.FunGame.Core.Entity;
|
||||||
using Milimoe.FunGame.Core.Library.Common.Network;
|
using Milimoe.FunGame.Core.Library.Common.Network;
|
||||||
using Milimoe.FunGame.Core.Library.Constant;
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
using Milimoe.FunGame.Core.Library.SQLScript.Common;
|
using Milimoe.FunGame.Core.Library.SQLScript.Common;
|
||||||
@ -16,8 +18,11 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
public ServerModel Server { get; }
|
public ServerModel Server { get; }
|
||||||
public MySQLHelper SQLHelper => Server.SQLHelper;
|
public MySQLHelper SQLHelper => Server.SQLHelper;
|
||||||
public MailSender? MailSender => Server.MailSender;
|
public MailSender? MailSender => Server.MailSender;
|
||||||
|
public DataRequestType LastRequest => _LastRequest;
|
||||||
|
|
||||||
private string ForgetVerify = "";
|
private string ForgetVerify = "";
|
||||||
|
private string RegVerify = "";
|
||||||
|
private DataRequestType _LastRequest = DataRequestType.UnKnown;
|
||||||
|
|
||||||
public DataRequestController(ServerModel server)
|
public DataRequestController(ServerModel server)
|
||||||
{
|
{
|
||||||
@ -27,12 +32,52 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
public Hashtable GetResultData(DataRequestType type, Hashtable data)
|
public Hashtable GetResultData(DataRequestType type, Hashtable data)
|
||||||
{
|
{
|
||||||
Hashtable result = new();
|
Hashtable result = new();
|
||||||
|
_LastRequest = type;
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case DataRequestType.UnKnown:
|
case DataRequestType.UnKnown:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.RunTime_Logout:
|
||||||
|
LogOut(data, result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Main_GetNotice:
|
||||||
|
GetServerNotice(result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Main_CreateRoom:
|
||||||
|
CreateRoom(data, result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Main_UpdateRoom:
|
||||||
|
UpdateRoom(result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Main_IntoRoom:
|
||||||
|
IntoRoom(data, result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Main_QuitRoom:
|
||||||
|
QuitRoom(data, result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Main_MatchRoom:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Main_Chat:
|
||||||
|
Chat(data);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Reg_GetRegVerifyCode:
|
||||||
|
Reg(data, result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Login_Login:
|
||||||
|
Login(data, result);
|
||||||
|
break;
|
||||||
|
|
||||||
case DataRequestType.Login_GetFindPasswordVerifyCode:
|
case DataRequestType.Login_GetFindPasswordVerifyCode:
|
||||||
ForgetPassword(data, result);
|
ForgetPassword(data, result);
|
||||||
break;
|
break;
|
||||||
@ -40,20 +85,425 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
case DataRequestType.Login_UpdatePassword:
|
case DataRequestType.Login_UpdatePassword:
|
||||||
UpdatePassword(data, result);
|
UpdatePassword(data, result);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Room_GetRoomSettings:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Room_GetRoomPlayerCount:
|
||||||
|
GetRoomPlayerCount(data, result);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataRequestType.Room_UpdateRoomMaster:
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region RunTime
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退出登录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void LogOut(Hashtable RequestData, Hashtable ResultData)
|
||||||
|
{
|
||||||
|
string msg = "";
|
||||||
|
Guid key = Guid.Empty;
|
||||||
|
if (RequestData.Count >= 1)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> LogOut");
|
||||||
|
key = DataRequest.GetHashtableJsonObject<Guid>(RequestData, "key");
|
||||||
|
if (Server.IsLoginKey(key))
|
||||||
|
{
|
||||||
|
Server.LogOut();
|
||||||
|
msg = "你已成功退出登录! ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResultData.Add("msg", msg);
|
||||||
|
ResultData.Add("key", key);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Main
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取公告
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void GetServerNotice(Hashtable ResultData)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> GetNotice");
|
||||||
|
_LastRequest = DataRequestType.Main_GetNotice;
|
||||||
|
ResultData.Add("notice", Config.ServerNotice);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建房间
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void CreateRoom(Hashtable RequestData, Hashtable ResultData)
|
||||||
|
{
|
||||||
|
string roomid = "-1";
|
||||||
|
if (RequestData.Count >= 3)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> CreateRoom");
|
||||||
|
string roomtype_string = DataRequest.GetHashtableJsonObject<string>(RequestData, "roomtype") ?? GameMode.GameMode_All;
|
||||||
|
User user = DataRequest.GetHashtableJsonObject<User>(RequestData, "master") ?? Factory.GetUser();
|
||||||
|
string password = DataRequest.GetHashtableJsonObject<string>(RequestData, "password") ?? "";
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(roomtype_string) && user.Id != 0)
|
||||||
|
{
|
||||||
|
RoomType roomtype = roomtype_string switch
|
||||||
|
{
|
||||||
|
GameMode.GameMode_Mix => RoomType.Mix,
|
||||||
|
GameMode.GameMode_Team => RoomType.Team,
|
||||||
|
GameMode.GameMode_MixHasPass => RoomType.MixHasPass,
|
||||||
|
GameMode.GameMode_TeamHasPass => RoomType.TeamHasPass,
|
||||||
|
_ => RoomType.All
|
||||||
|
};
|
||||||
|
roomid = Verification.CreateVerifyCode(VerifyCodeType.MixVerifyCode, 7).ToUpper();
|
||||||
|
SQLHelper.Execute(RoomQuery.Insert_CreateRoom(roomid, user.Id, roomtype, password ?? ""));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[CreateRoom] Master: " + user.Username + " RoomID: " + roomid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResultData.Add("roomid", roomid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 更新房间列表
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void UpdateRoom(Hashtable ResultData)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> UpdateRoom");
|
||||||
|
Config.RoomList ??= new();
|
||||||
|
Config.RoomList.Clear();
|
||||||
|
DataSet DsRoomTemp = SQLHelper.ExecuteDataSet(RoomQuery.Select_Rooms);
|
||||||
|
DataSet DsUserTemp = SQLHelper.ExecuteDataSet(UserQuery.Select_Users);
|
||||||
|
List<Room> rooms = Factory.GetRooms(DsRoomTemp, DsUserTemp);
|
||||||
|
Config.RoomList.AddRooms(rooms); // 更新服务器中的房间列表
|
||||||
|
ResultData.Add("rooms", rooms); // 传RoomList
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 退出房间,并更新房主
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void QuitRoom(Hashtable RequestData, Hashtable ResultData)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
if (RequestData.Count >= 2)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> QuitRoom");
|
||||||
|
string roomid = DataRequest.GetHashtableJsonObject<string>(RequestData, "roomid") ?? "-1";
|
||||||
|
bool isMaster = DataRequest.GetHashtableJsonObject<bool>(RequestData, "isMaster");
|
||||||
|
|
||||||
|
if (roomid != "-1")
|
||||||
|
{
|
||||||
|
Config.RoomList.QuitRoom(roomid, Server.User);
|
||||||
|
Room Room = Config.RoomList[roomid] ?? General.HallInstance;
|
||||||
|
// 是否是房主
|
||||||
|
if (isMaster)
|
||||||
|
{
|
||||||
|
List<User> users = Config.RoomList.GetPlayerList(roomid);
|
||||||
|
if (users.Count > 0) // 如果此时房间还有人,更新房主
|
||||||
|
{
|
||||||
|
User NewMaster = users[0];
|
||||||
|
Room.RoomMaster = NewMaster;
|
||||||
|
SQLHelper.Execute(RoomQuery.Update_QuitRoom(roomid, Server.User.Id, NewMaster.Id));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
Server.Room = General.HallInstance;
|
||||||
|
Server.UpdateRoomMaster(Room, true);
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // 没人了就解散房间
|
||||||
|
{
|
||||||
|
Config.RoomList.RemoveRoom(roomid);
|
||||||
|
SQLHelper.Execute(RoomQuery.Delete_QuitRoom(roomid, Server.User.Id));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
Server.Room = General.HallInstance;
|
||||||
|
ServerHelper.WriteLine("[ " + Server.GetClientName() + " ] 解散了房间 " + roomid);
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 不是房主直接退出房间
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Server.Room = General.HallInstance;
|
||||||
|
Server.UpdateRoomMaster(Room);
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResultData.Add("result", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 进入房间
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void IntoRoom(Hashtable RequestData, Hashtable ResultData)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
if (RequestData.Count >= 1)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> IntoRoom");
|
||||||
|
string roomid = DataRequest.GetHashtableJsonObject<string>(RequestData, "roomid") ?? "-1";
|
||||||
|
|
||||||
|
if (roomid != "-1")
|
||||||
|
{
|
||||||
|
Config.RoomList.IntoRoom(roomid, Server.User);
|
||||||
|
Server.IntoRoom(roomid);
|
||||||
|
result = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResultData.Add("result", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 发送聊天消息
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
private void Chat(Hashtable RequestData)
|
||||||
|
{
|
||||||
|
if (RequestData.Count >= 1)
|
||||||
|
{
|
||||||
|
string msg = DataRequest.GetHashtableJsonObject<string>(RequestData, "msg") ?? "";
|
||||||
|
if (msg.Trim() != "") Server.Chat(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Reg
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 接收并验证注册验证码
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void Reg(Hashtable RequestData, Hashtable ResultData)
|
||||||
|
{
|
||||||
|
string msg = "";
|
||||||
|
RegInvokeType returnType = RegInvokeType.None;
|
||||||
|
bool success = false;
|
||||||
|
if (RequestData.Count >= 4)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> Reg");
|
||||||
|
string username = DataRequest.GetHashtableJsonObject<string>(RequestData, "username") ?? "";
|
||||||
|
string password = DataRequest.GetHashtableJsonObject<string>(RequestData, "password") ?? "";
|
||||||
|
string email = DataRequest.GetHashtableJsonObject<string>(RequestData, "email") ?? "";
|
||||||
|
string verifycode = DataRequest.GetHashtableJsonObject<string>(RequestData, "verifycode") ?? "";
|
||||||
|
|
||||||
|
// 如果没发验证码,就生成验证码
|
||||||
|
if (verifycode.Trim() == "")
|
||||||
|
{
|
||||||
|
// 先检查账号是否重复
|
||||||
|
SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(username));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(Server.GetClientName() + " 账号已被注册");
|
||||||
|
msg = "此账号名已被使用!";
|
||||||
|
returnType = RegInvokeType.DuplicateUserName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 检查邮箱是否重复
|
||||||
|
SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(email));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(Server.GetClientName() + " 邮箱已被注册");
|
||||||
|
msg = "此邮箱已被注册!";
|
||||||
|
returnType = RegInvokeType.DuplicateEmail;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 检查验证码是否发送过
|
||||||
|
SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(username, email));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
DateTime RegTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime];
|
||||||
|
string RegVerifyCode = (string)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode];
|
||||||
|
if ((DateTime.Now - RegTime).TotalMinutes < 10)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}");
|
||||||
|
}
|
||||||
|
returnType = RegInvokeType.InputVerifyCode;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 发送验证码,需要先删除之前过期的验证码
|
||||||
|
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email));
|
||||||
|
RegVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6);
|
||||||
|
SQLHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(username, email, RegVerify));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
if (MailSender != null)
|
||||||
|
{
|
||||||
|
// 发送验证码
|
||||||
|
string ServerName = Config.ServerName;
|
||||||
|
string Subject = $"[{ServerName}] FunGame 注册验证码";
|
||||||
|
string Body = $"亲爱的 {username}, <br/> 感谢您注册[{ServerName}],您的验证码是 {RegVerify} ,10分钟内有效,请及时输入!<br/><br/>{ServerName}<br/>{DateTimeUtility.GetDateTimeToString(TimeType.DateOnly)}";
|
||||||
|
string[] To = new string[] { email };
|
||||||
|
if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{RegVerify}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(Server.GetClientName() + " 无法发送验证码");
|
||||||
|
ServerHelper.WriteLine(MailSender.ErrorMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // 不使用MailSender的情况
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{RegVerify},请服务器管理员告知此用户");
|
||||||
|
}
|
||||||
|
returnType = RegInvokeType.InputVerifyCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 先检查验证码
|
||||||
|
SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(username, email, verifycode));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
// 检查验证码是否过期
|
||||||
|
DateTime RegTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime];
|
||||||
|
if ((DateTime.Now - RegTime).TotalMinutes >= 10)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期");
|
||||||
|
msg = "此验证码已过期,请重新注册。";
|
||||||
|
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 注册
|
||||||
|
if (RegVerify.Equals(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode]))
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[Reg] UserName: " + username + " Email: " + email);
|
||||||
|
SQLHelper.Execute(UserQuery.Insert_Register(username, password, email, Server.Socket?.ClientIP ?? ""));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
success = true;
|
||||||
|
msg = "注册成功!请牢记您的账号与密码!";
|
||||||
|
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg = "服务器无法处理您的注册,注册失败!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else msg = "验证码不正确,请重新输入!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (SQLHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!";
|
||||||
|
else msg = "服务器无法处理您的注册,注册失败!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResultData.Add("msg", msg);
|
||||||
|
ResultData.Add("type", returnType);
|
||||||
|
ResultData.Add("success", success);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Login
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 登录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void Login(Hashtable RequestData, Hashtable ResultData)
|
||||||
|
{
|
||||||
|
string msg = "";
|
||||||
|
User user = Factory.GetUser();
|
||||||
|
if (RequestData.Count >= 4)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> Login");
|
||||||
|
string username = DataRequest.GetHashtableJsonObject<string>(RequestData, "username") ?? "";
|
||||||
|
string password = DataRequest.GetHashtableJsonObject<string>(RequestData, "password") ?? "";
|
||||||
|
string autokey = DataRequest.GetHashtableJsonObject<string>(RequestData, "autokey") ?? "";
|
||||||
|
Guid key = DataRequest.GetHashtableJsonObject<Guid>(RequestData, "key");
|
||||||
|
|
||||||
|
// CheckLogin的情况
|
||||||
|
if (key != Guid.Empty)
|
||||||
|
{
|
||||||
|
if (Server.IsLoginKey(key))
|
||||||
|
{
|
||||||
|
Server.CheckLogin();
|
||||||
|
user = Server.User;
|
||||||
|
}
|
||||||
|
else ServerHelper.WriteLine("客户端发送了错误的秘钥,不允许本次登录。");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 验证登录
|
||||||
|
if (username != null && password != null)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] UserName: " + username);
|
||||||
|
SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(username, password));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
DataSet DsUser = SQLHelper.DataSet;
|
||||||
|
if (autokey.Trim() != "")
|
||||||
|
{
|
||||||
|
SQLHelper.ExecuteDataSet(UserQuery.Select_CheckAutoKey(username, autokey));
|
||||||
|
if (SQLHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] AutoKey: 已确认");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg = "AutoKey不正确,拒绝自动登录!";
|
||||||
|
ServerHelper.WriteLine("[" + DataRequest.GetTypeString(DataRequestType.Login_Login) + "] " + msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
key = Guid.NewGuid();
|
||||||
|
Server.PreLogin(DsUser, username, key);
|
||||||
|
ResultData.Add("key", key);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg = "用户名或密码不正确。";
|
||||||
|
ServerHelper.WriteLine(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ResultData.Add("msg", msg);
|
||||||
|
ResultData.Add("user", user);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 接收并验证找回密码时的验证码
|
/// 接收并验证找回密码时的验证码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="RequestData"></param>
|
/// <param name="RequestData"></param>
|
||||||
/// <param name="ResultData"></param>
|
/// <param name="ResultData"></param>
|
||||||
public void ForgetPassword(Hashtable RequestData, Hashtable ResultData)
|
private void ForgetPassword(Hashtable RequestData, Hashtable ResultData)
|
||||||
{
|
{
|
||||||
string msg = "无法找回您的密码,请稍后再试。"; // 返回的验证信息
|
string msg = "无法找回您的密码,请稍后再试。"; // 返回的验证信息
|
||||||
if (RequestData.Count >= 2)
|
if (RequestData.Count >= 3)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> ForgetPassword");
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> ForgetPassword");
|
||||||
string username = DataRequest.GetHashtableJsonObject<string>(RequestData, ForgetVerifyCodes.Column_Username) ?? "";
|
string username = DataRequest.GetHashtableJsonObject<string>(RequestData, ForgetVerifyCodes.Column_Username) ?? "";
|
||||||
@ -172,5 +622,27 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
}
|
}
|
||||||
ResultData.Add("msg", msg);
|
ResultData.Add("msg", msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Room
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取房间内玩家数量
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="RequestData"></param>
|
||||||
|
/// <param name="ResultData"></param>
|
||||||
|
private void GetRoomPlayerCount(Hashtable RequestData, Hashtable ResultData)
|
||||||
|
{
|
||||||
|
string roomid = "-1";
|
||||||
|
if (RequestData.Count >= 1)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> GetRoomPlayerCount");
|
||||||
|
roomid = DataRequest.GetHashtableJsonObject<string>(RequestData, "roomid") ?? "-1";
|
||||||
|
}
|
||||||
|
ResultData.Add("count", Config.RoomList.GetPlayerCount(roomid));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,6 @@ using Milimoe.FunGame.Core.Api.Utility;
|
|||||||
using Milimoe.FunGame.Core.Library.Common.Network;
|
using Milimoe.FunGame.Core.Library.Common.Network;
|
||||||
using Milimoe.FunGame.Core.Library.Constant;
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
using Milimoe.FunGame.Core.Library.SQLScript.Common;
|
using Milimoe.FunGame.Core.Library.SQLScript.Common;
|
||||||
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
|
|
||||||
using Milimoe.FunGame.Server.Model;
|
using Milimoe.FunGame.Server.Model;
|
||||||
using Milimoe.FunGame.Server.Others;
|
using Milimoe.FunGame.Server.Others;
|
||||||
using Milimoe.FunGame.Server.Utility;
|
using Milimoe.FunGame.Server.Utility;
|
||||||
@ -18,11 +17,11 @@ StartServer();
|
|||||||
|
|
||||||
while (Running)
|
while (Running)
|
||||||
{
|
{
|
||||||
string? order = "";
|
string order = Console.ReadLine() ?? "";
|
||||||
order = Console.ReadLine();
|
|
||||||
ServerHelper.Type();
|
ServerHelper.Type();
|
||||||
if (order != null && !order.Equals("") && Running)
|
if (order != "" && Running)
|
||||||
{
|
{
|
||||||
|
order = order.ToLower();
|
||||||
switch (order)
|
switch (order)
|
||||||
{
|
{
|
||||||
case OrderDictionary.Quit:
|
case OrderDictionary.Quit:
|
||||||
@ -30,17 +29,16 @@ while (Running)
|
|||||||
case OrderDictionary.Close:
|
case OrderDictionary.Close:
|
||||||
Running = false;
|
Running = false;
|
||||||
break;
|
break;
|
||||||
case OrderDictionary.Help:
|
|
||||||
ServerHelper.WriteLine("Milimoe -> 帮助");
|
|
||||||
break;
|
|
||||||
case OrderDictionary.Restart:
|
case OrderDictionary.Restart:
|
||||||
if (ListeningSocket == null)
|
if (ListeningSocket == null)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine("重启服务器");
|
ServerHelper.WriteLine("重启服务器");
|
||||||
StartServer();
|
StartServer();
|
||||||
}
|
}
|
||||||
else
|
else ServerHelper.WriteLine("服务器正在运行,拒绝重启!");
|
||||||
ServerHelper.WriteLine("服务器正在运行,拒绝重启!");
|
break;
|
||||||
|
default:
|
||||||
|
ConsoleModel.Order(ListeningSocket, order);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,44 +96,33 @@ void StartServer()
|
|||||||
while (Running)
|
while (Running)
|
||||||
{
|
{
|
||||||
ClientSocket socket;
|
ClientSocket socket;
|
||||||
string ClientIPAddress = "";
|
string clientip = "";
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Guid Token = Guid.NewGuid();
|
Guid token = Guid.NewGuid();
|
||||||
socket = ListeningSocket.Accept(Token);
|
socket = ListeningSocket.Accept(token);
|
||||||
ClientIPAddress = socket.ClientIP;
|
clientip = socket.ClientIP;
|
||||||
if (Config.ConnectingPlayersCount + Config.OnlinePlayersCount + 1 > Config.MaxPlayers)
|
Config.ConnectingPlayerCount++;
|
||||||
{
|
// 开始处理客户端连接请求
|
||||||
SendRefuseConnect(socket, "服务器可接受的连接数量已上限!");
|
if (Connect(socket, token, clientip))
|
||||||
ServerHelper.WriteLine("服务器可接受的连接数量已上限!");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
Config.ConnectingPlayersCount++;
|
|
||||||
ServerHelper.WriteLine(ServerHelper.MakeClientName(ClientIPAddress) + " 正在连接服务器 . . .");
|
|
||||||
if (IsIPBanned(ListeningSocket, ClientIPAddress))
|
|
||||||
{
|
|
||||||
SendRefuseConnect(socket, "服务器已拒绝黑名单用户连接。");
|
|
||||||
ServerHelper.WriteLine("检测到 " + ServerHelper.MakeClientName(ClientIPAddress) + " 为黑名单用户,已禁止其连接!");
|
|
||||||
Config.ConnectingPlayersCount--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (Read(socket) && Send(socket, Token))
|
|
||||||
{
|
{
|
||||||
ServerModel ClientModel = new(ListeningSocket, socket, Running);
|
ServerModel ClientModel = new(ListeningSocket, socket, Running);
|
||||||
Task t = Task.Factory.StartNew(() =>
|
Task t = Task.Factory.StartNew(() =>
|
||||||
{
|
{
|
||||||
ClientModel.Start();
|
ClientModel.Start();
|
||||||
});
|
});
|
||||||
ClientModel.SetTaskAndClientName(t, ClientIPAddress);
|
ClientModel.SetTaskAndClientName(t, clientip);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ServerHelper.WriteLine(ServerHelper.MakeClientName(ClientIPAddress) + " 连接失败。");
|
{
|
||||||
Config.ConnectingPlayersCount--;
|
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。");
|
||||||
|
}
|
||||||
|
Config.ConnectingPlayerCount--;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
if (--Config.ConnectingPlayersCount < 0) Config.ConnectingPlayersCount = 0;
|
if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0;
|
||||||
ServerHelper.WriteLine(ServerHelper.MakeClientName(ClientIPAddress) + " 断开连接!");
|
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!");
|
||||||
ServerHelper.Error(e);
|
ServerHelper.Error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -160,58 +147,63 @@ void StartServer()
|
|||||||
ListeningSocket = null;
|
ListeningSocket = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Read(ClientSocket socket)
|
bool Connect(ClientSocket socket, Guid token, string clientip)
|
||||||
{
|
{
|
||||||
// 接收客户端消息
|
// 接收客户端消息
|
||||||
foreach (SocketObject read in socket.ReceiveArray())
|
foreach (SocketObject read in socket.ReceiveArray())
|
||||||
{
|
{
|
||||||
SocketMessageType type = read.SocketType;
|
if (read.SocketType == SocketMessageType.Connect)
|
||||||
if (type == SocketMessageType.RunTime_Connect)
|
|
||||||
{
|
{
|
||||||
if (read.Parameters.Length > 0)
|
if (Config.ConnectingPlayerCount + Config.OnlinePlayerCount > Config.MaxPlayers)
|
||||||
{
|
{
|
||||||
string str = (read.GetParam<string>(0) ?? "").Trim();
|
SendRefuseConnect(socket, "服务器可接受的连接数量已上限!");
|
||||||
if (str != "") ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + ServerHelper.MakeClientName(socket.ClientIP) + " -> " + str);
|
ServerHelper.WriteLine("服务器可接受的连接数量已上限!");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
else ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + ServerHelper.MakeClientName(socket.ClientIP));
|
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 正在连接服务器 . . .");
|
||||||
|
if (IsIPBanned(ListeningSocket, clientip))
|
||||||
|
{
|
||||||
|
SendRefuseConnect(socket, "服务器已拒绝黑名单用户连接。");
|
||||||
|
ServerHelper.WriteLine("检测到 " + ServerHelper.MakeClientName(clientip) + " 为黑名单用户,已禁止其连接!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(read.SocketType) + "] " + ServerHelper.MakeClientName(socket.ClientIP));
|
||||||
|
|
||||||
|
if (socket.Send(SocketMessageType.Connect, true, "", token, Config.ServerName, Config.ServerNotice) == SocketResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("无法传输数据,与客户端的连接可能丢失。");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符,拒绝连接。");
|
ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符,拒绝连接。");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Send(ClientSocket socket, Guid Token)
|
|
||||||
{
|
|
||||||
// 发送消息给客户端
|
|
||||||
string msg = Config.ServerName + ";" + Config.ServerNotice;
|
|
||||||
if (socket.Send(SocketMessageType.RunTime_Connect, msg, Token) == SocketResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ServerHelper.WriteLine("无法传输数据,与客户端的连接可能丢失。");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SendRefuseConnect(ClientSocket socket, string msg)
|
bool SendRefuseConnect(ClientSocket socket, string msg)
|
||||||
{
|
{
|
||||||
// 发送消息给客户端
|
// 发送消息给客户端
|
||||||
msg = $"连接被拒绝,如有疑问请联系服务器管理员:{msg}";
|
msg = "连接被拒绝,如有疑问请联系服务器管理员:" + msg;
|
||||||
if (socket.Send(SocketMessageType.RunTime_Connect, msg) == SocketResult.Success)
|
if (socket.Send(SocketMessageType.Connect, false, msg) == SocketResult.Success)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "已拒绝连接");
|
ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "已拒绝连接");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
ServerHelper.WriteLine("无法传输数据,与客户端的连接可能丢失。");
|
ServerHelper.WriteLine("无法传输数据,与客户端的连接可能丢失。");
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLResult TestSQLConnection()
|
SQLResult TestSQLConnection()
|
||||||
|
|||||||
86
FunGame.Server/Models/ConsoleModel.cs
Normal file
86
FunGame.Server/Models/ConsoleModel.cs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
using Milimoe.FunGame.Core.Interface;
|
||||||
|
using Milimoe.FunGame.Core.Interface.Base;
|
||||||
|
using Milimoe.FunGame.Core.Library.Common.Network;
|
||||||
|
using Milimoe.FunGame.Server.Others;
|
||||||
|
using Milimoe.FunGame.Server.Utility;
|
||||||
|
|
||||||
|
namespace Milimoe.FunGame.Server.Model
|
||||||
|
{
|
||||||
|
public class ConsoleModel
|
||||||
|
{
|
||||||
|
public static void Order(ServerSocket? server, string order)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
switch (order)
|
||||||
|
{
|
||||||
|
case OrderDictionary.Kick:
|
||||||
|
{
|
||||||
|
ServerHelper.Write("输入需要踢出的客户端名称:");
|
||||||
|
string client = Console.ReadLine() ?? "";
|
||||||
|
if (client != "" && server != null)
|
||||||
|
{
|
||||||
|
((ServerModel)server.GetClient(client))?.Kick("您已被服务器管理员踢出此服务器。");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OrderDictionary.Logout:
|
||||||
|
{
|
||||||
|
ServerHelper.Write("输入需要强制下线的玩家ID:");
|
||||||
|
string user = Console.ReadLine() ?? "";
|
||||||
|
if (user != "" && server != null)
|
||||||
|
{
|
||||||
|
((ServerModel)server.GetUser(user))?.ForceLogOut("您已被服务器管理员强制下线。");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case OrderDictionary.ShowList:
|
||||||
|
ShowClients(server);
|
||||||
|
ShowUsers(server);
|
||||||
|
break;
|
||||||
|
case OrderDictionary.ShowClients1:
|
||||||
|
case OrderDictionary.ShowClients2:
|
||||||
|
ShowClients(server);
|
||||||
|
break;
|
||||||
|
case OrderDictionary.ShowUsers1:
|
||||||
|
case OrderDictionary.ShowUsers2:
|
||||||
|
ShowUsers(server);
|
||||||
|
break;
|
||||||
|
case OrderDictionary.Help:
|
||||||
|
ServerHelper.WriteLine("Milimoe -> 帮助");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
ServerHelper.Error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ShowClients(ServerSocket? server)
|
||||||
|
{
|
||||||
|
if (server != null)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("显示在线客户端列表");
|
||||||
|
int index = 1;
|
||||||
|
foreach (IServerModel client in server.ClientList)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(index++ + ". " + client.ClientName + (client.User.Id != 0 ? " (已登录为:" + client.User.Username + ")" : ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void ShowUsers(ServerSocket? server)
|
||||||
|
{
|
||||||
|
if (server != null)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine("显示在线玩家列表");
|
||||||
|
int index = 1;
|
||||||
|
foreach (IServerModel user in server.UserList.Where(u => u.User.Id != 0))
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(index++ + ". " + (user.User.Username) + " (客户端:" + user.ClientName + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -6,7 +6,6 @@ using Milimoe.FunGame.Core.Entity;
|
|||||||
using Milimoe.FunGame.Core.Interface.Base;
|
using Milimoe.FunGame.Core.Interface.Base;
|
||||||
using Milimoe.FunGame.Core.Library.Common.Network;
|
using Milimoe.FunGame.Core.Library.Common.Network;
|
||||||
using Milimoe.FunGame.Core.Library.Constant;
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
using Milimoe.FunGame.Core.Library.SQLScript.Common;
|
|
||||||
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
|
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
|
||||||
using Milimoe.FunGame.Server.Controller;
|
using Milimoe.FunGame.Server.Controller;
|
||||||
using Milimoe.FunGame.Server.Others;
|
using Milimoe.FunGame.Server.Others;
|
||||||
@ -14,7 +13,7 @@ using Milimoe.FunGame.Server.Utility;
|
|||||||
|
|
||||||
namespace Milimoe.FunGame.Server.Model
|
namespace Milimoe.FunGame.Server.Model
|
||||||
{
|
{
|
||||||
public partial class ServerModel : IServerModel
|
public class ServerModel : IServerModel
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Public
|
* Public
|
||||||
@ -24,6 +23,11 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
public Task? Task => _Task;
|
public Task? Task => _Task;
|
||||||
public string ClientName => _ClientName;
|
public string ClientName => _ClientName;
|
||||||
public User User => _User;
|
public User User => _User;
|
||||||
|
public Room Room
|
||||||
|
{
|
||||||
|
get => _Room;
|
||||||
|
set => _Room = value;
|
||||||
|
}
|
||||||
public MySQLHelper SQLHelper { get; }
|
public MySQLHelper SQLHelper { get; }
|
||||||
public MailSender? MailSender { get; }
|
public MailSender? MailSender { get; }
|
||||||
|
|
||||||
@ -33,15 +37,14 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
private ClientSocket? _Socket = null;
|
private ClientSocket? _Socket = null;
|
||||||
private bool _Running = false;
|
private bool _Running = false;
|
||||||
private User _User = General.UnknownUserInstance;
|
private User _User = General.UnknownUserInstance;
|
||||||
|
private Room _Room = General.HallInstance;
|
||||||
private Task? _Task = null;
|
private Task? _Task = null;
|
||||||
private string _ClientName = "";
|
private string _ClientName = "";
|
||||||
|
|
||||||
private Guid CheckLoginKey = Guid.Empty;
|
private Guid CheckLoginKey = Guid.Empty;
|
||||||
private string RegVerify = "";
|
|
||||||
private int FailedTimes = 0; // 超过一定次数断开连接
|
private int FailedTimes = 0; // 超过一定次数断开连接
|
||||||
private string UserName = "";
|
private string UserName = "";
|
||||||
private DataSet DsUser = new();
|
private DataSet DsUser = new();
|
||||||
private string RoomID = "";
|
|
||||||
private readonly Guid Token;
|
private readonly Guid Token;
|
||||||
private readonly ServerSocket Server;
|
private readonly ServerSocket Server;
|
||||||
private readonly DataRequestController DataRequestController;
|
private readonly DataRequestController DataRequestController;
|
||||||
@ -57,8 +60,6 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
SQLHelper = new(this);
|
SQLHelper = new(this);
|
||||||
MailSender = SmtpHelper.GetMailSender();
|
MailSender = SmtpHelper.GetMailSender();
|
||||||
DataRequestController = new(this);
|
DataRequestController = new(this);
|
||||||
Config.OnlinePlayersCount++;
|
|
||||||
GetUsersCount();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Read(ClientSocket socket)
|
public bool Read(ClientSocket socket)
|
||||||
@ -73,7 +74,7 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
string msg = "";
|
string msg = "";
|
||||||
|
|
||||||
// 验证Token
|
// 验证Token
|
||||||
if (type != SocketMessageType.RunTime_HeartBeat && token != Token)
|
if (type != SocketMessageType.HeartBeat && token != Token)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine(GetClientName() + " 使用了非法方式传输消息,服务器拒绝回应 -> [" + ServerSocket.GetTypeString(type) + "] ");
|
ServerHelper.WriteLine(GetClientName() + " 使用了非法方式传输消息,服务器拒绝回应 -> [" + ServerSocket.GetTypeString(type) + "] ");
|
||||||
return false;
|
return false;
|
||||||
@ -84,378 +85,17 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
return DataRequestHandler(socket, SocketObject);
|
return DataRequestHandler(socket, SocketObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果不等于这些Type,就不会输出一行记录。这些Type有特定的输出。
|
if (type == SocketMessageType.HeartBeat)
|
||||||
SocketMessageType[] IgnoreType = new SocketMessageType[] { SocketMessageType.RunTime_HeartBeat, SocketMessageType.RunTime_Login, SocketMessageType.Main_IntoRoom,
|
|
||||||
SocketMessageType.Main_Chat};
|
|
||||||
if (!IgnoreType.Contains(type))
|
|
||||||
{
|
{
|
||||||
if (msg.Trim() == "")
|
return HeartBeat(socket);
|
||||||
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + GetClientName());
|
|
||||||
else
|
|
||||||
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + GetClientName() + " -> " + msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case SocketMessageType.Main_GetNotice:
|
case SocketMessageType.Disconnect:
|
||||||
msg = Config.ServerNotice;
|
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + GetClientName() + " -> Disconnect");
|
||||||
break;
|
|
||||||
|
|
||||||
case SocketMessageType.RunTime_Login:
|
|
||||||
CheckLoginKey = Guid.Empty;
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
string? username = "", password = "", autokey = "";
|
|
||||||
if (args.Length > 0) username = SocketObject.GetParam<string>(0);
|
|
||||||
if (args.Length > 1) password = SocketObject.GetParam<string>(1);
|
|
||||||
if (args.Length > 2) autokey = SocketObject.GetParam<string>(2);
|
|
||||||
if (username != null && password != null)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] UserName: " + username);
|
|
||||||
SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(username, password));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
DsUser = SQLHelper.DataSet;
|
|
||||||
if (autokey != null && autokey.Trim() != "")
|
|
||||||
{
|
|
||||||
SQLHelper.ExecuteDataSet(UserQuery.Select_CheckAutoKey(username, autokey));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] AutoKey: 已确认");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msg = "AutoKey不正确,拒绝自动登录!";
|
|
||||||
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + msg);
|
|
||||||
return Send(socket, type, CheckLoginKey, msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
UserName = username;
|
|
||||||
CheckLoginKey = Guid.NewGuid();
|
|
||||||
return Send(socket, type, CheckLoginKey);
|
|
||||||
}
|
|
||||||
msg = "用户名或密码不正确。";
|
|
||||||
ServerHelper.WriteLine(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Send(socket, type, CheckLoginKey, msg);
|
|
||||||
|
|
||||||
case SocketMessageType.RunTime_CheckLogin:
|
|
||||||
if (args != null && args.Length > 0)
|
|
||||||
{
|
|
||||||
Guid checkloginkey = SocketObject.GetParam<Guid>(0);
|
|
||||||
if (CheckLoginKey.Equals(checkloginkey))
|
|
||||||
{
|
|
||||||
// 创建User对象
|
|
||||||
_User = Factory.GetUser(DsUser);
|
|
||||||
// 检查有没有重复登录的情况
|
|
||||||
KickUser();
|
|
||||||
// 添加至玩家列表
|
|
||||||
AddUser();
|
|
||||||
GetUsersCount();
|
|
||||||
// CheckLogin
|
|
||||||
LoginTime = DateTime.Now.Ticks;
|
|
||||||
SQLHelper.Execute(UserQuery.Update_CheckLogin(UserName, socket.ClientIP.Split(':')[0]));
|
|
||||||
return Send(socket, type, _User);
|
|
||||||
}
|
|
||||||
ServerHelper.WriteLine("客户端发送了错误的秘钥,不允许本次登录。");
|
|
||||||
}
|
|
||||||
return Send(socket, type, CheckLoginKey.ToString());
|
|
||||||
|
|
||||||
case SocketMessageType.RunTime_Logout:
|
|
||||||
Guid checklogoutkey = Guid.Empty;
|
|
||||||
if (args != null && args.Length > 0)
|
|
||||||
{
|
|
||||||
checklogoutkey = SocketObject.GetParam<Guid>(0);
|
|
||||||
if (CheckLoginKey.Equals(checklogoutkey))
|
|
||||||
{
|
|
||||||
// 从玩家列表移除
|
|
||||||
RemoveUser();
|
|
||||||
GetUsersCount();
|
|
||||||
CheckLoginKey = Guid.Empty;
|
|
||||||
msg = "你已成功退出登录! ";
|
|
||||||
return Send(socket, type, checklogoutkey, msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ServerHelper.WriteLine("客户端发送了错误的秘钥,不允许本次登出。");
|
|
||||||
return Send(socket, type, checklogoutkey);
|
|
||||||
|
|
||||||
case SocketMessageType.RunTime_Disconnect:
|
|
||||||
msg = "你已成功断开与服务器的连接: " + Config.ServerName + "。 ";
|
msg = "你已成功断开与服务器的连接: " + Config.ServerName + "。 ";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SocketMessageType.RunTime_HeartBeat:
|
|
||||||
msg = "";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SocketMessageType.Main_IntoRoom:
|
|
||||||
msg = "-1";
|
|
||||||
if (args != null && args.Length > 0) msg = SocketObject.GetParam<string>(0)!;
|
|
||||||
RoomID = msg;
|
|
||||||
Config.RoomList.IntoRoom(RoomID, User);
|
|
||||||
if (RoomID != "-1")
|
|
||||||
{
|
|
||||||
// 昭告天下
|
|
||||||
foreach (ServerModel Client in Server.GetUsersList.Cast<ServerModel>())
|
|
||||||
{
|
|
||||||
if (RoomID == Client.RoomID)
|
|
||||||
{
|
|
||||||
if (Client != null && User.Id != 0)
|
|
||||||
{
|
|
||||||
Client.Send(Client.Socket!, SocketMessageType.Main_Chat, User.Username, DateTimeUtility.GetNowShortTime() + " [ " + User.Username + " ] 进入了房间。");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SocketMessageType.Main_Chat:
|
|
||||||
if (args != null && args.Length > 0) msg = SocketObject.GetParam<string>(0)!;
|
|
||||||
ServerHelper.WriteLine(msg);
|
|
||||||
foreach (ServerModel Client in Server.GetUsersList.Cast<ServerModel>())
|
|
||||||
{
|
|
||||||
if (RoomID == Client.RoomID)
|
|
||||||
{
|
|
||||||
if (Client != null && User.Id != 0)
|
|
||||||
{
|
|
||||||
Client.Send(Client.Socket!, SocketMessageType.Main_Chat, User.Username, DateTimeUtility.GetNowShortTime() + msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case SocketMessageType.RunTime_Reg:
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
string? username = "", email = "";
|
|
||||||
if (args.Length > 0) username = SocketObject.GetParam<string>(0);
|
|
||||||
if (args.Length > 1) email = SocketObject.GetParam<string>(1);
|
|
||||||
if (username != null && email != null)
|
|
||||||
{
|
|
||||||
// 先检查账号是否重复
|
|
||||||
SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(username));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + " 账号已被注册");
|
|
||||||
return Send(socket, type, RegInvokeType.DuplicateUserName);
|
|
||||||
}
|
|
||||||
// 检查邮箱是否重复
|
|
||||||
SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(email));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + " 邮箱已被注册");
|
|
||||||
return Send(socket, type, RegInvokeType.DuplicateEmail);
|
|
||||||
}
|
|
||||||
// 检查验证码是否发送过
|
|
||||||
SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(username, email));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
DateTime RegTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime];
|
|
||||||
string RegVerifyCode = (string)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode];
|
|
||||||
if ((DateTime.Now - RegTime).TotalMinutes < 10)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}");
|
|
||||||
}
|
|
||||||
return Send(socket, type, RegInvokeType.InputVerifyCode);
|
|
||||||
}
|
|
||||||
// 发送验证码,需要先删除之前过期的验证码
|
|
||||||
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email));
|
|
||||||
RegVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6);
|
|
||||||
SQLHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(username, email, RegVerify));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
if (MailSender != null)
|
|
||||||
{
|
|
||||||
// 发送验证码
|
|
||||||
string ServerName = Config.ServerName;
|
|
||||||
string Subject = $"[{ServerName}] FunGame 注册验证码";
|
|
||||||
string Body = $"亲爱的 {username}, <br/> 感谢您注册[{ServerName}],您的验证码是 {RegVerify} ,10分钟内有效,请及时输入!<br/><br/>{ServerName}<br/>{DateTimeUtility.GetDateTimeToString(TimeType.DateOnly)}";
|
|
||||||
string[] To = new string[] { email };
|
|
||||||
if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + $" 已向{email}发送验证码:{RegVerify}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + " 无法发送验证码");
|
|
||||||
ServerHelper.WriteLine(MailSender.ErrorMsg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // 不使用MailSender的情况
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + $" 验证码为:{RegVerify},请服务器管理员告知此用户");
|
|
||||||
}
|
|
||||||
return Send(socket, type, RegInvokeType.InputVerifyCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case SocketMessageType.RunTime_CheckReg:
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
string? username = "", password = "", email = "", verifycode = "";
|
|
||||||
if (args.Length > 0) username = SocketObject.GetParam<string>(0);
|
|
||||||
if (args.Length > 1) password = SocketObject.GetParam<string>(1);
|
|
||||||
if (args.Length > 2) email = SocketObject.GetParam<string>(2);
|
|
||||||
if (args.Length > 3) verifycode = SocketObject.GetParam<string>(3);
|
|
||||||
if (username != null && password != null && email != null && verifycode != null)
|
|
||||||
{
|
|
||||||
// 先检查验证码
|
|
||||||
SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(username, email, verifycode));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
// 检查验证码是否过期
|
|
||||||
DateTime RegTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime];
|
|
||||||
if ((DateTime.Now - RegTime).TotalMinutes >= 10)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + " 验证码已过期");
|
|
||||||
msg = "此验证码已过期,请重新注册。";
|
|
||||||
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email));
|
|
||||||
return Send(socket, type, false, msg);
|
|
||||||
}
|
|
||||||
// 注册
|
|
||||||
if (RegVerify.Equals(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode]))
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] UserName: " + username + " Email: " + email);
|
|
||||||
SQLHelper.NewTransaction();
|
|
||||||
SQLHelper.Execute(UserQuery.Insert_Register(username, password, email, socket.ClientIP));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
msg = "注册成功!请牢记您的账号与密码!";
|
|
||||||
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(username, email));
|
|
||||||
SQLHelper.Commit();
|
|
||||||
return Send(socket, type, true, msg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
msg = "服务器无法处理您的注册,注册失败!";
|
|
||||||
SQLHelper.Rollback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else msg = "验证码不正确,请重新输入!";
|
|
||||||
}
|
|
||||||
else if (SQLHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!";
|
|
||||||
else msg = "服务器无法处理您的注册,注册失败!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else msg = "注册失败!";
|
|
||||||
return Send(socket, type, false, msg);
|
|
||||||
|
|
||||||
case SocketMessageType.Main_UpdateRoom:
|
|
||||||
Config.RoomList ??= new();
|
|
||||||
Config.RoomList.Clear();
|
|
||||||
DataSet DsRoomTemp = new(), DsUserTemp = new();
|
|
||||||
DsRoomTemp = SQLHelper.ExecuteDataSet(RoomQuery.Select_Rooms);
|
|
||||||
DsUserTemp = SQLHelper.ExecuteDataSet(UserQuery.Select_Users);
|
|
||||||
List<Room> rooms = Factory.GetRooms(DsRoomTemp, DsUserTemp);
|
|
||||||
Config.RoomList.AddRooms(rooms); // 更新服务器中的房间列表
|
|
||||||
return Send(socket, type, rooms); // 传RoomList
|
|
||||||
|
|
||||||
case SocketMessageType.Main_CreateRoom:
|
|
||||||
msg = "-1";
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
string? roomtype_string = "";
|
|
||||||
long userid = 0;
|
|
||||||
string? password = "";
|
|
||||||
if (args.Length > 0) roomtype_string = SocketObject.GetParam<string>(0);
|
|
||||||
if (args.Length > 1) userid = SocketObject.GetParam<long>(1);
|
|
||||||
if (args.Length > 2) password = SocketObject.GetParam<string>(2);
|
|
||||||
if (!string.IsNullOrWhiteSpace(roomtype_string) && userid != 0)
|
|
||||||
{
|
|
||||||
RoomType roomtype = roomtype_string switch
|
|
||||||
{
|
|
||||||
GameMode.GameMode_Mix => RoomType.Mix,
|
|
||||||
GameMode.GameMode_Team => RoomType.Team,
|
|
||||||
GameMode.GameMode_MixHasPass => RoomType.MixHasPass,
|
|
||||||
GameMode.GameMode_TeamHasPass => RoomType.TeamHasPass,
|
|
||||||
_ => RoomType.All
|
|
||||||
};
|
|
||||||
string roomid = Verification.CreateVerifyCode(VerifyCodeType.MixVerifyCode, 7).ToUpper();
|
|
||||||
SQLHelper.Execute(RoomQuery.Insert_CreateRoom(roomid, userid, roomtype, password ?? ""));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
msg = roomid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SocketMessageType.Main_QuitRoom:
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
string? roomid = "";
|
|
||||||
bool isMaster = false;
|
|
||||||
if (args.Length > 0) roomid = SocketObject.GetParam<string>(0);
|
|
||||||
if (args.Length > 1) isMaster = SocketObject.GetParam<bool>(1);
|
|
||||||
if (roomid != null && roomid.Trim() != "")
|
|
||||||
{
|
|
||||||
Config.RoomList.QuitRoom(roomid, User);
|
|
||||||
Room Room = Config.RoomList[roomid] ?? General.HallInstance;
|
|
||||||
User UpdateRoomMaster = General.UnknownUserInstance;
|
|
||||||
DataSet DsUser = new(), DsRoom = new();
|
|
||||||
// 是否是房主
|
|
||||||
if (isMaster)
|
|
||||||
{
|
|
||||||
List<User> users = GetRoomPlayerList(roomid);
|
|
||||||
if (users.Count > 0) // 如果此时房间还有人,更新房主
|
|
||||||
{
|
|
||||||
UpdateRoomMaster = users[0];
|
|
||||||
Room.RoomMaster = UpdateRoomMaster;
|
|
||||||
SQLHelper.Execute(RoomQuery.Update_QuitRoom(roomid, User.Id, UpdateRoomMaster.Id));
|
|
||||||
DsUser = SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(UpdateRoomMaster.Username));
|
|
||||||
DsRoom = SQLHelper.ExecuteDataSet(RoomQuery.Select_IsExistRoom(roomid));
|
|
||||||
}
|
|
||||||
else // 没人了就解散房间
|
|
||||||
{
|
|
||||||
Config.RoomList.RemoveRoom(roomid);
|
|
||||||
SQLHelper.Execute(RoomQuery.Delete_QuitRoom(roomid, User.Id));
|
|
||||||
if (SQLHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(GetClientName() + " 解散了房间 " + roomid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 昭告天下
|
|
||||||
foreach (ServerModel Client in Server.GetUsersList.Cast<ServerModel>())
|
|
||||||
{
|
|
||||||
if (roomid == Client.RoomID)
|
|
||||||
{
|
|
||||||
if (Client != null && User.Id != 0)
|
|
||||||
{
|
|
||||||
Client.Send(Client.Socket!, SocketMessageType.Main_Chat, User.Username, DateTimeUtility.GetNowShortTime() + " [ " + User.Username + " ] 离开了房间。");
|
|
||||||
if (UpdateRoomMaster.Id != 0 && Room.Roomid != "-1")
|
|
||||||
{
|
|
||||||
Client.Send(Client.Socket!, SocketMessageType.Room_UpdateRoomMaster, User, Room);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RoomID = "-1";
|
|
||||||
return Send(socket, type, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Send(socket, type, false);
|
|
||||||
|
|
||||||
case SocketMessageType.Main_MatchRoom:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SocketMessageType.Room_ChangeRoomSetting:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SocketMessageType.Room_GetRoomPlayerCount:
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
string? roomid = "-1";
|
|
||||||
if (args.Length > 0) roomid = SocketObject.GetParam<string>(0);
|
|
||||||
if (roomid != null && roomid != "-1")
|
|
||||||
{
|
|
||||||
int count = GetRoomPlayerCount(roomid);
|
|
||||||
return Send(socket, type, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Send(socket, type, 0);
|
|
||||||
}
|
}
|
||||||
return Send(socket, type, msg);
|
return Send(socket, type, msg);
|
||||||
}
|
}
|
||||||
@ -503,14 +143,14 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case SocketMessageType.RunTime_Logout:
|
case SocketMessageType.ForceLogout:
|
||||||
RemoveUser();
|
RemoveUser();
|
||||||
break;
|
break;
|
||||||
case SocketMessageType.RunTime_Disconnect:
|
case SocketMessageType.Disconnect:
|
||||||
RemoveUser();
|
RemoveUser();
|
||||||
Close();
|
Close();
|
||||||
break;
|
break;
|
||||||
case SocketMessageType.Main_Chat:
|
case SocketMessageType.Chat:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
object obj = objs[0];
|
object obj = objs[0];
|
||||||
@ -538,6 +178,10 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
{
|
{
|
||||||
_Task = t;
|
_Task = t;
|
||||||
_ClientName = ClientName;
|
_ClientName = ClientName;
|
||||||
|
// 添加客户端到列表中
|
||||||
|
Server.AddClient(_ClientName, this);
|
||||||
|
Config.OnlinePlayerCount++;
|
||||||
|
GetUsersCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetClientName()
|
public string GetClientName()
|
||||||
@ -545,6 +189,108 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
return ServerHelper.MakeClientName(ClientName, User);
|
return ServerHelper.MakeClientName(ClientName, User);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void PreLogin(DataSet dsuser, string username, Guid checkloginkey)
|
||||||
|
{
|
||||||
|
DsUser = dsuser;
|
||||||
|
UserName = username;
|
||||||
|
CheckLoginKey = checkloginkey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckLogin()
|
||||||
|
{
|
||||||
|
// 创建User对象
|
||||||
|
_User = Factory.GetUser(DsUser);
|
||||||
|
// 检查有没有重复登录的情况
|
||||||
|
KickUser();
|
||||||
|
// 添加至玩家列表
|
||||||
|
AddUser();
|
||||||
|
GetUsersCount();
|
||||||
|
// CheckLogin
|
||||||
|
LoginTime = DateTime.Now.Ticks;
|
||||||
|
SQLHelper.Execute(UserQuery.Update_CheckLogin(UserName, _Socket?.ClientIP.Split(':')[0] ?? "127.0.0.1"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsLoginKey(Guid key)
|
||||||
|
{
|
||||||
|
return key == CheckLoginKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogOut()
|
||||||
|
{
|
||||||
|
// 从玩家列表移除
|
||||||
|
RemoveUser();
|
||||||
|
GetUsersCount();
|
||||||
|
CheckLoginKey = Guid.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ForceLogOut(string msg, string username = "")
|
||||||
|
{
|
||||||
|
ServerModel serverTask = (ServerModel)Server.GetUser(username == "" ? UserName : username);
|
||||||
|
if (serverTask.Socket != null)
|
||||||
|
{
|
||||||
|
serverTask.Send(serverTask.Socket, SocketMessageType.ForceLogout, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Kick(string msg, string clientname = "")
|
||||||
|
{
|
||||||
|
// 将客户端踢出服务器
|
||||||
|
RemoveUser();
|
||||||
|
ServerModel serverTask = (ServerModel)Server.GetClient(clientname == "" ? ClientName : clientname);
|
||||||
|
if (serverTask.Socket != null)
|
||||||
|
{
|
||||||
|
serverTask.Send(serverTask.Socket, SocketMessageType.Disconnect, msg);
|
||||||
|
}
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Chat(string msg)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(msg);
|
||||||
|
foreach (ServerModel Client in Server.ClientList.Cast<ServerModel>())
|
||||||
|
{
|
||||||
|
if (Room.Roomid == Client.Room.Roomid)
|
||||||
|
{
|
||||||
|
if (Client != null && User.Id != 0)
|
||||||
|
{
|
||||||
|
Client.Send(Client.Socket!, SocketMessageType.Chat, User.Username, DateTimeUtility.GetNowShortTime() + msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void IntoRoom(string roomid)
|
||||||
|
{
|
||||||
|
Room = Config.RoomList[roomid];
|
||||||
|
foreach (ServerModel Client in Server.ClientList.Cast<ServerModel>().Where(c => c != null && c.Socket != null && roomid == c.Room.Roomid))
|
||||||
|
{
|
||||||
|
if (User.Id != 0)
|
||||||
|
{
|
||||||
|
Client.Send(Client.Socket!, SocketMessageType.Chat, User.Username, DateTimeUtility.GetNowShortTime() + " [ " + User.Username + " ] 进入了房间。");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateRoomMaster(Room Room, bool bolIsUpdateRoomMaster = false)
|
||||||
|
{
|
||||||
|
foreach (ServerModel Client in Server.ClientList.Cast<ServerModel>().Where(c => c != null && c.Socket != null && Room.Roomid == c.Room.Roomid))
|
||||||
|
{
|
||||||
|
if (User.Id != 0)
|
||||||
|
{
|
||||||
|
Client.Send(Client.Socket!, SocketMessageType.Chat, User.Username, DateTimeUtility.GetNowShortTime() + " [ " + User.Username + " ] 离开了房间。");
|
||||||
|
if (bolIsUpdateRoomMaster && Room.RoomMaster?.Id != 0 && Room.Roomid != "-1")
|
||||||
|
{
|
||||||
|
Client.Send(Client.Socket!, SocketMessageType.UpdateRoomMaster, Room);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HeartBeat(ClientSocket socket)
|
||||||
|
{
|
||||||
|
return Send(socket, SocketMessageType.HeartBeat, "");
|
||||||
|
}
|
||||||
|
|
||||||
private void KickUser()
|
private void KickUser()
|
||||||
{
|
{
|
||||||
if (User.Id != 0)
|
if (User.Id != 0)
|
||||||
@ -553,8 +299,7 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
if (Server.ContainsUser(user))
|
if (Server.ContainsUser(user))
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + user + " 重复登录!");
|
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + user + " 重复登录!");
|
||||||
ServerModel serverTask = (ServerModel)Server.GetUser(user);
|
ForceLogOut("您的账号在别处登录,已强制下线。");
|
||||||
serverTask?.Send(serverTask.Socket!, SocketMessageType.RunTime_ForceLogout, serverTask.CheckLoginKey, "您的账号在别处登录,已强制下线。");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -595,7 +340,7 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
|
|
||||||
private void GetUsersCount()
|
private void GetUsersCount()
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine($"目前在线客户端数量: {Config.OnlinePlayersCount}(已登录的玩家数量:{Server.UsersCount})");
|
ServerHelper.WriteLine($"目前在线客户端数量: {Server.ClientCount}(已登录的玩家数量:{Server.UserCount})");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateStreamReader()
|
private void CreateStreamReader()
|
||||||
@ -652,7 +397,8 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
Socket?.Close();
|
Socket?.Close();
|
||||||
_Socket = null;
|
_Socket = null;
|
||||||
_Running = false;
|
_Running = false;
|
||||||
Config.OnlinePlayersCount--;
|
Server.RemoveClient(ClientName);
|
||||||
|
Config.OnlinePlayerCount--;
|
||||||
GetUsersCount();
|
GetUsersCount();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
@ -660,15 +406,5 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
ServerHelper.Error(e);
|
ServerHelper.Error(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int GetRoomPlayerCount(string roomid)
|
|
||||||
{
|
|
||||||
return Config.RoomList.GetPlayerCount(roomid);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<User> GetRoomPlayerList(string roomid)
|
|
||||||
{
|
|
||||||
return Config.RoomList.GetPlayerList(roomid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
namespace Milimoe.FunGame.Server.Model
|
|
||||||
{
|
|
||||||
public partial class ServerModel
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -17,8 +17,8 @@ namespace Milimoe.FunGame.Server.Others
|
|||||||
public static string ServerBannedList { get; set; } = ""; // 禁止连接的黑名单
|
public static string ServerBannedList { get; set; } = ""; // 禁止连接的黑名单
|
||||||
public static int MaxPlayers { get; set; } = 20; // 最多接受连接的玩家数量
|
public static int MaxPlayers { get; set; } = 20; // 最多接受连接的玩家数量
|
||||||
public static int MaxConnectionFaileds { get; set; } = 5; // 最大连接失败次数
|
public static int MaxConnectionFaileds { get; set; } = 5; // 最大连接失败次数
|
||||||
public static int OnlinePlayersCount { get; set; } = 0; // 已连接的玩家数量
|
public static int OnlinePlayerCount { get; set; } = 0; // 已连接的玩家数量
|
||||||
public static int ConnectingPlayersCount { get; set; } = 0; // 正在连接的玩家数量
|
public static int ConnectingPlayerCount { get; set; } = 0; // 正在连接的玩家数量
|
||||||
public static Encoding DefaultEncoding { get; } = General.DefaultEncoding; // 默认传输字符集
|
public static Encoding DefaultEncoding { get; } = General.DefaultEncoding; // 默认传输字符集
|
||||||
public static FunGameInfo.FunGame FunGameType { get; } = FunGameInfo.FunGame.FunGame_Server;
|
public static FunGameInfo.FunGame FunGameType { get; } = FunGameInfo.FunGame.FunGame_Server;
|
||||||
public static Hashtable OrderList { get; } = new();
|
public static Hashtable OrderList { get; } = new();
|
||||||
|
|||||||
@ -12,5 +12,11 @@
|
|||||||
public const string RemoveBanned1 = "ban -remove";
|
public const string RemoveBanned1 = "ban -remove";
|
||||||
public const string RemoveBanned2 = "ban -r";
|
public const string RemoveBanned2 = "ban -r";
|
||||||
public const string Kick = "kick";
|
public const string Kick = "kick";
|
||||||
|
public const string Logout = "logout";
|
||||||
|
public const string ShowList = "showlist";
|
||||||
|
public const string ShowClients1 = "showclients";
|
||||||
|
public const string ShowClients2 = "clients";
|
||||||
|
public const string ShowUsers1 = "showusers";
|
||||||
|
public const string ShowUsers2 = "users";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,9 +19,14 @@ namespace Milimoe.FunGame.Server.Utility
|
|||||||
Console.Write("\r" + GetPrefix() + e.Message + "\n" + e.StackTrace + "\n\r> ");
|
Console.Write("\r" + GetPrefix() + e.Message + "\n" + e.StackTrace + "\n\r> ");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void WriteLine(string? msg)
|
public static void Write(string msg)
|
||||||
{
|
{
|
||||||
Console.Write("\r" + GetPrefix() + msg + "\n\r> ");
|
if (msg.Trim() != "") Console.Write("\r" + GetPrefix() + msg + "> ");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteLine(string msg)
|
||||||
|
{
|
||||||
|
if (msg.Trim() != "") Console.Write("\r" + GetPrefix() + msg + "\n\r> ");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Type()
|
public static void Type()
|
||||||
@ -100,7 +105,7 @@ namespace Milimoe.FunGame.Server.Utility
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine(e.StackTrace);
|
ServerHelper.WriteLine(e.StackTrace ?? "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,7 +20,6 @@ namespace Milimoe.FunGame.Server.Utility
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
PrepareCommand(Helper, cmd);
|
PrepareCommand(Helper, cmd);
|
||||||
Helper.NewTransaction();
|
|
||||||
|
|
||||||
updaterow = cmd.ExecuteNonQuery();
|
updaterow = cmd.ExecuteNonQuery();
|
||||||
if (updaterow > 0)
|
if (updaterow > 0)
|
||||||
@ -91,7 +90,6 @@ namespace Milimoe.FunGame.Server.Utility
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
PrepareCommand(Helper, cmd);
|
PrepareCommand(Helper, cmd);
|
||||||
Helper.NewTransaction();
|
|
||||||
|
|
||||||
updaterow = cmd.ExecuteNonQuery();
|
updaterow = cmd.ExecuteNonQuery();
|
||||||
if (updaterow > 0)
|
if (updaterow > 0)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user