From 9b6c3d525d2cda5e00ddad2cf6ca8a4f3c9dc3cf Mon Sep 17 00:00:00 2001 From: alterdekim Date: Fri, 23 Feb 2024 17:16:27 +0300 Subject: [PATCH] invite system start --- .../alterdekim/game/component/LongPoll.java | 6 ++--- .../game/component/LongPollConfig.java | 2 ++ .../game/controller/APIController.java | 26 +++++++++++++++++-- .../com/alterdekim/game/dto/GameInvite.java | 14 ++++++++++ .../com/alterdekim/game/dto/InviteResult.java | 14 ++++++++++ .../alterdekim/game/dto/LongPollResult.java | 1 + .../game/repository/RoomPlayerRepository.java | 3 +++ .../game/service/RoomPlayerServiceImpl.java | 4 +++ src/main/resources/static/javascript/games.js | 10 ++++++- 9 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/alterdekim/game/dto/GameInvite.java create mode 100644 src/main/java/com/alterdekim/game/dto/InviteResult.java diff --git a/src/main/java/com/alterdekim/game/component/LongPoll.java b/src/main/java/com/alterdekim/game/component/LongPoll.java index 4b89f93..c0bd214 100644 --- a/src/main/java/com/alterdekim/game/component/LongPoll.java +++ b/src/main/java/com/alterdekim/game/component/LongPoll.java @@ -57,7 +57,7 @@ public class LongPoll { }); getLongPollingQueue().forEach(longPollingSession -> { try { - if( !map.containsKey(longPollingSession.getUserId())) map.put(longPollingSession.getUserId(), new LongPollConfig(0L,new ArrayList<>(), 0, Hash.rnd(), new ArrayList<>(), System.currentTimeMillis())); + if( !map.containsKey(longPollingSession.getUserId())) map.put(longPollingSession.getUserId(), new LongPollConfig(0L,new ArrayList<>(), 0, Hash.rnd(), new ArrayList<>(), System.currentTimeMillis(), new ArrayList<>())); LongPollConfig config = map.get(longPollingSession.getUserId()); LongPollResult result = process(longPollingSession.getUserId(), config); if( !result.getRooms().isEmpty() ) @@ -67,7 +67,7 @@ public class LongPoll { config.setSession_pass(config.getSession_pass()+1); - if( !result.getFriends().isEmpty() || !result.getRooms().isEmpty() || !result.getMessages().isEmpty() || config.getSession_pass() >= iterations) { + if( !result.getInvites().isEmpty() || !result.getFriends().isEmpty() || !result.getRooms().isEmpty() || !result.getMessages().isEmpty() || config.getSession_pass() >= iterations) { longPollingSession.getDeferredResult().setResult(result); config.setSession_pass(0); } @@ -196,7 +196,7 @@ public class LongPoll { .collect(Collectors.toList()); } - return new LongPollResult(onlineCount, results, users, roomResults, friendsResult); + return new LongPollResult(onlineCount, results, users, roomResults, friendsResult, config.getInvites().stream().map(i -> new InviteResult(i.getRoomId(), i.getUserId(), i.getUsername())).collect(Collectors.toList())); } private Boolean isEqual(RoomResult r1, RoomResult r2) { diff --git a/src/main/java/com/alterdekim/game/component/LongPollConfig.java b/src/main/java/com/alterdekim/game/component/LongPollConfig.java index 0dcd26f..2686f6a 100644 --- a/src/main/java/com/alterdekim/game/component/LongPollConfig.java +++ b/src/main/java/com/alterdekim/game/component/LongPollConfig.java @@ -1,5 +1,6 @@ package com.alterdekim.game.component; +import com.alterdekim.game.dto.GameInvite; import com.alterdekim.game.dto.RoomResult; import com.alterdekim.game.dto.UserResult; import lombok.AllArgsConstructor; @@ -20,4 +21,5 @@ public class LongPollConfig { private String poll_token; private List friends_online; private Long lastRequest; + private List invites; } diff --git a/src/main/java/com/alterdekim/game/controller/APIController.java b/src/main/java/com/alterdekim/game/controller/APIController.java index f24ca7d..db86900 100644 --- a/src/main/java/com/alterdekim/game/controller/APIController.java +++ b/src/main/java/com/alterdekim/game/controller/APIController.java @@ -51,6 +51,9 @@ public class APIController { @Autowired private LongPoll longPoll; + @Autowired + private FriendServiceImpl friendService; + @GetMapping("/api/v1/chat/history/{count}/") public ResponseEntity chatList(@PathVariable Integer count ) { List results = chatService.getLastChats(count); @@ -133,6 +136,25 @@ public class APIController { return ResponseEntity.accepted().build(); } + @PostMapping("/api/v1/rooms/invite/") + public ResponseEntity inviteToRoom( @RequestParam("friend_id") Long friend_id ) { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + Long userId = userService.findByUsername(((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername()).getId(); + if( friendService.getFriendsOfUserId(userId).stream().anyMatch( p -> p.longValue() == friend_id.longValue()) && + roomPlayerService.hasUserId(userId) != null) { + LongPollConfig config = longPoll.getMap().get(friend_id); + if( config != null ) { + List l = config.getInvites(); + Long roomId = roomPlayerService.hasUserId(userId); + l.add(new GameInvite(roomId, userId, ((org.springframework.security.core.userdetails.User) auth.getPrincipal()).getUsername())); + config.setInvites(l); + longPoll.getMap().put(friend_id, config); + return ResponseEntity.ok().build(); + } + } + return ResponseEntity.badRequest().build(); + } + @PostMapping("/async/notify/get/") @ResponseBody public DeferredResult getNotify(@RequestParam("last_chat_id") Long last_chat_id, @@ -152,7 +174,7 @@ public class APIController { if( longPoll.getMap().containsKey(userId) ){ LongPollConfig c = longPoll.getMap().get(userId); if( !c.getPoll_token().equals(poll_token) ) { - c = new LongPollConfig(last_chat_id, new ArrayList<>(), 0, poll_token, new ArrayList<>(), System.currentTimeMillis()); + c = new LongPollConfig(last_chat_id, new ArrayList<>(), 0, poll_token, new ArrayList<>(), System.currentTimeMillis(), new ArrayList<>()); longPoll.getLongPollingQueue().removeIf(q -> q.getUserId().longValue() == userId.longValue()); } c.setLast_chat_id(last_chat_id); @@ -160,7 +182,7 @@ public class APIController { c.setLastRequest(System.currentTimeMillis()); longPoll.getMap().put(userId, c); } else { - longPoll.getMap().put(userId, new LongPollConfig(last_chat_id, new ArrayList<>(), 0, poll_token, new ArrayList<>(), System.currentTimeMillis())); + longPoll.getMap().put(userId, new LongPollConfig(last_chat_id, new ArrayList<>(), 0, poll_token, new ArrayList<>(), System.currentTimeMillis(), new ArrayList<>())); } longPoll.getLongPollingQueue().add(new LongPollingSession(userId, deferredResult)); return deferredResult; diff --git a/src/main/java/com/alterdekim/game/dto/GameInvite.java b/src/main/java/com/alterdekim/game/dto/GameInvite.java new file mode 100644 index 0000000..dd09dfb --- /dev/null +++ b/src/main/java/com/alterdekim/game/dto/GameInvite.java @@ -0,0 +1,14 @@ +package com.alterdekim.game.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class GameInvite { + private Long roomId; + private Long userId; + private String username; +} diff --git a/src/main/java/com/alterdekim/game/dto/InviteResult.java b/src/main/java/com/alterdekim/game/dto/InviteResult.java new file mode 100644 index 0000000..aa01059 --- /dev/null +++ b/src/main/java/com/alterdekim/game/dto/InviteResult.java @@ -0,0 +1,14 @@ +package com.alterdekim.game.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class InviteResult { + private Long roomId; + private Long userId; + private String username; +} diff --git a/src/main/java/com/alterdekim/game/dto/LongPollResult.java b/src/main/java/com/alterdekim/game/dto/LongPollResult.java index 1879e20..24e23b1 100644 --- a/src/main/java/com/alterdekim/game/dto/LongPollResult.java +++ b/src/main/java/com/alterdekim/game/dto/LongPollResult.java @@ -16,4 +16,5 @@ public class LongPollResult { private List users; private List rooms; private List friends; + private List invites; } diff --git a/src/main/java/com/alterdekim/game/repository/RoomPlayerRepository.java b/src/main/java/com/alterdekim/game/repository/RoomPlayerRepository.java index 8dcb8b5..a9b6b7e 100644 --- a/src/main/java/com/alterdekim/game/repository/RoomPlayerRepository.java +++ b/src/main/java/com/alterdekim/game/repository/RoomPlayerRepository.java @@ -21,4 +21,7 @@ public interface RoomPlayerRepository extends JpaRepository { @Modifying @Query(value = "DELETE FROM RoomPlayer r WHERE r.userId = :userId") void deleteAllByUserId(@Param("userId") Long userId); + + @Query(value = "SELECT r.roomId FROM RoomPlayer r WHERE r.userId = :userId ORDER BY r.roomId ASC LIMIT 1") + Long hasUserId(@Param("userId") Long userId); } diff --git a/src/main/java/com/alterdekim/game/service/RoomPlayerServiceImpl.java b/src/main/java/com/alterdekim/game/service/RoomPlayerServiceImpl.java index 1e12c79..9da5f63 100644 --- a/src/main/java/com/alterdekim/game/service/RoomPlayerServiceImpl.java +++ b/src/main/java/com/alterdekim/game/service/RoomPlayerServiceImpl.java @@ -32,4 +32,8 @@ public class RoomPlayerServiceImpl implements RoomPlayerService{ public void leaveByUserId(Long userId) { repository.deleteAllByUserId(userId); } + + public Long hasUserId(Long userId) { + return repository.hasUserId(userId); + } } diff --git a/src/main/resources/static/javascript/games.js b/src/main/resources/static/javascript/games.js index 6bd744f..e087c19 100644 --- a/src/main/resources/static/javascript/games.js +++ b/src/main/resources/static/javascript/games.js @@ -16,7 +16,15 @@ function createRoom() { } function sendInviteMessage(uid) { - alert(uid); + $.ajax({ + url: "/api/v1/rooms/invite/", + method: "POST", + data: { + friend_id: uid + } + }).done(function(data) { + console.log(data); + }); } function successPolling(data) {