diff --git a/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs b/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs index 3c8c5b7..026f0f7 100644 --- a/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs +++ b/SessionCompanion/SessionCompanion.Services/Intefraces/ICharacterService.cs @@ -14,5 +14,6 @@ namespace SessionCompanion.Services.Interfaces Task> GetBasicCharactersData(List charactersId); Task> GetUserLoginCharacters(int userId); Task> GetCharacterStatistics(int characterId); + Task GetBasicCharacterbasicInfo(int characterId); } } diff --git a/SessionCompanion/SessionCompanion.Services/Intefraces/IStatisticsService.cs b/SessionCompanion/SessionCompanion.Services/Intefraces/IStatisticsService.cs index f624e0c..0aede4b 100644 --- a/SessionCompanion/SessionCompanion.Services/Intefraces/IStatisticsService.cs +++ b/SessionCompanion/SessionCompanion.Services/Intefraces/IStatisticsService.cs @@ -10,5 +10,6 @@ namespace SessionCompanion.Services.Interfaces { public interface IStatisticsService : IServiceBase { + Task SubtractHp(int characterId, int hpToSubtract); } } diff --git a/SessionCompanion/SessionCompanion.Services/Profiles/CharacterProfile.cs b/SessionCompanion/SessionCompanion.Services/Profiles/CharacterProfile.cs index 8893dd7..e856387 100644 --- a/SessionCompanion/SessionCompanion.Services/Profiles/CharacterProfile.cs +++ b/SessionCompanion/SessionCompanion.Services/Profiles/CharacterProfile.cs @@ -25,7 +25,15 @@ namespace SessionCompanion.Services.Profiles .ForMember(vm => vm.Level, conf => conf.MapFrom(charact => charact.Statistics.Level)) .ForMember(vm => vm.CurrentHealthPoints, conf => conf.MapFrom(charact => charact.Statistics.CurrentHealthPoints)) .ForMember(vm => vm.Class, conf => conf.MapFrom(charact => charact.Biography.Class.Name)).ReverseMap(); - + + CreateMap() + .ForMember(vm => vm.Name, conf => conf.MapFrom(charact => charact.Biography.Name)) + .ForMember(vm => vm.Level, conf => conf.MapFrom(charact => charact.Statistics.Level)) + .ForMember(vm => vm.CurrentHealthPoints, conf => conf.MapFrom(charact => charact.Statistics.CurrentHealthPoints)) + .ForMember(vm => vm.MaxHealthPoints, conf => conf.MapFrom(charact => charact.Statistics.HealthPoints)) + .ForMember(vm => vm.Race, conf => conf.MapFrom(charact => charact.Biography.Race.Name)) + .ForMember(vm => vm.Class, conf => conf.MapFrom(charact => charact.Biography.Class.Name)).ReverseMap(); + CreateMap() .ForMember(vm => vm.CanDeception, conf => conf.MapFrom(charact => charact.Charisma.CanDeception)) .ForMember(vm => vm.CanIntimidation, conf => conf.MapFrom(charact => charact.Charisma.CanIntimidation)) diff --git a/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs b/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs index b36f4fa..ddbf698 100644 --- a/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs +++ b/SessionCompanion/SessionCompanion.Services/Services/CharacterService.cs @@ -96,5 +96,20 @@ namespace SessionCompanion.Services.Services return statistics; } + + /// + /// Funkcja zwraca podstawowy widok postaci na podstawie ich id + /// + /// Lista identyfikatorów postaci + /// Podstawowy widok podanych postaci + public async Task GetBasicCharacterbasicInfo(int characterId) + { + var character = await Repository.Get(c => c.Id.Equals(characterId)) + .Include(x => x.Biography).ThenInclude(x => x.Class) + .Include(x => x.Biography).ThenInclude(x => x.Race) + .Include(x => x.Statistics).SingleAsync(); + var result = Mapper.Map(character); + return result; + } } } diff --git a/SessionCompanion/SessionCompanion.Services/Services/StatisticsService.cs b/SessionCompanion/SessionCompanion.Services/Services/StatisticsService.cs index 42935e5..6a0074a 100644 --- a/SessionCompanion/SessionCompanion.Services/Services/StatisticsService.cs +++ b/SessionCompanion/SessionCompanion.Services/Services/StatisticsService.cs @@ -17,5 +17,18 @@ namespace SessionCompanion.Services.Services { public StatisticsService(IMapper mapper, IRepository repository) : base(mapper, repository) { } + /// + /// Method subtract hp from given character + /// + /// + /// + /// + public async Task SubtractHp(int characterId, int hpToSubtract) + { + var result = await Repository.Get(c => c.Id.Equals(characterId)).SingleAsync(); + result.CurrentHealthPoints -= hpToSubtract; + await Repository.Update(result); + await Repository.Save(); + } } } diff --git a/SessionCompanion/SessionCompanion.ViewModels/CharacterViewModels/CharacterBasicInfoViewModel.cs b/SessionCompanion/SessionCompanion.ViewModels/CharacterViewModels/CharacterBasicInfoViewModel.cs new file mode 100644 index 0000000..dce943c --- /dev/null +++ b/SessionCompanion/SessionCompanion.ViewModels/CharacterViewModels/CharacterBasicInfoViewModel.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SessionCompanion.ViewModels.CharacterViewModels +{ + public class CharacterBasicInfoViewModel + { + /// + /// Identyfikator postaci + /// + public int Id { get; set; } + + /// + /// Nazwa postaci + /// + public string Name { get; set; } + + /// + /// Poziom postaci + /// + public int Level { get; set; } + + /// + /// Aktualna ilość życia postaci + /// + public int CurrentHealthPoints { get; set; } + + /// + /// Maksymalna ilość życia psotaci + /// + public int MaxHealthPoints { get; set; } + + /// + /// Klasa postaci + /// + public string Class { get; set; } + + /// + /// Rasa postaci + /// + public string Race{ get; set; } + } +} diff --git a/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml b/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml index 96bcdc6..0069b97 100644 --- a/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml +++ b/SessionCompanion/SessionCompanion.ViewModels/SessionCompanion.ViewModels.xml @@ -80,6 +80,41 @@ Płeć postaci + + + Identyfikator postaci + + + + + Nazwa postaci + + + + + Poziom postaci + + + + + Aktualna ilość życia postaci + + + + + Maksymalna ilość życia psotaci + + + + + Klasa postaci + + + + + Rasa postaci + + Identyfikator postaci diff --git a/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs b/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs index e691525..f59f3c7 100644 --- a/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs +++ b/SessionCompanion/SessionCompanion/Controllers/CharacterController.cs @@ -66,14 +66,14 @@ namespace SessionCompanion.Controllers }; } /// - /// Metoda zwraca listę postaci przypisanych do danego użytkownika + /// Metoda zwraca listę zalogowanych postaci /// /// Lista zalogowanych postaci lub wiadomość błędu [HttpGet("loggedCharacters")] public async Task, ErrorResponse>> GetLoggedUsersCharacters() { var connectedCharacters = _sessionHubData.ConnectedCharacters_Prop; - var characters = await _service.GetBasicCharactersData(connectedCharacters.Values.ToList()); + var characters = await _service.GetBasicCharactersData(connectedCharacters.Keys.ToList()); return characters.ToList(); } @@ -88,5 +88,22 @@ namespace SessionCompanion.Controllers var statistics = await _service.GetCharacterStatistics(characterId); return statistics; } + + /// + /// Metoda zwraca podstawowe informacje dla danej postaci + /// + /// + /// Podstawowe informacje dla danej postaci + [HttpGet("characterBasicInfo")] + public async Task> GetCharacterBasicInfo([Required] int characterId) + { + var info = await _service.GetBasicCharacterbasicInfo(characterId); + if (info is null) + return new ErrorResponse() { + Message = "No characters with given id", + StatusCode = 204 + }; + return info; + } } } \ No newline at end of file diff --git a/SessionCompanion/SessionCompanion/Controllers/OtherEquipmentController.cs b/SessionCompanion/SessionCompanion/Controllers/OtherEquipmentController.cs new file mode 100644 index 0000000..d21d202 --- /dev/null +++ b/SessionCompanion/SessionCompanion/Controllers/OtherEquipmentController.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Mvc; +using SessionCompanion.Extensions.EitherType; +using SessionCompanion.Services.Interfaces; +using SessionCompanion.ViewModels.ApiResponses; +using SessionCompanion.ViewModels.OtherEquipmentViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SessionCompanion.Controllers +{ + [Route("api/otherEquipment")] + [ApiController] + public class OtherEquipmentController : Controller + { + private readonly IOtherEquipmentService _service; + public OtherEquipmentController(IOtherEquipmentService service) => _service = service; + + /// + /// Metoda zwraca wszystkie dostępne inne przedmioty + /// + /// Lista wszystkich innych przedmiotów w bazie danych + [HttpGet("getAllOtherEquipment")] + public async Task, ErrorResponse>> GetOtherEquipment() + { + try + { + var otherEq = _service.Get().ToList(); + return otherEq; + } + catch (Exception e) + { + return new ErrorResponse() + { + StatusCode = 204, + Message = e.Message + }; + } + } + } +} diff --git a/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs b/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs index 4e59a32..39c02ee 100644 --- a/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs +++ b/SessionCompanion/SessionCompanion/Hubs/SessionHub.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.SignalR; using System; +using System.Linq; using System.Threading.Tasks; namespace SessionCompanion.Hubs @@ -25,10 +26,11 @@ namespace SessionCompanion.Hubs public override Task OnDisconnectedAsync(Exception exception) { // if true then it is character, if false it is GM - if (this.sessionHubData.ConnectedCharacters_Prop.ContainsKey(Context.ConnectionId)) + if (this.sessionHubData.ConnectedCharacters_Prop.ContainsValue(Context.ConnectionId)) { Groups.RemoveFromGroupAsync(Context.ConnectionId, "Players"); - this.sessionHubData.ConnectedCharacters_Prop.Remove(Context.ConnectionId); + int charactedId = this.sessionHubData.ConnectedCharacters_Prop.Where(e => e.Value.Equals(Context.ConnectionId)).First().Key; + this.sessionHubData.ConnectedCharacters_Prop.Remove(charactedId); } else { @@ -61,6 +63,29 @@ namespace SessionCompanion.Hubs return false; } } + + /// + /// Metoda wysyła wiadomość do konkretnego gracza [MessageFromGameMaster] + /// + /// Id postaci któa ma otrzymać wiadomość + /// Wiadomość do wysłania + public void SendMessageToPlayer(int characterId, string message) + { + string playerConnectionId = ""; + if (this.sessionHubData.ConnectedCharacters_Prop.TryGetValue(characterId, out playerConnectionId)) + { + Clients.Client(playerConnectionId).SendAsync("MessageFromGameMaster", message); + } + } + + /// + /// Metoda wysyła wiadomość do wszystkich graczy [MessageFromGameMaster] + /// + /// Wiadomość do wysłania + public void SendMessageToAllPlayers(string message) + { + Clients.Group("Players").SendAsync("MessageFromGameMaster", message); + } #endregion #region Player @@ -72,7 +97,7 @@ namespace SessionCompanion.Hubs /// Wysyła wiadomość "Welcome" do wszystkich zalogowanych użytkoników public Task PlayerCharacterLogin(int characterId) { - this.sessionHubData.ConnectedCharacters_Prop.Add(Context.ConnectionId, characterId); + this.sessionHubData.ConnectedCharacters_Prop.Add(characterId, Context.ConnectionId); Groups.AddToGroupAsync(Context.ConnectionId, "Players"); return Clients.All.SendAsync("Welcome", "Welcome new Player"); diff --git a/SessionCompanion/SessionCompanion/Hubs/SessionHubData.cs b/SessionCompanion/SessionCompanion/Hubs/SessionHubData.cs index c92bfaa..7efc6c4 100644 --- a/SessionCompanion/SessionCompanion/Hubs/SessionHubData.cs +++ b/SessionCompanion/SessionCompanion/Hubs/SessionHubData.cs @@ -10,7 +10,7 @@ namespace SessionCompanion.Hubs /// /// Lista zalogowanych graczy i identyfikator wybranej postaci /// - public static Dictionary ConnectedCharacters = new Dictionary(); + public static Dictionary ConnectedCharacters = new Dictionary(); /// /// Status, czy GM został już zalogowany @@ -36,7 +36,7 @@ namespace SessionCompanion.Hubs /// /// Zwraca lub ustawia listę zalogowanych postaci /// - public Dictionary ConnectedCharacters_Prop + public Dictionary ConnectedCharacters_Prop { get { diff --git a/SessionCompanion/SessionCompanion/SessionCompanion.csproj b/SessionCompanion/SessionCompanion/SessionCompanion.csproj index c455a8f..f0f585f 100644 --- a/SessionCompanion/SessionCompanion/SessionCompanion.csproj +++ b/SessionCompanion/SessionCompanion/SessionCompanion.csproj @@ -36,10 +36,6 @@ - - - - diff --git a/SessionCompanion/SessionCompanion/SessionCompanion.xml b/SessionCompanion/SessionCompanion/SessionCompanion.xml index b152a01..40a51a1 100644 --- a/SessionCompanion/SessionCompanion/SessionCompanion.xml +++ b/SessionCompanion/SessionCompanion/SessionCompanion.xml @@ -20,23 +20,29 @@ - Metoda zwraca listę postaci przypisanych do danego użytkownika + Metoda zwraca listę zalogowanych postaci Lista zalogowanych postaci lub wiadomość błędu Metoda zwraca wszystkie statystyki dla danej postaci - Zwracane statystyki dla: - Charisma - Constitution - Dexterity - Intelligence - Strength - Wisdom + + Id postaci + Listę wszystkich statystyk + + + + Metoda zwraca wszystkie dostępne inne przedmioty + + Lista wszystkich innych przedmiotów w bazie danych + + + + Metoda zwraca podstawowe informacje dla danej postaci - + Podstawowe informacje dla danej postaci @@ -79,6 +85,19 @@ Zwraca true - jeśli udało się zalogować, false - jesli ktoś zalogował się już jako GM + + + Metoda wysyła wiadomość do konkretnego gracza [MessageFromGameMaster] + + Id postaci któa ma otrzymać wiadomość + Wiadomość do wysłania + + + + Metoda wysyła wiadomość do wszystkich graczy [MessageFromGameMaster] + + Wiadomość do wysłania + Logowanie do Huba dla Gracza