1+ // Full Hackmud-to-Discord color mapping // = U+001B
2+ const hackmudToDiscordColors = {
3+ 'reset' : '[0;0m' , // Reset text formatting
4+ '0' : '[0;30m' , // Hackmud: #9B9B9B | Discord: Gray
5+ '1' : '[0;37m' , // Hackmud: #FFFFFF | Discord: White
6+ '2' : '[0;32m' , // Hackmud: #1EFF00 | Discord: Green
7+ '3' : '[0;34m' , // Hackmud: #0070DD | Discord: Blue
8+ '4' : '[0;35m' , // Hackmud: #B035EE | Discord: Pink
9+ '5' : '[0;33m' , // Hackmud: #FF8000 | Discord: Yellow
10+ '6' : '[0;33m' , // Hackmud: #FF8000 | Discord: Yellow
11+ '7' : '[0;33m' , // Hackmud: #FF8000 | Discord: Yellow
12+ '8' : '[0;33m' , // Hackmud: #FF8000 | Discord: Yellow
13+ '9' : '[0;33m' , // Hackmud: #FF8000 | Discord: Yellow
14+ 'a' : '[0;30m' , // Hackmud: #000000 | Discord: Gray
15+ 'b' : '[0;30m' , // Hackmud: #3F3F3F | Discord: Gray
16+ 'c' : '[0;30m' , // Hackmud: #676767 | Discord: Gray
17+ 'd' : '[0;31m' , // Hackmud: #7D0000 | Discord: Red
18+ 'e' : '[0;31m' , // Hackmud: #8E3434 | Discord: Red
19+ 'f' : '[0;33m' , // Hackmud: #A34F00 | Discord: Yellow
20+ 'g' : '[0;33m' , // Hackmud: #725437 | Discord: Yellow
21+ 'h' : '[0;33m' , // Hackmud: #A88600 | Discord: Yellow
22+ 'i' : '[0;33m' , // Hackmud: #B2934A | Discord: Yellow
23+ 'j' : '[0;32m' , // Hackmud: #939500 | Discord: Green
24+ 'k' : '[0;32m' , // Hackmud: #495225 | Discord: Green
25+ 'l' : '[0;32m' , // Hackmud: #299400 | Discord: Green
26+ 'm' : '[0;30m' , // Hackmud: #23381B | Discord: Gray
27+ 'n' : '[0;36m' , // Hackmud: #00535B | Discord: Cyan
28+ 'o' : '[0;36m' , // Hackmud: #324A4C | Discord: Cyan
29+ 'p' : '[0;34m' , // Hackmud: #0073A6 | Discord: Blue
30+ 'q' : '[0;34m' , // Hackmud: #385A6C | Discord: Blue
31+ 'r' : '[0;34m' , // Hackmud: #010067 | Discord: Blue
32+ 's' : '[0;34m' , // Hackmud: #507AA1 | Discord: Blue
33+ 't' : '[0;35m' , // Hackmud: #601C81 | Discord: Pink
34+ 'u' : '[0;30m' , // Hackmud: #43314C | Discord: Gray
35+ 'v' : '[0;35m' , // Hackmud: #8C0069 | Discord: Pink
36+ 'w' : '[0;35m' , // Hackmud: #973984 | Discord: Pink
37+ 'x' : '[0;31m' , // Hackmud: #880024 | Discord: Red
38+ 'y' : '[0;31m' , // Hackmud: #762E4A | Discord: Red
39+ 'z' : '[0;30m' , // Hackmud: #101215 | Discord: Gray
40+ 'A' : '[0;37m' , // Hackmud: #FFFFFF | Discord: White
41+ 'B' : '[0;37m' , // Hackmud: #CACACA | Discord: White
42+ 'C' : '[0;30m' , // Hackmud: #9B9B9B | Discord: Gray
43+ 'D' : '[0;31m' , // Hackmud: #FF0000 | Discord: Red
44+ 'E' : '[0;31m' , // Hackmud: #FF8383 | Discord: Red
45+ 'F' : '[0;33m' , // Hackmud: #FF8000 | Discord: Yellow
46+ 'G' : '[0;33m' , // Hackmud: #F3AA6F | Discord: Yellow
47+ 'H' : '[0;33m' , // Hackmud: #FBC803 | Discord: Yellow
48+ 'I' : '[0;33m' , // Hackmud: #FFD863 | Discord: Yellow
49+ 'J' : '[0;33m' , // Hackmud: #FFF404 | Discord: Yellow
50+ 'K' : '[0;32m' , // Hackmud: #F3F998 | Discord: Green
51+ 'L' : '[0;32m' , // Hackmud: #1EFF00 | Discord: Green
52+ 'M' : '[0;32m' , // Hackmud: #B3FF9B | Discord: Green
53+ 'N' : '[0;36m' , // Hackmud: #00FFFF | Discord: Cyan
54+ 'O' : '[0;36m' , // Hackmud: #8FE6FF | Discord: Cyan
55+ 'P' : '[0;34m' , // Hackmud: #0070DD | Discord: Blue
56+ 'Q' : '[0;34m' , // Hackmud: #A4E3FF | Discord: Blue
57+ 'R' : '[0;34m' , // Hackmud: #0000FF | Discord: Blue
58+ 'S' : '[0;34m' , // Hackmud: #7AB2F4 | Discord: Blue
59+ 'T' : '[0;35m' , // Hackmud: #B035EE | Discord: Pink
60+ 'U' : '[0;35m' , // Hackmud: #E6C4FF | Discord: Pink
61+ 'V' : '[0;35m' , // Hackmud: #FF00EC | Discord: Pink
62+ 'W' : '[0;35m' , // Hackmud: #FF96E0 | Discord: Pink
63+ 'X' : '[0;31m' , // Hackmud: #FF0070 | Discord: Red
64+ 'Y' : '[0;31m' , // Hackmud: #FF6A98 | Discord: Red
65+ 'Z' : '[0;30m' , // Hackmud: #0C112B | Discord: Gray
66+ } ;
67+
68+ function Formatter ( message ) {
69+ function convertHackmudColors ( text ) {
70+ const originalMsg = text
71+ let colorcount = 0
72+ let firstcolor = null
73+
74+ // Regex to detect backtick-wrapped strings with a leading color code
75+ const regex = / ` ( [ a - z A - Z 0 - 9 ] ) ( [ ^ ` ] * ) ` / g;
76+
77+ // The original regex run
78+ let regexrun = text . replace ( regex , ( match , code , content ) => {
79+ // Map the color code to the corresponding Discord color if it exists
80+ const discordColor = hackmudToDiscordColors [ code ] ;
81+
82+ if ( discordColor ) {
83+ if ( firstcolor == null ) { firstcolor = discordColor ; }
84+ colorcount ++
85+ return `${ discordColor } ${ content } ${ hackmudToDiscordColors . reset } `
86+ }
87+ // If no color is found, return the original match
88+ return match ;
89+ } ) ;
90+
91+ // This is basically the regex above without any of the formatting stuff
92+ let regexlimrun = text . replace ( regex , ( match , code , content ) => {
93+ return content
94+ } )
95+
96+ if ( colorcount >= 15 ) {
97+ return `${ firstcolor } ${ regexlimrun } ${ hackmudToDiscordColors . reset } `
98+ } else {
99+ return regexrun
100+ }
101+ }
102+
103+ // Extract timestamp and format it
104+ const timestamp = new Date ( message . t * 1000 ) ;
105+ const hours = timestamp . getHours ( ) . toString ( ) . padStart ( 2 , '0' ) ;
106+ const minutes = timestamp . getMinutes ( ) . toString ( ) . padStart ( 2 , '0' ) ;
107+ const formattedTime = `[0;30m${ hours } ${ minutes } [0;0m` ;
108+
109+ // Format user, channel, and other elements
110+ const formattedUser = `[0;33m${ message . from_user } [0;0m` ;
111+ const formattedChnlBlue = `[0;34m${ message . channel } [0;0m` ;
112+ const formattedChnlPink = `[0;35m${ message . channel } [0;0m` ;
113+ const formattedTell = `[0;34mtell[0;0m` ;
114+ const messageBord = `[1;30m:::[0;0m` ;
115+
116+ let formattedMessage = "" ;
117+
118+ // Apply color conversion to the message text
119+ const convertedMessage = convertHackmudColors ( message . msg ) ;
120+
121+ if ( message . is_join ) {
122+ formattedMessage = `\`\`\`ansi\n${ formattedTime } ${ formattedChnlBlue } ${ formattedUser } ${ messageBord } ${ convertedMessage } ${ messageBord } \n\`\`\`` ;
123+ } else {
124+ if ( ! message . channel ) {
125+ formattedMessage = `\`\`\`ansi\n${ formattedTime } ${ formattedTell } ${ formattedUser } ${ messageBord } ${ convertedMessage } ${ messageBord } \n\`\`\`` ;
126+ } else {
127+ formattedMessage = `\`\`\`ansi\n${ formattedTime } ${ formattedChnlPink } ${ formattedUser } ${ messageBord } ${ convertedMessage } ${ messageBord } \n\`\`\`` ;
128+ }
129+ }
130+
131+ return formattedMessage ;
132+ }
133+
134+ // Example messages
135+ const message1 = {
136+ "id" : "3598b8a024e394b691559a8c" ,
137+ "t" : 1515984655.629 ,
138+ "from_user" : "sans_comedy" ,
139+ "msg" : "`pThis is a ``Xlovely``p test message`" ,
140+ "channel" : "0000"
141+ } ;
142+ const message2 = {
143+ "id" : "3598b8a024e394b691559a8c" ,
144+ "t" : 1515984653.345 ,
145+ "from_user" : "sans_comedy" ,
146+ "msg" : "user joined channel" ,
147+ "is_join" : true ,
148+ "channel" : "0000"
149+ } ;
150+ const message3 = {
151+ "id" : "8393b5e73a021ac084090aad" ,
152+ "t" : 1515984660.132 ,
153+ "from_user" : "com" ,
154+ "msg" : "psst, this is a tell"
155+ } ;
156+ const messagespam = {
157+ "id" : "3598b8a024e394b691559a8c" ,
158+ "t" : 1515984655.629 ,
159+ "from_user" : "sans_comedy" ,
160+ "msg" : "`2T``3h``2i``3s``2 ``3i``2s``3 ``2a``3 ``2c``3o``2l``3o``2r``3f``2u``3l``2 ``3m``2e``3s``2s``3a``2g``3e``5!`" ,
161+ "channel" : "0000"
162+ } ;
163+
164+ // Test the Formatter
165+ console . log ( 'Formatted Messages:\n' + Formatter ( message1 ) + '\n' + Formatter ( message2 ) + '\n' + Formatter ( message3 ) + '\n' + Formatter ( messagespam ) ) ;
0 commit comments