package org.ruoyi.system.handler; import com.jfinal.kit.PropKit; import org.ruoyi.common.chat.domain.request.ChatRequest; import org.ruoyi.common.chat.entity.chat.ChatCompletion; import org.ruoyi.common.chat.entity.images.Item; import org.ruoyi.common.wechat.itchat4j.beans.BaseMsg; import org.ruoyi.common.wechat.itchat4j.core.CoreManage; import org.ruoyi.common.wechat.itchat4j.face.IMsgHandlerFace; import org.ruoyi.common.wechat.itchat4j.utils.LogInterface; import org.ruoyi.common.wechat.itchat4j.utils.enums.SendMsgType; import org.ruoyi.common.wechat.itchat4j.utils.tools.CommonTools; import org.ruoyi.common.wechat.web.constant.ConfigKeys; import org.ruoyi.common.wechat.web.model.WxRobConfig; import org.ruoyi.common.wechat.web.model.WxRobKeyword; import org.ruoyi.system.domain.vo.WxRobConfigVo; import org.ruoyi.system.service.ISseService; import org.apache.commons.lang3.StringUtils; import java.io.File; import java.util.List; import java.util.regex.Matcher; /** * 消息处理实现 默认方案 * @author WesleyOne * @create 2018/12/11 */ public class MyMsgHandler implements IMsgHandlerFace,LogInterface { private String uniqueKey; private final ISseService sseService; private WxRobConfigVo robConfigVo; public MyMsgHandler(String uniqueKey,ISseService sseService,WxRobConfigVo robConfigVo){ this.uniqueKey = uniqueKey; this.sseService = sseService; this.robConfigVo = robConfigVo; } private String getDownloadPath(String fileName) { String download_path = PropKit.get("download_path"); return download_path+ File.separator + uniqueKey +File.separator + fileName; } @Override public void textMsgHandle(BaseMsg msg) { String fromNickName = msg.getFromNickName(); String fromUserName = msg.getFromUserName(); boolean groupMsg = msg.isGroupMsg(); String text = msg.getText().trim(); if (groupMsg && text.contains("@" + fromNickName)) { handleGroupMessage(fromNickName, fromUserName, text); } else { respondWithChatGPT(fromUserName, text); } } private void handleGroupMessage(String fromNickName, String fromUserName, String text) { String prompt = text.replace("@" + fromNickName + " ", ""); if (prompt.startsWith("画")) { generateAndSendImage(fromUserName, prompt.replaceFirst("画 ", "")); } else { respondWithChatGPT(fromUserName, prompt); } } private void generateAndSendImage(String fromUserName, String prompt) { List items = sseService.wxDall(prompt,robConfigVo.getUserId().toString()); WxRobKeyword robKeyword = new WxRobKeyword(); robKeyword.setTypeData(SendMsgType.IMG.toValue()); robKeyword.setValueData(items.get(0).getUrl()); sendDataByType(fromUserName, robKeyword); } private void respondWithChatGPT(String fromUserName, String prompt) { ChatRequest chatBO = new ChatRequest(); //chatBO.setPrompt(prompt); chatBO.setModel(ChatCompletion.Model.GPT_3_5_TURBO.getName()); String chat = sseService.chat(chatBO,robConfigVo.getUserId().toString()); WxRobKeyword robKeyword = new WxRobKeyword(); robKeyword.setTypeData(SendMsgType.TEXT.toValue()); robKeyword.setValueData(chat); sendDataByType(fromUserName, robKeyword); } private boolean sendDataByType(String fromUserName, WxRobKeyword robKeyword) { String data; String type; if (robKeyword != null){ data = robKeyword.getValueData(); type = robKeyword.getTypeData(); CoreManage.addSendMsg4UserName(uniqueKey,fromUserName,data,SendMsgType.fromValue(type)); return true; } return false; } @Override public void sysMsgHandle(BaseMsg msg) { String fromNickName = msg.getFromNickName(); String fromUserName = msg.getFromUserName(); boolean groupMsg = msg.isGroupMsg(); /** * 群里的新人进群消息处理 * 优先发专门这个群的欢迎词 * 没有发通用的 * 欢迎词内容实质就是在最前面加上@昵称\n * * 欢迎词的关键字 * @see ConfigKeys#DEAFAULT_WELCOME */ // 解析新人名字 String text = msg.getContent(); String newNickName = ""; Matcher matcher = CommonTools.getMatcher("邀请\"(.+?)\"加入了群聊", text); if (matcher.find()){ newNickName = matcher.group(1); }else{ matcher = CommonTools.getMatcher("\"(.+?)\"通过扫描(.+?)分享的二维码加入群聊", text); if (matcher.find()){ newNickName = matcher.group(1); } } if (StringUtils.isNotEmpty(newNickName)){ WxRobConfig robConfig = WxRobConfig.dao.findFirst("SELECT * FROM wx_rob_config WHERE unique_key = ? LIMIT 1", uniqueKey); if(robConfig != null && robConfig.getEnable()){ // 判断是否要回复 boolean isOpen = false; // 判断是群聊的话是否允许回复 昵称关键字 if (robConfig.getToGroup() && groupMsg){ isOpen = true; } if (isOpen){ WxRobKeyword robKeyword = WxRobKeyword.dao.findFirst("SELECT * FROM wx_rob_keyword WHERE unique_key = ? AND key_data = ? AND nick_name = ? AND enable = 1 AND to_group = ? ORDER BY id DESC LIMIT 1", uniqueKey, ConfigKeys.DEAFAULT_WELCOME,fromNickName,msg.isGroupMsg()?1:0); if (sendSysWelcomeMsg(fromUserName, newNickName, robKeyword)){ return;} } // 没有专门的关键字,则使用默认关键字 isOpen = false; // 判断是群聊的话是否允许回复 昵称关键字 if (robConfig.getDefaultGroup() && groupMsg){ isOpen = true; } if (isOpen){ WxRobKeyword defaultRobKeyword = WxRobKeyword.dao.findFirst("SELECT * FROM wx_rob_keyword WHERE unique_key = ? AND key_data = ? AND nick_name = ? AND enable = 1 AND to_group = ? ORDER BY id DESC LIMIT 1", uniqueKey, ConfigKeys.DEAFAULT_WELCOME, ConfigKeys.DEAFAULT_KEYWORD,msg.isGroupMsg()?1:0); if (sendSysWelcomeMsg(fromUserName, newNickName, defaultRobKeyword)){ return;} } } } } /** * 发送欢迎内容 * @param fromUserName * @param newNickName * @param robKeyword * @return */ private boolean sendSysWelcomeMsg(String fromUserName, String newNickName, WxRobKeyword robKeyword) { if (robKeyword != null){ if (robKeyword.getTypeData().equals(SendMsgType.TEXT.toValue())){ robKeyword.setValueData(String.format("@%s\n%s",newNickName,robKeyword.getValueData())); } if (sendDataByType(fromUserName, robKeyword)) { return true; } } return false; } @Override public void picMsgHandle(BaseMsg msg) { // // 这里使用收到图片的时间作为文件名 // String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".jpg"; // // 保存图片的路径 // String picPath = getDownloadPath(fileName); // // 调用此方法来保存图片 // DownloadTools.getDownloadFn(msg, MsgTypeEnum.PIC.getType(), picPath, this.uniqueKey); // CoreManage.addSendMsg4UserName(uniqueKey,msg.getFromUserName(),"图片保存成功",SendMsgType.TEXT); return; } @Override public void voiceMsgHandle(BaseMsg msg) { // // 这里使用收到语音的时间作为文件名 // String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".mp3"; // // 保存语音的路径 // String voicePath = getDownloadPath(fileName); // // 调用此方法来保存语音 // DownloadTools.getDownloadFn(msg, MsgTypeEnum.VOICE.getType(), voicePath, this.uniqueKey); // CoreManage.addSendMsg4UserName(uniqueKey,msg.getFromUserName(),"声音保存成功",SendMsgType.TEXT); return; } @Override public void videoMsgHandle(BaseMsg msg) { // // 这里使用收到小视频的时间作为文件名 // String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".mp4"; // // 保存小视频的路径 // String viedoPath = getDownloadPath(fileName); // // 调用此方法来保存小视频 // DownloadTools.getDownloadFn(msg, MsgTypeEnum.VIEDO.getType(), viedoPath,this.uniqueKey); // CoreManage.addSendMsg4UserName(uniqueKey,msg.getFromUserName(),"视频保存成功",SendMsgType.TEXT); return; } @Override public void nameCardMsgHandle(BaseMsg msg) { return ; } @Override public void verifyAddFriendMsgHandle(BaseMsg msg) { return ; } @Override public void mediaMsgHandle(BaseMsg msg) { return ; } }