2015-07-01 16:18:25 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace ChatRoomServer.Main.Room
|
|
|
|
|
{
|
|
|
|
|
using System.Collections.Concurrent;
|
2015-07-08 17:24:45 +08:00
|
|
|
|
using ChatRoomServer.Main.Entities;
|
2015-07-01 16:18:25 +08:00
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
{
|
2015-07-08 17:24:45 +08:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-09 21:06:30 +08:00
|
|
|
|
private void Session_RequireSendMessage(object sender, RequireSendMessageEventArgs e)
|
2015-07-08 17:24:45 +08:00
|
|
|
|
{
|
|
|
|
|
var enumerator = _contexts.GetEnumerator();
|
|
|
|
|
while (enumerator.MoveNext())
|
|
|
|
|
{
|
2015-07-09 21:06:30 +08:00
|
|
|
|
if (!e.ExcludeSender || sender != enumerator.Current.Key)
|
|
|
|
|
enumerator.Current.Key.TrySend(e.MessageItem);
|
2015-07-08 17:24:45 +08:00
|
|
|
|
}
|
2015-07-01 16:18:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Remove(ChatSession session)
|
|
|
|
|
{
|
|
|
|
|
RoomSessionContext context;
|
|
|
|
|
_contexts.TryRemove(session, out context);
|
2015-07-08 17:24:45 +08:00
|
|
|
|
|
|
|
|
|
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;
|
2015-07-01 16:18:25 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获得会话数
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int SessionCount => _contexts.Count;
|
|
|
|
|
}
|
|
|
|
|
}
|