diff --git a/.idea/McLiveAPI.iml b/.idea/McLiveAPI.iml index 735519e..1f4702c 100644 --- a/.idea/McLiveAPI.iml +++ b/.idea/McLiveAPI.iml @@ -4,8 +4,8 @@ - SPIGOT BUNGEECORD + SPIGOT diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lib/PixelLivePlugin.jar b/lib/PixelLivePlugin.jar new file mode 100644 index 0000000..e34e641 Binary files /dev/null and b/lib/PixelLivePlugin.jar differ diff --git a/out/artifacts/McLiveAPI/McLiveAPI.jar b/out/artifacts/McLiveAPI/McLiveAPI.jar deleted file mode 100644 index fe6fff8..0000000 Binary files a/out/artifacts/McLiveAPI/McLiveAPI.jar and /dev/null differ diff --git a/src/main/java/com/io/yutian/livemutually/liveroom/Gift.java b/src/main/java/com/io/yutian/livemutually/liveroom/Gift.java deleted file mode 100644 index 75beb27..0000000 --- a/src/main/java/com/io/yutian/livemutually/liveroom/Gift.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.io.yutian.livemutually.liveroom; - -public interface Gift { - - User user(); - - String name(); - - long count(); - -} diff --git a/src/main/java/com/io/yutian/livemutually/liveroom/KSLiveRoomClient.java b/src/main/java/com/io/yutian/livemutually/liveroom/KSLiveRoomClient.java deleted file mode 100644 index 233c9b7..0000000 --- a/src/main/java/com/io/yutian/livemutually/liveroom/KSLiveRoomClient.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.io.yutian.livemutually.liveroom; - -import com.io.yutian.livemutually.wss.KSWebSocketClient; -import com.io.yutian.mclive.Main; -import org.bukkit.entity.Player; - -import java.net.URI; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class KSLiveRoomClient { - - private static final String URL = "ws://localhost:8765"; - private String roomId; - private Map headMap = new HashMap<>(); - private KSWebSocketClient socketClient; - private ExecutorService executor = Executors.newCachedThreadPool(); - - public KSLiveRoomClient(String roomId) { - this.roomId = roomId; - headMap.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1"); - headMap.put("Content-Type", "text/plain;charset=UTF-8"); - headMap.put("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); - headMap.put("cookie", "__ac_nonce=0638733a400869171be51"); - } - - public KSWebSocketClient getSocketClient() { - return socketClient; - } - - public void openRoom(Player player) throws Exception { - URI uri = new URI(URL); - KSWebSocketClient ksWebSocketClient = new KSWebSocketClient(player, uri, headMap); - socketClient = ksWebSocketClient; - Main.LiveRoomClientList.add(ksWebSocketClient); - executor.submit(() -> socketClient.run()); - } - - public void close() { - if (socketClient == null || socketClient.isClosed() || socketClient.isClosing()) { - return; - } - socketClient.setForcedClose(true); - socketClient.close(); - } - - public String getRoomId() { - return roomId; - } -} diff --git a/src/main/java/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.java b/src/main/java/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.java index 095debb..cffe0da 100644 --- a/src/main/java/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.java +++ b/src/main/java/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.java @@ -1,5 +1,7 @@ package com.io.yutian.livemutually.liveroom; +import org.bukkit.Bukkit; + import java.util.Objects; import java.util.function.Consumer; @@ -9,7 +11,6 @@ public class LiveRoomWatcher { protected Consumer userHandler; protected Consumer likeHandler; protected Consumer followHandler; - protected Consumer giftHandler; public final LiveRoomWatcher onChat(Consumer handler) { Objects.requireNonNull(handler); @@ -35,12 +36,6 @@ public class LiveRoomWatcher { return this; } - public final LiveRoomWatcher onGift(Consumer handler) { - Objects.requireNonNull(handler); - this.giftHandler = handler; - return this; - } - public void callChat(Chat chat) { if (chatHandler != null) { chatHandler.accept(chat); @@ -65,10 +60,4 @@ public class LiveRoomWatcher { } } - public void callGift(Gift gift) { - if (giftHandler != null) { - giftHandler.accept(gift); - } - } - } diff --git a/src/main/java/com/io/yutian/livemutually/liveroom/新建文本文档.txt b/src/main/java/com/io/yutian/livemutually/liveroom/新建文本文档.txt deleted file mode 100644 index d0aa534..0000000 --- a/src/main/java/com/io/yutian/livemutually/liveroom/新建文本文档.txt +++ /dev/null @@ -1,157 +0,0 @@ -package com.io.yutian.livemutually.wss; - -import com.io.yutian.livemutually.liveroom.KSLiveRoomClient; -import com.io.yutian.livemutually.liveroom.LiveRoomWatcher; -import com.io.yutian.livemutually.liveroom.User; -import com.io.yutian.mclive.Main; -import json.JSONObject; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft_6455; -import org.java_websocket.handshake.ServerHandshake; - -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -public class KSWebSocketClient extends WebSocketClient { - - private Player player; - private LiveRoomWatcher liveRoomWatcher; - - public Player getPlayer() { - return player; - } - - public KSWebSocketClient(Player player, URI uri, Map httpHeaders) { - super(uri, new Draft_6455(), httpHeaders); - this.player = player; - this.liveRoomWatcher = new KSAPILiveRoomWatcher(player); - Bukkit.getConsoleSender().sendMessage("#WebSocketClient 已创建."); - } - - @Override - public void onOpen(ServerHandshake serverHandshake) { - this.send(); - } - - public HashMap hashMap = new HashMap<>(); - @Override - public void onMessage(String s) { - //if(s.isEmpty()){return;} - Bukkit.getConsoleSender().sendMessage("TEST = "+s); - Bukkit.getConsoleSender().sendMessage("TEST = "+new JSONObject(s)); - JSONObject jsonObject = new JSONObject(s); - /*String type = jsonObject.getString("type"); - if (!type.equalsIgnoreCase("liudui")) { - if (type.equalsIgnoreCase("礼物")) { - String username = jsonObject.getString("昵称"); - String userpng = jsonObject.getString("头像"); - if(hashMap.get(userpng) != null){ - username = hashMap.get(userpng); - } - String giftname = jsonObject.getString("礼物名称"); - int amount = jsonObject.getInt("礼物增量"); - if (amount >= 1){ - liveRoomWatcher.callGift(new KuaiShouGift(username, giftname, amount)); - } - }else if (type.equalsIgnoreCase("muyu")) { - String user = jsonObject.getString("user"); - int zan = jsonObject.getInt("zan"); - liveRoomWatcher.callLike(new KuaiShouLike(user, zan)); - } else if (type.equalsIgnoreCase("点赞")) { - String user = jsonObject.getString("昵称"); - int zan = jsonObject.getInt("点赞次数"); - liveRoomWatcher.callLike(new KuaiShouLike(user, zan)); - } else if (type.equalsIgnoreCase("fayan")) { - String nickname = jsonObject.getString("nickname"); - String headurl = jsonObject.getString("headurl"); - String nr = jsonObject.getString("nr"); - liveRoomWatcher.callChat(new KuaiShouChat(nickname, nr)); - } else if (type.equalsIgnoreCase("gift")) { - String username = jsonObject.getString("giftusername"); - String giftpic = jsonObject.getString("giftpic"); - hashMap.put(giftpic,username); - int amount = jsonObject.getInt("liwushuliang"); - String giftPic2 = jsonObject.getString("liwutupian"); - String nr = jsonObject.getString("giftnr"); - String giftname = nr.split("个")[1]; - } else if (type.equalsIgnoreCase("others")) { - String qian = jsonObject.getString("qian"); - if(qian.contains("欢迎")){ - String nr = jsonObject.getString("othernr"); - String userName = nr.split(" 进入")[0]; - liveRoomWatcher.callUser(new KuaiShouUser(userName)); - } - } - }*/ - } - - @Override - public void onClose(int i, String s, boolean b) { - } - - @Override - public void onError(Exception e) { - e.printStackTrace(); - } - - private void sendVerify() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type", "register"); - KSWebSocketClient.this.send(jsonObject.toString().getBytes()); - } - - public void send() { - new BukkitRunnable() { - @Override - public void run() { - if (!KSWebSocketClient.this.isOpen()) { - // Bukkit.getConsoleSender().sendMessage("[直播互动] 心跳检测失败,已自动重连."); - // restartReconnectionTimer(); - cancel(); - return; - } - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type", "heartbeat"); - KSWebSocketClient.this.send(jsonObject.toString().getBytes()); - } - }.runTaskTimerAsynchronously(Main.plugin, 0L, 10 * 20L); - } - - private boolean forcedClose = false; - private volatile boolean isReconnecting = false; - - public void setForcedClose(boolean forcedClose) { - this.forcedClose = forcedClose; - } - - private void restartReconnectionTimer() { - new BukkitRunnable() { - private int i = 0; - @Override - public void run() { - try { - if (reconnectBlocking()) { - cancel(); - isReconnecting = false; - return; - } - if (i >= 100) { - if (player != null) { - player.sendMessage("§c[系统]§a直播间自动重连失败..."); - } - cancel(); - return; - } - i++; - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }.runTaskTimerAsynchronously(Main.plugin, 0L, 5L); - } - -} diff --git a/src/main/java/com/io/yutian/livemutually/manager/GiftData.java b/src/main/java/com/io/yutian/livemutually/manager/GiftData.java new file mode 100644 index 0000000..adcb49d --- /dev/null +++ b/src/main/java/com/io/yutian/livemutually/manager/GiftData.java @@ -0,0 +1,32 @@ +package com.io.yutian.livemutually.manager; + +public class GiftData { + + private String name; + + private long amount; + + private long sendTime; + + public GiftData(String name,long amount,long sendTime){ + this.name = name; + this.amount = amount; + this.sendTime = sendTime; + } + + public long getAmount() { + return amount; + } + + public String getName() { + return name; + } + + public long getSendTime() { + return sendTime; + } + + public void setSendTime(long sendTime) { + this.sendTime = sendTime; + } +} diff --git a/src/main/java/com/io/yutian/livemutually/manager/KSLiveRoomManager.java b/src/main/java/com/io/yutian/livemutually/manager/KSLiveRoomManager.java index 40b8dbc..3e5c933 100644 --- a/src/main/java/com/io/yutian/livemutually/manager/KSLiveRoomManager.java +++ b/src/main/java/com/io/yutian/livemutually/manager/KSLiveRoomManager.java @@ -1,63 +1,33 @@ package com.io.yutian.livemutually.manager; import cn.hamster3.cdapi.CDTimeAPI; -import com.io.yutian.livemutually.liveroom.KSLiveRoomClient; import com.io.yutian.mclive.*; +import com.io.yutian.pixelliveplugin.PixelLiveAPI; import com.io.yutian.verify.AESUtil; import org.bukkit.entity.Player; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import java.util.regex.Pattern; public class KSLiveRoomManager { - public static Map liveRoomClientMap = new HashMap<>(); - - public static void connect(Player player, String id) { - if (isConnected(player)) { - disconnect(player); - return; - } - if(!Pattern.matches("[a-zA-Z0-9_]+", id)) { - return; - } - String pluginName = Main.configYml.getGameMode(); - if (AESUtil.isVerifyCheck(player,pluginName,id)) { - return; - } - CDTimeAPI.setPlayerCD(player.getUniqueId(),"link_live_Cd",1000 * 6); - KSLiveRoomClient liveRoomClient = new KSLiveRoomClient(id); - try { - liveRoomClient.openRoom(player); - } catch (Exception e) { - e.printStackTrace(); - } - liveRoomClientMap.put(player, liveRoomClient); - if (player != null) { - player.sendMessage("§c[系统]§a您的直播间: §e" + id + " §a已连接..."); - } - } - - public static KSLiveRoomClient getLiveRoomClient(Player player) { - return liveRoomClientMap.get(player); - } + public static List livepluginList = new ArrayList<>(); public static boolean isConnected(Player player) { - KSLiveRoomClient liveRoomClient = getLiveRoomClient(player); - return liveRoomClient != null && liveRoomClient.getSocketClient() != null && liveRoomClient.getSocketClient().isOpen(); + if(livepluginList.contains(player)){ + return true; + } + return false; } public static void disconnect(Player player) { if (!isConnected(player)) { return; } - KSLiveRoomClient liveRoomClient = getLiveRoomClient(player); - liveRoomClient.close(); - if (player != null) { - player.sendMessage("§c[系统]§b已断开直播间连接..."); - } - liveRoomClientMap.remove(player); + livepluginList.remove(player); + PixelLiveAPI.disconnect(player); + player.sendMessage("§c[系统]§b已断开直播间连接..."); } } diff --git a/src/main/java/com/io/yutian/livemutually/manager/UserData.java b/src/main/java/com/io/yutian/livemutually/manager/UserData.java new file mode 100644 index 0000000..5118082 --- /dev/null +++ b/src/main/java/com/io/yutian/livemutually/manager/UserData.java @@ -0,0 +1,39 @@ +package com.io.yutian.livemutually.manager; + +import java.util.HashMap; + +public class UserData { + + private String userName; + // 礼物 礼物数据 + private HashMap giftData = new HashMap<>(); + + public UserData(String userName){ + this.userName = userName; + this.giftData = new HashMap<>(); + } + + public String getUserName() { + return userName; + } + + // 判断本次赠送礼物是否已送过 + public boolean isExitGift(String giftName){ + if(giftData.get(giftName) != null){ + return true; + } + return false; + } + + public GiftData getGiftsData(String giftName){ + if(giftData.get(giftName) != null){ + return giftData.get(giftName); + } + return null; + } + + public void createGiftsData(String giftName,long giftAmount){ + long sendTime = System.currentTimeMillis(); + giftData.put(giftName,new GiftData(giftName,giftAmount,sendTime)); + } +} diff --git a/src/main/java/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.java b/src/main/java/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.java index a9094ea..f25d721 100644 --- a/src/main/java/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.java +++ b/src/main/java/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.java @@ -4,7 +4,6 @@ import com.io.yutian.livemutually.liveroom.LiveRoomWatcher; import com.io.yutian.mclive.Main; import com.io.yutian.mclive.event.LiveChatEvents; import com.io.yutian.mclive.event.LiveEnterEvents; -import com.io.yutian.mclive.event.LiveGiftEvents; import com.io.yutian.mclive.event.LiveLikeEvents; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -33,26 +32,5 @@ public class KSAPILiveRoomWatcher extends LiveRoomWatcher { Bukkit.getPluginManager().callEvent(event); }); }); - onGift(gift -> { - String giftName = gift.name(); - long count = gift.count(); - String count_color = "§a"; - if (count >= 1314) { - count_color = "§c"; - } else if (count >= 520) { - count_color = "§d"; - } else if (count >= 188) { - count_color = "§e"; - } else if (count >= 66) { - count_color = "§b"; - } - String message = "§6[日志 - 礼物触发] §f"+player.getName()+ " >>> " + gift.user().nickName() + " = §a" + giftName + " 数量: "+count_color + count; - Bukkit.getConsoleSender().sendMessage(message); - Bukkit.getScheduler().runTask(Main.plugin, () -> { - LiveGiftEvents event = new LiveGiftEvents(player, gift.user(), gift.name(), gift.count()); - Bukkit.getPluginManager().callEvent(event); - }); - }); } - } diff --git a/src/main/java/com/io/yutian/livemutually/wss/KSWebSocketClient.java b/src/main/java/com/io/yutian/livemutually/wss/KSWebSocketClient.java deleted file mode 100644 index d0aa534..0000000 --- a/src/main/java/com/io/yutian/livemutually/wss/KSWebSocketClient.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.io.yutian.livemutually.wss; - -import com.io.yutian.livemutually.liveroom.KSLiveRoomClient; -import com.io.yutian.livemutually.liveroom.LiveRoomWatcher; -import com.io.yutian.livemutually.liveroom.User; -import com.io.yutian.mclive.Main; -import json.JSONObject; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.drafts.Draft_6455; -import org.java_websocket.handshake.ServerHandshake; - -import java.net.URI; -import java.util.HashMap; -import java.util.Map; - -public class KSWebSocketClient extends WebSocketClient { - - private Player player; - private LiveRoomWatcher liveRoomWatcher; - - public Player getPlayer() { - return player; - } - - public KSWebSocketClient(Player player, URI uri, Map httpHeaders) { - super(uri, new Draft_6455(), httpHeaders); - this.player = player; - this.liveRoomWatcher = new KSAPILiveRoomWatcher(player); - Bukkit.getConsoleSender().sendMessage("#WebSocketClient 已创建."); - } - - @Override - public void onOpen(ServerHandshake serverHandshake) { - this.send(); - } - - public HashMap hashMap = new HashMap<>(); - @Override - public void onMessage(String s) { - //if(s.isEmpty()){return;} - Bukkit.getConsoleSender().sendMessage("TEST = "+s); - Bukkit.getConsoleSender().sendMessage("TEST = "+new JSONObject(s)); - JSONObject jsonObject = new JSONObject(s); - /*String type = jsonObject.getString("type"); - if (!type.equalsIgnoreCase("liudui")) { - if (type.equalsIgnoreCase("礼物")) { - String username = jsonObject.getString("昵称"); - String userpng = jsonObject.getString("头像"); - if(hashMap.get(userpng) != null){ - username = hashMap.get(userpng); - } - String giftname = jsonObject.getString("礼物名称"); - int amount = jsonObject.getInt("礼物增量"); - if (amount >= 1){ - liveRoomWatcher.callGift(new KuaiShouGift(username, giftname, amount)); - } - }else if (type.equalsIgnoreCase("muyu")) { - String user = jsonObject.getString("user"); - int zan = jsonObject.getInt("zan"); - liveRoomWatcher.callLike(new KuaiShouLike(user, zan)); - } else if (type.equalsIgnoreCase("点赞")) { - String user = jsonObject.getString("昵称"); - int zan = jsonObject.getInt("点赞次数"); - liveRoomWatcher.callLike(new KuaiShouLike(user, zan)); - } else if (type.equalsIgnoreCase("fayan")) { - String nickname = jsonObject.getString("nickname"); - String headurl = jsonObject.getString("headurl"); - String nr = jsonObject.getString("nr"); - liveRoomWatcher.callChat(new KuaiShouChat(nickname, nr)); - } else if (type.equalsIgnoreCase("gift")) { - String username = jsonObject.getString("giftusername"); - String giftpic = jsonObject.getString("giftpic"); - hashMap.put(giftpic,username); - int amount = jsonObject.getInt("liwushuliang"); - String giftPic2 = jsonObject.getString("liwutupian"); - String nr = jsonObject.getString("giftnr"); - String giftname = nr.split("个")[1]; - } else if (type.equalsIgnoreCase("others")) { - String qian = jsonObject.getString("qian"); - if(qian.contains("欢迎")){ - String nr = jsonObject.getString("othernr"); - String userName = nr.split(" 进入")[0]; - liveRoomWatcher.callUser(new KuaiShouUser(userName)); - } - } - }*/ - } - - @Override - public void onClose(int i, String s, boolean b) { - } - - @Override - public void onError(Exception e) { - e.printStackTrace(); - } - - private void sendVerify() { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type", "register"); - KSWebSocketClient.this.send(jsonObject.toString().getBytes()); - } - - public void send() { - new BukkitRunnable() { - @Override - public void run() { - if (!KSWebSocketClient.this.isOpen()) { - // Bukkit.getConsoleSender().sendMessage("[直播互动] 心跳检测失败,已自动重连."); - // restartReconnectionTimer(); - cancel(); - return; - } - JSONObject jsonObject = new JSONObject(); - jsonObject.put("type", "heartbeat"); - KSWebSocketClient.this.send(jsonObject.toString().getBytes()); - } - }.runTaskTimerAsynchronously(Main.plugin, 0L, 10 * 20L); - } - - private boolean forcedClose = false; - private volatile boolean isReconnecting = false; - - public void setForcedClose(boolean forcedClose) { - this.forcedClose = forcedClose; - } - - private void restartReconnectionTimer() { - new BukkitRunnable() { - private int i = 0; - @Override - public void run() { - try { - if (reconnectBlocking()) { - cancel(); - isReconnecting = false; - return; - } - if (i >= 100) { - if (player != null) { - player.sendMessage("§c[系统]§a直播间自动重连失败..."); - } - cancel(); - return; - } - i++; - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }.runTaskTimerAsynchronously(Main.plugin, 0L, 5L); - } - -} diff --git a/src/main/java/com/io/yutian/livemutually/wss/KuaiShouGift.java b/src/main/java/com/io/yutian/livemutually/wss/KuaiShouGift.java deleted file mode 100644 index 0cebf0e..0000000 --- a/src/main/java/com/io/yutian/livemutually/wss/KuaiShouGift.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.io.yutian.livemutually.wss; - -import com.io.yutian.livemutually.liveroom.Gift; -import com.io.yutian.livemutually.liveroom.User; - -public class KuaiShouGift implements Gift { - - private String userName; - private String giftName; - private int amount; - - private User user; - - public KuaiShouGift(String userName, String giftName, int amount) { - this.userName = userName; - this.giftName = giftName; - this.amount = amount; - this.user = new KuaiShouUser(userName); - } - - @Override - public User user() { - return user; - } - - @Override - public String name() { - return giftName; - } - - @Override - public long count() { - return amount; - } - -} diff --git a/src/main/java/com/io/yutian/mclive/ConfigYml.java b/src/main/java/com/io/yutian/mclive/ConfigYml.java index 4c8d798..c5138a9 100644 --- a/src/main/java/com/io/yutian/mclive/ConfigYml.java +++ b/src/main/java/com/io/yutian/mclive/ConfigYml.java @@ -8,10 +8,15 @@ import java.util.HashMap; public class ConfigYml { private String GameMode; + private long gifts_delay; private boolean MainDebug; private HashMap RoomId_Map = new HashMap<>(); public ConfigYml(FileConfiguration yml) { + this.gifts_delay = 3500; + if (yml.getLong("GiftDelay") >= 1000) { + this.gifts_delay = yml.getLong("GiftDelay"); + } this.MainDebug = yml.getBoolean("MainDebug"); this.GameMode = yml.getString("GameMode"); Bukkit.getConsoleSender().sendMessage("§b[整蛊MC直播] §7对接游戏: §e"+ this.GameMode); @@ -55,6 +60,13 @@ public class ConfigYml { MainDebug = butt; } + public long getGifts_delay() {return gifts_delay;} + public void setGifts_delay(long gifts_delay) { + FileConfiguration yml = Main.plugin.getConfig(); + yml.set("GiftDelay",gifts_delay); + Main.plugin.saveConfig(); + this.gifts_delay = gifts_delay; + } public String getGameMode() { return this.GameMode; } diff --git a/src/main/java/com/io/yutian/mclive/LinkRoom.java b/src/main/java/com/io/yutian/mclive/LinkRoom.java index 72b115d..33d06b7 100644 --- a/src/main/java/com/io/yutian/mclive/LinkRoom.java +++ b/src/main/java/com/io/yutian/mclive/LinkRoom.java @@ -1,9 +1,14 @@ package com.io.yutian.mclive; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerSwapHandItemsEvent; @@ -24,6 +29,33 @@ public class LinkRoom implements Listener { } } + @EventHandler + public void onJoin(PlayerJoinEvent e){ + Player p = e.getPlayer(); + e.setJoinMessage(null); + if (!Main.check_plugin) { + return; + } + String playName = p.getName(); + String roomId = Main.configYml.getRoomId(playName); + if(Main.configYml.getRoomId(playName) != null) { + String message = "§7[§6提示§7] §f当前账号: §a§n" + playName + "§r §f抖音号: §b" + roomId + " §c【点击复制链接】"; + SendClickMessage(p, message, roomId); + SendClickMessage(p, message, roomId); + SendClickMessage(p, message, roomId); + }else{ + String message = "§7[§6提示§7] §f当前账号: §c§n" + playName + "§r §f并未绑定抖音ID"; + p.sendMessage(message); + } + } + + public static void SendClickMessage(Player player,String message,String roomId){ + TextComponent tomessage = new TextComponent(message); + tomessage.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://live.douyin.com/"+roomId)); + tomessage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§9By.极光像素工作室").create())); + player.spigot().sendMessage(tomessage); + } + @EventHandler public void onQuit(PlayerQuitEvent e){ Player player = e.getPlayer(); diff --git a/src/main/java/com/io/yutian/mclive/LiveAdminGui.java b/src/main/java/com/io/yutian/mclive/LiveAdminGui.java index 6ea6fe0..3ad0f7c 100644 --- a/src/main/java/com/io/yutian/mclive/LiveAdminGui.java +++ b/src/main/java/com/io/yutian/mclive/LiveAdminGui.java @@ -2,8 +2,15 @@ package com.io.yutian.mclive; import cn.hamster3.cdapi.CDTimeAPI; import com.io.yutian.livemutually.manager.KSLiveRoomManager; -import com.io.yutian.livemutually.wss.KSWebSocketClient; +import com.io.yutian.livemutually.wss.KuaiShouUser; +import com.io.yutian.mclive.Util.MessageUtil; +import com.io.yutian.mclive.event.LiveConnectEvents; +import com.io.yutian.mclive.event.LiveGiftEvents; import com.io.yutian.mclive.event.ZhuboAPI; +import com.io.yutian.pixelliveplugin.PixelLiveAPI; +import com.io.yutian.pixelliveplugin.PixelLivePlugin; +import com.io.yutian.pixelliveplugin.event.KeyInputEvent; +import com.io.yutian.pixelliveplugin.event.WSMessageEvent; import com.io.yutian.verify.AESUtil; import org.bukkit.*; import org.bukkit.entity.Player; @@ -14,6 +21,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; import java.util.ArrayList; import java.util.HashMap; @@ -22,7 +30,6 @@ import java.util.List; public class LiveAdminGui implements Listener { public static String invTitle = "我的世界整蛊玩法操作界面"; - @EventHandler public void onclick(InventoryClickEvent e){ int rawSlot = e.getRawSlot(); @@ -44,19 +51,48 @@ public class LiveAdminGui implements Listener { if (ZhuboAPI.isRoomisConnected(player)) { return; } - if(Main.LiveRoomClientList.size() >= 1) { - for (KSWebSocketClient socketClient : Main.LiveRoomClientList) { - if (socketClient.getPlayer().equals(player)) { - if (socketClient.isOpen()) { - socketClient.setForcedClose(true); - } - socketClient.close(); - KSLiveRoomManager.liveRoomClientMap.remove(player); - } - } + if(System.currentTimeMillis() >= 1723680000000L){ // 2024年8月15日 此插件将过期 + player.sendMessage("§c[系统]§a当前插件版本太老,请联系作者更新。"); + player.sendMessage("§c[系统]§a当前插件版本太老,请联系作者更新。"); + player.sendMessage("§c[系统]§a当前插件版本太老,请联系作者更新。"); + return; } + String pluginName = Main.configYml.getGameMode(); String roomId = Main.configYml.getRoomId(playName); - KSLiveRoomManager.connect(player,roomId); + if (AESUtil.isVerifyCheck(player,pluginName,roomId)) { + return; + } + LiveConnectEvents event = new LiveConnectEvents(player,roomId,pluginName); + Bukkit.getPluginManager().callEvent(event); + if(ZhuboAPI.getRoomLiveName().equalsIgnoreCase("KuaiShou")) { + new BukkitRunnable() { + private int i = 0; + private int link = 1; + @Override + public void run() { + if (i >= 4) { + long cdTime = CDTimeAPI.getCD(player.getUniqueId(),"tingcloud_cd"); + if(cdTime > 0){ + player.sendMessage("§c[系统]§a听云整蛊连接成功."); + cancel(); + return; + } + PixelLiveAPI.connect(player, "127.0.0.1", 8765); + player.sendMessage("§c[系统]§a正在尝试§e[第"+link+"次]§a连接."); + link++; + i -= 4; + } + i++; + } + }.runTaskTimerAsynchronously(Main.plugin, 0L, 5L); + player.sendMessage("§c[系统]§a已在为你连接听云整蛊,请不要再次点击."); + } else { + PixelLiveAPI.connect(player,"127.0.0.1",9018); + } + if(Main.giftStatistics){ + Main.giftManage.getSqlManager().createAnchorProfile(roomId); + } + Bukkit.getConsoleSender().sendMessage("######CONNECT#####"); Location loc = player.getLocation(); loc.getWorld().playEffect(loc, Effect.MOBSPAWNER_FLAMES, 20); player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_BASS,1,1); @@ -109,6 +145,7 @@ public class LiveAdminGui implements Listener { inv.setItem(5,Games_Edit()); inv.setItem(18,Stop_LiveLink()); inv.setItem(20,test_Verify(p)); + //inv.setItem(22,getLiveRoomId(p)); p.openInventory(inv); } @@ -228,4 +265,24 @@ public class LiveAdminGui implements Listener { item.setItemMeta(meta); return item; } + + public static ItemStack getLiveRoomId(Player p){ + ItemStack item = new ItemStack(Material.DIAMOND); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("§d★ §e点击获取直播间Id"); + List lore = new ArrayList<>(); + if(Main.configYml.getRoomId(p.getName()) == null) { + lore.add("§7您的直播间号: §9尚未设置"); + lore.add(" "); + lore.add("§b★ §6鼠标点击 §7获取直播间Id"); + }else{ + String roomId = Main.configYml.getRoomId(p.getName()); + lore.add("§7您的直播间号: §a"+roomId); + lore.add(" "); + lore.add("§b★ §6鼠标点击 §7获取直播间Id"); + } + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } } diff --git a/src/main/java/com/io/yutian/mclive/LiveEvent.java b/src/main/java/com/io/yutian/mclive/LiveEvent.java index 96215e5..a7afc85 100644 --- a/src/main/java/com/io/yutian/mclive/LiveEvent.java +++ b/src/main/java/com/io/yutian/mclive/LiveEvent.java @@ -1,5 +1,6 @@ package com.io.yutian.mclive; +import com.io.yutian.mclive.data.GiftManage; import com.io.yutian.mclive.event.*; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; @@ -21,6 +22,16 @@ public class LiveEvent implements Listener { String audience = e.getUser().nickName(); String gift_name = e.getName(); long gift_amount = e.getAmount(); + if (Main.giftStatistics) { + GiftManage giftManage = Main.giftManage; + String name = e.getPlayer().getName(); + int trillGift = giftManage.getGiftMoney(gift_name); + if (gift_amount >= 2) { + giftManage.addTotalMoney(name,trillGift, gift_amount); + } else { + giftManage.addTotalMoney(name,trillGift); + } + } // Bukkit.getConsoleSender().sendMessage("[直播互动 " + e.getPlayer().getName() + "] 类型: " + type + " 用户: " + audience + " 礼物: " + gift_name + "x" + gift_amount); } } diff --git a/src/main/java/com/io/yutian/mclive/Main.java b/src/main/java/com/io/yutian/mclive/Main.java index 0d3de72..0db7bf8 100644 --- a/src/main/java/com/io/yutian/mclive/Main.java +++ b/src/main/java/com/io/yutian/mclive/Main.java @@ -1,8 +1,9 @@ package com.io.yutian.mclive; -import cn.hamster3.cdapi.CDTimeAPI; import com.io.yutian.livemutually.manager.KSLiveRoomManager; -import com.io.yutian.livemutually.wss.KSWebSocketClient; +import com.io.yutian.mclive.data.GiftManage; +import com.io.yutian.mclive.event.ZhuboAPI; +import com.io.yutian.pixelliveplugin.PixelLiveAPI; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -25,22 +26,37 @@ public class Main extends JavaPlugin { public static Main plugin; public static boolean check_plugin = false; public static ConfigYml configYml; - public static List LiveRoomClientList = new ArrayList<>(); + public static GiftManage giftManage; + public static boolean giftStatistics = false; @Override public void onEnable() { plugin = this; SendPluginsAuthorMessage(Bukkit.getConsoleSender()); saveDefaultConfig(); + if (giftStatistics){ + giftManage = new GiftManage(); + } configYml = new ConfigYml(getConfig()); getServer().getPluginManager().registerEvents(new LiveAdminGui(),this); getServer().getPluginManager().registerEvents(new LinkRoom(),this); + getServer().getPluginManager().registerEvents(new ModEvent(),this); getServer().getPluginManager().registerEvents(new LiveEvent(configYml),this); Bukkit.getConsoleSender().sendMessage("§b[整蛊MC直播] §7当前版本: §ev"+plugin.getDescription().getVersion()); Plugin plugin = getServer().getPluginManager().getPlugin(configYml.getGameMode()); if (plugin != null) { check_plugin = true; Bukkit.getConsoleSender().sendMessage("§b[整蛊MC直播] §a已激活游戏模式"); + if(giftStatistics) { + Bukkit.getScheduler().runTaskTimerAsynchronously(this, new Runnable() { + @Override + public void run() { + for (Player player : Bukkit.getOnlinePlayers()) { + giftManage.SaveZhuboData(player.getName()); + } + } + }, 0L, 24000L); + } } else { Bukkit.getConsoleSender().sendMessage("§b[整蛊MC直播] §c未检测到§a<"+configYml.getGameMode()+">§c游戏插件."); } @@ -58,6 +74,7 @@ public class Main extends JavaPlugin { sender.sendMessage("§2/mclive §e[主播名] §2<直播间ID> §f- §2设置直播间"); } sender.sendMessage("§2/mclive debug §f- §2开启调试模式"); + sender.sendMessage("§2/mclive giftlong §e[时间] §f- §2叠刷计时"); sender.sendMessage("§2/mclive reload §f- §2重新载入配置文件"); sender.sendMessage("§e------ ====== §6直播弹幕互动 §e====== ------"); sender.sendMessage(""); @@ -68,13 +85,29 @@ public class Main extends JavaPlugin { sender.sendMessage("§c[系统]§a配置文件已重载"); return true; } + if (args.length == 1 && args[0].equalsIgnoreCase("save")) { + for (Player player : Bukkit.getOnlinePlayers()){ + giftManage.SaveZhuboData(player.getName()); + } + sender.sendMessage("§c[系统]§a数据已提交至云数据库."); + return true; + } + if (args[0].equalsIgnoreCase("giftlong")) { + if (args.length == 1) { + sender.sendMessage("§c[系统]§a正确用法: §e/mclive giftlong [时间戳]"); + return true; + } + if (args.length == 2) { + long delay = Long.parseLong(args[1]); + Main.configYml.setGifts_delay(delay); + sender.sendMessage("§c[系统]§a礼物叠刷计算周期: §e§l" + delay); + } + return true; + } if (args.length == 1 && args[0].equalsIgnoreCase("stop")) { - KSLiveRoomManager.liveRoomClientMap.clear(); - for (KSWebSocketClient socketClient : LiveRoomClientList) { - if (socketClient.isOpen()) { - socketClient.setForcedClose(true); - } - socketClient.close(); + ZhuboAPI.wsRoomIdSame.clear(); + for (Player player : KSLiveRoomManager.livepluginList) { + KSLiveRoomManager.disconnect(player); } Bukkit.broadcastMessage("§c[系统]§a已断开所有主播的连接."); return true; diff --git a/src/main/java/com/io/yutian/mclive/ModEvent.java b/src/main/java/com/io/yutian/mclive/ModEvent.java new file mode 100644 index 0000000..b31b44b --- /dev/null +++ b/src/main/java/com/io/yutian/mclive/ModEvent.java @@ -0,0 +1,25 @@ +package com.io.yutian.mclive; + +import com.io.yutian.mclive.Util.MessageUtil; +import com.io.yutian.pixelliveplugin.event.KeyInputEvent; +import com.io.yutian.pixelliveplugin.event.WSMessageEvent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class ModEvent implements Listener { + + @EventHandler + public void onWsMessage(WSMessageEvent e){ + Player player = e.getPlayer(); + String s = e.getMessage(); + MessageUtil.parse(player,s); + } + + + @EventHandler + public void onKey(KeyInputEvent e){ + Player player = e.getPlayer(); + } +} diff --git a/src/main/java/com/io/yutian/mclive/Util/MessageUtil.java b/src/main/java/com/io/yutian/mclive/Util/MessageUtil.java new file mode 100644 index 0000000..12e5b54 --- /dev/null +++ b/src/main/java/com/io/yutian/mclive/Util/MessageUtil.java @@ -0,0 +1,210 @@ +package com.io.yutian.mclive.Util; + +import cn.hamster3.cdapi.CDTimeAPI; +import com.io.yutian.livemutually.manager.GiftData; +import com.io.yutian.livemutually.manager.UserData; +import com.io.yutian.livemutually.wss.*; +import com.io.yutian.mclive.Main; +import com.io.yutian.mclive.event.LiveGiftEvents; +import com.io.yutian.mclive.event.ZhuboAPI; +import json.JSONObject; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.util.Base64; +import java.util.HashMap; + +public class MessageUtil { + + public static void parse(Player player,String py_data){ + if(py_data.isEmpty()){return;} + if(ZhuboAPI.getRoomLiveName().equalsIgnoreCase("KuaiShou")){ + JSONObject jsonObject = new JSONObject(py_data); + if (py_data.contains("type")) { + long cdTime = CDTimeAPI.getCD(player.getUniqueId(),"tingcloud_cd"); + if(cdTime < 0) { + CDTimeAPI.setPlayerCD(player.getUniqueId(),"tingcloud_cd",1000 * 10); + Bukkit.getConsoleSender().sendMessage("§a[直播连接助手] 听云整蛊弹幕正常抓取中..."); + } + String type = jsonObject.getString("type"); + if(type.equalsIgnoreCase("礼物")){ + String nickName = jsonObject.getString("昵称"); + String giftName = jsonObject.getString("礼物名称"); + int newCount = jsonObject.getInt("礼物数量"); + if (newCount >= 1) { + String count_color = "§a"; + if (newCount >= 1314) { + count_color = "§c"; + } else if (newCount >= 520) { + count_color = "§d"; + } else if (newCount >= 188) { + count_color = "§e"; + } else if (newCount >= 66) { + count_color = "§b"; + } + String message = "§6[日志 - 礼物触发] §f" + player.getName() + " >>> " + nickName + " = §a" + giftName + " 数量: " + count_color + newCount; + Bukkit.getConsoleSender().sendMessage(message); + LiveGiftEvents event = new LiveGiftEvents(player, new KuaiShouUser(nickName), giftName, newCount); + Bukkit.getPluginManager().callEvent(event); + } + }else if(type.equalsIgnoreCase("发言")){ + String userName = jsonObject.getString("昵称"); + String message = jsonObject.getString("弹幕"); + KSAPILiveRoomWatcher ksapiLiveRoomWatcher = new KSAPILiveRoomWatcher(player); + ksapiLiveRoomWatcher.callChat(new KuaiShouChat(userName, message)); + }else if(type.equalsIgnoreCase("点赞")){ + String userName = jsonObject.getString("昵称"); + KSAPILiveRoomWatcher ksapiLiveRoomWatcher = new KSAPILiveRoomWatcher(player); + ksapiLiveRoomWatcher.callLike(new KuaiShouLike(userName, 1)); + } + } else { + long cdTime = CDTimeAPI.getCD(player.getUniqueId(),"tingcloud_cd"); + if(cdTime < 0) { + CDTimeAPI.setPlayerCD(player.getUniqueId(),"tingcloud_cd",1000 * 10); + Bukkit.getConsoleSender().sendMessage("§a[直播连接助手] 听云整蛊弹幕正常抓取中..."); + } + } + }else { + String s; + try { + s = decrypt_ecb(py_data); + } catch (Exception e) { + throw new RuntimeException(e); + } + JSONObject jsonObject = new JSONObject(s); + String type = jsonObject.getString("broadcast"); + if (type.equalsIgnoreCase("gift_message")) { + if (!ZhuboAPI.isWsRoomIdSame(player)) { + player.sendMessage("§c[系统]§a当前软件获取的直播间尚未进行授权."); + return; + } + JSONObject dataObject = new JSONObject(jsonObject.getString("data")); + String nickName = dataObject.getJSONObject("user").getString("nickName"); + // 礼物名 + String giftName = dataObject.getJSONObject("gift").getString("name"); + // 礼物数量 + int giftAmount = 0; + int repeatCount = dataObject.getInt("repeatCount"); + int comboCount = dataObject.getInt("comboCount"); + if (repeatCount > comboCount) { + giftAmount = repeatCount; + } else { + giftAmount = comboCount; + } + if (userDataMap.get(nickName) == null) { + userDataMap.put(nickName, new UserData(nickName)); + } + // 默认礼物赠送数量 + long count = giftAmount; + long newCount = giftAmount; + UserData userData = userDataMap.get(nickName); + //判断这个礼物是否已赠送过 + if (userData.isExitGift(giftName)) { + GiftData giftData = userData.getGiftsData(giftName); + // 判断礼物上次刷的时间 + long sendTime = System.currentTimeMillis(); + // 公式 本次刷礼物时间 - 记录时间 + // player.sendMessage("SendTime = "+(sendTime - giftData.getSendTime())); + if (sendTime - giftData.getSendTime() < Main.configYml.getGifts_delay()) { + newCount = count - giftData.getAmount(); + sendConsoleMessage("§f用户: " + nickName + " §d叠刷礼物缓存数据 §f礼物: " + giftName + " 记录数量: " + count + " 触发数量: " + newCount); + if (newCount >= 1) { + userData.createGiftsData(giftName, giftAmount); + } + } else { + userData.createGiftsData(giftName, giftAmount); + sendConsoleMessage("§f用户: " + nickName + " §c超时覆盖礼物缓存数据 §f礼物: " + giftName + " 记录数量: " + count + " 触发数量: " + newCount); + } + } else { + // 若从未赠送则需创建新的缓存数据 + sendConsoleMessage("§f用户: " + nickName + " §a创建礼物缓存数据 §f礼物: " + giftName + " 记录数量: " + count + " 触发数量: " + newCount); + userData.createGiftsData(giftName, giftAmount); + } + if (newCount >= 1) { + String count_color = "§a"; + if (newCount >= 1314) { + count_color = "§c"; + } else if (newCount >= 520) { + count_color = "§d"; + } else if (newCount >= 188) { + count_color = "§e"; + } else if (newCount >= 66) { + count_color = "§b"; + } + String message = "§6[日志 - 礼物触发] §f" + player.getName() + " >>> " + nickName + " = §a" + giftName + " 数量: " + count_color + newCount; + Bukkit.getConsoleSender().sendMessage(message); + LiveGiftEvents event = new LiveGiftEvents(player, new KuaiShouUser(nickName), giftName, newCount); + Bukkit.getPluginManager().callEvent(event); + } + } else if (type.equalsIgnoreCase("chat_message")) { + if (!ZhuboAPI.isWsRoomIdSame(player)) { + player.sendMessage("§c[系统]§a当前软件获取的直播间尚未进行授权."); + return; + } + JSONObject dataObject = new JSONObject(jsonObject.getString("data")); + String nickName = dataObject.getJSONObject("user").getString("nickName"); + String message = dataObject.getString("content"); + KSAPILiveRoomWatcher ksapiLiveRoomWatcher = new KSAPILiveRoomWatcher(player); + ksapiLiveRoomWatcher.callChat(new KuaiShouChat(nickName, message)); + } else if (type.equalsIgnoreCase("like_message")) { + if (!ZhuboAPI.isWsRoomIdSame(player)) { + player.sendMessage("§c[系统]§a当前软件获取的直播间尚未进行授权."); + return; + } + JSONObject dataObject = new JSONObject(jsonObject.getString("data")); + String nickName = dataObject.getJSONObject("user").getString("nickName"); + int count = dataObject.getInt("count"); + String total = dataObject.getString("total"); + KSAPILiveRoomWatcher ksapiLiveRoomWatcher = new KSAPILiveRoomWatcher(player); + ksapiLiveRoomWatcher.callLike(new KuaiShouLike(nickName, count)); + } else if (type.equalsIgnoreCase("member_message")) { + if (!ZhuboAPI.isWsRoomIdSame(player)) { + player.sendMessage("§c[系统]§a当前软件获取的直播间尚未进行授权."); + return; + } + JSONObject dataObject = new JSONObject(jsonObject.getString("data")); + String nickName = dataObject.getJSONObject("user").getString("nickName"); + KSAPILiveRoomWatcher ksapiLiveRoomWatcher = new KSAPILiveRoomWatcher(player); + ksapiLiveRoomWatcher.callUser(new KuaiShouUser(nickName)); + } else if (type.equalsIgnoreCase("live_id")) { + JSONObject dataObject = jsonObject.getJSONObject("data"); + String wsRoomId = dataObject.getString("id"); + if (ZhuboAPI.wsRoomIdSame.get(player) == null) { + String roomId = Main.configYml.getRoomId(player.getName()); + if (!wsRoomId.equalsIgnoreCase(roomId)) { + ZhuboAPI.wsRoomIdSame.put(player, false); + } else { + ZhuboAPI.wsRoomIdSame.put(player, true); + } + } else { + String roomId = Main.configYml.getRoomId(player.getName()); + if (!wsRoomId.equalsIgnoreCase(roomId)) { + ZhuboAPI.wsRoomIdSame.put(player, false); + } + } + } + } + } + + public static void sendConsoleMessage(String message) { + // Bukkit.getConsoleSender().sendMessage("§6[弹幕监听] " + message); + } + public static HashMap userDataMap = new HashMap<>(); + private static final String AES_KEY = "H8dyaR95ZJwZ6PikZ1qmoIY1"; // 与Python中相同的密钥 + + public static String decrypt_ecb(String encryptedMessage) throws Exception { + // Base64解码 + byte[] decodedMessage = Base64.getDecoder().decode(encryptedMessage); + + // AES解密 + Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); + SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), "AES"); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + byte[] decryptedBytes = cipher.doFinal(decodedMessage); + + // 转换为字符串 + return new String(decryptedBytes, "UTF-8"); + } +} diff --git a/src/main/java/com/io/yutian/mclive/Util/SqlUtil.java b/src/main/java/com/io/yutian/mclive/Util/SqlUtil.java new file mode 100644 index 0000000..b1bb4b5 --- /dev/null +++ b/src/main/java/com/io/yutian/mclive/Util/SqlUtil.java @@ -0,0 +1,102 @@ +package com.io.yutian.mclive.Util; + +import com.io.yutian.mclive.data.database.MegumiSQL; + +import java.sql.*; + +public class SqlUtil extends MegumiSQL { + private final String hostname; + private final String port; + private final String database; + private final String username; + private final String password; + private Connection connection; + + public SqlUtil(String hostname, String port, String database, String username, String password) { + this.hostname = hostname; + this.port = port; + this.database = database; + this.username = username; + this.password = password; + this.connection = null; + } + + @Override + public void openConnection() { + try { + Class.forName("com.mysql.jdbc.Driver"); + this.connection = DriverManager.getConnection("jdbc:mysql://" + this.hostname + ":" + this.port + "/" + this.database + "?useSSL=false", this.username, this.password); + } catch (SQLException e) { + System.out.println("[日志 - 错误] 连接数据库失败!"); + this.connection = null; + } catch (ClassNotFoundException e) { + System.out.println("[日志 - 错误] 未找到JDBC驱动程序"); + this.connection = null; + } + } + + @Override + public boolean checkConnection() { + return this.connection != null; + } + + @Override + public Connection getConnection() { + return this.connection; + } + + @Override + public void closeConnection() { + if (this.connection != null) { + try { + this.connection.close(); + this.connection = null; + } catch (SQLException e) { + System.out.println("[日志 - 错误] 关闭数据库连接失败!"); + e.printStackTrace(); + } + } + } + + public ResultSet querySQL(String query) { + Connection conn; + if (checkConnection()) + conn = getConnection(); + else + return null; + Statement stat = null; + try { + stat = conn.createStatement(); + } catch (SQLException e) { + e.printStackTrace(); + } + ResultSet result = null; + try { + if (stat != null) + result = stat.executeQuery(query); + else + return null; + } catch (SQLException e) { + e.printStackTrace(); + return null; + } + return result; + } + + public boolean updateSQL(String data) { + Connection conn; + if (checkConnection()) + conn = getConnection(); + else + return false; + Statement stat = null; + try { + stat = conn.createStatement(); + stat.executeUpdate(data); + return true; + } catch (SQLException e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/src/main/java/com/io/yutian/mclive/data/GiftManage.java b/src/main/java/com/io/yutian/mclive/data/GiftManage.java new file mode 100644 index 0000000..f7e132a --- /dev/null +++ b/src/main/java/com/io/yutian/mclive/data/GiftManage.java @@ -0,0 +1,191 @@ +package com.io.yutian.mclive.data; + +import com.io.yutian.mclive.Main; +import com.io.yutian.mclive.Util.SqlUtil; +import com.io.yutian.mclive.data.database.SqlManager; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.HashMap; + +public class GiftManage { + + private int totalMoney; + private HashMap giftMap = new HashMap<>(); + + public GiftManage(){ + totalMoney = 0; + giftMap.put("玫瑰",1); + giftMap.put("抖音",1); + giftMap.put("称心如意",1); + giftMap.put("你最好看",2); + giftMap.put("亲吻",99); + giftMap.put("跑车",1200); + giftMap.put("礼花筒",199); + giftMap.put("捏捏小脸",99); + giftMap.put("鹿仙子",99); + giftMap.put("夏威夷花环",99); + giftMap.put("爱的纸鹤",99); + giftMap.put("送你花花",49); + giftMap.put("女神花环",99); + giftMap.put("粘人小狗",1); + giftMap.put("鱼你一起",99); + giftMap.put("真爱玫瑰",366); + giftMap.put("为你举牌",199); + giftMap.put("兔耳朵",99); + giftMap.put("龙抬头",99); + giftMap.put("花开烂漫",466); + giftMap.put("比心",199); + giftMap.put("真的爱你",520); + giftMap.put("万象烟花",688); + giftMap.put("私人飞机",3000); + giftMap.put("浪漫烟花",599); + giftMap.put("闪亮登场",460); + giftMap.put("多喝热水",126); + giftMap.put("一点心意",266); + giftMap.put("荧光棒",99); + giftMap.put("娶你回家",599); + giftMap.put("掌上明珠",888); + giftMap.put("摧残舞台",899); + giftMap.put("星星点灯",268); + giftMap.put("一束花开",366); + giftMap.put("小傻猪",299); + giftMap.put("环球旅行车",650); + giftMap.put("爱的守护",299); + giftMap.put("好运莲莲鸭",299); + giftMap.put("日出相伴",726); + giftMap.put("永生花",520); + giftMap.put("纸短情长",921); + giftMap.put("直升机",2999); + giftMap.put("蝶·连理枝",280); + giftMap.put("爱情树下",599); + giftMap.put("灵龙现世",600); + giftMap.put("爱心煎蛋",99); + giftMap.put("夏日回忆",1000); + giftMap.put("抖音1号",10001); + giftMap.put("繁花秘语",1314); + giftMap.put("ONE礼挑一",299); + giftMap.put("重拳出击",199); + giftMap.put("花落长亭",1588); + giftMap.put("浪漫恋人",1999); + giftMap.put("花海泛舟",2800); + giftMap.put("豪华邮轮",6000); + giftMap.put("环游世界",3000); + giftMap.put("蝶·书中情",750); + giftMap.put("带你去海边",4500); + giftMap.put("蜜蜂叮叮",1000); + giftMap.put("奇幻八音盒",2399); + giftMap.put("光之祝福",1999); + giftMap.put("消暑罐头车",1500); + giftMap.put("月色山茶花",1999); + giftMap.put("为你而来",1688); + giftMap.put("点亮孤单",1800); + giftMap.put("浪漫营地",1699); + giftMap.put("薰衣草庄园",3300); + giftMap.put("红墙白雪",1688); + giftMap.put("华灯初上",5000); + giftMap.put("嘉年华",30000); + giftMap.put("单车恋人",1899); + giftMap.put("为爱启航",10001); + giftMap.put("镜中奇缘",1500); + giftMap.put("仲夏夜之梦",8999); + giftMap.put("龙珠纳福",2388); + giftMap.put("蝶·比翼鸟",1700); + giftMap.put("无畏守护",10168); + giftMap.put("壁上飞仙",4999); + giftMap.put("海上生明月",4166); + giftMap.put("铁甲柔情",3800); + giftMap.put("心动丘比特",4321); + giftMap.put("变形战车",5500); + giftMap.put("抖音飞艇",20000); + giftMap.put("冰冻战车",3000); + giftMap.put("星际玫瑰",7500); + giftMap.put("奏响人生",3666); + giftMap.put("摩天大厦",8222); + giftMap.put("传送门",2999); + giftMap.put("云中秘境",13140); + giftMap.put("火龙爆发",5000); + giftMap.put("福佑万家",4888); + giftMap.put("天空之镜",6399); + giftMap.put("情定三生",9666); + giftMap.put("月下瀑布",6666); + giftMap.put("金鳞化龙",9000); + giftMap.put("蝶·化蝶飞",10999); + giftMap.put("无尽浪漫",19999); + giftMap.put("云霄大厦",7888); + giftMap.put("梦幻城堡",28888); + giftMap.put("真爱永恒",8999); + giftMap.put("跨时空之恋",9000); + giftMap.put("炫彩射击",1888); + giftMap.put("一路有你",17999); + giftMap.put("浪漫马车",28888); + giftMap.put("蝶·寄相思",6800); + giftMap.put("梦回紫禁城",8666); + giftMap.put("小纸条",399); + giftMap.put("如意锦囊",99); + giftMap.put("星光瓶",900); + giftMap.put("粉丝团灯牌",1); + giftMap.put("为你闪耀",9); + giftMap.put("一直陪伴你",520); + giftMap.put("动次打次",2999); + giftMap.put("宇宙之心",18888); + LinkMySqlData(); + } + + private SqlUtil sqlUtil; + private SqlManager sqlManager; + + public SqlUtil getSqlUtil() { + return sqlUtil; + } + + public SqlManager getSqlManager() { + return sqlManager; + } + + public void LinkMySqlData(){ + String SQL_Host = "gz-cdb-r9koldtt.sql.tencentcdb.com"; + String SQL_Port = "29320"; + String SQL_Users = "root"; + String SQL_Password = "Pixel@123456"; + String SQL_Database = "autogunstats"; + sqlUtil = new SqlUtil(SQL_Host,SQL_Port,SQL_Database,SQL_Users,SQL_Password); + sqlManager.createTable(); + Bukkit.getConsoleSender().sendMessage("[直播数据] 数据库已连接."); + } + + public int getGiftMoney(String giftName){ + if(giftMap.get(giftName) == null){ + return 1; + } + return giftMap.get(giftName); + } + + public int getTotalMoney() { + return totalMoney; + } + + public void addTotalMoney(String name,int money){ + if(money >= 5000){ + SaveZhuboData(name); + } + this.totalMoney += money; + } + + public void addTotalMoney(String name,int money, long amount){ + int newMoney = (int) (money * amount); + if(newMoney >= 5000){ + SaveZhuboData(name); + } + this.totalMoney += newMoney; + } + + public void SaveZhuboData(String name){ + if(Main.configYml.getRoomId(name) == null){ + return; + } + String tiktok = Main.configYml.getRoomId(name); + sqlManager.SavePlayerData(tiktok); + } + +} diff --git a/src/main/java/com/io/yutian/mclive/data/database/MegumiSQL.java b/src/main/java/com/io/yutian/mclive/data/database/MegumiSQL.java new file mode 100644 index 0000000..d67d429 --- /dev/null +++ b/src/main/java/com/io/yutian/mclive/data/database/MegumiSQL.java @@ -0,0 +1,13 @@ +package com.io.yutian.mclive.data.database; + +import java.sql.Connection; + +public abstract class MegumiSQL { + public abstract void openConnection(); + + public abstract boolean checkConnection(); + + public abstract Connection getConnection(); + + public abstract void closeConnection(); +} diff --git a/src/main/java/com/io/yutian/mclive/data/database/SqlManager.java b/src/main/java/com/io/yutian/mclive/data/database/SqlManager.java new file mode 100644 index 0000000..587fb91 --- /dev/null +++ b/src/main/java/com/io/yutian/mclive/data/database/SqlManager.java @@ -0,0 +1,114 @@ +package com.io.yutian.mclive.data.database; + +import com.io.yutian.mclive.Main; +import com.io.yutian.mclive.Util.SqlUtil; +import com.io.yutian.mclive.data.GiftManage; +import org.bukkit.Bukkit; + +import java.sql.ResultSet; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.StringJoiner; + +public class SqlManager { + + + public String table = "zhubo_income"; + + // 创建数据库表格格式 + public void createTable() { + // 数据库结构组成 + // 抖音号(VARCHAR) 直播流水(VARCHAR) + String s = "CREATE TABLE IF NOT EXISTS "+table+"(" + + " id INT NOT NULL AUTO_INCREMENT," + + " tiktok VARCHAR(32) NOT NULL," + + " income INT NOT NULL," + + " livetime VARCHAR(256) NOT NULL," + + " PRIMARY KEY(id)" + + ") ENGINE = InnoDB"; + getSQL().openConnection(); + getSQL().updateSQL(s); + getSQL().closeConnection(); + } + + // 创建主播档案数据 + public void createAnchorProfile(String tiktok){ + String set = "INSERT INTO "+table+" (`tiktok`, `income`, `livetime`) VALUES ('%tiktok%', '%income%', '%livetime%')"; + getSQL().openConnection(); + set = set.replace("%tiktok%", tiktok); + set = set.replace("%income%", String.valueOf(0)); + set = set.replace("%livetime%", getNowTimeString()); + getSQL().updateSQL(set); + getSQL().closeConnection(); + Bukkit.getConsoleSender().sendMessage("§6[主播数据] §a主播档案创建。"); + } + + public String getNowTimeString(){ + // 获取当前时间戳 + Instant now = Instant.now(); + // 将时间戳转换为本地日期时间 + LocalDateTime dateTime = LocalDateTime.ofInstant(now, ZoneId.systemDefault()); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm"); + return dateTime.format(formatter); + } + + public int getZhuboIncome(String tiktok) { + String select = "SELECT * FROM "+table+" WHERE tiktok = '%tiktok%'"; + try { + getSQL().openConnection(); + ResultSet resultSet = getSQL().querySQL(select.replace("%tiktok%", tiktok)); + while (resultSet.next()) { + return resultSet.getInt("income"); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + getSQL().closeConnection(); + } + return 0; + } + + public HashMap getAllZhuboData() { + HashMap map = new HashMap<>(); + String select = "SELECT * FROM "+table; + try { + getSQL().openConnection(); + ResultSet set = getSQL().querySQL(select); + while (set.next()) { + String tiktok = set.getString("tiktok"); + int income = set.getInt("income"); + map.put(tiktok, income); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + getSQL().closeConnection(); + } + return map; + } + + public void SavePlayerData(String tiktok){ + if(!Main.giftStatistics){return;} + GiftManage giftManage = Main.giftManage; + int money = (int) (giftManage.getTotalMoney() * 0.1); + String set = "UPDATE `"+table+"` SET " + + "`income` = '%income%'," + + "`livetime` = '%livetime%' WHERE `"+table+"`.`tiktok` = '%tiktok%'"; + getSQL().openConnection(); + getSQL().updateSQL(set.replace("%tiktok%", tiktok). + replace("%income%", String.valueOf(money)). + replace("%livetime%",getNowTimeString())); + getSQL().closeConnection(); + } + + private SqlUtil getSQL() { + GiftManage giftManage = Main.giftManage; + return giftManage.getSqlUtil(); + } +} diff --git a/src/main/java/com/io/yutian/mclive/event/ZhuboAPI.java b/src/main/java/com/io/yutian/mclive/event/ZhuboAPI.java index 0fe7731..c952d12 100644 --- a/src/main/java/com/io/yutian/mclive/event/ZhuboAPI.java +++ b/src/main/java/com/io/yutian/mclive/event/ZhuboAPI.java @@ -4,9 +4,21 @@ import com.io.yutian.livemutually.manager.KSLiveRoomManager; import com.io.yutian.mclive.Main; import org.bukkit.entity.Player; +import java.util.HashMap; + public abstract class ZhuboAPI { + // 存储Wss主播的直播间id + public static HashMap wsRoomIdSame = new HashMap<>(); + public static boolean isWsRoomIdSame(Player player){ + if(wsRoomIdSame.get(player) == null){ + return false; + } + return wsRoomIdSame.get(player); + } // 获取主播的连接状态 public static boolean isRoomisConnected(Player zhubo){ return KSLiveRoomManager.isConnected(zhubo); } + public static String getRoomLiveName(){return "DouYin";} + //public static String getRoomLiveName(){return "KuaiShou";} } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1478a00..9d040b5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -3,22 +3,5 @@ GameMode: BlockWars # 调试模式 MainDebug: false # 请勿调动此参数 -GiftDelay: 6000 -# 直播平台 -LivePlatform: DouYin -# 后台输出信息 -Settings: - # 礼物 - debug_gifts: false - # 点赞 - debug_dianzan: false - # 关注 - debug_guanzhu: false - # 进入 - debug_join: true - # 聊天消息 - debug_message: true - # 进入提示信息 - join_show: true -AutoLink: false +GiftDelay: 3500 LiveId: {} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a3ee14d..e07bc14 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,8 +1,10 @@ name: McLiveAPI -version: 1.3 +version: 1.3.2 main: com.io.yutian.mclive.Main api-version: 1.18 author: yutian - +softdepend: + - CDTimeAPI + - PixelLivePlugin commands: mclive: \ No newline at end of file diff --git a/target/classes/com/io/yutian/livemutually/liveroom/Gift.class b/target/classes/com/io/yutian/livemutually/liveroom/Gift.class deleted file mode 100644 index a34aec3..0000000 Binary files a/target/classes/com/io/yutian/livemutually/liveroom/Gift.class and /dev/null differ diff --git a/target/classes/com/io/yutian/livemutually/liveroom/KSLiveRoomClient.class b/target/classes/com/io/yutian/livemutually/liveroom/KSLiveRoomClient.class deleted file mode 100644 index 18c0418..0000000 Binary files a/target/classes/com/io/yutian/livemutually/liveroom/KSLiveRoomClient.class and /dev/null differ diff --git a/target/classes/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.class b/target/classes/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.class index f1abefc..e8b3ff2 100644 Binary files a/target/classes/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.class and b/target/classes/com/io/yutian/livemutually/liveroom/LiveRoomWatcher.class differ diff --git a/target/classes/com/io/yutian/livemutually/manager/KSLiveRoomManager.class b/target/classes/com/io/yutian/livemutually/manager/KSLiveRoomManager.class index 495c486..86ac787 100644 Binary files a/target/classes/com/io/yutian/livemutually/manager/KSLiveRoomManager.class and b/target/classes/com/io/yutian/livemutually/manager/KSLiveRoomManager.class differ diff --git a/target/classes/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.class b/target/classes/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.class index 1f4dc70..01fe355 100644 Binary files a/target/classes/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.class and b/target/classes/com/io/yutian/livemutually/wss/KSAPILiveRoomWatcher.class differ diff --git a/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient$1.class b/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient$1.class deleted file mode 100644 index 9178d31..0000000 Binary files a/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient$1.class and /dev/null differ diff --git a/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient$2.class b/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient$2.class deleted file mode 100644 index f1b7163..0000000 Binary files a/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient$2.class and /dev/null differ diff --git a/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient.class b/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient.class deleted file mode 100644 index 8bbc45a..0000000 Binary files a/target/classes/com/io/yutian/livemutually/wss/KSWebSocketClient.class and /dev/null differ diff --git a/target/classes/com/io/yutian/livemutually/wss/KuaiShouGift.class b/target/classes/com/io/yutian/livemutually/wss/KuaiShouGift.class deleted file mode 100644 index 12b28bb..0000000 Binary files a/target/classes/com/io/yutian/livemutually/wss/KuaiShouGift.class and /dev/null differ diff --git a/target/classes/com/io/yutian/mclive/ConfigYml.class b/target/classes/com/io/yutian/mclive/ConfigYml.class index 4498583..56ad2b7 100644 Binary files a/target/classes/com/io/yutian/mclive/ConfigYml.class and b/target/classes/com/io/yutian/mclive/ConfigYml.class differ diff --git a/target/classes/com/io/yutian/mclive/LinkRoom.class b/target/classes/com/io/yutian/mclive/LinkRoom.class index a08a6ed..0de8142 100644 Binary files a/target/classes/com/io/yutian/mclive/LinkRoom.class and b/target/classes/com/io/yutian/mclive/LinkRoom.class differ diff --git a/target/classes/com/io/yutian/mclive/LiveAdminGui.class b/target/classes/com/io/yutian/mclive/LiveAdminGui.class index 96e71d3..52e8a4c 100644 Binary files a/target/classes/com/io/yutian/mclive/LiveAdminGui.class and b/target/classes/com/io/yutian/mclive/LiveAdminGui.class differ diff --git a/target/classes/com/io/yutian/mclive/LiveEvent.class b/target/classes/com/io/yutian/mclive/LiveEvent.class index 05f781d..64dfe26 100644 Binary files a/target/classes/com/io/yutian/mclive/LiveEvent.class and b/target/classes/com/io/yutian/mclive/LiveEvent.class differ diff --git a/target/classes/com/io/yutian/mclive/Main.class b/target/classes/com/io/yutian/mclive/Main.class index c1bc3fa..f080a63 100644 Binary files a/target/classes/com/io/yutian/mclive/Main.class and b/target/classes/com/io/yutian/mclive/Main.class differ diff --git a/target/classes/com/io/yutian/mclive/event/ZhuboAPI.class b/target/classes/com/io/yutian/mclive/event/ZhuboAPI.class index 92f8f66..a6da699 100644 Binary files a/target/classes/com/io/yutian/mclive/event/ZhuboAPI.class and b/target/classes/com/io/yutian/mclive/event/ZhuboAPI.class differ diff --git a/target/classes/config.yml b/target/classes/config.yml index b50f40e..6907ebb 100644 --- a/target/classes/config.yml +++ b/target/classes/config.yml @@ -3,22 +3,5 @@ GameMode: BlockWars # ģʽ MainDebug: false # ˲ -GiftDelay: 6000 -# ֱƽ̨ -LivePlatform: DouYin -# ̨Ϣ -Settings: - # - debug_gifts: false - # - debug_dianzan: false - # ע - debug_guanzhu: false - # - debug_join: true - # Ϣ - debug_message: true - # ʾϢ - join_show: true -AutoLink: false +GiftDelay: 3500 LiveId: {} \ No newline at end of file diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml index a3ee14d..e07bc14 100644 --- a/target/classes/plugin.yml +++ b/target/classes/plugin.yml @@ -1,8 +1,10 @@ name: McLiveAPI -version: 1.3 +version: 1.3.2 main: com.io.yutian.mclive.Main api-version: 1.18 author: yutian - +softdepend: + - CDTimeAPI + - PixelLivePlugin commands: mclive: \ No newline at end of file