From 51fb5aece30db2f38bfa2bdb0288d59a699e13e6 Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Thu, 24 Sep 2020 10:31:20 +0800 Subject: [PATCH] refactor: extract proxy & fix bungee chaneel Signed-off-by: MiaoWoo --- packages/api/src/channel.ts | 154 +------------------------------ packages/api/src/index.ts | 1 + packages/api/src/proxy.ts | 160 +++++++++++++++++++++++++++++++++ packages/bungee/src/channel.ts | 12 +-- 4 files changed, 168 insertions(+), 159 deletions(-) create mode 100644 packages/api/src/proxy.ts diff --git a/packages/api/src/channel.ts b/packages/api/src/channel.ts index e800c9e2..88500fde 100644 --- a/packages/api/src/channel.ts +++ b/packages/api/src/channel.ts @@ -1,4 +1,4 @@ -import { injectable, inject, provideSingleton } from "@ccms/container" +import { injectable } from "@ccms/container" export namespace channel { /** @@ -63,156 +63,4 @@ 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) - } - } - } } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 7af3f6f8..01b84754 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -3,6 +3,7 @@ import "@ccms/nashorn" export * from './chat' export * from './task' export * from './event' +export * from './proxy' export * from './console' export * from './channel' export * from './command' diff --git a/packages/api/src/proxy.ts b/packages/api/src/proxy.ts new file mode 100644 index 00000000..809816b6 --- /dev/null +++ b/packages/api/src/proxy.ts @@ -0,0 +1,160 @@ +import { provideSingleton, Autowired } from '@ccms/container' +import { channel } from './channel' + +export namespace proxy { + const ByteArrayOutputStream = Java.type('java.io.ByteArrayOutputStream') + const DataOutputStream = Java.type('java.io.DataOutputStream') + namespace bungeecord { + const CHANNEL_NAME = "BungeeCord" + export class SubChannelBuilder { + private channel: channel.Channel + private player: any + private params: string[] + constructor(channel: channel.Channel, player: any) { + this.channel = channel + this.player = player + this.params = [] + } + connect(server: string) { + this.params.push("Connect") + this.params.push(server) + return this.finalSend() + } + connectOther(player: string, server: string) { + this.params.push("ConnectOther") + this.params.push(player) + this.params.push(server) + return this.finalSend() + } + ip() { + this.params.push("IP") + return this.finalSend() + } + ipOther(player: string) { + this.params.push("IPOther") + this.params.push(player) + return this.finalSend() + } + playerCount(server: string | "ALL") { + this.params.push("PlayerCount") + this.params.push(server) + return this.finalSend() + } + /** + * 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) + return this.finalSend() + } + /** + * 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) { + return 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) + } + return this.channel.send(this.player, CHANNEL_NAME, byteArray.toByteArray()) + } + private finalSend() { + return { + send: this.send.bind(this) + } + } + } + } + @provideSingleton(BungeeCord) + export class BungeeCord { + @Autowired() + private channel: channel.Channel + /** + * 获得代理 + * @param player 玩家 + */ + for(player: any): bungeecord.SubChannelBuilder { + return new bungeecord.SubChannelBuilder(this.channel, player) + } + } +} \ No newline at end of file diff --git a/packages/bungee/src/channel.ts b/packages/bungee/src/channel.ts index 3cca0400..e3b85bb0 100644 --- a/packages/bungee/src/channel.ts +++ b/packages/bungee/src/channel.ts @@ -6,20 +6,20 @@ const Bungee: net.md_5.bungee.api.ProxyServer = base.getInstance().getProxy() @provideSingleton(channel.Channel) export class BungeeChannel extends channel.Channel { @inject(event.Event) - private eventManager: event.Event; + private eventManager: event.Event send(player: any, channel: string, data: any) { - throw new Error("Method not implemented."); + throw new Error("Method not implemented.") } register(channel: string, listener: channel.ChannelListener) { - Bungee.registerChannel(channel); + Bungee.registerChannel(channel) // console.console('§6[§eWARN§6] §eMiaoScript channel in BungeeCord only register. you need self hanler PluginMessageEvent!') return this.eventManager.listen({ description: { name: channel } }, "PluginMessageEvent", (event: net.md_5.bungee.api.event.PluginMessageEvent) => { listener(event.getData(), event) }) } - unregister(channel: string, listener: any) { - Bungee.unregisterChannel(channel); - listener.off(); + unregister(channel: string, off: any) { + Bungee.unregisterChannel(channel) + off() } }