public Task AddSingleEntityConnection(VersaCommsID destinationID, string connectionID)
        {
            if (Store.ConnectionGroupings.GetOrAdd(destinationID, ImmutableList.Create <string>()).Contains(connectionID)
                )
            {
                return(Task.CompletedTask);
            }

            Store.ConnectionGroupings.AddOrUpdate(destinationID, ImmutableList.Create <string>().Add(connectionID),
                                                  (k, l) => l.Add(connectionID));

            var AddTasks = new List <Task>
            {
                hubContext.Groups.AddToGroupAsync(connectionID, "versagen_" + destinationID)
            };

            foreach (var item in Store.groupItems)
            {
                if (item.Value.Contains(destinationID))
                {
                    AddTasks.Add(hubContext.Groups.AddToGroupAsync(connectionID, "versagen_" + item.Key));
                }
            }
            return(Task.WhenAll(AddTasks));
        }
예제 #2
0
 public DefaultScopedServicesFactory(VersaCommsID id, IServiceProvider baseProvider,
                                     IServiceProvider scenarioProvider)
 {
     this.baseProvider     = baseProvider;
     this.scenarioProvider = scenarioProvider;
     this.id = id;
 }
예제 #3
0
 public IdentityPlayer(VersaCommsID newID) : this()
 {
     if (newID.IdType != EVersaCommIDType.User)
     {
         throw new ArgumentOutOfRangeException(nameof(newID), "Object was not provided a User ID value.");
     }
 }
예제 #4
0
 public IdentityPlayer()
 {
     VersaID         = VersaCommsID.FromEnum(EVersaCommIDType.User, 0);
     Currencies      = new Dictionary <int, int>();
     OwnedCharacters = new List <VersaCommsID>();
     PlayerInventory = new List <IItem>();
 }
예제 #5
0
        public void TestConfig()
        {
            var one = VersaCommsID.FromEnum(EVersaCommIDType.User, ulong.MinValue);
            var two = VersaCommsID.FromEnum(EVersaCommIDType.User, ulong.MaxValue);

            Assert.True(true);
        }
예제 #6
0
 public VersaSignalRWriter(VersaCommsID destID, IClientProxy sender, string functionName, HtmlEncoder encoder)
 {
     DestinationID     = destID;
     proxy             = sender;
     this.functionName = functionName;
     Encoder           = encoder;
 }
 public IVersaGroupWriter GetOrCreateGroup(VersaCommsID id)
 {
     if (!Store.groupItems.ContainsKey(id))
     {
         Store.groupItems.AddOrUpdate(id, ImmutableList.Create <VersaCommsID>(), (k, l) => l);
     }
     return(new SignalRVersaGroupWriter <THub>(id, this,
                                               hubContext.Clients.Group("versagen_" + id), config.NameOfWriterFunction, encoder));
 }
예제 #8
0
 public static ModelBuilder SupportIPlayerIdentity <TIdentity, TKey>(this ModelBuilder b) where TIdentity : IdentityUser <TKey>, IPlayer where TKey : IEquatable <TKey>
 {
     b.HasSequence <long>("IDEnumerator", "versagen")
     .IncrementsBy(1)
     .StartsAt(Convert.ToInt64(VersaCommsID.FromEnum(EVersaCommIDType.User, ulong.MinValue)))
     .HasMax(Convert.ToInt64(VersaCommsID.FromEnum(EVersaCommIDType.User, ulong.MaxValue)))
     .IsCyclic();
     b.ApplyConfiguration(new IdentityPlayerConfig <TIdentity, TKey>());
     return(b);
 }
예제 #9
0
        public Entity(VersaCommsID Id, IEnumerable <IVersaCommand> initCommands = default, IReaction[] reactions = default)
        {
            this.Id   = Id;
            Reactions = reactions;

            ActAsCommands = new CommandGroup("self", "/commands/self/" + Id);
            ActAsCommands.Preconditions.Add(new LambdaRule("IsEntity", "", (context, provider) => Task.FromResult((context.ActingEntity == this, "wrongEntity"))));
            initCommands.ForEach(x => ActAsCommands.TryAdd(x));
            Stats   = new ConcurrentDictionary <string, IStat>();
            _owners = new List <VersaCommsID>();
        }
예제 #10
0
        protected virtual VersaCommsID CreateNewUser(TExternalID externalUser)
        {
            //TODO: fire off other functions needed to create a new user, like creating tables for them in the database and such.
            var rand = new Random();

            byte[] buf = new byte[8];
            rand.NextBytes(buf);
            ulong resul = BitConverter.ToUInt64(buf, 0);

            return(VersaCommsID.FromEnum(EVersaCommIDType.User, resul));
        }
 public bool DeleteGroupWriter(VersaCommsID id)
 {
     if (!Store.groupItems.ContainsKey(id))
     {
         return(false);
     }
     foreach (var x in Store.groupItems[id])
     {
         RemoveFromSignalRConnection(id, x).Wait();
     }
     Store.groupItems.Remove(id, out _);
     return(true);
 }
 public Task RemoveFromSignalRConnection(VersaCommsID groupID, VersaCommsID connectionGroupingID)
 {
     if (!Store.ConnectionGroupings.ContainsKey(connectionGroupingID))
     {
         return(Task.CompletedTask);
     }
     if (Store.groupItems.ContainsKey(groupID))
     {
         Store.groupItems.AddOrUpdate(groupID, ImmutableList.Create <VersaCommsID>(), (k, l) => l.Remove(connectionGroupingID));
     }
     return(Task.WhenAll(Store.ConnectionGroupings[connectionGroupingID]
                         .Select(c => hubContext.Groups.RemoveFromGroupAsync(c, "versagen_" + groupID))));
 }
예제 #13
0
        public async void AsyncDisposeTest()
        {
            pipe = new EventPipe();
            var endThing = new TaskCompletionSource <bool>();
            var disposer = new RefCountDisposable(Disposable.Create(() => endThing.SetResult(true)));

            for (var i = 0; i < 100; i++)
            {
                pipe.ObserveFirst.Subscribe(new TestObserver(i, outp, "first", disposer.GetDisposable()));
                pipe.ObserveConcurrent.Subscribe(new TestObserver(i, outp, "reader", disposer.GetDisposable()));
                pipe.ObserveSynchronous.Subscribe(new TestObserver(i, outp, "writer", disposer.GetDisposable()));
            }
            disposer.Dispose();
            //var testTask = new List<Task>();
            var totalDisposer = new RefCountDisposable(Disposable.Create(() => pipe.Complete()));
            var rand          = new Random();

            Parallel.ForEach(Enumerable.Range(0, 99), async x =>
            {
                using (totalDisposer.GetDisposable())
                {
                    using (var scp = testProv.CreateScope())
                    {
                        var e = new MessageEvent
                        {
                            IgnoreThis  = false,
                            Services    = scp.ServiceProvider.CreateScope().ServiceProvider,
                            Scenario    = VersaCommsID.FromEnum(EVersaCommIDType.Scenario, 0),
                            Player      = new UnionType <VersaCommsID, IPlayer>(0),
                            Terminal    = new UnionType <VersaCommsID, IVersaWriter>(0),
                            FullMessage = x.ToString(),
                            Entity      = new UnionType <VersaCommsID, IEntity>(0),
                        };
                        await Task.Yield();
                        await pipe.ProcessEvent(e);
                    }
                }
            });

            //totalDisposer.Dispose();
            //scp.Dispose();
            //await Task.WhenAll(testTask);

            await Task.Delay(200);

            totalDisposer.Dispose();
            //await Task.Delay(200);
            await endThing.Task;
            //pipe.Dispose();
        }
예제 #14
0
        public Scenario(VersaCommsID scenarioId, IServiceProvider provider)
        {
            ScenarioID  = scenarioId;
            tokenSource = new CancellationTokenSource();
            scScope     = provider.GetRequiredService <IScenarioScopeFactory>()
                          .ConfigureScenarioServices(scenarioId);
            GMs = new ImmutableArray <IPlayer>();
            var tempProv = scScope.GetScenarioServiceProvider(provider);

            Pipe = tempProv.GetRequiredService <IEventPipe>();
            Pipe.SubscribePreprocess(new EventObjectFetcher(this));
            comServ = tempProv.GetRequiredService <ICommandService>();
            var repeater = tempProv.GetRequiredService <MessageRepeater>();

            Pipe.ObserveSynchronous.Subscribe(comServ);
            Pipe.ObserveFirst.Subscribe(repeater);
            tempProv.GetService <RootLocationHolder>();
        }
예제 #15
0
 public Player(VersaCommsID ID)
 {
     this.VersaID = ID;
 }
 bool IsCustomGroupable(VersaCommsID id) => (!id.IdType.HasFlag(EVersaCommIDType.Unicast));
예제 #17
0
 public Task <TKey> GetExternalID(VersaCommsID identifier) => Users
 .Where(user => user.VersaID == identifier)
 .Select(user => user.Id)
 .ToAsyncEnumerable().SingleOrDefault();
예제 #18
0
 public bool AddOwner(VersaCommsID id)
 {
     _owners.Add(id);
     return(true);
 }
 public IVersaWriter GetWriter(VersaCommsID Id)
 {
     //Ignoring users method b/c generic usage. Someone might not be using Identity with this so it may be a different user that is contacted.
     return(new VersaSignalRWriter(Id, hubContext.Clients.Group("versagen_" + Id), config.NameOfWriterFunction,
                                   encoder));
 }
예제 #20
0
 IPlayer IPlayerStore.GetPlayer(VersaCommsID id)
 {
     return(GetPlayer(id));
 }
 public IVersaGroupWriter CreateGroup(EVersaCommIDType type)
 {
     return(GetOrCreateGroup(VersaCommsID.RandomOutsideRange(type, Store.groupItems.Keys)));
 }
예제 #22
0
 Task <TVersaIdentity> IPlayerStore <TVersaIdentity> .GetPlayerAsync(VersaCommsID id)
 {
     return(TranslatePlayerAsync(id));
 }
예제 #23
0
 internal ScenarioServiceProvider(VersaCommsID scenarioID, IServiceProvider baseProvider, IServiceProvider scenarioScope, params object[] instanceObjects)
 {
     ScenarioID            = scenarioID;
     this.BaseProvider     = baseProvider;
     this.ScenarioProvider = scenarioScope;
 }
예제 #24
0
 public bool setIDIfUnset(VersaCommsID id)
 {
     throw new NotImplementedException();
 }
예제 #25
0
 public DefaultScenarioServicesScope(VersaCommsID id, IServiceScope baseScope, IServiceScope scenarioScope)
 {
     this.baseScope     = baseScope;
     this.scenarioScope = scenarioScope;
     ServiceProvider    = new ScenarioServiceProvider(id, baseScope.ServiceProvider, scenarioScope.ServiceProvider);
 }
 public IScenario BuildWorldScenario(IServiceProvider provider)
 {
     return(_Scenarios.GetOrAdd(VersaCommsID.FromEnum(EVersaCommIDType.Scenario, 0), new Scenario(VersaCommsID.FromEnum(EVersaCommIDType.Scenario, 0), provider)));
 }
 public IScenario CreateScenario(IServiceProvider provider, VersaCommsID gameMasterID, VersaCommsID[] partyIDs)
 {
     throw new NotImplementedException();
 }
예제 #28
0
 async Task <IPlayer> IPlayerStore.GetPlayerAsync(VersaCommsID id)
 {
     return(await TranslatePlayerAsync(id));
 }
예제 #29
0
 public bool RemoveOwner(VersaCommsID id)
 {
     return(_owners.Remove(id));
 }
 public ScenarioScope(VersaCommsID scenarioID, IServiceProvider scenarioProvider)
 {
     this.ScenarioID          = scenarioID;
     ScenarioProviderUnscoped = scenarioProvider;
 }