Light12306/ChatRoomServer.Main/Room/RoomContainer.cs

111 lines
3.2 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;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ChatRoomServer.Main.Room
{
using System.Collections.Concurrent;
using ChatRoomServer.Main.Entities;
class RoomContainer
{
ConcurrentDictionary<ChatSession, RoomSessionContext> _contexts = new ConcurrentDictionary<ChatSession, RoomSessionContext>();
ConcurrentDictionary<string, HashSet<ChatSession>> _users = new ConcurrentDictionary<string, HashSet<ChatSession>>();
public RoomContainer(string id)
{
Id = id;
}
private void Session_RequireSendMessage(object sender, RequireSendMessageEventArgs e)
{
var enumerator = _contexts.GetEnumerator();
while (enumerator.MoveNext())
{
if (!e.ExcludeSender || sender != enumerator.Current.Key)
enumerator.Current.Key.TrySend(e.MessageItem);
}
}
public void Add(ChatSession session)
{
var ctx = _contexts.GetOrAdd(session, new RoomSessionContext());
var list = _users.GetOrAdd(session.UserName, _ => new HashSet<ChatSession>());
list.Add(session);
session.RoomContainer = this;
var count = _contexts.Count;
var enumerator = _contexts.GetEnumerator();
var data = count + "\t" + session.UserName + "\t" + session.NickName;
var msg = new MessageItem(SystemMessageType.UserEnter, content: data);
while (enumerator.MoveNext())
{
if (enumerator.Current.Key != session)
enumerator.Current.Key.TrySend(msg);
}
session.TrySend(msg);
session.TrySend(new MessageItem(SystemMessageType.ReportAbuseResult, success: false, content: "请注意聊天室举报机制已经更新。1.根据当前在线人数20分钟内最低3人举报即会自动封禁2.自动封禁已调整为默认永久封禁3.无效的举报经管理员审核后将会直接封禁举报人4.前台管理员举报将直接永久封禁。"));
//add event listener
session.RequireSendMessage += Session_RequireSendMessage;
}
/// <summary>
/// 判断指定的用户是否在线
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public bool IsUserInRoom(string user)
{
return _users.ContainsKey(user);
}
public void Remove(ChatSession session)
{
RoomSessionContext context;
if (!_contexts.TryRemove(session, out context))
return;
HashSet<ChatSession> sessions;
if (_users.TryGetValue(session.UserName, out sessions))
{
lock (sessions)
{
if (sessions.Contains(session))
sessions.Remove(session);
if (sessions.Count == 0)
_users.TryRemove(session.UserName, out sessions);
}
}
var count = _contexts.Count;
var enumerator = _contexts.GetEnumerator();
var data = count + "\t" + session.UserName + "\t" + session.NickName;
var msg = new MessageItem(SystemMessageType.UserExit, content: data);
while (enumerator.MoveNext())
{
enumerator.Current.Key.TrySend(msg);
}
//remove event listener
session.RequireSendMessage -= Session_RequireSendMessage;
}
/// <summary>
/// 获得或设置房间ID
/// </summary>
public string Id { get; private set; }
/// <summary>
/// 获得会话数
/// </summary>
public int SessionCount => _contexts.Count;
}
}