Light12306/ChatRoomServer.Main/Room/RoomContainer.cs
2015-07-08 17:24:45 +08:00

79 lines
1.9 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>();
/// <summary>
/// 获得或设置房间ID
/// </summary>
public string Id { get; private set; }
public RoomContainer(string id)
{
Id = id;
}
public void Add(ChatSession session)
{
var ctx = _contexts.GetOrAdd(session, new RoomSessionContext());
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);
//add event listener
session.RequireSendMessage += Session_RequireSendMessage;
}
private void Session_RequireSendMessage(object sender, MessageItem e)
{
var enumerator = _contexts.GetEnumerator();
while (enumerator.MoveNext())
{
enumerator.Current.Key.TrySend(e);
}
}
public void Remove(ChatSession session)
{
RoomSessionContext context;
_contexts.TryRemove(session, out context);
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>
/// 获得会话数
/// </summary>
public int SessionCount => _contexts.Count;
}
}