5 Commits

Author SHA1 Message Date
5f121e6894 userbar BBCode 2025-11-21 17:59:55 -05:00
3f0cde7ced speed up build time (better-sqlite3) 2025-11-21 17:56:01 -05:00
f767a9483b v4.1.6 2025-11-05 17:54:32 -05:00
b9a95f1c61 bump dependencies 2025-11-05 17:53:37 -05:00
bea25616a0 4.1.5 2025-10-09 23:30:54 -05:00
8 changed files with 498 additions and 426 deletions

View File

@@ -6,7 +6,7 @@ FROM baseimg AS build-env
WORKDIR /usr/notifier WORKDIR /usr/notifier
RUN pacman -Sy --noconfirm nodejs npm typescript python RUN pacman -Sy --noconfirm nodejs-lts-jod npm typescript python
COPY package*.json ./ COPY package*.json ./
@@ -28,7 +28,7 @@ HEALTHCHECK --timeout=15m \
EXPOSE 8080 EXPOSE 8080
RUN pacman -Sy --noconfirm curl artools-pkg artix-checkupdates git nodejs npm openssh icu glibc openssl openssl-1.1 &&\ RUN pacman -Sy --noconfirm curl artools-pkg artix-checkupdates git nodejs-lts-jod npm openssh icu glibc openssl openssl-1.1 &&\
mkdir -p /root/.config/artools/ /root/.cache/ && \ mkdir -p /root/.config/artools/ /root/.cache/ && \
useradd -m artix useradd -m artix

822
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "artix-checkupdates-web", "name": "artix-checkupdates-web",
"version": "4.1.4", "version": "4.1.7",
"description": "Determine packages that need attention", "description": "Determine packages that need attention",
"main": "./distribution/index.js", "main": "./distribution/index.js",
"type": "module", "type": "module",
@@ -30,26 +30,26 @@
}, },
"homepage": "https://github.com/CorySanin/artix-checkupdates-web#readme", "homepage": "https://github.com/CorySanin/artix-checkupdates-web#readme",
"dependencies": { "dependencies": {
"artix-checkupdates": "1.0.2", "artix-checkupdates": "1.1.0",
"better-sqlite3": "12.2.0", "better-sqlite3": "12.4.5",
"dayjs": "1.11.13", "dayjs": "1.11.19",
"ejs": "3.1.10", "ejs": "3.1.10",
"express": "5.1.0", "express": "5.1.0",
"express-useragent": "1.0.15", "express-useragent": "2.0.2",
"irc-framework": "4.14.0", "irc-framework": "4.14.0",
"json5": "2.2.3", "json5": "2.2.3",
"ky": "1.8.2", "ky": "1.14.0",
"node-cron": "4.2.1", "node-cron": "4.2.1",
"prom-client": "15.1.3", "prom-client": "15.1.3",
"sharp": "0.34.3" "sharp": "0.34.5"
}, },
"devDependencies": { "devDependencies": {
"@sindresorhus/tsconfig": "8.0.1", "@sindresorhus/tsconfig": "8.1.0",
"@types/better-sqlite3": "^7.6.13", "@types/better-sqlite3": "7.6.13",
"@types/express": "^5.0.3", "@types/express": "5.0.5",
"@types/express-useragent": "1.0.5", "@types/express-useragent": "1.0.5",
"@types/node": "^24.3.0", "@types/node": "^24.10.1",
"forking-build-shit": "1.0.1", "forking-build-shit":"1.0.5",
"typescript": "5.9.2" "typescript": "5.9.3"
} }
} }

View File

@@ -2,13 +2,12 @@ import fs from 'fs';
import * as fsp from 'node:fs/promises'; import * as fsp from 'node:fs/promises';
import { DB } from './db.mjs'; import { DB } from './db.mjs';
import express from 'express'; import express from 'express';
import exuseragent from 'express-useragent'; import * as useragent from 'express-useragent';
import prom from 'prom-client'; import prom from 'prom-client';
import sharp from 'sharp'; import sharp from 'sharp';
import * as path from 'path'; import * as path from 'path';
import type http from "http"; import type http from "http";
import type { Request, Response } from "express"; import type { Request, Response } from "express";
import type { Details } from "express-useragent";
import type { Config } from './config.js'; import type { Config } from './config.js';
import type { PackageDBEntry } from './db.mjs'; import type { PackageDBEntry } from './db.mjs';
import type { SaveData } from './daemon.mjs'; import type { SaveData } from './daemon.mjs';
@@ -132,11 +131,11 @@ class Web {
app.set('view engine', 'ejs'); app.set('view engine', 'ejs');
app.set('view options', VIEWOPTIONS); app.set('view options', VIEWOPTIONS);
app.use(exuseragent.express()); app.use(useragent.express());
function sendError(req: Request, res: Response, status: number, description: string) { function sendError(req: Request, res: Response, status: number, description: string) {
console.log(`${status} (${description}): ${req.url} requested by ${req.ip} "${req.headers['user-agent']}"`); console.log(`${status} (${description}): ${req.url} requested by ${req.ip} "${req.headers['user-agent']}"`);
if ((req.useragent as Details).browser === 'curl') { if (req.useragent?.browser === 'curl') {
res.send('404: not found\n'); res.send('404: not found\n');
return; return;
} }
@@ -179,7 +178,7 @@ class Web {
app.get('/', async (req, res) => { app.get('/', async (req, res) => {
let packages = prepPackages(saveData.move, 'Move'); let packages = prepPackages(saveData.move, 'Move');
packages = packages.concat(prepPackages(saveData.update, 'Update')); packages = packages.concat(prepPackages(saveData.update, 'Update'));
if ((req.useragent as Details).browser === 'curl') { if (req.useragent?.browser === 'curl') {
res.send(renderForCurl(packages)); res.send(renderForCurl(packages));
return; return;
} }
@@ -211,7 +210,7 @@ class Web {
let packages = prepPackages(db.getPackagesByMaintainer(maintainer, 'move'), 'Move'); let packages = prepPackages(db.getPackagesByMaintainer(maintainer, 'move'), 'Move');
packages = packages.concat(prepPackages(db.getPackagesByMaintainer(maintainer, 'udate'), 'Update')); packages = packages.concat(prepPackages(db.getPackagesByMaintainer(maintainer, 'udate'), 'Update'));
if (packagesOwned > 0) { if (packagesOwned > 0) {
if ((req.useragent as Details).browser === 'curl') { if (req.useragent?.browser === 'curl') {
res.send(`${maintainer}'s pending actions\n\n${renderForCurl(packages)}`); res.send(`${maintainer}'s pending actions\n\n${renderForCurl(packages)}`);
return; return;
} }
@@ -224,7 +223,8 @@ class Web {
}, },
maintainer, maintainer,
packagesOwned, packagesOwned,
packages packages,
userbar: `${req.protocol}://${req.host}/userbar/${maintainer}.png`
}, },
function (err, html) { function (err, html) {
if (!err) { if (!err) {

View File

@@ -52,12 +52,20 @@ p {
a { a {
text-decoration: none; text-decoration: none;
color: #53bffc; color: #53bffc;
&:focus,
&:hover {
text-decoration: underline;
}
} }
a:hover, a,
a:focus { details.userbar summary {
color: #92D7FC;
text-decoration: underline; &:focus,
&:hover {
color: #92D7FC;
}
} }
ul { ul {
@@ -152,6 +160,10 @@ table tr td:last-child {
min-width: 6em; min-width: 6em;
} }
details summary::marker {
display: inline;
}
.container { .container {
padding: .5em .75em; padding: .5em .75em;
width: 80%; width: 80%;
@@ -164,6 +176,34 @@ table tr td:last-child {
} }
} }
.userbar {
margin-top: 1em;
summary {
cursor: pointer;
display: list-item;
&>h5 {
display: inline;
}
}
textarea {
margin-top: .5em;
background-color: #1a1a1a;
color: inherit;
max-width: 100%;
width: 400px;
min-height: 70px;
border: 1px solid #858585;
}
img {
max-width: 100%;
height: auto;
}
}
@media screen and (max-width:910px) { @media screen and (max-width:910px) {
.container { .container {
width: initial; width: initial;

View File

@@ -9,6 +9,6 @@
<meta name="apple-mobile-web-app-title" content="Artix Checkupdates"> <meta name="apple-mobile-web-app-title" content="Artix Checkupdates">
<meta name="application-name" content="Artix Checkupdates"> <meta name="application-name" content="Artix Checkupdates">
<meta name="theme-color" content="#212121"> <meta name="theme-color" content="#212121">
<link rel="stylesheet" href="/assets/css/styles.css?v=3"> <link rel="stylesheet" href="/assets/css/styles.css?v=4">
<link rel="shortcut icon" href="/assets/svg/artix_logo.svg"> <link rel="shortcut icon" href="/assets/svg/artix_logo.svg">
</head> </head>

View File

@@ -29,6 +29,8 @@
</tr> </tr>
<% }); %> <% }); %>
</table> </table>
<%- include("userbar", {url: userbar}) %>
</div> </div>
<%- include("footer", locals) %> <%- include("footer", locals) %>
</body> </body>

6
views/userbar.ejs Normal file
View File

@@ -0,0 +1,6 @@
<details class="userbar">
<summary><h5>Dynamic Userbar BBCode</h5></summary>
<textarea readonly>[img width=350 height=61]<%= url %>[/img]</textarea>
<h6>Preview</h6>
<img height="61" width="350" src="<%= url %>" alt="Artix maintainer userbar preview" />
</details>