From 0b23c8a118f4368164d121ab25549c59cb22771f Mon Sep 17 00:00:00 2001
From: zheng sen he <61687266+meteorOSS@users.noreply.github.com>
Date: Thu, 14 Dec 2023 01:43:54 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=E6=9C=AC=E5=9C=B0(sqlite?=
 =?UTF-8?q?)=E5=AD=98=E5=82=A8=E6=96=B9=E5=BC=8F=20-=20=E5=AF=B9=E4=B8=80?=
 =?UTF-8?q?=E4=BA=9B=E6=A8=A1=E7=BB=84=E7=AB=AF=E7=9A=84=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md                                     |   3 +-
 pom.xml                                       |   2 +-
 .../com/meteor/aifadianpay/AifadianPay.java   |   5 +-
 .../handle/HandlerQueryOrdersResponse.java    |   5 +
 .../meteor/aifadianpay/command/SubCmd.java    |  10 +-
 .../meteor/aifadianpay/storage/IStorage.java  |   2 +
 .../aifadianpay/storage/sub/MysqlStorage.java |  14 +-
 .../storage/sub/SqliteStorage.java            | 185 ++++++++++++++++++
 src/main/resources/config.yml                 |   1 +
 9 files changed, 218 insertions(+), 9 deletions(-)
 create mode 100644 src/main/java/com/meteor/aifadianpay/storage/sub/SqliteStorage.java

diff --git a/README.md b/README.md
index 5d58c22..392d1c0 100644
--- a/README.md
+++ b/README.md
@@ -4,11 +4,10 @@
 # 关于
 
 ![bs](https://bstats.org/signatures/bukkit/AifadianPay.svg)
-(实时使用统计)
 
 将爱发电支付集成到MC服务器中,你可以轻松的创建商品让玩家捐赠服务器
 
-注意: 3.0版本几乎重构,如果使用了这之前的插件版本.为了防止已处理订单污染数据库,需将shopitems中的商品名更换 (不要和之前的同名)
+注意: 3.0版本几乎重构,如果使用了这之前的插件版本.为了防止已处理订单污染数据库,需将shopitems.yml中的商品名更换 (不要和之前的同名)
 如要保留先前的记录,可以参考 [导入历史订单](https://github.com/meteorOSS/AifadianPay-plugin/wiki/Home/_edit)
 
 在开始之前,请先注册一个 [爱发电](https://afdian.net) 账号
diff --git a/pom.xml b/pom.xml
index 1c5aecc..20898c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>com.meteor</groupId>
     <artifactId>AifadianPay</artifactId>
-    <version>3.1-SNAPSHOT</version>
+    <version>3.2-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <name>AifadianPay</name>
diff --git a/src/main/java/com/meteor/aifadianpay/AifadianPay.java b/src/main/java/com/meteor/aifadianpay/AifadianPay.java
index 297dbb1..b8c566a 100644
--- a/src/main/java/com/meteor/aifadianpay/AifadianPay.java
+++ b/src/main/java/com/meteor/aifadianpay/AifadianPay.java
@@ -9,6 +9,7 @@
 import com.meteor.aifadianpay.listener.PlayerListener;
 import com.meteor.aifadianpay.storage.IStorage;
 import com.meteor.aifadianpay.storage.sub.MysqlStorage;
+import com.meteor.aifadianpay.storage.sub.SqliteStorage;
 import com.meteor.aifadianpay.util.BaseConfig;
 import com.meteor.api.hook.PlaceholderHook;
 import org.bukkit.Bukkit;
@@ -85,7 +86,9 @@ public void onDisable() {
      * 初始化存储
      */
     private void initStorage(){
-        if(getConfig().isBoolean("mysql-info.enable")) iStorage = new MysqlStorage(this);
+        if(getConfig().getBoolean("mysql-info.enable",false))
+            this.iStorage = new MysqlStorage(this);
+        else this.iStorage = new SqliteStorage(this);
         QueryOrderTask.init(iStorage);
     }
 
diff --git a/src/main/java/com/meteor/aifadianpay/afdian/handle/HandlerQueryOrdersResponse.java b/src/main/java/com/meteor/aifadianpay/afdian/handle/HandlerQueryOrdersResponse.java
index 283a3a9..f383286 100644
--- a/src/main/java/com/meteor/aifadianpay/afdian/handle/HandlerQueryOrdersResponse.java
+++ b/src/main/java/com/meteor/aifadianpay/afdian/handle/HandlerQueryOrdersResponse.java
@@ -22,9 +22,14 @@ public void success(QueryOrderResponse queryOrderResponse,boolean isSave) {
 
         if(orders!=null){
             if(AifadianPay.debug) {
+                boolean test = iStorage==null;
+                AifadianPay.INSTANCE.getLogger().info("storage "+test);
                 AifadianPay.INSTANCE.getLogger().info("本页订单数 " + orders.getOrderList().size());
             }
             orders.getOrderList().forEach(order -> {
+                if(AifadianPay.debug){
+                    AifadianPay.INSTANCE.getLogger().info("handler"+order.getOutTradeNo());
+                }
                 iStorage.handeOrder(order,isSave);
             });
         }
diff --git a/src/main/java/com/meteor/aifadianpay/command/SubCmd.java b/src/main/java/com/meteor/aifadianpay/command/SubCmd.java
index 2486c66..673a54e 100644
--- a/src/main/java/com/meteor/aifadianpay/command/SubCmd.java
+++ b/src/main/java/com/meteor/aifadianpay/command/SubCmd.java
@@ -1,12 +1,15 @@
 package com.meteor.aifadianpay.command;
 
 import com.google.common.collect.ImmutableMap;
+import com.meteor.aifadianpay.util.BaseConfig;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 import org.bukkit.plugin.java.JavaPlugin;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public abstract class SubCmd {
     protected JavaPlugin plugin;
@@ -32,12 +35,13 @@ public List<String> getTab(final Player p, final int i, final String[] args) {
     public abstract void perform(final CommandSender p0, final String[] p1);
     public void execute(CommandSender sender, String[] args){
         if(this.playersOnly()&&!(sender instanceof Player)){
-//            sender.sendMessage(Store.state.getMessageBox().getMessage(null,"message.playerOnly"));
+            sender.sendMessage(BaseConfig.STORE.getMessageBox().getMessage(null,"message.only-player"));
             return;
         }
         if (!hasPerm(sender)) {
-//            sender.sendMessage(Store.state.getMessageBox().getMessage(ImmutableMap.<String,String>builder().put("@perm@",getPermission()).build(),
-//                    "message.no-perm"));
+            Map<String,String> prams = new HashMap<>();
+            prams.put("@permission@",getPermission());
+            sender.sendMessage(BaseConfig.STORE.getMessageBox().getMessage(prams,"message.no-perm"));
             return;
         }
         this.perform(sender,args);
diff --git a/src/main/java/com/meteor/aifadianpay/storage/IStorage.java b/src/main/java/com/meteor/aifadianpay/storage/IStorage.java
index 8fd9598..fc62329 100644
--- a/src/main/java/com/meteor/aifadianpay/storage/IStorage.java
+++ b/src/main/java/com/meteor/aifadianpay/storage/IStorage.java
@@ -4,6 +4,8 @@
 
 public interface IStorage {
 
+
+
     /**
      * 处理订单
      */
diff --git a/src/main/java/com/meteor/aifadianpay/storage/sub/MysqlStorage.java b/src/main/java/com/meteor/aifadianpay/storage/sub/MysqlStorage.java
index 2fe7f96..9135334 100644
--- a/src/main/java/com/meteor/aifadianpay/storage/sub/MysqlStorage.java
+++ b/src/main/java/com/meteor/aifadianpay/storage/sub/MysqlStorage.java
@@ -31,6 +31,17 @@ public class MysqlStorage implements IStorage {
 
 
     public MysqlStorage(AifadianPay plugin){
+        try {
+            Class.forName("com.mysql.cj.jdbc.Driver");
+        } catch (ClassNotFoundException e) {
+            try {
+                Class.forName("com.mysql.jdbc.Driver");
+            } catch (ClassNotFoundException ex) {
+                ex.printStackTrace();
+                plugin.getLogger().info("无法加载数据库驱动,请反馈给开发者");
+                return;
+            }
+        }
         this.plugin = plugin;
         this.fastMySQLStorage = new FastMySQLStorage(plugin,plugin.getConfig().getConfigurationSection("mysql-info"));
         this.connect();
@@ -128,7 +139,6 @@ public void handeOrder(Order order,boolean isSave) {
                     });
                 }
             }
-
         }
 
     }
@@ -137,7 +147,7 @@ public void handeOrder(Order order,boolean isSave) {
     public int queryPlayerDonate(String p) {
         PreparedStatement preparedStatement = null;
         try {
-            String sql = "select sum(price) as count from "+ORDER_TABLE+" where remark = ?";
+            String sql = "select sum(cast(`price` as DECIMAL(10,2))) as count from "+ORDER_TABLE+" where remark = ?";
             preparedStatement = fastMySQLStorage.getConnection().prepareStatement(sql);
             preparedStatement.setString(1,p);
             ResultSet resultSet = preparedStatement.executeQuery();
diff --git a/src/main/java/com/meteor/aifadianpay/storage/sub/SqliteStorage.java b/src/main/java/com/meteor/aifadianpay/storage/sub/SqliteStorage.java
new file mode 100644
index 0000000..3c55b71
--- /dev/null
+++ b/src/main/java/com/meteor/aifadianpay/storage/sub/SqliteStorage.java
@@ -0,0 +1,185 @@
+package com.meteor.aifadianpay.storage.sub;
+
+import com.meteor.aifadianpay.AifadianPay;
+import com.meteor.aifadianpay.afdian.response.Order;
+import com.meteor.aifadianpay.afdian.response.SkuDetail;
+import com.meteor.aifadianpay.api.event.SendOutGoodsEvent;
+import com.meteor.aifadianpay.data.ShopItem;
+import com.meteor.aifadianpay.filter.FilterManager;
+import com.meteor.aifadianpay.mysql.data.KeyValue;
+import com.meteor.aifadianpay.storage.IStorage;
+import com.meteor.aifadianpay.util.BaseConfig;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+
+import java.sql.*;
+import java.util.Arrays;
+import java.util.List;
+
+public class SqliteStorage implements IStorage {
+
+
+    private final String ORDER_TABLE = "AIFADIAN_ORDERS_0";
+    private final String SKU_DETAIL_TABLE = "AIFADIAN_SKUDETAIL_0";
+
+    private AifadianPay plugin;
+    private Connection connection;
+
+
+    private void connect(){
+        try {
+            Class.forName("org.sqlite.JDBC");
+            this.connection = DriverManager.getConnection("jdbc:sqlite:"+plugin.getDataFolder().getPath()+"/data.db");
+
+            String orders_column = "CREATE TABLE IF NOT EXISTS AIFADIAN_ORDERS_0 ("
+                    + "out_trade_no varchar(40) PRIMARY KEY,"
+                    + "remark varchar(100),"
+                    + "user_id varchar(40),"
+                    + "plan_title varchar(40),"
+                    + "redeem_id varchar(40),"
+                    + "price varchar(40),"
+                    + "insert_time bigint"
+                    + ")";
+
+            Statement statement = connection.createStatement();
+
+            String skudetail_column = "CREATE TABLE IF NOT EXISTS AIFADIAN_SKUDETAIL_0 ("
+                    + "out_trade_no varchar(40),"
+                    + "sku_id varchar(40),"
+                    + "price varchar(40),"
+                    + "name varchar(40),"
+                    + "count int"
+                    + ")";
+            statement.execute(orders_column);
+            statement.execute(skudetail_column);
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public SqliteStorage(AifadianPay plugin){
+        this.plugin = plugin;
+        this.connect();;
+    }
+
+    public boolean isExistOrder(String no){
+        PreparedStatement preparedStatement = null;
+        ResultSet resultSet;
+        resultSet = null;
+        try {
+            preparedStatement = this.connection.prepareStatement("select * from " + ORDER_TABLE + " where out_trade_no = ?");
+            resultSet = preparedStatement.executeQuery();
+            while (resultSet.next()) return true;
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }finally {
+            try {
+                preparedStatement.close();
+                resultSet.close();
+            } catch (SQLException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return false;
+    }
+
+
+    public void insertOrder(Order order) {
+
+        String sql = "INSERT INTO AIFADIAN_ORDERS_0 (out_trade_no, remark, user_id, plan_title, redeem_id,price,insert_time) VALUES (?, ?, ?, ?,?,?,?)";
+
+        try (
+             PreparedStatement statement = connection.prepareStatement(sql)) {
+            statement.setString(1,order.getOutTradeNo());
+            statement.setString(2,order.getRemark());
+            statement.setString(3,order.getUserId());
+            statement.setString(4,order.getPlanTitle());
+            statement.setString(5,order.getRedeemId());
+            statement.setString(6,order.getTotalAmount());
+            statement.setLong(7,System.currentTimeMillis());
+            statement.executeUpdate();
+        } catch (SQLException e) {
+        }
+    }
+
+
+    public void insertSkudetail(Order order,SkuDetail skuDetail) {
+
+        String sql = "INSERT INTO AIFADIAN_SKUDETAIL_0 (out_trade_no, sku_id, price, `name`, `count`) VALUES (?, ?, ?, ?, ?)";
+
+        try (
+                PreparedStatement statement = connection.prepareStatement(sql)) {
+            statement.setString(1,order.getOutTradeNo());
+            statement.setString(2,skuDetail.getSkuId());
+            statement.setString(3,order.getTotalAmount());
+            statement.setString(4,skuDetail.getName());
+            statement.setInt(5,skuDetail.getCount());
+            statement.executeUpdate();
+        } catch (SQLException e) {
+        }
+    }
+
+    @Override
+    public void handeOrder(Order order, boolean b) {
+        List<Order> orders = FilterManager.meet(Arrays.asList(order));
+        if(!orders.isEmpty()){
+            Order handleOrder = orders.get(0);
+            Player playerExact = Bukkit.getPlayerExact(handleOrder.getRemark());
+
+            if(playerExact!=null&&b){
+
+
+                if(!isExistOrder(handleOrder.getOutTradeNo())){
+
+                    /***
+                     * 插入已处理订单表
+                     */
+                    this.insertOrder(handleOrder);
+
+
+                    /***
+                     * 型号处理
+                     */
+                    for (SkuDetail skuDetail : handleOrder.getSkuDetail()) {
+                        this.insertSkudetail(handleOrder,skuDetail);
+                    }
+
+                    /**
+                     * 发货
+                     */
+                    ShopItem shopItem = BaseConfig.STORE.getShopItemMap().get(handleOrder.getPlanTitle());
+                    Bukkit.getScheduler().runTask(plugin,()->{
+                        SendOutGoodsEvent sendOutGoodsEvent = new SendOutGoodsEvent(playerExact,shopItem,handleOrder.getOutTradeNo(),handleOrder.getSkuDetail(),handleOrder);
+                        Bukkit.getServer().getPluginManager().callEvent(sendOutGoodsEvent);
+                    });
+                }
+            }
+        }
+    }
+
+    @Override
+    public int queryPlayerDonate(String p) {
+        PreparedStatement preparedStatement = null;
+        ResultSet resultSet = null;
+        try {
+            String sql = "select sum(`price`) as count from "+ORDER_TABLE+" where remark = ?";
+            preparedStatement = connection.prepareStatement(sql);
+            preparedStatement.setString(1,p);
+            resultSet = preparedStatement.executeQuery();
+            while (resultSet.next()) return resultSet.getInt("sum");
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }finally {
+            try {
+                preparedStatement.close();
+                resultSet.close();
+            } catch (SQLException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return 0;
+    }
+}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 3373560..6c19fa8 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -6,6 +6,7 @@ token: ''
 # 数据库信息 (推荐启用)
 mysql-info:
   ip: '127.0.0.1'
+  enable: false
   port: 3306
   param: 'useSsl=false'
   user: 'root'