-
-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
153 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
import p, { IResponse } from "phin"; | ||
import Keyv from "keyv"; | ||
import pkg from "../package.json"; | ||
|
||
|
||
const keyv = new Keyv(process.env.REDIS_URL); | ||
|
||
keyv.on("error", err => console.log("Connection Error", err)); | ||
const ttl = 1000 * 60 * 60 * Number(process.env.EXPIRE_CACHE); | ||
|
||
|
||
class LustPress { | ||
url: string; | ||
useragent: string; | ||
constructor() { | ||
this.url = ""; | ||
this.useragent = `${pkg.name}/${pkg.version} Node.js/16.9.1`; | ||
} | ||
|
||
/** | ||
* Fetch body from url and check if it's cached | ||
* @param url url to fetch | ||
* @returns Buffer | ||
*/ | ||
async fetchBody(url: string): Promise<Buffer> { | ||
const cached = await keyv.get(url); | ||
|
||
if (cached) { | ||
console.log("Fetching from cache"); | ||
return cached; | ||
} else if (url.includes("/random")) { | ||
console.log("Random should not be cached"); | ||
const res = await p({ | ||
url: url, | ||
"headers": { | ||
"User-Agent": process.env.USER_AGENT || `${pkg.name}/${pkg.version} Node.js/16.9.1`, | ||
}, | ||
followRedirects: true | ||
}); | ||
return res.body; | ||
} else { | ||
console.log("Fetching from source"); | ||
const res = await p({ | ||
url: url, | ||
"headers": { | ||
"User-Agent": process.env.USER_AGENT || `${pkg.name}/${pkg.version} Node.js/16.9.1`, | ||
}, | ||
followRedirects: true | ||
}); | ||
await keyv.set(url, res.body, ttl); | ||
return res.body; | ||
} | ||
} | ||
|
||
/** | ||
* remove html tag and bunch of space | ||
* @param str string to remove html tag | ||
* @returns string | ||
*/ | ||
removeHtmlTag(str: string): string { | ||
str = str.replace(/(\r\n|\n|\r)/gm, ""); | ||
str = str.replace(/\s+/g, ""); | ||
return str; | ||
} | ||
|
||
/** | ||
* remove html tag without space | ||
* @param str string to remove html tag | ||
* @returns string | ||
*/ | ||
removeHtmlTagWithoutSpace(str: string): string { | ||
str = str.replace(/(\r\n|\n|\r|\t)/gm, ""); | ||
str = str.replace(/\\/g, ""); | ||
return str.trim(); | ||
} | ||
|
||
/** | ||
* remove all single quote on array | ||
* @param arr array to remove single quote | ||
* @returns string[] | ||
*/ | ||
removeAllSingleQuoteOnArray(arr: string[]): string[] { | ||
return arr.map((item) => item.replace(/'/g, "")); | ||
} | ||
|
||
/** | ||
* time ago converter | ||
* @param input date to convert | ||
* @returns string | ||
*/ | ||
timeAgo(input: Date) { | ||
const date = new Date(input); | ||
const formatter: any = new Intl.RelativeTimeFormat("en"); | ||
const ranges: { [key: string]: number } = { | ||
years: 3600 * 24 * 365, | ||
months: 3600 * 24 * 30, | ||
weeks: 3600 * 24 * 7, | ||
days: 3600 * 24, | ||
hours: 3600, | ||
minutes: 60, | ||
seconds: 1 | ||
}; | ||
const secondsElapsed = (date.getTime() - Date.now()) / 1000; | ||
for (const key in ranges) { | ||
if (ranges[key] < Math.abs(secondsElapsed)) { | ||
const delta = secondsElapsed / ranges[key]; | ||
return formatter.format(Math.round(delta), key); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* convert seconds to minute | ||
* @param seconds seconds to convert | ||
* @returns string | ||
*/ | ||
secondToMinute(seconds: number): string { | ||
const minutes = Math.floor(seconds / 60); | ||
const second = seconds % 60; | ||
return `${minutes}min, ${second}sec`; | ||
} | ||
|
||
/** | ||
* get current process memory usage | ||
* @returns object | ||
*/ | ||
currentProccess() { | ||
const arr = [1, 2, 3, 4, 5, 6, 9, 7, 8, 9, 10]; | ||
arr.reverse(); | ||
const rss = process.memoryUsage().rss / 1024 / 1024; | ||
const heap = process.memoryUsage().heapUsed / 1024 / 1024; | ||
const heaptotal = process.memoryUsage().heapTotal / 1024 / 1024; | ||
return { | ||
rss: `${Math.round(rss * 100) / 100} MB`, | ||
heap: `${Math.round(heap * 100) / 100}/${Math.round(heaptotal * 100) / 100} MB` | ||
}; | ||
} | ||
|
||
/** | ||
* fetch this server location | ||
* @returns <Promise<string>> | ||
*/ | ||
async getServer(): Promise<string> { | ||
const raw = await p({ | ||
"url": "http://ip-api.com/json", | ||
"parse": "json" | ||
}) as IResponse; | ||
const data = raw.body as unknown as { country: string, regionName: string }; | ||
return `${data.country}, ${data.regionName}`; | ||
} | ||
} | ||
|
||
export default LustPress; |