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"
"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
},
)
}

View File

@ -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) {