mirror of
https://github.com/Grasscutters/Grasscutter.git
synced 2025-02-04 04:12:54 +08:00
Add system for setting handbook address and port
This commit is contained in:
parent
36a35c11aa
commit
a35ce5fecb
@ -7,6 +7,11 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
window["hide"] = ["quests", "achievements"];
|
window["hide"] = ["quests", "achievements"];
|
||||||
|
window["details"] = {
|
||||||
|
address: "{{DETAILS_ADDRESS}}",
|
||||||
|
port: "{{DETAILS_PORT}}",
|
||||||
|
disable: "{{DETAILS_DISABLE}}"
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
import type { CommandResponse } from "@backend/types";
|
import type { CommandResponse } from "@backend/types";
|
||||||
import emitter from "@backend/events";
|
import emitter from "@backend/events";
|
||||||
|
|
||||||
|
import { getWindowDetails } from "@app/utils";
|
||||||
|
|
||||||
let playerToken: string | null = null; // The session token for the player.
|
let playerToken: string | null = null; // The session token for the player.
|
||||||
export let targetPlayer = 0; // The UID of the target player.
|
export let targetPlayer = 0; // The UID of the target player.
|
||||||
|
|
||||||
// The server's address and port.
|
// The server's address and port.
|
||||||
export let address: string = "127.0.0.1",
|
export let address: string = getWindowDetails().address,
|
||||||
port: string = "443";
|
port: string = getWindowDetails().port.toString();
|
||||||
export let encrypted: boolean = true;
|
export let encrypted: boolean = true;
|
||||||
|
|
||||||
export let lockedPlayer = false; // Whether the UID field is locked.
|
export let lockedPlayer = false; // Whether the UID field is locked.
|
||||||
@ -16,6 +18,9 @@ export let connected = false; // Whether the server is connected.
|
|||||||
* Loads the server details from local storage.
|
* Loads the server details from local storage.
|
||||||
*/
|
*/
|
||||||
export function setup(): void {
|
export function setup(): void {
|
||||||
|
// Check if the server is disabled.
|
||||||
|
if (getWindowDetails().disable) return;
|
||||||
|
|
||||||
// Load the server details from local storage.
|
// Load the server details from local storage.
|
||||||
const storedAddress = localStorage.getItem("address");
|
const storedAddress = localStorage.getItem("address");
|
||||||
const storedPort = localStorage.getItem("port");
|
const storedPort = localStorage.getItem("port");
|
||||||
|
@ -135,6 +135,12 @@ export type CommandResponse = {
|
|||||||
message: string;
|
message: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type WindowDetails = {
|
||||||
|
address: string,
|
||||||
|
port: number,
|
||||||
|
disable: boolean
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if a string is a page.
|
* Checks if a string is a page.
|
||||||
*
|
*
|
||||||
|
@ -4,6 +4,7 @@ import emitter from "@backend/events";
|
|||||||
import { targetPlayer, address, port, setServerDetails, url, setTargetPlayer } from "@backend/server";
|
import { targetPlayer, address, port, setServerDetails, url, setTargetPlayer } from "@backend/server";
|
||||||
|
|
||||||
import "@css/widgets/ServerSettings.scss";
|
import "@css/widgets/ServerSettings.scss";
|
||||||
|
import { getWindowDetails } from "@app/utils";
|
||||||
|
|
||||||
interface IState {
|
interface IState {
|
||||||
webview: boolean;
|
webview: boolean;
|
||||||
@ -97,6 +98,8 @@ class ServerSettings extends React.Component<{}, IState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
|
const { disable } = getWindowDetails();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={"ServerSettings"}>
|
<div className={"ServerSettings"}>
|
||||||
{this.state.webview ? (
|
{this.state.webview ? (
|
||||||
@ -109,7 +112,14 @@ class ServerSettings extends React.Component<{}, IState> {
|
|||||||
<div className={"ServerSettings_Content ServerSettings_Top"}>
|
<div className={"ServerSettings_Content ServerSettings_Top"}>
|
||||||
<h1 className={"ServerSettings_Title"}>Server Settings</h1>
|
<h1 className={"ServerSettings_Title"}>Server Settings</h1>
|
||||||
|
|
||||||
<div className={"ServerSettings_Details"}>
|
<div
|
||||||
|
className={"ServerSettings_Details"}
|
||||||
|
style={{
|
||||||
|
opacity: disable ? 0.5 : 1,
|
||||||
|
cursor: disable ? "not-allowed" : "default",
|
||||||
|
userSelect: disable ? "none" : "auto"
|
||||||
|
}}
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<p>Address:</p>
|
<p>Address:</p>
|
||||||
<input
|
<input
|
||||||
@ -121,6 +131,10 @@ class ServerSettings extends React.Component<{}, IState> {
|
|||||||
|
|
||||||
this.setState({ address: value });
|
this.setState({ address: value });
|
||||||
}}
|
}}
|
||||||
|
disabled={disable}
|
||||||
|
style={{
|
||||||
|
cursor: disable ? "not-allowed" : "text"
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -139,6 +153,10 @@ class ServerSettings extends React.Component<{}, IState> {
|
|||||||
|
|
||||||
this.setState({ port: Number(value) });
|
this.setState({ port: Number(value) });
|
||||||
}}
|
}}
|
||||||
|
disabled={disable}
|
||||||
|
style={{
|
||||||
|
cursor: disable ? "not-allowed" : "text"
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { Entity, Item, EntityInfo, ItemInfo } from "@backend/types";
|
import type { Entity, Item, EntityInfo, ItemInfo, WindowDetails } from "@backend/types";
|
||||||
import { ItemType, Quality } from "@backend/types";
|
import { ItemType, Quality } from "@backend/types";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -165,3 +165,20 @@ export function notNaN(value: number | string): string {
|
|||||||
const number = parseInt(value.toString());
|
const number = parseInt(value.toString());
|
||||||
return isNaN(number) ? "" : number.toString();
|
return isNaN(number) ? "" : number.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the server details out of the window.
|
||||||
|
*/
|
||||||
|
export function getWindowDetails(): WindowDetails {
|
||||||
|
const details = (window as any).details;
|
||||||
|
const { address, port, disable } = details;
|
||||||
|
|
||||||
|
return {
|
||||||
|
address: address == "{{DETAILS_ADDRESS}}" ?
|
||||||
|
"127.0.0.1" : address,
|
||||||
|
port: port == "{{DETAILS_PORT}}" ?
|
||||||
|
443 : parseInt(port),
|
||||||
|
disable: disable == "{{DETAILS_DISABLE}}" ?
|
||||||
|
false : disable == "true"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
@ -32,9 +32,11 @@ public class ConfigContainer {
|
|||||||
* The field for 'legacyResources' has been removed.
|
* The field for 'legacyResources' has been removed.
|
||||||
* Version 7 - 'regionKey' is being added for authentication
|
* Version 7 - 'regionKey' is being added for authentication
|
||||||
* with the new dispatch server.
|
* with the new dispatch server.
|
||||||
|
* Version 8 - 'server' is being added for enforcing handbook server
|
||||||
|
* addresses.
|
||||||
*/
|
*/
|
||||||
private static int version() {
|
private static int version() {
|
||||||
return 7;
|
return 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -299,9 +301,19 @@ public class ConfigContainer {
|
|||||||
|
|
||||||
public static class HandbookOptions {
|
public static class HandbookOptions {
|
||||||
public boolean enable = false;
|
public boolean enable = false;
|
||||||
|
|
||||||
public boolean allowCommands = true;
|
public boolean allowCommands = true;
|
||||||
public int maxRequests = 10;
|
public int maxRequests = 10;
|
||||||
public int maxEntities = 100;
|
public int maxEntities = 100;
|
||||||
|
|
||||||
|
public Server server = new Server();
|
||||||
|
|
||||||
|
public static class Server {
|
||||||
|
public boolean enforced = false;
|
||||||
|
public String address = "127.0.0.1";
|
||||||
|
public int port = 443;
|
||||||
|
public boolean canChange = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ import static emu.grasscutter.config.Configuration.HANDBOOK;
|
|||||||
|
|
||||||
/** Handles requests for the new GM Handbook. */
|
/** Handles requests for the new GM Handbook. */
|
||||||
public final class HandbookHandler implements Router {
|
public final class HandbookHandler implements Router {
|
||||||
private final byte[] handbook;
|
private String handbook;
|
||||||
private final boolean serve;
|
private final boolean serve;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -23,8 +23,16 @@ public final class HandbookHandler implements Router {
|
|||||||
* found.
|
* found.
|
||||||
*/
|
*/
|
||||||
public HandbookHandler() {
|
public HandbookHandler() {
|
||||||
this.handbook = FileUtils.readResource("/html/handbook.html");
|
this.handbook = new String(FileUtils.readResource("/html/handbook.html"));
|
||||||
this.serve = HANDBOOK.enable && this.handbook.length > 0;
|
this.serve = HANDBOOK.enable && this.handbook.length() > 0;
|
||||||
|
|
||||||
|
var server = HANDBOOK.server;
|
||||||
|
if (this.serve && server.enforced) {
|
||||||
|
this.handbook = this.handbook
|
||||||
|
.replace("{{DETAILS_ADDRESS}}", server.address)
|
||||||
|
.replace("{{DETAILS_PORT}}", String.valueOf(server.port))
|
||||||
|
.replace("{{DETAILS_DISABLE}}", Boolean.toString(server.canChange));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -48,7 +56,7 @@ public final class HandbookHandler implements Router {
|
|||||||
* @return True if the server can execute handbook commands.
|
* @return True if the server can execute handbook commands.
|
||||||
*/
|
*/
|
||||||
private boolean controlSupported() {
|
private boolean controlSupported() {
|
||||||
return HANDBOOK.enable;
|
return HANDBOOK.enable && HANDBOOK.allowCommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -61,7 +69,9 @@ public final class HandbookHandler implements Router {
|
|||||||
if (!this.serve) {
|
if (!this.serve) {
|
||||||
ctx.status(500).result("Handbook not found.");
|
ctx.status(500).result("Handbook not found.");
|
||||||
} else {
|
} else {
|
||||||
ctx.contentType("text/html").result(this.handbook);
|
ctx
|
||||||
|
.contentType(ContentType.TEXT_HTML)
|
||||||
|
.result(this.handbook);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,8 +112,7 @@ public final class HandbookHandler implements Router {
|
|||||||
} else {
|
} else {
|
||||||
ctx.status(result.getStatus())
|
ctx.status(result.getStatus())
|
||||||
.result(result.getBody())
|
.result(result.getBody())
|
||||||
.contentType(
|
.contentType(result.isHtml() ? ContentType.TEXT_HTML : ContentType.TEXT_PLAIN);
|
||||||
result.isHtml() ? ContentType.TEXT_HTML : ContentType.TEXT_PLAIN);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user