QQBot/src/main/java/com/yutou/napcat/event/MessageEvent.java
2024-05-04 17:26:27 +08:00

187 lines
5.7 KiB
Java

package com.yutou.napcat.event;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.annotation.JSONField;
import com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap;
import com.yutou.napcat.QQDatabase;
import com.yutou.napcat.enums.MessageEnum;
import com.yutou.napcat.handle.*;
import com.yutou.napcat.model.AppShareBean;
import com.yutou.napcat.model.Message;
import com.yutou.napcat.model.SourceFrom;
import lombok.Data;
import lombok.val;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Data
public class MessageEvent {
@JSONField(name = "self_id")
private Long selfId;
@JSONField(name = "user_id")
private Long userId;
@JSONField(name = "time")
private Long time;
@JSONField(name = "message_id")
private Integer messageId;
@JSONField(name = "real_id")
private Integer realId;
@JSONField(name = "message_type")
private String messageType;
@JSONField(name = "sender")
private SourceFrom source;
@JSONField(name = "raw_message")
private String rawMessage;
@JSONField(name = "font")
private Integer font;
@JSONField(name = "sub_type")
private String subType;
@JSONField(name = "message")
private List<BaseHandle<?>> message;
@JSONField(name = "message_format")
private String messageFormat;
@JSONField(name = "post_type")
private String postType;
@JSONField(name = "group_id")
private Long groupId;
public static MessageEvent parseHandleHttp(String jsonString) {
return parseHandle(JSONObject.parseObject(jsonString).getJSONObject("data").toString());
}
public static MessageEvent parseHandle(String jsonString) {
JSONObject json = JSONObject.parseObject(jsonString);
JSONArray array = json.getJSONArray("message");
List<BaseHandle<?>> messageList = new ArrayList<>();
for (Object o : array) {
JSONObject _json = (JSONObject) o;
Type classType = null;
MessageEnum _type = MessageEnum.of(_json.getString("type"));
classType = switch (_type) {
case TEXT -> Text.TextInfo.class;
case IMAGE -> Image.ImageInfo.class;
case AT -> At.AtData.class;
case JSON -> OtherHandle.OtherInfo.class;
case REPLY -> Reply.ReplyInfo.class;
default -> classType;
};
BaseHandle<?> handle = new BaseHandle<>(_type.getType());
if (_type == MessageEnum.JSON) {
handle.setData(JSONObject.parseObject(((JSONObject) o).getJSONObject("data").getString("data"), classType));
} else {
handle.setData(JSONObject.parseObject(((JSONObject) o).getJSONObject("data").toString(), classType));
}
messageList.add(handle);
}
SourceFrom sender = new SourceFrom();
sender.setUserId(json.getJSONObject("sender").getLong("user_id"));
sender.setNickname(json.getJSONObject("sender").getString("nickname"));
sender.setCard(json.getJSONObject("sender").getString("card"));
MessageEvent event = new MessageEvent();
event.setSelfId(json.getLong("self_id"));
event.setUserId(json.getLong("user_id"));
event.setTime(json.getLong("time"));
event.setMessageId(json.getInteger("message_id"));
event.setRealId(json.getInteger("real_id"));
event.setMessageType(json.getString("message_type"));
event.setSource(sender);
event.setRawMessage(json.getString("raw_message"));
event.setFont(json.getInteger("font"));
event.setSubType(json.getString("sub_type"));
event.setMessageFormat(json.getString("message_format"));
event.setPostType(json.getString("post_type"));
event.setGroupId(json.getLong("group_id"));
event.setMessage(messageList);
return event;
}
public boolean hasType(MessageEnum messageEnum) {
for (BaseHandle<?> handle : message) {
if (MessageEnum.of(handle.getType()) == messageEnum) {
return true;
}
}
return false;
}
public <T extends BaseHandle> List<T> findAllType(Class<T> t) {
List<T> tmp = new ArrayList<>();
try {
T newed = t.getDeclaredConstructor().newInstance();
for (BaseHandle<?> baseHandle : message) {
if (baseHandle.getType().equals(newed.getType())) {
newed.setData(baseHandle.getData());
tmp.add(newed);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return tmp;
}
public <T extends BaseHandle> T findType(Class<T> tClass) {
List<T> list = findAllType(tClass);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
public boolean isAtMe() {
if (!hasType(MessageEnum.AT)) {
return false;
}
List<At> list = findAllType(At.class);
for (At handle : list) {
if (handle.getData().getQq() == QQDatabase.getMe().getUserId()) {
return true;
}
}
return false;
}
public String getTextMessage() {
val texts = findAllType(Text.class);
StringBuilder sb = new StringBuilder();
for (Text text : texts) {
sb.append(text);
}
return sb.toString().trim();
}
public boolean isUser() {
return "private".equals(messageType);
}
public boolean isGroup() {
return "group".equals(messageType);
}
}