1
1
package org .togetherjava .tjbot .features .jshell ;
2
2
3
3
import net .dv8tion .jda .api .EmbedBuilder ;
4
+ import net .dv8tion .jda .api .entities .Member ;
4
5
import net .dv8tion .jda .api .entities .Message ;
5
6
import net .dv8tion .jda .api .entities .MessageEmbed ;
6
- import net .dv8tion .jda .api .entities .User ;
7
7
import net .dv8tion .jda .api .events .interaction .ModalInteractionEvent ;
8
8
import net .dv8tion .jda .api .events .interaction .command .SlashCommandInteractionEvent ;
9
9
import net .dv8tion .jda .api .interactions .InteractionHook ;
@@ -52,6 +52,8 @@ public class JShellCommand extends SlashCommandAdapter {
52
52
private static final int MIN_MESSAGE_INPUT_LENGTH = 0 ;
53
53
private static final int MAX_MESSAGE_INPUT_LENGTH = TextInput .MAX_VALUE_LENGTH ;
54
54
55
+ private static final String MAX_SNIPPETS_FILE_PREFIX = " // Snippet 1000" ;
56
+ private static final String MAX_SNIPPETS_EMBED_PREFIX = "Snippet 10```java\n ```" ;
55
57
private final JShellEval jshellEval ;
56
58
57
59
/**
@@ -103,7 +105,7 @@ public void onModalSubmitted(ModalInteractionEvent event, List<String> args) {
103
105
mapping = event .getValue (TEXT_INPUT_PART_ID );
104
106
}
105
107
if (mapping != null ) {
106
- handleEval (event , event .getUser (), true , mapping .getAsString (), startupScript );
108
+ handleEval (event , event .getMember (), true , mapping .getAsString (), startupScript );
107
109
}
108
110
}
109
111
@@ -125,7 +127,7 @@ private void handleEvalCommand(SlashCommandInteractionEvent event) {
125
127
if (code == null ) {
126
128
sendEvalModal (event , startupScript );
127
129
} else {
128
- handleEval (event , event .getUser (), true , code .getAsString (), startupScript );
130
+ handleEval (event , event .getMember (), true , code .getAsString (), startupScript );
129
131
}
130
132
}
131
133
@@ -145,78 +147,80 @@ private void sendEvalModal(SlashCommandInteractionEvent event, boolean startupSc
145
147
* Handle evaluation of code.
146
148
*
147
149
* @param replyCallback the callback to reply to
148
- * @param user the user , if null, will create a single use session
150
+ * @param member the member , if null, will create a single use session
149
151
* @param showCode if the embed should contain the original code
150
152
* @param startupScript if the startup script should be used or not
151
153
* @param code the code
152
154
*/
153
- private void handleEval (IReplyCallback replyCallback , @ Nullable User user , boolean showCode ,
155
+ private void handleEval (IReplyCallback replyCallback , @ Nullable Member member , boolean showCode ,
154
156
String code , boolean startupScript ) {
155
157
replyCallback .deferReply ().queue (interactionHook -> {
156
158
try {
157
- interactionHook
158
- .editOriginalEmbeds (
159
- jshellEval .evaluateAndRespond (user , code , showCode , startupScript ))
160
- .queue ();
159
+ MessageEmbed messageEmbed =
160
+ jshellEval .evaluateAndRespond (member , code , showCode , startupScript );
161
+ interactionHook .sendMessageEmbeds (messageEmbed ).queue ();
161
162
} catch (RequestFailedException | ConnectionFailedException e ) {
162
- interactionHook .editOriginalEmbeds (createUnexpectedErrorEmbed (user , e )).queue ();
163
+ interactionHook .editOriginalEmbeds (createUnexpectedErrorEmbed (member , e )).queue ();
163
164
}
164
165
});
165
166
}
166
167
167
168
private void handleSnippetsCommand (SlashCommandInteractionEvent event ) {
168
169
event .deferReply ().queue (interactionHook -> {
169
170
OptionMapping userOption = event .getOption (USER_PARAMETER );
170
- User user = userOption == null ? event .getUser () : userOption .getAsUser ();
171
+ Member member = Objects
172
+ .requireNonNull (userOption == null ? event .getMember () : userOption .getAsMember ());
171
173
OptionMapping includeStartupScriptOption =
172
174
event .getOption (INCLUDE_STARTUP_SCRIPT_PARAMETER );
173
175
boolean includeStartupScript =
174
176
includeStartupScriptOption != null && includeStartupScriptOption .getAsBoolean ();
175
177
List <String > snippets ;
176
178
try {
177
179
snippets = jshellEval .getApi ()
178
- .snippetsSession (user .getId (), includeStartupScript )
180
+ .snippetsSession (member .getId (), includeStartupScript )
179
181
.snippets ();
180
182
} catch (RequestFailedException e ) {
181
183
if (e .getStatus () == JShellApi .SESSION_NOT_FOUND ) {
182
- interactionHook .editOriginalEmbeds (createSessionNotFoundErrorEmbed (user ))
184
+ interactionHook .editOriginalEmbeds (createSessionNotFoundErrorEmbed (member ))
183
185
.queue ();
184
186
} else {
185
- interactionHook .editOriginalEmbeds (createUnexpectedErrorEmbed (user , e )).queue ();
187
+ interactionHook .editOriginalEmbeds (createUnexpectedErrorEmbed (member , e ))
188
+ .queue ();
186
189
}
187
190
return ;
188
191
} catch (ConnectionFailedException e ) {
189
- interactionHook .editOriginalEmbeds (createUnexpectedErrorEmbed (user , e )).queue ();
192
+ interactionHook .editOriginalEmbeds (createUnexpectedErrorEmbed (member , e )).queue ();
190
193
return ;
191
194
}
192
195
193
- sendSnippets (interactionHook , user , snippets );
196
+ sendSnippets (interactionHook , member , snippets );
194
197
});
195
198
}
196
199
197
- private void sendSnippets (InteractionHook interactionHook , User user , List <String > snippets ) {
200
+ private void sendSnippets (InteractionHook interactionHook , Member member ,
201
+ List <String > snippets ) {
198
202
if (canBeSentAsEmbed (snippets )) {
199
- sendSnippetsAsEmbed (interactionHook , user , snippets );
203
+ sendSnippetsAsEmbed (interactionHook , member , snippets );
200
204
} else if (canBeSentAsFile (snippets )) {
201
- sendSnippetsAsFile (interactionHook , user , snippets );
205
+ sendSnippetsAsFile (interactionHook , member , snippets );
202
206
} else {
203
- sendSnippetsTooLong (interactionHook , user );
207
+ sendSnippetsTooLong (interactionHook , member );
204
208
}
205
209
}
206
210
207
211
private boolean canBeSentAsEmbed (List <String > snippets ) {
208
212
return snippets .stream ().noneMatch (s -> s .length () >= MessageEmbed .VALUE_MAX_LENGTH )
209
213
&& snippets .stream ()
210
- .mapToInt (s -> (s + "Snippet 10```java \n ```" ).length ())
214
+ .mapToInt (s -> (s + MAX_SNIPPETS_EMBED_PREFIX ).length ())
211
215
.sum () < MessageEmbed .EMBED_MAX_LENGTH_BOT - 100
212
216
&& snippets .size () <= MessageUtils .MAXIMUM_VISIBLE_EMBEDS ;
213
217
}
214
218
215
- private void sendSnippetsAsEmbed (InteractionHook interactionHook , User user ,
219
+ private void sendSnippetsAsEmbed (InteractionHook interactionHook , Member member ,
216
220
List <String > snippets ) {
217
221
EmbedBuilder builder = new EmbedBuilder ().setColor (Colors .SUCCESS_COLOR )
218
- .setAuthor (user . getName ())
219
- .setTitle (snippetsTitle (user ));
222
+ .setAuthor (member . getEffectiveName ())
223
+ .setTitle (snippetsTitle (member ));
220
224
int i = 1 ;
221
225
for (String snippet : snippets ) {
222
226
builder .addField ("Snippet " + i , "```java\n " + snippet + "```" , false );
@@ -227,35 +231,45 @@ private void sendSnippetsAsEmbed(InteractionHook interactionHook, User user,
227
231
228
232
private boolean canBeSentAsFile (List <String > snippets ) {
229
233
return snippets .stream ()
230
- .mapToInt (s -> (s + "// Snippet 10" ).getBytes ().length )
234
+ .mapToInt (s -> (s + MAX_SNIPPETS_FILE_PREFIX ).getBytes ().length )
231
235
.sum () < Message .MAX_FILE_SIZE ;
232
236
}
233
237
234
- private void sendSnippetsAsFile (InteractionHook interactionHook , User user ,
238
+ private void sendSnippetsAsFile (InteractionHook interactionHook , Member member ,
235
239
List <String > snippets ) {
236
240
StringBuilder sb = new StringBuilder ();
237
241
int i = 1 ;
238
242
for (String snippet : snippets ) {
239
- sb .append ("// Snippet " ).append (i ).append ("\n " ).append (snippet );
243
+ snippet = snippet .replaceAll ("^\n +" , "" );
244
+ if (!snippet .endsWith ("\n " )) {
245
+ snippet += "\n " ;
246
+ }
247
+ int idxOf = snippet .indexOf ("\n " );
248
+ int insertIndex = idxOf != -1 ? idxOf : snippet .length ();
249
+ sb .append (snippet , 0 , insertIndex )
250
+ .append (" // Snippet " )
251
+ .append (i )
252
+ .append (snippet .substring (insertIndex ));
240
253
i ++;
241
254
}
242
255
interactionHook
243
256
.editOriginalEmbeds (new EmbedBuilder ().setColor (Colors .SUCCESS_COLOR )
244
- .setAuthor (user . getName ())
245
- .setTitle (snippetsTitle (user ))
257
+ .setAuthor (member . getEffectiveName ())
258
+ .setTitle (snippetsTitle (member ))
246
259
.build ())
247
- .setFiles (FileUpload .fromData (sb .toString ().getBytes (), snippetsTitle (user )))
260
+ .setFiles (
261
+ FileUpload .fromData (sb .toString ().getBytes (), snippetsTitle (member ) + ".java" ))
248
262
.queue ();
249
263
}
250
264
251
- private String snippetsTitle (User user ) {
252
- return user . getName () + "'s snippets" ;
265
+ private String snippetsTitle (Member member ) {
266
+ return member . getEffectiveName () + "'s snippets" ;
253
267
}
254
268
255
- private void sendSnippetsTooLong (InteractionHook interactionHook , User user ) {
269
+ private void sendSnippetsTooLong (InteractionHook interactionHook , Member member ) {
256
270
interactionHook
257
271
.editOriginalEmbeds (new EmbedBuilder ().setColor (Colors .ERROR_COLOR )
258
- .setAuthor (user . getName ())
272
+ .setAuthor (member . getEffectiveName ())
259
273
.setTitle ("Too much code to send..." )
260
274
.build ())
261
275
.queue ();
@@ -266,13 +280,16 @@ private void handleCloseCommand(SlashCommandInteractionEvent event) {
266
280
jshellEval .getApi ().closeSession (event .getUser ().getId ());
267
281
} catch (RequestFailedException e ) {
268
282
if (e .getStatus () == JShellApi .SESSION_NOT_FOUND ) {
269
- event .replyEmbeds (createSessionNotFoundErrorEmbed (event .getUser ())).queue ();
283
+ event
284
+ .replyEmbeds (createSessionNotFoundErrorEmbed (
285
+ Objects .requireNonNull (event .getMember ())))
286
+ .queue ();
270
287
} else {
271
- event .replyEmbeds (createUnexpectedErrorEmbed (event .getUser (), e )).queue ();
288
+ event .replyEmbeds (createUnexpectedErrorEmbed (event .getMember (), e )).queue ();
272
289
}
273
290
return ;
274
291
} catch (ConnectionFailedException e ) {
275
- event .replyEmbeds (createUnexpectedErrorEmbed (event .getUser (), e )).queue ();
292
+ event .replyEmbeds (createUnexpectedErrorEmbed (event .getMember (), e )).queue ();
276
293
return ;
277
294
}
278
295
@@ -296,23 +313,23 @@ private void handleStartupScriptCommand(SlashCommandInteractionEvent event) {
296
313
.build ())
297
314
.queue ();
298
315
} catch (RequestFailedException | ConnectionFailedException e ) {
299
- event .replyEmbeds (createUnexpectedErrorEmbed (event .getUser (), e )).queue ();
316
+ event .replyEmbeds (createUnexpectedErrorEmbed (event .getMember (), e )).queue ();
300
317
}
301
318
});
302
319
}
303
320
304
- private MessageEmbed createSessionNotFoundErrorEmbed (User user ) {
305
- return new EmbedBuilder ().setAuthor (user . getName () + "'s result" )
321
+ private MessageEmbed createSessionNotFoundErrorEmbed (Member member ) {
322
+ return new EmbedBuilder ().setAuthor (member . getEffectiveName () + "'s result" )
306
323
.setColor (Colors .ERROR_COLOR )
307
- .setDescription ("Could not find session for user " + user . getName ())
324
+ .setDescription ("Could not find session for member " + member . getEffectiveName ())
308
325
.build ();
309
326
}
310
327
311
- private MessageEmbed createUnexpectedErrorEmbed (@ Nullable User user , Exception e ) {
328
+ private MessageEmbed createUnexpectedErrorEmbed (@ Nullable Member member , Exception e ) {
312
329
EmbedBuilder embedBuilder = new EmbedBuilder ().setColor (Colors .ERROR_COLOR )
313
330
.setDescription ("Request failed: " + e .getMessage ());
314
- if (user != null ) {
315
- embedBuilder .setAuthor (user . getName () + "'s result" );
331
+ if (member != null ) {
332
+ embedBuilder .setAuthor (member . getEffectiveName () + "'s result" );
316
333
}
317
334
return embedBuilder .build ();
318
335
}
0 commit comments