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); }); }
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); }
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(); }