Add 1.21.1 chat support (#284)
Merge this without verification. Otherwise can't be reviewed in the further updates.
This commit is contained in:
@ -29,7 +29,7 @@ type Type struct {
|
||||
}
|
||||
|
||||
func (t *Type) Decorate(content Message, d *Decoration) (msg Message) {
|
||||
with := make([]Message, len(d.Parameters))
|
||||
with := make([]any, len(d.Parameters))
|
||||
for i, para := range d.Parameters {
|
||||
switch para {
|
||||
case "sender":
|
||||
|
@ -58,3 +58,16 @@ func (m *Message) UnmarshalJSON(raw []byte) (err error) {
|
||||
return errors.New("unknown chat message type: '" + string(raw[0]) + "'")
|
||||
}
|
||||
}
|
||||
|
||||
func (t *TranslateArgs) UnmarshalJSON(raw []byte) error {
|
||||
var v []Message
|
||||
err := json.Unmarshal(raw, &v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, v := range v {
|
||||
*t = append(*t, v)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -71,10 +71,12 @@ type Message struct {
|
||||
HoverEvent *HoverEvent `json:"hoverEvent,omitempty" nbt:"hoverEvent,omitempty"`
|
||||
|
||||
Translate string `json:"translate,omitempty" nbt:"translate,omitempty"`
|
||||
With []Message `json:"with,omitempty" nbt:"with,omitempty"`
|
||||
With TranslateArgs `json:"with,omitempty" nbt:"with,omitempty"`
|
||||
Extra []Message `json:"extra,omitempty" nbt:"extra,omitempty"`
|
||||
}
|
||||
|
||||
type TranslateArgs []any
|
||||
|
||||
// Same as Message, but "Text" is omitempty
|
||||
type translateMsg struct {
|
||||
Text string `json:"text,omitempty" nbt:"text,omitempty"`
|
||||
@ -93,7 +95,7 @@ type translateMsg struct {
|
||||
HoverEvent *HoverEvent `json:"hoverEvent,omitempty" nbt:"hoverEvent,omitempty"`
|
||||
|
||||
Translate string `json:"translate,omitempty" nbt:"translate,omitempty"`
|
||||
With []Message `json:"with,omitempty" nbt:"with,omitempty"`
|
||||
With TranslateArgs `json:"with,omitempty" nbt:"with,omitempty"`
|
||||
Extra []Message `json:"extra,omitempty" nbt:"extra,omitempty"`
|
||||
}
|
||||
|
||||
@ -127,7 +129,9 @@ func Text(str string) Message {
|
||||
|
||||
func TranslateMsg(key string, with ...Message) (m Message) {
|
||||
m.Translate = key
|
||||
m.With = with
|
||||
for _, v := range with {
|
||||
m.With = append(m.With, v)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@ -195,7 +199,12 @@ func (m Message) ClearString() string {
|
||||
if m.Translate != "" {
|
||||
args := make([]any, len(m.With))
|
||||
for i, v := range m.With {
|
||||
switch v := v.(type) {
|
||||
case Message:
|
||||
args[i] = v.ClearString()
|
||||
default:
|
||||
args[i] = v
|
||||
}
|
||||
}
|
||||
|
||||
_, _ = fmt.Fprintf(&msg, translateMap[m.Translate], args...)
|
||||
@ -238,12 +247,7 @@ func (m Message) String() string {
|
||||
|
||||
// handle translate
|
||||
if m.Translate != "" {
|
||||
args := make([]any, len(m.With))
|
||||
for i, v := range m.With {
|
||||
args[i] = v
|
||||
}
|
||||
|
||||
_, _ = fmt.Fprintf(&msg, translateMap[m.Translate], args...)
|
||||
_, _ = fmt.Fprintf(&msg, translateMap[m.Translate], m.With...)
|
||||
}
|
||||
|
||||
if m.Extra != nil {
|
||||
|
@ -52,3 +52,50 @@ func (m *Message) UnmarshalNBT(tagType byte, r nbt.DecoderReader) error {
|
||||
return errors.New("unknown chat message type: '" + strconv.FormatUint(uint64(tagType), 16) + "'")
|
||||
}
|
||||
}
|
||||
|
||||
func (t *TranslateArgs) UnmarshalNBT(tagType byte, r nbt.DecoderReader) error {
|
||||
tagReader := bytes.NewReader([]byte{tagType})
|
||||
decoder := nbt.NewDecoder(io.MultiReader(tagReader, r))
|
||||
decoder.NetworkFormat(true) // TagType directlly followed the body
|
||||
|
||||
switch tagType {
|
||||
case nbt.TagList:
|
||||
var value []Message
|
||||
if _, err := decoder.Decode(&value); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, v := range value {
|
||||
*t = append(*t, v)
|
||||
}
|
||||
return nil
|
||||
case nbt.TagByteArray:
|
||||
var value []int8
|
||||
if _, err := decoder.Decode(&value); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, v := range value {
|
||||
*t = append(*t, strconv.FormatInt(int64(v), 10))
|
||||
}
|
||||
return nil
|
||||
case nbt.TagIntArray:
|
||||
var value []int32
|
||||
if _, err := decoder.Decode(&value); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, v := range value {
|
||||
*t = append(*t, strconv.FormatInt(int64(v), 10))
|
||||
}
|
||||
return nil
|
||||
case nbt.TagLongArray:
|
||||
var value []int64
|
||||
if _, err := decoder.Decode(&value); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, v := range value {
|
||||
*t = append(*t, strconv.FormatInt(int64(v), 10))
|
||||
}
|
||||
return nil
|
||||
default:
|
||||
return errors.New("unknown translation args type: '" + strconv.FormatUint(uint64(tagType), 16) + "'")
|
||||
}
|
||||
}
|
||||
|
36
chat/nbtmessage_test.go
Normal file
36
chat/nbtmessage_test.go
Normal file
@ -0,0 +1,36 @@
|
||||
package chat_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/Tnze/go-mc/chat"
|
||||
en_us "github.com/Tnze/go-mc/data/lang/en-us"
|
||||
"github.com/Tnze/go-mc/nbt"
|
||||
)
|
||||
|
||||
func TestMessage_UnmarshalJSON_string(t *testing.T) {
|
||||
snbts := []string{
|
||||
"{translate: sleep.players_sleeping, with: [I; 1, 37]}",
|
||||
}
|
||||
|
||||
texts := []string{
|
||||
"1/37 players sleeping",
|
||||
}
|
||||
|
||||
chat.SetLanguage(en_us.Map)
|
||||
for i, v := range snbts {
|
||||
bytes, err := nbt.Marshal(nbt.StringifiedMessage(v))
|
||||
if err != nil {
|
||||
t.Errorf("Invalid SNBT: %v", err)
|
||||
continue
|
||||
}
|
||||
|
||||
var cm chat.Message
|
||||
if err := nbt.Unmarshal(bytes, &cm); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if str := cm.String(); str != texts[i] {
|
||||
t.Errorf("gets %q, wants %q", str, texts[i])
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user