package cn.ieclipse.wechat; import cn.ieclipse.smartim.IMHistoryManager; import cn.ieclipse.smartim.common.IMUtils; import cn.ieclipse.smartim.console.IMChatConsole; import cn.ieclipse.smartim.model.IContact; import cn.ieclipse.smartim.model.impl.AbstractFrom; import cn.ieclipse.util.FileUtils; import cn.ieclipse.util.StringUtils; import io.github.biezhi.wechat.api.WechatClient; import io.github.biezhi.wechat.model.UploadInfo; import io.github.biezhi.wechat.model.WechatMessage; import javax.swing.*; import java.io.File; import java.net.URLConnection; import java.util.Arrays; /** * Created by Jamling on 2017/11/1. */ public class WXChatConsole extends IMChatConsole { WechatClient client; WechatPanel imPanel; public WXChatConsole(IContact target, WechatPanel imPanel) { super(target, imPanel); this.imPanel = imPanel; } @Override public WechatClient getClient() { return (WechatClient)super.getClient(); } @Override public void loadHistory(String raw) { if (IMUtils.isMySendMsg(raw)) { write(raw); return; } // unreachable code WechatMessage m = (WechatMessage)getClient().handleMessage(raw); AbstractFrom from = getClient().getFrom(m); write(WXUtils.formatHtmlIncoming(m, from)); } @Override protected String formatInput(String name, String input) { return WXUtils.formatHtmlOutgoing(name, input, true); } @Override public void post(String msg) { WechatClient client = getClient(); if (client.isLogin() && contact != null) { WechatMessage m = client.createMessage(0, msg, contact); client.sendMessage(m, contact); } else { error("发送失败,客户端异常(可能已断开连接或找不到联系人)"); } } @Override protected boolean hyperlinkActivated(String desc) { if (desc.startsWith("weixin://")) { JOptionPane.showInternalMessageDialog(null, desc + "为微信专用协议,请使用手机微信打开"); return false; } return super.hyperlinkActivated(desc); } @Override public void sendFileInternal(final String file) { // error("暂不支持,敬请关注 https://github.com/Jamling/SmartIM 或 // https://github.com/Jamling/SmartQQ4IntelliJ 最新动态"); final File f = new File(file); final WechatClient client = getClient(); if (!checkClient(client)) { return; } String ext = FileUtils.getExtension(f.getPath()).toLowerCase(); String mimeType = URLConnection.guessContentTypeFromName(f.getName()); String media = "pic"; int type = WechatMessage.MSGTYPE_IMAGE; String content = ""; if (Arrays.asList("png", "jpg", "jpeg", "bmp").contains(ext)) { type = WechatMessage.MSGTYPE_IMAGE; media = "pic"; } else if ("gif".equals(ext)) { type = WechatMessage.MSGTYPE_EMOTICON; media = "doc"; } else { type = WechatMessage.MSGTYPE_FILE; media = "doc"; } final UploadInfo uploadInfo = client.uploadMedia(f, mimeType, media); if (uploadInfo == null) { error("上传失败"); return; } String link = StringUtils.file2url(file); String label = file.replace('\\', '/'); String input = null; if (type == WechatMessage.MSGTYPE_EMOTICON || type == WechatMessage.MSGTYPE_IMAGE) { input = String.format("<img src=\"%s\" border=\"0\" alt=\"%s\"", link, label); if (uploadInfo.CDNThumbImgWidth > 0) { input += " width=\"" + uploadInfo.CDNThumbImgWidth + "\""; } if (uploadInfo.CDNThumbImgHeight > 0) { input += " height=\"" + uploadInfo.CDNThumbImgHeight + "\""; } input = String.format("<a href=\"%s\" title=\"%s\">%s</a>", link, link, input); } else { input = String.format("<a href=\"%s\" title=\"%s\">%s</a>", link, label, label); content = client.createFileMsgContent(f, uploadInfo.MediaId); } final WechatMessage m = client.createMessage(type, content, contact); m.text = input; m.MediaId = uploadInfo.MediaId; client.sendMessage(m, contact); if (!hideMyInput()) { String name = client.getAccount().getName(); String msg = WXUtils.formatHtmlOutgoing(name, m.text, false); insertDocument(msg); IMHistoryManager.getInstance().save(getHistoryDir(), getHistoryFile(), msg); } } }