Skip to content

Commit 901781a

Browse files
authored
Merge pull request #757 from 456dev/feat/chatbox-utf8
add utf8 message support to chatboxes
2 parents 6a401ab + d3c1973 commit 901781a

2 files changed

Lines changed: 234 additions & 36 deletions

File tree

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

Lines changed: 196 additions & 28 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,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

Comments
 (0)