mirror of
https://github.com/journey-ad/Moe-Counter.git
synced 2024-11-30 18:24:28 +01:00
feat: Add num
param
This commit is contained in:
parent
c0b421125c
commit
1dce9e93aa
@ -37,6 +37,10 @@
|
|||||||
|
|
||||||
![booru-koe](https://count.getloli.com/@demo?theme=booru-koe)
|
![booru-koe](https://count.getloli.com/@demo?theme=booru-koe)
|
||||||
|
|
||||||
|
##### booru-lewd
|
||||||
|
|
||||||
|
![booru-lewd](https://count.getloli.com/@demo?theme=booru-lewd)
|
||||||
|
|
||||||
##### booru-lisu
|
##### booru-lisu
|
||||||
|
|
||||||
![booru-lisu](https://count.getloli.com/@demo?theme=booru-lisu)
|
![booru-lisu](https://count.getloli.com/@demo?theme=booru-lisu)
|
||||||
@ -141,6 +145,10 @@
|
|||||||
|
|
||||||
![kyun](https://count.getloli.com/@demo?theme=kyun)
|
![kyun](https://count.getloli.com/@demo?theme=kyun)
|
||||||
|
|
||||||
|
##### love-and-deepspace
|
||||||
|
|
||||||
|
![love-and-deepspace](https://count.getloli.com/@demo?theme=love-and-deepspace)
|
||||||
|
|
||||||
##### minecraft
|
##### minecraft
|
||||||
|
|
||||||
![minecraft](https://count.getloli.com/@demo?theme=minecraft)
|
![minecraft](https://count.getloli.com/@demo?theme=minecraft)
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
scale: document.getElementById('scale'),
|
scale: document.getElementById('scale'),
|
||||||
pixelated: document.getElementById('pixelated'),
|
pixelated: document.getElementById('pixelated'),
|
||||||
darkmode: document.getElementById('darkmode'),
|
darkmode: document.getElementById('darkmode'),
|
||||||
|
num: document.getElementById('num')
|
||||||
};
|
};
|
||||||
|
|
||||||
btn.addEventListener('click', throttle(handleButtonClick, 500));
|
btn.addEventListener('click', throttle(handleButtonClick, 500));
|
||||||
@ -24,7 +25,7 @@
|
|||||||
moreTheme.addEventListener('click', scrollToThemes);
|
moreTheme.addEventListener('click', scrollToThemes);
|
||||||
|
|
||||||
function handleButtonClick() {
|
function handleButtonClick() {
|
||||||
const { name, theme, padding, offset, scale, pixelated, darkmode } = elements;
|
const { name, theme, padding, offset, scale, pixelated, darkmode, num } = elements;
|
||||||
const nameValue = name.value.trim();
|
const nameValue = name.value.trim();
|
||||||
|
|
||||||
if (!nameValue) {
|
if (!nameValue) {
|
||||||
@ -42,6 +43,10 @@
|
|||||||
darkmode: darkmode.value || 'auto'
|
darkmode: darkmode.value || 'auto'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (num.value > 0) {
|
||||||
|
params.num = num.value;
|
||||||
|
}
|
||||||
|
|
||||||
const query = new URLSearchParams(params).toString();
|
const query = new URLSearchParams(params).toString();
|
||||||
const imgSrc = `${__global_data.site}/@${nameValue}?${query}`;
|
const imgSrc = `${__global_data.site}/@${nameValue}?${query}`;
|
||||||
|
|
||||||
@ -58,7 +63,7 @@
|
|||||||
|
|
||||||
img.onerror = async () => {
|
img.onerror = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await fetch(imgSrc);
|
const res = await fetch(img.src);
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
const { message } = await res.json();
|
const { message } = await res.json();
|
||||||
alert(message);
|
alert(message);
|
||||||
@ -191,7 +196,7 @@
|
|||||||
btn.addEventListener('click', handleClick);
|
btn.addEventListener('click', handleClick);
|
||||||
})();
|
})();
|
||||||
|
|
||||||
// Prevent gesture
|
// Prevent safari gesture
|
||||||
(() => {
|
(() => {
|
||||||
document.addEventListener('gesturestart', e => e.preventDefault());
|
document.addEventListener('gesturestart', e => e.preventDefault());
|
||||||
})();
|
})();
|
||||||
|
@ -58,6 +58,10 @@ input[type="checkbox"][role="switch"] {
|
|||||||
position: relative;
|
position: relative;
|
||||||
transition: 0.3s;
|
transition: 0.3s;
|
||||||
|
|
||||||
|
&:active:after {
|
||||||
|
width: 2.34em;
|
||||||
|
}
|
||||||
|
|
||||||
&:after {
|
&:after {
|
||||||
content: "";
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -80,7 +84,7 @@ input[type="checkbox"][role="switch"] {
|
|||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 0 12.5%;
|
padding: 0 12.5%;
|
||||||
font-size: 0.54em;
|
font-size: 10px;
|
||||||
|
|
||||||
&::before,
|
&::before,
|
||||||
&::after {
|
&::after {
|
||||||
@ -108,10 +112,6 @@ input[type="checkbox"][role="switch"] {
|
|||||||
left: calc(100% - 0.1em);
|
left: calc(100% - 0.1em);
|
||||||
transform: translateX(-100%);
|
transform: translateX(-100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
&:active:after {
|
|
||||||
width: 2.34em;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,6 +153,14 @@ h5 {
|
|||||||
margin: 1.5em 0 0.6em;
|
margin: 1.5em 0 0.6em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
tr {
|
||||||
|
.caption {
|
||||||
|
margin: 1em 0 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.back-to-top {
|
.back-to-top {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
13
index.js
13
index.js
@ -32,7 +32,8 @@ app.get(["/@:name", "/get/@:name"],
|
|||||||
}),
|
}),
|
||||||
query: z.object({
|
query: z.object({
|
||||||
theme: z.string().default("moebooru"),
|
theme: z.string().default("moebooru"),
|
||||||
padding: z.coerce.number().min(0).max(32).default(7),
|
num: z.coerce.number().min(0).max(1000000000000000).default(0), // a carry-safe integer, less than `2^53-1`, and aesthetically pleasing in decimal.
|
||||||
|
padding: z.coerce.number().min(0).max(16).default(7),
|
||||||
offset: z.coerce.number().min(-500).max(500).default(0),
|
offset: z.coerce.number().min(-500).max(500).default(0),
|
||||||
scale: z.coerce.number().min(0.1).max(2).default(1),
|
scale: z.coerce.number().min(0.1).max(2).default(1),
|
||||||
pixelated: z.enum(["0", "1"]).default("1"),
|
pixelated: z.enum(["0", "1"]).default("1"),
|
||||||
@ -41,7 +42,7 @@ app.get(["/@:name", "/get/@:name"],
|
|||||||
}),
|
}),
|
||||||
async (req, res) => {
|
async (req, res) => {
|
||||||
const { name } = req.params;
|
const { name } = req.params;
|
||||||
let { theme = "moebooru", ...rest } = req.query;
|
let { theme = "moebooru", num = 0, ...rest } = req.query;
|
||||||
|
|
||||||
// This helps with GitHub's image cache
|
// This helps with GitHub's image cache
|
||||||
res.set({
|
res.set({
|
||||||
@ -49,7 +50,7 @@ app.get(["/@:name", "/get/@:name"],
|
|||||||
"cache-control": "max-age=0, no-cache, no-store, must-revalidate",
|
"cache-control": "max-age=0, no-cache, no-store, must-revalidate",
|
||||||
});
|
});
|
||||||
|
|
||||||
const data = await getCountByName(name);
|
const data = await getCountByName(name, num);
|
||||||
|
|
||||||
if (name === "demo") {
|
if (name === "demo") {
|
||||||
res.set("cache-control", "max-age=31536000");
|
res.set("cache-control", "max-age=31536000");
|
||||||
@ -70,7 +71,7 @@ app.get(["/@:name", "/get/@:name"],
|
|||||||
|
|
||||||
console.log(
|
console.log(
|
||||||
data,
|
data,
|
||||||
`theme: ${theme}`,
|
{ theme, ...req.query },
|
||||||
`ip: ${req.headers['x-forwarded-for'] || req.connection.remoteAddress}`,
|
`ip: ${req.headers['x-forwarded-for'] || req.connection.remoteAddress}`,
|
||||||
`ref: ${req.get("Referrer") || null}`,
|
`ref: ${req.get("Referrer") || null}`,
|
||||||
`ua: ${req.get("User-Agent") || null}`
|
`ua: ${req.get("User-Agent") || null}`
|
||||||
@ -129,11 +130,13 @@ async function pushDB() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getCountByName(name) {
|
async function getCountByName(name, num) {
|
||||||
const defaultCount = { name, num: 0 };
|
const defaultCount = { name, num: 0 };
|
||||||
|
|
||||||
if (name === "demo") return { name, num: "0123456789" };
|
if (name === "demo") return { name, num: "0123456789" };
|
||||||
|
|
||||||
|
if (num > 0) { return { name, num } };
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!(name in __cache_counter)) {
|
if (!(name in __cache_counter)) {
|
||||||
const counter = (await db.getNum(name)) || defaultCount;
|
const counter = (await db.getNum(name)) || defaultCount;
|
||||||
|
@ -6,18 +6,26 @@ const mimeType = require('mime-types')
|
|||||||
const sizeOf = require('image-size')
|
const sizeOf = require('image-size')
|
||||||
|
|
||||||
const themePath = path.resolve(__dirname, '../assets/theme')
|
const themePath = path.resolve(__dirname, '../assets/theme')
|
||||||
|
const imgExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp']
|
||||||
|
|
||||||
const themeList = {}
|
const themeList = {}
|
||||||
|
|
||||||
fs.readdirSync(themePath).forEach(theme => {
|
fs.readdirSync(themePath).forEach(theme => {
|
||||||
|
const currentThemePath = path.resolve(themePath, theme)
|
||||||
|
// skip non-directory
|
||||||
|
if (!fs.statSync(currentThemePath).isDirectory()) return
|
||||||
|
|
||||||
if (!(theme in themeList)) themeList[theme] = {}
|
if (!(theme in themeList)) themeList[theme] = {}
|
||||||
const imgList = fs.readdirSync(path.resolve(themePath, theme))
|
const imgList = fs.readdirSync(currentThemePath)
|
||||||
imgList.forEach(img => {
|
imgList.forEach(img => {
|
||||||
const imgPath = path.resolve(themePath, theme, img)
|
// skip non-image files
|
||||||
const num = path.parse(img).name
|
if (!imgExts.includes(path.extname(img).toLowerCase())) return
|
||||||
|
|
||||||
|
const imgPath = path.resolve(currentThemePath, img)
|
||||||
|
const char = path.parse(img).name
|
||||||
const { width, height } = sizeOf(imgPath)
|
const { width, height } = sizeOf(imgPath)
|
||||||
|
|
||||||
themeList[theme][num] = {
|
themeList[theme][char] = {
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
data: convertToDatauri(imgPath)
|
data: convertToDatauri(imgPath)
|
||||||
|
@ -119,6 +119,14 @@ html
|
|||||||
option(value="auto", selected) auto
|
option(value="auto", selected) auto
|
||||||
option(value="1") yes
|
option(value="1") yes
|
||||||
option(value="0") no
|
option(value="0") no
|
||||||
|
tr
|
||||||
|
td(colspan=3)
|
||||||
|
h4.caption Unusual Options
|
||||||
|
tr
|
||||||
|
td: code num
|
||||||
|
td Set counter display number, 0 for disable, default is
|
||||||
|
code 0
|
||||||
|
td: input#num(type='number', value='0', min='0', max='1000000000000000', step='1', oninput='this.value = this.value.replace(/[^0-9]/g, "")')
|
||||||
|
|
||||||
button#get(onclick='_evt_push("click", "normal", "get_counter")') Generate
|
button#get(onclick='_evt_push("click", "normal", "get_counter")') Generate
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user