办学质量监测教学评价系统
ageer
2024-02-27 a079ef44e53acd9e8df51dbb31cf5aea4f9be5bd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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);
    }
 
}