FunGame-Server/FunGame.Server/Controllers/DataRequestController.cs
milimoe 7a6b40800d
修改架构 (#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
2023-09-14 22:15:18 +08:00

649 lines
31 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Data;
using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.SQLScript.Common;
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
using Milimoe.FunGame.Server.Model;
using Milimoe.FunGame.Server.Others;
using Milimoe.FunGame.Server.Utility;
namespace Milimoe.FunGame.Server.Controller
{
public class DataRequestController
{
public ServerModel Server { get; }
public MySQLHelper SQLHelper => Server.SQLHelper;
public MailSender? MailSender => Server.MailSender;
public DataRequestType LastRequest => _LastRequest;
private string ForgetVerify = "";
private string RegVerify = "";
private DataRequestType _LastRequest = DataRequestType.UnKnown;
public DataRequestController(ServerModel server)
{
Server = server;
}
public Hashtable GetResultData(DataRequestType type, Hashtable data)
{
Hashtable result = new();
_LastRequest = type;
switch (type)
{
case DataRequestType.UnKnown:
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:
ForgetPassword(data, result);
break;
case DataRequestType.Login_UpdatePassword:
UpdatePassword(data, result);
break;
case DataRequestType.Room_GetRoomSettings:
break;
case DataRequestType.Room_GetRoomPlayerCount:
GetRoomPlayerCount(data, result);
break;
case DataRequestType.Room_UpdateRoomMaster:
break;
default:
break;
}
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>
/// <param name="RequestData"></param>
/// <param name="ResultData"></param>
private void ForgetPassword(Hashtable RequestData, Hashtable ResultData)
{
string msg = "无法找回您的密码,请稍后再试。"; // 返回的验证信息
if (RequestData.Count >= 3)
{
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> ForgetPassword");
string username = DataRequest.GetHashtableJsonObject<string>(RequestData, ForgetVerifyCodes.Column_Username) ?? "";
string email = DataRequest.GetHashtableJsonObject<string>(RequestData, ForgetVerifyCodes.Column_Email) ?? "";
string verifycode = DataRequest.GetHashtableJsonObject<string>(RequestData, ForgetVerifyCodes.Column_ForgetVerifyCode) ?? "";
// 客户端发来了验证码就进行验证,没有发就生成
if (verifycode.Trim() != "")
{
// 先检查验证码
SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_ForgetVerifyCode(username, email, verifycode));
if (SQLHelper.Result == SQLResult.Success)
{
// 检查验证码是否过期
DateTime SendTime = (DateTime)SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime];
if ((DateTime.Now - SendTime).TotalMinutes >= 10)
{
ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期");
msg = "此验证码已过期,请重新找回密码。";
SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(username, email));
}
else
{
// 检查验证码是否正确
if (ForgetVerify.Equals(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_ForgetVerifyCode]))
{
ServerHelper.WriteLine("[ForgerPassword] UserName: " + username + " Email: " + email);
SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(username, email));
msg = "";
}
else msg = "验证码不正确,请重新输入!";
}
}
else msg = "验证码不正确,请重新输入!";
}
else
{
// 检查账号和邮箱是否匹配
SQLHelper.ExecuteDataSet(UserQuery.Select_CheckEmailWithUsername(username, email));
if (SQLHelper.Result != SQLResult.Success)
{
msg = "此邮箱未绑定此账号,请重试!";
}
else
{
// 检查验证码是否发送过和是否过期
SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_HasSentForgetVerifyCode(username, email));
if (SQLHelper.Result != SQLResult.Success || (DateTime.Now - ((DateTime)SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime])).TotalMinutes >= 10)
{
// 发送验证码,需要先删除之前过期的验证码
SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(username, email));
ForgetVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6);
SQLHelper.Execute(ForgetVerifyCodes.Insert_ForgetVerifyCode(username, email, ForgetVerify));
if (SQLHelper.Result == SQLResult.Success)
{
if (MailSender != null)
{
// 发送验证码
string ServerName = Config.ServerName;
string Subject = $"[{ServerName}] FunGame 找回密码验证码";
string Body = $"亲爱的 {username} <br/> 您正在找回[{ServerName}]账号的密码,您的验证码是 {ForgetVerify} 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}发送验证码:{ForgetVerify}");
msg = "";
}
else
{
ServerHelper.WriteLine(Server.GetClientName() + " 无法发送验证码");
ServerHelper.WriteLine(MailSender.ErrorMsg);
}
}
else // 不使用MailSender的情况
{
ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{ForgetVerify},请服务器管理员告知此用户");
msg = "";
}
}
}
else
{
// 发送过验证码且验证码没有过期
string ForgetVerifyCode = (string)SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_ForgetVerifyCode];
ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}");
msg = "";
}
}
}
}
ResultData.Add("msg", msg);
}
/// <summary>
/// 更新用户的密码
/// </summary>
/// <param name="RequestData"></param>
/// <param name="ResultData"></param>
private void UpdatePassword(Hashtable RequestData, Hashtable ResultData)
{
string msg = "无法更新您的密码,请稍后再试。";
if (RequestData.Count >= 2)
{
ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(SocketMessageType.DataRequest) + "] " + Server.GetClientName() + " -> UpdatePassword");
string username = DataRequest.GetHashtableJsonObject<string>(RequestData, UserQuery.Column_Username) ?? "";
string password = DataRequest.GetHashtableJsonObject<string>(RequestData, UserQuery.Column_Password) ?? "";
if (username.Trim() != "" && password.Trim() != "")
{
Server.SQLHelper.Execute(UserQuery.Update_Password(username, password));
if (SQLHelper.Success)
{
// 更新成功返回空值
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
}
}