Skip to content

Commit 5707f50

Browse files
committed
feature "rewrite-msg command": applies changes due to Zabu's first review;
1 parent ef2626f commit 5707f50

File tree

4 files changed

+96
-233
lines changed

4 files changed

+96
-233
lines changed

application/src/main/java/org/togetherjava/tjbot/features/Features.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.togetherjava.tjbot.features.mediaonly.MediaOnlyChannelListener;
4343
import org.togetherjava.tjbot.features.messages.MessageCommand;
4444
import org.togetherjava.tjbot.features.messages.RewriteMsgCommand;
45-
import org.togetherjava.tjbot.features.messages.RewriteMsgService;
4645
import org.togetherjava.tjbot.features.moderation.BanCommand;
4746
import org.togetherjava.tjbot.features.moderation.KickCommand;
4847
import org.togetherjava.tjbot.features.moderation.ModerationActionsStore;
@@ -128,7 +127,6 @@ public static Collection<Feature> createFeatures(JDA jda, Database database, Con
128127
TopHelpersService topHelpersService = new TopHelpersService(database);
129128
TopHelpersAssignmentRoutine topHelpersAssignmentRoutine =
130129
new TopHelpersAssignmentRoutine(config, topHelpersService);
131-
RewriteMsgService rewriteService = new RewriteMsgService(chatGptService, helpSystemHelper);
132130

133131
// NOTE The system can add special system relevant commands also by itself,
134132
// hence this list may not necessarily represent the full list of all commands actually
@@ -210,7 +208,7 @@ public static Collection<Feature> createFeatures(JDA jda, Database database, Con
210208
features.add(new ChatGptCommand(chatGptService, helpSystemHelper));
211209
features.add(new JShellCommand(jshellEval));
212210
features.add(new MessageCommand());
213-
features.add(new RewriteMsgCommand(rewriteService));
211+
features.add(new RewriteMsgCommand(chatGptService));
214212

215213
FeatureBlacklist<Class<?>> blacklist = blacklistConfig.normal();
216214
return blacklist.filterStream(features.stream(), Object::getClass).toList();
Lines changed: 95 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
package org.togetherjava.tjbot.features.messages;
22

3-
import net.dv8tion.jda.api.entities.MessageEmbed;
43
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
4+
import net.dv8tion.jda.api.interactions.commands.OptionMapping;
55
import net.dv8tion.jda.api.interactions.commands.OptionType;
66
import net.dv8tion.jda.api.interactions.commands.build.OptionData;
7+
import org.jetbrains.annotations.Nullable;
78
import org.slf4j.Logger;
89
import org.slf4j.LoggerFactory;
910

1011
import org.togetherjava.tjbot.features.CommandVisibility;
1112
import org.togetherjava.tjbot.features.SlashCommandAdapter;
13+
import org.togetherjava.tjbot.features.chatgpt.ChatGptModel;
14+
import org.togetherjava.tjbot.features.chatgpt.ChatGptService;
1215

1316
import java.util.Arrays;
17+
import java.util.Objects;
1418
import java.util.Optional;
1519

1620
/**
17-
* The implemented command is {@code /rewrite}, which allows users to have their message rewritten
18-
* in a clearer, more professional, or better structured form using ChatGPT AI.
21+
* The implemented command is {@code /rewrite-msg}, which allows users to have their message
22+
* rewritten in a clearer, more professional, or better structured form using ChatGPT AI.
1923
* <p>
2024
* The rewritten message is shown as an ephemeral message visible only to the user who triggered the
2125
* command, making it perfect for getting quick writing improvements without cluttering the channel.
@@ -24,84 +28,126 @@
2428
*/
2529
public final class RewriteMsgCommand extends SlashCommandAdapter {
2630
private static final Logger logger = LoggerFactory.getLogger(RewriteMsgCommand.class);
27-
public static final String COMMAND_NAME = "rewrite";
31+
public static final String COMMAND_NAME = "rewrite-msg";
2832
private static final String MESSAGE_OPTION = "message";
2933
private static final String TONE_OPTION = "tone";
3034
private static final int MAX_MESSAGE_LENGTH = 500;
3135
private static final int MIN_MESSAGE_LENGTH = 3;
36+
private static final ChatGptModel CHAT_GPT_MODEL = ChatGptModel.HIGH_QUALITY;
3237

33-
private final RewriteMsgService rewriteMsgService;
38+
private final ChatGptService chatGptService;
3439

40+
private static String buildResponse(String userMessage, String rewrittenMessage, MsgTone tone) {
41+
final String toneLabel = tone.displayName;
3542

36-
public RewriteMsgCommand(RewriteMsgService rewriteMsgService) {
37-
super(COMMAND_NAME, "Rewrite your message in a clearer, more professional form",
38-
CommandVisibility.GUILD);
43+
return """
44+
**Rewritten message (%s)**
3945
40-
this.rewriteMsgService = rewriteMsgService;
46+
**Original:**
47+
%s
4148
42-
logger.debug("Initializing RewriteMsgCommand with ChatGptService and HelpSystemHelper");
49+
**Rewritten:**
50+
%s""".formatted(toneLabel, userMessage, rewrittenMessage);
51+
}
4352

44-
final OptionData toneOption = new OptionData(OptionType.STRING, TONE_OPTION,
45-
"The tone/style for the rewritten message (default: "
46-
+ RewriteMsgTone.CLEAR.getDisplayName() + ")",
47-
false);
53+
private static String buildChatGptPrompt(String userMessage, MsgTone tone) {
54+
return """
55+
Please rewrite the following message to make it clearer, more professional, \
56+
and better structured. Maintain the original meaning while improving the quality \
57+
of the writing. Do NOT use em-dashes (—). %s
58+
59+
If the message is already well-written, provide minor improvements.
4860
49-
logger.debug("Adding tone choices to command options");
50-
Arrays.stream(RewriteMsgTone.values()).forEach(tone -> {
51-
toneOption.addChoice(tone.getDisplayName(), tone.name());
52-
logger.debug("Added tone choice: {} ({})", tone.getDisplayName(), tone.name());
53-
});
61+
Original message:
62+
%s""".formatted(tone.description, userMessage);
63+
}
64+
65+
/**
66+
* Creates the slash command definition and configures available options for rewriting messages.
67+
*
68+
* @param chatGptService service for interacting with ChatGPT
69+
*/
70+
public RewriteMsgCommand(ChatGptService chatGptService) {
71+
super(COMMAND_NAME, "Let AI rephrase and improve your message", CommandVisibility.GUILD);
72+
73+
this.chatGptService = chatGptService;
5474

5575
final OptionData messageOption =
5676
new OptionData(OptionType.STRING, MESSAGE_OPTION, "The message you want to rewrite",
5777
true)
5878
.setMinLength(MIN_MESSAGE_LENGTH)
5979
.setMaxLength(MAX_MESSAGE_LENGTH);
6080

61-
logger.debug("Configured message option: min={}, max={}", MIN_MESSAGE_LENGTH,
62-
MAX_MESSAGE_LENGTH);
81+
final OptionData toneOption = new OptionData(OptionType.STRING, TONE_OPTION,
82+
"The tone/style for the rewritten message (default: " + MsgTone.CLEAR.displayName
83+
+ ")",
84+
false);
85+
86+
Arrays.stream(MsgTone.values())
87+
.forEach(tone -> toneOption.addChoice(tone.displayName, tone.name()));
6388

64-
super.getData().addOptions(messageOption, toneOption);
65-
logger.debug("RewriteMsgCommand initialization complete");
89+
getData().addOptions(messageOption, toneOption);
6690
}
6791

6892
@Override
6993
public void onSlashCommand(SlashCommandInteractionEvent event) {
70-
logger.debug("onSlashCommand method invoked");
94+
final String userMessage =
95+
Objects.requireNonNull(event.getOption(MESSAGE_OPTION)).getAsString();
96+
97+
final MsgTone tone = parseTone(event.getOption(TONE_OPTION), event.getUser().getId());
98+
7199
event.deferReply(true).queue();
72-
logger.debug("Reply deferred as ephemeral");
73100

74-
final String userId = event.getUser().getId();
101+
final Optional<String> rewrittenMessage = this.rewrite(userMessage, tone);
75102

76-
logger.info("Rewrite command triggered by user: {}", userId);
103+
if (rewrittenMessage.isEmpty()) {
104+
logger.debug("Failed to obtain a response for /rewrite-msg, original message: '{}'",
105+
userMessage);
106+
event.getHook()
107+
.editOriginal(
108+
"An error occurred while processing your request. Please try again later.")
109+
.queue();
110+
return;
111+
}
77112

78-
final String userMessage =
79-
this.rewriteMsgService.validateMsg(event.getOption(MESSAGE_OPTION), userId);
113+
final String response = buildResponse(userMessage, rewrittenMessage.orElseThrow(), tone);
80114

81-
final RewriteMsgTone tone =
82-
this.rewriteMsgService.parseTone(event.getOption(TONE_OPTION), userId);
115+
event.getHook().editOriginal(response).queue();
116+
}
83117

84-
final Optional<String> rewrittenMessage =
85-
this.rewriteMsgService.rewrite(userMessage, tone, userId);
118+
private MsgTone parseTone(@Nullable OptionMapping toneOption, String userId)
119+
throws IllegalArgumentException {
120+
if (toneOption == null) {
121+
logger.debug("Tone option not provided for user: {}, using default CLEAR", userId);
122+
return MsgTone.CLEAR;
123+
}
86124

87-
final Optional<MessageEmbed> responseEmbed =
88-
this.rewriteMsgService.buildResponse(userMessage, rewrittenMessage.orElse(null),
89-
tone, userId, event.getJDA().getSelfUser());
125+
final String toneValue = toneOption.getAsString();
126+
final MsgTone tone = MsgTone.valueOf(toneValue);
90127

91-
logger.debug("Sending embed response to user: {}", userId);
128+
logger.debug("Parsed tone '{}' for user: {}", tone.displayName, userId);
92129

93-
if (responseEmbed.isPresent()) {
94-
event.getHook()
95-
.sendMessageEmbeds(responseEmbed.get())
96-
.queue(_ -> logger.info("Rewrite response sent successfully to user: {}", userId),
97-
error -> logger.error("Failed to send rewrite response to user: {}", userId,
98-
error));
99-
} else {
100-
logger.error("Failed to build response embed for user: {}", userId);
101-
event.getHook()
102-
.sendMessage(
103-
"An error occurred while processing your request. Please try again later.")
104-
.queue();
130+
return tone;
131+
}
132+
133+
private Optional<String> rewrite(String userMessage, MsgTone tone) {
134+
final String rewritePrompt = buildChatGptPrompt(userMessage, tone);
135+
136+
return chatGptService.ask(rewritePrompt, tone.displayName, CHAT_GPT_MODEL);
137+
}
138+
139+
private enum MsgTone {
140+
CLEAR("Clear", "Make it clear and easy to understand."),
141+
PRO("Pro", "Use a professional and polished tone."),
142+
DETAILED("Detailed", "Expand with more detail and explanation."),
143+
TECHNICAL("Technical", "Use technical and specialized language where appropriate.");
144+
145+
private final String displayName;
146+
private final String description;
147+
148+
MsgTone(String displayName, String description) {
149+
this.displayName = displayName;
150+
this.description = description;
105151
}
106152
}
107153
}

application/src/main/java/org/togetherjava/tjbot/features/messages/RewriteMsgService.java

Lines changed: 0 additions & 139 deletions
This file was deleted.

0 commit comments

Comments
 (0)