Skip to content

Commit d00cf80

Browse files
committed
add utf8 message support to chatboxes
adds optional "useUtf8" parameter, informing us that the program is utf8 aware, providing its strings as utf8, This allows sending messages in the extended minecraft character set. see the utf8 lib in cc, as well as the \u{xxxx} escape sequence. also sends the events with a new utf8 message parameter.
1 parent 35bcf26 commit d00cf80

2 files changed

Lines changed: 236 additions & 37 deletions

File tree

src/main/java/de/srendi/advancedperipherals/common/addons/computercraft/peripheral/ChatBoxPeripheral.java

Lines changed: 205 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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,26 +163,52 @@ 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())
149-
return MethodResult.of(null, "Message is too long");
174+
// check size while it represents bytes (in utf8 mode) as that is longer
175+
if (message.length() > APConfig.PERIPHERALS_CONFIG.chatBoxMessageSize.get()) {
176+
return MethodResult.of(null, "Message is too long");
177+
}
150178

151-
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
152-
int range = arguments.optInt(4, -1);
153-
ResourceKey<Level> dimension = getLevel().dimension();
154-
if (checkBrackets(arguments.optString(2)))
179+
if (useUTF8) {
180+
message = StringUtil.byteStringToUTF8(message);
181+
}
182+
183+
int maxRange = APConfig.PERIPHERALS_CONFIG.chatBoxMaxRange.get();
184+
int range = arguments.optInt(4, -1);
185+
ResourceKey<Level> dimension = getLevel().dimension();
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

157-
MutableComponent preparedMessage = appendPrefix(
158-
StringUtil.convertAndToSectionMark(arguments.optString(1, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())),
159-
arguments.optString(2, "[]"),
160-
StringUtil.convertAndToSectionMark(arguments.optString(3, ""))
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+
205+
MutableComponent preparedMessage = appendPrefix(
206+
StringUtil.convertAndToSectionMark(prefix.orElseGet(APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix)),
207+
brackets.orElse("[]"),
208+
StringUtil.convertAndToSectionMark(bracketColor)
161209
).append(message);
162-
for (ServerPlayer player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) {
210+
211+
for (ServerPlayer player : ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayers()) {
163212
if (!APConfig.PERIPHERALS_CONFIG.chatBoxMultiDimensional.get() && player.level().dimension() != dimension)
164213
continue;
165214
if (CoordUtil.isInRange(getPos(), getLevel(), player, range, maxRange))
@@ -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 -> {
289+
boolean useUTF8 = arguments.optBoolean(7, false);
290+
213291
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()) {
294+
return MethodResult.of(null, "Message is too long");
295+
}
214296

215-
if (message.length() > APConfig.PERIPHERALS_CONFIG.chatBoxMessageSize.get())
216-
return MethodResult.of(null, "Message is too long");
297+
if (useUTF8) {
298+
message = StringUtil.byteStringToUTF8(message);
299+
}
300+
301+
302+
String title = arguments.getString(1);
303+
304+
// TODO: missing max length check?
305+
306+
if (useUTF8) {
307+
title = StringUtil.byteStringToUTF8(title);
308+
}
217309

218-
String title = arguments.getString(1);
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

275-
MutableComponent preparedMessage = appendPrefix(
276-
StringUtil.convertAndToSectionMark(arguments.optString(2, APConfig.PERIPHERALS_CONFIG.defaultChatBoxPrefix.get())),
277-
arguments.optString(3, "[]"),
278-
StringUtil.convertAndToSectionMark(arguments.optString(4, ""))
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+
408+
MutableComponent preparedMessage = appendPrefix(
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 -> {
328-
for (IComputerAccess computer : getConnectedComputers()) {
329-
computer.queueEvent("chat", message.username(), message.message(), message.uuid(), message.isHidden());
494+
String byteString = StringUtil.utf8ToByteString(message.message());
495+
for (IComputerAccess computer : getConnectedComputers()) {
496+
computer.queueEvent("chat", message.username(), message.message(), message.uuid(), message.isHidden(),
497+
byteString);
330498
}
331499
});
332500
}

0 commit comments

Comments
 (0)