auto update

This commit is contained in:
root 2025-04-07 20:02:32 +01:00
commit 61dbcf6478
8 changed files with 542 additions and 1950 deletions

View file

@ -0,0 +1,351 @@
const express = require('express');
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const router = express.Router();
// Get API key from environment variables
const API_KEY = process.env.EXCHANGE_RATE_API_KEY;
if (!API_KEY) {
console.error('WARNING: EXCHANGE_RATE_API_KEY environment variable is not set!');
console.error('Exchange rate functionality will not work correctly.');
}
const BASE_URL = 'https://v6.exchangerate-api.com/v6';
// We'll use USD as our single base currency
const BASE_CURRENCY = 'USD';
// Path to the cache file
const CACHE_FILE_PATH = path.join(__dirname, 'exchange-rates-cache.json');
// In-memory storage for cached exchange rates
let exchangeRatesCache = {
USD: {
lastUpdated: null,
rates: {},
nextUpdateTime: null
}
};
// one day in milliseconds
const UPDATE_INTERVAL = 1 * 24 * 60 * 60 * 1000;
// Load cached exchange rates from file
function loadCachedRates() {
try {
if (fs.existsSync(CACHE_FILE_PATH)) {
const data = fs.readFileSync(CACHE_FILE_PATH, 'utf8');
const parsedData = JSON.parse(data);
// Convert string dates back to Date objects
if (parsedData.USD) {
if (parsedData.USD.lastUpdated) {
parsedData.USD.lastUpdated = new Date(parsedData.USD.lastUpdated);
}
if (parsedData.USD.nextUpdateTime) {
parsedData.USD.nextUpdateTime = new Date(parsedData.USD.nextUpdateTime);
}
}
exchangeRatesCache = parsedData;
console.log('Loaded exchange rates from cache file');
} else {
console.log('No cache file found, will create one when rates are fetched');
}
} catch (error) {
console.error('Error loading cached exchange rates:', error.message);
// Continue with default cache if file can't be loaded
}
}
// Save exchange rates to cache file
function saveCachedRates() {
try {
fs.writeFileSync(CACHE_FILE_PATH, JSON.stringify(exchangeRatesCache, null, 2));
console.log('Exchange rates saved to cache file');
} catch (error) {
console.error('Error saving exchange rates to cache file:', error.message);
}
}
// Function to fetch and update exchange rates using USD as base
async function updateExchangeRates() {
if (!API_KEY) {
console.error('Cannot update exchange rates: API key is not set');
return false;
}
try {
console.log(`Fetching latest exchange rates using ${BASE_CURRENCY} as base...`);
const response = await axios.get(`${BASE_URL}/${API_KEY}/latest/${BASE_CURRENCY}`);
if (response.data && response.data.result === 'success') {
exchangeRatesCache.USD = {
lastUpdated: new Date(),
rates: response.data.conversion_rates,
nextUpdateTime: new Date(Date.now() + UPDATE_INTERVAL)
};
// Save to file after updating
saveCachedRates();
console.log('Exchange rates updated successfully');
return true;
}
return false;
} catch (error) {
console.error('Failed to update exchange rates:', error.message);
return false;
}
}
// Check if rates need updating and update if necessary
async function ensureRatesUpdated() {
if (!exchangeRatesCache.USD.lastUpdated ||
Date.now() > exchangeRatesCache.USD.nextUpdateTime.getTime()) {
return await updateExchangeRates();
}
console.log(`Using cached rates, next update: ${exchangeRatesCache.USD.nextUpdateTime}`);
return true;
}
// Calculate conversion rate between any two currencies using USD as base
function calculateRate(from, to) {
const rates = exchangeRatesCache.USD.rates;
// If either currency is USD, we can use the rate directly
if (from === 'USD') return rates[to];
if (to === 'USD') return 1 / rates[from];
// Otherwise, calculate cross rate: from -> USD -> to
return rates[to] / rates[from];
}
// Load cached rates when the module is loaded
loadCachedRates();
// Initialize rates if needed
ensureRatesUpdated();
// Root endpoint
router.get('/', (req, res) => {
const availableCurrencies = exchangeRatesCache.USD.rates ?
Object.keys(exchangeRatesCache.USD.rates) : [];
res.json({
message: 'Exchange Rate API is running',
baseCurrency: BASE_CURRENCY,
availableCurrencies,
lastUpdated: exchangeRatesCache.USD.lastUpdated,
nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
updateInterval: '3 days',
endpoints: {
latest: '/latest',
convert: '/convert/:from/:to/:amount',
currencies: '/currencies'
}
});
});
// Get all cached exchange rates
router.get('/latest', async (req, res) => {
await ensureRatesUpdated();
if (!exchangeRatesCache.USD.rates) {
return res.status(503).json({ error: 'Exchange rate data not yet available' });
}
res.json({
result: 'success',
base: BASE_CURRENCY,
lastUpdated: exchangeRatesCache.USD.lastUpdated,
nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
rates: exchangeRatesCache.USD.rates
});
});
// Get rates for a specific currency as base
router.get('/latest/:currency', async (req, res) => {
const { currency } = req.params;
const currencyCode = currency.toUpperCase();
await ensureRatesUpdated();
if (!exchangeRatesCache.USD.rates) {
return res.status(503).json({ error: 'Exchange rate data not yet available' });
}
// Check if the currency is supported
if (!exchangeRatesCache.USD.rates[currencyCode] && currencyCode !== 'USD') {
return res.status(400).json({ error: `Currency '${currencyCode}' not supported` });
}
// Calculate rates with the requested currency as base
const rates = {};
const usdRates = exchangeRatesCache.USD.rates;
// If the requested base is USD, return rates directly
if (currencyCode === 'USD') {
res.json({
result: 'success',
base: currencyCode,
lastUpdated: exchangeRatesCache.USD.lastUpdated,
nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
rates: usdRates
});
return;
}
// Otherwise, calculate rates for all currencies with the requested currency as base
const baseRate = usdRates[currencyCode]; // Rate of 1 USD in the requested currency
// Add USD rate
rates['USD'] = 1 / baseRate;
// Add rates for all other currencies
for (const toCurrency in usdRates) {
if (toCurrency !== currencyCode) {
// Convert through USD: from -> USD -> to
rates[toCurrency] = usdRates[toCurrency] / baseRate;
}
}
// Add rate for the base currency itself
rates[currencyCode] = 1;
res.json({
result: 'success',
base: currencyCode,
lastUpdated: exchangeRatesCache.USD.lastUpdated,
nextUpdate: exchangeRatesCache.USD.nextUpdateTime,
rates: rates
});
});
// Get list of available currencies
router.get('/currencies', async (req, res) => {
await ensureRatesUpdated();
const availableCurrencies = exchangeRatesCache.USD.rates ?
Object.keys(exchangeRatesCache.USD.rates) : [];
res.json({
result: 'success',
baseCurrency: BASE_CURRENCY,
availableCurrencies,
lastUpdated: exchangeRatesCache.USD.lastUpdated,
nextUpdate: exchangeRatesCache.USD.nextUpdateTime
});
});
// Convert between currencies using cached rates
router.get('/convert/:from/:to/:amount', async (req, res) => {
const { from, to, amount } = req.params;
const fromCurrency = from.toUpperCase();
const toCurrency = to.toUpperCase();
await ensureRatesUpdated();
if (!exchangeRatesCache.USD.rates) {
return res.status(503).json({ error: 'Exchange rate data not yet available' });
}
// Check if currencies are supported
if (fromCurrency !== 'USD' && !exchangeRatesCache.USD.rates[fromCurrency]) {
return res.status(400).json({ error: `Currency '${fromCurrency}' not supported` });
}
if (toCurrency !== 'USD' && !exchangeRatesCache.USD.rates[toCurrency]) {
return res.status(400).json({ error: `Currency '${toCurrency}' not supported` });
}
try {
const numericAmount = parseFloat(amount);
if (isNaN(numericAmount)) {
return res.status(400).json({ error: 'Invalid amount' });
}
// Calculate conversion rate
const rate = calculateRate(fromCurrency, toCurrency);
const convertedAmount = numericAmount * rate;
res.json({
result: 'success',
from: fromCurrency,
to: toCurrency,
amount: numericAmount,
rate,
convertedAmount: parseFloat(convertedAmount.toFixed(4)),
lastUpdated: exchangeRatesCache.USD.lastUpdated,
nextUpdate: exchangeRatesCache.USD.nextUpdateTime
});
} catch (error) {
console.error('Conversion error:', error);
res.status(500).json({ error: 'Failed to convert currency' });
}
});
// Direct pair conversion (fallback to API if needed)
router.get('/pair/:from/:to/:amount', async (req, res) => {
const { from, to, amount } = req.params;
const fromCurrency = from.toUpperCase();
const toCurrency = to.toUpperCase();
// First try to use our cached rates
await ensureRatesUpdated();
if (exchangeRatesCache.USD.rates &&
(fromCurrency === 'USD' || exchangeRatesCache.USD.rates[fromCurrency]) &&
(toCurrency === 'USD' || exchangeRatesCache.USD.rates[toCurrency])) {
try {
const numericAmount = parseFloat(amount);
if (isNaN(numericAmount)) {
return res.status(400).json({ error: 'Invalid amount' });
}
// Calculate conversion rate
const rate = calculateRate(fromCurrency, toCurrency);
const convertedAmount = numericAmount * rate;
res.json({
result: 'success',
from: fromCurrency,
to: toCurrency,
amount: numericAmount,
rate,
convertedAmount: parseFloat(convertedAmount.toFixed(4)),
lastUpdated: exchangeRatesCache.USD.lastUpdated,
source: 'cache'
});
return;
} catch (error) {
console.error('Error using cached rates:', error);
// Fall through to API call
}
}
// If we can't use cached rates, call the API directly
if (!API_KEY) {
return res.status(503).json({ error: 'Exchange rate API key is not configured' });
}
try {
const response = await axios.get(`${BASE_URL}/${API_KEY}/pair/${fromCurrency}/${toCurrency}/${amount}`);
// Update our cache with the latest USD rates if it's time
ensureRatesUpdated();
res.json({
...response.data,
source: 'api'
});
} catch (error) {
res.status(500).json({ error: 'Failed to convert currency' });
}
});
module.exports = router;

View file

@ -0,0 +1,171 @@
{
"USD": {
"lastUpdated": "2025-04-07T18:49:41.384Z",
"rates": {
"USD": 1,
"AED": 3.6725,
"AFN": 71.3562,
"ALL": 90.1377,
"AMD": 391.1786,
"ANG": 1.79,
"AOA": 918.5748,
"ARS": 1075.88,
"AUD": 1.662,
"AWG": 1.79,
"AZN": 1.6999,
"BAM": 1.7805,
"BBD": 2,
"BDT": 121.3674,
"BGN": 1.7804,
"BHD": 0.376,
"BIF": 2960.3407,
"BMD": 1,
"BND": 1.3404,
"BOB": 6.8885,
"BRL": 5.7194,
"BSD": 1,
"BTN": 85.5708,
"BWP": 13.8733,
"BYN": 3.1354,
"BZD": 2,
"CAD": 1.423,
"CDF": 2899.0345,
"CHF": 0.8524,
"CLP": 960.6602,
"CNY": 7.2857,
"COP": 4203.747,
"CRC": 502.4294,
"CUP": 24,
"CVE": 100.3829,
"CZK": 22.9524,
"DJF": 177.721,
"DKK": 6.7905,
"DOP": 62.8304,
"DZD": 132.995,
"EGP": 50.8068,
"ERN": 15,
"ETB": 131.8684,
"EUR": 0.9102,
"FJD": 2.3154,
"FKP": 0.7757,
"FOK": 6.7935,
"GBP": 0.7751,
"GEL": 2.7559,
"GGP": 0.7757,
"GHS": 15.5067,
"GIP": 0.7757,
"GMD": 72.6441,
"GNF": 8570.968,
"GTQ": 7.6902,
"GYD": 209.8017,
"HKD": 7.7734,
"HNL": 25.5147,
"HRK": 6.8592,
"HTG": 130.7844,
"HUF": 369.6088,
"IDR": 16757.5574,
"ILS": 3.7448,
"IMP": 0.7757,
"INR": 85.5703,
"IQD": 1309.7144,
"IRR": 42008.9149,
"ISK": 131.125,
"JEP": 0.7757,
"JMD": 157.719,
"JOD": 0.709,
"JPY": 145.2473,
"KES": 129.2338,
"KGS": 86.8492,
"KHR": 3997.3556,
"KID": 1.6621,
"KMF": 447.8769,
"KRW": 1457.9608,
"KWD": 0.307,
"KYD": 0.8333,
"KZT": 510.3326,
"LAK": 21751.6772,
"LBP": 89500,
"LKR": 295.3817,
"LRD": 199.3433,
"LSL": 19.1915,
"LYD": 4.8358,
"MAD": 9.5166,
"MDL": 17.6443,
"MGA": 4654.3433,
"MKD": 55.9208,
"MMK": 2090.2388,
"MNT": 3479.6583,
"MOP": 8.0068,
"MRU": 39.8843,
"MUR": 44.5309,
"MVR": 15.4592,
"MWK": 1740.2553,
"MXN": 20.5515,
"MYR": 4.437,
"MZN": 63.6781,
"NAD": 19.1915,
"NGN": 1529.0612,
"NIO": 36.6793,
"NOK": 10.7699,
"NPR": 136.9132,
"NZD": 1.7956,
"OMR": 0.3845,
"PAB": 1,
"PEN": 3.6809,
"PGK": 4.0959,
"PHP": 57.3644,
"PKR": 280.7358,
"PLN": 3.8787,
"PYG": 8001.2022,
"QAR": 3.64,
"RON": 4.5185,
"RSD": 106.3911,
"RUB": 84.4536,
"RWF": 1422.8596,
"SAR": 3.75,
"SBD": 8.3385,
"SCR": 14.8196,
"SDG": 458.3047,
"SEK": 10.0072,
"SGD": 1.3405,
"SHP": 0.7757,
"SLE": 22.7181,
"SLL": 22718.051,
"SOS": 571.0444,
"SRD": 36.8241,
"SSP": 4519.748,
"STN": 22.3043,
"SYP": 12873.9497,
"SZL": 19.1915,
"THB": 34.3823,
"TJS": 10.9221,
"TMT": 3.4983,
"TND": 3.0571,
"TOP": 2.3833,
"TRY": 38.0295,
"TTD": 6.7342,
"TVD": 1.6621,
"TWD": 33.1309,
"TZS": 2647.2453,
"UAH": 41.1747,
"UGX": 3662.2001,
"UYU": 42.042,
"UZS": 12937.493,
"VES": 72.1856,
"VND": 25642.7185,
"VUV": 121.865,
"WST": 2.8015,
"XAF": 597.1692,
"XCD": 2.7,
"XCG": 1.79,
"XDR": 0.751,
"XOF": 597.1692,
"XPF": 108.6373,
"YER": 244.8828,
"ZAR": 19.2142,
"ZMW": 27.9801,
"ZWL": 6.7864
},
"nextUpdateTime": "2025-04-10T18:49:41.384Z"
}
}

View file

@ -3,18 +3,24 @@ const cors = require("cors");
const fs = require("fs");
const https = require("https");
const http = require("http");
const status = require("./status/server")
const path = require("path");
// load environment variables from .env file
require('dotenv').config({ path: path.join(__dirname, '../.env') });
const status = require("./status/status");
const exchangeRate = require("./exchange-rate/exchange-rate");
const app = express();
const PORT = 2589;
const PORT = process.env.PORT || 2589;
const key = "/etc/letsencrypt/live/blahaj.tr/privkey.pem"
const cert = "/etc/letsencrypt/live/blahaj.tr/fullchain.pem"
const key = process.env.SSL_KEY_PATH || "/etc/letsencrypt/live/blahaj.tr/privkey.pem";
const cert = process.env.SSL_CERT_PATH || "/etc/letsencrypt/live/blahaj.tr/fullchain.pem";
app.use(cors());
app.use("/status", status);
app.use("/exchange-rate", exchangeRate);
// Try to load certificates
// try to load certificates
try {
const sslOptions = {
key: fs.readFileSync(key),
@ -33,7 +39,7 @@ try {
console.log("Starting server without SSL...");
// Start http server as fallback
// start http server as fallback
http.createServer(app).listen(PORT, () => {
console.log(`API running at http://localhost:${PORT}`);
});

File diff suppressed because it is too large Load diff

0
node
View file

147
package-lock.json generated
View file

@ -11,7 +11,6 @@
"dependencies": {
"axios": "^1.8.4",
"cors": "^2.8.5",
"discord.js": "^14.18.0",
"dotenv": "^16.4.7",
"express": "^4.21.2",
<<<<<<< HEAD
@ -20,6 +19,7 @@
=======
"nodejs": "^0.0.0",
"ping": "^0.4.4",
<<<<<<< HEAD
"whois-json": "^2.0.4",
"wikipedia": "^2.1.2"
>>>>>>> 8979cf12f0836cc64935d71ef45678c40ec8197e
@ -211,6 +211,9 @@
"engines": {
"node": ">=v14.0.0",
"npm": ">=7.0.0"
=======
"whois-json": "^2.0.4"
>>>>>>> 7cc5ea85e0d343fedf6e39033928da2dc42e5a83
}
},
"node_modules/accepts": {
@ -459,6 +462,7 @@
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
"license": "MIT",
"dependencies": {
"object-assign": "^4",
"vary": "^1"
@ -515,38 +519,6 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/discord-api-types": {
"version": "0.37.119",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.119.tgz",
"integrity": "sha512-WasbGFXEB+VQWXlo6IpW3oUv73Yuau1Ig4AZF/m13tXcTKnMpc/mHjpztIlz4+BM9FG9BHQkEXiPto3bKduQUg==",
"license": "MIT"
},
"node_modules/discord.js": {
"version": "14.18.0",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.18.0.tgz",
"integrity": "sha512-SvU5kVUvwunQhN2/+0t55QW/1EHfB1lp0TtLZUSXVHDmyHTrdOj5LRKdR0zLcybaA15F+NtdWuWmGOX9lE+CAw==",
"license": "Apache-2.0",
"dependencies": {
"@discordjs/builders": "^1.10.1",
"@discordjs/collection": "1.5.3",
"@discordjs/formatters": "^0.6.0",
"@discordjs/rest": "^2.4.3",
"@discordjs/util": "^1.1.1",
"@discordjs/ws": "^1.2.1",
"@sapphire/snowflake": "3.5.3",
"discord-api-types": "^0.37.119",
"fast-deep-equal": "3.1.3",
"lodash.snakecase": "4.1.1",
"tslib": "^2.6.3",
"undici": "6.21.1"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/dot-case": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz",
@ -658,6 +630,7 @@
"version": "4.21.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
"integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
@ -699,12 +672,6 @@
"url": "https://opencollective.com/express"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"license": "MIT"
},
"node_modules/finalhandler": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
@ -925,28 +892,6 @@
"node": ">=0.10.0"
}
},
"node_modules/infobox-parser": {
"version": "3.6.4",
"resolved": "https://registry.npmjs.org/infobox-parser/-/infobox-parser-3.6.4.tgz",
"integrity": "sha512-d2lTlxKZX7WsYxk9/UPt51nkmZv5tbC75SSw4hfHqZ3LpRAn6ug0oru9xI2X+S78va3aUAze3xl/UqMuwLmJUw==",
"license": "MIT",
"dependencies": {
"camelcase": "^4.1.0"
},
"funding": {
"type": "individual",
"url": "https://www.buymeacoffee.com/2tmRKi9"
}
},
"node_modules/infobox-parser/node_modules/camelcase": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
@ -1018,18 +963,6 @@
"node": ">=8"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash.snakecase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
"integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
"license": "MIT"
},
"node_modules/lower-case": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
@ -1045,12 +978,6 @@
"lower-case": "^1.1.2"
}
},
"node_modules/magic-bytes.js": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz",
"integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==",
"license": "MIT"
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@ -1264,6 +1191,7 @@
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/ping/-/ping-0.4.4.tgz",
"integrity": "sha512-56ZMC0j7SCsMMLdOoUg12VZCfj/+ZO+yfOSjaNCRrmZZr6GLbN2X/Ui56T15dI8NhiHckaw5X2pvyfAomanwqQ==",
"license": "MIT",
"engines": {
"node": ">=4.0.0"
}
@ -1609,18 +1537,6 @@
"node": ">=0.6"
}
},
"node_modules/ts-mixer": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz",
"integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==",
"license": "MIT"
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@ -1639,21 +1555,6 @@
"integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
"license": "MIT"
},
"node_modules/undici": {
"version": "6.21.1",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz",
"integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==",
"license": "MIT",
"engines": {
"node": ">=18.17"
}
},
"node_modules/undici-types": {
"version": "6.20.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
"integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
"license": "MIT"
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@ -1726,19 +1627,6 @@
"whois": "^2.6.0"
}
},
"node_modules/wikipedia": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/wikipedia/-/wikipedia-2.1.2.tgz",
"integrity": "sha512-RAYaMpXC9/E873RaSEtlEa8dXK4e0p5k98GKOd210MtkE5emm6fcnwD+N6ZA4cuffjDWagvhaQKtp/mGp2BOVQ==",
"license": "MIT",
"dependencies": {
"axios": "^1.4.0",
"infobox-parser": "^3.6.2"
},
"engines": {
"node": ">=10"
}
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@ -1753,27 +1641,6 @@
"node": ">=8"
}
},
"node_modules/ws": {
"version": "8.18.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
"integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/y18n": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",

View file

@ -22,12 +22,10 @@
"dependencies": {
"axios": "^1.8.4",
"cors": "^2.8.5",
"discord.js": "^14.18.0",
"dotenv": "^16.4.7",
"express": "^4.21.2",
"nodejs": "^0.0.0",
"ping": "^0.4.4",
"whois-json": "^2.0.4",
"wikipedia": "^2.1.2"
"whois-json": "^2.0.4"
}
}