예제 #1
0
 public ChatRequest(RequestCode code, List<object> arguments, int id = 0, ChatResultCode status = ChatResultCode.InProgress)
 {
     Id = id;
     Code = code;
     Arguments = arguments;
     Status = status;
 }
예제 #2
0
        // 4 use in WebChatReceiver
        public List <User> GetData4GetAllUsers(string roomName, int requestId, out ChatResultCode errorCode)
        {
            List <User> result;

            errorCode = ChatResultCode.Ok;
            if (string.IsNullOrEmpty(roomName))
            {
                bool timeout;
                result = users.GetAll(lockTimeout, out timeout).Select(u => new User(u)).ToList();

                /*Logger.InfoFormat("GetData4GetAllUsers (no room) returs {0} items: {1}",
                 *                answer.Users, string.Join(", ", answer.Users.Select(u =>
                 *                                                                    string.Format("[{0}] \"{1}\"",
                 *                                                                                  u.ID, u.FullName))));*/
            }
            else
            {
                var room = rooms.Find(r => r.Name == roomName, r => new Room(r), lockTimeout);
                if (room == null)
                {
                    Logger.InfoFormat("[{1}]GetData4GetAllUsers: No room with name {0}", roomName, requestId);
                    errorCode = ChatResultCode.UnknownRoom;
                    return(null);
                }
                var userIds = usersAndRooms.GetAll(ur => ur.b == room.Id, lockTimeout).Select(ur => ur.a).ToList();
                result = users.GetAll(u => userIds.Contains(u.ID), lockTimeout).Select(u => new User(u)).ToList();

                /*Logger.InfoFormat("GetData4GetAllUsers ({0}) returs {1} items: {2}",
                 *                roomName, answer.Users, string.Join(", ", answer.Users.Select(u =>
                 *                                                                              string.Format(
                 *                                                                                  "[{0}] \"{1}\"",
                 *                                                                                  u.ID, u.FullName))));*/
            }
            return(result);
        }
예제 #3
0
        public static string GetChatResultCodeString(ChatResultCode code)
        {
            switch (code)
            {
            case ChatResultCode.InProgress:
                return("Выполняется");

            case ChatResultCode.Ok:
                return("Готово");

            case ChatResultCode.Error:
                return("Внутренняя ошибка");

            case ChatResultCode.CommunicationError:
                return("Ошибка связи");

            case ChatResultCode.ServerError:
                return("Внутренняя ошибка сервера");

            case ChatResultCode.UnknownUser:
                return("Пользователь не существует");

            case ChatResultCode.UnknownRoom:
                return("Комната не существует");

            case ChatResultCode.UserExists:
                return("Такой пользователь уже существует");

            case ChatResultCode.RoomExists:
                return("Такая комната уже существует");

            default:
                return("Unhandled ChatResultCode");
            }
        }
예제 #4
0
 public static string GetChatResultCodeString(ChatResultCode code)
 {
     switch (code)
     {
         case ChatResultCode.InProgress:
             return "Выполняется";
         case ChatResultCode.Ok:
             return "Готово";
         case ChatResultCode.Error:
             return "Внутренняя ошибка";
         case ChatResultCode.CommunicationError:
             return "Ошибка связи";
         case ChatResultCode.ServerError:
             return "Внутренняя ошибка сервера";
         case ChatResultCode.UnknownUser:
             return "Пользователь не существует";
         case ChatResultCode.UnknownRoom:
             return "Комната не существует";
         case ChatResultCode.UserExists:
             return "Такой пользователь уже существует";
         case ChatResultCode.RoomExists:
             return "Такая комната уже существует";
         default:
             return "Unhandled ChatResultCode";
     }
 }
예제 #5
0
 public ChatRequest(RequestCode code, List <object> arguments, int id = 0, ChatResultCode status = ChatResultCode.InProgress)
 {
     Id        = id;
     Code      = code;
     Arguments = arguments;
     Status    = status;
 }
예제 #6
0
 public ChatRequest(ChatRequest request)
 {
     Id = request.Id;
     Code = request.Code;
     Arguments = request.Arguments; // !!! arguments not copied
     Status = request.Status;
 }
예제 #7
0
 public ChatRequest(ChatRequest request)
 {
     Id        = request.Id;
     Code      = request.Code;
     Arguments = request.Arguments; // !!! arguments not copied
     Status    = request.Status;
 }
예제 #8
0
 private void ShowErrorInChat(DateTime time, ChatResultCode code, string comment = "")
 {
     if (code == ChatResultCode.Ok && string.IsNullOrEmpty(comment))
     {
         return;
     }
     ShowErrorInChat(time, Answer.GetChatResultCodeString(code) + ". " + comment);
 }
예제 #9
0
        public List <Room> GetData4GetRooms(int requestId, out ChatResultCode errorCode)
        {
            errorCode = ChatResultCode.Ok;
            bool timeoutFlag;
            // делаем копии (дескрипторов) комнат
            var result = rooms.GetAll(lockTimeout, out timeoutFlag).Select(r => new Room(r)).ToList();

            // и скрываем у них пароль
            result.ForEach(r => r.Password = new string('*', 8));
            return(result);
        }
예제 #10
0
        private void OnRequestStatusReceive(int requestId, ChatResultCode status)
        {
            ChatRequest request = null;

            /*if (!pendingRequestsLock.TryEnterReadLock(lockTimeout))
             * {
             *  Console.WriteLine("ChatSender.OnRequestStatusReceive: pendingRequestsReadLock timeout");
             *  return;
             * }*/
            try
            {
                if (!pendingRequests.ContainsKey(requestId))
                {
                    forwardAnswers.UpdateValues(requestId, status);
                    return;
                }
                request = pendingRequests.ReceiveValue(requestId);
                //request = pendingRequests[requestId];
                request.Status = status;
            }
            catch (Exception ex)
            {
                Logger.Info("ChatSender.OnRequestStatusReceive while reading", ex);
            }

            /*finally
             * {
             *  pendingRequestsLock.ExitReadLock();
             * }*/
            try
            {
                /*if (!pendingRequestsLock.TryEnterWriteLock(lockTimeout))
                 * {
                 *  Console.WriteLine("ChatSender.OnRequestStatusReceive: pendingRequestsWriteLock timeout");
                 *  return;
                 * }*/
                pendingRequests.Remove(requestId);
                //pendingRequestsLock.ExitWriteLock();
            }
            catch (Exception ex)
            {
                Logger.Info("ChatSender.OnRequestStatusReceive while removing", ex);
            }
            if (RequestProcessed != null && request != null)
            {
                RequestProcessed(request);
            }
        }
예제 #11
0
        public List <Message> GetData4GetPendingMessages(int userId, DateTime timeStamp, string roomName, int requestId, out ChatResultCode errorCode)
        {
            errorCode = ChatResultCode.Ok;
            var result      = new List <Message>();
            var newMessages = GetMessagesInternal(timeStamp);

            if (string.IsNullOrEmpty(roomName))
            {
                var roomIds   = usersAndRooms.GetAll(ur => ur.a == userId, lockTimeout).Select(ur => ur.b).ToList();
                var roomNames = rooms.GetAll(r => roomIds.Contains(r.Id), lockTimeout).Select(r => r.Name).ToList();
                // определяем все сообщения во всех комнатах, в которых сейчас находится пользователь
                result.AddRange(newMessages.Where(m => roomNames.Contains(m.Room)));
            }
            else
            {
                result.AddRange(newMessages.Where(m => m.Room == roomName));
            }
            return(result);
        }
예제 #12
0
 public Answer(int requestId, ChatResultCode status)
 {
     RequestId = requestId;
     Status = status;
 }
예제 #13
0
        public List <Message> GetData4GetPendingPrivateMessages(int currentUserId, int anotherUserId, DateTime timeStamp, int requestId, out ChatResultCode errorCode)
        {
            errorCode = ChatResultCode.Ok;
            var result      = new List <Message>();
            var newMessages = GetMessagesInternal(timeStamp).Where(m => string.IsNullOrEmpty(m.Room)).ToList();

            result.AddRange(newMessages.Where(m => (m.Sender == currentUserId) && (anotherUserId == 0 || m.Receiver == anotherUserId) ||
                                              (m.Receiver == currentUserId) && (anotherUserId == 0 || m.Sender == anotherUserId)));
            return(result);
        }
예제 #14
0
 public Answer()
 {
     Status = ChatResultCode.Ok;
 }
예제 #15
0
 public Answer()
 {
     Status = ChatResultCode.Ok;
 }
예제 #16
0
 private void ShowErrorInDialog(ChatResultCode code, string comment = "")
 {
     ShowErrorInDialog("Error: " + Answer.GetChatResultCodeString(code) + "\nComment: " + comment);
 }
예제 #17
0
 public Answer(int requestId, ChatResultCode status)
 {
     RequestId = requestId;
     Status    = status;
 }
예제 #18
0
 private void ShowErrorInChat(DateTime time, ChatResultCode code, string comment = "")
 {
     if (code == ChatResultCode.Ok && string.IsNullOrEmpty(comment))
         return;
     ShowErrorInChat(time, Answer.GetChatResultCodeString(code) + ". " + comment);
 }
예제 #19
0
 private void ShowErrorInDialog(ChatResultCode code, string comment = "")
 {
     ShowErrorInDialog("Error: " + Answer.GetChatResultCodeString(code) + "\nComment: " + comment);
 }
예제 #20
0
 private void OnRequestStatusReceive(int requestId, ChatResultCode status)
 {
     ChatRequest request = null;
     /*if (!pendingRequestsLock.TryEnterReadLock(lockTimeout))
     {
         Console.WriteLine("ChatSender.OnRequestStatusReceive: pendingRequestsReadLock timeout");
         return;
     }*/
     try
     {
         if (!pendingRequests.ContainsKey(requestId))
         {
             forwardAnswers.UpdateValues(requestId, status);
             return;
         }
         request = pendingRequests.ReceiveValue(requestId);
         //request = pendingRequests[requestId];
         request.Status = status;
     }
     catch (Exception ex)
     {
         Logger.Info("ChatSender.OnRequestStatusReceive while reading", ex);
     }
     /*finally
     {
         pendingRequestsLock.ExitReadLock();
     }*/
     try
     {
         /*if (!pendingRequestsLock.TryEnterWriteLock(lockTimeout))
         {
             Console.WriteLine("ChatSender.OnRequestStatusReceive: pendingRequestsWriteLock timeout");
             return;
         }*/
         pendingRequests.Remove(requestId);
         //pendingRequestsLock.ExitWriteLock();
     }
     catch (Exception ex)
     {
         Logger.Info("ChatSender.OnRequestStatusReceive while removing", ex);
     }
     if (RequestProcessed != null && request != null)
         RequestProcessed(request);
 }