ClickEvent and HoverEvent support of /chat package
This commit is contained in:
@ -1,11 +1,13 @@
|
|||||||
// Package chat implements Minecraft's chat message encoding system.
|
// Package chat implements Minecraft's chat message encoding system.
|
||||||
//
|
//
|
||||||
// The type Message is the Minecraft chat message. Can be encode as JSON
|
// The type Message is the Minecraft chat message. Can be encoded as JSON
|
||||||
// or net/packet.Field .
|
// or net/packet.Field .
|
||||||
//
|
//
|
||||||
// It's very recommended that use SetLanguage before using Message.String or Message.ClearString,
|
// It's very recommended that use SetLanguage before using Message.String or Message.ClearString,
|
||||||
// or the `github.com/Tnze/go-mc/data/en-us` will be used.
|
// or the `github.com/Tnze/go-mc/data/en-us` will be used.
|
||||||
// Note: The package of data/lang/... will SetLanguage on theirs init() so you don't need to call by your self.
|
// Note: The package of data/lang/... will SetLanguage on theirs init() so you don't need to call by your self.
|
||||||
|
//
|
||||||
|
// Some of these docs is copied from https://wiki.vg/Chat.
|
||||||
package chat
|
package chat
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -20,9 +22,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Message is a message sent by other
|
// Message is a message sent by other
|
||||||
type Message jsonChat
|
type Message struct {
|
||||||
|
|
||||||
type jsonChat struct {
|
|
||||||
Text string `json:"text,omitempty"`
|
Text string `json:"text,omitempty"`
|
||||||
|
|
||||||
Bold bool `json:"bold,omitempty"` //粗体
|
Bold bool `json:"bold,omitempty"` //粗体
|
||||||
@ -30,22 +30,36 @@ type jsonChat struct {
|
|||||||
UnderLined bool `json:"underlined,omitempty"` //下划线
|
UnderLined bool `json:"underlined,omitempty"` //下划线
|
||||||
StrikeThrough bool `json:"strikethrough,omitempty"` //删除线
|
StrikeThrough bool `json:"strikethrough,omitempty"` //删除线
|
||||||
Obfuscated bool `json:"obfuscated,omitempty"` //随机
|
Obfuscated bool `json:"obfuscated,omitempty"` //随机
|
||||||
Color string `json:"color,omitempty"`
|
// Font of the message, could be one of minecraft:uniform, minecraft:alt or minecraft:default
|
||||||
|
// This option is only valid on 1.16+, otherwise the property is ignored.
|
||||||
|
Font string `json:"font,omitempty"` //字体
|
||||||
|
Color string `json:"color,omitempty"` //颜色
|
||||||
|
|
||||||
|
// Insertion contains text to insert. Only used for messages in chat.
|
||||||
|
// When shift is held, clicking the component inserts the given text
|
||||||
|
// into the chat box at the cursor (potentially replacing selected text).
|
||||||
|
Insertion string `json:"insertion,omitempty"`
|
||||||
|
ClickEvent *ClickEvent `json:"clickEvent,omitempty"`
|
||||||
|
HoverEvent *HoverEvent `json:"hoverEvent,omitempty"`
|
||||||
|
|
||||||
Translate string `json:"translate,omitempty"`
|
Translate string `json:"translate,omitempty"`
|
||||||
With []json.RawMessage `json:"with,omitempty"` // How can go handle an JSON array with Object and String?
|
With []json.RawMessage `json:"with,omitempty"`
|
||||||
Extra []Message `json:"extra,omitempty"`
|
Extra []Message `json:"extra,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type jsonMsg Message
|
||||||
|
|
||||||
//UnmarshalJSON decode json to Message
|
//UnmarshalJSON decode json to Message
|
||||||
func (m *Message) UnmarshalJSON(jsonMsg []byte) (err error) {
|
func (m *Message) UnmarshalJSON(raw []byte) (err error) {
|
||||||
if len(jsonMsg) == 0 {
|
if len(raw) == 0 {
|
||||||
return io.EOF
|
return io.EOF
|
||||||
}
|
}
|
||||||
if jsonMsg[0] == '"' {
|
// The right way to distinguish JSON String and Object
|
||||||
err = json.Unmarshal(jsonMsg, &m.Text) //Unmarshal as jsonString
|
// is to look up the first character.
|
||||||
|
if raw[0] == '"' {
|
||||||
|
err = json.Unmarshal(raw, &m.Text) // Unmarshal as jsonString
|
||||||
} else {
|
} else {
|
||||||
err = json.Unmarshal(jsonMsg, (*jsonChat)(m)) //Unmarshal as jsonChat
|
err = json.Unmarshal(raw, (*jsonMsg)(m)) // Unmarshal as jsonMsg
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -142,7 +156,7 @@ var colors = map[string]string{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// translateMap is the translation table.
|
// translateMap is the translation table.
|
||||||
// By default it's en-us.
|
// By default, it's en-us.
|
||||||
var translateMap = en_us.Map
|
var translateMap = en_us.Map
|
||||||
|
|
||||||
// SetLanguage set the translate map to this map.
|
// SetLanguage set the translate map to this map.
|
||||||
@ -182,7 +196,7 @@ func (m Message) ClearString() string {
|
|||||||
|
|
||||||
// String return the message string with escape sequence for ansi color.
|
// String return the message string with escape sequence for ansi color.
|
||||||
// To convert Translated Message to string, you must set
|
// To convert Translated Message to string, you must set
|
||||||
// On windows, you may want print this string using github.com/matte/go-colorable.
|
// On Windows, you may want print this string using github.com/matte/go-colorable.
|
||||||
func (m Message) String() string {
|
func (m Message) String() string {
|
||||||
var msg, format strings.Builder
|
var msg, format strings.Builder
|
||||||
if m.Bold {
|
if m.Bold {
|
||||||
|
61
chat/clickevent.go
Normal file
61
chat/clickevent.go
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package chat
|
||||||
|
|
||||||
|
import "strconv"
|
||||||
|
|
||||||
|
// ClickEvent defines an event that occurs when this component is clicked.
|
||||||
|
type ClickEvent struct {
|
||||||
|
Action string `json:"action"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// OpenURL create a ClickEvent opens the given URL in the default web browser.
|
||||||
|
// Ignored if the player has opted to disable links in chat;
|
||||||
|
// may open a GUI prompting the user if the setting for that is enabled.
|
||||||
|
// The link's protocol must be set and must be http or https, for security reasons.
|
||||||
|
func OpenURL(url string) *ClickEvent {
|
||||||
|
return &ClickEvent{
|
||||||
|
Action: "open_url",
|
||||||
|
Value: url,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RunCommand create a ClickEvent runs the given command. Not required to be a command -
|
||||||
|
// clicking this only causes the client to send the given content as a chat message,
|
||||||
|
// so if not prefixed with /, they will say the given text instead.
|
||||||
|
// If used in a book GUI, the GUI is closed after clicking.
|
||||||
|
func RunCommand(cmd string) *ClickEvent {
|
||||||
|
return &ClickEvent{
|
||||||
|
Action: "run_command",
|
||||||
|
Value: cmd,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SuggestCommand create a ClickEvent replaces the content of the chat box with the given text -
|
||||||
|
// usually a command, but it is not required to be a command
|
||||||
|
// (commands should be prefixed with /).
|
||||||
|
// This is only usable for messages in chat.
|
||||||
|
func SuggestCommand(cmd string) *ClickEvent {
|
||||||
|
return &ClickEvent{
|
||||||
|
Action: "suggest_command",
|
||||||
|
Value: cmd,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangePage create a ClickEvent usable within written books.
|
||||||
|
// Changes the page of the book to the given page, starting at 1.
|
||||||
|
// For instance, "value":1 switches the book to the first page.
|
||||||
|
// If the page is less than one or beyond the number of pages in the book, the event is ignored.
|
||||||
|
func ChangePage(page int) *ClickEvent {
|
||||||
|
return &ClickEvent{
|
||||||
|
Action: "change_page",
|
||||||
|
Value: strconv.Itoa(page),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// CopyToClipboard create a ClickEvent copies the given text to the client's clipboard when clicked.
|
||||||
|
func CopyToClipboard(text string) *ClickEvent {
|
||||||
|
return &ClickEvent{
|
||||||
|
Action: "copy_to_clipboard",
|
||||||
|
Value: text,
|
||||||
|
}
|
||||||
|
}
|
34
chat/hoverevent.go
Normal file
34
chat/hoverevent.go
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
package chat
|
||||||
|
|
||||||
|
// HoverEvent defines an event that occurs when this component hovered over.
|
||||||
|
type HoverEvent struct {
|
||||||
|
Action string `json:"action"`
|
||||||
|
Value Message `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShowText show the text to display.
|
||||||
|
func ShowText(text Message) *HoverEvent {
|
||||||
|
return &HoverEvent{
|
||||||
|
Action: "show_text",
|
||||||
|
Value: text,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShowItem show the item to display.
|
||||||
|
// Item is encoded as the S-NBT format, nbt.StringifiedMessage could help.
|
||||||
|
// See: https://wiki.vg/Chat#:~:text=show_item,in%20red%20instead.
|
||||||
|
func ShowItem(item string) *HoverEvent {
|
||||||
|
return &HoverEvent{
|
||||||
|
Action: "show_item",
|
||||||
|
Value: Text(item),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ShowEntity show an entity describing by the S-NBT, nbt.StringifiedMessage could help.
|
||||||
|
// See: https://wiki.vg/Chat#:~:text=show_entity,given%20entity%20loaded.
|
||||||
|
func ShowEntity(entity string) *HoverEvent {
|
||||||
|
return &HoverEvent{
|
||||||
|
Action: "show_entity",
|
||||||
|
Value: Text(entity),
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user