@@ -107,28 +107,51 @@ private boolean checkBrackets(Optional<String> brackets) {
107107 return brackets .isPresent () && brackets .get ().length () != 2 ;
108108 }
109109
110+ // 0 message, 1 prefix, 2 brackets, 3 color, 4 range, 5 utf8compatible
110111 @ LuaFunction (mainThread = true )
111112 public final MethodResult sendFormattedMessage (@ NotNull IArguments arguments ) throws LuaException {
112113 return withChatOperation (ignored -> {
114+ boolean useUTF8 = arguments .optBoolean (5 , false );
115+
113116 String message = arguments .getString (0 );
114117
118+ // check size while it represents bytes (in utf8 mode) as that is longer
115119 if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ())
116120 return MethodResult .of (null , "Message is too long" );
117121
122+ if (useUTF8 ) {
123+ message = StringUtil .byteStringToUTF8 (message );
124+ }
125+
118126 int maxRange = APConfig .PERIPHERALS_CONFIG .chatBoxMaxRange .get ();
119127 int range = arguments .optInt (4 , -1 );
120128 ResourceKey <Level > dimension = getLevel ().dimension ();
121129 MutableComponent component = Component .Serializer .fromJson (message , RegistryAccess .EMPTY );
122130 if (component == null )
123131 return MethodResult .of (null , "incorrect json" );
124132
125- if (checkBrackets (arguments .optString (2 )))
133+ Optional <String > brackets = arguments .optString (2 );
134+ if (useUTF8 ) {
135+ brackets = brackets .map (StringUtil ::byteStringToUTF8 );
136+ }
137+
138+ if (checkBrackets (brackets ))
126139 return MethodResult .of (null , "incorrect bracket string (e.g. [], {}, <>, ...)" );
127140
141+ Optional <String > prefix = arguments .optString (1 );
142+ if (useUTF8 ) {
143+ prefix = prefix .map (StringUtil ::byteStringToUTF8 );
144+ }
145+
146+ String bracketColor = arguments .optString (3 , "" );
147+ if (useUTF8 ) {
148+ bracketColor = StringUtil .byteStringToUTF8 (bracketColor );
149+ }
150+
128151 MutableComponent preparedMessage = appendPrefix (
129- StringUtil .convertAndToSectionMark (arguments . optString ( 1 , APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix . get () )),
130- arguments . optString ( 2 , "[]" ),
131- StringUtil .convertAndToSectionMark (arguments . optString ( 3 , "" ) )
152+ StringUtil .convertAndToSectionMark (prefix . orElseGet ( APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix )),
153+ brackets . orElse ( "[]" ),
154+ StringUtil .convertAndToSectionMark (bracketColor )
132155 ).append (component );
133156 for (ServerPlayer player : ServerLifecycleHooks .getCurrentServer ().getPlayerList ().getPlayers ()) {
134157 if (!APConfig .PERIPHERALS_CONFIG .chatBoxMultiDimensional .get () && player .level ().dimension () != dimension )
@@ -140,25 +163,51 @@ public final MethodResult sendFormattedMessage(@NotNull IArguments arguments) th
140163 });
141164 }
142165
166+ // 0 message, 1 prefix, 2 brackets, 3 color, 4 range, 5 utf8compatible
143167 @ LuaFunction (mainThread = true )
144168 public final MethodResult sendMessage (@ NotNull IArguments arguments ) throws LuaException {
145169 return withChatOperation (ignored -> {
170+ boolean useUTF8 = arguments .optBoolean (5 , false );
171+
146172 String message = arguments .getString (0 );
147173
148- if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ())
174+ // check size while it represents bytes (in utf8 mode) as that is longer
175+ if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ()) {
149176 return MethodResult .of (null , "Message is too long" );
177+ }
178+
179+ if (useUTF8 ) {
180+ message = StringUtil .byteStringToUTF8 (message );
181+ }
150182
151183 int maxRange = APConfig .PERIPHERALS_CONFIG .chatBoxMaxRange .get ();
152184 int range = arguments .optInt (4 , -1 );
153185 ResourceKey <Level > dimension = getLevel ().dimension ();
154- if (checkBrackets (arguments .optString (2 )))
186+
187+ Optional <String > brackets = arguments .optString (2 );
188+ if (useUTF8 ) {
189+ brackets = brackets .map (StringUtil ::byteStringToUTF8 );
190+ }
191+
192+ if (checkBrackets (brackets ))
155193 return MethodResult .of (null , "incorrect bracket string (e.g. [], {}, <>, ...)" );
156194
195+ Optional <String > prefix = arguments .optString (1 );
196+ if (useUTF8 ) {
197+ prefix = prefix .map (StringUtil ::byteStringToUTF8 );
198+ }
199+
200+ String bracketColor = arguments .optString (3 , "" );
201+ if (useUTF8 ) {
202+ bracketColor = StringUtil .byteStringToUTF8 (bracketColor );
203+ }
204+
157205 MutableComponent preparedMessage = appendPrefix (
158- StringUtil .convertAndToSectionMark (arguments . optString ( 1 , APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix . get () )),
159- arguments . optString ( 2 , "[]" ),
160- StringUtil .convertAndToSectionMark (arguments . optString ( 3 , "" ) )
206+ StringUtil .convertAndToSectionMark (prefix . orElseGet ( APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix )),
207+ brackets . orElse ( "[]" ),
208+ StringUtil .convertAndToSectionMark (bracketColor )
161209 ).append (message );
210+
162211 for (ServerPlayer player : ServerLifecycleHooks .getCurrentServer ().getPlayerList ().getPlayers ()) {
163212 if (!APConfig .PERIPHERALS_CONFIG .chatBoxMultiDimensional .get () && player .level ().dimension () != dimension )
164213 continue ;
@@ -169,14 +218,23 @@ public final MethodResult sendMessage(@NotNull IArguments arguments) throws LuaE
169218 });
170219 }
171220
221+ // 0 message, 1 playerName, 2 prefix, 3 brackets, 4 color, 5 range
172222 @ LuaFunction (mainThread = true )
173223 public final MethodResult sendFormattedMessageToPlayer (@ NotNull IArguments arguments ) throws LuaException {
174224 return withChatOperation (ignored -> {
225+ boolean useUTF8 = arguments .optBoolean (5 , false );
226+
175227 String message = arguments .getString (0 );
176228
229+ // check size while it represents bytes (in utf8 mode) as that is longer
177230 if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ())
178231 return MethodResult .of (null , "Message is too long" );
179232
233+ if (useUTF8 ) {
234+ message = StringUtil .byteStringToUTF8 (message );
235+ }
236+
237+
180238 String playerName = arguments .getString (1 );
181239 int maxRange = APConfig .PERIPHERALS_CONFIG .chatBoxMaxRange .get ();
182240 int range = arguments .optInt (5 , -1 );
@@ -189,14 +247,31 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum
189247 if (component == null )
190248 return MethodResult .of (null , "incorrect json" );
191249
192- if (checkBrackets (arguments .optString (3 )))
250+ Optional <String > brackets = arguments .optString (3 );
251+ if (useUTF8 ) {
252+ brackets = brackets .map (StringUtil ::byteStringToUTF8 );
253+ }
254+
255+ if (checkBrackets (brackets ))
193256 return MethodResult .of (null , "incorrect bracket string (e.g. [], {}, <>, ...)" );
194257
258+ Optional <String > prefix = arguments .optString (2 );
259+ if (useUTF8 ) {
260+ prefix = prefix .map (StringUtil ::byteStringToUTF8 );
261+ }
262+
263+ String bracketColor = arguments .optString (4 , "" );
264+ if (useUTF8 ) {
265+ bracketColor = StringUtil .byteStringToUTF8 (bracketColor );
266+ }
267+
268+
195269 MutableComponent preparedMessage = appendPrefix (
196- StringUtil .convertAndToSectionMark (arguments . optString ( 2 , APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix . get () )),
197- arguments . optString ( 3 , "[]" ),
198- StringUtil .convertAndToSectionMark (arguments . optString ( 4 , "" ) )
270+ StringUtil .convertAndToSectionMark (prefix . orElseGet ( APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix )),
271+ brackets . orElse ( "[]" ),
272+ StringUtil .convertAndToSectionMark (bracketColor )
199273 ).append (component );
274+
200275 if (!APConfig .PERIPHERALS_CONFIG .chatBoxMultiDimensional .get () && player .level ().dimension () != dimension )
201276 return MethodResult .of (false , "NOT_SAME_DIMENSION" );
202277
@@ -207,15 +282,31 @@ public final MethodResult sendFormattedMessageToPlayer(@NotNull IArguments argum
207282 }
208283
209284
285+ // 0 message, 1 title, 2 playerName, 3 prefix, 4 brackets, 5 bracket color, 6 range, 7 utf8compatible
210286 @ LuaFunction (mainThread = true )
211287 public final MethodResult sendFormattedToastToPlayer (@ NotNull IArguments arguments ) throws LuaException {
212288 return withChatOperation (ignored -> {
213- String message = arguments .getString ( 0 );
289+ boolean useUTF8 = arguments .optBoolean ( 7 , false );
214290
215- if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ())
291+ String message = arguments .getString (0 );
292+ // check size while it represents bytes (in utf8 mode) as that is longer
293+ if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ()) {
216294 return MethodResult .of (null , "Message is too long" );
295+ }
296+
297+ if (useUTF8 ) {
298+ message = StringUtil .byteStringToUTF8 (message );
299+ }
300+
217301
218302 String title = arguments .getString (1 );
303+
304+ // TODO: missing max length check?
305+
306+ if (useUTF8 ) {
307+ title = StringUtil .byteStringToUTF8 (title );
308+ }
309+
219310 String playerName = arguments .getString (2 );
220311 int maxRange = APConfig .PERIPHERALS_CONFIG .chatBoxMaxRange .get ();
221312 int range = arguments .optInt (6 , -1 );
@@ -232,13 +323,31 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen
232323 if (titleComponent == null )
233324 return MethodResult .of (null , "incorrect json for title" );
234325
235- if (checkBrackets (arguments .optString (4 )))
326+ Optional <String > brackets = arguments .optString (4 );
327+
328+ if (useUTF8 ) {
329+ brackets = brackets .map (StringUtil ::byteStringToUTF8 );
330+ }
331+
332+ if (checkBrackets (brackets ))
236333 return MethodResult .of (null , "incorrect bracket string (e.g. [], {}, <>, ,,,)" );
237334
335+
336+ Optional <String > prefix = arguments .optString (3 );
337+ if (useUTF8 ) {
338+ prefix = prefix .map (StringUtil ::byteStringToUTF8 );
339+ }
340+
341+
342+ String bracketColor = arguments .optString (5 , "" );
343+ if (useUTF8 ) {
344+ bracketColor = StringUtil .byteStringToUTF8 (bracketColor );
345+ }
346+
238347 MutableComponent preparedMessage = appendPrefix (
239- StringUtil .convertAndToSectionMark (arguments . optString ( 3 , APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix . get () )),
240- arguments . optString ( 4 , "[]" ),
241- StringUtil .convertAndToSectionMark (arguments . optString ( 5 , "" ) )
348+ StringUtil .convertAndToSectionMark (prefix . orElseGet ( APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix )),
349+ brackets . orElse ( "[]" ),
350+ StringUtil .convertAndToSectionMark (bracketColor )
242351 ).append (messageComponent );
243352
244353 if (!APConfig .PERIPHERALS_CONFIG .chatBoxMultiDimensional .get () && player .level ().dimension () != dimension )
@@ -253,14 +362,22 @@ public final MethodResult sendFormattedToastToPlayer(@NotNull IArguments argumen
253362 });
254363 }
255364
365+ // 0 message, 1 playerName, 2 prefix, 3 brackets, 4 bracket color, 5 range, 6 utf8compatible
256366 @ LuaFunction (mainThread = true )
257367 public final MethodResult sendMessageToPlayer (@ NotNull IArguments arguments ) throws LuaException {
258368 return withChatOperation (ignored -> {
369+ boolean useUTF8 = arguments .optBoolean (6 , false );
370+
259371 String message = arguments .getString (0 );
260372
373+ // check size while it represents bytes (in utf8 mode) as that is longer
261374 if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ())
262375 return MethodResult .of (null , "Message is too long" );
263376
377+ if (useUTF8 ) {
378+ message = StringUtil .byteStringToUTF8 (message );
379+ }
380+
264381 String playerName = arguments .getString (1 );
265382 int maxRange = APConfig .PERIPHERALS_CONFIG .chatBoxMaxRange .get ();
266383 int range = arguments .optInt (5 , -1 );
@@ -269,13 +386,29 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr
269386 if (player == null )
270387 return MethodResult .of (null , "incorrect player name/uuid" );
271388
272- if (checkBrackets (arguments .optString (3 )))
389+ Optional <String > brackets = arguments .optString (3 );
390+
391+ if (useUTF8 ) {
392+ brackets = brackets .map (StringUtil ::byteStringToUTF8 );
393+ }
394+
395+ if (checkBrackets (brackets ))
273396 return MethodResult .of (null , "incorrect bracket string (e.g. [], {}, <>, ...)" );
274397
398+ Optional <String > prefix = arguments .optString (2 );
399+
400+ if (useUTF8 ) {
401+ prefix = prefix .map (StringUtil ::byteStringToUTF8 );
402+ }
403+ String bracketColor = arguments .optString (4 , "" );
404+ if (useUTF8 ) {
405+ bracketColor = StringUtil .byteStringToUTF8 (bracketColor );
406+ }
407+
275408 MutableComponent preparedMessage = appendPrefix (
276- StringUtil .convertAndToSectionMark (arguments . optString ( 2 , APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix . get () )),
277- arguments . optString ( 3 , "[]" ),
278- StringUtil .convertAndToSectionMark (arguments . optString ( 4 , "" ) )
409+ StringUtil .convertAndToSectionMark (prefix . orElseGet ( APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix )),
410+ brackets . orElse ( "[]" ),
411+ StringUtil .convertAndToSectionMark (bracketColor )
279412 ).append (message );
280413 if (!APConfig .PERIPHERALS_CONFIG .chatBoxMultiDimensional .get () && player .level ().dimension () != dimension )
281414 return MethodResult .of (false , "NOT_SAME_DIMENSION" );
@@ -286,15 +419,31 @@ public final MethodResult sendMessageToPlayer(@NotNull IArguments arguments) thr
286419 });
287420 }
288421
422+ // 0 message, 1 title, 2 playerName, 3 prefix, 4 brackets, 5 bracket color, 6 range, 7 utf8compatible
289423 @ LuaFunction (mainThread = true )
290424 public final MethodResult sendToastToPlayer (@ NotNull IArguments arguments ) throws LuaException {
291425 return withChatOperation (ignored -> {
426+ boolean useUTF8 = arguments .optBoolean (7 , false );
427+
292428 String message = arguments .getString (0 );
293429
294430 if (message .length () > APConfig .PERIPHERALS_CONFIG .chatBoxMessageSize .get ())
295431 return MethodResult .of (null , "Message is too long" );
296432
433+ // check size while it represents bytes (in utf8 mode) as that is longer
434+ if (useUTF8 ) {
435+ message = StringUtil .byteStringToUTF8 (message );
436+ }
437+
297438 String title = arguments .getString (1 );
439+
440+ // TODO: missing max length check?
441+
442+ if (useUTF8 ) {
443+ title = StringUtil .byteStringToUTF8 (title );
444+ }
445+
446+
298447 String playerName = arguments .getString (2 );
299448 int maxRange = APConfig .PERIPHERALS_CONFIG .chatBoxMaxRange .get ();
300449 int range = arguments .optInt (6 , -1 );
@@ -303,13 +452,30 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw
303452 if (player == null )
304453 return MethodResult .of (null , "incorrect player name/uuid" );
305454
306- if (checkBrackets (arguments .optString (4 )))
455+ Optional <String > brackets = arguments .optString (4 );
456+
457+ if (useUTF8 ) {
458+ brackets = brackets .map (StringUtil ::byteStringToUTF8 );
459+ }
460+
461+ if (checkBrackets (brackets ))
307462 return MethodResult .of (null , "incorrect bracket string (e.g. [], {}, <>, ...)" );
308463
464+ Optional <String > prefix = arguments .optString (3 );
465+
466+ if (useUTF8 ) {
467+ prefix = prefix .map (StringUtil ::byteStringToUTF8 );
468+ }
469+
470+ String bracketColor = arguments .optString (5 , "" );
471+ if (useUTF8 ) {
472+ bracketColor = StringUtil .byteStringToUTF8 (bracketColor );
473+ }
474+
309475 MutableComponent preparedMessage = appendPrefix (
310- StringUtil .convertAndToSectionMark (arguments . optString ( 3 , APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix . get () )),
311- arguments . optString ( 4 , "[]" ),
312- StringUtil .convertAndToSectionMark (arguments . optString ( 5 , "" ) )
476+ StringUtil .convertAndToSectionMark (prefix . orElseGet ( APConfig .PERIPHERALS_CONFIG .defaultChatBoxPrefix )),
477+ brackets . orElse ( "[]" ),
478+ StringUtil .convertAndToSectionMark (bracketColor )
313479 ).append (message );
314480
315481 if (!APConfig .PERIPHERALS_CONFIG .chatBoxMultiDimensional .get () && player .level ().dimension () != dimension )
@@ -325,8 +491,10 @@ public final MethodResult sendToastToPlayer(@NotNull IArguments arguments) throw
325491
326492 public void update () {
327493 lastConsumedMessage = Events .traverseChatMessages (lastConsumedMessage , message -> {
494+ String byteString = StringUtil .utf8ToByteString (message .message ());
328495 for (IComputerAccess computer : getConnectedComputers ()) {
329- computer .queueEvent ("chat" , message .username (), message .message (), message .uuid (), message .isHidden ());
496+ computer .queueEvent ("chat" , message .username (), message .message (), message .uuid (), message .isHidden (),
497+ byteString );
330498 }
331499 });
332500 }
0 commit comments