v8.0
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import express from "express";
|
||||
import * as os from "os";
|
||||
import config from "../config.js";
|
||||
import { NetworkInterfaceDetails } from "types/types";
|
||||
|
||||
// バックエンドルーティング
|
||||
import CommandExecute from "./route/command.js";
|
||||
import ueusePost from "./route/ueuse.js";
|
||||
import WeatherUeuse from "./route/weather.js";
|
||||
import API from "./route/api.js";
|
||||
|
||||
AdminPanel();
|
||||
|
||||
export default async function AdminPanel() {
|
||||
// 無効
|
||||
if (!config.admin.panel.isEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 管理パネル
|
||||
const app = express();
|
||||
const port = config.admin.panel.port;
|
||||
|
||||
// ルーティング
|
||||
app.use(ueusePost);
|
||||
app.use(CommandExecute);
|
||||
app.use(WeatherUeuse);
|
||||
app.use(API);
|
||||
app.use(express.static("panel/public"));
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`http://${LocalIP()}:${port} で管理パネルを起動しました`);
|
||||
});
|
||||
}
|
||||
|
||||
function LocalIP() {
|
||||
const interfaces = os.networkInterfaces();
|
||||
|
||||
for (const name in interfaces) {
|
||||
const iface: any = interfaces[name];
|
||||
|
||||
for (const i of iface) {
|
||||
const details: NetworkInterfaceDetails = i;
|
||||
|
||||
if (details.family === 'IPv4' && details.internal !== true) {
|
||||
return details.address;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "localhost";
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>管理パネル</title>
|
||||
|
||||
<!-- パッケージ -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
|
||||
<script src="https://code.iconify.design/iconify-icon/3.0.0/iconify-icon.min.js"></script>
|
||||
<script>
|
||||
import "iconify-icon";
|
||||
</script>
|
||||
</head>
|
||||
<body class="dark:bg-gray-950 dark:text-white text-center">
|
||||
<h1 class="text-4xl font-bold">noticeUwuzu管理パネル</h1>
|
||||
|
||||
<button id="commandExec" class="border rounded-[10px] p-[5px] m-[10px] mt-[20px] cursor-pointer">
|
||||
コマンド実行
|
||||
</button>
|
||||
|
||||
<button id="weatherUeuse" class="border rounded-[10px] p-[5px] m-[10px] mt-[20px] cursor-pointer">
|
||||
天気お知らせ
|
||||
</button>
|
||||
|
||||
<button id="ueuse" class="border rounded-[10px] p-[5px] m-[10px] mt-[20px] cursor-pointer">
|
||||
ユーズ投稿
|
||||
</button>
|
||||
|
||||
<button id="api" class="border rounded-[10px] p-[5px] m-[10px] mt-[20px] cursor-pointer">
|
||||
API使用
|
||||
</button>
|
||||
|
||||
<script src="/script.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,88 @@
|
||||
document.getElementById("commandExec").addEventListener("click", async () => {
|
||||
const req = await fetch("/actions/command-execute", {
|
||||
method: "POST",
|
||||
});
|
||||
|
||||
const res = await req.text();
|
||||
|
||||
if (res === "Accepted") {
|
||||
alert("コマンド実行を受け付けました");
|
||||
} else {
|
||||
alert(`コマンド実行の要求にエラーが発生しました:${res}`);
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("weatherUeuse").addEventListener("click", async () => {
|
||||
const req = await fetch("/actions/weatherUeuse", {
|
||||
method: "POST",
|
||||
});
|
||||
|
||||
const res = await req.text();
|
||||
|
||||
if (res === "Accepted") {
|
||||
alert("天気お知らせを受け付けました");
|
||||
} else {
|
||||
alert(`天気お知らせの要求にエラーが発生しました:${res}`);
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("ueuse").addEventListener("click", async () => {
|
||||
const text = prompt("ユーズ内容").toLowerCase();
|
||||
|
||||
if (text === "") {
|
||||
alert("ユーズ内容がありません。");
|
||||
return;
|
||||
}
|
||||
|
||||
const nsfw = confirm("NSFWにしますか?");
|
||||
|
||||
const req = await fetch("/actions/ueuse", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
text, text,
|
||||
nsfw: nsfw,
|
||||
}),
|
||||
});
|
||||
|
||||
const res = await req.text();
|
||||
|
||||
if (res === "Success") {
|
||||
alert("ユーズ投稿を受け付けました");
|
||||
} else {
|
||||
alert(`ユーズ投稿の要求にエラーが発生しました:${res}`);
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("api").addEventListener("click", async () => {
|
||||
const endpoint = prompt("エンドポイント", "/serverinfo-api").toLowerCase();
|
||||
|
||||
if (endpoint === "") {
|
||||
alert("エンドポイントが設定されていません。");
|
||||
return;
|
||||
}
|
||||
|
||||
const body = prompt("body(JSON)", `{"key": "value"}`).toLowerCase();
|
||||
|
||||
if (body === "") {
|
||||
alert("bodyが設定されていません。");
|
||||
return;
|
||||
}
|
||||
|
||||
const req = await fetch("/actions/api", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
endpoint: endpoint,
|
||||
body: JSON.parse(body),
|
||||
}),
|
||||
});
|
||||
|
||||
const res = await req.text();
|
||||
|
||||
alert(res);
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
import express from "express";
|
||||
const API = express.Router();
|
||||
|
||||
import config from "../../config.js";
|
||||
|
||||
API.use(express.json());
|
||||
API.use(express.urlencoded({ extended: true }));
|
||||
|
||||
API.post("/actions/api", async (req, res, next) => {
|
||||
const endpoint = req.body.endpoint;
|
||||
let body = req.body.body
|
||||
body["token"] = config.uwuzu.apiToken;
|
||||
|
||||
try {
|
||||
const apiReq = await fetch(`https://${config.uwuzu.host}/api${endpoint}`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify(body),
|
||||
});
|
||||
|
||||
const apiRes = await apiReq.json();
|
||||
|
||||
res.status(200)
|
||||
.send(apiRes);
|
||||
} catch(err) {
|
||||
res.status(500)
|
||||
.send(`Error: ${err}`);
|
||||
}
|
||||
});
|
||||
|
||||
API.get("/actions/api", (req, res) => {
|
||||
res.status(501)
|
||||
.send("POST Only");
|
||||
});
|
||||
|
||||
export default API;
|
||||
@@ -0,0 +1,25 @@
|
||||
import express from "express";
|
||||
const CommandExecute = express.Router();
|
||||
|
||||
import Commands from "../../scripts/commands/main.js";
|
||||
|
||||
CommandExecute.post("/actions/command-execute", (req, res) => {
|
||||
try {
|
||||
(async () => {
|
||||
await Commands();
|
||||
})();
|
||||
|
||||
res.status(202)
|
||||
.send("Accepted");
|
||||
} catch(err) {
|
||||
res.status(500)
|
||||
.send(`Error: ${err}`);
|
||||
}
|
||||
});
|
||||
|
||||
CommandExecute.get("/actions/command-execute", (req, res) => {
|
||||
res.status(501)
|
||||
.send("POST Only");
|
||||
});
|
||||
|
||||
export default CommandExecute;
|
||||
@@ -0,0 +1,40 @@
|
||||
import express from "express";
|
||||
const ueusePost = express.Router();
|
||||
|
||||
import config from "../../config.js";
|
||||
|
||||
ueusePost.use(express.json());
|
||||
ueusePost.use(express.urlencoded({ extended: true }));
|
||||
|
||||
ueusePost.post("/actions/ueuse", async (req, res, next) => {
|
||||
const text = req.body.text;
|
||||
const nsfw = req.body.nsfw;
|
||||
|
||||
try {
|
||||
const ueuseReq = await fetch(`https://${config.uwuzu.host}/api/ueuse/create`, {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
token: config.uwuzu.apiToken,
|
||||
text: text,
|
||||
nsfw: nsfw,
|
||||
}),
|
||||
});
|
||||
|
||||
const ueuseRes = await ueuseReq.json();
|
||||
|
||||
console.log(`ユーズ(管理パネル):${ueuseRes}`);
|
||||
|
||||
res.status(200)
|
||||
.send("Success");
|
||||
} catch(err) {
|
||||
res.status(500)
|
||||
.send(`Error: ${err}`);
|
||||
}
|
||||
});
|
||||
|
||||
ueusePost.get("/actions/ueuse", (req, res) => {
|
||||
res.status(501)
|
||||
.send("POST Only");
|
||||
});
|
||||
|
||||
export default ueusePost;
|
||||
@@ -0,0 +1,25 @@
|
||||
import express from "express";
|
||||
const WeatherUeuse = express.Router();
|
||||
|
||||
import { weatherNotice } from "../../scripts/weatherNotice.js";
|
||||
|
||||
WeatherUeuse.post("/actions/command-execute", (req, res) => {
|
||||
try {
|
||||
(async () => {
|
||||
await weatherNotice();
|
||||
})();
|
||||
|
||||
res.status(202)
|
||||
.send("Accepted");
|
||||
} catch(err) {
|
||||
res.status(500)
|
||||
.send(`Error: ${err}`);
|
||||
}
|
||||
});
|
||||
|
||||
WeatherUeuse.get("/actions/command-execute", (req, res) => {
|
||||
res.status(501)
|
||||
.send("POST Only");
|
||||
});
|
||||
|
||||
export default WeatherUeuse;
|
||||
Reference in New Issue
Block a user