diff --git a/packages/common/src/proxy.ts b/packages/common/src/proxy.ts new file mode 100644 index 00000000..0db74357 --- /dev/null +++ b/packages/common/src/proxy.ts @@ -0,0 +1,27 @@ +let createProxy = eval(` + function(handle){ return new JSAdapter(handle) } +`) +export interface ProxyHandle { + get: (target: any, name: string) => any + set: (target: any, name: string, value: any) => void + construct: (target: any, ...args: any[]) => any + has: (target: any, name: string) => boolean + ownKeys: (target: any) => string[] + values: (target: any) => any[]; + call: (target: any, name: string, ...args: any[]) => any + delete: (target: any, name: string) => boolean +} +export class Proxy { + static newProxy(target: any, handle: Partial) { + return createProxy({ + __get__: (name: string) => handle.get ? handle.get(target, name) : target[name], + __put__: (name: string, value: any) => handle.set ? handle.set(target, name, value) : target[name] = value, + __call__: (name: string, ...args: any) => handle.call ? handle.call(target, name, ...args) : target[name](...args), + __new__: (...args: any) => handle.construct ? handle.construct(target, ...args) : new target(...args), + __getIds__: () => handle.ownKeys ? handle.ownKeys(target) : Object.keys(target), + __getValues__: () => handle.values ? handle.values(target) : Object.values(target), + __has__: (name: string) => handle.has ? handle.has(target, name) : Object.getOwnPropertyDescriptor(target, name) != undefined, + __delete__: (name: string) => handle.delete ? handle.delete(target, name) : delete target[name] + }) + } +} diff --git a/packages/common/src/tellraw.ts b/packages/common/src/tellraw.ts new file mode 100644 index 00000000..7ccdd462 --- /dev/null +++ b/packages/common/src/tellraw.ts @@ -0,0 +1,101 @@ +class ChatMessagePart { + private internal: any = {} + + get text() { + return this.internal.text + } + set text(text: string) { + this.internal.text = text + } + + click(action: string, value: string) { + this.internal.clickEvent = { action, value } + } + + hover(action: string, value: string) { + this.internal.hoverEvent = { action, value } + } + + convert() { + return this.internal; + } +} + +class Tellraw { + static duplicateChar = '§卐' + static create() { + return new Tellraw().then(Tellraw.duplicateChar); + } + + private cache: string = ''; + private parts = [new ChatMessagePart()]; + + then(part: ChatMessagePart | string) { + if (typeof part === "string") { + var newPart = new ChatMessagePart(); + newPart.text = part + this.then(newPart); + return this; + } + var last = this.latest(); + if (!last.text) { + last.text = part.text; + } else { + this.parts.push(part); + } + this.cache = null; + } + + text(text: string) { + this.latest().text = text; + return this; + } + + tip(text: string) { + this.latest().hover("show_text", text); + return this; + } + + item(text: string) { + this.latest().hover("show_item", text); + return this; + } + + command(command: string) { + this.latest().click("run_command", command); + return this; + } + + suggest(url: string) { + this.latest().click("suggest_command", url); + return this; + } + + file(path: string) { + this.latest().click("open_file", path); + return this; + } + + link(url: string) { + this.latest().click("open_url", url); + return this; + } + + latest() { + return this.parts[this.parts.length - 1]; + } + + json() { + if (!this.cache) { + var temp = []; + this.parts.forEach(function(t) { + temp.push(t.convert()); + }); + this.cache = JSON.stringify(temp); + console.trace(this.cache); + } + return this.cache; + } +} + +export default Tellraw