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") 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) => { 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("出错啦,注册失败了。") } }) const server = app.listen(8090, () => 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("http://43.142.173.63:10483/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) { 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) }