diff --git a/src/main/java/com/alterdekim/game/component/game/RoleFlags.java b/src/main/java/com/alterdekim/game/component/game/RoleFlags.java index 24c362c..e30a313 100644 --- a/src/main/java/com/alterdekim/game/component/game/RoleFlags.java +++ b/src/main/java/com/alterdekim/game/component/game/RoleFlags.java @@ -8,6 +8,7 @@ import lombok.Getter; public enum RoleFlags { NONE(0), MEMBER(2), + BOSS(4), SA(8), MODERATOR(131072), ADMINISTRATOR(262144), diff --git a/src/main/java/com/alterdekim/game/controller/ApiController.java b/src/main/java/com/alterdekim/game/controller/ApiController.java index 5ab890e..d87c016 100644 --- a/src/main/java/com/alterdekim/game/controller/ApiController.java +++ b/src/main/java/com/alterdekim/game/controller/ApiController.java @@ -7,11 +7,14 @@ import com.alterdekim.game.component.game.ClubAccessType; import com.alterdekim.game.component.game.PlayerProperties; import com.alterdekim.game.component.game.PlayerPropertyType; import com.alterdekim.game.component.game.RoleFlags; +import com.alterdekim.game.component.game.avatar.GoodClothType; +import com.alterdekim.game.component.game.inventory.InventoryItem; import com.alterdekim.game.controller.result.api.ApiResult; import com.alterdekim.game.controller.result.api.PreloaderResult; import com.alterdekim.game.controller.result.api.PromotionBannerResult; import com.alterdekim.game.controller.result.api.PromotionResult; import com.alterdekim.game.entity.*; +import com.alterdekim.game.repository.AvatarInventoryRepository; import com.alterdekim.game.service.*; import com.alterdekim.game.utils.DateUtils; import com.fasterxml.jackson.annotation.JsonProperty; @@ -19,6 +22,7 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; @@ -69,6 +73,21 @@ public class ApiController { @Autowired private LocationService locationService; + @Autowired + private GoodsService goodsService; + + @Autowired + private MRService mrService; + + @Autowired + private MRTService mrtService; + + @Autowired + private TRService trService; + + @Autowired + private AvatarInventoryRepository avatarInventoryRepository; + @PostMapping("/delete_row") public ResponseEntity deleteRow(@RequestParam("table") APITable table, @RequestParam("row") Long rowId) { switch (table) { @@ -205,6 +224,74 @@ public class ApiController { return ResponseEntity.ok(results); } + @RequestMapping(value = "/get_goods", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getGoods() { + List results = new LinkedList<>(); + for( Good good : goodsService.getAll() ) { + GoodResult result = new GoodResult(); + long goodId = good.getId(); + result.setGoodId(goodId); + Integer iconId = -good.getMRId(); + Integer trId = good.getTRId(); + var icon = mrService.findById(iconId.longValue()); + if( icon.isPresent() ) { + String url = mrtService.findById(icon.get().getTId().longValue()).getVal() + icon.get().getUrl(); + result.setUrl(url); + } + var name = trService.findById(trId.longValue()); + if( name.isPresent() ) { + String text = name.get().getH(); + result.setName(text); + } + results.add(result); + } + return ResponseEntity.ok(results); + } + + @RequestMapping(value = "/get_avatar_inventory", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> getInventory(@RequestParam("id") Integer userId) { + List results = new LinkedList<>(); + List items = Arrays.stream(GoodClothType.values()) + .map(type -> this.avatarInventoryRepository.findInventoryItems(userId, type)) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + for( InventoryItem avatarInventory : items) { + var og = goodsService.findById(avatarInventory.getId()); + if( og.isPresent() ) { + var good = og.get(); + GoodResult result = new GoodResult(); + long goodId = good.getId(); + result.setGoodId(goodId); + Integer iconId = -good.getMRId(); + Integer trId = good.getTRId(); + var icon = mrService.findById(iconId.longValue()); + if (icon.isPresent()) { + String url = mrtService.findById(icon.get().getTId().longValue()).getVal() + icon.get().getUrl(); + result.setUrl(url); + } + var name = trService.findById(trId.longValue()); + if (name.isPresent()) { + String text = name.get().getH(); + result.setName(text); + } + results.add(result); + } + } + return ResponseEntity.ok(results); + } + + + @Setter + @NoArgsConstructor + public static class GoodResult { + @JsonProperty + private String url; + @JsonProperty + private Long goodId; + @JsonProperty + private String name; + } + @AllArgsConstructor public static class UserPropertyResult { @JsonProperty diff --git a/src/main/java/com/alterdekim/game/controller/StaticController.java b/src/main/java/com/alterdekim/game/controller/StaticController.java index 8e602fe..51bf326 100644 --- a/src/main/java/com/alterdekim/game/controller/StaticController.java +++ b/src/main/java/com/alterdekim/game/controller/StaticController.java @@ -1,9 +1,13 @@ package com.alterdekim.game.controller; +import com.alterdekim.game.component.ReferenceLoader; +import com.alterdekim.game.component.game.AvatarInventoryType; import com.alterdekim.game.config.ServerConfig; +import com.alterdekim.game.entity.AvatarInventory; import com.alterdekim.game.entity.Role; import com.alterdekim.game.entity.User; import com.alterdekim.game.security.AuthenticationUtil; +import com.alterdekim.game.service.AvatarInventoryService; import com.alterdekim.game.service.GoodsService; import com.alterdekim.game.service.UserService; import com.fasterxml.jackson.databind.ObjectMapper; @@ -44,6 +48,15 @@ public class StaticController { @Autowired private UserService userService; + @Autowired + private ReferenceLoader referenceLoader; + + @Autowired + private AvatarInventoryService avatarInventoryService; + + @Autowired + private GoodsService goodsService; + @GetMapping("/main") public String mainPage(Model model) { User user = AuthenticationUtil.authProfile(userService).get(); @@ -72,9 +85,33 @@ public class StaticController { public String panelUser(Model model, @RequestParam(value = "id", defaultValue = "1") Integer userId) { model.addAttribute("user_id", userId); model.addAttribute("user_name", userService.getUsernameById(userId).get()); + model.addAttribute("inventory_link", "/panel_inventory?id="+userId); return "panel_user"; } + @GetMapping("/panel_inventory") + public String panelInventory(Model model, @RequestParam(value = "id", defaultValue = "1") Integer userId) { + model.addAttribute("user_id", userId); + model.addAttribute("user_name", "Inventory of " + userService.getUsernameById(userId).get()); + return "panel_inventory"; + } + + @PostMapping("/panel_inventory") + public String panelInventory(Model model, @RequestParam(value = "id", defaultValue = "1") Integer userId, @RequestParam(value = "good_id") Long goodId) { + model.addAttribute("user_id", userId); + model.addAttribute("user_name", "Inventory of " + userService.getUsernameById(userId).get()); + + AvatarInventory av = new AvatarInventory(referenceLoader.getUserReference(userId), goodId, false, AvatarInventoryType.fromGoodId(goodsService, goodId), 0); + avatarInventoryService.addGoodToInventory(av); + + return "redirect:/panel_inventory?id="+userId; + } + + @GetMapping("/goods") + public String goodsPage() { + return "goods"; + } + public enum PanelSection { Dashboard, Locations, diff --git a/src/main/java/com/alterdekim/game/repository/AvatarInventoryRepository.java b/src/main/java/com/alterdekim/game/repository/AvatarInventoryRepository.java index 53e9e52..2de82df 100644 --- a/src/main/java/com/alterdekim/game/repository/AvatarInventoryRepository.java +++ b/src/main/java/com/alterdekim/game/repository/AvatarInventoryRepository.java @@ -64,6 +64,9 @@ public interface AvatarInventoryRepository extends JpaRepository findInventoryItems(@Param("uid") Integer userId, @Param("goodTypeId") GoodClothType goodClothType); + @Query(value = "SELECT a FROM AvatarInventory a WHERE a.user.id = :uid") + List findAllByUserId(@Param("uid") Integer userId); + @Query(value = """ SELECT b.id AS id, diff --git a/src/main/java/com/alterdekim/game/security/SpringSecurity.java b/src/main/java/com/alterdekim/game/security/SpringSecurity.java index a2d6f38..53e2197 100644 --- a/src/main/java/com/alterdekim/game/security/SpringSecurity.java +++ b/src/main/java/com/alterdekim/game/security/SpringSecurity.java @@ -38,6 +38,8 @@ public class SpringSecurity { .requestMatchers("/login").permitAll() .requestMatchers("/panel").hasAuthority(Role.RoleType.RoleAdmin.name()) .requestMatchers("/panel_user").hasAuthority(Role.RoleType.RoleAdmin.name()) + .requestMatchers("/panel_inventory").hasAuthority(Role.RoleType.RoleAdmin.name()) + .requestMatchers("/goods").hasAuthority(Role.RoleType.RoleAdmin.name()) .requestMatchers("/api/**").hasAuthority(Role.RoleType.RoleAdmin.name()) .requestMatchers("/main").hasAnyAuthority(Role.RoleType.RoleUser.name(), Role.RoleType.RoleAdmin.name()) .requestMatchers("/"+ FileServerController.URL_PATH +"/**").permitAll() diff --git a/src/main/java/com/alterdekim/game/service/GoodsService.java b/src/main/java/com/alterdekim/game/service/GoodsService.java index 5a2db3f..55c7659 100644 --- a/src/main/java/com/alterdekim/game/service/GoodsService.java +++ b/src/main/java/com/alterdekim/game/service/GoodsService.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; @@ -25,4 +26,8 @@ public class GoodsService implements OutputObjectCallback { public Optional findById(Long id) { return this.repository.findById(id); } + + public List getAll() { + return this.repository.findAll(); + } } diff --git a/src/main/java/com/alterdekim/game/service/MRTService.java b/src/main/java/com/alterdekim/game/service/MRTService.java index a67cbbf..321badf 100644 --- a/src/main/java/com/alterdekim/game/service/MRTService.java +++ b/src/main/java/com/alterdekim/game/service/MRTService.java @@ -28,4 +28,8 @@ public class MRTService implements OutputObjectCallback { public List getAll() { return this.repository.findAll(); } + + public MediaResourcePath findById(Long id) { + return this.repository.findById(id).get(); + } } diff --git a/src/main/java/com/alterdekim/game/service/TRService.java b/src/main/java/com/alterdekim/game/service/TRService.java index 052520e..2d1228e 100644 --- a/src/main/java/com/alterdekim/game/service/TRService.java +++ b/src/main/java/com/alterdekim/game/service/TRService.java @@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; @NoArgsConstructor @Service @@ -24,4 +25,8 @@ public class TRService implements OutputObjectCallback { public List getAll() { return this.repository.findAll(); } + + public Optional findById(Long id) { + return this.repository.findById(id); + } } diff --git a/src/main/resources/_js/goods.js b/src/main/resources/_js/goods.js new file mode 100644 index 0000000..41233d7 --- /dev/null +++ b/src/main/resources/_js/goods.js @@ -0,0 +1,35 @@ +function initGoodTable(tag, data) { + if( data.length <= 0 ) return; + let keys = Object.keys(data[0]); + let header = ""; + for( let i = 0; i < keys.length; i++ ) { + header += "" + keys[i] + ""; + } + $($(tag).children("thead")[0]).html(""+header+""); + for( let i = 0; i < data.length; i++ ) { + header = ""; + let row_id = data[i]["id"]; + for( let u = 0; u < keys.length; u++ ) { + if( keys[u] == "url" ) { + header += ""; + } else { + header += "" + data[i][keys[u]] + ""; + } + } + let tabName = tag.substring(1); + $($(tag).children("tbody")[0]).append(""+header+""); + } +} + +function getUserGoods() { + $.get( "/api/get_goods", function( data ) { + initGoodTable("#goods", data); + set_loading("#goods", false); + }); +} + +function set_loading(obj, state) { + $(obj).attr("aria-busy", state); +} + +getUserGoods(); \ No newline at end of file diff --git a/src/main/resources/_js/inventory.js b/src/main/resources/_js/inventory.js new file mode 100644 index 0000000..3b6835f --- /dev/null +++ b/src/main/resources/_js/inventory.js @@ -0,0 +1,35 @@ +function initGoodTable(tag, data) { + if( data.length <= 0 ) return; + let keys = Object.keys(data[0]); + let header = ""; + for( let i = 0; i < keys.length; i++ ) { + header += "" + keys[i] + ""; + } + $($(tag).children("thead")[0]).html(""+header+""); + for( let i = 0; i < data.length; i++ ) { + header = ""; + let row_id = data[i]["id"]; + for( let u = 0; u < keys.length; u++ ) { + if( keys[u] == "url" ) { + header += ""; + } else { + header += "" + data[i][keys[u]] + ""; + } + } + let tabName = tag.substring(1); + $($(tag).children("tbody")[0]).append(""+header+""); + } +} + +function getUserGoods() { + $.get( "/api/get_avatar_inventory?id="+$("#user_init_info").attr("data-id"), function( data ) { + initGoodTable("#inventory", data); + set_loading("#inventory", false); + }); +} + +function set_loading(obj, state) { + $(obj).attr("aria-busy", state); +} + +getUserGoods(); \ No newline at end of file diff --git a/src/main/resources/_js/user.js b/src/main/resources/_js/user.js index 0a7c7ba..7e82b55 100644 --- a/src/main/resources/_js/user.js +++ b/src/main/resources/_js/user.js @@ -1,6 +1,7 @@ const roleFlags = [ "NONE", "MEMBER", + "BOSS", "SA", "MODERATOR", "ADMINISTRATOR", diff --git a/src/main/resources/css/panel.css b/src/main/resources/css/panel.css index b212f89..133bde5 100644 --- a/src/main/resources/css/panel.css +++ b/src/main/resources/css/panel.css @@ -17,4 +17,9 @@ td > img { width: 28px; height: 28px; cursor: pointer; +} + +.good-img { + width: 125px; + height: 100px; } \ No newline at end of file diff --git a/src/main/resources/templates/fragments/aside.html b/src/main/resources/templates/fragments/aside.html index 6f0c214..cfc74fa 100644 --- a/src/main/resources/templates/fragments/aside.html +++ b/src/main/resources/templates/fragments/aside.html @@ -7,13 +7,9 @@
  • Games
  • Preloaders
  • Users
  • -
  • Banlist
  • -
  • Cache
  • -
  • Goods
  • +
  • Goods
  • Items list
  • Actions
  • -
  • Support
  • -
  • Settings
  • diff --git a/src/main/resources/templates/goods.html b/src/main/resources/templates/goods.html new file mode 100644 index 0000000..2941e8f --- /dev/null +++ b/src/main/resources/templates/goods.html @@ -0,0 +1,20 @@ + + + + + + + +
    + +
    +

    Goods with names

    + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/panel_inventory.html b/src/main/resources/templates/panel_inventory.html new file mode 100644 index 0000000..b0f6231 --- /dev/null +++ b/src/main/resources/templates/panel_inventory.html @@ -0,0 +1,31 @@ + + + + + + + +
    + +
    +

    +
    +
    + + + +
    +
    + + + +
    +
    +
    + + + \ No newline at end of file diff --git a/src/main/resources/templates/panel_user.html b/src/main/resources/templates/panel_user.html index b160633..871a29b 100644 --- a/src/main/resources/templates/panel_user.html +++ b/src/main/resources/templates/panel_user.html @@ -9,6 +9,7 @@