diff --git a/FunGame.Server/Models/ConsoleModel.cs b/FunGame.Server/Models/ConsoleModel.cs index ab19d95..1adeb35 100644 --- a/FunGame.Server/Models/ConsoleModel.cs +++ b/FunGame.Server/Models/ConsoleModel.cs @@ -25,7 +25,7 @@ namespace Milimoe.FunGame.Server.Model string client = Console.ReadLine() ?? ""; if (client != "" && server != null) { - await Kick((ServerModel)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)server.UserList[user]); + await ForceLogOut(server.UserList[user]); } break; } @@ -76,12 +76,12 @@ namespace Milimoe.FunGame.Server.Model } } - public static async Task Kick(ServerModel clientModel) where T : ISocketMessageProcessor + public static async Task Kick(IServerModel clientModel) { await clientModel.Kick("您已被服务器管理员踢出此服务器。"); } - public static async Task ForceLogOut(ServerModel clientModel) where T : ISocketMessageProcessor + public static async Task ForceLogOut(IServerModel clientModel) { await clientModel.ForceLogOut("您已被服务器管理员强制下线。"); } diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index 8237150..47e0085 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -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)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; diff --git a/FunGame.Server/Services/DataRequestService.cs b/FunGame.Server/Services/DataRequestService.cs index 2c9d2ad..dbc597c 100644 --- a/FunGame.Server/Services/DataRequestService.cs +++ b/FunGame.Server/Services/DataRequestService.cs @@ -272,6 +272,12 @@ namespace Milimoe.FunGame.Server.Services } } + if (success) + { + // 检查重复登录 + + } + return (success, dsUser, msg, key); } diff --git a/FunGame.Server/Services/FunGameSystem.cs b/FunGame.Server/Services/FunGameSystem.cs index fccbd46..00f704c 100644 --- a/FunGame.Server/Services/FunGameSystem.cs +++ b/FunGame.Server/Services/FunGameSystem.cs @@ -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 /// public static RoomList RoomList { get; } = new(); + /// + /// 在线用户列表(如果需要统一管理用户在线的话用这个) + /// + public static ConcurrentModelList UserList { get; } = []; + /// /// Server实际安装的模组 /// diff --git a/README.md b/README.md index f85d96f..52ca0d1 100644 --- a/README.md +++ b/README.md @@ -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/),此文档不保证及时更新。