From e7077b1315434ca4f57419699c2aaa6b4253b0ba Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Tue, 22 Sep 2020 17:36:32 +0800 Subject: [PATCH] feat: add bungee proxy Signed-off-by: MiaoWoo --- packages/api/src/channel.ts | 154 +++++++++++++++++++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/packages/api/src/channel.ts b/packages/api/src/channel.ts index 88500fde..e800c9e2 100644 --- a/packages/api/src/channel.ts +++ b/packages/api/src/channel.ts @@ -1,4 +1,4 @@ -import { injectable } from "@ccms/container" +import { injectable, inject, provideSingleton } from "@ccms/container" export namespace channel { /** @@ -63,4 +63,156 @@ export namespace channel { */ abstract unregister(channel: string, listener?: any): void } + export namespace proxy { + const CHANNEL_NAME = "BungeeCord" + const ByteArrayOutputStream = Java.type('java.io.ByteArrayOutputStream') + const DataOutputStream = Java.type('java.io.DataOutputStream') + const ByteStreams = Java.type('com.google.common.io.ByteStreams') + namespace bungeecord { + export class SubChannelBuilder { + private channel: Channel + private player: any + private params: string[] + constructor(channel: Channel, player: any) { + this.channel = channel + this.player = player + this.params = [] + } + connect(server: string) { + this.params.push("Connect") + this.params.push(server) + } + connectOther(player: string, server: string) { + this.params.push("ConnectOther") + this.params.push(player) + this.params.push(server) + } + ip() { + this.params.push("IP") + } + ipOther(player: string) { + this.params.push("IPOther") + this.params.push(player) + } + playerCount(server: string | "ALL") { + this.params.push("PlayerCount") + this.params.push(server) + } + /** + * Get a list of players connected on a certain server, or on ALL the servers. + * @param server count server + * Response: + * String server = in.readUTF(); // The name of the server you got the player list of, as given in args. + * String[] playerList = in.readUTF().split(", "); + */ + playerList(server: string | "ALL") { + this.params.push("PlayerList") + this.params.push(server) + } + /** + * Get a list of server name strings, as defined in BungeeCord's config.yml + * Response: + * String[] serverList = in.readUTF().split(", "); + */ + getServers() { + this.params.push("GetServers") + return this.finalSend() + } + /** + * Get this server's name, as defined in BungeeCord's config.yml + */ + getServer() { + this.params.push("GetServer") + return this.finalSend() + } + broadcast(message: string) { + this.message("ALL", message) + return this.finalSend() + } + /** + * Send a message (as in, a chat message) to the specified player. + * @param player who reciver message + * @param message message content + */ + message(player: string | "ALL", message: string) { + this.params.push("Message") + this.params.push(player) + this.params.push(message) + return this.finalSend() + } + /** + * Send a raw message (as in, a chat message) to the specified player. The advantage of this method over Message is that you can include click events and hover events. + * @param player who reciver message + * @param message message content + */ + messageRaw(player: string | "ALL", json: string) { + this.params.push("MessageRaw") + this.params.push(player) + this.params.push(json) + return this.finalSend() + } + forwardAll(channel: string, data: any) { + this.forward("ALL", channel, data) + } + /** + * Send a custom plugin message to said server. This is one of the most useful channels ever. + * Remember, the sending and receiving server(s) need to have a player online. + * @param server reciver + * @param channel channelName + * @param data data + */ + forward(server: string | "ALL", channel: string, data: any) { + this.params.push("Forward") + this.params.push(server) + this.params.push(channel) + this.params.push(typeof data === "string" ? data : JSON.stringify(data)) + return this.finalSend() + } + /** + * Send a custom plugin message to said server. This is one of the most useful channels ever. + * Remember, the sending and receiving server(s) need to have a player online. + * @param server reciver + * @param channel channelName + * @param data data + */ + forwardToPlayer(server: string | "ALL", channel: string, data: any) { + this.params.push("Forward") + this.params.push(server) + this.params.push(channel) + this.params.push(typeof data === "string" ? data : JSON.stringify(data)) + return this.finalSend() + } + generic(...args: string[]) { + args && this.params.concat(...args) + return this.finalSend() + } + private send(...middlewares: ((out: java.io.DataOutputStream) => void)[]) { + let byteArray = new ByteArrayOutputStream() + let out = new DataOutputStream(byteArray) + this.params.forEach(utf => out.writeUTF(utf)) + for (let middleware of middlewares) { + middleware(out) + } + this.channel.send(this.player, CHANNEL_NAME, byteArray.toByteArray()) + } + private finalSend() { + return { + send: this.send.bind(this) + } + } + } + } + @provideSingleton(BungeeCord) + export class BungeeCord { + @inject(Channel) + private channel: Channel + /** + * 获得代理 + * @param player 玩家 + */ + for(player: any): bungeecord.SubChannelBuilder { + return new bungeecord.SubChannelBuilder(this.channel, player) + } + } + } }