Пример #1
0
        public void Process(Context context)
        {
            var friends = context.Server.Database.QueryFriends(owner);

            friends.ForEach(f =>
            {
                UserIds.Add(f.UserId);
                Usernames.Add(f.Username);
                Nicks.Add(f.Nickname);
            });
        }
Пример #2
0
 public IContextInserter InsertAt(string timestamp)
 {
     _cachedTime = TestHelper.Parse(timestamp);
     CachedNick  = timestamp;
     if (Nicks.Contains(CachedNick))
     {
         throw new Exception("Nicks/timestamps must be unique. If you want messages with the same timestamp, zero pad them.");
     }
     Nicks.Add(CachedNick);
     return(this);
 }
Пример #3
0
        private void MainLoop()
        {
            foreach (var port in Options.ServerPorts)
            {
                _localEndPoint = new IPEndPoint(IPAddress.Any, port);
                var connectSocket = new Socket(_localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

                connectSocket.Bind(_localEndPoint);
                connectSocket.Listen(20);

                Sockets.Add(connectSocket, new UserInfo(this, connectSocket, Options.ServerName, true, true));
            }

            while (_connected)
            {
                try
                {
                    var activeSockets = new List <Socket>(Sockets.Keys);

                    Socket.Select(activeSockets, null, null, 2000000);

                    foreach (Socket s in activeSockets)
                    {
                        try
                        {
                            if (Sockets[s].IsAcceptSocket)
                            {
                                Socket temp = s.Accept();
                                Sockets.Add(temp, new UserInfo(this, temp, ((IPEndPoint)temp.RemoteEndPoint).Address.ToString(), false, String.IsNullOrEmpty(Options.ServerPass)));
                                Logger.Log("New Client connected!", 4, "MainLoop");
                            }
                            else
                            {
                                try
                                {
                                    _buffer.Initialize();
                                    int numBytes = s.ReceiveFrom(_buffer, ref _ep);
                                    foreach (string line in Encoding.UTF8.GetString(_buffer, 0, numBytes).Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
                                    {
                                        Parser(line, Sockets[s]);
                                    }
                                }
                                catch (SocketException e)
                                {
                                    Logger.Log("ERROR:  (Socket reset) " + e.Message + "(CODE:" + e.ErrorCode + ")", 4, "E1" + Sockets[s].Nick);
                                    Sockets[s].Remove("Socket reset by peer (" + e.ErrorCode + ")");
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            Logger.Log("Unknown ERROR: " + e.Message, 4, "E2" + Sockets[s].Nick);
                            Logger.Log("Trace: " + e.StackTrace);
                        }
                    }

                    // Pinger : we only ping if necessary
                    foreach (var user in from user in Sockets.Where(s => s.Value.Registered)
                             let interval = DateTime.Now.AddMinutes(-1)
                                            where user.Value.LastAction < interval && user.Value.LastAlive < interval
                                            select user.Value)
                    {
                        if (user.LastAlive < DateTime.Now.AddMinutes(-5))
                        {
                            // Ping Timeout (5 Minutes without any life sign)
                            user.Remove("Ping Timeout");
                        }
                        else if (user.LastAlive < DateTime.Now.AddMinutes(-1) && user.LastPing < DateTime.Now.AddMinutes(-1))
                        {
                            user.LastPing = DateTime.Now;
                            Commands.Send(new PingArgument(user));
                        }
                    }
                }
                catch (Exception e)
                {
                    Logger.Log("Unknown ERROR: " + e.Message);
                    Logger.Log("Trace: " + e.StackTrace);
                }
            }

            // QUIT Server
            foreach (var user in Sockets.Values.Where(u => !u.IsAcceptSocket).ToArray())
            {
                user.Remove("Server Shutdown");
            }

            foreach (var serverSocket in Sockets.Values)
            {
                serverSocket.Socket.Close(5);
            }

            Sockets.Clear();
            Channels.Clear();
            Nicks.Clear();
            GC.Collect();
        }