Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ Users interested in contributing to this repository should read this document be

# Running the Server

**Important:** Comment out lines 1-3 of [ip-filter.js](server\moderation\ip-filter.js) and add `const ips = [];` to that same file before running the server or you will get a MongoDB find error.

If you're interested in running the server locally or deploying a clone, please **contact me** on discord at [thedoge42](https://discord.com/users/298250592135020545) so I can give you (read-only) credentials to the MongoDB server.

1. Clone the repository and navigate to its root directory.
Expand Down
115 changes: 114 additions & 1 deletion client/head.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,117 @@
<title>QB Reader</title>
<title>QBReader</title>
<script>
(() => {
const path = location.pathname.replace(/\/index\.html$/, "").replace(/\/$/, "") || "/";
const titleMap = {
"/": "Home",
"/404.html": "Page Not Found",
"/about": "About",
"/about/tips.html": "About - Tips & Instructions",
"/about/privacy-policy.html": "About - Privacy Policy",
"/about/terms-of-service.html": "About - Terms of Service",
"/about/standard-format.html": "About - Standard Format",
"/db": "Database",
"/db/backups.html": "Database - Backups",
"/db/frequency-list": "Database - Frequency List",
"/db/frequency-list/subcategory.html": "Database - Frequency List - Subcategory",
"/db/set-list": "Database - Set List",
"/db/set": "Database - Set",
"/db/packet": "Database - Packet",
"/db/tossup": "Database - Tossups",
"/db/bonus": "Database - Bonuses",
"/admin": "Admin",
"/admin/category-reports": "Admin - Category Reports",
"/admin/geoword": "Admin - Geoword",
"/admin/geoword/category-stats.html": "Admin - Geoword - Category Stats",
"/admin/geoword/compare.html": "Admin - Geoword - Compare",
"/admin/geoword/leaderboard.html": "Admin - Geoword - Leaderboard",
"/admin/geoword/invoice.html": "Admin - Geoword - Invoice",
"/admin/geoword/manage-payments.html": "Admin - Geoword - Manage Payments",
"/admin/geoword/protests.html": "Admin - Geoword - Protests",
"/admin/geoword/stats.html": "Admin - Geoword - Stats",
"/admin/multiplayer": "Admin - Multiplayer",
"/admin/question-management/packet.html": "Admin - Question Management - Packet",
"/admin/question-management/set.html": "Admin - Question Management - Set",
"/admin/user-management/email.html": "Admin - User Management - Email",
"/play": "Play",
"/play/bonuses": "Play - Bonuses",
"/play/geoword": "Play - Geoword",
"/play/geoword/confirmation.html": "Play - Geoword - Confirmation",
"/play/geoword/division": "Play - Geoword - Division",
"/play/geoword/game": "Play - Geoword - Game",
"/play/geoword/login.html": "Play - Geoword - Login",
"/play/geoword/payment.html": "Play - Geoword - Payment",
"/play/geoword/results": "Play - Geoword - Results",
"/play/geoword/results/category-stats.html": "Play - Geoword - Results - Category Stats",
"/play/geoword/results/compare.html": "Play - Geoword - Results - Compare",
"/play/geoword/results/leaderboard.html": "Play - Geoword - Results - Leaderboard",
"/play/geoword/results/packet.html": "Play - Geoword - Results - Packet",
"/play/mp": "Play - Multiplayer",
"/play/mp/room.html": "Play - Multiplayer Room",
"/play/tossups": "Play - Tossups",
"/settings": "Settings",
"/tools/api-docs": "Tools - API Docs",
"/tools/api-docs/bonus.html": "Tools - API Docs - Bonus",
"/tools/api-docs/check-answer.html": "Tools - API Docs - Check Answer",
"/tools/api-docs/frequency-list.html": "Tools - API Docs - Frequency List",
"/tools/api-docs/index.html": "Tools - API Docs",
"/tools/api-docs/multiplayer/room-list.html": "Tools - API Docs - Multiplayer Room List",
"/tools/api-docs/num-packets.html": "Tools - API Docs - Number of Packets",
"/tools/api-docs/packet.html": "Tools - API Docs - Packet",
"/tools/api-docs/question-stats/bonus.html": "Tools - API Docs - Question Stats - Bonus",
"/tools/api-docs/question-stats/tossup.html": "Tools - API Docs - Question Stats - Tossup",
"/tools/api-docs/query.html": "Tools - API Docs - Query",
"/tools/api-docs/random-bonus.html": "Tools - API Docs - Random Bonus",
"/tools/api-docs/random-name.html": "Tools - API Docs - Random Name",
"/tools/api-docs/random-tossup.html": "Tools - API Docs - Random Tossup",
"/tools/api-docs/report-question.html": "Tools - API Docs - Report Question",
"/tools/api-docs/schemas": "Tools - API Docs - Schemas",
"/tools/api-docs/set-list.html": "Tools - API Docs - Set List",
"/tools/api-docs/tossup.html": "Tools - API Docs - Tossup",
"/tools/packet-parser": "Tools - Packet Parser",
"/tools/packet-viewer": "Tools - Packet Viewer",
"/tools/tb-splitter": "Tools - TB Splitter",
"/user": "User",
"/user/edit-password.html": "User - Edit Password",
"/user/edit-profile.html": "User - Edit Profile",
"/user/forgot-password.html": "User - Forgot Password",
"/user/login.html": "User - Login",
"/user/reset-password.html": "User - Reset Password",
"/user/signup.html": "User - Sign Up",
"/user/stars/bonuses.html": "User - Starred Bonuses",
"/user/stars/tossups.html": "User - Starred Tossups",
"/user/stats/bonus": "User - Bonus Stats",
"/user/stats/bonus/graph.html": "User - Bonus Stats - Graph",
"/user/stats/tossup": "User - Tossup Stats",
"/user/stats/tossup/graph.html": "User - Tossup Stats - Graph",
"/user/verify-failed.html": "User - Email Verification Failed"
};

const specificTitle = path === "/"
? "Home"
: (titleMap[path] ?? path
.split("/")
.filter(Boolean)
.map((segment) => segment
.replace(/\.html$/, "")
.replace(/-/g, " ")
.split(" ")
.filter(Boolean)
.map((word) => {
const normalized = word.toLowerCase();
if (normalized === "api") return "API";
if (normalized === "tb") return "TB";
if (normalized === "mp") return "Multiplayer";
if (normalized === "db") return "DB";
if (normalized === "qbreader") return "QBReader";
return normalized.charAt(0).toUpperCase() + normalized.slice(1);
})
.join(" "))
.join(" - "));

document.title = `QBReader - ${specificTitle}`;
})();
</script>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

Expand Down