예제 #1
0
        public void UpdateColor(int color, ChatUser sender)
        {
            //Check change condition
            if (true)
            {
                this.Color = color;
                store.Save(this);

                ChangeBubbleChatColor packet = new ChangeBubbleChatColor()
                {
                    ConversationID = this.ID.ToString(),
                    Color          = color
                };

                foreach (Guid memberID in Members)
                {
                    if (!ChatUserManager.IsOnline(memberID))
                    {
                        continue;
                    }
                    ChatUser user = ChatUserManager.LoadUser(memberID);
                    user.Send(packet);
                }
            }
            else
            {
                ChangeBubbleChatColor packet = new ChangeBubbleChatColor()
                {
                    ConversationID = this.ID.ToString(),
                    Color          = this.Color
                };
                sender.Send(packet);
            }
        }
예제 #2
0
        public void Execute(ISender commandSender, string commandLabel, string[] args)
        {
            if (args.Length < 2)
            {
                return;
            }

            Guid id = ProfileCache.Instance.ParseEmailToGuid(args[1].ToLower());

            if (id.Equals(Guid.Empty))
            {
                PacChatServer.GetServer().Logger.Error("Email is not exists.");
                return;
            }

            ChatUser user = ChatUserManager.LoadUser(id);

            user.Banned = true;

            user.Save();

            if (user.IsOnline())
            {
                user.Kick();
            }
        }
예제 #3
0
        public void Handle(ISession session)
        {
            ChatSession chatSession = session as ChatSession;

            ChatUser user;

            if (ChatUserManager.OnlineUsers.TryGetValue(Guid.Parse(TargetID), out user))
            {
                ForwardedFriendRequest packet = new ForwardedFriendRequest();
                packet.SenderID = chatSession.Owner.ID.ToString();
                packet.Name     = chatSession.Owner.FirstName + " " + chatSession.Owner.LastName;
                PacChatServer.GetServer().Logger.Debug("Friend request " + packet.Name);
                user.Send(packet);
            }

            string name = chatSession.Owner.FirstName + " " + chatSession.Owner.LastName;

            //string encNoti = "mkfriend:" + chatSession.Owner.ID + ":" +
            //    chatSession.Owner.FirstName + " " + chatSession.Owner.LastName;

            string encNoti = NotificationEncoder.Assemble(
                NotificationPrefixes.AddFriend,
                chatSession.Owner.ID.ToString(),
                name, name, "sent you a friend request.",
                false);

            user = ChatUserManager.LoadUser(Guid.Parse(TargetID));
            user.Notifications.Add(encNoti);
            user.Save();
        }
예제 #4
0
	    public static void AddTakenSeat(int showId, int seatId, string userId)
	    {
		    var username = string.Empty;
		    if (ChatUserManager.RegisteredUsers.ContainsKey(showId) &&
		        ChatUserManager.RegisteredUsers[showId].ContainsKey(userId))
		    {
			    username = ChatUserManager.RegisteredUsers[showId][userId];
		    }
			else if (ChatUserManager.NonRegisteredUsers.ContainsKey(showId) &&
			         ChatUserManager.NonRegisteredUsers[showId].ContainsKey(userId))
		    {
			    username = ChatUserManager.FormGuestName(ChatUserManager.NonRegisteredUsers[showId][userId]);
		    }
			if (takenSeats.ContainsKey(showId) && takenSeats[showId].ContainsKey(username) &&
		        takenSeats[showId][username] != null && takenSeats[showId][username].Contains(seatId))
		    {
			    return;
		    }
		    if (!takenSeats.ContainsKey(showId))
		    {
				List<int> seatIds = new List<int>(){seatId};
				 var userSeats =  new Dictionary<string,List<int>> {{ username, seatIds } };
			    takenSeats.TryAdd(showId, userSeats);
		    }
			else if (takenSeats.ContainsKey(showId) && !takenSeats[showId].ContainsKey(username))
		    {
				List<int> seatIds = new List<int>() { seatId };
				takenSeats[showId].Add(username,seatIds);
		    }
			else if (takenSeats.ContainsKey(showId) && takenSeats[showId].ContainsKey(username))
		    {
			    var seatIds = takenSeats[showId][username];
			    seatIds?.Add(seatId);
		    }
		}
        public void Handle(ISession session)
        {
            if (TargetID.Equals(Guid.Empty))
            {
                return;
            }

            ChatUser targetUser = ChatUserManager.LoadUser(TargetID);

            if (targetUser == null)
            {
                return;
            }

            ChatSession chatSession = session as ChatSession;

            ConversationStore store = new ConversationStore();

            Guid resultID = Guid.NewGuid();
            bool flag     = true;

            var CommonConversation = targetUser.ConversationID.Intersect(chatSession.Owner.ConversationID);

            foreach (Guid conversationID in CommonConversation)
            {
                AbstractConversation conversation = store.Load(conversationID);
                if (conversation is SingleConversation)
                {
                    resultID = conversation.ID;
                    flag     = false;
                    break;
                }
            }

            if (flag)
            {
                chatSession.Owner.ConversationID.Add(resultID);
                targetUser.ConversationID.Add(resultID);

                store.Save(new SingleConversation()
                {
                    ID      = resultID,
                    Members = new HashSet <Guid>()
                    {
                        chatSession.Owner.ID, targetUser.ID
                    },
                    ConversationName = "~"
                });

                chatSession.Owner.Save();
                targetUser.Save();
            }

            SingleConversationFrUserIDResponse response = new SingleConversationFrUserIDResponse();

            response.UserID     = TargetID;
            response.ResponseID = resultID;

            chatSession.Send(response);
        }
예제 #6
0
        public string RegisterGuest(int showId)
        {
            var id        = Context.ConnectionId;
            var guestName = ChatUserManager.RegisterGuest(showId, id);

            connectionEventMessageNotify(true, showId, guestName, id);
            sendTakenSeatsToRegistered(showId, id);
            return(guestName);
        }
예제 #7
0
	    public static void ReleaseTakenSeat(int showId, int seatId, string userId)
	    {
		    var username = ChatUserManager.GetName(showId, userId);
			if (takenSeats.ContainsKey(showId) && takenSeats[showId].ContainsKey(username) &&
		        takenSeats[showId][username].Contains(seatId))
		    {
			    takenSeats[showId][username].Remove(seatId);
		    }
		}
예제 #8
0
        public bool RegisterUser(int showId, string userName)
        {
            var  id = Context.ConnectionId;
            bool succuessRegister = ChatUserManager.RegisterUser(showId, id, userName);

            if (succuessRegister)
            {
                connectionEventMessageNotify(true, showId, userName, id);
            }
            sendTakenSeatsToRegistered(showId, id);
            return(succuessRegister);
        }
예제 #9
0
	    public static List<int> ReleaseTakenSeats(int showId, string userId)
	    {
		    List<int> takenSeatsList = null;
		    var username = ChatUserManager.GetName(showId, userId);
		    if (takenSeats.ContainsKey(showId) && takenSeats[showId].ContainsKey(username))
		    {
			    takenSeatsList = new List<int>(takenSeats[showId][username]);
				takenSeats[showId][username].Clear();
		    }

		    return takenSeatsList;
	    }
예제 #10
0
        public void Handle(ISession session)
        {
            ChatSession chatSession = session as ChatSession;

            GetNotificationsResponse packet = new GetNotificationsResponse();
            ChatUser user = ChatUserManager.LoadUser(chatSession.Owner.ID);

            foreach (var noti in user.Notifications)
            {
                packet.Notifications.Add(noti);
            }

            chatSession.Send(packet);
        }
예제 #11
0
        public void Online()
        {
            UserOnline packet = new UserOnline();

            packet.TargetID = this.ID;

            foreach (var pair in Relationship.Where(q => Relation.Get(q.Value).RelationType == Relation.Type.Friend))
            {
                if (ChatUserManager.IsOnline(pair.Key))
                {
                    ChatUserManager.LoadUser(pair.Key).Send(packet);
                }
            }
        }
예제 #12
0
        public override Task OnDisconnectedAsync(Exception exception)
        {
            var id = Context.ConnectionId;
            KeyValuePair <int, string> info = new KeyValuePair <int, string>();

            if (ChatUserManager.UserInfo.ContainsKey(id))
            {
                info = ChatUserManager.UserInfo[id];
                connectionEventMessageNotify(false, info.Key, info.Value, id);
                releaseTakenSeats(id, info.Key);
                ChatUserManager.RemoveUser(info.Key, id);
            }

            return(base.OnDisconnectedAsync(exception));
        }
예제 #13
0
        public void Handle(ISession session)
        {
            ChatSession chatSession = session as ChatSession;

            if (!chatSession.Owner.ConversationID.Contains(ConversationID))
            {
                return;
            }

            AbstractConversation conversation = ConversationManager.GetConversation(ConversationID);

            if (conversation == null || conversation is GroupConversation)
            {
                return;
            }

            if (chatSession.Owner.LastBuzz.ContainsKey(ConversationID))
            {
                chatSession.Owner.LastBuzz.TryGetValue(ConversationID, out var lastBuzz);
                if (DateTime.Now.Ticks - lastBuzz < 10000000 * 10)
                {
                    return;
                }
            }
            chatSession.Owner.LastBuzz.TryRemove(ConversationID, out var lastz);
            chatSession.Owner.LastBuzz.TryAdd(ConversationID, DateTime.Now.Ticks);

            BuzzResponse message = new BuzzResponse()
            {
                SenderID       = chatSession.Owner.ID.ToString(),
                ConversationID = this.ConversationID.ToString()
            };

            foreach (Guid guid in conversation.Members)
            {
                if (ChatUserManager.IsOnline(guid) && guid != chatSession.Owner.ID)
                {
                    chatSession.Owner.Relationship.TryGetValue(guid, out var relationID);
                    Relation relation = Relation.Get(relationID);
                    if (relation == null || relation.RelationType != Relation.Type.Friend)
                    {
                        continue;
                    }
                    ChatUserManager.LoadUser(guid).Send(message);
                }
            }
        }
예제 #14
0
        public void Offline()
        {
            this.LastLogoff = DateTime.UtcNow;
            UserOffline packet = new UserOffline();

            packet.TargetID = this.ID;

            foreach (var pair in Relationship.Where(q => Relation.Get(q.Value).RelationType == Relation.Type.Friend))
            {
                if (ChatUserManager.IsOnline(pair.Key))
                {
                    ChatUserManager.LoadUser(pair.Key).Send(packet);
                }
            }

            this.Save();
            PacChatServer.GetServer().Logger.Info(String.Format("User {0} has logged out at {1}!", this.Email, this.LastLogoff.ToString()));
        }
예제 #15
0
        public void Handle(ISession session)
        {
            ChatSession chatSession = session as ChatSession;
            ChatUser    targetUser  = ChatUserManager.LoadUser(TargetID);

            if (targetUser == null)
            {
                return;
            }

            DisplayedProfileResponse packet = new DisplayedProfileResponse();

            packet.ID    = targetUser.ID.ToString();
            packet.Name  = targetUser.FirstName + " " + targetUser.LastName;
            packet.Email = targetUser.Email;
            packet.DoB   = targetUser.DateOfBirth.ToString();
            packet.Town  = targetUser.Town;

            chatSession.Send(packet);
        }
예제 #16
0
        public void SessionInactivated(ISession session)
        {
            ChatSession chatSession = session as ChatSession;

            Server.SessionRegistry.Remove(chatSession.SessionID);

            if (chatSession.Owner == null)
            {
                return;
            }

            chatSession.Owner.sessions.Remove(chatSession);

            Server.Logger.Info(String.Format("Session {0} of user {1} has disconnected.", chatSession.getAddress(), chatSession.Owner.Email));

            if (!chatSession.Owner.IsOnline())
            {
                ChatUserManager.MakeOffline(chatSession.Owner);
            }
        }
예제 #17
0
        public void FinalizeLogin(ChatUserProfile profile)
        {
            try
            {
                Owner = ChatUserManager.LoadUser(profile.ID);
            } catch
            {
                this.Disconnect();
            }

            ChatUserManager.MakeOnline(Owner);

            Owner.LastLogon = DateTime.UtcNow;
            Owner.sessions.Add(this);

            Protocol = protocolProvider.MainProtocol;

            //Notify
            Server.Logger.Info(String.Format("User {0} has logged in at {1}", Owner.Email, getAddress()));
        }
예제 #18
0
        public void Handle(ISession session)
        {
            ChatSession chatSession = session as ChatSession;

            UserSearchResponse response = new UserSearchResponse();
            List <String>      UserIDs  = new ChatUserStore().SearchUserIDByEmail(Email, (session as ChatSession).Owner);

            ConversationStore store = new ConversationStore();

            foreach (var item in UserIDs)
            {
                Guid         userId     = Guid.Parse(item);
                ChatUser     targetUser = ChatUserManager.LoadUser(userId);
                SearchResult result     = new SearchResult();

                result.ID         = targetUser.ID.ToString();
                result.FirstName  = targetUser.FirstName;
                result.LastName   = targetUser.LastName;
                result.IsOnline   = targetUser.IsOnline();
                result.LastLogout = targetUser.LastLogoff;


                result.PreviewCode    = -1;
                result.ConversationID = "~";

                var CommonConversation = targetUser.ConversationID.Intersect(chatSession.Owner.ConversationID);

                foreach (Guid id in CommonConversation)
                {
                    AbstractConversation conversation = store.Load(id);
                    if (conversation is SingleConversation)
                    {
                        result.ConversationID = conversation.ID.ToString();

                        AbstractMessage message =
                            conversation.MessagesID.Count > 0 ?
                            new MessageStore().Load(conversation.MessagesID.Last(), conversation.ID) :
                            null;
                        if (message == null)
                        {
                            break;
                        }

                        if (!message.Showable(chatSession.Owner.ID))
                        {
                            result.PreviewCode = 0;
                            break;
                        }

                        result.PreviewCode = message.GetPreviewCode();

                        if (message.GetPreviewCode() == 4)
                        {
                            result.LastMessage = (message as TextMessage).Message;
                        }

                        break;
                    }
                }

                if (chatSession.Owner.Relationship.ContainsKey(targetUser.ID))
                {
                    result.Relationship = (int)Relation.Get(chatSession.Owner.Relationship[targetUser.ID]).RelationType;
                }
                else
                {
                    result.Relationship = (int)Relation.Type.None;
                }

                response.Results.Add(result);
            }

            session.Send(response);
        }
예제 #19
0
        public void Execute(ISender commandSender, string commandLabel, string[] args)
        {
            if (args.Length < 3)
            {
                return;
            }

            string email = args[2];

            if (args[1] == "get")
            {
                Guid            id      = ProfileCache.Instance.ParseEmailToGuid(email);
                ChatUserProfile profile = ProfileCache.Instance.GetUserProfile(id);
                if (profile == null)
                {
                    PacChatServer.GetServer().Logger.Debug("NULL");
                }
                else
                {
                    PacChatServer.GetServer().Logger.Debug(profile.ID);
                }
            }

            if (args[1] == "add" && args.Length >= 4)
            {
                Random r = new Random();

                if (ProfileCache.Instance.ParseEmailToGuid(email) != Guid.Empty)
                {
                    PacChatServer.GetServer().Logger.Error("Create fail: email early existed!!!");
                    return;
                }

                Guid id = Guid.NewGuid();

                ChatUser user = new ChatUser()
                {
                    ID          = id,
                    Email       = email,
                    Password    = HashUtils.MD5(HashUtils.MD5(args[3]) + id),
                    FirstName   = "Admin",
                    LastName    = "Admin's lastname",
                    DateOfBirth = new DateTime(1998, r.Next(11) + 1, r.Next(29) + 1),
                    Gender      = Entity.EntityProperty.Gender.Male
                };

                bool added = user.Save();
                if (added)
                {
                    PacChatServer.GetServer().Logger.Info(String.Format("Account {0} has registered successfully. ID = {1}", user.Email, user.ID));
                }
                else
                {
                    PacChatServer.GetServer().Logger.Error("Create fail: Database error!!!");
                }
            }

            if (args[1] == "search" && args.Length >= 3)
            {
                //List<String> ids = new ChatUserStore().SearchUserIDByEmail(args[2]);
                //foreach (string s in ids)
                //{
                //    Console.WriteLine(s);
                //}
            }

            if (args[1] == "mkfriend" && args.Length >= 4)
            {
                Guid userID1 = ProfileCache.Instance.ParseEmailToGuid(args[2]);
                Guid userID2 = ProfileCache.Instance.ParseEmailToGuid(args[3]);

                if (userID1 == Guid.Empty || userID2 == Guid.Empty)
                {
                    PacChatServer.GetServer().Logger.Warn("One of two emails does not exist.");
                    return;
                }

                ChatUser user1 = ChatUserManager.LoadUser(userID1);
                ChatUser user2 = ChatUserManager.LoadUser(userID2);

                user1.SetRelation(user2, Relation.Type.Friend, true);
            }
        }
예제 #20
0
 public ChatController()
 {
     _chatmanager = new ChatUserManager();
 }
예제 #21
0
        public void Handle(ISession session)
        {
            ChatSession chatSession = session as ChatSession;

            ChatUser targetUser = ChatUserManager.LoadUser(TargetID);

            if (targetUser == null)
            {
                return;
            }

            ShortProfileResponse response = new ShortProfileResponse();

            response.ID         = targetUser.ID.ToString();
            response.FirstName  = targetUser.FirstName;
            response.LastName   = targetUser.LastName;
            response.IsOnline   = targetUser.IsOnline();
            response.LastLogout = targetUser.LastLogoff;

            ConversationStore store = new ConversationStore();

            response.PreviewCode    = -1;
            response.ConversationID = "~";

            var CommonConversation = targetUser.ConversationID.Intersect(chatSession.Owner.ConversationID);

            foreach (Guid id in CommonConversation)
            {
                AbstractConversation conversation = store.Load(id);
                if (conversation is SingleConversation)
                {
                    response.ConversationID = conversation.ID.ToString();

                    AbstractMessage message =
                        conversation.MessagesID.Count > 0 ?
                        new MessageStore().Load(conversation.MessagesID.Last(), conversation.ID) :
                        null;
                    if (message == null)
                    {
                        break;
                    }

                    if (!message.Showable(chatSession.Owner.ID))
                    {
                        response.PreviewCode = 0;
                        break;
                    }

                    response.PreviewCode = message.GetPreviewCode();

                    if (message.GetPreviewCode() == 4)
                    {
                        response.LastMess = (message as TextMessage).Message;
                    }

                    break;
                }
            }

            if (chatSession.Owner.Relationship.ContainsKey(targetUser.ID))
            {
                response.RelationshipType = (int)Relation.Get(chatSession.Owner.Relationship[targetUser.ID]).RelationType;
            }
            else
            {
                response.RelationshipType = (int)Relation.Type.None;
            }

            chatSession.Send(response);
        }