update:重构脚本执行方式
This commit is contained in:
parent
af54377bb2
commit
21dd8033d1
@ -3,47 +3,58 @@ package com.yutou.qqbot.Controllers;
|
|||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.alibaba.fastjson2.JSONArray;
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.yutou.qqbot.data.JianRScriptData;
|
import com.yutou.qqbot.data.jianr.AndroidDevice;
|
||||||
|
import com.yutou.qqbot.data.jianr.JianRScriptV2Data;
|
||||||
import com.yutou.qqbot.utlis.JianRTaskManager;
|
import com.yutou.qqbot.utlis.JianRTaskManager;
|
||||||
import com.yutou.qqbot.utlis.RedisTools;
|
import com.yutou.qqbot.utlis.RedisTools;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Map;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
public class JianRScriptController {
|
public class JianRScriptController {
|
||||||
@RequestMapping("/jianr/run.do")
|
@RequestMapping("/jianr/run.do")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public JSONObject runScript(String task) {
|
public JSONObject runScript(String task, String device, String modelName) {
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
String data = RedisTools.get("jianrScript_Model_" + task);
|
String data = RedisTools.getHashMap(JianRTaskManager.Redis_Script, task);
|
||||||
if (data == null) {
|
String deviceJsonString = RedisTools.getHashMap(JianRTaskManager.Redis_Device, device);
|
||||||
|
if (data == null || deviceJsonString == null) {
|
||||||
json.put("code", -1);
|
json.put("code", -1);
|
||||||
json.put("msg", "没有找到该方案,请配置");
|
json.put("msg", "没有找到该方案或设备错误,请配置");
|
||||||
} else {
|
} else {
|
||||||
JianRScriptData script = JSON.parseObject(data, JianRScriptData.class);
|
JianRScriptV2Data script = JSON.parseObject(data, JianRScriptV2Data.class);
|
||||||
|
AndroidDevice androidDevice = JSON.parseObject(deviceJsonString, AndroidDevice.class);
|
||||||
JianRTaskManager manager = JianRTaskManager.getInstance();
|
JianRTaskManager manager = JianRTaskManager.getInstance();
|
||||||
if (manager.isRunning()) {
|
if (manager.isRunning()) {
|
||||||
manager.stop();
|
manager.stop();
|
||||||
}
|
}
|
||||||
manager.setTask(script);
|
for (int i = 0; i < androidDevice.getDeviceDisplay().size(); i++) {
|
||||||
|
if (androidDevice.getDeviceDisplay().get(i).getTitle().equals(modelName)) {
|
||||||
|
manager.setModelId(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
manager.setTask(script, androidDevice);
|
||||||
manager.start();
|
manager.start();
|
||||||
json.put("code", 0);
|
json.put("code", 0);
|
||||||
json.put("msg", "任务创建成功");
|
json.put("msg", "任务创建成功");
|
||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/jianr/stop.do")
|
@RequestMapping("/jianr/stop.do")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public JSONObject stop(){
|
public JSONObject stop() {
|
||||||
JianRTaskManager.getInstance().stop();
|
JianRTaskManager.getInstance().stop();
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("code", 0);
|
json.put("code", 0);
|
||||||
json.put("msg", "任务已停止");
|
json.put("msg", "任务已停止");
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/jianr/status.do")
|
@RequestMapping("/jianr/status.do")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public JSONObject status() {
|
public JSONObject status() {
|
||||||
@ -64,8 +75,8 @@ public class JianRScriptController {
|
|||||||
public JSONObject tasks() {
|
public JSONObject tasks() {
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
JSONArray array = new JSONArray();
|
JSONArray array = new JSONArray();
|
||||||
Set<String> jianrScript_model = RedisTools.list_get("jianrScript_Model");
|
Map<String, String> map = RedisTools.getHashMap(JianRTaskManager.Redis_Script);
|
||||||
array.addAll(jianrScript_model);
|
array.addAll(map.keySet());
|
||||||
json.put("code", 0);
|
json.put("code", 0);
|
||||||
json.put("data", array);
|
json.put("data", array);
|
||||||
return json;
|
return json;
|
||||||
@ -80,35 +91,150 @@ public class JianRScriptController {
|
|||||||
json.put("code", -1);
|
json.put("code", -1);
|
||||||
json.put("msg", "JSON格式错误");
|
json.put("msg", "JSON格式错误");
|
||||||
} else {
|
} else {
|
||||||
String taskName = data.getString("name");
|
String taskName = data.getString("title");
|
||||||
if (RedisTools.list_isExist("jianrScript_Model", taskName)) {
|
if (RedisTools.getHashMap(JianRTaskManager.Redis_Script).containsKey(taskName)) {
|
||||||
json.put("code", -1);
|
json.put("code", -1);
|
||||||
json.put("msg", "该任务名称已存在");
|
json.put("msg", "该任务名称已存在");
|
||||||
} else {
|
} else {
|
||||||
RedisTools.list_add("jianrScript_Model", taskName);
|
RedisTools.setHashMap(JianRTaskManager.Redis_Script, taskName, task);
|
||||||
RedisTools.set("jianrScript_Model_"+taskName,task);
|
|
||||||
json.put("code", 0);
|
json.put("code", 0);
|
||||||
json.put("msg", "任务创建成功");
|
json.put("msg", "任务创建成功");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
}
|
|
||||||
@RequestMapping("/jianr/task/get.do")
|
|
||||||
@ResponseBody
|
|
||||||
public JSONObject getTask (String task){
|
|
||||||
JSONObject json = new JSONObject();
|
|
||||||
json.put("code", 0);
|
|
||||||
json.put("data", RedisTools.get("jianrScript_Model_" + task));
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
@RequestMapping("/jianr/task/remove.do")
|
|
||||||
@ResponseBody
|
|
||||||
public JSONObject removeTask (String task){
|
|
||||||
RedisTools.remove("jianrScript_Model_" + task);
|
|
||||||
RedisTools.list_remove("jianrScript_Model", task);
|
|
||||||
JSONObject json = new JSONObject();
|
|
||||||
json.put("code", 0);
|
|
||||||
json.put("msg", "任务删除成功");
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/jianr/task/get.do")
|
||||||
|
@ResponseBody
|
||||||
|
public JSONObject getTask(String task) {
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("code", 0);
|
||||||
|
json.put("data", RedisTools.getHashMap(JianRTaskManager.Redis_Script, task));
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/jianr/task/remove.do")
|
||||||
|
@ResponseBody
|
||||||
|
public JSONObject removeTask(String task) {
|
||||||
|
RedisTools.removeHashMap(JianRTaskManager.Redis_Script, task);
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("code", 0);
|
||||||
|
json.put("msg", "任务删除成功");
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/jianr/device/connect.do")
|
||||||
|
@ResponseBody
|
||||||
|
public JSONObject connectDevice(String device) {
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
JianRTaskManager.getInstance().connect(device);
|
||||||
|
json.put("code", 0);
|
||||||
|
json.put("msg", "成功");
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/jianr/device/add.do")
|
||||||
|
@ResponseBody
|
||||||
|
public JSONObject addDevice(String device) {
|
||||||
|
Map<String, String> hashMap = RedisTools.getHashMap(JianRTaskManager.Redis_Device);
|
||||||
|
JSONObject deviceJson = JSON.parseObject(device);
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("code", 0);
|
||||||
|
if (deviceJson == null) {
|
||||||
|
json.put("msg", "JSON格式错误");
|
||||||
|
} else {
|
||||||
|
if (hashMap.containsKey(device)) {
|
||||||
|
json.put("msg", "设备已存在");
|
||||||
|
} else {
|
||||||
|
json.put("msg", RedisTools.setHashMap(JianRTaskManager.Redis_Device,
|
||||||
|
deviceJson.getString("title"), device) ?
|
||||||
|
"设备添加成功" : "设备添加失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/jianr/device/edit.do")
|
||||||
|
@ResponseBody
|
||||||
|
public JSONObject editDevice(String device, String oldDevice) {
|
||||||
|
JSONObject deviceJson = JSON.parseObject(device);
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("code", 0);
|
||||||
|
if (deviceJson == null) {
|
||||||
|
json.put("msg", "JSON格式错误");
|
||||||
|
} else {
|
||||||
|
RedisTools.removeHashMap(JianRTaskManager.Redis_Device, oldDevice);
|
||||||
|
json.put("msg", RedisTools.setHashMap(JianRTaskManager.Redis_Device,
|
||||||
|
deviceJson.getString("title"), device) ?
|
||||||
|
"设备修改成功" : "设备修改失败");
|
||||||
|
}
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/jianr/device/del.do")
|
||||||
|
@ResponseBody
|
||||||
|
public JSONObject delDevice(String device) {
|
||||||
|
JSONObject deviceJson = JSON.parseObject(device);
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
json.put("code", 0);
|
||||||
|
if (deviceJson == null) {
|
||||||
|
json.put("msg", "JSON格式错误");
|
||||||
|
} else {
|
||||||
|
json.put("msg", RedisTools.removeHashMap(JianRTaskManager.Redis_Device) ?
|
||||||
|
"设备修改成功" : "设备修改失败");
|
||||||
|
}
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/jianr/device/list.do")
|
||||||
|
@ResponseBody
|
||||||
|
public JSONObject getDeviceList() {
|
||||||
|
Map<String, String> hashMap = RedisTools.getHashMap(JianRTaskManager.Redis_Device);
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
JSONArray array = new JSONArray();
|
||||||
|
json.put("code", 0);
|
||||||
|
hashMap.keySet().forEach(key -> {
|
||||||
|
JSONObject device = JSONObject.parseObject(hashMap.get(key));
|
||||||
|
JSONArray child = new JSONArray();
|
||||||
|
JSONObject item = new JSONObject();
|
||||||
|
JSONObject del = new JSONObject();
|
||||||
|
JSONObject edit = new JSONObject();
|
||||||
|
JSONObject select = new JSONObject();
|
||||||
|
JSONObject connect = new JSONObject();
|
||||||
|
item.put("title", key);
|
||||||
|
del.put("title", "删除");
|
||||||
|
del.put("data", "del");
|
||||||
|
del.put("device", device);
|
||||||
|
edit.put("title", "编辑");
|
||||||
|
edit.put("data", "edit");
|
||||||
|
edit.put("device", device);
|
||||||
|
select.put("title", "选择");
|
||||||
|
select.put("data", "select");
|
||||||
|
select.put("device", device);
|
||||||
|
connect.put("title", "连接设备");
|
||||||
|
connect.put("data", "connect");
|
||||||
|
connect.put("device", device);
|
||||||
|
child.add(connect);
|
||||||
|
child.add(select);
|
||||||
|
child.add(del);
|
||||||
|
child.add(edit);
|
||||||
|
item.put("child", child);
|
||||||
|
array.add(item);
|
||||||
|
});
|
||||||
|
json.put("data", array);
|
||||||
|
return json;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Map<String, String> hashMap = RedisTools.getHashMap(JianRTaskManager.Redis_Device);
|
||||||
|
JSONObject json = new JSONObject();
|
||||||
|
JSONArray array = new JSONArray();
|
||||||
|
json.put("code", 0);
|
||||||
|
hashMap.keySet().forEach(key -> {
|
||||||
|
JSONObject item = JSONObject.parseObject(hashMap.get(key));
|
||||||
|
array.add(item);
|
||||||
|
});
|
||||||
|
json.put("data", array);
|
||||||
|
System.out.println(json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
35
src/main/java/com/yutou/qqbot/data/jianr/AndroidDevice.java
Normal file
35
src/main/java/com/yutou/qqbot/data/jianr/AndroidDevice.java
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package com.yutou.qqbot.data.jianr;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class AndroidDevice {
|
||||||
|
String title;
|
||||||
|
String deviceId;
|
||||||
|
DeviceDisplay androidDevice;
|
||||||
|
List<GameDisplay> deviceDisplay;
|
||||||
|
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class DeviceDisplay {
|
||||||
|
int width, height;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class GameDisplay {
|
||||||
|
String title;
|
||||||
|
double width, height;
|
||||||
|
Vector2D start, end;
|
||||||
|
|
||||||
|
public double getWidth() {
|
||||||
|
return end.getX() - start.getX();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getHeight() {
|
||||||
|
return end.getY() - start.getY();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package com.yutou.qqbot.data;
|
package com.yutou.qqbot.data.jianr;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
package com.yutou.qqbot.data.jianr;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class JianRScriptV2Data {
|
||||||
|
private String title;
|
||||||
|
private List<Script> script;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class Script {
|
||||||
|
private String title;
|
||||||
|
private String activity;
|
||||||
|
private int nextWaitTime;
|
||||||
|
private int randomNextWaitTime;
|
||||||
|
}
|
||||||
|
public static class ScriptModel {
|
||||||
|
public static final String MAP = "map";
|
||||||
|
public static final String attack = "attack";
|
||||||
|
public static final String formationType = "formationType";
|
||||||
|
public static final String dialog_go = "dialog_go";
|
||||||
|
public static final String dialog_back = "dialog_back";
|
||||||
|
}
|
||||||
|
}
|
38
src/main/java/com/yutou/qqbot/data/jianr/Vector2D.java
Normal file
38
src/main/java/com/yutou/qqbot/data/jianr/Vector2D.java
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package com.yutou.qqbot.data.jianr;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Vector2D {
|
||||||
|
double x, y;
|
||||||
|
boolean enableRandomX, enableRandomY;
|
||||||
|
boolean absRandomX, absRandomY;
|
||||||
|
int randomNumX, randomNumY;
|
||||||
|
|
||||||
|
|
||||||
|
public double getX() {
|
||||||
|
if (isEnableRandomX()) {
|
||||||
|
double tmp = new Random().nextDouble(-randomNumX, randomNumX);
|
||||||
|
if (isAbsRandomX()) {
|
||||||
|
return Math.abs(tmp) + x;
|
||||||
|
} else {
|
||||||
|
return tmp + x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getY() {
|
||||||
|
if(isEnableRandomY()){
|
||||||
|
double tmp = new Random().nextDouble(-randomNumY, randomNumY);
|
||||||
|
if (isAbsRandomY()) {
|
||||||
|
return Math.abs(tmp) + y;
|
||||||
|
} else {
|
||||||
|
return tmp + y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
}
|
@ -1,15 +1,26 @@
|
|||||||
package com.yutou.qqbot.utlis;
|
package com.yutou.qqbot.utlis;
|
||||||
|
|
||||||
import com.yutou.qqbot.data.JianRScriptData;
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.yutou.qqbot.data.jianr.AndroidDevice;
|
||||||
|
import com.yutou.qqbot.data.jianr.JianRScriptData;
|
||||||
|
import com.yutou.qqbot.data.jianr.JianRScriptV2Data;
|
||||||
|
import com.yutou.qqbot.data.jianr.Vector2D;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class JianRTaskManager {
|
public class JianRTaskManager {
|
||||||
|
public static final String Redis_Script ="jianrScript_Script";
|
||||||
|
public static final String Redis_Device="jianrScript_Devices";
|
||||||
|
public static final String Redis_RunIndex="jianrScript_RunIndex";
|
||||||
private static JianRTaskManager instance;
|
private static JianRTaskManager instance;
|
||||||
private JianRScriptData task;
|
private JianRScriptV2Data task;
|
||||||
|
private AndroidDevice device;
|
||||||
private boolean running = false;
|
private boolean running = false;
|
||||||
private int runIndex = 0;
|
private int runIndex = 0;
|
||||||
private String log;
|
private String log;
|
||||||
|
private int modelId;
|
||||||
|
|
||||||
public static JianRTaskManager getInstance() {
|
public static JianRTaskManager getInstance() {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
@ -22,17 +33,22 @@ public class JianRTaskManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTask(JianRScriptData data) {
|
public void setModelId(int modelId) {
|
||||||
|
this.modelId = modelId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTask(JianRScriptV2Data data, AndroidDevice device) {
|
||||||
task = data;
|
task = data;
|
||||||
runIndex=0;
|
this.device = device;
|
||||||
String s = RedisTools.get("jianrScript_RunIndex_" + data.getName());
|
runIndex = 0;
|
||||||
|
String s = RedisTools.getHashMap(Redis_RunIndex,data.getTitle());
|
||||||
if (s != null) {
|
if (s != null) {
|
||||||
runIndex = Integer.parseInt(s);
|
runIndex = Integer.parseInt(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
if(running){
|
if (running) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
running = true;
|
running = true;
|
||||||
@ -43,19 +59,21 @@ public class JianRTaskManager {
|
|||||||
while (running) {
|
while (running) {
|
||||||
try {
|
try {
|
||||||
log("已运行: " + runIndex + " 次");
|
log("已运行: " + runIndex + " 次");
|
||||||
for (JianRScriptData.Script script : task.getRun()) {
|
for (JianRScriptV2Data.Script script : task.getScript()) {
|
||||||
log(script.getName());
|
if(!isRunning()){
|
||||||
if (script.getModel().equals(JianRScriptData.Script.ScriptModel.CLICK)) {
|
log("任务已停止");
|
||||||
adbTap(task.getDevice(), script);
|
break;
|
||||||
}
|
}
|
||||||
|
log(script.getTitle());
|
||||||
|
JianRTaskManager.this.run(device, modelId, script);
|
||||||
try {
|
try {
|
||||||
Thread.sleep((long) getRandom(0, script.getRandomNextWaitTime(), script.getNextWaitTime()));
|
Thread.sleep((long) getRandom(0, script.getRandomNextWaitTime()*1000, script.getNextWaitTime()*1000));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
runIndex++;
|
runIndex++;
|
||||||
RedisTools.set("jianrScript_RunIndex_" + task.getName(), runIndex + "");
|
RedisTools.setHashMap(Redis_RunIndex,task.getTitle(),runIndex+"");
|
||||||
log("循环一次任务");
|
log("循环一次任务");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
running = false;
|
running = false;
|
||||||
@ -67,6 +85,32 @@ public class JianRTaskManager {
|
|||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void run(AndroidDevice device, int modelId, JianRScriptV2Data.Script script) {
|
||||||
|
AndroidDevice.GameDisplay gameDisplay = device.getDeviceDisplay().get(modelId);
|
||||||
|
Vector2D vector2D = null;
|
||||||
|
switch (script.getActivity()) {
|
||||||
|
case JianRScriptV2Data.ScriptModel.MAP:
|
||||||
|
vector2D = getMapCoords(device, gameDisplay);
|
||||||
|
break;
|
||||||
|
case JianRScriptV2Data.ScriptModel.attack:
|
||||||
|
vector2D = getAttackCoords(device, gameDisplay);
|
||||||
|
break;
|
||||||
|
case JianRScriptV2Data.ScriptModel.dialog_go:
|
||||||
|
vector2D = getDialogCoords(device, gameDisplay, false);
|
||||||
|
break;
|
||||||
|
case JianRScriptV2Data.ScriptModel.dialog_back:
|
||||||
|
vector2D = getDialogCoords(device, gameDisplay, true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (script.getActivity().startsWith(JianRScriptV2Data.ScriptModel.formationType)) {
|
||||||
|
vector2D = getNextFormationCoords(device, gameDisplay, Integer.parseInt(script.getActivity().split("#")[1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (vector2D != null) {
|
||||||
|
adb(device, vector2D);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
task = null;
|
task = null;
|
||||||
running = false;
|
running = false;
|
||||||
@ -80,6 +124,10 @@ public class JianRTaskManager {
|
|||||||
return running;
|
return running;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 老版本脚本执行命令
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
private void adbTap(String deviceId, JianRScriptData.Script script) {
|
private void adbTap(String deviceId, JianRScriptData.Script script) {
|
||||||
String exec = String.format("adb -s %s shell input tap %f %f",
|
String exec = String.format("adb -s %s shell input tap %f %f",
|
||||||
deviceId,
|
deviceId,
|
||||||
@ -93,6 +141,7 @@ public class JianRTaskManager {
|
|||||||
this.log = String.format("[%s]%s",
|
this.log = String.format("[%s]%s",
|
||||||
AppTools.getToDayNowTimeToString(),
|
AppTools.getToDayNowTimeToString(),
|
||||||
log);
|
log);
|
||||||
|
System.out.println(this.log);
|
||||||
}
|
}
|
||||||
|
|
||||||
private float getRandom(int origin, int randomNum, int x) {
|
private float getRandom(int origin, int randomNum, int x) {
|
||||||
@ -106,7 +155,7 @@ public class JianRTaskManager {
|
|||||||
|
|
||||||
public String getTaskName() {
|
public String getTaskName() {
|
||||||
if (task != null) {
|
if (task != null) {
|
||||||
return task.getName();
|
return task.getTitle();
|
||||||
}
|
}
|
||||||
return "没有任务在运行";
|
return "没有任务在运行";
|
||||||
}
|
}
|
||||||
@ -114,4 +163,121 @@ public class JianRTaskManager {
|
|||||||
public String getLog() {
|
public String getLog() {
|
||||||
return log;
|
return log;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void connect(String deviceId) {
|
||||||
|
String exec = String.format("adb connect %s",
|
||||||
|
deviceId);
|
||||||
|
System.out.println(exec);
|
||||||
|
AppTools.exec(exec
|
||||||
|
, null, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取出击坐标
|
||||||
|
*
|
||||||
|
* @param device 设备信息
|
||||||
|
* @return 坐标
|
||||||
|
*/
|
||||||
|
private Vector2D getAttackCoords(AndroidDevice device, AndroidDevice.GameDisplay gameDisplay) {
|
||||||
|
Vector2D v2d = new Vector2D();
|
||||||
|
v2d.setX(gameDisplay.getWidth() * 0.8725 + gameDisplay.getStart().getX());
|
||||||
|
v2d.setY(gameDisplay.getHeight() * 0.9161 + gameDisplay.getStart().getY());
|
||||||
|
return v2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取地图点击坐标
|
||||||
|
*
|
||||||
|
* @param device 设备信息
|
||||||
|
* @return 坐标
|
||||||
|
*/
|
||||||
|
private Vector2D getMapCoords(AndroidDevice device, AndroidDevice.GameDisplay gameDisplay) {
|
||||||
|
Vector2D v2d = new Vector2D();
|
||||||
|
v2d.setX(gameDisplay.getWidth() * 0.5 + gameDisplay.getStart().getX());
|
||||||
|
v2d.setY(gameDisplay.getHeight() * 0.5 + gameDisplay.getStart().getY());
|
||||||
|
return v2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取阵型点击坐标
|
||||||
|
*
|
||||||
|
* @param device 设备信息
|
||||||
|
* @param type 阵型。0~4
|
||||||
|
* @return 坐标
|
||||||
|
*/
|
||||||
|
private Vector2D getNextFormationCoords(AndroidDevice device, AndroidDevice.GameDisplay gameDisplay, int type) {
|
||||||
|
Vector2D v2d = new Vector2D();
|
||||||
|
v2d.setX(gameDisplay.getWidth() * 0.75 + gameDisplay.getStart().getX());
|
||||||
|
v2d.setY(gameDisplay.getHeight() * 0.24835 + gameDisplay.getStart().getY());
|
||||||
|
|
||||||
|
for (int i = 0; i < type; i++) {
|
||||||
|
v2d.setY(v2d.getY() + (gameDisplay.getHeight() * 0.1461));
|
||||||
|
}
|
||||||
|
return v2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取出击坐标
|
||||||
|
*
|
||||||
|
* @param device 设备信息
|
||||||
|
* @return 坐标
|
||||||
|
*/
|
||||||
|
private Vector2D getDialogCoords(AndroidDevice device, AndroidDevice.GameDisplay gameDisplay, boolean isBack) {
|
||||||
|
Vector2D v2d = new Vector2D();
|
||||||
|
v2d.setY(gameDisplay.getHeight() * 0.61722 + gameDisplay.getStart().getY());
|
||||||
|
if (isBack) {
|
||||||
|
v2d.setX(gameDisplay.getWidth() * 0.6575 + gameDisplay.getStart().getX());
|
||||||
|
} else {
|
||||||
|
v2d.setX(gameDisplay.getWidth() * 0.344642857143 + gameDisplay.getStart().getX());
|
||||||
|
}
|
||||||
|
return v2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
AndroidDevice device = new AndroidDevice();
|
||||||
|
AndroidDevice.DeviceDisplay deviceDisplay = new AndroidDevice.DeviceDisplay();
|
||||||
|
AndroidDevice.GameDisplay gameDisplay = new AndroidDevice.GameDisplay();
|
||||||
|
deviceDisplay.setHeight(1800);
|
||||||
|
deviceDisplay.setWidth(2800);
|
||||||
|
Vector2D start = new Vector2D();
|
||||||
|
Vector2D end = new Vector2D();
|
||||||
|
start.setX(2000);
|
||||||
|
start.setY(57);
|
||||||
|
end.setX(2800);
|
||||||
|
end.setY(581);
|
||||||
|
gameDisplay.setStart(start);
|
||||||
|
gameDisplay.setEnd(end);
|
||||||
|
List<AndroidDevice.GameDisplay> displays = new ArrayList<>();
|
||||||
|
displays.add(gameDisplay);
|
||||||
|
device.setDeviceDisplay(displays);
|
||||||
|
device.setAndroidDevice(deviceDisplay);
|
||||||
|
device.setDeviceId("192.168.31.142:6666");
|
||||||
|
device.setTitle("SAMSUNG-TAB-S7+");
|
||||||
|
|
||||||
|
JianRTaskManager manager = new JianRTaskManager();
|
||||||
|
Vector2D mapCoords;
|
||||||
|
// mapCoords = manager.getMapCoords(device,device.getGameDisplay().get(0));
|
||||||
|
// mapCoords = manager.getAttackCoords(device,device.getGameDisplay().get(0));
|
||||||
|
// mapCoords = manager.getNextFormationCoords(device,device.getGameDisplay().get(0), 0);
|
||||||
|
mapCoords = manager.getDialogCoords(device, device.getDeviceDisplay().get(0), true);
|
||||||
|
// adb(device, mapCoords);
|
||||||
|
System.out.println("device = " + device);
|
||||||
|
String jsonString = "{\"name\":\"1-1Test\",\"script\":[{\"name\":\"点击地图\",\"activity\":\"map\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"出击\",\"activity\":\"attack\",\"nextWaitTime\":12,\"randomNextWaitTime\":2},{\"name\":\"战斗\",\"activity\":\"attack\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"选择单纵\",\"activity\":\"formationType#0\",\"nextWaitTime\":20,\"randomNextWaitTime\":5},{\"name\":\"结算1\",\"activity\":\"map\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"结算2\",\"activity\":\"map\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"获取舰娘\",\"activity\":\"map\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"前进\",\"activity\":\"dialog_go\",\"nextWaitTime\":12,\"randomNextWaitTime\":3},{\"name\":\"战斗\",\"activity\":\"attack\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"选择梯形\",\"activity\":\"formationType#3\",\"nextWaitTime\":20,\"randomNextWaitTime\":5},{\"name\":\"结算1\",\"activity\":\"map\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"结算2\",\"activity\":\"map\",\"nextWaitTime\":2,\"randomNextWaitTime\":3},{\"name\":\"获取舰娘\",\"activity\":\"map\",\"nextWaitTime\":2,\"randomNextWaitTime\":3}]}";
|
||||||
|
JianRScriptV2Data script = JSON.parseObject(jsonString, JianRScriptV2Data.class);
|
||||||
|
manager.setTask(script,device);
|
||||||
|
manager.setModelId(0);
|
||||||
|
manager.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void adb(AndroidDevice device, Vector2D v2d) {
|
||||||
|
String exec = String.format("adb -s %s shell input tap %f %f",
|
||||||
|
device.getDeviceId(),
|
||||||
|
v2d.getX(),
|
||||||
|
v2d.getY());
|
||||||
|
System.out.println(exec);
|
||||||
|
AppTools.exec(exec
|
||||||
|
, null, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,12 @@
|
|||||||
<blockquote class="layui-elem-quote">舰R脚本管理器:<span id="taskStatus"></span><br/><br/><span id="taskName">当前无任务</span><br/><br/><span id="runIndex"></span><br/><br/><span id="log"></span>
|
<blockquote class="layui-elem-quote">舰R脚本管理器:<span id="taskStatus"></span><br/><br/><span id="taskName">当前无任务</span><br/><br/><span id="runIndex"></span><br/><br/><span id="log"></span>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<button class="layui-btn layui-btn-lg layui-btn-normal" onclick="createTask()">创建任务</button>
|
<button class="layui-btn layui-btn-lg layui-btn-normal" onclick="createTask()">创建任务</button>
|
||||||
|
<button class="layui-btn layui-btn-lg layui-btn-normal" id="createDevice">选择设备
|
||||||
|
<i class="layui-icon layui-icon-down layui-font-12"></i>
|
||||||
|
</button>
|
||||||
|
<blockquote class="layui-elem-quote">
|
||||||
|
调用设备:<span id="deviceName"></span><br>
|
||||||
|
</blockquote>
|
||||||
<br/><br/><br/>
|
<br/><br/><br/>
|
||||||
|
|
||||||
<div class="layui-bg-gray layui-row layui-col-space15" id="card" style="padding: 30px;">
|
<div class="layui-bg-gray layui-row layui-col-space15" id="card" style="padding: 30px;">
|
||||||
@ -26,27 +32,25 @@
|
|||||||
<script src="layui/layui.js"></script>
|
<script src="layui/layui.js"></script>
|
||||||
<script src="layui/jquery-3.2.1.js"></script>
|
<script src="layui/jquery-3.2.1.js"></script>
|
||||||
<script>
|
<script>
|
||||||
function createCard(name) {
|
let homeUrl="http://127.0.0.1:8002";
|
||||||
let html = '<div class="layui-card layui-col-md3 layui-col-lg-offset1"><div class="layui-card-header">' + name + '</div><div class="layui-card-body"><button class="layui-btn layui-btn-radius layui-btn-normal" onclick="runTask(\'' + name + '\')"><i class="layui-icon"></i>运行</button><br/><br/><button class="layui-btn layui-btn-radius layui-btn-warm" onclick="stopTask()"><i class="layui-icon"></i>停止</button><br/><br/><button class="layui-btn layui-btn-radius layui-btn-danger" onclick="removeTask(\'' + name + '\')"><i class="layui-icon"></i>删除</button></div></div>';
|
let device;
|
||||||
$('#card').append(html)
|
let deviceModel=[];
|
||||||
}
|
|
||||||
|
|
||||||
function createTask() {
|
function createTask() {
|
||||||
|
if(device===undefined){
|
||||||
|
layer.msg('请选择设备')
|
||||||
|
return
|
||||||
|
}
|
||||||
layer.prompt({
|
layer.prompt({
|
||||||
formType: 2,
|
formType: 2,
|
||||||
value: '{\n' +
|
value: '{\n' +
|
||||||
' "name": "",\n' +
|
' "title":"",\n' +
|
||||||
' "device": "192.168.31.46:6666",\n' +
|
' "script":[\n' +
|
||||||
' "run": [\n' +
|
|
||||||
' {\n' +
|
' {\n' +
|
||||||
' "name": "",\n' +
|
' "title":"",\n' +
|
||||||
|
' "activity":"map|attack|formationType#{0-4}|dialog_go|dialog_back",\n' +
|
||||||
' "nextWaitTime": 0,\n' +
|
' "nextWaitTime": 0,\n' +
|
||||||
' "randomNextWaitTime": 0,\n' +
|
' "randomNextWaitTime": 0\n' +
|
||||||
' "model": "click",\n' +
|
|
||||||
' "x": 0,\n' +
|
|
||||||
' "y": 0,\n' +
|
|
||||||
' "rx": 0,\n' +
|
|
||||||
' "ry": 0\n' +
|
|
||||||
' }\n' +
|
' }\n' +
|
||||||
' ]\n' +
|
' ]\n' +
|
||||||
'}',
|
'}',
|
||||||
@ -54,32 +58,61 @@
|
|||||||
maxlength: 99999,
|
maxlength: 99999,
|
||||||
area: ['800px', '350px'] //自定义文本域宽高
|
area: ['800px', '350px'] //自定义文本域宽高
|
||||||
}, function (value, index, elem) {
|
}, function (value, index, elem) {
|
||||||
$.post("/jianr/task/add.do", {task: value}, function (json) {
|
$.post(homeUrl+"/jianr/task/add.do", {task: value}, function (json) {
|
||||||
layer.msg(json.msg)
|
layer.msg(json.msg)
|
||||||
})
|
})
|
||||||
layer.close(index);
|
layer.close(index);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function runTask(name) {
|
function runTask(name,title) {
|
||||||
$.post("/jianr/run.do", {task: name}, function (json) {
|
if(device===undefined){
|
||||||
|
layer.msg('请选择设备')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
$.post(homeUrl+"/jianr/run.do", {task: name,device:device.title,modelName:title}, function (json) {
|
||||||
layer.msg(json.msg)
|
layer.msg(json.msg)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function stopTask() {
|
function stopTask() {
|
||||||
$.post("/jianr/stop.do", function (json) {
|
$.post(homeUrl+"/jianr/stop.do", function (json) {
|
||||||
layer.msg(json.msg)
|
layer.msg(json.msg)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeTask(name) {
|
function removeTask(name) {
|
||||||
$.post("/jianr/task/remove.do", {task: name}, function (json) {
|
$.post(homeUrl+"/jianr/task/remove.do", {task: name}, function (json) {
|
||||||
layer.msg(json.msg)
|
layer.msg(json.msg)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
function showDevice() {
|
||||||
|
if(isSelectDevice()){
|
||||||
|
layer.msg("当前未选择设备")
|
||||||
|
}else{
|
||||||
|
layer.prompt({
|
||||||
|
formType: 2,
|
||||||
|
value: JSON.stringify(device),
|
||||||
|
title: '查看设备',
|
||||||
|
maxlength: 99999,
|
||||||
|
area: ['800px', '350px'] //自定义文本域宽高
|
||||||
|
}, function (value, index, elem) {
|
||||||
|
$.post(homeUrl+"/jianr/device/edit.do", {device: value,oldDevice:device.title}, function (json) {
|
||||||
|
layer.msg(json.msg)
|
||||||
|
})
|
||||||
|
layer.close(index);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function delDevice() {
|
||||||
|
|
||||||
|
}
|
||||||
|
function isSelectDevice() {
|
||||||
|
return device===undefined;
|
||||||
|
}
|
||||||
function getStatus() {
|
function getStatus() {
|
||||||
$.post("/jianr/status.do", function (json) {
|
$.post(homeUrl+"/jianr/status.do", function (json) {
|
||||||
if(json.data.status){
|
if(json.data.status){
|
||||||
$('#taskStatus')[0].innerHTML="运行"
|
$('#taskStatus')[0].innerHTML="运行"
|
||||||
$('#taskStatus').css('color','#5C962C')
|
$('#taskStatus').css('color','#5C962C')
|
||||||
@ -90,17 +123,128 @@
|
|||||||
$('#taskStatus')[0].innerHTML="停止"
|
$('#taskStatus')[0].innerHTML="停止"
|
||||||
$('#taskStatus').css('color','#FF5722')
|
$('#taskStatus').css('color','#FF5722')
|
||||||
}
|
}
|
||||||
getStatus()
|
setTimeout(function () {
|
||||||
|
getStatus()
|
||||||
|
},1000)
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
window.onload = function init() {
|
layui.use('dropdown', function(){
|
||||||
$.get("/jianr/task/list.do", function (json) {
|
let dropdown = layui.dropdown
|
||||||
|
|
||||||
|
function createCard(name) {
|
||||||
|
let html = '<div class="layui-card layui-col-md3 layui-col-lg-offset1"><div class="layui-card-header">' + name
|
||||||
|
+ '</div><div class="layui-card-body">' +
|
||||||
|
'<button class="layui-btn layui-btn-radius layui-btn-normal" id="runTask_'+name+'" ><i class="layui-icon"></i>运行 <i class="layui-icon layui-icon-down layui-font-12"></i></button><br/><br/><button class="layui-btn layui-btn-radius layui-btn-warm" onclick="stopTask()"><i class="layui-icon"></i>停止</button><br/><br/><button class="layui-btn layui-btn-radius layui-btn-danger" onclick="removeTask(\'' + name + '\')"><i class="layui-icon"></i>删除</button></div></div>';
|
||||||
|
$('#card').append(html)
|
||||||
|
dropdown.render({
|
||||||
|
elem: '#runTask_'+name //可绑定在任意元素中,此处以上述按钮为例
|
||||||
|
,data: deviceModel
|
||||||
|
,id: 'runTask_'+name
|
||||||
|
//菜单被点击的事件
|
||||||
|
,click: function(obj){
|
||||||
|
console.log(obj);
|
||||||
|
runTask(name,obj.title)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$.get(homeUrl+"/jianr/task/list.do", function (json) {
|
||||||
|
|
||||||
json.data.forEach(function (item) {
|
json.data.forEach(function (item) {
|
||||||
createCard(item)
|
createCard(item)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
$.get(homeUrl+"/jianr/device/list.do",function (json) {
|
||||||
|
let devices=json.data;
|
||||||
|
devices.push({type:'-'})
|
||||||
|
devices.push({
|
||||||
|
title: '添加设备',
|
||||||
|
name:"addDevice"
|
||||||
|
,href: '#'
|
||||||
|
})
|
||||||
|
|
||||||
|
dropdown.render({
|
||||||
|
elem: '#createDevice' //可绑定在任意元素中,此处以上述按钮为例
|
||||||
|
,data: devices
|
||||||
|
,id: 'createDevice'
|
||||||
|
//菜单被点击的事件
|
||||||
|
,click: function(obj){
|
||||||
|
if(obj.name==='addDevice'){
|
||||||
|
layer.prompt({
|
||||||
|
formType: 2,
|
||||||
|
value: '{\n' +
|
||||||
|
' "deviceId":"",\n' +
|
||||||
|
' "title":"",\n' +
|
||||||
|
' "androidDevice":{\n' +
|
||||||
|
' "height":0,\n' +
|
||||||
|
' "width":0\n' +
|
||||||
|
' },\n' +
|
||||||
|
' "deviceDisplay":[\n' +
|
||||||
|
' {\n' +
|
||||||
|
' "title":"",\n' +
|
||||||
|
' "start":{\n' +
|
||||||
|
' "x":0,\n' +
|
||||||
|
' "y":0,\n' +
|
||||||
|
' "enableRandomX":false,\n' +
|
||||||
|
' "enableRandomY":false,\n' +
|
||||||
|
' "absRandomX":false,\n' +
|
||||||
|
' "absRandomY":false,\n' +
|
||||||
|
' "randomNumX":0,\n' +
|
||||||
|
' "randomNumY":0\n' +
|
||||||
|
' },\n' +
|
||||||
|
' "end":{\n' +
|
||||||
|
' "x": 0,\n' +
|
||||||
|
' "y": 0,\n' +
|
||||||
|
' "enableRandomX": false,\n' +
|
||||||
|
' "enableRandomY": false,\n' +
|
||||||
|
' "absRandomX": false,\n' +
|
||||||
|
' "absRandomY": false,\n' +
|
||||||
|
' "randomNumX": 0,\n' +
|
||||||
|
' "randomNumY": 0\n' +
|
||||||
|
' }\n' +
|
||||||
|
' }\n' +
|
||||||
|
' ]\n' +
|
||||||
|
'}',
|
||||||
|
title: '添加设备',
|
||||||
|
maxlength: 99999,
|
||||||
|
area: ['800px', '350px'] //自定义文本域宽高
|
||||||
|
}, function (value, index, elem) {
|
||||||
|
$.post(homeUrl+"/jianr/device/add.do", {device: value}, function (json) {
|
||||||
|
layer.msg(json.msg)
|
||||||
|
})
|
||||||
|
layer.close(index);
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
console.log(obj)
|
||||||
|
if(obj.data==='select'){
|
||||||
|
device=obj.device;
|
||||||
|
device.deviceDisplay.forEach(function (item){
|
||||||
|
deviceModel.push({
|
||||||
|
title:item.title
|
||||||
|
})
|
||||||
|
})
|
||||||
|
$('#deviceName')[0].innerHTML=obj.device.title;
|
||||||
|
}else if (obj.data==='edit'){
|
||||||
|
showDevice()
|
||||||
|
}else if (obj.data==='del'){
|
||||||
|
delDevice()
|
||||||
|
}else if (obj.data==='connect'){
|
||||||
|
$.post(homeUrl+"/jianr/device/connect.do",{device:obj.device.deviceId},function (json) {
|
||||||
|
layer.msg(json.msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
window.onload = function init() {
|
||||||
|
|
||||||
getStatus()
|
getStatus()
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
Loading…
Reference in New Issue
Block a user