コード例 #1
0
 public List <Message> GetMessages(string room)
 {
     if (!postedMessages.ContainsKey(room))
     {
         return(new List <Message>());
     }
     return(postedMessages.ReceiveValue(room).Select(m => new Message(m)).ToList());
 }
コード例 #2
0
        // pushing message in local message storage in time order
        private void AddMessageToStorage(Message message)
        {
            var newMessage = new Message(message);

            if (newMessage.Receiver != 0)
            {
                newMessage.Room = "";
            }

            if (!messages.ContainsKey(newMessage.Room))
            {
                messages.UpdateValues(newMessage.Room, new List <Message>());
            }
            var messagesInRoom = messages.ReceiveValue(newMessage.Room);  // !!! unsafe

            if (messagesInRoom.Count == 0 || messagesInRoom[messagesInRoom.Count - 1].TimeStamp >= newMessage.TimeStamp)
            {
                messagesInRoom.Add(newMessage);
            }
            else
            {
                var index = messagesInRoom.FindLastIndex(m => m.TimeStamp <= newMessage.TimeStamp);
                messagesInRoom.Insert(index + 1, newMessage);
            }
            messages.UpdateValues(newMessage.Room, messagesInRoom);
        }
コード例 #3
0
 public string GetRoomPassword(string room)
 {
     if (roomPasswords.ContainsKey(room))
     {
         return(roomPasswords.ReceiveValue(room));
     }
     return("");
 }
コード例 #4
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);
            }
        }
コード例 #5
0
        private void DoSend()
        {
            Chat            = new ChatClientStable(chatCallback, TerminalBindings.Chat);
            Chat.Connected += () => { if (Connected != null)
                                      {
                                          Connected();
                                      }
            };
            Chat.Disconnected += () => { if (Disconnected != null)
                                         {
                                             Disconnected();
                                         }
            };
            UserInfoSource = new UserInfoExCache(TradeSharpAccountStatistics.Instance.proxy);
            while (!isStopping)
            {
                bool timeoutFlag;
                var  allRequests = requests.ExtractAll(lockTimeout, out timeoutFlag);
                if (timeoutFlag)
                {
                    continue;
                }
                // флаг повтора запроса;
                // перезапросы возникают из-за ошибок сети;
                // в этом случае ожидание между запросами увеличено, чтобы не загружать проц без пользы
                var repeatRequest = false;
                foreach (var request in allRequests)
                {
                    try
                    {
                        switch (request.Code)
                        {
                        case RequestCode.GetAllUsers:
                            request.Id = Chat.GetAllUsers((string)request.Arguments[0]);
                            break;

                        case RequestCode.Enter:
                            request.Id = Chat.Enter((User)request.Arguments[0]);
                            break;

                        case RequestCode.Exit:
                            request.Id = Chat.Exit();
                            break;

                        case RequestCode.GetRooms:
                            request.Id = Chat.GetRooms();
                            break;

                        case RequestCode.EnterRoom:
                            request.Id = Chat.EnterRoom((string)request.Arguments[0], (string)request.Arguments[1]);
                            break;

                        case RequestCode.MoveToRoom:
                            request.Id = Chat.MoveToRoom((int)request.Arguments[0], (string)request.Arguments[1],
                                                         (string)request.Arguments[2]);
                            break;

                        case RequestCode.LeaveRoom:
                            request.Id = Chat.LeaveRoom((string)request.Arguments[0]);
                            break;

                        case RequestCode.CreateRoom:
                            request.Id = Chat.CreateRoom((Room)request.Arguments[0]);
                            break;

                        case RequestCode.DestroyRoom:
                            request.Id = Chat.DestroyRoom((string)request.Arguments[0]);
                            break;

                        case RequestCode.SendPrivateMessage:
                            request.Id = Chat.SendPrivateMessage((int)request.Arguments[0],
                                                                 (string)request.Arguments[1]);
                            break;

                        case RequestCode.SendMessage:
                            request.Id = Chat.SendMessage((string)request.Arguments[0],
                                                          (string)request.Arguments[1]);
                            break;

                        case RequestCode.GetPendingMessages:
                            request.Id = Chat.GetPendingMessages((DateTime)request.Arguments[0],
                                                                 (string)request.Arguments[1]);
                            break;

                        case RequestCode.GetPendingPrivateMessages:
                            request.Id = Chat.GetPendingPrivateMessages((DateTime)request.Arguments[0],
                                                                        (int)request.Arguments[1]);
                            break;

                        case RequestCode.Ping:
                            Chat.Ping();
                            break;

                        case RequestCode.GetUserInfoEx:
                            var userinfo = UserInfoSource.GetUserInfo((int)request.Arguments[0]);
                            if (UserInfoExReceived != null)
                            {
                                UserInfoExReceived(userinfo ?? new UserInfoEx {
                                    Id = (int)request.Arguments[0]
                                });
                            }
                            break;

                        case RequestCode.SetUserInfoEx:
                            UserInfoSource.SetUserInfo((UserInfoEx)request.Arguments[0]);
                            break;
                        }
                        if (request.Id == 0)
                        {
                            QueueRequest(request); // if server refused request - try again
                            repeatRequest = true;
                        }
                        else if (request.Id != -1) // skip Ping, GetUserInfoEx, SetUserInfoEx
                        {
                            request.Status = ChatResultCode.InProgress;
                            pendingRequests.UpdateValues(request.Id, request);

                            /*if (pendingRequestsLock.TryEnterWriteLock(lockTimeout))
                             * {
                             *  pendingRequests.Add(request.Id, request);
                             *  pendingRequestsLock.ExitWriteLock();
                             * }
                             * else
                             *  Console.WriteLine("ChatSender.DoSend: pendingRequestsWriteLock timeout");*/
                            var requestCopy = new ChatRequest(request);
                            if (RequestQueuedOnServer != null)
                            {
                                RequestQueuedOnServer(requestCopy);
                            }
                            if (forwardAnswers.ContainsKey(request.Id))
                            {
                                pendingRequests.Remove(request.Id);
                                requestCopy.Status = forwardAnswers.ReceiveValue(request.Id);
                                if (RequestProcessed != null)
                                {
                                    RequestProcessed(requestCopy);
                                }
                                forwardAnswers.Remove(request.Id);
                            }
                        }
                    }
                    catch (Exception ex) // probably communication error
                    {
                        Logger.ErrorFormat("DoSend exception: {0}", ex);
                        if (request.Code != RequestCode.Ping)
                        {
                            QueueRequest(request);
                        }
                        repeatRequest = true;
                    }
                }

                //проверка соединения - ping
                if (allRequests.Count == 0)
                {
                    if (DateTime.Now.Subtract(lastConnectionCheck.GetLastHit()).TotalSeconds > 15)
                    {
                        var request = new ChatRequest(RequestCode.Ping, new List <object>(), -1);
                        QueueRequest(request);
                        lastConnectionCheck.Touch();
                    }
                }

                Thread.Sleep(repeatRequest ? 1000 : 100);
            }
        }