diff --git a/chat/chatMsg.go b/chat/chatMsg.go index 43ca342..c5114e7 100644 --- a/chat/chatMsg.go +++ b/chat/chatMsg.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io" + "regexp" "strings" "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) } -var colors = map[string]int{ - "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, +var fmtCode = map[byte]string{ + '0': "30", + '1': "34", + '2': "32", + '3': "36", + '4': "31", + '5': "35", + '6': "33", + '7': "37", + '8': "90", + '9': "94", + 'a': "92", + 'b': "96", + 'c': "91", + 'd': "95", + 'e': "93", + '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. func (m Message) ClearString() string { var msg strings.Builder - msg.WriteString(m.Text) + msg.WriteString(transf(m.Text, false)) //handle translate if m.Translate != "" { @@ -110,12 +136,12 @@ func (m Message) String() string { format.WriteString("9;") } if m.Color != "" { - fmt.Fprintf(&format, "%d;", colors[m.Color]) + format.WriteString(colors[m.Color] + ";") } if format.Len() > 0 { msg.WriteString("\033[" + format.String()[:format.Len()-1] + "m") } - msg.WriteString(m.Text) + msg.WriteString(transf(m.Text, true)) //handle translate if m.Translate != "" { @@ -140,3 +166,21 @@ func (m Message) String() 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 + }, + ) +} diff --git a/chat/chatMsg_test.go b/chat/chatMsg_test.go index 49d49b3..81ede64 100644 --- a/chat/chatMsg_test.go +++ b/chat/chatMsg_test.go @@ -26,6 +26,9 @@ var jsons = []string{ `{"translate":"translation.test.escape","with":["str1","str2"]}`, `{"translate":"translation.test.args","with":["str1","str2"]}`, `{"translate":"translation.test.world"}`, + + `"Tnze"`, + `"§0Tnze"`, } var texts = []string{ @@ -37,6 +40,9 @@ var texts = []string{ "%s %str1 %%s %%str2", "str1 str2", "world", + + "Tnze", + "\033[30mTnze", } var ctexts = []string{ @@ -48,6 +54,9 @@ var ctexts = []string{ "%s %str1 %%s %%str2", "str1 str2", "world", + + "Tnze", + "Tnze", } func TestChatMsgFormatString(t *testing.T) {