support old chat format system which based on §

This commit is contained in:
Tnze
2019-06-19 01:44:21 +08:00
parent f625f06001
commit 8c0b0e89ab
2 changed files with 73 additions and 20 deletions

View File

@ -4,6 +4,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io" "io"
"regexp"
"strings" "strings"
"github.com/Tnze/go-mc/data" "github.com/Tnze/go-mc/data"
@ -48,29 +49,54 @@ func (m *Message) Decode(r pk.DecodeReader) error {
return json.NewDecoder(io.LimitReader(r, int64(Len))).Decode(m) return json.NewDecoder(io.LimitReader(r, int64(Len))).Decode(m)
} }
var colors = map[string]int{ var fmtCode = map[byte]string{
"black": 30, '0': "30",
"dark_blue": 34, '1': "34",
"dark_green": 32, '2': "32",
"dark_aqua": 36, '3': "36",
"dark_red": 31, '4': "31",
"dark_purple": 35, '5': "35",
"gold": 33, '6': "33",
"gray": 37, '7': "37",
"dark_gray": 90, '8': "90",
"blue": 94, '9': "94",
"green": 92, 'a': "92",
"aqua": 96, 'b': "96",
"red": 91, 'c': "91",
"light_purple": 95, 'd': "95",
"yellow": 93, 'e': "93",
"white": 97, 'f': "97",
// 'k':"", //random
'l': "1",
'm': "9",
'n': "4",
'o': "3",
'r': "0",
}
var colors = map[string]string{
"black": "30",
"dark_blue": "34",
"dark_green": "32",
"dark_aqua": "36",
"dark_red": "31",
"dark_purple": "35",
"gold": "33",
"gray": "37",
"dark_gray": "90",
"blue": "94",
"green": "92",
"aqua": "96",
"red": "91",
"light_purple": "95",
"yellow": "93",
"white": "97",
} }
// ClearString return the message without escape sequence for ansi color. // ClearString return the message without escape sequence for ansi color.
func (m Message) ClearString() string { func (m Message) ClearString() string {
var msg strings.Builder var msg strings.Builder
msg.WriteString(m.Text) msg.WriteString(transf(m.Text, false))
//handle translate //handle translate
if m.Translate != "" { if m.Translate != "" {
@ -110,12 +136,12 @@ func (m Message) String() string {
format.WriteString("9;") format.WriteString("9;")
} }
if m.Color != "" { if m.Color != "" {
fmt.Fprintf(&format, "%d;", colors[m.Color]) format.WriteString(colors[m.Color] + ";")
} }
if format.Len() > 0 { if format.Len() > 0 {
msg.WriteString("\033[" + format.String()[:format.Len()-1] + "m") msg.WriteString("\033[" + format.String()[:format.Len()-1] + "m")
} }
msg.WriteString(m.Text) msg.WriteString(transf(m.Text, true))
//handle translate //handle translate
if m.Translate != "" { if m.Translate != "" {
@ -140,3 +166,21 @@ func (m Message) String() string {
} }
return msg.String() return msg.String()
} }
var fmtPat = regexp.MustCompile("§[0-9A-FK-OR]")
func transf(str string, ansi bool) string {
return fmtPat.ReplaceAllStringFunc(
str,
func(str string) string {
f, ok := fmtCode[str[2]]
if ok {
if ansi {
return "\033[" + f + "m" // enable, add ANSI code
}
return "" //disable, remove the § code
}
return str //not a § code
},
)
}

View File

@ -26,6 +26,9 @@ var jsons = []string{
`{"translate":"translation.test.escape","with":["str1","str2"]}`, `{"translate":"translation.test.escape","with":["str1","str2"]}`,
`{"translate":"translation.test.args","with":["str1","str2"]}`, `{"translate":"translation.test.args","with":["str1","str2"]}`,
`{"translate":"translation.test.world"}`, `{"translate":"translation.test.world"}`,
`"Tnze"`,
`"§0Tnze"`,
} }
var texts = []string{ var texts = []string{
@ -37,6 +40,9 @@ var texts = []string{
"%s %str1 %%s %%str2", "%s %str1 %%s %%str2",
"str1 str2", "str1 str2",
"world", "world",
"Tnze",
"\033[30mTnze",
} }
var ctexts = []string{ var ctexts = []string{
@ -48,6 +54,9 @@ var ctexts = []string{
"%s %str1 %%s %%str2", "%s %str1 %%s %%str2",
"str1 str2", "str1 str2",
"world", "world",
"Tnze",
"Tnze",
} }
func TestChatMsgFormatString(t *testing.T) { func TestChatMsgFormatString(t *testing.T) {