예제 #1
0
        async public Task <IActionResult> Run(string roomId, FunctionCallViewModel fcall)
        {
            var normalisedRoomId = roomId.ToUpperInvariant();

            if (!RoomRepository.Exists(normalisedRoomId))
            {
                return(NotFound("Room not found"));
            }

            var room = RoomRepository.Get(normalisedRoomId);

            return(await RoomHelpers.WithRoomLock <IActionResult>(room, async() =>
            {
                if (room.Library == null)
                {
                    return base.BadRequest();
                }

                if (!room.Library.GetFunctionList().Any(f => f.Name == fcall.Name))
                {
                    return base.NotFound("Function not found");
                }

                var results = room.Library.Call(fcall.Name, fcall.Arguments);
                ResultGroup resultGroup = GroupResults(results);
                await ResultPublisher.Publish(room, resultGroup);
                return base.Ok();
            }));
        }
예제 #2
0
        async public Task <IActionResult> Configuration(string roomId, [FromBody] RoomConfigurationViewModel roomConfiguration)
        {
            var normalisedRoomId = roomId.ToUpperInvariant();

            if (!RoomRepository.Exists(normalisedRoomId))
            {
                return(NotFound());
            }
            var room = RoomRepository.Get(normalisedRoomId);

            if (room.State.Creator.Id != SessionManager.GetCurrentUser().Id)
            {
                return(Unauthorized("Only the creator of the room can edit the library"));
            }

            await RoomHelpers.WithRoomLock(room, async() =>
            {
                if (!string.IsNullOrEmpty(roomConfiguration.LibraryScript))
                {
                    var limitations = new DiceScript.Contracts.Limitations
                    {
                        MaxProgramSize = 2000,
                        MaxRollNbr     = 100
                    };
                    var builder              = new DiceScript.Builder(limitations);
                    room.Library             = builder.BuildLib(roomConfiguration.LibraryScript);
                    room.State.Functions     = room.Library.GetFunctionList();
                    room.State.LibraryScript = roomConfiguration.LibraryScript;
                }
                room.State.DiscordWebHook = roomConfiguration.DiscordWebHook;
                await RoomHub.Update(room);
            });

            return(Ok());
        }
예제 #3
0
        async public Task <IActionResult> New()
        {
            var room = RoomRepository.Create();
            await RoomHelpers.WithRoomLock(room, () =>
            {
                User user = SessionManager.GetCurrentUser();
                room.State.Users.Add(user);
                room.State.Creator = user;
            });

            return(RedirectToAction("Index", new { roomId = room.Id }));
        }
예제 #4
0
        async public Task <IActionResult> Quit(string roomId)
        {
            if (!RoomRepository.Exists(roomId))
            {
                return(RoomNotFound());
            }
            var room = RoomRepository.Get(roomId);

            await RoomHelpers.WithRoomLock(room, async() =>
            {
                User user = SessionManager.GetCurrentUser();
                room.State.Users.Remove(user);
                await RoomHub.Update(room);
            });

            return(Redirect("/"));
        }
예제 #5
0
        async public Task <IActionResult> Join(string roomId)
        {
            var normalisedRoomId = roomId.ToUpperInvariant();

            if (!RoomRepository.Exists(normalisedRoomId))
            {
                return(RoomNotFound());
            }
            var room = RoomRepository.Get(normalisedRoomId);

            await RoomHelpers.WithRoomLock(room, async() =>
            {
                User user = SessionManager.GetCurrentUser();
                room.State.Users.Add(user);
                await RoomHub.Update(room);
            });

            return(RedirectToAction("Index", new { roomId = room.Id }));
        }