Ejemplo n.º 1
0
        public async Task SendMessage(string user, string message)
        {
            if (string.IsNullOrWhiteSpace(user) || string.IsNullOrWhiteSpace(message))
            {
                return;
            }

            var chatroomMessage = new ChatRoomMessage
            {
                Username    = user,
                PublishedOn = DateTime.Now,
                Content     = message
            };

            this.db.ChatRoomMessages.Add(chatroomMessage);
            this.db.SaveChanges();

            await Clients.All.SendAsync("ReceiveMessage", user, message);
        }
        /// <summary>
        /// 通过审核.
        /// </summary>
        /// <param name="group"></param>
        /// <param name="messageID"></param>
        public void PassMessage(string group, long messageID)
        {
            // 取得当前用户.
            // 查询用户。
            var user = GetCurrentChatRoomUser();

            // 取得用户 ip地址.
            string ipAddress = IpGetter.GetIpAddress(HttpContext.Current.Request);

            if (!user.IsAdmin)
            {
                Clients.Client(Context.ConnectionId).showErrorMessage("权限不足!");
                return;
            }


            string resultMsg = null;

            // 通过审核.
            bool result = chatRoomMessageService.PassMessage(messageID, user.DisplayUserNickName, ipAddress, ref resultMsg);

            if (!result)
            {
                // 失败的情况下.
                Clients.Client(Context.ConnectionId).showErrorMessage(resultMsg);
                return;
            }
            // 成功的情况下, 通知所有的 客户端, 显示消息.


            // 查询数据库中的指定消息, 目的, 查询出关联信息.
            ChatRoomMessage dbMsg = chatRoomMessageService.GetChatRoomMessage(messageID);
            // 类型转换.
            var clientMsg = GetClientMessage(dbMsg);


            // 调用 客户端的 showNewMessage 方法.
            Clients.Group(group).showNewMessage(clientMsg);

            // 调用 管理员组的 PassMessageFinish(messageID) 方法.
            Clients.Group(GetAdminGroupCode(group)).passMessageFinish(messageID);
        }
Ejemplo n.º 3
0
        protected override async void Run(Session session, C2G_AddChatRoomMessage message, Action <G2C_AddChatRoomMessage> reply)
        {
            G2C_AddChatRoomMessage response = new G2C_AddChatRoomMessage();

            response.IsSuccess = false;
            try
            {
                DBProxyComponent dBProxyComponent = Game.Scene.GetComponent <DBProxyComponent>();

                ChatRoomMessage relationInfo = ComponentFactory.Create <ChatRoomMessage>();
                relationInfo._InvAccountID = message.AccountID;
                relationInfo._SendDate     = message.SendDate;
                relationInfo._ChatRoomID   = message.ChatRoomID;
                relationInfo._Message      = RepeatedFieldAndListChangeTool.RepeatedFieldToList(message.Message);

                await dBProxyComponent.Save(relationInfo);

                //添加到对应的聊天室中,并广播给聊天室中的所有成员
                var acounts = await dBProxyComponent.Query <ChatRoom>("{ '_id': " + message.ChatRoomID + "}");

                if (acounts.Count > 0)
                {
                    ChatRoom chatRoom = acounts[0] as ChatRoom;
                    chatRoom._DateMessageIDList.Add(relationInfo._SendDate + "|" + relationInfo.Id);

                    foreach (long item in chatRoom._UserList)
                    {
                        //广播给所有该聊天室用户
                        Log.Debug(MethodBase.GetCurrentMethod().DeclaringType.FullName + "." + MethodBase.GetCurrentMethod().Name + "广播给:" + item);
                    }
                }

                reply(response);
            }
            catch (Exception e)
            {
                response.Message = MethodBase.GetCurrentMethod().DeclaringType.FullName + "." + MethodBase.GetCurrentMethod().Name + "好友列表获取或创建失败,服务器维护中。";

                ReplyError(response, e, reply);
            }
        }
Ejemplo n.º 4
0
        public bool RefuseMessage(long messageID, string user, string ip, ref string resultMsg)
        {
            bool result = false;

            try
            {
                using (MyChatRoomContext context = new MyChatRoomContext())
                {
                    ChatRoomMessage message = context.ChatRoomMessages.Find(messageID);

                    if (message == null)
                    {
                        resultMsg = String.Format("消息 {0} 不存在!", messageID);
                        return(result);
                    }


                    message.AuditingBy = user;
                    message.AuditingIp = ip;

                    message.AuditingRefuse();
                    message.BeforeUpdateOperation(user);



                    // 物理保存.
                    context.SaveChanges();

                    // 如果能执行到这里, 认为处理成功.
                    result = true;
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                result    = false;
                resultMsg = ex.Message;
            }
            return(result);
        }
Ejemplo n.º 5
0
        public List <ChatRoomMessage> GetChatRoomMessageList(string houseID, string auditingFlag = null, long lastID = 0, int lastN = 50, int nearMin = 120)
        {
            using (MyChatRoomContext context = new MyChatRoomContext())
            {
                // 只查询 最近2小时的数据.
                DateTime minDateTime = DateTime.Now.AddMinutes(-1 * nearMin);


                var query =
                    from data in context.ChatRoomMessages
                    .Include("MessageSender.UserLevel").Include("ReplyMessage")
                    where
                    // 有效数据.
                    data.Status == ChatRoomMessage.STATUS_IS_ACTIVE
                    // 指定房间.
                    && data.HouseID == houseID
                    // 时间范围.
                    && data.LastUpdateTime > minDateTime
                    // 仅仅获取 全部的消息,忽略点对点消息。
                    // && data.MessageReceiverId == null
                    select data;



                // 最近一条消息.
                if (lastID > 0)
                {
                    ChatRoomMessage lastData = context.ChatRoomMessages.Find(lastID);

                    if (lastData != null)
                    {
                        // 最近一条数据存在.
                        DateTime lastDateTime = lastData.LastUpdateTime;
                        query = query.Where(p => p.LastUpdateTime >= lastDateTime && p.MessageID != lastID);
                    }
                }


                // 审核标志.
                if (auditingFlag != null)
                {
                    query = query.Where(p => p.AuditingFlag == auditingFlag);
                }

                // 创建时间逆序.
                query = query.OrderByDescending(p => p.LastUpdateTime);


                // 查询.
                List <ChatRoomMessage> resultList = query.Take(lastN).ToList();


                // 顺序反转.
                // 查询的时候, 是时间逆序, 取前 lastN  行.
                // 但是显示的时候, 还是需要 旧的消息放上面, 新的消息放下面.
                resultList.Reverse();


                return(resultList);
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 创建一个消息.
        /// </summary>
        /// <param name="message"></param>
        /// <param name="resultMsg"></param>
        /// <returns></returns>
        public bool CreateNewMessage(ChatRoomMessage message, ref string resultMsg)
        {
            bool result = false;

            try
            {
                using (MyChatRoomContext context = new MyChatRoomContext())
                {
                    // 检查 发消息用户.
                    ChatRoomUser user = context.ChatRoomUsers.Find(message.MessageSenderId);

                    if (user == null)
                    {
                        resultMsg = String.Format("用户 {0} 不存在!", message.MessageSenderId);
                        return(result);
                    }


                    if (user.IsGag)
                    {
                        resultMsg = String.Format("用户 {0} 已经被禁言!", user.UserName);
                        return(result);
                    }



                    // 如果指定了 接受者, 那么检查是否存在.
                    if (message.MessageReceiverId != null)
                    {
                        ChatRoomUser userTo = context.ChatRoomUsers.Find(message.MessageReceiverId);

                        if (userTo == null)
                        {
                            resultMsg = String.Format("用户 {0} 不存在!", message.MessageReceiverId);
                            return(result);
                        }
                    }


                    // 如果指定了 回复消息。 检查 回复消息是否存在.
                    if (message.ReplyMessageId != null)
                    {
                        ChatRoomMessage replyMessag = context.ChatRoomMessages.Find(message.ReplyMessageId.Value);
                        if (replyMessag == null)
                        {
                            resultMsg = String.Format("回复的消息 {0} 不存在!", message.ReplyMessageId);
                            return(result);
                        }

                        // 填写回复的  用户ID 与 昵称.
                        message.MessageReceiverId       = replyMessag.MessageSenderId;
                        message.MessageReceiverNickName = replyMessag.MessageSenderNickName;
                    }



                    // 获取消息发送的房间.
                    var house = context.ChatRoomHouses.Find(message.HouseID);
                    if (house == null)
                    {
                        resultMsg = String.Format("直播室房间 {0} 不存在!", message.HouseID);
                        return(result);
                    }

                    // 判断指定房间, 消息是否需要审核.
                    if (house.IsChatRoomMessageAutoPass)
                    {
                        // 直播室房间, 自动审核通过.
                        message.AuditingPass();

                        message.AuditingIp = "-";
                        message.AuditingBy = "AUTO";
                    }
                    else
                    {
                        // 直播室房间, 要求审核.

                        // 检查用户的属性.
                        if (user.IsAutoPass)
                        {
                            // 帐户能够直接审核通过.
                            message.AuditingPass();

                            message.AuditingIp = "-";
                            message.AuditingBy = "AUTO";
                        }
                        else
                        {
                            // 待审核.
                            message.AuditingFlag = "WAIT";
                        }
                    }


                    // 发送者头像, 按照用户等级来处理.
                    message.MessageSenderPhoto = "/images/level/" + user.UserLevel.UserLevelIcon;


                    // 发信人昵称.
                    if (String.IsNullOrEmpty(message.MessageSenderNickName))
                    {
                        message.MessageSenderNickName = user.UserNickName;
                    }



                    // 当前时间 - 两条短消息之间的间隔 秒数.
                    DateTime disableTime = DateTime.Now.AddSeconds(-1 * TwoMessageSecondLimit);

                    // 两条短消息之间的间隔 秒数.
                    var prevMessageQuery =
                        from data in context.ChatRoomMessages
                        where
                        // 同一 发送人.
                        data.MessageSenderId == message.MessageSenderId &&
                        data.MessageSenderNickName == message.MessageSenderNickName
                        // 仅仅判断今天的.
                        && data.CreateTime > disableTime
                        orderby
                        data.CreateTime descending
                        select data;


                    if (prevMessageQuery.Count() > 0)
                    {
                        // 存在有重复提交的情况.
                        resultMsg = "您消息发送得太频繁了......";
                        return(result);
                    }


                    message.BeforeInsertOperation("Web");

                    // 插入.
                    context.ChatRoomMessages.Add(message);


                    // 物理保存.
                    context.SaveChanges();

                    // 如果能执行到这里, 认为处理成功.
                    result = true;
                }
            }
            catch (System.Data.Entity.Validation.DbEntityValidationException dbErr)
            {
                logger.Info(message);

                foreach (var errItem in dbErr.EntityValidationErrors)
                {
                    foreach (var err in errItem.ValidationErrors)
                    {
                        logger.InfoFormat("{0} : {1}", err.PropertyName, err.ErrorMessage);
                    }
                }

                logger.Error(dbErr.Message, dbErr);
                result    = false;
                resultMsg = dbErr.Message;
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                result    = false;
                resultMsg = ex.Message;
            }
            return(result);
        }
        /// <summary>
        /// 发送消息.
        /// </summary>
        /// <param name="group"></param>
        /// <param name="message"></param>
        public void NewMessage(string group, string message, long?replyMessageId = null)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("NewMessage ( {0}, {1}, {2} ) Start!", group, message, replyMessageId);
            }


            if (String.IsNullOrEmpty(message) || String.IsNullOrWhiteSpace(message))
            {
                Clients.Client(Context.ConnectionId).showErrorMessage("消息为空!");
                return;
            }

            message = message.Trim();
            message = message.Replace("\n", "<br/>\n");

            if (message.Length > 500)
            {
                Clients.Client(Context.ConnectionId).showErrorMessage("消息超长!");
                return;
            }



            // 取得当前用户.
            // 查询用户。
            var user = UserList.SingleOrDefault(u => u.ContextID == Context.ConnectionId);

            // 取得用户 ip地址.
            string ipAddress = IpGetter.GetIpAddress(HttpContext.Current.Request);


            // 匿名用户的情况下,需要检查黑名单.
            //if (user.UserID == 1)
            //{
            //    if (this.chatRoomBlackNameList.Contains(ipAddress))
            //    {
            //        // 在黑名单里面.
            //        Clients.Client(Context.ConnectionId).showErrorMessage("网络连接上存在一些问题,请稍候再尝试!");

            //        if (logger.IsInfoEnabled)
            //        {
            //            logger.InfoFormat("黑名单用户 {0},尝试发送消息:{1} ", ipAddress, message);
            //        }
            //        return;
            //    }
            //}



            ChatRoomMessage chatroomMessage = new ChatRoomMessage()
            {
                // 房间ID.
                HouseID = group,

                // 发信人.
                MessageSenderId = user.UserID,

                // 发件人昵称.
                MessageSenderNickName = user.NickName,

                // 回复消息ID.
                ReplyMessageId = replyMessageId,

                // 消息内容.
                MessageContent = message,

                // IP.
                IpAddress = ipAddress,


                // 数据有效.
                IsActive = true,
            };


            string resultMsg = null;
            bool   result    = chatRoomMessageService.CreateNewMessage(chatroomMessage, ref resultMsg);

            if (!result)
            {
                // 消息发送失败.
                Clients.Client(Context.ConnectionId).showErrorMessage(resultMsg);
                return;
            }



            // 查询数据库中的指定消息, 目的, 查询出关联信息.
            ChatRoomMessage dbMsg = chatRoomMessageService.GetChatRoomMessage(chatroomMessage.MessageID);
            // 类型转换.
            var clientMsg = GetClientMessage(dbMsg);


            // 消息发送成功
            if (dbMsg.AuditingFlag == ChatRoomMessage.AUDITING_IS_PASS)
            {
                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("房间{0}, 用户{1}, 昵称{2}, 发送的消息{3}, 自动审核通过了!",
                                       group, user.UserID, user.NickName, message);
                }


                // 调用 客户端的 showNewMessage 方法.
                Clients.Group(group).showNewMessage(clientMsg);
            }
            else
            {
                // 需要审核的.

                if (logger.IsDebugEnabled)
                {
                    logger.DebugFormat("房间{0}, 用户{1}, 昵称{2}, 发送的消息{3}, 等待审核通过!",
                                       group, user.UserID, user.NickName, message);
                }


                // 调用 管理员组端的 showTodoMessage 方法.
                Clients.Group(GetAdminGroupCode(group)).showTodoMessage(clientMsg);
            }
        }
 public void Add(ChatRoomMessage msg)
 {
     _appDbContext.Add(msg);
     _appDbContext.SaveChanges();
 }
Ejemplo n.º 9
0
        public async Task <ChatRoomMessage> CreateAsync(ChatRoomMessage chatRoomMessage)
        {
            chatRoomMessage.Id = await _chatRoomMessageRepository.InsertAndGetIdAsync(chatRoomMessage);

            return(chatRoomMessage);
        }
        public static async Task Seed(IServiceScope serviceScope)
        {
            var redis         = serviceScope.ServiceProvider.GetService <IConnectionMultiplexer>();
            var redisDatabase = redis.GetDatabase();
            // We store a counter for the total users and increment it on each register
            var totalUsersKeyExist = await redisDatabase.KeyExistsAsync("total_users");

            if (!totalUsersKeyExist)
            {
                // This counter is used for the id
                await redisDatabase.StringSetAsync("total_users", 0);

                // Some rooms have pre-defined names. When the clients attempts to fetch a room, an additional lookup
                // is handled to resolve the name.
                // Rooms with private messages don't have a name
                await redisDatabase.StringSetAsync("room:0:name", "General");

                // Create demo data with the default users
                {
                    var           rnd          = new Random();
                    Func <double> rand         = () => rnd.NextDouble();
                    Func <int>    getTimestamp = () => (int)DateTimeOffset.Now.ToUnixTimeSeconds();

                    var demoPassword = "******";
                    var demoUsers    = new List <string>()
                    {
                        "Pablo", "Joe", "Mary", "Alex"
                    };

                    var greetings = new List <string>()
                    {
                        "Hello", "Hi", "Yo", "Hola"
                    };

                    var messages = new List <string>()
                    {
                        "Hello!",
                        "Hi, How are you? What about our next meeting?",
                        "Yeah everything is fine",
                        "Next meeting tomorrow 10.00AM",
                        "Wow that's great"
                    };
                    Func <string> getGreeting = () => greetings[(int)Math.Floor(rand() * greetings.Count)];
                    var           addMessage  = new Func <string, string, string, int, Task>(async(string roomId, string fromId, string content, int timeStamp) =>
                    {
                        var roomKey = $"room:{roomId}";
                        var message = new ChatRoomMessage()
                        {
                            From    = fromId,
                            Date    = timeStamp,
                            Message = content,
                            RoomId  = roomId
                        };
                        await redisDatabase.SortedSetAddAsync(roomKey, JsonSerializer.Serialize(message), message.Date);
                    });

                    var createUser = new Func <string, string, Task <User> >(async(string username, string password) =>
                    {
                        var usernameKey = $"username:{username}";
                        // Yeah, bcrypt generally ins't used in .NET, this one is mainly added to be compatible with Node and Python demo servers.
                        var hashedPassword = BCrypt.Net.BCrypt.HashPassword(password);
                        var nextId         = await redisDatabase.StringIncrementAsync("total_users");
                        var userKey        = $"user:{nextId}";
                        await redisDatabase.StringSetAsync(usernameKey, userKey);
                        await redisDatabase.HashSetAsync(userKey, new HashEntry[] {
                            new HashEntry("username", username),
                            new HashEntry("password", hashedPassword)
                        });

                        await redisDatabase.SetAddAsync($"user:{nextId}:rooms", "0");

                        return(new User()
                        {
                            Id = (int)nextId,
                            Username = username,
                            Online = false
                        });
                    });

                    var getPrivateRoomId = new Func <int, int, string>((user1, user2) =>
                    {
                        var minUserId = user1 > user2 ? user2 : user1;
                        var maxUserId = user1 > user2 ? user1 : user2;
                        return($"{minUserId}:{maxUserId}");
                    });

                    var createPrivateRoom = new Func <int, int, Task <ChatRoom> >(async(user1, user2) =>
                    {
                        var roomId = getPrivateRoomId(user1, user2);

                        await redisDatabase.SetAddAsync($"user:{user1}:rooms", roomId);
                        await redisDatabase.SetAddAsync($"user:{user2}:rooms", roomId);

                        return(new ChatRoom()
                        {
                            Id = roomId,
                            Names = new List <string> {
                                (await redisDatabase.HashGetAsync($"user:{user1}", "username")).ToString(),
                                (await redisDatabase.HashGetAsync($"user:{user2}", "username")).ToString(),
                            }
                        });
                    });


                    var users = new List <User>();
                    // For each name create a user.
                    foreach (var demoUser in demoUsers)
                    {
                        var user = await createUser(demoUser, demoPassword);

                        // This one should go to the session
                        users.Add(user);
                    }

                    var rooms = new Dictionary <string, ChatRoom>();
                    foreach (var user in users)
                    {
                        var otherUsers = users.Where(x => x.Id != user.Id);
                        foreach (var otherUser in otherUsers)
                        {
                            var      privateRoomId = getPrivateRoomId(user.Id, otherUser.Id);
                            ChatRoom room          = null;
                            if (!rooms.ContainsKey(privateRoomId))
                            {
                                room = await createPrivateRoom(user.Id, otherUser.Id);

                                rooms.Add(privateRoomId, room);
                            }
                            else
                            {
                                room = rooms[privateRoomId];
                            }
                            await addMessage(privateRoomId, otherUser.Id.ToString(), getGreeting(), (int)(getTimestamp() - rand() * 222));
                        }
                    }
                    var getRandomUserId = new Func <int>(() => users[(int)Math.Floor(users.Count * rand())].Id);
                    for (var messageIndex = 0; messageIndex < messages.Count; messageIndex++)
                    {
                        await addMessage("0", getRandomUserId().ToString(), messages[messageIndex], getTimestamp() - ((messages.Count - messageIndex) * 200));
                    }
                }
            }
        }
Ejemplo n.º 11
0
 public MessageData(ChatRoomMessage m)
 {
     Message = m.Message;
     User    = m.User;
     Date    = m.Date;
 }
Ejemplo n.º 12
0
 public ChatRoomMessageDAL(ChatRoomMessage Ca)
 {
     _ChatRoomMessages = Ca;
 }
Ejemplo n.º 13
0
 public ChatRoomMessageDAL(int Id)
 {
     Db = new SOKNAEntities();
     _ChatRoomMessages = Db.ChatRoomMessage.Single(r => r.Id == Id);
 }
Ejemplo n.º 14
0
 public ChatRoomMessageDAL()
 {
     _ChatRoomMessages = new ChatRoomMessage();
 }