111 lines
3.2 KiB
C#
111 lines
3.2 KiB
C#
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;
|
||
}
|
||
}
|