From 3570e6e84e6be89df9d604990be1de6083ea6e94 Mon Sep 17 00:00:00 2001 From: "pansong291@sina.com" Date: Sat, 3 Aug 2019 08:02:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=94=B6=E5=8F=96=E8=83=BD=E9=87=8F=EF=BC=9B=E7=BB=99=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E5=A5=BD=E5=83=8F=E6=B5=87=E6=B0=B4=EF=BC=9B=E9=A2=86?= =?UTF-8?q?=E5=8F=96=E6=A3=AE=E6=9E=97=E4=BB=BB=E5=8A=A1=E5=A5=96=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../xposed/quickenergy/AntFarm.java | 5 +- .../xposed/quickenergy/AntForest.java | 722 ++++++++++++------ .../pansong291/xposed/quickenergy/Config.java | 63 +- .../xposed/quickenergy/XposedHook.java | 17 +- 5 files changed, 557 insertions(+), 254 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4b79b06..6412fcf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "pansong291.xposed.quickenergy" minSdkVersion 14 targetSdkVersion 21 - versionCode 20190801 - versionName "1.0.7-alpha.4" + versionCode 20190803 + versionName "1.0.7-alpha.5" } buildTypes { release { diff --git a/app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java b/app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java index db4d83b..baf268a 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/AntFarm.java @@ -238,8 +238,9 @@ public void run() private static boolean isEnterFarmAndHasNull(String args0) { - return cityAdCode == null || districtAdCode == null || version == null - && args0.equals("com.alipay.antfarm.enterFarm"); + if(args0.equals("com.alipay.antfarm.enterFarm")) + return cityAdCode == null || districtAdCode == null || version == null; + return false; } private static boolean isEnterOwnerFarm(String resp) diff --git a/app/src/main/java/pansong291/xposed/quickenergy/AntForest.java b/app/src/main/java/pansong291/xposed/quickenergy/AntForest.java index 8f9823d..6668dbb 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/AntForest.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/AntForest.java @@ -1,341 +1,603 @@ package pansong291.xposed.quickenergy; -import android.app.Activity; -import android.text.TextUtils; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; +import android.os.Handler; +import android.os.Message; import org.json.JSONArray; import org.json.JSONObject; +import pansong291.xposed.quickenergy.AntFarm.TaskStatus; +import android.os.Looper; +import java.util.List; public class AntForest { private static final String TAG = AntForest.class.getCanonicalName(); - private static ArrayList friendsRankUseridList = new ArrayList(); - private static Integer collectedEnergy = 0; - private static Integer helpCollectedEnergy = 0; - private static Integer startPoint = 1; - - - /** - * 自动获取有能量的好友信息 - * - * @param loader - * @param response - */ - public static void autoGetCanCollectUserIdList(final ClassLoader loader, String response) + private static String selfId; + private static int collectedEnergy = 0; + private static int helpCollectedEnergy = 0; + private static int onceHelpCollected = 0; + public enum TaskAwardType { - // 开始解析好友信息,循环把所有有能量的好友信息都解析完 - boolean hasMore = parseFrienRankPageDataResponse(response); - if (hasMore) + BUBBLE_BOOST; + public String nickName() { - Log.showDialog("开始获取可以收取能量的好友信息...", ""); - new Thread(new Runnable() { - public void run() + switch(this) + { + case BUBBLE_BOOST: + return "时光加速器"; + default: + return name(); + } + } + } + + public enum ThreadStatus + { START, END } + private static int threadCount = 0; + private static boolean hasMore = true; + + public static void start(ClassLoader loader, String args0, String args1, String resp) + { + if(!args0.equals("alipay.antmember.forest.h5.queryNextAction") + || args1.contains("\"userId\"")) return; + + + new Thread(new Runnable() + { + ClassLoader loader; + String resp; + + public Runnable setData(ClassLoader cl, String s) + { + loader = cl;resp = s; + return this; + } + + @Override + public void run() + { + try { - // 发送获取下一页好友信息接口 - rpcCall_friendRankList(loader); + if(Config.collectEnergy()) + { + Log.showDialogOrToast("开始收取能量…",""); + queryEnergyRanking(loader, 1); + JSONObject jo = new JSONObject(resp); + if(jo.getString("resultCode").equals("SUCCESS")) + { + jo = jo.getJSONObject("userEnergy"); + selfId = jo.getString("userId"); + canCollectSelfEnergy(loader, resp); + }else + { + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); + } + } + + for(String userId: Config.waterFriendList()) + { + waterFriendEnergy(loader,userId); + } + + if(Config.receiveForestTaskAward())receiveTaskAward(loader); + }catch(Exception e) + { + Log.i(TAG, "start err:"); + Log.printStackTrace(TAG, e); } - }).start(); - } else - { - startPoint = 1; - Log.i(TAG, "friendsRankUseridList " + friendsRankUseridList); - //如果发现已经解析完成了,如果有好友能量收取,就开始收取 - if (friendsRankUseridList.size() > 0) + } + }.setData(loader, resp)).start(); + + + } + + private static void queryEnergyRanking(ClassLoader loader, int startPoint) + { + new Thread(new Runnable() { - Log.showDialogOrToast("开始获取每个好友能够收取的能量信息...", ""); - for (String userId : friendsRankUseridList) + ClassLoader loader; + int startPoint; + + public Runnable setData(ClassLoader cl, int sp) { - // 开始收取每个用户的能量 - rpcCall_canCollectEnergy(loader, userId); + loader = cl;startPoint = sp; + return this; + } + + @Override + public void run() + { + try + { + updateThreadCount(ThreadStatus.START,loader); + String s = rpcCall_queryEnergyRanking(loader, startPoint); + JSONObject jo = new JSONObject(s); + if(jo.getString("resultCode").equals("SUCCESS")) + { + hasMore = jo.getBoolean("hasMore"); + if(hasMore) + queryEnergyRanking(loader, startPoint + 20); + JSONArray jaFriendRanking = jo.getJSONArray("friendRanking"); + for(int i = 0; i < jaFriendRanking.length(); i++) + { + jo = jaFriendRanking.getJSONObject(i); + boolean optBoolean = jo.getBoolean("canCollectEnergy") + || jo.getBoolean("canHelpCollect"); + String userId = jo.getString("userId"); + if(optBoolean && !userId.equals(selfId)) + { + canCollectEnergy(loader, userId); + } + } + }else + { + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); + } + }catch(Exception e) + { + Log.i(TAG, "queryEnergyRanking err:"); + Log.printStackTrace(TAG, e); + hasMore = false; + } + updateThreadCount(ThreadStatus.END,loader); } - Log.showDialogOrToast("共偷取能量【" + collectedEnergy + "克】,共帮收能量【" + helpCollectedEnergy + "克】\n", ""); - Log.i(TAG, "能量收取结束"); - friendsRankUseridList.clear(); - collectedEnergy = 0; - if(helpCollectedEnergy != 0) + }.setData(loader, startPoint)).start(); + } + + private static void canCollectSelfEnergy(ClassLoader loader, String resp) + { + try + { + JSONObject jo = new JSONObject(resp); + if(jo.getString("resultCode").equals("SUCCESS")) + { + JSONArray jaBubbles = jo.getJSONArray("bubbles"); + jo = jo.getJSONObject("userEnergy"); + String userId = selfId; + String userName = jo.getString("displayName"); + Config.putIdMap(userId, userName); + for(int i = 0; i < jaBubbles.length(); i++) { - helpCollectedEnergy = 0; - autoGetCanCollectUserIdList(loader, null); + jo = jaBubbles.getJSONObject(i); + long bubbleId = jo.getLong("id"); + if("AVAILABLE".equals(jo.getString("collectStatus"))) + { + if(Config.dontCollect(userId)) + Log.showDialog("不偷取【"+userName+"】",", userId="+userId); + else + collectEnergy(loader, userId, bubbleId, userName); + } } - Config.saveIdMap(); }else { - Log.showDialogOrToast("暂时没有可收取的能量\n", ""); + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); } - // 执行完了调用刷新页面,看看总能量效果 + }catch(Exception e) + { + Log.i(TAG, "canCollectSelfEnergy err:"); + Log.printStackTrace(TAG, e); } } - /** - * 自动获取能收取的能量ID - * - * @param loader - * @param response - */ - public static void autoGetCanCollectBubbleIdList(final ClassLoader loader, String response) + private static void canCollectEnergy(ClassLoader loader, String userId) { - if (!TextUtils.isEmpty(response) && response.contains("collectStatus")) + try { - try + String s = rpcCall_queryNextAction(loader, userId); + JSONObject jo = new JSONObject(s); + if(jo.getString("resultCode").equals("SUCCESS")) { - JSONObject jsonObject = new JSONObject(response); - JSONArray jsonArray = jsonObject.getJSONArray("bubbles"); - jsonObject = jsonObject.getJSONObject("userEnergy"); - String userName = jsonObject.getString("displayName"); - String loginId = userName; - if(jsonObject.has("loginId")) - loginId += "(" + jsonObject.getString("loginId") + ")"; - if (jsonArray != null && jsonArray.length() > 0) + JSONArray jaBubbles = jo.getJSONArray("bubbles"); + jo = jo.getJSONObject("userEnergy"); + String userName = jo.getString("displayName"); + for(int i = 0; i < jaBubbles.length(); i++) { - for (int i = 0; i < jsonArray.length(); i++) + jo = jaBubbles.getJSONObject(i); + long bubbleId = jo.getLong("id"); + if("AVAILABLE".equals(jo.getString("collectStatus"))) { - JSONObject jsonObject1 = jsonArray.getJSONObject(i); - String userId = jsonObject1.getString("userId"); - long bubbleId = jsonObject1.getLong("id"); - Config.putIdMap(userId, loginId); - if ("AVAILABLE".equals(jsonObject1.getString("collectStatus"))) + if(Config.dontCollect(userId)) + Log.showDialog("不偷取【"+userName+"】",", userId="+userId); + else + collectEnergy(loader, userId, bubbleId, userName); + } + if(jo.getBoolean("canHelpCollect")) + { + if(Config.helpFriend()) { - if(Config.dontCollect(userId)) - Log.showDialog("不偷取【" + userName + "】", ", userId=" + userId); + if(Config.dontHelp(userId)) + Log.showDialog("不帮收【"+userName+"】",", userId="+userId); else - rpcCall_collectEnergy(loader, userId, bubbleId, userName); - } - if (jsonObject1.getBoolean("canHelpCollect")) - { - if(Config.helpFriend()) - { - if(Config.dontHelp(userId)) - Log.showDialog("不帮收【" + userName + "】", ", userId=" + userId); - else - rpcCall_forFriendCollectEnergy(loader, userId, bubbleId, userName); - }else - Log.showDialog("不帮收【" + userName + "】", ", userId=" + userId); - } + forFriendCollectEnergy(loader, userId, bubbleId, userName); + }else + Log.showDialog("不帮收【"+userName+"】",", userId="+userId); } } - - }catch(Exception e) + }else { - Log.printStackTrace(TAG, e); + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); } + }catch(Exception e) + { + Log.i(TAG, "canCollectEnergy err:"); + Log.printStackTrace(TAG, e); } } - public static boolean isRankList(String response) + private static void collectEnergy(ClassLoader loader, String userId, Long bubbleId, String userName) { - return !TextUtils.isEmpty(response) && response.contains("friendRanking"); + try + { + String s = rpcCall_collectEnergy(loader,userId,bubbleId); + JSONObject jo = new JSONObject(s); + if(jo.getString("resultCode").equals("SUCCESS")) + { + JSONArray jaBubbles = jo.getJSONArray("bubbles"); + int collected = 0; + for(int i = 0; i < jaBubbles.length(); i++) + { + jo = jaBubbles.getJSONObject(i); + collected += jo.getInt("collectedEnergy"); + } + if(collected > 0) + { + Log.showDialogAndRecordLog("偷取【"+userName+"】的能量【"+collected+"克】",",UserID:"+userId+",BubbleId:"+bubbleId); + collectedEnergy += collected; + }else + { + Log.showDialogAndRecordLog("偷取【"+userName+"】的能量失败",",UserID:"+userId+",BubbleId:"+bubbleId); + } + }else + { + s = jo.getString("resultDesc"); + if(s.contains("TA")) + s = s.replace("TA","【"+userName+"】"); + Log.showDialogAndRecordLog(s,""); + } + }catch(Exception e) + { + Log.i(TAG, "collectEnergy err:"); + Log.printStackTrace(TAG, e); + } } - public static boolean isUserDetail(String response) + private static void forFriendCollectEnergy(ClassLoader loader, String targetUserId, Long bubbleId, String userName) { - return !TextUtils.isEmpty(response) && response.contains("userEnergy"); + try + { + String s = rpcCall_forFriendCollectEnergy(loader,targetUserId,bubbleId); + JSONObject jo = new JSONObject(s); + if(jo.getString("resultCode").equals("SUCCESS")) + { + JSONArray jaBubbles = jo.getJSONArray("bubbles"); + int helped = 0; + for(int i = 0; i < jaBubbles.length(); i++) + { + jo = jaBubbles.getJSONObject(i); + helped += jo.getInt("collectedEnergy"); + } + if(helped > 0) + { + Log.showDialogAndRecordLog("帮【"+userName+"】收取【"+helped+"克】",",UserID:"+targetUserId+",BubbleId:"+bubbleId); + onceHelpCollected += helped; + }else + { + Log.showDialogAndRecordLog("帮【"+userName+"】收取失败",",UserID:"+targetUserId+",BubbleId"+bubbleId); + } + }else + { + s = jo.getString("resultDesc"); + if(s.contains("TA")) + s = s.replace("TA","【"+userName+"】"); + Log.showDialogAndRecordLog(s,""); + } + }catch(Exception e) + { + Log.i(TAG, "forFriendCollectEnergy err:"); + Log.printStackTrace(TAG, e); + } } - /** - * 解析好友信息 - * - * @param response - * @return - */ - private static boolean parseFrienRankPageDataResponse(String response) + private static void waterFriendEnergy(ClassLoader loader, String userId) { try { - JSONObject jo = new JSONObject(response); - JSONArray optJSONArray = jo.getJSONArray("friendRanking"); - if (optJSONArray != null) + String s = rpcCall_queryNextAction(loader,userId); + JSONObject jo = new JSONObject(s); + s = jo.getString("resultCode"); + if(s.equals("SUCCESS")) { - for (int i = 0; i < optJSONArray.length(); i++) + String bizNo = jo.getString("bizNo"); + jo = jo.getJSONObject("userEnergy"); + String userName = jo.getString("displayName"); + for(int waterCount = 1; waterCount <= 3;) { - JSONObject jsonObject = optJSONArray.getJSONObject(i); - boolean optBoolean = jsonObject.getBoolean("canCollectEnergy") - || jsonObject.getBoolean("canHelpCollect"); - String userId = jsonObject.getString("userId"); - if (optBoolean && !friendsRankUseridList.contains(userId)) + s = rpcCall_transferEnergy(loader,userId,bizNo,waterCount); + jo = new JSONObject(s); + s = jo.getString("resultCode"); + if(s.equals("SUCCESS")) + { + s = jo.getJSONObject("treeEnergy").getString("currentEnergy"); + Log.showDialogAndRecordLog("给【"+userName+"】浇水成功,剩余能量【"+s+"克】",""); + waterCount++; + Thread.sleep(2000); + }else if(s.equals("WATERING_TIMES_LIMIT")) + { + Log.showDialogAndRecordLog("今日给【"+userName+"】浇水已达上限",""); + break; + }else if(s.equals("LOW_VERSION")) + { + Log.showDialogAndRecordLog("给【"+userName+"】浇水失败,"+s,""); + break; + }else { - friendsRankUseridList.add(userId); + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); } } - if(optJSONArray.length() == 0) - return false; - return jo.getBoolean("hasMore"); + }else + { + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); } }catch(Exception e) { - Log.i(TAG, "parseFrienRankPageDataResponse err:"); + Log.i(TAG, "waterFriendEnergy err:"); Log.printStackTrace(TAG, e); } - return true; } - /** - * 获取分页好友信息命令 - * - * @param loader - */ - private static void rpcCall_friendRankList(final ClassLoader loader) + private static void receiveTaskAward(ClassLoader loader) { try { - JSONArray jsonArray = new JSONArray(); - JSONObject json = new JSONObject(); - json.put("av", "5"); - json.put("ct", "android"); - json.put("pageSize", 20); - json.put("startPoint", String.valueOf(startPoint)); - startPoint+=20; - jsonArray.put(json); - Log.i(TAG, "call friendranklist params:" + jsonArray); + String s = rpcCall_queryTaskList(loader); + JSONObject jo = new JSONObject(s); + if(jo.getString("resultCode").equals("SUCCESS")) + { + JSONArray jaForestTaskVOList = jo.getJSONArray("forestTaskVOList"); + for(int i = 0; i < jaForestTaskVOList.length(); i++) + { + jo = jaForestTaskVOList.getJSONObject(i); + if(TaskStatus.FINISHED.name().equals(jo.getString("taskStatus"))) + { + TaskAwardType taskAwardType = TaskAwardType.valueOf(jo.getString("awardType")); + int awardCount = jo.getInt("awardCount"); + String taskType = jo.getString("taskType"); + s = rpcCall_receiveTaskAward(loader,taskType); + jo = new JSONObject(s); + s = jo.getString("desc"); + if(s.equals("SUCCESS")) + Log.showDialogAndRecordLog("已领取【"+awardCount+"个】【"+taskAwardType.nickName()+"】",""); + else + Log.showDialogAndRecordLog("领取失败,"+s,""); + } + } + }else + { + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); + } + }catch(Exception e) + { + Log.i(TAG, "receiveTaskAward err:"); + Log.printStackTrace(TAG, e); + } + } - RpcCall.invoke(loader, "alipay.antmember.forest.h5.queryEnergyRanking", jsonArray.toString()); + private static void queryPropList(ClassLoader loader) + { + try + { + String s = rpcCall_queryTaskList(loader); + JSONObject jo = new JSONObject(s); + if(jo.getString("resultCode").equals("SUCCESS")) + { + JSONArray jaForestPropVOList = jo.getJSONArray("forestPropVOList"); + for(int i = 0; i < jaForestPropVOList.length(); i++) + { + jo = jaForestPropVOList.getJSONObject(i); + if(TaskStatus.FINISHED.name().equals(jo.getString("taskStatus"))) + { + String taskType = jo.getString("taskType"); + } + } + }else + { + Log.showDialogAndRecordLog(jo.getString("resultDesc"),""); + } }catch(Exception e) { - Log.i(TAG, "rpcCall_friendRankList err:"); + Log.i(TAG, "queryTaskList err:"); Log.printStackTrace(TAG, e); } } - /** - * 获取指定用户可以收取的能量信息 - * - * @param loader - * @param userId - */ - private static void rpcCall_canCollectEnergy(final ClassLoader loader, String userId) + private static String rpcCall_queryEnergyRanking(ClassLoader loader, int startPoint) { try { - JSONArray jsonArray = new JSONArray(); - JSONObject json = new JSONObject(); - json.put("av", "5"); - json.put("ct", "android"); - json.put("pageSize", 3); - json.put("startIndex", 0); - json.put("userId", userId); - jsonArray.put(json); - Log.i(TAG, "call cancollect energy params:" + jsonArray); + String args1 = "[{\"av\":\"5\",\"ct\":\"android\",\"pageSize\":20,\"startPoint\":" + +startPoint+"}]"; + Object o = RpcCall.invoke(loader, "alipay.antmember.forest.h5.queryEnergyRanking", args1); + return RpcCall.getResponse(o); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_queryEnergyRanking err:"); + Log.printStackTrace(TAG, e); + } + return null; + } - RpcCall.invoke(loader, "alipay.antmember.forest.h5.queryNextAction", jsonArray.toString()); + private static String rpcCall_queryNextAction(ClassLoader loader, String userId) + { + try + { + String args1 = "[{\"userId\":\""+userId+"\"}]"; + Object o = RpcCall.invoke(loader, "alipay.antmember.forest.h5.queryNextAction", args1); - RpcCall.invoke(loader, "alipay.antmember.forest.h5.pageQueryDynamics", jsonArray.toString()); + args1 = "[{\"av\":\"5\",\"ct\":\"android\",\"pageSize\":3,\"startIndex\":0,\"userId\":\"" + +userId+"\"}]"; + RpcCall.invoke(loader, "alipay.antmember.forest.h5.pageQueryDynamics", args1); + return RpcCall.getResponse(o); }catch(Exception e) { - Log.i(TAG, "rpcCall_canCollectEnergy err:"); + Log.i(TAG, "rpcCall_queryNextAction err:"); Log.printStackTrace(TAG, e); } + return null; } - /** - * 收取能量命令 - * - * @param loader - * @param userId - * @param bubbleId - */ - private static void rpcCall_collectEnergy(final ClassLoader loader, String userId, Long bubbleId, String userName) + private static String rpcCall_collectEnergy(ClassLoader loader, String userId, Long bubbleId) { try { - JSONArray jsonArray = new JSONArray(); - JSONArray bubbleAry = new JSONArray(); - bubbleAry.put(bubbleId); - JSONObject json = new JSONObject(); - //json.put("av", "5"); - //json.put("ct", "android"); - json.put("userId", userId); - json.put("bubbleIds", bubbleAry); - jsonArray.put(json); - Log.i(TAG, "call collect energy params:" + jsonArray); - - Object resp = RpcCall.invoke(loader, "alipay.antmember.forest.h5.collectEnergy", jsonArray.toString()); - String response = RpcCall.getResponse(resp); - int collect = parseCollectEnergyResponse(response, false); - if(collect > 0) - { - Log.showDialogAndRecordLog("偷取【" + userName + "】的能量【" + collect + "克】", ",UserID:" + userId + ",BubbleId:" + bubbleId); - }else - { - Log.showDialogAndRecordLog("偷取【" + userName + "】的能量失败", ",UserID:" + userId + ",BubbleId:" + bubbleId); - } + String args1 = "[{\"bubbleIds\":["+bubbleId+"],\"userId\":\""+userId+"\"}]"; + Object resp = RpcCall.invoke(loader, "alipay.antmember.forest.h5.collectEnergy", args1); + return RpcCall.getResponse(resp); }catch(Exception e) { Log.i(TAG, "rpcCall_collectEnergy err:"); Log.printStackTrace(TAG, e); } + return null; } - - /** - * 帮好友收取能量命令 - * - * @param loader - * @param userId - * @param bubbleId - */ - private static void rpcCall_forFriendCollectEnergy(ClassLoader loader, String targetUserId, Long bubbleId, String userName) + + private static String rpcCall_transferEnergy(ClassLoader loader, String targetUser, String bizNo, int ordinal) { try { - JSONArray jsonArray = new JSONArray(); - JSONArray bubbleAry = new JSONArray(); - bubbleAry.put(bubbleId); - JSONObject json = new JSONObject(); - json.put("bubbleIds", bubbleAry); - json.put("targetUserId", targetUserId); - jsonArray.put(json); - Log.i(TAG, "call help collect energy params:" + jsonArray); - Object resp = RpcCall.invoke(loader, "alipay.antmember.forest.h5.forFriendCollectEnergy", jsonArray.toString()); - String response = RpcCall.getResponse(resp); - int helped = parseCollectEnergyResponse(response, true); - if (helped > 0) - { - Log.showDialogAndRecordLog("帮【" + userName + "】收取【" + helped + "克】", ",UserID:" + targetUserId + ",BubbleId:" + bubbleId); - }else - { - Log.showDialogAndRecordLog("帮【" + userName + "】收取失败", ",UserID:" + targetUserId + ",BubbleId" + bubbleId); - } + String args1 = "[{\"bizNo\":\""+bizNo+ordinal+"\",\"targetUser\":\"" + +targetUser+"\",\"transferType\":\"WATERING\",\"version\":\"\"}]";//20181217 + Object resp = RpcCall.invoke(loader, "alipay.antmember.forest.h5.transferEnergy", args1); + return RpcCall.getResponse(resp); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_transferEnergy err:"); + Log.printStackTrace(TAG, e); + } + return null; + } + + private static String rpcCall_forFriendCollectEnergy(ClassLoader loader, String targetUserId, Long bubbleId) + { + try + { + String args1 = "[{\"bubbleIds\":["+bubbleId+"],\"targetUserId\":\""+targetUserId+"\"}]"; + Object resp = RpcCall.invoke(loader, "alipay.antmember.forest.h5.forFriendCollectEnergy", args1); + return RpcCall.getResponse(resp); }catch(Exception e) { Log.i(TAG, "rpcCall_forFriendCollectEnergy err:"); Log.printStackTrace(TAG, e); } + return null; + } + private static String rpcCall_queryTaskList(ClassLoader loader) + { + try + { + String args1 = "[{\"version\":\"\"}]"; //20190321 + Object resp = RpcCall.invoke(loader, "alipay.antforest.forest.h5.queryTaskList", args1); + return RpcCall.getResponse(resp); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_queryTaskList err:"); + Log.printStackTrace(TAG, e); + } + return null; + } + + private static String rpcCall_receiveTaskAward(ClassLoader loader, String taskType) + { + try + { + String args1 = + "[{\"ignoreLimit\":false,\"requestType\":\"H5\",\"sceneCode\":\"ANTFOREST_TASK\",\"source\":\"ANTFOREST\",\"taskType\":\"" + +taskType+"\"}]"; + Object resp = RpcCall.invoke(loader, "com.alipay.antiep.receiveTaskAward", args1); + return RpcCall.getResponse(resp); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_receiveTaskAward err:"); + Log.printStackTrace(TAG, e); + } + return null; } - private static int parseCollectEnergyResponse(String response, boolean isForFriend) + private static String rpcCall_queryPropList(ClassLoader loader) { - if(!TextUtils.isEmpty(response) && response.contains("failedBubbleIds")) + try { - try - { - int count = 0; - JSONObject jsonObject = new JSONObject(response); - JSONArray jsonArray = jsonObject.getJSONArray("bubbles"); - for(int i = 0; i < jsonArray.length(); i++) - count += jsonArray.getJSONObject(i).getInt("collectedEnergy"); - if(isForFriend) - { - helpCollectedEnergy += count; - }else - { - collectedEnergy += count; - } - if("SUCCESS".equals(jsonObject.getString("resultCode"))) + String args1 = "[{\"version\":\"\"}]"; //20181217 + Object resp = RpcCall.invoke(loader, "alipay.antforest.forest.h5.queryPropList", args1); + return RpcCall.getResponse(resp); + }catch(Exception e) + { + Log.i(TAG, "rpcCall_queryPropList err:"); + Log.printStackTrace(TAG, e); + } + return null; + } + + private static void updateThreadCount(ThreadStatus ts, ClassLoader loader) + { + switch(ts) + { + case START: + threadCount++; + Log.showDialog("新线程开始"+threadCount,""); + break; + + case END: + threadCount--; + Log.showDialog("线程结束"+threadCount,""); + if(!hasMore && threadCount == 0) { - return count; + hasMore = true; + if(collectedEnergy == 0 && + helpCollectedEnergy == 0 && onceHelpCollected == 0) + { + Log.showDialogOrToast("暂时没有可收取的能量",""); + }else if(onceHelpCollected != 0) + { + helpCollectedEnergy += onceHelpCollected; + onceHelpCollected = 0; + Log.showDialog("再次收取能量…",""); + queryEnergyRanking(loader, 1); + }else + { + Log.showDialogOrToast("共收取【"+collectedEnergy+"克】,帮收【"+helpCollectedEnergy+"克】",""); + collectedEnergy = 0; + helpCollectedEnergy = 0; + Config.saveIdMap(); + } } - }catch(Exception e) + break; + } + } + + public static void saveUserIdAndName(String args0, String resp) + { + if(!args0.equals("alipay.antmember.forest.h5.queryNextAction")) + return; + try + { + JSONObject jo = new JSONObject(resp); + if(jo.has("userEnergy")) { - Log.i(TAG, "parseCollectEnergyResponse err:"); - Log.printStackTrace(TAG, e); + jo = jo.getJSONObject("userEnergy"); + String userName = jo.getString("displayName"); + String loginId = userName; + if(jo.has("loginId")) + loginId += "(" + jo.getString("loginId") + ")"; + Config.putIdMap(jo.getString("userId"), loginId); + Config.saveIdMap(); } + }catch(Exception e) + { + Log.i(TAG, "saveUserIdAndName err:"); + Log.printStackTrace(TAG, e); } - return -1; } - - } diff --git a/app/src/main/java/pansong291/xposed/quickenergy/Config.java b/app/src/main/java/pansong291/xposed/quickenergy/Config.java index 8dc783c..badd1cc 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/Config.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/Config.java @@ -23,7 +23,8 @@ public enum RecallAnimalType jn_immediateEffect = "immediateEffect", jn_showMode = "showMode", jn_recordLog = "recordLog", jn_enableForest = "enableForest", jn_enableFarm = "enableFarm", /* forest */ - jn_helpFriendCollect = "helpFriendCollect", jn_dontCollectList = "dontCollectList", jn_dontHelpCollectList = "dontHelpCollectList", + jn_collectEnergy = "collectEnergy", jn_helpFriendCollect = "helpFriendCollect", jn_dontCollectList = "dontCollectList", + jn_dontHelpCollectList = "dontHelpCollectList", jn_receiveForestTaskAward = "receiveForestTaskAward", jn_waterFriendList = "waterFriendList", /* farm */ jn_rewardFriend = "rewardFriend", jn_sendBackAnimal = "sendBackAnimal", jn_sendType = "sendType", jn_sendTypeExcludeList = "sendTypeExcludeList", jn_recallAnimalType = "recallAnimalType", jn_useNewEggTool = "useNewEggTool", @@ -43,9 +44,12 @@ public enum RecallAnimalType private boolean enableFarm; /* forest */ + private Boolean collectEnergy; private boolean helpFriendCollect; private List dontCollectList; private List dontHelpCollectList; + private boolean receiveForestTaskAward; + private List waterFriendList; /* farm */ private boolean rewardFriend; @@ -96,6 +100,11 @@ public static boolean enableFarm() } /* forest */ + public static boolean collectEnergy() + { + return getConfig().collectEnergy; + } + public static boolean helpFriend() { return getConfig().helpFriendCollect; @@ -110,6 +119,16 @@ public static boolean dontHelp(String id) { return getConfig().dontHelpCollectList.contains(id); } + + public static boolean receiveForestTaskAward() + { + return getConfig().receiveForestTaskAward; + } + + public static List waterFriendList() + { + return getConfig().waterFriendList; + } /* farm */ public static boolean rewardFriend() @@ -311,9 +330,12 @@ public static Config defInit() c.enableForest = true; c.enableFarm = true; + c.collectEnergy = true; c.helpFriendCollect = true; c.dontCollectList = new ArrayList<>(); c.dontHelpCollectList = new ArrayList<>(); + c.receiveForestTaskAward = true; + c.waterFriendList = new ArrayList<>(); c.rewardFriend = true; c.sendBackAnimal = true; @@ -359,6 +381,9 @@ public static Config json2Config(String json) Log.i(TAG, jn_enableFarm + ":" + config.enableFarm); /* forest */ + config.collectEnergy = jo.getBoolean(jn_collectEnergy); + Log.i(TAG, jn_collectEnergy + ":" + config.collectEnergy); + config.helpFriendCollect = jo.getBoolean(jn_helpFriendCollect); Log.i(TAG, jn_helpFriendCollect + ":" + config.helpFriendCollect); @@ -380,6 +405,18 @@ public static Config json2Config(String json) Log.i(TAG, config.dontHelpCollectList.get(i)+","); } + config.receiveForestTaskAward = jo.getBoolean(jn_receiveForestTaskAward); + Log.i(TAG, jn_receiveForestTaskAward + ":" + config.receiveForestTaskAward); + + ja = jo.getJSONArray(jn_waterFriendList); + config.waterFriendList = new ArrayList<>(); + Log.i(TAG, jn_waterFriendList + ":["); + for(int i = 0; i < ja.length(); i++) + { + config.waterFriendList.add(ja.getString(i)); + Log.i(TAG, config.waterFriendList.get(i)+","); + } + /* farm */ config.rewardFriend = jo.getBoolean(jn_rewardFriend); Log.i(TAG, jn_rewardFriend + ":" + config.rewardFriend); @@ -481,6 +518,9 @@ public static String config2Json(Config config) jo.put(jn_enableFarm, config.enableFarm); /* forest */ + jo.put("收取能量", trueAndFalse); + jo.put(jn_collectEnergy, config.collectEnergy); + jo.put("帮好友收取能量", trueAndFalse); jo.put(jn_helpFriendCollect, config.helpFriendCollect); @@ -500,6 +540,17 @@ public static String config2Json(Config config) jo.put("不帮收能量的好友列表", userId); jo.put(jn_dontHelpCollectList, ja); + jo.put("领取森林任务奖励", trueAndFalse); + jo.put(jn_receiveForestTaskAward, config.receiveForestTaskAward); + + ja = new JSONArray(); + for(String s: config.waterFriendList) + { + ja.put(s); + } + jo.put("帮浇水的好友列表", userId); + jo.put(jn_waterFriendList, ja); + /* farm */ jo.put("打赏好友", trueAndFalse); jo.put(jn_rewardFriend, config.rewardFriend); @@ -536,10 +587,10 @@ public static String config2Json(Config config) jo.put("答题", trueAndFalse); jo.put(jn_answerQuestion, config.answerQuestion); - jo.put("领取饲料", trueAndFalse); + jo.put("领取庄园任务奖励", trueAndFalse); jo.put(jn_receiveFarmTaskAward, config.receiveFarmTaskAward); - jo.put("领取道具卡", trueAndFalse); + jo.put("领取道具卡奖励", trueAndFalse); jo.put(jn_receiveFarmToolReward, config.receiveFarmToolReward); jo.put("喂鸡", trueAndFalse); @@ -583,7 +634,7 @@ private static String formatJson(JSONObject jo) } StringBuilder sb = new StringBuilder(formated); char currentChar, lastNonSpaceChar = 0; - sbi:for(int i = 0; i < sb.length(); i++) + for(int i = 0; i < sb.length(); i++) { currentChar = sb.charAt(i); switch(currentChar) @@ -599,7 +650,7 @@ private static String formatJson(JSONObject jo) sb.replace(i, i + 1, "// "); sb.deleteCharAt(sb.indexOf("\"", i)); sb.deleteCharAt(sb.lastIndexOf(",", nextNL)); - continue sbi; + break; } } break; @@ -612,7 +663,7 @@ private static String formatJson(JSONObject jo) sb.deleteCharAt(i); i = sb.indexOf("\"", i); sb.deleteCharAt(i); - lastNonSpaceChar = sb.charAt(--i); + if(lastNonSpaceChar != '[') lastNonSpaceChar = sb.charAt(--i); } break; diff --git a/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java b/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java index 3faef27..6df088b 100644 --- a/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java +++ b/app/src/main/java/pansong291/xposed/quickenergy/XposedHook.java @@ -144,22 +144,11 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { String response = RpcCall.getResponse(resp); Log.i(TAG, "response: " + response); + + AntForest.saveUserIdAndName(args0, response); if(Config.enableForest()) - { - if(AntForest.isRankList(response)) - { - Log.i(TAG, "autoGetCanCollectUserIdList"); - AntForest.autoGetCanCollectUserIdList(loader, response); - } - - // 第一次是自己的能量,比上面的获取用户信息还要早,所以这里可以记录当前自己的userid值 - if(AntForest.isUserDetail(response)) - { - Log.i(TAG, "autoGetCanCollectBubbleIdList"); - AntForest.autoGetCanCollectBubbleIdList(loader, response); - } - } + AntForest.start(loader, args0, args1, response); if(Config.enableFarm()) AntFarm.start(loader, args0, args1, response);