Skip to content

Commit

Permalink
reconnect 수정, add 추가, 숲에서 금액대신 풍선갯수 기능 추가.
Browse files Browse the repository at this point in the history
  • Loading branch information
taromati committed Jan 12, 2025
1 parent de857e4 commit 2cb2ea4
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 86 deletions.
20 changes: 13 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,32 +1,38 @@
# Minecraft Chzzk / Soop 후원 연동 플러그인

## **지원 버전**
Java 버전: 21 이상
Java 버전: 21 이상, 17

※ Java 17 버전은 [1.7.2 버전](https://github.com/taromati/done-connector/releases/download/1.7.2/done-connector-1.7.2.jar)을 이용해 주세요. 1.7.2 버전은 마인크래프트 1.20.4까지만 지원 됩니다.
※ Java 17 버전은 아래 다운로드에서 17버전을 다운받고 파일명에서 -jdk17을 제거해주세요()을 이용해 주세요. 마인크래프트 1.20.4까지만 공식 지원 됩니다.

마인크래프트 서버 버전: Paper 1.18 ~ 1.21.3
마인크래프트 서버 버전: Paper 1.18 ~ 1.21.4

## **빌드 방법**

1. 터미널에서 `gradlew jar` 실행

## **다운로드 방법**
1. Github(https://github.com/taromati/done-connector) 의 Release 에서 [다운로드](https://github.com/taromati/done-connector/releases/download/1.8.0/done-connector-1.8.0.jar)

1. Github(https://github.com/taromati/done-connector) 의 Release 에서 다운로드
- [자바21버전](https://github.com/taromati/done-connector/releases/download/1.8.1/done-connector-1.8.1.jar)
- [자바17버전](https://github.com/taromati/done-connector/releases/download/1.8.1/done-connector-1.8.1-jdk17.jar)
## **실행 방법**

1. plugins 폴더에 done-connector-1.8.0.jar 파일을 넣고 마인크래프트 서버를 1회 실행 후 종료
1. plugins 폴더에 done-connector-1.8.1.jar 파일을 넣고 마인크래프트 서버를 1회 실행 후 종료
2. plugins 폴더에서 done-connector/config.yml 파일 수정
3. 마인크래프트 서버 실행


## **사용 방법**

* 플러그인 적용 후 서버 실행시 자동으로 기능 활성화
* `/done [on|off|reconnect|reload]` 명령어로 기능 제어
* `/done [on|off|reconnect|reload|add]` 명령어로 기능 제어
* `/done on` 후원자 연동 기능 활성화
* `/done off` 후원자 연동 기능 비활성화
* `/done reconnect all` 전체 재접속
* `/done reconnect <닉네임>` 해당 닉네임 재접속, 컨피그에서 치지직/숲 바로 아래 단계의 닉네임을 입력
* `/done reconnect <닉네임>` 해당 닉네임 재접속, 컨피그에서 치지직/숲 바로 아래 단계의 닉네임 혹은 마크닉네임 입력, 자동완성은 마크닉네임만 지원
* `/done reload` 설정 파일 리로드 및 재접속
* `/done add <플랫폼> <방송닉> <방송ID> <마크닉>` 도네연결 임시 추가, reload가 어려운 상황에서 임시로 연결 추가. 서버 재기동시에 없어짐

## 1.8.1 추가사항
* config.yml에 `숲풍선갯수로출력: false`을 추가해주세요, true로 할 경우 금액이 아닌 별풍선 갯수로 전달됩니다.
19 changes: 10 additions & 9 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,12 @@ dependencies {
compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
// jdk 17 시 아래 api 제거
// compileOnly("io.papermc.paper:paper-api:1.20.5-R0.1-SNAPSHOT")
// compileOnly("io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT")
// compileOnly("io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT")
// compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
// compileOnly("io.papermc.paper:paper-api:1.21.3-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.20.5-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.21-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.21.3-R0.1-SNAPSHOT")
compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")

compileOnly("org.projectlombok:lombok:1.18.32")
annotationProcessor("org.projectlombok:lombok:1.18.32")
Expand All @@ -48,11 +49,11 @@ dependencies {
implementation("com.googlecode.json-simple:json-simple:1.1.1")
}

//def sourceJavaVersion = 21
//def targetJavaVersion = 21
def sourceJavaVersion = 21
def targetJavaVersion = 21
// jdK 17
def sourceJavaVersion = 17
def targetJavaVersion = 17
//def sourceJavaVersion = 17
//def targetJavaVersion = 17
java {
def sourceVersion = JavaVersion.toVersion(sourceJavaVersion)
sourceCompatibility = sourceVersion
Expand Down
173 changes: 104 additions & 69 deletions src/main/java/me/taromati/doneconnector/DoneConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
Expand All @@ -20,6 +21,7 @@
import org.jetbrains.annotations.NotNull;

import java.util.*;
import java.util.stream.Collectors;

public final class DoneConnector extends JavaPlugin implements Listener {
public static Plugin plugin;
Expand Down Expand Up @@ -153,21 +155,41 @@ private void loadConfig() throws DoneException {

for (String nickname : nicknameList) {
Logger.debug("숲 닉네임: " + nickname);
String id = config.getString("숲." + nickname + ".식별자");
Logger.debug("숲 아이디: " + id);
String tag = config.getString("숲." + nickname + ".마크닉네임");
Logger.debug("숲 마크닉네임: " + tag);
if (config.getString("숲." + nickname + ".식별자") != null) {
String id = config.getString("숲." + nickname + ".식별자");
Logger.debug("숲 아이디: " + id);
String tag = config.getString("숲." + nickname + ".마크닉네임");
Logger.debug("숲 마크닉네임: " + tag);

if (id == null || tag == null) {
throw new DoneException(ExceptionCode.ID_NOT_FOUND);
}

if (id == null || tag == null) {
throw new DoneException(ExceptionCode.ID_NOT_FOUND);
Map<String, String> userMap = new HashMap<>();
userMap.put("nickname", nickname);
userMap.put("id", id);
userMap.put("tag", tag);
soopUserList.add(userMap);
Logger.debug("숲 유저: " + userMap);
} else if (config.getString("아프리카." + nickname + ".식별자") != null) {
// TODO: 하위호환용, 추후 제거.
String id = config.getString("아프리카." + nickname + ".식별자");
Logger.debug("아프리카 아이디: " + id);
String tag = config.getString("아프리카." + nickname + ".마크닉네임");
Logger.debug("아프리카 마크닉네임: " + tag);

if (id == null || tag == null) {
throw new DoneException(ExceptionCode.ID_NOT_FOUND);
}

Map<String, String> userMap = new HashMap<>();
userMap.put("nickname", nickname);
userMap.put("id", id);
userMap.put("tag", tag);
soopUserList.add(userMap);
Logger.debug("아프리카 유저: " + userMap);
}

Map<String, String> userMap = new HashMap<>();
userMap.put("nickname", nickname);
userMap.put("id", id);
userMap.put("tag", tag);
soopUserList.add(userMap);
Logger.debug("숲 유저: " + userMap);
}
} catch (Exception e) {
throw new DoneException(ExceptionCode.ID_NOT_FOUND);
Expand Down Expand Up @@ -195,21 +217,27 @@ private void loadConfig() throws DoneException {
}

private void disconnectByNickName(String target) {
for (ChzzkWebSocket webSocket : chzzkWebSocketList) {
if (Objects.equals(webSocket.getChzzkUser().get("nickname"), target) || Objects.equals(webSocket.getChzzkUser().get("tag"), target)) {
webSocket.close();
chzzkWebSocketList.remove(webSocket);
}
}
for (SoopWebSocket webSocket : soopWebSocketList) {
if (Objects.equals(webSocket.getSoopUser().get("nickname"), target) || Objects.equals(webSocket.getSoopUser().get("tag"), target)) {
webSocket.close();
soopWebSocketList.remove(webSocket);
}
}
chzzkWebSocketList = chzzkWebSocketList.stream()
.filter(chzzkWebSocket -> {
if (Objects.equals(chzzkWebSocket.getChzzkUser().get("nickname"), target) || Objects.equals(chzzkWebSocket.getChzzkUser().get("tag"), target)) {
chzzkWebSocket.close();
return false;
}
return true;
})
.collect(Collectors.toList());
soopWebSocketList = soopWebSocketList.stream()
.filter(soopWebSocket -> {
if (Objects.equals(soopWebSocket.getSoopUser().get("nickname"), target) || Objects.equals(soopWebSocket.getSoopUser().get("tag"), target)) {
soopWebSocket.close();
return false;
}
return true;
})
.collect(Collectors.toList());
}

private void connectChzzk(Map<String, String> chzzkUser) throws InterruptedException {
private boolean connectChzzk(Map<String, String> chzzkUser) {
try {
String chzzkId = chzzkUser.get("id");
String chatChannelId = ChzzkApi.getChatChannelId(chzzkId);
Expand All @@ -225,9 +253,11 @@ private void connectChzzk(Map<String, String> chzzkUser) throws InterruptedExcep
ChzzkWebSocket webSocket = new ChzzkWebSocket("wss://kr-ss1.chat.naver.com/chat", chatChannelId, accessToken, extraToken, chzzkUser, donationRewards);
webSocket.connect();
chzzkWebSocketList.add(webSocket);
return true;
} catch (Exception e) {
Logger.error("[ChzzkWebsocket][" + chzzkUser.get("nickname") + "] 치지직 채팅에 연결 중 오류가 발생했습니다.");
Logger.debug(e.getMessage());
return false;
}
}

Expand All @@ -245,7 +275,7 @@ private void disconnectChzzkList() throws InterruptedException {
chzzkWebSocketList.clear();
}

private void connectSoop(Map<String, String> soopUser) throws InterruptedException {
private boolean connectSoop(Map<String, String> soopUser) throws InterruptedException {
String soopId = soopUser.get("id");

try {
Expand All @@ -257,10 +287,11 @@ private void connectSoop(Map<String, String> soopUser) throws InterruptedExcepti
SoopWebSocket webSocket = new SoopWebSocket("wss://" + liveInfo.CHDOMAIN() + ":" + liveInfo.CHPT() + "/Websocket/" + liveInfo.BJID(), draft6455, liveInfo, soopUser, donationRewards, poong);
webSocket.connect();
soopWebSocketList.add(webSocket);
return true;
} catch (Exception e) {
Logger.error("[SoopWebsocket][" + soopUser.get("nickname") + "] 숲 채팅에 연결 중 오류가 발생했습니다.");

Logger.debug(e.getMessage());
return false;
}
}

Expand Down Expand Up @@ -318,33 +349,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St

return true;
}
// 닉네임으로 재접속
{
disconnectByNickName(target);
Map<String, String> chzzkUser = chzzkUserList.stream()
.filter(user -> Objects.equals(user.get("nickname"), target))
.toList()
.get(0);
if (chzzkUser != null) {
connectChzzk(chzzkUser);
Logger.info(ChatColor.GREEN + "[" + target + "] 재 접속을 완료 했습니다.");
}

Map<String, String> soopUser = soopUserList.stream()
.filter(user -> Objects.equals(user.get("nickname"), target))
.toList()
.get(0);
if (soopUser != null) {
connectSoop(soopUser);
Logger.info(ChatColor.GREEN + "[" + target + "] 재 접속을 완료 했습니다.");
}

if (chzzkUser == null && soopUser == null) {
Logger.warn("닉네임을 찾을 수 없습니다.");
return false;
}
}

// 방송/마크 닉네임으로 재접속
{
disconnectByNickName(target);
int reconnectCount = chzzkUserList.stream()
Expand All @@ -354,7 +359,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
connectChzzk(user);
Logger.info(ChatColor.GREEN + "[" + target + "] 재 접속을 완료 했습니다.");
return 1;
} catch (InterruptedException e) {
} catch (Exception e) {
Logger.error("[" + target + "] 채팅에 연결 중 오류가 발생했습니다.");
}
return 0;
Expand All @@ -369,7 +374,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
connectSoop(user);
Logger.info(ChatColor.GREEN + "[" + target + "] 재 접속을 완료 했습니다.");
return 1;
} catch (InterruptedException e) {
} catch (Exception e) {
Logger.error("[" + target + "] 채팅에 연결 중 오류가 발생했습니다.");
}
return 0;
Expand All @@ -382,6 +387,37 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
}
} else if (cmd.equalsIgnoreCase("add")) {
if (args.length < 5) {
Logger.error("옵션 누락. /done add <플랫폼> <방송닉> <방송ID> <마크닉>");
return false;
}
String platform = args[1];
String nickname = args[2];
String id = args[3];
String tag = args[4];

switch (platform) {
case "치지직" -> {
Map<String, String> userMap = new HashMap<>();
userMap.put("nickname", nickname);
userMap.put("id", id);
userMap.put("tag", tag);

if (connectChzzk(userMap)) {
chzzkUserList.add(userMap);
}
}
case "숲" -> {
Map<String, String> userMap = new HashMap<>();
userMap.put("nickname", nickname);
userMap.put("id", id);
userMap.put("tag", tag);
if (connectSoop(userMap)) {
soopUserList.add(userMap);
}
}
}

} else if (cmd.equalsIgnoreCase("reload")) {
Logger.warn("후원 설정을 다시 불러옵니다.");
Expand All @@ -394,7 +430,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
} else {
return false;
}
} catch (InterruptedException e) {
} catch (Exception e) {
Logger.error("커맨드 수행 중 오류가 발생했습니다.");

return false;
Expand All @@ -413,7 +449,7 @@ public List<String> onTabComplete(CommandSender sender, @NotNull Command cmd, @N
}

if (args.length == 1) {
List<String> commandList = new ArrayList<>(Arrays.asList("on", "off", "reconnect", "reload"));
List<String> commandList = new ArrayList<>(Arrays.asList("on", "off", "reconnect", "reload", "add"));

if (args[0].isEmpty()) {
return commandList;
Expand All @@ -424,17 +460,16 @@ public List<String> onTabComplete(CommandSender sender, @NotNull Command cmd, @N
}
}

// TODO: Test
// if (args.length == 2 && args[0].equalsIgnoreCase("reconnect")) {
// if (args[1].isEmpty()) {
// return new ArrayList<>(List.of("all"));
// } else {
// return Bukkit.getOnlinePlayers().stream()
// .map(Player::getName)
// .filter(name -> name.toLowerCase().startsWith(args[1].toLowerCase()))
// .toList();
// }
// }
if (args.length == 2 && args[0].equalsIgnoreCase("reconnect")) {
if (args[1].isEmpty()) {
return new ArrayList<>(List.of("all"));
} else {
return Bukkit.getOnlinePlayers().stream()
.map(Player::getName)
.filter(name -> name.toLowerCase().startsWith(args[1].toLowerCase()))
.toList();
}
}

return Collections.emptyList();
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ api-version: '1.18'
commands:
done:
description: 후원 기능 상태를 변경.
usage: /<command> [on|off|reconnect|reload]
usage: /<command> [on|off|reconnect|reload|add]

0 comments on commit 2cb2ea4

Please sign in to comment.