Light12306/ChatRoomServer.Main/Room/RoomContainer.cs

111 lines
3.2 KiB
C#
Raw Normal View History

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>();
2015-10-21 12:40:04 +08:00
ConcurrentDictionary<string, HashSet<ChatSession>> _users = new ConcurrentDictionary<string, HashSet<ChatSession>>();
2015-07-01 16:18:25 +08:00
public RoomContainer(string id)
{
Id = id;
}
2015-10-21 12:40:04 +08:00
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);
}
}
2015-07-01 16:18:25 +08:00
public void Add(ChatSession session)
{
2015-07-08 17:24:45 +08:00
var ctx = _contexts.GetOrAdd(session, new RoomSessionContext());
2015-10-21 12:40:04 +08:00
var list = _users.GetOrAdd(session.UserName, _ => new HashSet<ChatSession>());
list.Add(session);
session.RoomContainer = this;
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.UserEnter, content: data);
while (enumerator.MoveNext())
{
if (enumerator.Current.Key != session)
enumerator.Current.Key.TrySend(msg);
}
session.TrySend(msg);
2016-01-11 20:25:15 +08:00
session.TrySend(new MessageItem(SystemMessageType.ReportAbuseResult, success: false, content: "请注意聊天室举报机制已经更新。1.根据当前在线人数20分钟内最低3人举报即会自动封禁2.自动封禁已调整为默认永久封禁3.无效的举报经管理员审核后将会直接封禁举报人4.前台管理员举报将直接永久封禁。"));
2015-07-08 17:24:45 +08:00
//add event listener
session.RequireSendMessage += Session_RequireSendMessage;
}
2015-10-21 12:40:04 +08:00
/// <summary>
/// 判断指定的用户是否在线
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public bool IsUserInRoom(string user)
2015-07-08 17:24:45 +08:00
{
2015-10-21 12:40:04 +08:00
return _users.ContainsKey(user);
2015-07-01 16:18:25 +08:00
}
public void Remove(ChatSession session)
{
RoomSessionContext context;
2015-08-03 15:07:49 +08:00
if (!_contexts.TryRemove(session, out context))
return;
2015-07-08 17:24:45 +08:00
2015-10-21 12:40:04 +08:00
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);
}
}
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
}
2015-10-21 12:40:04 +08:00
/// <summary>
/// 获得或设置房间ID
/// </summary>
public string Id { get; private set; }
2015-07-01 16:18:25 +08:00
/// <summary>
/// 获得会话数
/// </summary>
public int SessionCount => _contexts.Count;
}
}