Skip to content

Commit f7e4bde

Browse files
committed
feat: userChatInfo ์ถ”๊ฐ€
1 parent 963329a commit f7e4bde

File tree

7 files changed

+161
-1
lines changed

7 files changed

+161
-1
lines changed

โ€Žsrc/main/java/cmf/commitField/domain/commit/scheduler/CommitScheduler.java

+24
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import lombok.extern.slf4j.Slf4j;
88
import org.springframework.context.ApplicationEventPublisher;
99
import org.springframework.data.redis.core.StringRedisTemplate;
10+
import org.springframework.messaging.simp.SimpMessagingTemplate;
1011
import org.springframework.scheduling.annotation.Scheduled;
1112
import org.springframework.stereotype.Service;
1213

@@ -23,9 +24,32 @@ public class CommitScheduler {
2324
private final UserRepository userRepository;
2425
private final StringRedisTemplate redisTemplate;
2526
private final AtomicInteger counter = new AtomicInteger(0);
27+
private final SimpMessagingTemplate messagingTemplate;
2628

2729
private final ApplicationEventPublisher eventPublisher;
2830

31+
// TODO: ํ™•์žฅ์‹œ ์ถ”๊ฐ€
32+
33+
// @Scheduled(fixedRate = 60000) // 1๋ถ„๋งˆ๋‹ค ์‹คํ–‰
34+
// public void updateMatchCommitCounts() {
35+
// Map<Object, Object> entries = redisTemplate.opsForHash().entries("active_matches");
36+
//
37+
// Map<String, MatchSession> activeMatches = new HashMap<>();
38+
// for (Map.Entry<Object, Object> entry : entries.entrySet()) {
39+
// if (entry.getKey() instanceof String && entry.getValue() instanceof MatchSession) {
40+
// activeMatches.put((String) entry.getKey(), (MatchSession) entry.getValue());
41+
// }
42+
// }
43+
//
44+
// for (MatchSession match : activeMatches.values()) {
45+
// long player1Commits = Long.parseLong(redisTemplate.opsForValue().get("commit_active:"+match.getPlayer1()));
46+
// long player2Commits = Long.parseLong(redisTemplate.opsForValue().get("commit_active:"+match.getPlayer2()));
47+
//
48+
// redisTemplate.opsForHash().put("active_matches", match.getMatchId(), match);
49+
//
50+
// messagingTemplate.convertAndSend("/topic/match/" + match.getMatchId(), match);
51+
// }
52+
// }
2953

3054
@Scheduled(fixedRate = 60000) // 1๋ถ„๋งˆ๋‹ค ์‹คํ–‰
3155
public void updateUserCommits() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cmf.commitField.domain.user.controller;
2+
3+
import cmf.commitField.domain.user.service.MatchService;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.http.ResponseEntity;
6+
import org.springframework.web.bind.annotation.PostMapping;
7+
import org.springframework.web.bind.annotation.RequestMapping;
8+
import org.springframework.web.bind.annotation.RequestParam;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
@RestController
12+
@RequiredArgsConstructor
13+
@RequestMapping("/match")
14+
public class MatchController {
15+
private final MatchService matchService;
16+
17+
@PostMapping("/request")
18+
public ResponseEntity<String> requestMatch(@RequestParam String userId, @RequestParam int duration) {
19+
matchService.enqueueUser(userId, duration);
20+
return ResponseEntity.ok("๋งค์นญ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€๋จ");
21+
}
22+
}

โ€Žsrc/main/java/cmf/commitField/domain/user/controller/UserController.java

+12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmf.commitField.domain.user.controller;
22

33
import cmf.commitField.domain.commit.totalCommit.service.TotalCommitService;
4+
import cmf.commitField.domain.user.dto.UserChatInfoDto;
45
import cmf.commitField.domain.user.dto.UserInfoDto;
56
import cmf.commitField.domain.user.entity.CustomOAuth2User;
67
import cmf.commitField.domain.user.service.UserService;
@@ -18,6 +19,17 @@ public class UserController {
1819
private final UserService userService;
1920
private final TotalCommitService totalCommitService;
2021

22+
@GetMapping("/chatinfo")
23+
public ResponseEntity<UserChatInfoDto> getUserChatInfo(@AuthenticationPrincipal CustomOAuth2User oAuth2User){
24+
String username = oAuth2User.getName();
25+
26+
//์œ ์ € ์ •๋ณด์˜ ์กฐํšŒ
27+
//์ด ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์œ ์ €์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ , ์กฐํšŒํ•œ ์œ ์ €๋ฅผ active ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค.
28+
UserChatInfoDto userChatInfoDto = userService.showUserChatInfo(username);
29+
30+
return ResponseEntity.ok(userChatInfoDto);
31+
}
32+
2133
@GetMapping("/info")
2234
public ResponseEntity<UserInfoDto> getUserInfo(@AuthenticationPrincipal CustomOAuth2User oAuth2User){
2335
String username = oAuth2User.getName();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package cmf.commitField.domain.user.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Builder
7+
@Getter
8+
public class UserChatInfoDto {
9+
private long id;
10+
private String username;
11+
private String nickname;
12+
private String email;
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package cmf.commitField.domain.user.entity;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
6+
@Data
7+
@AllArgsConstructor
8+
public class MatchSession {
9+
private String matchId;
10+
private String player1;
11+
private String player2;
12+
private int matchDuration; // 1/3/5์‹œ๊ฐ„
13+
private long startTime;
14+
private int player1Commits;
15+
private int player2Commits;
16+
17+
public MatchSession(String matchId, String player1, String player2, int matchDuration) {
18+
this.matchId = matchId;
19+
this.player1 = player1;
20+
this.player2 = player2;
21+
this.matchDuration = matchDuration;
22+
this.startTime = System.currentTimeMillis();
23+
this.player1Commits = 0;
24+
this.player2Commits = 0;
25+
}
26+
27+
public boolean isTimeUp() {
28+
return System.currentTimeMillis() - startTime >= matchDuration * 3600000;
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package cmf.commitField.domain.user.service;
2+
3+
import cmf.commitField.domain.user.entity.MatchSession;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.data.redis.core.RedisTemplate;
6+
import org.springframework.messaging.simp.SimpMessagingTemplate;
7+
import org.springframework.stereotype.Service;
8+
9+
import java.util.List;
10+
import java.util.UUID;
11+
12+
@Service
13+
@RequiredArgsConstructor
14+
public class MatchService {
15+
private final String MATCH_QUEUE_KEY = "commit_match_queue";
16+
private final RedisTemplate<String, String> redisTemplate;
17+
private final SimpMessagingTemplate messagingTemplate;
18+
19+
public void enqueueUser(String userId, int matchDuration) {
20+
redisTemplate.opsForList().rightPush(MATCH_QUEUE_KEY, userId + ":" + matchDuration);
21+
checkAndMatch();
22+
}
23+
24+
private void checkAndMatch() {
25+
List<String> queue = redisTemplate.opsForList().range(MATCH_QUEUE_KEY, 0, -1);
26+
if (queue != null && queue.size() >= 2) {
27+
String player1 = queue.get(0);
28+
String player2 = queue.get(1);
29+
30+
// ๋‘ ์œ ์ €๋ฅผ ๋งค์นญ ํ›„ ์ œ๊ฑฐ
31+
redisTemplate.opsForList().leftPop(MATCH_QUEUE_KEY);
32+
redisTemplate.opsForList().leftPop(MATCH_QUEUE_KEY);
33+
34+
startMatch(player1, player2);
35+
}
36+
}
37+
38+
private void startMatch(String player1, String player2) {
39+
String matchId = UUID.randomUUID().toString();
40+
int matchDuration = Integer.parseInt(player1.split(":")[1]); // ๊ฒฝ์Ÿ ์‹œ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ
41+
42+
MatchSession matchSession = new MatchSession(matchId, player1, player2, matchDuration);
43+
redisTemplate.opsForHash().put("active_matches", matchId, matchSession);
44+
45+
messagingTemplate.convertAndSend("/topic/match", "๋งค์นญ ์™„๋ฃŒ: " + player1 + " vs " + player2);
46+
}
47+
}

โ€Žsrc/main/java/cmf/commitField/domain/user/service/UserService.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import cmf.commitField.domain.pet.entity.Pet;
66
import cmf.commitField.domain.pet.repository.PetRepository;
77
import cmf.commitField.domain.pet.service.PetService;
8+
import cmf.commitField.domain.user.dto.UserChatInfoDto;
89
import cmf.commitField.domain.user.dto.UserInfoDto;
910
import cmf.commitField.domain.user.entity.User;
1011
import cmf.commitField.domain.user.repository.UserRepository;
@@ -33,7 +34,18 @@ public void updateUserStatus(String username, boolean status) {
3334
userRepository.updateStatus(username, status);
3435
}
3536

36-
@Transactional
37+
public UserChatInfoDto showUserChatInfo(String username) {
38+
User user = userRepository.findByUsername(username).get();
39+
40+
return UserChatInfoDto.builder()
41+
.id(user.getId())
42+
.email(user.getEmail())
43+
.nickname(user.getNickname())
44+
.username(user.getUsername())
45+
.build();
46+
}
47+
48+
@Transactional
3749
public UserInfoDto showUserInfo(String username) {
3850
User user = userRepository.findByUsername(username).get();
3951
Pet pet = petRepository.findByUserEmail(user.getEmail()).get(0); // TODO: ํ™•์žฅ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ํ•„์š”

0 commit comments

Comments
ย (0)