281 lines
10 KiB
JavaScript
281 lines
10 KiB
JavaScript
const fs = require('fs');
|
|
let config;
|
|
let cache;
|
|
try {config = require('./config.json')} catch {return}
|
|
try {cache = require('./cache.json')} catch {
|
|
cache = {
|
|
users: {},
|
|
factions: {},
|
|
companies: {},
|
|
items: {}
|
|
};
|
|
fs.writeFileSync('./cache.json', JSON.stringify(cache));
|
|
return;
|
|
}
|
|
|
|
module.exports = () => {};
|
|
module.exports.readyCheck = async (key) => {
|
|
const url = `https://api.torn.com/user/?selections=basic&key=${key}`
|
|
const response = await fetch(url);
|
|
const data = await response.json();
|
|
console.log(`Torn: Connected as ${data.name} [${data.player_id}]`);
|
|
};
|
|
module.exports.test = async () => {
|
|
const url = `https://api.torn.com/user/?selections=basic&key=${config.torn}`
|
|
const response = await fetch(url);
|
|
const data = await response.json();
|
|
return(`Connected to Torn as ${data.name} [${data.player_id}]`);
|
|
};
|
|
module.exports.api = async (url) => {
|
|
const response = await fetch(`${url}&key=${config.torn}`);
|
|
const data = await response.json();
|
|
return(data);
|
|
};
|
|
module.exports.cache = {
|
|
async user(user) {
|
|
const twelveHours = 12 * 60 * 60 * 1000;
|
|
const now = new Date().getTime();
|
|
let last
|
|
try {
|
|
last = new Date(cache.users[user].updated).getTime();
|
|
} catch {
|
|
last = new Date(now - twelveHours).getTime();
|
|
}
|
|
if (cache.users[user] && (now - last < twelveHours)) {
|
|
console.debug(`Cache: Hit for user ${cache.users[user].name}`)
|
|
return(cache.users[user]);
|
|
} else {
|
|
console.debug(`Cache: Miss for user ${user}`)
|
|
await module.exports.user.basic(user);
|
|
console.debug(`Cache: Resolved user ${cache.users[user].name}`)
|
|
return(cache.users[user]);
|
|
}
|
|
},
|
|
async faction(faction) {
|
|
const twelveHours = 12 * 60 * 60 * 1000;
|
|
const now = new Date().getTime();
|
|
let last
|
|
try {
|
|
last = new Date(cache.factions[faction].updated).getTime();
|
|
} catch {
|
|
last = new Date(now - twelveHours).getTime();
|
|
}
|
|
if (cache.factions[faction] && (now - last < twelveHours)) {
|
|
console.debug(`Cache: Hit for faction ${cache.factions[faction].name}`)
|
|
return(cache.factions[faction]);
|
|
} else {
|
|
console.debug(`Cache: Miss for faction ${faction}`)
|
|
await module.exports.faction.basic(faction);
|
|
console.debug(`Cache: Resolved faction ${cache.factions[faction].name}`)
|
|
return(cache.factions[faction]);
|
|
}
|
|
},
|
|
async company(company) {
|
|
const twelveHours = 12 * 60 * 60 * 1000;
|
|
const now = new Date().getTime();
|
|
let last
|
|
try {
|
|
last = new Date(cache.companies[company].updated).getTime();
|
|
} catch {
|
|
last = new Date(now - twelveHours).getTime();
|
|
}
|
|
if (cache.companies[company] && (now - last < twelveHours)) {
|
|
console.debug(`Cache: Hit for company ${cache.companies[company].name}`)
|
|
return(cache.companies[company]);
|
|
} else {
|
|
console.debug(`Cache: Miss for company ${company}`)
|
|
await module.exports.company(company);
|
|
console.debug(`Cache: Resolved company ${cache.companies[company].name}`)
|
|
return(cache.companies[company]);
|
|
}
|
|
},
|
|
async item(item) {
|
|
const sevenDays = 7 * 24 * 60 * 60 * 1000;
|
|
const now = new Date().getTime();
|
|
let last
|
|
try {
|
|
last = new Date(cache.items[item].updated).getTime();
|
|
} catch {
|
|
last = new Date(now - sevenDays).getTime();
|
|
}
|
|
if (cache.items[item] && (now - last < sevenDays)) {
|
|
console.debug(`Cache: Hit for item ${cache.items[item].name}`)
|
|
return(cache.items[item]);
|
|
} else {
|
|
console.debug(`Cache: Miss for item ${item}`)
|
|
await module.exports.item(item);
|
|
console.debug(`Cache: Resolved item ${cache.items[item].name}`)
|
|
return(cache.items[item]);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports.user = {
|
|
async basic(user) {
|
|
const response = await fetch(`https://api.torn.com/user/${user}?selections=basic&key=${config.torn}`);
|
|
const data = await response.json();
|
|
const now = new Date();
|
|
cache.users[user] = {
|
|
name: data.name,
|
|
player_id: data.player_id,
|
|
level: data.level,
|
|
gender: data.gender,
|
|
updated: now.toISOString()
|
|
};
|
|
fs.writeFileSync('./cache.json', JSON.stringify(cache));
|
|
return(data);
|
|
},
|
|
async profile(user) {
|
|
const response = await fetch(`https://api.torn.com/user/${user}?selections=profile&key=${config.torn}`);
|
|
const data = await response.json();
|
|
const now = new Date();
|
|
cache.users[user] = {
|
|
name: data.name,
|
|
player_id: data.player_id,
|
|
level: data.level,
|
|
gender: data.gender,
|
|
updated: now.toISOString()
|
|
};
|
|
fs.writeFileSync('./cache.json', JSON.stringify(cache));
|
|
return(data);
|
|
},
|
|
async stats(user, category, statName) {
|
|
let url = `https://api.torn.com/v2/user`;
|
|
if (user) { url += `/${user}/personalstats` };
|
|
if (category) { url += `?cat=${category}` } else { url += `?cat=all` };
|
|
if (statName) { url += `&stat=${statName}` };
|
|
const response = await fetch(url);
|
|
const data = await response.json();
|
|
return(data);
|
|
}
|
|
};
|
|
|
|
module.exports.faction = {
|
|
async basic(faction) {
|
|
let response
|
|
if (faction) {
|
|
response = await fetch(`https://api.torn.com/v2/faction/${faction}/basic?key=${config.torn}`);
|
|
} else {
|
|
response = await fetch(`https://api.torn.com/v2/faction/basic?key=${config.torn}`);
|
|
}
|
|
const data = (await response.json()).basic;
|
|
const now = new Date();
|
|
cache.factions[data.id] = {
|
|
name: data.name,
|
|
leader_id: data.leader_id,
|
|
capacity: data.capacity,
|
|
rank: data.rank,
|
|
best_chain: data.best_chain,
|
|
updated: now.toISOString()
|
|
};
|
|
fs.writeFileSync('./cache.json', JSON.stringify(cache));
|
|
return(data);
|
|
},
|
|
async members(faction) {
|
|
let response
|
|
if (faction) {
|
|
response = await fetch(`https://api.torn.com/v2/faction/${faction}/members?striptags=true&key=${config.torn}`);
|
|
} else {
|
|
response = await fetch(`https://api.torn.com/v2/faction/members?striptags=true&key=${config.torn}`);
|
|
}
|
|
const data = await response.json();
|
|
return(data.members);
|
|
},
|
|
async crimes(category) {
|
|
let response
|
|
if (category) {
|
|
response = await fetch(`https://api.torn.com/v2/faction/crimes/${category}?key=${config.torn}`);
|
|
} else {
|
|
response = await fetch(`https://api.torn.com/v2/faction/crimes?key=${config.torn}`);
|
|
}
|
|
const data = await response.json();
|
|
return(data.crimes);
|
|
},
|
|
async upgrades() {
|
|
const response = await fetch(`https://api.torn.com/v2/faction/upgrades?key=${config.torn}`);
|
|
const data = await response.json();
|
|
return(data);
|
|
},
|
|
async news(category, from) {
|
|
const response = await fetch(`https://api.torn.com/v2/faction/news?striptags=false&limit=100&sort=DESC&from=${from}&cat=${category}&key=${config.torn}`)
|
|
const data = await response.json();
|
|
return(data.news);
|
|
}
|
|
}
|
|
|
|
module.exports.company = async (company) => {
|
|
let response
|
|
if (company) {
|
|
response = await fetch(`https://api.torn.com/company/${company}?selections=profile&key=${config.torn}`);
|
|
} else {
|
|
response = await fetch(`https://api.torn.com/company/?selections=profile&key=${config.torn}`);
|
|
}
|
|
const data = await response.json();
|
|
const now = new Date();
|
|
cache.companies[data.company.ID] = {
|
|
name: data.company.name,
|
|
id: data.company.ID,
|
|
company_type: data.company.company_type,
|
|
director_id: data.company.director,
|
|
rating: data.company.rating,
|
|
updated: now.toISOString()
|
|
};
|
|
fs.writeFileSync('./cache.json', JSON.stringify(cache));
|
|
return(data.company);
|
|
}
|
|
|
|
module.exports.item = async (item) => {
|
|
const response = await fetch(`https://api.torn.com/v2/torn/${item}/items?sort=ASC&key=${config.torn}`);
|
|
const data = await response.json();
|
|
const now = new Date();
|
|
cache.items[item] = data.items[0];
|
|
cache.items[item].updated = now.toISOString();
|
|
fs.writeFileSync('./cache.json', JSON.stringify(cache));
|
|
return(data.items[0]);
|
|
}
|
|
module.exports.item.lookup = async (itemName) => {
|
|
console.debug(`Torn: Looking up item ${itemName}`)
|
|
const thirtyDays = 30 * 24 * 60 * 60 * 1000;
|
|
const now = new Date().getTime();
|
|
|
|
for (const itemId in cache.items) {
|
|
if (cache.items[itemId].name === itemName) {
|
|
let last = new Date(cache.items[itemId].updated).getTime();
|
|
if (now - last < thirtyDays) {
|
|
console.debug(`Cache: Hit for item ${cache.items[itemId].name}`);
|
|
return cache.items[itemId];
|
|
}
|
|
}
|
|
}
|
|
|
|
console.debug(`Cache: Miss for item ${itemName}`);
|
|
const response = await fetch(`https://api.torn.com/v2/torn/items?cat=All&sort=ASC&key=${config.torn}`);
|
|
const data = await response.json();
|
|
let target;
|
|
data.items.forEach(item => {
|
|
if (item.name === itemName) {
|
|
console.debug(`Torn: Found item ${item.name} as ${item.id}`)
|
|
target = item;
|
|
}
|
|
});
|
|
if (target) {
|
|
cache.items[target.id] = target;
|
|
cache.items[target.id].updated = new Date().toISOString();
|
|
fs.writeFileSync('./cache.json', JSON.stringify(cache));
|
|
}
|
|
return(target);
|
|
};
|
|
|
|
|
|
module.exports.self = {
|
|
async id() {
|
|
if (!config.tornid) {
|
|
const url = `https://api.torn.com/user/?selections=basic&key=${config.torn}`
|
|
const response = await fetch(url);
|
|
const data = await response.json();
|
|
config.tornid = data.player_id;
|
|
console.log(`Torn: Retrieved default ID as "${data.player_id}"`)
|
|
return(data.player_id);
|
|
} else return config.tornid;
|
|
}
|
|
} |