diff --git a/common/stringsupport/string_convert.go b/common/stringsupport/string_convert.go index de4d04364..96c14c9ba 100644 --- a/common/stringsupport/string_convert.go +++ b/common/stringsupport/string_convert.go @@ -29,6 +29,23 @@ func SJISToUTF8(b []byte) string { return string(result) } +func ToNGWord(x string) []uint16 { + var w []uint16 + for _, r := range []rune(x) { + if r > 0xFF { + t := UTF8ToSJIS(string(r)) + if len(t) > 1 { + w = append(w, uint16(t[1])<<8|uint16(t[0])) + } else { + w = append(w, uint16(t[0])) + } + } else { + w = append(w, uint16(r)) + } + } + return w +} + func PaddedString(x string, size uint, t bool) []byte { if t { e := japanese.ShiftJIS.NewEncoder() diff --git a/server/signserver/dsgn_resp.go b/server/signserver/dsgn_resp.go index 250bdae46..3d102d52c 100644 --- a/server/signserver/dsgn_resp.go +++ b/server/signserver/dsgn_resp.go @@ -135,7 +135,203 @@ func (s *Session) makeSignResponse(uid uint32) []byte { bf.WriteUint32(s.server.getLastCID(uid)) bf.WriteUint32(s.server.getUserRights(uid)) - ps.Uint16(bf, "", false) // filters + + namNGWords := []string{} + msgNGWords := []string{} + + filters := byteframe.NewByteFrame() + filters.SetLE() + filters.WriteNullTerminatedBytes([]byte("smc")) + smc := byteframe.NewByteFrame() + smc.SetLE() + smcData := []struct { + charGroup [][]rune + }{ + {[][]rune{{'='}, {'='}}}, + {[][]rune{{')'}, {')'}}}, + {[][]rune{{'('}, {'('}}}, + {[][]rune{{'!'}, {'!'}}}, + {[][]rune{{'/'}, {'/'}}}, + {[][]rune{{'+'}, {'+'}}}, + {[][]rune{{'&'}, {'&'}}}, + {[][]rune{{'ぼ'}, {'ボ'}, {'ホ', '゙'}, {'ほ', '゙'}, {'ホ', '゙'}, {'ほ', '゛'}, {'ホ', '゛'}, {'ホ', '゛'}}}, + {[][]rune{{'べ'}, {'ベ'}, {'ヘ', '゙'}, {'へ', '゙'}, {'ヘ', '゙'}, {'へ', '゛'}, {'ヘ', '゛'}, {'ヘ', '゛'}}}, + {[][]rune{{'で'}, {'デ'}, {'テ', '゙'}, {'て', '゙'}, {'テ', '゙'}, {'て', '゛'}, {'テ', '゛'}, {'テ', '゛'}, {'〒', '゛'}, {'〒', '゙'}, {'乙', '゙'}, {'乙', '゛'}}}, + {[][]rune{{'び'}, {'ビ'}, {'ヒ', '゙'}, {'ひ', '゙'}, {'ヒ', '゙'}, {'ひ', '゛'}, {'ヒ', '゛'}, {'ヒ', '゛'}}}, + {[][]rune{{'ど'}, {'ド'}, {'ト', '゙'}, {'と', '゙'}, {'ト', '゙'}, {'と', '゛'}, {'ト', '゛'}, {'ト', '゛'}, {'┣', '゙'}, {'┣', '゛'}, {'├', '゙'}, {'├', '゛'}}}, + {[][]rune{{'ば'}, {'バ'}, {'ハ', '゙'}, {'は', '゙'}, {'ハ', '゙'}, {'八', '゙'}, {'は', '゛'}, {'ハ', '゛'}, {'ハ', '゛'}, {'八', '゛'}}}, + {[][]rune{{'つ', '゙'}, {'ヅ'}, {'ツ', '゙'}, {'つ', '゛'}, {'ツ', '゛'}, {'ツ', '゙'}, {'ツ', '゛'}, {'づ'}, {'っ', '゙'}, {'ッ', '゙'}, {'ッ', '゙'}, {'っ', '゛'}, {'ッ', '゛'}, {'ッ', '゛'}}}, + {[][]rune{{'ぶ'}, {'ブ'}, {'フ', '゙'}, {'ヴ'}, {'ウ', '゙'}, {'う', '゛'}, {'う', '゙'}, {'ウ', '゙'}, {'ゥ', '゙'}, {'ぅ', '゙'}, {'ふ', '゙'}, {'フ', '゙'}, {'フ', '゛'}}}, + {[][]rune{{'ぢ'}, {'ヂ'}, {'チ', '゙'}, {'ち', '゙'}, {'チ', '゙'}, {'ち', '゛'}, {'チ', '゛'}, {'チ', '゛'}, {'千', '゛'}, {'千', '゙'}}}, + {[][]rune{{'だ'}, {'ダ'}, {'タ', '゙'}, {'た', '゙'}, {'タ', '゙'}, {'夕', '゙'}, {'た', '゛'}, {'タ', '゛'}, {'タ', '゛'}, {'夕', '゛'}}}, + {[][]rune{{'ぞ'}, {'ゾ'}, {'ソ', '゙'}, {'そ', '゙'}, {'ソ', '゙'}, {'そ', '゛'}, {'ソ', '゛'}, {'ソ', '゛'}, {'ン', '゙'}, {'ン', '゛'}, {'ン', '゛'}, {'ン', '゙'}, {'リ', '゙'}, {'リ', '゙'}, {'リ', '゛'}, {'リ', '゛'}}}, + {[][]rune{{'ぜ'}, {'セ', '゙'}, {'せ', '゙'}, {'セ', '゙'}, {'せ', '゛'}, {'セ', '゛'}, {'セ', '゛'}, {'ゼ'}}}, + {[][]rune{{'ず'}, {'ズ'}, {'ス', '゙'}, {'す', '゙'}, {'ス', '゙'}, {'す', '゛'}, {'ス', '゛'}, {'ス', '゛'}}}, + {[][]rune{{'じ'}, {'ジ'}, {'シ', '゙'}, {'し', '゙'}, {'シ', '゙'}, {'し', '゛'}, {'シ', '゛'}, {'シ', '゛'}}}, + {[][]rune{{'ざ'}, {'ザ'}, {'サ', '゙'}, {'さ', '゙'}, {'サ', '゙'}, {'さ', '゛'}, {'サ', '゛'}, {'サ', '゛'}}}, + {[][]rune{{'ご'}, {'ゴ'}, {'コ', '゙'}, {'こ', '゙'}, {'コ', '゙'}, {'こ', '゛'}, {'コ', '゛'}, {'コ', '゛'}}}, + {[][]rune{{'げ'}, {'ゲ'}, {'ケ', '゙'}, {'け', '゙'}, {'ケ', '゙'}, {'け', '゛'}, {'ケ', '゛'}, {'ケ', '゛'}, {'ヶ', '゙'}, {'ヶ', '゛'}}}, + {[][]rune{{'ぐ'}, {'グ'}, {'ク', '゙'}, {'く', '゙'}, {'ク', '゙'}, {'く', '゛'}, {'ク', '゛'}, {'ク', '゛'}}}, + {[][]rune{{'ぎ'}, {'ギ'}, {'キ', '゙'}, {'き', '゙'}, {'キ', '゙'}, {'き', '゛'}, {'キ', '゛'}, {'キ', '゛'}}}, + {[][]rune{{'が'}, {'ガ'}, {'カ', '゙'}, {'ヵ', '゙'}, {'カ', '゙'}, {'か', '゙'}, {'力', '゙'}, {'ヵ', '゛'}, {'カ', '゛'}, {'か', '゛'}, {'力', '゛'}, {'カ', '゛'}}}, + {[][]rune{{'を'}, {'ヲ'}, {'ヲ'}}}, + {[][]rune{{'わ'}, {'ワ'}, {'ワ'}, {'ヮ'}}}, + {[][]rune{{'ろ'}, {'ロ'}, {'ロ'}, {'□'}, {'口'}}}, + {[][]rune{{'れ'}, {'レ'}, {'レ'}}}, + {[][]rune{{'る'}, {'ル'}, {'ル'}}}, + {[][]rune{{'り'}, {'リ'}, {'リ'}}}, + {[][]rune{{'ら'}, {'ラ'}, {'ラ'}}}, + {[][]rune{{'よ'}, {'ヨ'}, {'ヨ'}, {'ョ'}, {'ょ'}, {'ョ'}}}, + {[][]rune{{'ゆ'}, {'ユ'}, {'ユ'}, {'ュ'}, {'ゅ'}, {'ュ'}}}, + {[][]rune{{'や'}, {'ヤ'}, {'ヤ'}, {'ャ'}, {'ゃ'}, {'ャ'}}}, + {[][]rune{{'も'}, {'モ'}, {'モ'}}}, + {[][]rune{{'め'}, {'メ'}, {'メ'}, {'M', 'E'}}}, + {[][]rune{{'む'}, {'ム'}, {'ム'}}}, + {[][]rune{{'み'}, {'ミ'}, {'ミ'}}}, + {[][]rune{{'ま'}, {'マ'}, {'マ'}}}, + {[][]rune{{'ほ'}, {'ホ'}, {'ホ'}}}, + {[][]rune{{'へ'}, {'ヘ'}, {'ヘ'}}}, + {[][]rune{{'ふ'}, {'フ'}, {'フ'}}}, + {[][]rune{{'ひ'}, {'ヒ'}, {'ヒ'}}}, + {[][]rune{{'は'}, {'ハ'}, {'ハ'}, {'八'}}}, + {[][]rune{{'の'}, {'ノ'}, {'ノ'}}}, + {[][]rune{{'ね'}, {'ネ'}, {'ネ'}}}, + {[][]rune{{'ぬ'}, {'ヌ'}, {'ヌ'}}}, + {[][]rune{{'に'}, {'ニ'}, {'ニ'}, {'二'}}}, + {[][]rune{{'な'}, {'ナ'}, {'ナ'}}}, + {[][]rune{{'と'}, {'ト'}, {'ト'}, {'┣'}, {'├'}}}, + {[][]rune{{'て'}, {'テ'}, {'テ'}, {'〒'}, {'乙'}}}, + {[][]rune{{'つ'}, {'ツ'}, {'ツ'}, {'っ'}, {'ッ'}, {'ッ'}}}, + {[][]rune{{'ち'}, {'チ'}, {'チ'}, {'千'}}}, + {[][]rune{{'た'}, {'タ'}, {'タ'}, {'夕'}}}, + {[][]rune{{'そ'}, {'ソ'}, {'ソ'}}}, + {[][]rune{{'せ'}, {'セ'}, {'セ'}}}, + {[][]rune{{'す'}, {'ス'}, {'ス'}}}, + {[][]rune{{'し'}, {'シ'}, {'シ'}}}, + {[][]rune{{'さ'}, {'サ'}, {'サ'}}}, + {[][]rune{{'こ'}, {'コ'}, {'コ'}}}, + {[][]rune{{'け'}, {'ケ'}, {'ケ'}, {'ヶ'}}}, + {[][]rune{{'く'}, {'ク'}, {'ク'}}}, + {[][]rune{{'き'}, {'キ'}, {'キ'}}}, + {[][]rune{{'か'}, {'カ'}, {'カ'}, {'ヵ'}, {'力'}}}, + {[][]rune{{'お'}, {'オ'}, {'オ'}, {'ォ'}, {'ぉ'}, {'ォ'}}}, + {[][]rune{{'え'}, {'エ'}, {'エ'}, {'ェ'}, {'ぇ'}, {'ェ'}, {'工'}}}, + {[][]rune{{'う'}, {'ウ'}, {'ウ'}, {'ゥ'}, {'ぅ'}, {'ゥ'}}}, + {[][]rune{{'い'}, {'イ'}, {'イ'}, {'ィ'}, {'ぃ'}, {'ィ'}}}, + {[][]rune{{'あ'}, {'ア'}, {'ァ'}, {'ア'}, {'ぁ'}, {'ァ'}}}, + {[][]rune{{'ー'}, {'―'}, {'‐'}, {'-'}, {'-'}, {'ー'}, {'一'}}}, + {[][]rune{{'9'}, {'9'}}}, + {[][]rune{{'8'}, {'8'}}}, + {[][]rune{{'7'}, {'7'}}}, + {[][]rune{{'6'}, {'6'}}}, + {[][]rune{{'5'}, {'5'}}}, + {[][]rune{{'4'}, {'4'}}}, + {[][]rune{{'3'}, {'3'}}}, + {[][]rune{{'2'}, {'2'}}}, + {[][]rune{{'1'}, {'1'}}}, + {[][]rune{{'ぽ'}, {'ポ'}, {'ホ', '゚'}, {'ほ', '゚'}, {'ホ', '゚'}, {'ホ', '°'}, {'ほ', '°'}, {'ホ', '°'}}}, + {[][]rune{{'ぺ'}, {'ペ'}, {'ヘ', '゚'}, {'へ', '゚'}, {'ヘ', '゚'}, {'ヘ', '°'}, {'へ', '°'}, {'ヘ', '°'}}}, + {[][]rune{{'ぷ'}, {'プ'}, {'フ', '゚'}, {'ふ', '゚'}, {'フ', '゚'}, {'フ', '°'}, {'ふ', '°'}, {'フ', '°'}}}, + {[][]rune{{'ぴ'}, {'ピ'}, {'ヒ', '゚'}, {'ひ', '゚'}, {'ヒ', '゚'}, {'ヒ', '°'}, {'ひ', '°'}, {'ヒ', '°'}}}, + {[][]rune{{'ぱ'}, {'パ'}, {'ハ', '゚'}, {'は', '゚'}, {'ハ', '゚'}, {'ハ', '°'}, {'は', '°'}, {'ハ', '°'}, {'八', '゚'}, {'八', '゜'}}}, + {[][]rune{{'z'}, {'z'}, {'Z'}, {'Z'}, {'Ζ'}}}, + {[][]rune{{'y'}, {'y'}, {'Y'}, {'Y'}, {'Υ'}, {'У'}, {'у'}}}, + {[][]rune{{'x'}, {'x'}, {'X'}, {'X'}, {'Χ'}, {'χ'}, {'Х'}, {'×'}, {'х'}}}, + {[][]rune{{'w'}, {'w'}, {'W'}, {'W'}, {'ω'}, {'Ш'}, {'ш'}, {'щ'}}}, + {[][]rune{{'v'}, {'v'}, {'V'}, {'V'}, {'ν'}, {'υ'}}}, + {[][]rune{{'u'}, {'u'}, {'U'}, {'U'}, {'μ'}, {'∪'}}}, + {[][]rune{{'t'}, {'t'}, {'T'}, {'T'}, {'Τ'}, {'τ'}, {'Т'}, {'т'}}}, + {[][]rune{{'s'}, {'s'}, {'S'}, {'S'}, {'∫'}, {'$'}, {'$'}}}, + {[][]rune{{'r'}, {'r'}, {'R'}, {'R'}, {'Я'}, {'я'}}}, + {[][]rune{{'q'}, {'q'}, {'Q'}, {'Q'}}}, + {[][]rune{{'p'}, {'p'}, {'P'}, {'P'}, {'Ρ'}, {'ρ'}, {'Р'}, {'р'}}}, + {[][]rune{{'o'}, {'o'}, {'O'}, {'O'}, {'○'}, {'Ο'}, {'ο'}, {'О'}, {'о'}, {'◯'}, {'〇'}, {'0'}, {'0'}}}, + {[][]rune{{'n'}, {'n'}, {'N'}, {'N'}, {'Ν'}, {'η'}, {'ン'}, {'ん'}, {'ン'}}}, + {[][]rune{{'m'}, {'m'}, {'M'}, {'M'}, {'Μ'}, {'М'}, {'м'}}}, + {[][]rune{{'l'}, {'l'}, {'L'}, {'L'}, {'|'}}}, + {[][]rune{{'k'}, {'k'}, {'K'}, {'K'}, {'Κ'}, {'κ'}, {'К'}, {'к'}}}, + {[][]rune{{'j'}, {'j'}, {'J'}, {'J'}}}, + {[][]rune{{'i'}, {'i'}, {'I'}, {'I'}, {'Ι'}}}, + {[][]rune{{'h'}, {'h'}, {'H'}, {'H'}, {'Η'}, {'Н'}, {'н'}}}, + {[][]rune{{'f'}, {'f'}, {'F'}, {'F'}}}, + {[][]rune{{'g'}, {'g'}, {'G'}, {'G'}}}, + {[][]rune{{'e'}, {'e'}, {'E'}, {'E'}, {'Ε'}, {'ε'}, {'Е'}, {'Ё'}, {'е'}, {'ё'}, {'∈'}}}, + {[][]rune{{'d'}, {'d'}, {'D'}, {'D'}}}, + {[][]rune{{'c'}, {'c'}, {'C'}, {'С'}, {'с'}, {'C'}, {'℃'}}}, + {[][]rune{{'b'}, {'B'}, {'b'}, {'B'}, {'β'}, {'Β'}, {'В'}, {'в'}, {'ъ'}, {'ь'}, {'♭'}}}, + {[][]rune{{'\''}, {'’'}}}, + {[][]rune{{'a'}, {'A'}, {'a'}, {'A'}, {'α'}, {'@'}, {'@'}, {'а'}, {'Å'}, {'А'}, {'Α'}}}, + {[][]rune{{'"'}, {'”'}}}, + {[][]rune{{'%'}, {'%'}}}, + } + for _, smcGroup := range smcData { + for _, smcPair := range smcGroup.charGroup { + smc.WriteUint16(stringsupport.ToNGWord(string(smcPair[0]))[0]) + if len(smcPair) > 1 { + smc.WriteUint16(stringsupport.ToNGWord(string(smcPair[1]))[0]) + } else { + smc.WriteUint16(0) + } + } + smc.WriteUint32(0) + } + + filters.WriteUint32(uint32(len(smc.Data()))) + filters.WriteBytes(smc.Data()) + + filters.WriteNullTerminatedBytes([]byte("nam")) + nam := byteframe.NewByteFrame() + nam.SetLE() + for _, word := range namNGWords { + parts := stringsupport.ToNGWord(word) + nam.WriteUint32(uint32(len(parts))) + for _, part := range parts { + nam.WriteUint16(part) + var i int16 + j := int16(-1) + for _, smcGroup := range smcData { + if rune(part) == rune(stringsupport.ToNGWord(string(smcGroup.charGroup[0][0]))[0]) { + j = i + break + } + i += int16(len(smcGroup.charGroup) + 1) + } + nam.WriteInt16(j) + } + nam.WriteUint16(0) + nam.WriteInt16(-1) + } + filters.WriteUint32(uint32(len(nam.Data()))) + filters.WriteBytes(nam.Data()) + + filters.WriteNullTerminatedBytes([]byte("msg")) + msg := byteframe.NewByteFrame() + msg.SetLE() + for _, word := range msgNGWords { + parts := stringsupport.ToNGWord(word) + msg.WriteUint32(uint32(len(parts))) + for _, part := range parts { + msg.WriteUint16(part) + var i int16 + j := int16(-1) + for _, smcGroup := range smcData { + if rune(part) == rune(stringsupport.ToNGWord(string(smcGroup.charGroup[0][0]))[0]) { + j = i + break + } + i += int16(len(smcGroup.charGroup) + 1) + } + msg.WriteInt16(j) + } + msg.WriteUint16(0) + msg.WriteInt16(-1) + } + filters.WriteUint32(uint32(len(msg.Data()))) + filters.WriteBytes(msg.Data()) + + bf.WriteUint16(uint16(len(filters.Data()))) + bf.WriteBytes(filters.Data()) + if s.client == VITA || s.client == PS3 || s.client == PS4 { var psnUser string s.server.db.QueryRow("SELECT psn_id FROM users WHERE id = $1", uid).Scan(&psnUser)