public LockSystemTest() { TimePeriodDefinition timePeriodDefinition = "20190211T080000Z/28800/DW(Mo+Tu+We+Th+Fr)/20190329T160000Z"; AccessPolicy accessPolicy = new AccessPolicy("000002oe1g25o", new NumberOfLockings(12, 45), new[] { timePeriodDefinition }); this.system = CreateEmptyLockSystem() .AddLock(new Lock(TorWestId, "W1", null, "Tor West")) .AddKey(new Key(KlausFenderId, "103-1", null, "Fender, Klaus")) .AddAccessPolicy(accessPolicy); }
private LockSystem ListEvents(LockSystem lockSystem, string replyTo, int jobId, DateTime?since) { lockSystem.Events .Select(@event => String.Join(',', FormatEvent(@event))) .Append("LER,OK") .ToObservable() .Aggregate((accu, current) => accu + "\n" + current) .Select(s => new Statement(replyTo, jobId, s)) .Subscribe(this.statementObserver); return(lockSystem); }
private LockSystem ListData(LockSystem lockSystem, string replyTo, int jobId) { lockSystem.Keys .Select(key => String.Join(',', FormatKey(key))) .Concat(lockSystem.Locks .Select(@lock => String.Join(',', FormatLock(@lock)))) .Append("LDR,OK") .ToObservable() .Aggregate((accu, current) => accu + "\n" + current) .Select(s => new Statement(replyTo, jobId, s)) .Subscribe(this.statementObserver); return(lockSystem); }
public void ConfigureServices(IServiceCollection services) { services .AddControllersWithViews() .AddNewtonsoftJson(); services.AddRazorPages(); services.AddSpaStaticFiles(spa => spa.RootPath = "ClientApp"); // In production, the React files will be served from this directory // services.AddSpaStaticFiles(spa =>spa.RootPath = "build"); services .AddSingleton <IDateTimeProvider>(new DateTimeProvider()) .AddSingleton <Id>(sp => new Id(sp.GetService <IDateTimeProvider>())) .AddSingleton(sp => new AtomicValue <LockSystem>(LockSystem.Create(sp.GetService <Id>()))) .AddSingleton <ISubject <Statement>, ReplaySubject <Statement> >() .AddSingleton <IObservable <Statement> >(sp => sp.GetService <ISubject <Statement> >().AsObservable()) .AddSingleton <IObserver <Statement> >(sp => sp.GetService <ISubject <Statement> >()) .AddSingleton <ISubject <Message>, ReplaySubject <Message> >() .AddSingleton <IObservable <Message> >(sp => sp.GetService <ISubject <Message> >().AsObservable()) .AddSingleton <IObserver <Message> >(sp => sp.GetService <ISubject <Message> >()) .AddSingleton <BrowserChannel>() .AddSingleton <MessageBusInteractor, MessageBusInteractor>() ; services.AddCors(options => { options.AddPolicy(MyAllowSpecificOrigins, builder => { builder // .WithOrigins("http://localhost","http://127.0.0.1") .AllowAnyMethod() .AllowAnyHeader() .AllowAnyOrigin() //.AllowCredentials() ; }); }); services .AddSignalR(options => { options.KeepAliveInterval = TimeSpan.FromSeconds(5); }) .AddMessagePackProtocol(); services .AddMqttService(this.configuration); }
public static void DisconnectClient(ClientStructure client, string reason = "") { if (!string.IsNullOrEmpty(reason)) { LunaLog.Debug($"{client.PlayerName} sent Connection end message, reason: {reason}"); } VesselUpdateRelaySystem.RemovePlayer(client); //Remove Clients from list if (ServerContext.Clients.ContainsKey(client.Endpoint)) { ServerContext.Clients.TryRemove(client.Endpoint, out client); LunaLog.Debug($"Online Players: {ServerContext.PlayerCount}, connected: {ServerContext.Clients.Count}"); } if (client.ConnectionStatus != ConnectionStatus.Disconnected) { client.ConnectionStatus = ConnectionStatus.Disconnected; LmpPluginHandler.FireOnClientDisconnect(client); if (client.Authenticated) { ChatSystem.RemovePlayer(client.PlayerName); var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <PlayerConnectionLeaveMsgData>(); msgData.PlayerName = client.PlayerName; MessageQueuer.RelayMessage <PlayerConnectionSrvMsg>(client, msgData); LockSystem.ReleasePlayerLocks(client); if (!ServerContext.Clients.Any(c => c.Value.Subspace == client.Subspace)) { WarpSystem.RemoveSubspace(client.Subspace); VesselRelaySystem.RemoveSubspace(client.Subspace); } } try { client.Connection?.Disconnect(reason); } catch (Exception e) { LunaLog.Debug($"Error closing client Connection: {e.Message}"); } ServerContext.LastPlayerActivity = ServerContext.ServerClock.ElapsedMilliseconds; } }
public static void DisconnectClient(ClientStructure client, string reason = "") { if (!string.IsNullOrEmpty(reason)) { LunaLog.Debug($"{client.PlayerName} sent Connection end message, reason: {reason}"); } if (client.ConnectionStatus != ConnectionStatus.Disconnected) { client.ConnectionStatus = ConnectionStatus.Disconnected; LmpPluginHandler.FireOnClientDisconnect(client); if (client.Authenticated) { var msgData = ServerContext.ServerMessageFactory.CreateNewMessageData <PlayerConnectionLeaveMsgData>(); msgData.PlayerName = client.PlayerName; MessageQueuer.RelayMessage <PlayerConnectionSrvMsg>(client, msgData); LockSystem.ReleasePlayerLocks(client); WarpSystem.RemoveSubspace(client.Subspace); } try { client.Connection?.Disconnect(reason); } catch (Exception e) { LunaLog.Error($"Error closing client Connection: {e.Message}"); } } //Remove Clients from list if (ServerContext.Clients.TryRemove(client.Endpoint, out ClientStructure removed)) { LunaLog.Debug($"Online Players: {ServerContext.PlayerCount}, connected: {ServerContext.Clients.Count}"); } else { LunaLog.Error($"Error removing client: {client.PlayerName} from list"); } //As this is the last client that is connected to the server, run a safety backup once he disconnects if (ServerContext.Clients.Count == 0) { BackupSystem.RunBackup(); GcSystem.PerformGCNow(); } }
public void TestDefineLockAfterCreate() { const string lockName = "100"; var extData = $"{lockName}, Meeting Room, Administration\0".ToBase64(); var system = CreateEmptyLockSystem() .DefineStatement($"CL,APP,{lockName}"); Func <string, string> getId = name => system.Locks.SingleOrDefault(@lock => @lock.Name == name)?.Id; system = system .DefineStatement($"DL,{getId(lockName)},,,{extData}"); Assert.Equal(1, system.Locks.Count()); var lock_100 = system.Locks.First(x => x.Name == lockName); Assert.Equal("040000rbookls", lock_100.Id); Assert.Equal(lockName, lock_100.Name); Assert.Equal("APP", lock_100.AppId); Assert.Equal($"{lockName}, Meeting Room, Administration", lock_100.ExtData); }
public void TestDefineKeyAfterCreate() { const string keyName = "103-1"; var extData = $"{keyName}, Fender, Klaus\0".ToBase64(); var system = CreateEmptyLockSystem() .DefineStatement($"CK,APP,{keyName}"); Func <string, string> getId = name => system.Keys.SingleOrDefault(key => key.Name == name)?.Id; system = system .DefineStatement($"DK,{getId(keyName)},,,{extData}"); Assert.Equal(1, system.Keys.Count()); var key_103_1 = system.Keys.First(x => x.Name == keyName); Assert.Equal("040000jbookls", key_103_1.Id); Assert.Equal(keyName, key_103_1.Name); Assert.Equal("APP", key_103_1.AppId); Assert.Equal($"{keyName}, Fender, Klaus", key_103_1.ExtData); }
public bool Check(string keyId, string lockId, DateTime dateTime) { dateTime = dateTime.ToUniversalTime(); logger.LogInformation("key {Key} , Lock {Lock}, DateTime {DateTime}", keyId, lockId, dateTime); LockSystem system = lockSystem; Key key = system.QueryKey(keyId); Lock @lock = system.QueryLock(lockId); var @event = new Event(this.idGenerator.NewId(TableIds.Event, system.Events.Count() + 1), dateTime, key, @lock, system.HasAccess(key, @lock, dateTime)); // statementObserver.OnNext(new Statement(TOPIC_RESPONSE, 4711, // $"EK,{@event.Lock.Id},{@event.Key.Id},{@event.IsOpen}")); lockSystem.SetValue(x => x.AddEvent(@event)); return(@event.EventType == EventType.Authorized_Access); }
public void TestDeltaLockNewSystem() { const string lockName = "100"; const string keyName = "103-1"; var system_t0 = CreateEmptyLockSystem(); var system_t1 = system_t0 .DefineStatement($"CL,APP,{lockName}") .DefineStatement($"CK,APP,{keyName}"); var newEntities = LockSystem.CreatedEntities(system_t0, system_t1); Assert.Equal(2, newEntities.Count()); Assert.Equal(lockName, newEntities.OfType <Lock>().Single().Name); Assert.Equal(keyName, newEntities.OfType <Key>().Single().Name); var oldEntities = LockSystem.RemovedEntities(system_t1, system_t0); Assert.Equal(2, oldEntities.Count()); Assert.Equal(lockName, oldEntities.OfType <Lock>().Single().Name); Assert.Equal(keyName, oldEntities.OfType <Key>().Single().Name); }
private void SetMenuOptions(int actorID, int itemID) { if (!MenuSystem.RemoveOptions(actorID, AllMenuOptions)) { return; } if (ActionSystem.IsBusy(actorID)) { return; } if (!ItemWithinRange(MenuSystem.DistanceToTarget(actorID))) { return; } if (LockSystem.IsLocked(itemID)) { return; } MenuSystem.AddOption(actorID, IsOpen(itemID) ? RPGGameEvent.Menu_Close : RPGGameEvent.Menu_Open); }
private void OnMenuUseKey(GameEvent e) { var data = (MenuSystem.MenuOptionSelected)e.EventData; TimedActionStarted(data.ActorID, RPGGameEvent.Menu_UseKey, LockSystem.ActionTimeToUseKey(data.ItemID), true, data.ItemID); }
private void Receive(string replyTo, int jobId, string message) { this.logger.LogInformation($"Receive('{replyTo}', {jobId.ToHex()}, '{message.Shorten()}')"); LockSystem systemBefore = lockSystem; LockSystem systemAfter = message.Split("\n") .Where(x => !string.IsNullOrWhiteSpace(x)) .Aggregate(systemBefore, (accu, current) => { int index = current.IndexOf(','); string head = index == -1 ? current : current.Substring(0, index); if (head.Equals("LE")) { return(ListEvents(accu, replyTo, jobId, null)); } else if (head.Equals("LD")) { return(ListData(accu, replyTo, jobId)); } else { return(accu.DefineStatement(current)); } }); lockSystem.SetValue(x => systemAfter); if (systemBefore != systemAfter) { var statements = LockSystem.CreatedEntities(systemBefore, systemAfter).Select(entity => { switch (entity) { case Key key: return(DefinedKey(key)); case Lock @lock: return(DefinedLock(@lock)); case AccessPolicy accessPolicy: return(DefinedAccessPolicy(accessPolicy)); case PolicyAssignment assignment: return(DefinedAssignment(assignment)); default: throw new ArgumentException( message: "Missing 'DefinedXXX' operation for entity", paramName: nameof(entity)); } }).Concat(LockSystem.RemovedEntities(systemBefore, systemAfter).Select(entity => { switch (entity) { case Key key: return(RemovedKey(key)); case Lock @lock: return(RemovedLock(@lock)); default: throw new ArgumentException( message: "Missing 'RemovedXXX' operation for entity", paramName: nameof(entity)); } })).Concat(LockSystem.UpdatedEntities(systemBefore, systemAfter).Select(entity => { switch (entity) { case Key key: return(UpdatedKey(key)); case Lock @lock: return(UpdatedLock(@lock)); default: throw new ArgumentException( message: "Missing 'UpdatedXXX' operation for entity", paramName: nameof(entity)); } })); if (!statements.IsEmpty()) { statements .ToObservable() .Aggregate((accu, current) => accu + "\n" + current) .Select(s => new Statement(replyTo, jobId, s)) .Subscribe(this.statementObserver); } } }
private LockSystem CreateEmptyLockSystem() => LockSystem.Create(new Id("2020-01-23T16:14:35".FakeNow()));
public IEnumerable <PersonInfo> Persons() { logger.LogInformation("Persons called"); LockSystem system = lockSystem; if (system.Keys.IsEmpty()) { yield break; } else { Func <string, string> GetId = x => system.Keys.SingleOrDefault(y => y.ExtData.Contains(x))?.Id; yield return(new PersonInfo { keyId = GetId("900-1"), value = "900-1", label = "Ahrens, Andrea", department = "Geschäftsführung", color = "OliveDrab" }); yield return(new PersonInfo { keyId = GetId("901-1"), value = "901-1", label = "Barthauer, Thomas", department = "Geschäftsführung", color = "SandyBrown" }); yield return(new PersonInfo { keyId = GetId("103-1"), value = "103-1", label = "Fendler, Klaus", department = "Buchhaltung" }); yield return(new PersonInfo { keyId = GetId("104-1"), value = "104-1", label = "Kistler, Sabine", department = "Vertrieb" }); yield return(new PersonInfo { keyId = GetId("105-1"), value = "105-1", label = "Kohl, Ulrich", department = "Vertrieb" }); yield return(new PersonInfo { keyId = GetId("200-1"), value = "200-1", label = "Leinkamp, Sebastian", department = "Lager" }); yield return(new PersonInfo { keyId = GetId("201-1"), value = "201-1", label = "Mertens, Martina", department = "Lager" }); yield return(new PersonInfo { keyId = GetId("202-1"), value = "202-1", label = "Sidow, Janin", department = "Montage" }); yield return(new PersonInfo { keyId = GetId("203-1"), value = "203-1", label = "Walter, Jens", department = "Montage" }); yield return(new PersonInfo { keyId = GetId("203-2"), value = "203-2", label = "Winter, Sina", department = "Montage" }); yield return(new PersonInfo { keyId = GetId("203-3"), value = "203-3", label = "Wondraschek, Volker", department = "Montage" }); } }
public IEnumerable <GroupOrDoor> Doors() { logger.LogInformation("Doors called"); LockSystem system = lockSystem; if (system.Locks.IsEmpty()) { yield break; } else { Func <string, string> GetId = x => system.Locks.SingleOrDefault(y => y.ExtData.Contains(x))?.Id; yield return(new DoorInfo { lockId = GetId("W1"), value = "W1", label = "Tor West", building = "-.-", image = "tor_west", color = "LightSlateGray" }); yield return(new GroupInfo { type = "group", name = "Verwaltung", items = new [] { new DoorInfo { lockId = GetId("100"), value = "100", label = "Konferenzraum", building = "Verwaltung", image = "konferenzraum", color = "Yellow" }, new DoorInfo { lockId = GetId("101"), value = "101", label = "Büro Ahrens", building = "Verwaltung", image = "buero_ahrens", color = "Yellow" }, new DoorInfo { lockId = GetId("102"), value = "102", label = "Büro Barthauer", building = "Verwaltung", image = "buero_barthauer", color = "Yellow" }, new DoorInfo { lockId = GetId("103"), value = "103", label = "Buchhaltung", building = "Verwaltung", image = "buchhaltung", color = "Yellow" }, new DoorInfo { lockId = GetId("104"), value = "104", label = "Büro Vertrieb 1", building = "Verwaltung", image = "buero_vertrieb1", color = "Yellow" }, new DoorInfo { lockId = GetId("105"), value = "105", label = "Büro Vertrieb 2", building = "Verwaltung", image = "buero_vertrieb2", color = "Yellow" }, new DoorInfo { lockId = GetId("Z1"), value = "Z1", label = "Eingang West", building = "Verwaltung", image = "eingang_west", color = "Yellow" } } }); yield return(new GroupInfo { type = "group", name = "Produktion", items = new [] { new DoorInfo { lockId = GetId("204"), value = "204", label = "Werkhalle West", building = "Produktion", image = "werkhalle_west", color = "DeepSkyBlue" }, new DoorInfo { lockId = GetId("200"), value = "200", label = "Metalllager", building = "Produktion", image = "metalllager", color = "DeepSkyBlue" }, new DoorInfo { lockId = GetId("202"), value = "202", label = "Büro Montage", building = "Produktion", image = "buero_montage", color = "DeepSkyBlue" }, new DoorInfo { lockId = GetId("201"), value = "201", label = "Warenlager", building = "Produktion", image = "warenlager", color = "DeepSkyBlue" }, new DoorInfo { lockId = GetId("205"), value = "205", label = "Werkhalle Süd", building = "Produktion", image = "werkhalle_sued", color = "DeepSkyBlue" } } }); } }