重复登录检查增强;更新 readme

This commit is contained in:
milimoe 2025-04-26 18:36:43 +08:00
parent ceffccb2d2
commit 5f80e5934b
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
5 changed files with 69 additions and 9 deletions

View File

@ -25,7 +25,7 @@ namespace Milimoe.FunGame.Server.Model
string client = Console.ReadLine() ?? "";
if (client != "" && server != null)
{
await Kick((ServerModel<T>)server.ClientList[client]);
await Kick(server.ClientList[client]);
}
break;
}
@ -35,7 +35,7 @@ namespace Milimoe.FunGame.Server.Model
string user = Console.ReadLine() ?? "";
if (user != "" && server != null)
{
await ForceLogOut((ServerModel<T>)server.UserList[user]);
await ForceLogOut(server.UserList[user]);
}
break;
}
@ -76,12 +76,12 @@ namespace Milimoe.FunGame.Server.Model
}
}
public static async Task Kick<T>(ServerModel<T> clientModel) where T : ISocketMessageProcessor
public static async Task Kick(IServerModel clientModel)
{
await clientModel.Kick("您已被服务器管理员踢出此服务器。");
}
public static async Task ForceLogOut<T>(ServerModel<T> clientModel) where T : ISocketMessageProcessor
public static async Task ForceLogOut(IServerModel clientModel)
{
await clientModel.ForceLogOut("您已被服务器管理员强制下线。");
}

View File

@ -456,15 +456,24 @@ namespace Milimoe.FunGame.Server.Model
await Send(SocketMessageType.ForceLogout, msg);
}
public async Task ForceLogOutDuplicateLogonUser()
public async Task ForceLogOutDuplicateLogonUser(bool checkGlobal = true)
{
if (User.Id != 0)
{
string user = User.Username;
if (Listener.UserList.ContainsKey(user))
if (Listener.UserList.ContainsKey(user) || (checkGlobal && FunGameSystem.UserList.ContainsKey(user)))
{
IServerModel model;
try
{
model = Listener.UserList[user];
}
catch
{
model = FunGameSystem.UserList[user];
}
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + user + " 重复登录!");
await ((ServerModel<T>)Listener.UserList[user]).ForceLogOut("您的账号在别处登录,已强制下线。");
await model.ForceLogOut("您的账号在别处登录,已强制下线。");
}
}
}
@ -496,6 +505,7 @@ namespace Milimoe.FunGame.Server.Model
if (User.Id != 0 && this != null)
{
Listener.UserList.Add(User.Username, this);
FunGameSystem.UserList.Add(User.Username, this);
_username = User.Username;
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已添加");
// 更新最后登录时间、IP地址
@ -522,6 +532,7 @@ namespace Milimoe.FunGame.Server.Model
else ServerHelper.WriteLine("OnlinePlayers: 无法更新玩家 " + User.Username + " 的游戏时长");
if (Listener.UserList.Remove(User.Username))
{
FunGameSystem.UserList.Remove(User.Username);
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已移除");
User = General.UnknownUserInstance;
return true;

View File

@ -272,6 +272,12 @@ namespace Milimoe.FunGame.Server.Services
}
}
if (success)
{
// 检查重复登录
}
return (success, dsUser, msg, key);
}

View File

@ -1,5 +1,6 @@
using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Interface.Base;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.SQLScript.Common;
@ -26,6 +27,11 @@ namespace Milimoe.FunGame.Server.Services
/// </summary>
public static RoomList RoomList { get; } = new();
/// <summary>
/// 在线用户列表(如果需要统一管理用户在线的话用这个)
/// </summary>
public static ConcurrentModelList<IServerModel> UserList { get; } = [];
/// <summary>
/// Server实际安装的模组
/// </summary>

View File

@ -1,3 +1,40 @@
# FunGame-Server
# 项目简介
基于.NET 8的FunGame服务器端程序
FunGameServer 是 [FunGame](https://github.com/project-redbud/FunGame-Core) 的服务器端实现,基于 ASP.NET Core Web API轻量、高性能、跨平台。
它支持多种服务模式,使得服务器端的扩展和集成更加灵活:
- Socket 服务:支持传统的 TCP 通信。
- WebSocket 服务:支持基于 Web 的实时通信。
- WebAPI 服务:提供标准的 RESTful API 接口。
# 使用
本项目将构建两个服务器端程序:`FunGameServer``FunGameWebAPI`
FunGameServer 提供 Socket 和 WebSocket 的通信服务,但只允许开启其中一种,不能同时开启。
FunGameWebAPI 提供 WebSocket 和 RESTful API 共存的服务,共享数据处理。
# 插件和模组集成
实现 FunGame 的 `GameModuleServer` 和使用基于 ASP.NET Core Web API 的 `Controller` 可以轻松扩展服务器功能。
## Modules 和 GameModuleServer
具体的实现可以参考示例代码:[示例代码](https://github.com/project-redbud/FunGame-Core/tree/master/Library/Common/Addon/Example)
此类 DLL 需要放在服务器编译目录的 `Modules` 文件夹下,需要连同依赖的 DLL 一起复制。
## Web API Controller
集成 ASP.NET Core Controller 的方式:
- 新建一个 ASP.NET Core 类库项目,新建一个类,继承并实现 `WebAPIPlugin`
- 新建一个 ASP.NET Core Controller 类;
- 编译项目为 DLL 后,放入服务器编译目录的 `Plugins` 文件夹下,需要连同依赖的 DLL 一起复制;
- 启动 `FunGameWebAPI.exe``FunGameServer.exe` 没有这个功能。
# 文档
需要更多帮助请查看 [FunGame 开发文档](https://project-redbud.github.io/),此文档不保证及时更新。