package com.xmzs.midjourney.wss.handle;
|
|
import cn.hutool.core.text.CharSequenceUtil;
|
import com.xmzs.midjourney.Constants;
|
import com.xmzs.midjourney.enums.MessageType;
|
import com.xmzs.midjourney.loadbalancer.DiscordLoadBalancer;
|
import com.xmzs.midjourney.support.DiscordHelper;
|
import com.xmzs.midjourney.support.Task;
|
import com.xmzs.midjourney.support.TaskCondition;
|
import jakarta.annotation.Resource;
|
import net.dv8tion.jda.api.utils.data.DataArray;
|
import net.dv8tion.jda.api.utils.data.DataObject;
|
|
import java.util.Comparator;
|
|
public abstract class MessageHandler {
|
@Resource
|
protected DiscordLoadBalancer discordLoadBalancer;
|
@Resource
|
protected DiscordHelper discordHelper;
|
|
public abstract void handle(MessageType messageType, DataObject message);
|
|
protected String getMessageContent(DataObject message) {
|
return message.hasKey("content") ? message.getString("content") : "";
|
}
|
|
protected String getMessageNonce(DataObject message) {
|
return message.hasKey("nonce") ? message.getString("nonce") : "";
|
}
|
|
protected void findAndFinishImageTask(TaskCondition condition, String finalPrompt, DataObject message) {
|
String imageUrl = getImageUrl(message);
|
String messageHash = this.discordHelper.getMessageHash(imageUrl);
|
condition.setMessageHash(messageHash);
|
Task task = this.discordLoadBalancer.findRunningTask(condition)
|
.findFirst().orElseGet(() -> {
|
condition.setMessageHash(null);
|
return this.discordLoadBalancer.findRunningTask(condition)
|
.min(Comparator.comparing(Task::getStartTime))
|
.orElse(null);
|
});
|
if (task == null) {
|
return;
|
}
|
task.setProperty(Constants.TASK_PROPERTY_FINAL_PROMPT, finalPrompt);
|
task.setProperty(Constants.TASK_PROPERTY_MESSAGE_HASH, messageHash);
|
task.setImageUrl(imageUrl);
|
finishTask(task, message);
|
task.awake();
|
}
|
|
protected void finishTask(Task task, DataObject message) {
|
task.setProperty(Constants.TASK_PROPERTY_MESSAGE_ID, message.getString("id"));
|
task.setProperty(Constants.TASK_PROPERTY_FLAGS, message.getInt("flags", 0));
|
task.setProperty(Constants.TASK_PROPERTY_MESSAGE_HASH, this.discordHelper.getMessageHash(task.getImageUrl()));
|
task.success();
|
}
|
|
protected boolean hasImage(DataObject message) {
|
DataArray attachments = message.optArray("attachments").orElse(DataArray.empty());
|
return !attachments.isEmpty();
|
}
|
|
protected String getImageUrl(DataObject message) {
|
DataArray attachments = message.getArray("attachments");
|
if (!attachments.isEmpty()) {
|
String imageUrl = attachments.getObject(0).getString("url");
|
return replaceCdnUrl(imageUrl);
|
}
|
return null;
|
}
|
|
protected String replaceCdnUrl(String imageUrl) {
|
if (CharSequenceUtil.isBlank(imageUrl)) {
|
return imageUrl;
|
}
|
String cdn = this.discordHelper.getCdn();
|
if (CharSequenceUtil.startWith(imageUrl, cdn)) {
|
return imageUrl;
|
}
|
return CharSequenceUtil.replaceFirst(imageUrl, DiscordHelper.DISCORD_CDN_URL, cdn);
|
}
|
|
}
|