ms/packages/common/src/tellraw.ts

114 lines
2.3 KiB
TypeScript

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(texts: string) {
return this.hover(texts)
}
hover(texts: string) {
this.latest().hover("show_text", texts)
return this
}
item(item: string) {
this.latest().hover("show_item", item)
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(t => {
temp.push(t.convert())
})
this.cache = JSON.stringify(temp)
console.trace(this.cache)
}
return this.cache
}
string() {
var temp = ''
this.parts.forEach(t => {
temp += t.text
})
return temp
}
}
export default Tellraw