Skip to content

Instantly share code, notes, and snippets.

@Nishisonic
Last active April 13, 2020 11:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nishisonic/53fe00afcb21fe313ee0a5bec6d64424 to your computer and use it in GitHub Desktop.
Save Nishisonic/53fe00afcb21fe313ee0a5bec6d64424 to your computer and use it in GitHub Desktop.
【拡張版script】TsunDB Client
load("script/ScriptData.js");
data_prefix = "TsunDB";
BufferedReader = Java.type("java.io.BufferedReader");
InputStreamReader = Java.type("java.io.InputStreamReader");
OutputStreamWriter = Java.type("java.io.OutputStreamWriter");
URL = Java.type("java.net.URL");
Collectors = Java.type("java.util.stream.Collectors");
GlobalContext = Java.type("logbook.data.context.GlobalContext");
DataType = Java.type("logbook.data.DataType");
BattlePhaseKind = Java.type("logbook.dto.BattlePhaseKind");
ApplicationMain = Java.type("logbook.gui.ApplicationMain");
var VERSION = "1.0.3";
function update(type, data) {
switch (type) {
case DataType.MAPINFO: // 海域情報
var mapInfo = JSON.parse(data.jsonObject.api_data.api_map_info);
var result = mapInfo
.map(function (map) {
var cleared = map.api_cleared.intValue() === 1;
var eventMap = map.api_eventmap;
var gaugeNum = map.api_gauge_num ? map.api_gauge_num.intValue() : 0;
if (eventMap && eventMap.api_selected_rank) {
return {
id: map.api_id,
gaugeNum: gaugeNum,
currentHP: eventMap.api_now_maphp
? eventMap.api_now_maphp.intValue()
: 0,
maxHP: eventMap.api_max_maphp
? eventMap.api_max_maphp.intValue()
: 0,
difficulty: eventMap.api_selected_rank.intValue(),
cleared: cleared,
};
} else {
return {
id: map.api_id,
gaugeNum: gaugeNum,
currentHP: 0,
maxHP: 0,
difficulty: 0,
cleared: cleared,
};
}
})
.reduce(function (previous, current) {
previous[current.id] = {
difficulty: current.difficulty,
gaugeNum: current.gaugeNum,
currentHP: current.currentHP,
maxHP: current.maxHP,
cleared: current.cleared,
};
return previous;
}, {});
setTmpData("mapInfo", result);
break;
case DataType.BATTLE_RESULT: // 通常戦闘結果
case DataType.COMBINED_BATTLE_RESULT: // 連合戦闘結果
var shipCount = GlobalContext.shipMap.size();
var itemCount = GlobalContext.itemMap.size();
if (
GlobalContext.maxChara() > shipCount &&
GlobalContext.maxSlotitem() > itemCount
) {
sendShipDropData(data);
}
break;
case DataType.CREATE_ITEM: // 開発
sendDevelopmentData(data);
break;
default:
break;
}
}
function sendShipDropData(data) {
var lastBattleDto = GlobalContext.lastBattleDto;
var json = data.jsonObject.api_data;
var mapCellDto = lastBattleDto.mapCellDto;
var mapInfo = getData("mapInfo");
if (!(lastBattleDto && mapCellDto && mapInfo)) return;
var maps = mapCellDto.map;
var mapId = maps[0] * 10 + maps[1];
var map = maps[0] + "-" + maps[1];
if (mapInfo[mapId] === undefined) return;
var node = maps[2];
var rank = lastBattleDto.rank.rank();
var cleared = mapInfo[mapId].cleared;
var apiData = lastBattleDto.phase1.json;
var enemyComp = {
ship: JSON.parse(apiData.api_ship_ke),
lvl: JSON.parse(apiData.api_ship_lv),
hp: JSON.parse(apiData.api_e_maxhps),
stats: apiData.api_eParam ? JSON.parse(apiData.api_eParam) : [],
equip: JSON.parse(apiData.api_eSlot),
formation: Number(apiData.api_formation[1]),
mapName: lastBattleDto.questName,
compName: lastBattleDto.enemyName,
baseExp: Number(json.api_get_base_exp),
};
if (maps[0] > 10) {
enemyComp.mapStats = {
gaugeNum: mapInfo[mapId].gaugeNum,
currentHP: mapInfo[mapId].currentHP,
maxHP: mapInfo[mapId].maxHP,
};
}
if (apiData.api_ship_ke_combined) {
enemyComp.shipEscort = JSON.parse(apiData.api_ship_ke_combined);
enemyComp.lvlEscort = JSON.parse(apiData.api_ship_lv_combined);
enemyComp.hpEscort = JSON.parse(apiData.api_e_maxhps_combined);
enemyComp.statsEscort = JSON.parse(apiData.api_eParam_combined);
enemyComp.equipEscort = JSON.parse(apiData.api_eSlot_combined);
}
if (
[BattlePhaseKind.LD_AIRBATTLE, BattlePhaseKind.COMBINED_LD_AIR].indexOf(
lastBattleDto.phase1.kind
) >= 0
) {
enemyComp.isAirRaid = true;
}
var hqLvl = lastBattleDto.hqLv;
var difficulty = mapInfo[mapId].difficulty;
var ship = lastBattleDto.isDropShip() ? lastBattleDto.dropShipId : -1;
var counts = Java.from(GlobalContext.shipMap.values().toArray())
.filter(function (_, index, array) {
return ship === -1 || index < array.length - 1;
})
.map(function (ship) {
return ship.charId;
})
.reduce(function (previous, charId) {
previous[charId] = (previous[charId] | 0) + 1;
return previous;
}, {});
var result = {
map: map,
node: node,
rank: rank,
cleared: cleared,
enemyComp: enemyComp,
hqLvl: hqLvl,
difficulty: difficulty,
ship: ship,
counts: counts,
};
send("drops", result);
}
function sendDevelopmentData(data) {
var json = data.jsonObject.api_data;
var hqLvl = GlobalContext.hqLevel();
var secretary = GlobalContext.secretary;
if (!(hqLvl > 0 && secretary)) return;
json.api_get_items.forEach(function (e) {
send("development", {
hqLvl: hqLvl,
flagship: {
id: secretary.shipId,
type: secretary.stype,
lvl: secretary.lv,
},
resources: {
fuel: Number(data.getField("api_item1")),
ammo: Number(data.getField("api_item2")),
steel: Number(data.getField("api_item3")),
bauxite: Number(data.getField("api_item4")),
},
result: Number(e.api_slotitem_id),
success: e.api_slotitem_id.intValue() !== -1 ? 1 : 0,
});
});
}
function send(target, json) {
var result = push(
"https://tsundb.kc3.moe/api/" + target,
JSON.stringify(json)
);
ApplicationMain.main.printMessage(
"TsunDBへ送信(code:" + result.statusCode + ")"
);
}
function push(urlString, data) {
var url = new URL(urlString);
var con = null;
var response = null;
try {
con = url.openConnection();
con.setRequestMethod("PUT");
con.setDoOutput(true);
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("tsun-ver", "Kasumi Kai");
con.setRequestProperty("dataorigin", "LogbookEx");
con.setRequestProperty("version", VERSION);
var out = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
out.write(data);
out.close();
con.connect();
var reader = new BufferedReader(
new InputStreamReader(con.getInputStream(), "UTF-8")
);
response = reader.lines().collect(Collectors.joining());
} finally {
if (con) {
con.disconnect();
return { statusCode: con.responseCode, data: response };
}
return { statusCode: -1, data: response };
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment