Skip to content

Instantly share code, notes, and snippets.

@EVEKatsu
Last active September 14, 2018 08:36
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 EVEKatsu/9242e577e17a2eac6a7a0f29557887ae to your computer and use it in GitHub Desktop.
Save EVEKatsu/9242e577e17a2eac6a7a0f29557887ae to your computer and use it in GitHub Desktop.
Google Apps Script(GAS) to find affiliations from Eve Who.
function onOpen() {
SpreadsheetApp.getActiveSpreadsheet().addMenu(
"Eve Who",
[
{
name: "Ticker on",
functionName: "tickerOn"
},
{
name: "Ticker off",
functionName: "tickerOff"
}
]
);
}
var API_URL = "https://evewho.com/api.php";
var CHARACTERS_SHEET = 0;
var CORPORATIONS_SHEET = 1;
var ALLIANCES_SHEET = 2;
var PROPERTIES_SHEET = 3;
var SHEETS = [
{
"name": "Characters",
"sheet": undefined,
"dict": {},
"idName": "character_id",
"query": "?type=character&",
"columns": [
"character_id",
"name",
"corporation_id",
"alliance_id"
]
},
{
"name": "Corporations",
"sheet": undefined,
"dict": {},
"idName": "corporation_id",
"query": "?type=corporation&",
"columns": [
"corporation_id",
"name",
"ticker",
"alliance_id"
]
},
{
"name": "Alliances",
"sheet": undefined,
"dict": {},
"idName": "alliance_id",
"query": "?type=alliance&",
"columns": [
"alliance_id",
"name",
"ticker"
]
},
{
"name": "Properties",
"sheet": undefined,
"properties": {}
}
];
var spreadsheet = undefined;
function tickerOn() {
eveWho(true);
}
function tickerOff() {
eveWho(false);
}
function eveWho(ticker) {
deleteTriggers();
spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var activeSheet = spreadsheet.getActiveSheet();
for (var i = 0; i < SHEETS.length; i++) {
deleteSheet(SHEETS[i]);
updateSheet(SHEETS[i]);
}
setProperty("activeSheet", activeSheet.getName());
setProperty("ticker", ticker);
setProperty("startRow", 1);
activeSheet.activate();
ScriptApp.newTrigger("run").timeBased().everyMinutes(1).create();
}
function run() {
var lock = LockService.getDocumentLock();
if (!lock.tryLock(100)) {
Browser.msgBox("The script is already running.");
return;
}
deleteTriggers();
spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
for (var i = 0; i < SHEETS.length; i++) {
updateSheet(SHEETS[i]);
updateDict(SHEETS[i]);
}
var activeSheet = spreadsheet.getActiveSheet();
var sheets = spreadsheet.getSheets();
for (var i in sheets) {
if (sheets[i].getName() == getProperty("activeSheet")) {
activeSheet = sheets[i];
activeSheet.activate();
break;
}
}
var startTime = new Date();
for (var row = parseInt(getProperty("startRow")); row <= activeSheet.getLastRow(); row++) {
var character = getPlayer(
activeSheet.getRange(row, 1).getValue().replace(" ", "+"),
SHEETS[CHARACTERS_SHEET]
);
var column = 2;
[CORPORATIONS_SHEET, ALLIANCES_SHEET].forEach(function(i) {
var playerId = character[SHEETS[i]["idName"]];
var value = "";
if (parseInt(playerId) != 0) {
var player = getPlayer(playerId, SHEETS[i]);
var value = player["name"];
if (getProperty("ticker")) {
var ticker = player["ticker"];
if (i == CORPORATIONS_SHEET) {
ticker = "[" + ticker + "]";
} else {
ticker = "<" + ticker + ">";
}
value = ticker + " " + value;
}
}
activeSheet.getRange(row, column).setValue(value);
column++;
});
setProperty("startRow", row + 1);
var diff = parseInt((new Date() - startTime) / (1000 * 60));
if (diff >= 5) {
ScriptApp.newTrigger("run").timeBased().everyMinutes(1).create();
lock.releaseLock();
return;
}
}
lock.releaseLock();
deleteTriggers();
deleteSheet(SHEETS[PROPERTIES_SHEET]);
}
function parseJson(url) {
var response = UrlFetchApp.fetch(url);
return JSON.parse(response.getContentText());
}
function deleteTriggers() {
var triggerKeys = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggerKeys.length; i++) {
ScriptApp.deleteTrigger(triggerKeys[i]);
}
}
function updateSheet(sheet) {
var sheets = spreadsheet.getSheets();
for (var i in sheets) {
if (sheets[i].getName() == sheet["name"]) {
sheet["sheet"] = sheets[i];
return;
}
}
sheet["sheet"] = spreadsheet.insertSheet(sheet["name"]);
if (sheet["columns"]) {
for (var i = 0; i < sheet["columns"].length; i++) {
sheet["sheet"].getRange(1, i + 1).setValue(sheet["columns"][i]);
}
}
}
function deleteSheet(sheet) {
var sheets = spreadsheet.getSheets();
for (var i in sheets) {
if (sheets[i].getName() == sheet["name"]) {
spreadsheet.deleteSheet(sheets[i]);
break;
}
}
}
function getProperty(key) {
var properties = SHEETS[PROPERTIES_SHEET]["properties"];
if (key in properties) {
return properties[key];
}
var propertiesSheet = SHEETS[PROPERTIES_SHEET]["sheet"];
var lastRow = propertiesSheet.getLastRow();
for (var row = 1; row <= lastRow; row++) {
if (propertiesSheet.getRange(row, 1).getValue() == key) {
var value = propertiesSheet.getRange(row, 2).getValue();;
properties[key] = value;
return value;
}
}
return undefined;
}
function setProperty(key, value) {
var properties = SHEETS[PROPERTIES_SHEET]["properties"];
var propertiesSheet = SHEETS[PROPERTIES_SHEET]["sheet"];
var lastRow = propertiesSheet.getLastRow();
properties[key] = value;
for (var row = 1; row <= lastRow; row++) {
if (propertiesSheet.getRange(row, 1).getValue() == key) {
propertiesSheet.getRange(row, 2).setValue(value);
return;
}
}
propertiesSheet.getRange(lastRow + 1, 1).setValue(key);
propertiesSheet.getRange(lastRow + 1, 2).setValue(value);
}
function updateDict(sheet) {
var targetDict = {};
var targetSheet = sheet["sheet"];
if (!sheet["dict"]) {
return;
}
for (var row = 2; row <= targetSheet.getLastRow(); row++) {
var targetId = targetSheet.getRange(row, 1).getValue();
targetDict[targetId] = {};
for (var i = 0; i < sheet["columns"].length; i++) {
var key = sheet["columns"][i];
var value = targetSheet.getRange(row, column).getValue();
targetDict[targetId][key] = value;
}
}
sheet["dict"] = targetDict;
}
function getPlayer(playerIdOrName, sheet) {
if (playerIdOrName in sheet["dict"]) {
return sheet["dict"][playerIdOrName];
}
var url = API_URL + sheet["query"] + (isFinite(playerIdOrName) ? "id=" : "name=") + playerIdOrName;
var player = {};
var playerJson = parseJson(url);
var playerId = playerJson["info"][sheet["idName"]];
var lastRow = sheet["sheet"].getLastRow() + 1;
for (var i = 0; i < sheet["columns"].length; i++) {
var key = sheet["columns"][i];
var value = playerJson["info"][key];
sheet["sheet"].getRange(lastRow, i + 1).setValue(value);
player[key] = value;
}
sheet["dict"][playerId] = player;
return player;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment