From dc821de01cb73e7d458a1310b58fa864d235a5ae Mon Sep 17 00:00:00 2001 From: yaohunya <31456652@qq.com> Date: Mon, 29 Jul 2024 02:18:12 +0800 Subject: [PATCH] init --- .../java/com/io/yutian/mclive/ConfigYml.java | 1 + .../java/com/io/yutian/mclive/LiveEvent.java | 3 +- src/main/java/com/io/yutian/mclive/Main.java | 15 +++--- .../io/yutian/mclive/Util/MessageUtil.java | 2 +- .../com/io/yutian/mclive/Util/SqlUtil.java | 11 ++++- .../com/io/yutian/mclive/data/GiftManage.java | 32 +++++++++---- .../mclive/data/database/SqlManager.java | 43 ++++++++++++------ .../classes/com/io/yutian/mclive/Main.class | Bin 9961 -> 10001 bytes 8 files changed, 74 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/io/yutian/mclive/ConfigYml.java b/src/main/java/com/io/yutian/mclive/ConfigYml.java index c5138a9..0b53e2c 100644 --- a/src/main/java/com/io/yutian/mclive/ConfigYml.java +++ b/src/main/java/com/io/yutian/mclive/ConfigYml.java @@ -7,6 +7,7 @@ import java.util.HashMap; public class ConfigYml { + public static boolean mysqlState = false; private String GameMode; private long gifts_delay; private boolean MainDebug; diff --git a/src/main/java/com/io/yutian/mclive/LiveEvent.java b/src/main/java/com/io/yutian/mclive/LiveEvent.java index a7afc85..17699fd 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 cn.hamster3.cdapi.CDTimeAPI; import com.io.yutian.mclive.data.GiftManage; import com.io.yutian.mclive.event.*; import net.md_5.bungee.api.ChatMessageType; @@ -22,7 +23,7 @@ public class LiveEvent implements Listener { String audience = e.getUser().nickName(); String gift_name = e.getName(); long gift_amount = e.getAmount(); - if (Main.giftStatistics) { + if (Main.giftStatistics && ConfigYml.mysqlState) { GiftManage giftManage = Main.giftManage; String name = e.getPlayer().getName(); int trillGift = giftManage.getGiftMoney(gift_name); diff --git a/src/main/java/com/io/yutian/mclive/Main.java b/src/main/java/com/io/yutian/mclive/Main.java index 0db7bf8..4071764 100644 --- a/src/main/java/com/io/yutian/mclive/Main.java +++ b/src/main/java/com/io/yutian/mclive/Main.java @@ -27,17 +27,18 @@ public class Main extends JavaPlugin { public static boolean check_plugin = false; public static ConfigYml configYml; public static GiftManage giftManage; - public static boolean giftStatistics = false; + public static boolean giftStatistics = true; @Override public void onEnable() { plugin = this; - SendPluginsAuthorMessage(Bukkit.getConsoleSender()); saveDefaultConfig(); + SendPluginsAuthorMessage(Bukkit.getConsoleSender()); + configYml = new ConfigYml(getConfig()); if (giftStatistics){ giftManage = new GiftManage(); + giftManage.LinkMySqlData(); } - configYml = new ConfigYml(getConfig()); getServer().getPluginManager().registerEvents(new LiveAdminGui(),this); getServer().getPluginManager().registerEvents(new LinkRoom(),this); getServer().getPluginManager().registerEvents(new ModEvent(),this); @@ -190,9 +191,9 @@ public class Main extends JavaPlugin { return String.valueOf(firstChar) + maskedString + lastChar; } - public static String getTime(String format){ - Date date = Calendar.getInstance().getTime(); - SimpleDateFormat datatime = new SimpleDateFormat(format); - return datatime.format(date); + public static String getMinecraftVersion() { + String packageName = Bukkit.getServer().getClass().getPackage().getName(); + String version = packageName.substring(packageName.lastIndexOf('.') + 1); + return version; } } diff --git a/src/main/java/com/io/yutian/mclive/Util/MessageUtil.java b/src/main/java/com/io/yutian/mclive/Util/MessageUtil.java index 12e5b54..ce75714 100644 --- a/src/main/java/com/io/yutian/mclive/Util/MessageUtil.java +++ b/src/main/java/com/io/yutian/mclive/Util/MessageUtil.java @@ -170,7 +170,7 @@ public class MessageUtil { ksapiLiveRoomWatcher.callUser(new KuaiShouUser(nickName)); } else if (type.equalsIgnoreCase("live_id")) { JSONObject dataObject = jsonObject.getJSONObject("data"); - String wsRoomId = dataObject.getString("id"); + String wsRoomId = dataObject.getString("id").replace(" ","").replace("\n",""); if (ZhuboAPI.wsRoomIdSame.get(player) == null) { String roomId = Main.configYml.getRoomId(player.getName()); if (!wsRoomId.equalsIgnoreCase(roomId)) { diff --git a/src/main/java/com/io/yutian/mclive/Util/SqlUtil.java b/src/main/java/com/io/yutian/mclive/Util/SqlUtil.java index b1bb4b5..637a93c 100644 --- a/src/main/java/com/io/yutian/mclive/Util/SqlUtil.java +++ b/src/main/java/com/io/yutian/mclive/Util/SqlUtil.java @@ -1,6 +1,9 @@ package com.io.yutian.mclive.Util; +import com.io.yutian.mclive.ConfigYml; +import com.io.yutian.mclive.Main; import com.io.yutian.mclive.data.database.MegumiSQL; +import org.bukkit.Bukkit; import java.sql.*; @@ -24,8 +27,14 @@ public class SqlUtil extends MegumiSQL { @Override public void openConnection() { try { - Class.forName("com.mysql.jdbc.Driver"); + String mcVersion = Main.getMinecraftVersion(); + if(mcVersion.contains("1_20")){ + Class.forName("com.mysql.cj.jdbc.Driver"); // 1.20.4的mysql路径 + }else{ + Class.forName("com.mysql.jdbc.Driver"); // 1.18.2的mysql路径 + } this.connection = DriverManager.getConnection("jdbc:mysql://" + this.hostname + ":" + this.port + "/" + this.database + "?useSSL=false", this.username, this.password); + ConfigYml.mysqlState = true; } catch (SQLException e) { System.out.println("[日志 - 错误] 连接数据库失败!"); this.connection = null; diff --git a/src/main/java/com/io/yutian/mclive/data/GiftManage.java b/src/main/java/com/io/yutian/mclive/data/GiftManage.java index f7e132a..c1e67e4 100644 --- a/src/main/java/com/io/yutian/mclive/data/GiftManage.java +++ b/src/main/java/com/io/yutian/mclive/data/GiftManage.java @@ -1,5 +1,6 @@ package com.io.yutian.mclive.data; +import com.io.yutian.mclive.ConfigYml; import com.io.yutian.mclive.Main; import com.io.yutian.mclive.Util.SqlUtil; import com.io.yutian.mclive.data.database.SqlManager; @@ -10,7 +11,7 @@ import java.util.HashMap; public class GiftManage { - private int totalMoney; + private double totalMoney; private HashMap giftMap = new HashMap<>(); public GiftManage(){ @@ -129,7 +130,6 @@ public class GiftManage { giftMap.put("一直陪伴你",520); giftMap.put("动次打次",2999); giftMap.put("宇宙之心",18888); - LinkMySqlData(); } private SqlUtil sqlUtil; @@ -148,10 +148,10 @@ public class GiftManage { String SQL_Port = "29320"; String SQL_Users = "root"; String SQL_Password = "Pixel@123456"; - String SQL_Database = "autogunstats"; + String SQL_Database = "mclivedata"; + sqlManager = new SqlManager(); sqlUtil = new SqlUtil(SQL_Host,SQL_Port,SQL_Database,SQL_Users,SQL_Password); sqlManager.createTable(); - Bukkit.getConsoleSender().sendMessage("[直播数据] 数据库已连接."); } public int getGiftMoney(String giftName){ @@ -161,11 +161,18 @@ public class GiftManage { return giftMap.get(giftName); } - public int getTotalMoney() { + public double getTotalMoney() { return totalMoney; } public void addTotalMoney(String name,int money){ + if(this.totalMoney <= 0){ + if(Main.configYml.getRoomId(name) == null){ + return; + } + String tiktok = Main.configYml.getRoomId(name); + this.totalMoney = sqlManager.getZhuboIncome(tiktok); + } if(money >= 5000){ SaveZhuboData(name); } @@ -173,6 +180,13 @@ public class GiftManage { } public void addTotalMoney(String name,int money, long amount){ + if(this.totalMoney <= 0){ + if(Main.configYml.getRoomId(name) == null){ + return; + } + String tiktok = Main.configYml.getRoomId(name); + this.totalMoney = sqlManager.getZhuboIncome(tiktok); + } int newMoney = (int) (money * amount); if(newMoney >= 5000){ SaveZhuboData(name); @@ -180,12 +194,14 @@ public class GiftManage { this.totalMoney += newMoney; } - public void SaveZhuboData(String name){ - if(Main.configYml.getRoomId(name) == null){ + public void SaveZhuboData(String name) { + if (Main.configYml.getRoomId(name) == null) { return; } String tiktok = Main.configYml.getRoomId(name); - sqlManager.SavePlayerData(tiktok); + if (ConfigYml.mysqlState) { + sqlManager.SavePlayerData(tiktok); + } } } 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 index 587fb91..c48e778 100644 --- a/src/main/java/com/io/yutian/mclive/data/database/SqlManager.java +++ b/src/main/java/com/io/yutian/mclive/data/database/SqlManager.java @@ -18,18 +18,18 @@ import java.util.StringJoiner; public class SqlManager { - public String table = "zhubo_income"; + public String table = "income_"+Main.configYml.getGameMode().toLowerCase(); // 创建数据库表格格式 public void createTable() { // 数据库结构组成 - // 抖音号(VARCHAR) 直播流水(VARCHAR) + // 主播名(VARCHAR) 抖音号(VARCHAR) 直播流水(VARCHAR) 记录时间(VARCHAR) 创建时间(VARCHAR) String s = "CREATE TABLE IF NOT EXISTS "+table+"(" + - " id INT NOT NULL AUTO_INCREMENT," + + " zhubo VARCHAR(32) NOT NULL," + " tiktok VARCHAR(32) NOT NULL," + - " income INT NOT NULL," + + " income DOUBLE NOT NULL," + " livetime VARCHAR(256) NOT NULL," + - " PRIMARY KEY(id)" + + " createtime VARCHAR(256) NOT NULL" + ") ENGINE = InnoDB"; getSQL().openConnection(); getSQL().updateSQL(s); @@ -38,14 +38,27 @@ public class SqlManager { // 创建主播档案数据 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); + int iconme = -1; + String select = "SELECT * FROM "+table+" WHERE tiktok = '%tiktok%'"; + try { + ResultSet resultSet = getSQL().querySQL(select.replace("%tiktok%", tiktok)); + while (resultSet.next()) { + iconme = resultSet.getInt("income"); + } + } catch (Exception e) { + e.printStackTrace(); + } + if(iconme <= -1) { + String set = "INSERT INTO " + table + " (`zhubo`,`tiktok`, `income`, `livetime`, `createtime`) VALUES ('%zhubo%','%tiktok%', '%income%', '%livetime%', '%createtime%')"; + set = set.replace("%zhubo%", "默认"); + set = set.replace("%tiktok%", tiktok); + set = set.replace("%income%", String.valueOf(0)); + set = set.replace("%livetime%", getNowTimeString()); + set = set.replace("%createtime%", getNowTimeString()); + getSQL().updateSQL(set); + } getSQL().closeConnection(); - Bukkit.getConsoleSender().sendMessage("§6[主播数据] §a主播档案创建。"); } public String getNowTimeString(){ @@ -58,13 +71,13 @@ public class SqlManager { return dateTime.format(formatter); } - public int getZhuboIncome(String tiktok) { + public double 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"); + return resultSet.getDouble("income"); } } catch (Exception e) { e.printStackTrace(); @@ -96,13 +109,13 @@ public class SqlManager { public void SavePlayerData(String tiktok){ if(!Main.giftStatistics){return;} GiftManage giftManage = Main.giftManage; - int money = (int) (giftManage.getTotalMoney() * 0.1); + double money = 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("%income%", String.format("%.1f",money)). replace("%livetime%",getNowTimeString())); getSQL().closeConnection(); } diff --git a/target/classes/com/io/yutian/mclive/Main.class b/target/classes/com/io/yutian/mclive/Main.class index f080a63617e38367d123a5296be537fb61899601..7f6d2477c257f84b6ea0889322fdf1d960704609 100644 GIT binary patch delta 4444 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 CYWCIu delta 4364 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