public static void EmoteMessage( ChatUser from, Channel channel, string param )
		{
			if ( channel.CanTalk( from ) )
				channel.SendIgnorableMessage( 58, from, from.GetColorCharacter() + from.Username, param ); // %1 %2
			else
				from.SendMessage( 36 ); // The moderator of this conference has not given you speaking priviledges.
		}
示例#2
0
        public void JoinCallsAddUserIfValidUserIdInCookieAndUserList()
        {
            var repository = new ChatRepository();
            var user = new ChatUser
            {
                Id = "1234",
                Name = "John",
                Hash = "Hash"
            };
            repository.Users.Add(user);

            var chat = new ChatHub(repository);
            var connection = new Mock<IConnection>();
            var prinicipal = new Mock<IPrincipal>();
            var cookies = new HttpCookieCollection();
            cookies.Add(new HttpCookie("userid", "1234"));
            var clientState = new TrackingDictionary();
            string clientId = "20";
            chat.Agent = new ClientAgent(connection.Object, "Chat");
            chat.Caller = new SignalAgent(connection.Object, clientId, "Chat", clientState);
            chat.Context = new HubContext(clientId, cookies, prinicipal.Object);

            chat.Join();

            Assert.Equal("1234", clientState["id"]);
            Assert.Equal("John", clientState["name"]);
            Assert.Equal("Hash", clientState["hash"]);
            Assert.Equal("20", user.ClientId);
            // Need a better way to verify method name and arguments
            connection.Verify(m => m.Broadcast("Chat.20", It.IsAny<object>()), Times.Once());
        }
 private void btn_newUser_Click(object sender, EventArgs e)
 {
     chatCopy = userProto.Clone();
     chatCopy.Name = (tb_newUserName.Text);
     UserList.Add(chatCopy);
     cb_Users1.Items.Add(tb_newUserName.Text);
     cb_Users2.Items.Add(tb_newUserName.Text);
     tb_newUserName.Text = " ";
 }
		public static void PrivateMessage( ChatUser from, Channel channel, string param )
		{
			int indexOf = param.IndexOf( ' ' );

			string name = param.Substring( 0, indexOf );
			string text = param.Substring( indexOf + 1 );

			ChatUser target = ChatSystem.SearchForUser( from, name );

			if ( target == null )
				return;

			if ( target.IsIgnored( from ) )
				from.SendMessage( 35, target.Username ); // %1 has chosen to ignore you. None of your messages to them will get through.
			else if ( target.IgnorePrivateMessage )
				from.SendMessage( 42, target.Username ); // %1 has chosen to not receive private messages at the moment.
			else
				target.SendMessage( 59, from.Mobile, from.GetColorCharacter() + from.Username, text ); // [%1]: %2
		}
示例#5
0
        private void DoAskAndAddIdentityForUser(ChatUser user)
        {
            var knownPubKeysForUser = Constants.ApplicationDatabase.GetUserInfoByName(user.SkypeHandle).KnownPublicKeys;
            var userPublicKeyBytes = user.IdentityPublicKey;

            var questionForm = new UserIdentityReceivedForm();
            questionForm.SkypeFriendlyName = UiUtils.GetSkypeUserDisplayName(user.SkypeUserObject);
            questionForm.SkypeName = user.SkypeHandle;
            questionForm.Fingerprint = UiUtils.GetIdentityFingerprint(userPublicKeyBytes);

            questionForm.ShowDialog();
            if (questionForm.DialogResult != DialogResult.Yes)
            {
                if (!questionForm.BlockNew) return;
                // block this user from showing the window again with this identity
                 Constants.ApplicationDatabase.GetUserInfoByName(user.SkypeHandle).BlockIdentityQueries
                     .Add(UiUtils.GetIdentityFingerprint(userPublicKeyBytes));

                return;
            }
            // user accepted, add the key!
            knownPubKeysForUser.Add(userPublicKeyBytes);
            Constants.SaveAppDatabase();
        }
    private bool onUserEnter(DataMessage message)
    {
        message.createReader();
        Dictionary<string, object> json = message.readJson();
        message.closeReader();

        ChatUser u = new ChatUser();
        if (u.fromJson(json))
        {
            if (u.userId == systemController.getUserInfo().userId)
            {
                postUpdate(UiUpdates.GameIsReady, null);
            }
            else
            {
                if (!users.ContainsKey(u.userId))
                {
                    users.Add(u.userId, u);
                }
                postUpdate(UiUpdates.NewUser, u);
            }
        }

        return false;
    }
示例#7
0
文件: ChatApp.cs 项目: weeble/ohos
 public void OnUserListUpdated(object aSender, EventArgs aEventArgs)
 {
     lock (iLock)
     {
         var args = (UserEventArgs)aEventArgs;
         //Console.WriteLine("A: {0} B: {1}", args.Changes.Count(), args.SubscriptionEnded);
         foreach (var userChange in args.Changes)
         {
             ChatUser chatUser;
             if (!iUsers.TryGetValue(userChange.UserId, out chatUser) && userChange.NewValue != null)
             {
                 chatUser = new ChatUser { User = userChange.NewValue, TabCount = 0 };
                 iUsers[userChange.UserId] = chatUser;
             }
             string status = chatUser == null && chatUser.TabCount > 0 ? "online" : "offline";
             Broadcast(
                 new JsonObject {
                     { "type", "user"},
                     { "userid", userChange.UserId },
                     { "oldValue", UserToJson(userChange.OldValue, status) },
                     { "newValue", UserToJson(userChange.NewValue, status) } });
         }
     }
 }
示例#8
0
 void INotificationService.PostNotification(ChatRoom room, ChatUser user, string message)
 {
     Clients.User(user.Id).postNotification(message, room.Name);
 }
示例#9
0
        public bool Send(ClientMessage clientMessage)
        {
            //Commented out for resting purposes
            // TODO: set env variable
            //CheckStatus();

            //reject it if it's too long
            if (_settings.MaxMessageLength > 0 && clientMessage.Content.Length > _settings.MaxMessageLength)
            {
                throw new HubException(String.Format(LanguageResources.SendMessageTooLong, _settings.MaxMessageLength));
            }

            //See if this is a valid command (starts with /)
            if (TryHandleCommand(clientMessage.Content, clientMessage.Room))
            {
                return(true);
            }

            var userId = Context.User.GetUserId();

            ChatUser user = _repository.VerifyUserId(userId);

            // this line breaks when we message in a new room
            ChatRoom room = _repository.VerifyUserRoom(_cache, user, clientMessage.Room);

            if (room == null || (room.Private && user.AllowedRooms.Select(r => r.ChatRoomKeyNavigation).ToList().Contains(room)))
            {
                return(false);
            }

            // REVIEW: Is it better to use the extension method room.EnsureOpen here?
            if (room.Closed)
            {
                throw new HubException(String.Format(LanguageResources.SendMessageRoomClosed, clientMessage.Room));
            }

            // Update activity *after* ensuring the user, this forces them to be active
            UpdateActivity(user, room);

            // Create a true unique id and save the message to the db
            string id = Guid.NewGuid().ToString("d");

            // Ensure the message is logged
            ChatMessage chatMessage = _chatService.AddMessage(user, room, id, clientMessage.Content);

            room.ChatMessages.Add(chatMessage);

            // Save changes
            _repository.CommitChanges();


            var messageViewModel = new MessageViewModel(chatMessage);

            if (clientMessage.Id == null)
            {
                // If the client didn't generate an id for the message then just
                // send it to everyone. The assumption is that the client has some ui
                // that it wanted to update immediately showing the message and
                // then when the actual message is roundtripped it would "solidify it".
                Clients.Group(room.Name).addMessage(messageViewModel, room.Name);
            }
            else
            {
                // If the client did set an id then we need to give everyone the real id first
                Clients.OthersInGroup(room.Name).addMessage(messageViewModel, room.Name);

                // Now tell the caller to replace the message
                Clients.Caller.replaceMessage(clientMessage.Id, messageViewModel, room.Name);
            }

            // Add mentions
            //AddMentions(chatMessage);

            //var urls = UrlExtractor.ExtractUrls(chatMessage.Content);
            //if (urls.Count > 0)
            //{
            //    _resourceProcessor.ProcessUrls(urls, Clients, room.Name, chatMessage.Id);
            //}

            return(true);
        }
示例#10
0
        public override void Execute(CommandContext context, CallerContext callerContext, ChatUser callingUser, string[] args)
        {
            string message = String.Join(" ", args).Trim();

            ChatService.ValidateNote(message);

            callingUser.AfkNote = String.IsNullOrWhiteSpace(message) ? null : message;
            callingUser.IsAfk   = true;

            context.NotificationService.ChangeNote(callingUser);

            context.Repository.CommitChanges();
        }
示例#11
0
 private void TradeUser(ChatUser user)
 {
     tradeUserMethod.Invoke(target, new object[] { user });
 }
示例#12
0
 private void ChallengeUser(ChatUser user)
 {
     challengeUserMethod.Invoke(target, new object[] { user });
 }
示例#13
0
 private static void AddOrUpdateUser(ChatUser user)
 {
     lock (UserCacheLock)
     {
         var u = UserCache.SingleOrDefault(o => o.ConnectionId == user.ConnectionId);
         if (u != null)
             UserCache.Remove(u);
         UserCache.Add(user);
     }
 }
		public static void ChangeChannelPassword( ChatUser from, Channel channel, string param )
		{
			channel.Password = param;
			from.SendMessage( 60 ); // The password to the conference has been changed.
		}
		public static void LeaveChat( ChatUser from, Channel channel, string param )
		{
			ChatUser.RemoveChatUser( from );
		}
示例#16
0
 /// <summary>
 /// Replies to a specific user in a channel.
 /// </summary>
 public virtual MessageSendResult Reply(ChatChannel channel, ChatUser user, string message)
 {
     return(SendMessage(channel, $"{(Capabilities.AtMention ? "@" : "")}{user.AddressableName}, {message}"));
 }
示例#17
0
        public override void Execute(CommandContext context, CallerContext callerContext, ChatUser callingUser, string[] args)
        {
            string newWelcome = String.Join(" ", args).Trim();

            ChatService.ValidateWelcome(newWelcome);

            newWelcome = String.IsNullOrWhiteSpace(newWelcome) ? null : newWelcome;

            ChatRoom room = context.Repository.VerifyUserRoom(context.Cache, callingUser, callerContext.RoomName);

            context.Service.ChangeWelcome(callingUser, room, newWelcome);
            context.NotificationService.ChangeWelcome(callingUser, room);
        }
示例#18
0
 private void ProfileUser(ChatUser user)
 {
     profileUserMethod.Invoke(target, new object[] { user });
 }
示例#19
0
        private void OnUpdateActivity(ChatUser user, ChatRoom room)
        {
            var userViewModel = new UserViewModel(user);

            Clients.Group(room.Name).updateActivity(userViewModel, room.Name);
        }
示例#20
0
 private void OpenLink(ChatUser user)
 {
     this.CloseUserMenuinfo.Invoke(target, null);
     Process.Start(this.globallink);
 }
示例#21
0
        void INotificationService.UnallowUser(ChatUser targetUser, ChatRoom targetRoom, ChatUser callingUser)
        {
            // Kick the user from the room when they are unallowed
            ((INotificationService)this).KickUser(targetUser, targetRoom, callingUser, null);

            // Tell this client it's no longer allowed
            Clients.User(targetUser.Id).unallowUser(targetRoom.Name);

            // Tell the calling client the granting permission into the room was successful
            Clients.Caller.userUnallowed(targetUser.Name, targetRoom.Name);
        }
示例#22
0
 private void CopyLink(ChatUser user)
 {
     this.CloseUserMenuinfo.Invoke(target, null);
     systemCopyBufferProperty.SetValue(null, this.globallink, null);
 }
示例#23
0
 void INotificationService.LeaveRoom(ChatUser user, ChatRoom room)
 {
     LeaveRoom(user, room);
 }
示例#24
0
 private void whisperclick(ChatUser user)
 {
     this.CloseUserMenuinfo.Invoke(target,null);
     App.ArenaChat.OpenWhisperRoom(user.name);
     
 }
    private bool onReceivePlayersList(DataMessage message)
    {
        message.createReader();
        int callback = message.readInt32();

        if (callback != myCallback)
        {
            Debug.LogError("receive users list, but invalid Callback");
        }

        Dictionary<string, object> json = message.readJson();
        message.closeReader();
        object[] usersJson = (object[])json["users"];
        for (int i = 0; i < usersJson.Length; i++)
        {
            ChatUser u = new ChatUser();
            if (u.fromJson((Dictionary<string, object>)usersJson[i]))
            {
                users[u.userId] = u;
            }
        }
        postUpdate(UiUpdates.UpdateUsersList, null);
        sendUserReady();
        return false;
    }
示例#26
0
        private void copyDeckMenu(ChatUser user, string deck)
        {
            Vector3 mousePosition = Input.mousePosition;
            // need 30 pixels of extra space per item added

            Rect rect = new Rect(Mathf.Min((float)(Screen.width - 105), mousePosition.x), Mathf.Min((float)(Screen.height - 90 - 5), (float)Screen.height - mousePosition.y), 100f, 30f);

            this.globallink = deck;
            Gui.ContextMenu<ChatUser> userContextMenu = new Gui.ContextMenu<ChatUser>(user, rect);
            userContextMenu.add("Copy Deck", new Gui.ContextMenu<ChatUser>.URCMCallback(CopyLink));
            
            if (userContextMenu != null)
            {
                userContextMenuField.SetValue(target, userContextMenu);
                App.AudioScript.PlaySFX("Sounds/hyperduck/UI/ui_button_click");
            }

        }
示例#27
0
        /// <summary>
        /// 接收信息
        /// </summary>
        /// <param name="session"></param>
        /// <param name="value"></param>
        void ws_NewMessageReceived(WebSocketSession session, string value)
        {
            //接收消息根据消息类型分开处理
            //并向不同的人推送信息
            var str = value.Split(',');
            if (str[0] == "100")//分销系统用户登录验证
            {
                //100、ID、发起人、发起人单位ID、发起人单位、联系人、电话
                //注type 2为分销系统用户

                if (str.Length != 7) return;
                ChatUser chatUser = null;
                #region 分销系统账户
                var distUser = distributionUserList.FirstOrDefault(p => p.DistributionUserId == str[1]);
                if (distUser == null)
                {
                    distUser = new DistributionUser()
                    {
                        DistributionUserId = str[1],
                        DistributionUserName = str[2],
                        DistributionUserOrgId = str[3],
                        DistributionUserOrgName = str[4],
                        ContactName = str[5],
                        ContactPhone = str[6]
                    };
                    distributionUserList.Add(distUser);
                    chatUser = new ChatUser()
                    {
                        ChatUserId = Guid.NewGuid().ToString(),
                        Name = distUser.DistributionUserName,
                        OrgName = distUser.DistributionUserOrgName,
                        UserId = distUser.DistributionUserId,
                        UserType = 2
                    };
                    chatUserList.Add(chatUser);
                }
                else
                {
                    chatUser = chatUserList.FirstOrDefault(p => p.UserId == distUser.DistributionUserId && p.UserType == 2);
                    if (chatUser == null)
                    {
                        chatUser = new ChatUser()
                        {
                            ChatUserId = Guid.NewGuid().ToString(),
                            Name = distUser.DistributionUserName,
                            OrgName = distUser.DistributionUserOrgName,
                            UserId = distUser.DistributionUserId,
                            UserType = 2
                        };
                        chatUserList.Add(chatUser);
                    }
                }
                #endregion
                if (chatUser != null)
                {
                    //记录连接
                    userConnection.Add(new ChatUserConnection() { ChatUserId = chatUser.ChatUserId, BaseConnection = session.SessionID });
                    session.Send(JsonConvert.SerializeObject(new Res("200", chatUser.ChatUserId)));
                    List<Room> list = new List<Room>();
                    //得到自己的聊天会话
                    foreach (var item in room)
                    {
                        if (item.RoomMembers.Any(a => a.ChatUserType == ChatUserType.Submit && a.ChatUser.ChatUserId == chatUser.ChatUserId))
                            list.Add(item);
                    }
                    session.Send(JsonConvert.SerializeObject(new Res("210", list)));
                    //分类
                    session.Send(JsonConvert.SerializeObject(new Res("205", tagList.Select(s => new
                    {
                        Id = s.Id,
                        Name = s.Name
                    }))));
                }
                else
                {
                    session.Send(JsonConvert.SerializeObject(new Res("200", "0")));
                }
            }
            if (str[0] == "110")//OA系统用户登录验证
            {
                // 110,Id
                #region OA系统用户登录验证
                if (str.Length != 2) ;
                var user = userList.FirstOrDefault(p => p.Id == str[1]);
                ChatUser chatUser = chatUserList.FirstOrDefault(p => p.UserId == user.Id && p.UserType == 1);
                if (chatUser != null)
                {
                    //记录连接
                    userConnection.Add(new ChatUserConnection() { ChatUserId = chatUser.ChatUserId, BaseConnection = session.SessionID });
                    session.Send(JsonConvert.SerializeObject(new Res("200", chatUser.ChatUserId)));
                    //所属自己的聊天会话
                    List<Room> list = new List<Room>();
                    //得到自己的聊天会话
                    foreach (var item in room)
                    {
                        if (item.RoomMembers.Any(a => a.ChatUserType != ChatUserType.Submit && a.ChatUser.ChatUserId == chatUser.ChatUserId))
                            list.Add(item);
                    }
                    session.Send(JsonConvert.SerializeObject(new Res("210", list)));
                }
                else
                {
                    session.Send(JsonConvert.SerializeObject(new Res("200", "0")));
                }
                #endregion
            }
            if (str[0] == "101")//注:只能是分销用户发起创建聊天室
            {
                //101,chatUserId,tag|tag,消息主题
                #region 创建聊天室
                var tagstr = str[2].Split('|');
                var chatUser = chatUserList.FirstOrDefault(p => p.ChatUserId == str[1]);
                if (chatUser.UserType == 1) return;

                var t = tagList.Where(p => tagstr.Contains(p.Id)).ToList();
                //生成房间号
                var roomId = Guid.NewGuid().ToString();
                var r = new Room() { Id = roomId, Name = str[2], RoomMembers = new List<RoomMembers>(), Tag = t, State = MessgaeState.Init };
                r.State = MessgaeState.AllocateProcessing;
                r.RoomMembers.Add(new RoomMembers() { ChatUser = chatUser, ChatUserType = ChatUserType.Submit });
                var tagUserList = new List<User>();
                //得到房间所有用户列表
                foreach (var item in r.Tag)
                {
                    foreach (var user in userList)
                    {
                        if (user.Tag.Any(a => a.Id == item.Id))
                        {
                            if (tagUserList.Any(a => a.Id == user.Id))
                                continue;
                            tagUserList.Add(user);
                        }
                    }
                }
                var userIds = tagUserList.Select(s => s.Id).ToList();
                foreach (var item in chatUserList.Where(p => p.UserType == 1 && userIds.Contains(p.UserId)).ToList())
                {
                    r.RoomMembers.Add(new RoomMembers() { ChatUser = item, ChatUserType = ChatUserType.Visitor });
                }
                room.Add(r);

                //注:此处只推送基础连接
                //   这里是创建房间
                var sessionIds = new List<string>();
                var weixin = new List<string>();
                foreach (var item in r.RoomMembers)
                {
                    var temp = userConnection.FirstOrDefault(p => p.ChatUserId == item.ChatUser.ChatUserId);
                    if (temp != null)
                    {
                        sessionIds.Add(temp.BaseConnection);
                    }
                    else//没有连接推送给微信
                    {
                        var user = userList.FirstOrDefault(p => p.Id == item.ChatUser.UserId && item.ChatUserType != ChatUserType.Submit);
                        weixin.Add(user.Name);
                    }
                }
                foreach (var sendSession in ws.GetAllSessions())
                {
                    if (sessionIds.Contains(sendSession.SessionID))
                    {
                        sendSession.Send(JsonConvert.SerializeObject(new Res("210", room)));
                    }
                }

                session.Send(JsonConvert.SerializeObject(new Res("201", new { roomId })));
                #endregion
            }
            if (str[0] == "111")//接单
            {
                //111,chatUserId,roomId
                var chatUser = chatUserList.FirstOrDefault(p => p.ChatUserId == str[1]);
                var r = room.FirstOrDefault(p => p.Id == str[2]);
                r.State = MessgaeState.Processing;
                var roomMember = r.RoomMembers.FirstOrDefault(p => p.ChatUser.ChatUserId == chatUser.ChatUserId);
                roomMember.ChatUserType = ChatUserType.Receive;


                //注:此处只推送基础连接
                //   这里是创建房间
                var sessionIds = new List<string>();
                var weixin = new List<string>();
                foreach (var item in r.RoomMembers)
                {
                    var temp = userConnection.FirstOrDefault(p => p.ChatUserId == item.ChatUser.ChatUserId);
                    if (temp != null)
                    {
                        sessionIds.Add(temp.BaseConnection);
                    }
                    else//没有连接推送给微信
                    {
                        var user = userList.FirstOrDefault(p => p.Id == item.ChatUser.UserId && item.ChatUserType != ChatUserType.Submit);
                        weixin.Add(user.Name);
                    }
                }
                foreach (var sendSession in ws.GetAllSessions())
                {
                    if (sessionIds.Contains(sendSession.SessionID))
                    {
                        sendSession.Send(JsonConvert.SerializeObject(new Res("210", room)));
                    }
                }
            }
            //进入聊天室
            if (str[0] == "102")
            {
                //102,chatUserId,roomId
                var r = room.FirstOrDefault(p => p.Id == str[2]);
                var chatUser = chatUserList.FirstOrDefault(p => p.ChatUserId == str[1]);
                //判断当前用户是否有权限进入此聊天
                if (!r.RoomMembers.Any(p => p.ChatUser.ChatUserId == chatUser.ChatUserId))
                    return;
                //OA类型用户不能进行正在分配处理人的状态聊天室
                if (r.State == MessgaeState.AllocateProcessing && chatUser.UserType == 1)
                    return;

                var usercon = userConnection.FirstOrDefault(p => p.ChatUserId == chatUser.ChatUserId);
                //创建聊天连接
                usercon.ChatConnection = new ChatConnection();
                usercon.ChatConnection.RoomId = r.Id;
                usercon.ChatConnection.SessionId = session.SessionID;
                var msgStr = chatUser.Name + "加入会话";
                r.LatestSendMsgDate = DateTime.Now;
                r.LatestMsg = msgStr;
                foreach (var item in r.RoomMembers)
                {
                    var msg = new Message();
                    msg.Msg = msgStr;
                    msg.RoomId = r.Id;
                    msg.SendDate = DateTime.Now;
                    msg.ReceiveUser = item.ChatUser;
                    messageList.Add(msg);
                }
                PushMsg(session);
            }
            //发送信息
            if (str[0] == "103")
            {
                //103,chatUserId,roomId,msg
                var r = room.FirstOrDefault(p => p.Id == str[2]);
                var chatUser = chatUserList.FirstOrDefault(p => p.ChatUserId == str[1]);
                //判断当前用户是否有权限进入此聊天
                if (!r.RoomMembers.Any(p => p.ChatUser.ChatUserId == chatUser.ChatUserId))
                    return;
                var msgStr = str[3];
                r.LatestSendMsgDate = DateTime.Now;
                r.LatestMsg = msgStr;
                foreach (var item in r.RoomMembers)
                {
                    var msg = new Message();
                    msg.Msg = msgStr;
                    msg.RoomId = r.Id;
                    msg.SendDate = DateTime.Now;
                    msg.ReceiveUser = item.ChatUser;
                    messageList.Add(msg);
                }
                PushMsg(session);
            }
            //退出聊天室
            if (str[0] == "104")
            {
                //104,chatUserId,roomId
                var r = room.FirstOrDefault(p => p.Id == str[2]);
                var chatUser = chatUserList.FirstOrDefault(p => p.ChatUserId == str[1]);
                //判断当前用户是否有权限进入此聊天
                if (!r.RoomMembers.Any(p => p.ChatUser.ChatUserId == chatUser.ChatUserId))
                    return;
                var msgStr = chatUser.Name + "离开会话";
                r.LatestSendMsgDate = DateTime.Now;
                r.LatestMsg = msgStr;
                foreach (var item in r.RoomMembers)
                {
                    var msg = new Message();
                    msg.Msg = msgStr;
                    msg.RoomId = r.Id;
                    msg.SendDate = DateTime.Now;
                    msg.ReceiveUser = item.ChatUser;
                    messageList.Add(msg);
                }
                var usercon = userConnection.FirstOrDefault(p => p.ChatUserId == chatUser.ChatUserId);
                if (usercon == null) return;
                usercon.ChatConnection = null;
                PushMsg(session);
            }


            if (str[0] == "400")//关闭所有连接
            {
                var usercon = userConnection.FirstOrDefault(p => p.ChatUserId == str[1]);
                if (!string.IsNullOrEmpty(usercon.BaseConnection))
                    ws.GetAllSessions().FirstOrDefault(p => p.SessionID == usercon.ChatConnection.SessionId).Close();
                if (usercon.ChatConnection != null && !string.IsNullOrEmpty(usercon.ChatConnection.SessionId))
                    ws.GetAllSessions().FirstOrDefault(p => p.SessionID == usercon.BaseConnection).Close();

            }
        }
示例#28
0
        private void CreateUserMenu(ChatUser user , object infotarget, int length)
	{
        bool canOpenContextMenu = (bool)typeof(ChatUI).GetField("canOpenContextMenu", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(infotarget);
        Gui.ContextMenu<ChatUser> userContextMenu = null;      

		if (!canOpenContextMenu)
		{
			return;
		}
		Vector3 mousePosition = Input.mousePosition;
		Rect rect = new Rect(Mathf.Min((float)(Screen.width - 105), mousePosition.x+100), Mathf.Min((float)(Screen.height - 90 - 5), (float)Screen.height - mousePosition.y), Mathf.Max(100f,length+10), 30f);
		userContextMenu = new Gui.ContextMenu<ChatUser>(user, rect);

        userContextMenu.add(user.name, new Gui.ContextMenu<ChatUser>.URCMCallback(ProfileUser)); 
       
		if (user.acceptTrades)
		{
            userContextMenu.add("Trade", new Gui.ContextMenu<ChatUser>.URCMCallback(TradeUser));
		}

        userContextMenu.add("Whisper", new Gui.ContextMenu<ChatUser>.URCMCallback(whisperclick));

        if (user.acceptChallenges)
        {
            userContextMenu.add("Challenge", new Gui.ContextMenu<ChatUser>.URCMCallback(ChallengeUser));
        }
        userContextMenuField.SetValue(target, userContextMenu);
        App.AudioScript.PlaySFX("Sounds/hyperduck/UI/ui_button_click");
        //Console.WriteLine("bums");
	}
示例#29
0
        private ChatUser AddUser(string newUserName)
        {
            var user = new ChatUser(newUserName, GetMD5Hash(newUserName));
            user.ConnectionId = Context.ConnectionId;
            _users[newUserName] = user;
            _userRooms[newUserName] = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

            Caller.name = user.Name;
            Caller.hash = user.Hash;
            Caller.id = user.Id;

            Caller.addUser(user);

            return user;
        }
示例#30
0
        public void HeartBeat()
        {
            ChatUser user = new ChatUser();
            user.id = UserInfo.Id;
            user.nick = UserInfo.Apodo;

            if (!_usersActive.ContainsKey(IdMovement))
                _usersActive.Add(IdMovement, new Dictionary<int,ChatUser>());

            if (!_usersActive[IdMovement].ContainsKey(user.id))
            {
                _usersActive[IdMovement].Add(user.id, user);
            }
            else
            {
                if (!_usersActive[IdMovement][user.id].active)
                {
                    _usersActive[IdMovement][user.id].SetActive(true);
                }
                _usersActive[IdMovement][user.id].activeCounter = 0;
            }
        }
示例#31
0
        private static void NudgeRoom(CommandContext context, CallerContext callerContext, ChatUser callingUser)
        {
            ChatRoom room = context.Repository.VerifyUserRoom(context.Cache, callingUser, callerContext.RoomName);

            var betweenNudges = TimeSpan.FromMinutes(1);

            if (room.LastNudged == null || room.LastNudged < DateTime.Now.Subtract(betweenNudges))
            {
                room.LastNudged = DateTime.Now;
                context.Repository.CommitChanges();

                context.NotificationService.NudgeRoom(room, callingUser);
            }
            else
            {
                throw new InvalidOperationException(String.Format("Room can only be nudged once every {0} seconds", betweenNudges.TotalSeconds));
            }
        }
示例#32
0
        private ChatUser GetChatUser(int userId)
        {
            var db = new IndignadoDBDataContext();
            var user = db.Usuarios.SingleOrDefault(u => (u.id == userId));

            if (user == null)
                throw new FaultException("Ese usuario no existe!");

            ChatUser chatUser = new ChatUser();
            chatUser.id = user.id;
            chatUser.nick = user.nombre;

            return chatUser;
        }
        public void ResponseSignIn(CookieResponseSignInContext context)
        {
            var authResult = new AuthenticationResult
            {
                Success = true
            };

            ChatUser loggedInUser = GetLoggedInUser(context);

            var principal = new ClaimsPrincipal(context.Identity);

            // Do nothing if it's authenticated
            if (principal.IsAuthenticated())
            {
                EnsurePersistentCookie(context);
                return;
            }

            ChatUser user = _repositoryChatUserIdentity.GetUser(principal);

            authResult.ProviderName = principal.GetIdentityProvider();

            // The user exists so add the claim
            if (user != null)
            {
                if (loggedInUser != null && user != loggedInUser)
                {
                    // Set an error message
                    authResult.Message = String.Format(LanguageResources.Account_AccountAlreadyLinked, authResult.ProviderName);
                    authResult.Success = false;

                    // Keep the old user logged in
                    context.Identity.AddClaim(new Claim(ChatClaimTypes.Identifier, loggedInUser.Id));
                }
                else
                {
                    // Login this user
                    AddClaim(context, user);
                }
            }
            else if (principal.HasAllClaims())
            {
                ChatUser targetUser = null;

                // The user doesn't exist but the claims to create the user do exist
                if (loggedInUser == null)
                {
                    // New user so add them
                    user = _membershipService.AddUser(principal);

                    targetUser = user;
                }
                else
                {
                    // If the user is logged in then link
                    _membershipService.LinkIdentity(loggedInUser, principal);

                    _repository.Update(targetUser);

                    authResult.Message = String.Format(LanguageResources.Account_AccountLinkedSuccess, authResult.ProviderName);

                    targetUser = loggedInUser;
                }

                AddClaim(context, targetUser);
            }
            else if (!principal.HasPartialIdentity())
            {
                // A partial identity means the user needs to add more claims to login
                context.Identity.AddClaim(new Claim(ChatClaimTypes.PartialIdentity, "true"));
            }

            var cookieOptions = new CookieOptions
            {
                HttpOnly = true
            };

            context.Response.Cookies.Append(Constants.AuthResultCookie,
                                            JsonConvert.SerializeObject(authResult),
                                            cookieOptions);
        }
示例#34
0
        private ToolTipPropertySet CreateTip(ChatUser user)
        {
            // get the image to use
            Image icon = null;

            if (m_resourceProvider != null)
            {
                icon = m_resourceProvider.Icons.GetImageFor(user.Stats.Product);
            }

            // get the color to use.
            Color background = Color.Black;

            if (ProductTipColors.ContainsKey(user.Stats.Product))
            {
                background = ProductTipColors[user.Stats.Product];
            }

            // generate description
            StringBuilder description = new StringBuilder();

            description.Append("Product:    ");
            description.AppendLine(user.Stats.Product.Name);
            description.Append("Ping:       ");
            description.AppendLine(user.Ping.ToString(CultureInfo.InvariantCulture));
            description.Append("Flags:      ");
            description.AppendLine(user.Flags.ToString());
            description.AppendLine();

            if (user.Stats is StarcraftStats)
            {
                StarcraftStats stats = user.Stats as StarcraftStats;
                description.Append("Wins:       ");
                description.AppendLine(stats.Wins.ToString(CultureInfo.InvariantCulture));
                description.Append("Rank:       ");
                description.AppendLine(stats.LadderRank.ToString(CultureInfo.InvariantCulture));
                description.Append("Rating:     ");
                description.AppendLine(stats.LadderRating.ToString(CultureInfo.InvariantCulture));
            }
            else if (user.Stats is Diablo2Stats)
            {
                Diablo2Stats stats = user.Stats as Diablo2Stats;
                description.AppendLine(stats.IsExpansionCharacter ? "Expansion character" : "Classic character");
                if (stats.IsHardcoreCharacter)
                {
                    description.Append("Hardcore ");
                }
                if (stats.IsLadderCharacter)
                {
                    description.Append("Ladder ");
                }
                description.Append(stats.IsRealmCharacter ? "Realm " : "Open ");
                description.AppendLine("character");
                if (stats.IsRealmCharacter)
                {
                    description.AppendFormat(CultureInfo.InvariantCulture, "Level {0} {1}", stats.Level, stats.CharacterClass);
                    description.AppendLine();
                    description.AppendLine(stats.CharacterName);
                    description.AppendLine(stats.Difficulty.ToString());
                }
            }
            else if (user.Stats is Warcraft3Stats)
            {
                Warcraft3Stats stats = user.Stats as Warcraft3Stats;
                description.Append("Clan:       ");
                description.AppendLine(string.IsNullOrEmpty(stats.ClanTag) ? "(none)" : stats.ClanTag);
                description.AppendFormat(CultureInfo.InvariantCulture, "Level:      {0}", stats.Level);
                description.AppendLine();
            }

            ToolTipPropertySet ttps = new ToolTipPropertySet(user.Username, description.ToString(), background, icon, Color.White, background);

            return(ttps);
        }
示例#35
0
 public ChatElement(ChatUser User, List <string> Messages)
 {
     this.User     = User;
     this.Messages = Messages;
 }
示例#36
0
 public void RemoveUser(ChatUser user)
 {
     client.RemoveUser(user);
 }
示例#37
0
        private void UpdateActivity(ChatUser user, ChatRoom room)
        {
            UpdateActivity(user);

            OnUpdateActivity(user, room);
        }
示例#38
0
 public bool CreateNewRoom(ChatUser ourUser, string[] users, ChatRoom nameRoom)
 {
     return(client.CreateNewRoom(ourUser, users, nameRoom));
 }
示例#39
0
        private void UpdateActivity(ChatUser user)
        {
            _chatService.UpdateActivity(user, Context.ConnectionId, UserAgent);

            _repository.CommitChanges();
        }
示例#40
0
 public bool ConfirmUser(ChatUser ourName)
 {
     return(delConfirmUser(ourName));
 }
示例#41
0
 void INotificationService.LogOn(ChatUser user, string clientId)
 {
     LogOn(user, clientId, reconnecting: true);
 }
示例#42
0
 public void CreateRoom(ChatUser ourName, ChatUser requiredName, ChatRoom nameRoom)
 {
     throw new NotImplementedException();
 }
示例#43
0
 void INotificationService.OnSelfMessage(ChatRoom room, ChatUser user, string content)
 {
     Clients.Caller.sendMeMessage(user.Name, content, room.Name);
     Clients.Group(room.Name).sendMeMessage(user.Name, content, room.Name);
 }
示例#44
0
 public void ExitRoom(ChatUser user, ChatRoom room)
 {
     client.ExitRoom(user, room);
 }
示例#45
0
 void INotificationService.NudgeRoom(ChatRoom room, ChatUser user)
 {
     Clients.Group(room.Name).nudge(user.Name, null, room.Name);
 }
示例#46
0
 public void AddInRoom(ChatUser user, ChatUser ourname, ChatRoom room)
 {
     client.AddInRoom(user, ourname, room);
 }
示例#47
0
 public void ChatUserTest()
 {
     ChatUser user = new ChatUser(1, "name");
 }
示例#48
0
        public void ToStringTest()
        {
            ChatUser user = new ChatUser(1, "name");

            Assert.AreEqual("name#1", user.ToString());
        }
    private bool onReceiveMessage(DataMessage message)
    {
        message.createReader();
        int userId = message.readInt32();
        string userMessage = message.readString();
        message.closeReader();

        ChatUser user = getUser(userId);
        if (user == null)
        {
            user = new ChatUser();
            user.setUnknown(userId);
            users.Add(userId, user);
            requestUserInfo(userId);
        }

        ChatDialogMessage dialogMessage = new ChatDialogMessage(userMessage, user.userId, -1);
        if (dialogs.ContainsKey(userId))
        {
            dialogs[userId].messages.Add(dialogMessage);
        }
        else
        {
            ChatDialogWithUser dialog = new ChatDialogWithUser();
            dialog.withUser = user;
            dialog.messages.Add(dialogMessage);
            dialogs.Add(userId, dialog);
        }
        postUpdate(UiUpdates.ReceivedMessage, dialogMessage);
        return false;
    }
示例#50
0
        public ActionResult Index(string user, bool?logOn, bool?logOff, string chatMessage)
        {
            try
            {
                if (chatModel == null)
                {
                    chatModel = new ChatModel();
                }

                //оставляем только последние 10 сообщений
                if (chatModel.Messages.Count > 100)
                {
                    chatModel.Messages.RemoveRange(0, 90);
                }

                // если обычный запрос, просто возвращаем представление
                if (!Request.IsAjaxRequest())
                {
                    return(View(chatModel));
                }
                // если передан параметр logOn
                else if (logOn != null && (bool)logOn)
                {
                    //проверяем, существует ли уже такой пользователь
                    if (chatModel.Users.FirstOrDefault(u => u.Name == user) != null)
                    {
                        throw new Exception("Пользователь с таким ником уже существует");
                    }
                    else if (chatModel.Users.Count > 10)
                    {
                        throw new Exception("Чат заполнен");
                    }
                    else
                    {
                        // добавляем в список нового пользователя
                        chatModel.Users.Add(new ChatUser()
                        {
                            Name      = user,
                            LoginTime = DateTime.Now,
                            LastPing  = DateTime.Now
                        });

                        // добавляем в список сообщений сообщение о новом пользователе
                        chatModel.Messages.Add(new ChatMessage()
                        {
                            Text = user + " вошел в чат",
                            Date = DateTime.Now
                        });
                    }

                    return(PartialView("ChatRoom", chatModel));
                }
                // если передан параметр logOff
                else if (logOff != null && (bool)logOff)
                {
                    LogOff(chatModel.Users.FirstOrDefault(u => u.Name == user));
                    return(PartialView("ChatRoom", chatModel));
                }
                else
                {
                    ChatUser currentUser = chatModel.Users.FirstOrDefault(u => u.Name == user);

                    //для каждлого пользователя запоминаем воемя последнего обновления
                    currentUser.LastPing = DateTime.Now;

                    // удаляем неавтивных пользователей, если время простоя больше 15 сек
                    List <ChatUser> toRemove = new List <ChatUser>();
                    foreach (Models.ChatUser usr in chatModel.Users)
                    {
                        TimeSpan span = DateTime.Now - usr.LastPing;
                        if (span.TotalSeconds > 15)
                        {
                            toRemove.Add(usr);
                        }
                    }
                    foreach (ChatUser u in toRemove)
                    {
                        LogOff(u);
                    }

                    // добавляем в список сообщений новое сообщение
                    if (!string.IsNullOrEmpty(chatMessage))
                    {
                        chatModel.Messages.Add(new ChatMessage()
                        {
                            User = currentUser,
                            Text = chatMessage,
                            Date = DateTime.Now
                        });
                    }

                    return(PartialView("History", chatModel));
                }
            }
            catch (Exception ex)
            {
                //в случае ошибки посылаем статусный код 500
                Response.StatusCode = 500;
                return(Content(ex.Message));
            }
        }
    private bool onReceiveUserInfo(DataMessage message)
    {
        message.createReader();
        int callback = message.readInt32();
        int result = message.readInt32();

        switch(result) {
            case Ids.SystemResults.SUCCESS:
                {
                    int requestedUsedId = message.readInt32();
                    Dictionary<string, object> json = message.readJson();
                    message.closeReader();

                    ChatUser user;
                    if (users.ContainsKey(requestedUsedId))
                    {
                        user = users[requestedUsedId];
                    }
                    else
                    {
                        user = new ChatUser();
                        users.Add(requestedUsedId, user);
                    }
                    if (!user.fromJson(json))
                    {
                        Debug.LogError("ReceiveUserInfo : fail to parse user data for "+requestedUsedId.ToString());
                        user.setUnknown(requestedUsedId);
                    }
                    postUpdate(UiUpdates.UserUpdated, user);
                }
                break;
            case Ids.Actions.SimpleChat.RESULT_NO_USER_WITH_SUCH_ID:
                {
                    int requestedUsedId = message.readInt32();
                    message.closeReader();
                    Debug.LogError("ReceiveUserInfo : requested User not found id: " + requestedUsedId.ToString());
                }
                break;
            case Ids.SystemResults.INVALID_SESSION:
                message.closeReader();
                Debug.LogError("ReceiveUserInfo : Internal error - Invalid session");
                break;
            case Ids.SystemResults.INVALID_DATA:
                message.closeReader();
                Debug.LogError("ReceiveUserInfo : Internal error - Invalid data");
                break;
            case Ids.SystemResults.NO_GAME_WITH_SUCH_ID:
                message.closeReader();
                Debug.LogError("ReceiveUserInfo : Internal error - no game with such id");
                break;
        }

        return false;
    }
示例#52
0
 public static void ParseMessage(ChatUser sender, string msg, Func <bool> callback = null)
 {
     RequestBot.COMMAND.Parse(sender, msg, 0, "", callback);
 }
    public void sendMessage(ChatUser toUser, String textMessage)
    {
        ChatDialogMessage dialogMessage = new ChatDialogMessage(textMessage, systemController.getUserInfo().userId, -1);
        if (dialogs.ContainsKey(toUser.userId))
        {
            dialogs[toUser.userId].messages.Add(dialogMessage);
        }
        else
        {
            ChatDialogWithUser dialog = new ChatDialogWithUser();
            dialog.withUser = toUser;
            dialog.messages.Add(dialogMessage);
            dialogs.Add(toUser.userId, dialog);
        }

        DataMessage message = new DataMessage(Ids.Services.GAMES, Ids.Actions.SimpleChat.SEND_MESSAGE, systemController.getUserInfo().session);
        message.createWriter()
            .writerInt32(GameId)
            .writerInt32(toUser.userId)
            .writerInt32(myCallback)
            .writerString(textMessage)
            .closeWriter();

        connection.addMessageToSend(message);
    }
示例#54
0
        public override void Execute(CommandContext context, CallerContext callerContext, ChatUser callingUser, string[] args)
        {
            if (args.Length == 0)
            {
                // Clear the flag.
                callingUser.Flag = null;
            }
            else
            {
                // Set the flag.
                string isoCode = String.Join(" ", args[0]).ToLowerInvariant();
                ChatService.ValidateIsoCode(isoCode);
                callingUser.Flag = isoCode;
            }

            context.NotificationService.ChangeFlag(callingUser);

            context.Repository.CommitChanges();
        }
示例#55
0
        public static bool CS_LOGIN_Handler(ISocket sock, byte[] buffer)
        {
            CS_LOGIN_Packet packet = PacketHelper.ParsePacketStruct<CS_LOGIN_Packet>(buffer);

            Int16 readLen = PacketHelper.ParseBodyLen(buffer);
            if (readLen < PacketHelper.Size(packet))
            {
                Console.WriteLine("read length is too small({0})", readLen);
                return true;    // socket close
            }

            // do login
            UserLoginData iter = ChatServer.Instance().m_UserLoginDataList.Find(x => (x.name == packet.name && x.pwd == packet.pwd));
            if (iter.name == packet.name)
            {
                SC_LOGIN_RESULT_Packet result = new SC_LOGIN_RESULT_Packet();

                lock (ChatServer.Instance().m_ChatUserMapLock)
                {
                    ChatUser tmp;
                    if (ChatServer.Instance().m_mapChatUser.TryGetValue(packet.name, out tmp))
                    {
                        result.Result = 0;
                    }
                    else
                    {
                        result.Result = 1;

                        ChatUser newUser = new ChatUser();
                        newUser.name = packet.name;
                        newUser.UserSocket = sock;

                        sock.Owner = newUser;
                        ChatServer.Instance().m_mapChatUser.Add(newUser.name, newUser);
                    }
                }

                Console.WriteLine("{0} logged in.", packet.name);

                PacketHelper.Send(sock, (Int16)SC_PacketType.SC_LOGIN_RESULT, result);
            }
            else
            {
                SC_LOGIN_RESULT_Packet result = new SC_LOGIN_RESULT_Packet();
                result.Result = 0;

                Console.WriteLine("{0} log in failed.({1})", packet.name, sock.GetSocket().RemoteEndPoint.ToString());

                PacketHelper.Send(sock, (Int16)SC_PacketType.SC_LOGIN_RESULT, result);
            }

            return false;
        }
        public override void Execute(CommandContext context, CallerContext callerContext, ChatUser callingUser, string[] args)
        {
            if (context.Repository.Users.Count() == 1)
            {
                throw new InvalidOperationException("You're the only person in here...");
            }

            if (args.Length == 0 || String.IsNullOrWhiteSpace(args[0]))
            {
                throw new InvalidOperationException("Who are you trying send a private message to?");
            }
            var      toUserName = args[0];
            ChatUser toUser     = context.Repository.VerifyUser(toUserName);

            if (toUser == callingUser)
            {
                throw new InvalidOperationException("You can't private message yourself!");
            }

            string messageText = String.Join(" ", args.Skip(1)).Trim();

            if (String.IsNullOrEmpty(messageText))
            {
                throw new InvalidOperationException(String.Format("What did you want to say to '{0}'?", toUser.Name));
            }

            context.NotificationService.SendPrivateMessage(callingUser, toUser, messageText);
        }
示例#57
0
        public static DTChatUser ChatUserToDT(ChatUser u)
        {
            DTChatUser dt = new DTChatUser();
            dt.id = u.id;
            dt.nick = u.nick;
            dt.active = u.active;

            return dt;
        }
示例#58
0
 public override void Execute(CommandContext context, CallerContext callerContext, ChatUser callingUser, string[] args)
 {
     if (args.Length == 0)
     {
         NudgeRoom(context, callerContext, callingUser);
     }
     else
     {
         NudgeUser(context, callingUser, args);
     }
 }
示例#59
0
        private bool TryHandleCommand(string message)
        {
            string room = Caller.room;
            string name = Caller.name;

            message = message.Trim();
            if (message.StartsWith("/"))
            {
                string[] parts = message.Substring(1).Split(' ');
                string commandName = parts[0];

                if (commandName.Equals("nick", StringComparison.OrdinalIgnoreCase))
                {
                    string newUserName = String.Join(" ", parts.Skip(1));

                    if (String.IsNullOrEmpty(newUserName))
                    {
                        throw new InvalidOperationException("No username specified!");
                    }

                    if (newUserName.Equals(name, StringComparison.OrdinalIgnoreCase))
                    {
                        throw new InvalidOperationException("That's already your username...");
                    }

                    if (!_users.ContainsKey(newUserName))
                    {
                        if (String.IsNullOrEmpty(name) || !_users.ContainsKey(name))
                        {
                            var user = AddUser(newUserName);
                        }
                        else
                        {
                            var oldUser = _users[name];
                            var newUser = new ChatUser
                            {
                                Name = newUserName,
                                Hash = GetMD5Hash(newUserName),
                                Id = oldUser.Id,
                                ConnectionId = oldUser.ConnectionId
                            };

                            _users[newUserName] = newUser;
                            _userRooms[newUserName] = new HashSet<string>(_userRooms[name]);

                            if (_userRooms[name].Any())
                            {
                                foreach (var r in _userRooms[name])
                                {
                                    _rooms[r].Users.Remove(name);
                                    _rooms[r].Users.Add(newUserName);
                                    Clients[r].changeUserName(oldUser, newUser);
                                }
                            }

                            _userRooms.Remove(name);
                            _users.Remove(name);

                            Caller.hash = newUser.Hash;
                            Caller.name = newUser.Name;

                            Caller.changeUserName(oldUser, newUser);
                        }
                    }
                    else
                    {
                        throw new InvalidOperationException(String.Format("Username '{0}' is already taken!", newUserName));
                    }

                    return true;
                }
                else
                {
                    EnsureUser();
                    if (commandName.Equals("rooms", StringComparison.OrdinalIgnoreCase))
                    {
                        var rooms = _rooms.Select(r => new
                        {
                            Name = r.Key,
                            Count = r.Value.Users.Count
                        });

                        Caller.showRooms(rooms);

                        return true;
                    }
                    else if (commandName.Equals("join", StringComparison.OrdinalIgnoreCase))
                    {
                        if (parts.Length == 1)
                        {
                            throw new InvalidOperationException("Join which room?");
                        }

                        // Only support one room at a time for now

                        string newRoom = parts[1];
                        ChatRoom chatRoom;
                        // Create the room if it doesn't exist
                        if (!_rooms.TryGetValue(newRoom, out chatRoom))
                        {
                            chatRoom = new ChatRoom();
                            _rooms.Add(newRoom, chatRoom);
                        }

                        // Remove the old room
                        if (!String.IsNullOrEmpty(room))
                        {
                            _userRooms[name].Remove(room);
                            _rooms[room].Users.Remove(name);

                            Clients[room].leave(_users[name]);
                            RemoveFromGroup(room);
                        }

                        _userRooms[name].Add(newRoom);
                        if (!chatRoom.Users.Add(name))
                        {
                            throw new InvalidOperationException("You're already in that room!");
                        }

                        Clients[newRoom].addUser(_users[name]);

                        // Set the room on the caller
                        Caller.room = newRoom;

                        AddToGroup(newRoom);

                        Caller.refreshRoom(newRoom);

                        return true;
                    }
                    else if (commandName.Equals("msg", StringComparison.OrdinalIgnoreCase))
                    {
                        if (_users.Count == 1)
                        {
                            throw new InvalidOperationException("You're the only person in here...");
                        }

                        if (parts.Length < 2)
                        {
                            throw new InvalidOperationException("Who are you trying send a private message to?");
                        }

                        string to = parts[1];
                        if (to.Equals(name, StringComparison.OrdinalIgnoreCase))
                        {
                            throw new InvalidOperationException("You can't private message yourself!");
                        }

                        if (!_users.ContainsKey(to))
                        {
                            throw new InvalidOperationException(String.Format("Couldn't find any user named '{0}'.", to));
                        }

                        string messageText = String.Join(" ", parts.Skip(2)).Trim();

                        if (String.IsNullOrEmpty(messageText))
                        {
                            throw new InvalidOperationException(String.Format("What did you want to say to '{0}'.", to));
                        }

                        string recipientId = _users[to].ConnectionId;
                        // Send a message to the sender and the sendee
                        Clients[recipientId].sendPrivateMessage(name, to, messageText);
                        Caller.sendPrivateMessage(name, to, messageText);

                        return true;
                    }
                    else
                    {
                        EnsureUserAndRoom();
                        if (commandName.Equals("me", StringComparison.OrdinalIgnoreCase))
                        {
                            if (parts.Length == 1)
                            {
                                throw new InvalidProgramException("You what?");
                            }
                            var content = String.Join(" ", parts.Skip(1));

                            Clients[room].sendMeMessage(name, content);
                            return true;
                        }
                        else if (commandName.Equals("leave", StringComparison.OrdinalIgnoreCase))
                        {
                            ChatRoom chatRoom;
                            if (_rooms.TryGetValue(room, out chatRoom))
                            {
                                chatRoom.Users.Remove(name);
                                _userRooms[name].Remove(room);

                                Clients[room].leave(_users[name]);
                            }

                            RemoveFromGroup(room);

                            Caller.room = null;

                            return true;
                        }

                        throw new InvalidOperationException(String.Format("'{0}' is not a valid command.", parts[0]));
                    }
                }
            }
            return false;
        }
		public static void ToggleDefaultVoice( ChatUser from, Channel channel, string param )
		{
			channel.VoiceRestricted = !channel.VoiceRestricted;
		}