重复登录检查增强;更新 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() ?? ""; string client = Console.ReadLine() ?? "";
if (client != "" && server != null) if (client != "" && server != null)
{ {
await Kick((ServerModel<T>)server.ClientList[client]); await Kick(server.ClientList[client]);
} }
break; break;
} }
@ -35,7 +35,7 @@ namespace Milimoe.FunGame.Server.Model
string user = Console.ReadLine() ?? ""; string user = Console.ReadLine() ?? "";
if (user != "" && server != null) if (user != "" && server != null)
{ {
await ForceLogOut((ServerModel<T>)server.UserList[user]); await ForceLogOut(server.UserList[user]);
} }
break; 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("您已被服务器管理员踢出此服务器。"); 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("您已被服务器管理员强制下线。"); await clientModel.ForceLogOut("您已被服务器管理员强制下线。");
} }

View File

@ -456,15 +456,24 @@ namespace Milimoe.FunGame.Server.Model
await Send(SocketMessageType.ForceLogout, msg); await Send(SocketMessageType.ForceLogout, msg);
} }
public async Task ForceLogOutDuplicateLogonUser() public async Task ForceLogOutDuplicateLogonUser(bool checkGlobal = true)
{ {
if (User.Id != 0) if (User.Id != 0)
{ {
string user = User.Username; 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 + " 重复登录!"); 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) if (User.Id != 0 && this != null)
{ {
Listener.UserList.Add(User.Username, this); Listener.UserList.Add(User.Username, this);
FunGameSystem.UserList.Add(User.Username, this);
_username = User.Username; _username = User.Username;
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已添加"); ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已添加");
// 更新最后登录时间、IP地址 // 更新最后登录时间、IP地址
@ -522,6 +532,7 @@ namespace Milimoe.FunGame.Server.Model
else ServerHelper.WriteLine("OnlinePlayers: 无法更新玩家 " + User.Username + " 的游戏时长"); else ServerHelper.WriteLine("OnlinePlayers: 无法更新玩家 " + User.Username + " 的游戏时长");
if (Listener.UserList.Remove(User.Username)) if (Listener.UserList.Remove(User.Username))
{ {
FunGameSystem.UserList.Remove(User.Username);
ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已移除"); ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Username + " 已移除");
User = General.UnknownUserInstance; User = General.UnknownUserInstance;
return true; return true;

View File

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

View File

@ -1,5 +1,6 @@
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.Interface.Base;
using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Common.Addon;
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;
@ -26,6 +27,11 @@ namespace Milimoe.FunGame.Server.Services
/// </summary> /// </summary>
public static RoomList RoomList { get; } = new(); public static RoomList RoomList { get; } = new();
/// <summary>
/// 在线用户列表(如果需要统一管理用户在线的话用这个)
/// </summary>
public static ConcurrentModelList<IServerModel> UserList { get; } = [];
/// <summary> /// <summary>
/// Server实际安装的模组 /// Server实际安装的模组
/// </summary> /// </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/),此文档不保证及时更新。