import express, { Request, Response } from "express" import { json as bodyParserJson, urlencoded as bodyParserUrlEncoded, } from "body-parser" import cookieParser from "cookie-parser" import { Axios } from "axios" import * as fs from "fs" const sw = require("js-sensitivewords") /** * The server address without graphql path. */ const serverAddr = "http://47.97.110.29:10443" /* 2023 (c) Explode Team This script is licensed under MIT. This script is used to create a user-friendly website for registering the accounts of Dynamite Explode, with ability to block users with invalid or illegal names. */ initSensitiveWordList() const app = express() app.use(bodyParserJson()) app.use(bodyParserUrlEncoded({ extended: true })) app.use(cookieParser()) app.use(express.static(__dirname + "/public")) app.get("/", (req: Request, res: Response) => { res.render("layout") }) app.post("/register", async (req: Request, res: Response) => { try { let isRegistered = req.cookies.isRegistered if (isRegistered) { return res.send("服务器正在探索:利维坦,涅索斯轨道(请勿重复注册!)") } let username: string = req.body.RegisterUsername let password: string = req.body.RegisterPassword if (!username || !password) { return res.status(400).send("注册失败:无效的用户名或密码!") } if (sw.containsDfa(username)) { return res.status(500).send("服务器正在探索:过往灾祸,欧洲无人区(名字或密码带有敏感内容!)") } if (username.length < 4) { return res.status(400).send("账号太短啦~") } if (password.length < 4) { return res.status(400).send("密码太短啦~") } if (await explode_does_user_exists(username)) { return res.status(400).send("名字撞车啦!") } let hasId = await explode_register(username, password) if (hasId != null) { // 使用 cookie 避免重复注册 res.cookie("isRegistered", "1", { expires: new Date(Date.now() + 9000000), httpOnly: true, }) return res.send(`注册成功,用户ID:${hasId._id}。要记住哦!`) } else { return res.status(500).send("出错啦,注册失败了。") } } catch (e) { console.error(e) return res.status(500).send("服务器错误,请联系管理员!") } }) const server = app.listen(31234, () => console.log("Server is running...")) ////////// Interact with Explode Server const _axios = new Axios({}) type HasId = { _id: string } async function explode_graphql(query: string) { return _axios.post( `${serverAddr}/graphql`, // "http://192.168.1.199:10443/graphql", JSON.stringify({ operationName: "", query: query, variables: {}, }), { // idk why is this happening, but it just happened that // the response is string which should be transformed to JSON auto. transformResponse: (resp) => JSON.parse(resp), } ) } async function explode_register(username: string, password: string) { console.log(`Registering ${username}`) let response = await explode_graphql<{ data: { registerUser: HasId } }>( `mutation { registerUser(username: "${username}", password: "${password}") { _id } }` ) return response.data.data.registerUser } async function explode_does_user_exists(username: string) { let response = await explode_graphql<{ data: { userByUsername: HasId | undefined } }>(`query { userByUsername(username: "${username}") { _id } }`) return !!response.data.data.userByUsername } ////////// The Sensitive Words Blocking async function initSensitiveWordList() { console.log("Loading sensitive words") let words = fs .readFileSync( __dirname + "/tencent-sensitive-words/sensitive_words_lines.txt", { encoding: "utf-8" } ) .split("\n") sw.addWords(words) }