📄 milyqq.java
字号:
} } private void processFriendChangeStatus(QQEvent e){ try{ FriendChangeStatusPacket p = (FriendChangeStatusPacket) e.getSource(); String friendName = friends.containsKey(p.friendQQ) ? friends.get(p.friendQQ).nick : ""; FriendStatus s = new FriendStatus(); if(friendStatus.containsKey(p.friendQQ)){ //更新状态信息 s = friendStatus.get(p.friendQQ); if(p.status==QQ.QQ_STATUS_OFFLINE){ friendStatus.remove(p.friendQQ); } else { s.status = p.status; friendStatus.put(p.friendQQ, s); } } else { //判断隐身,应该是腾讯的一个bug, //不一定准,但也差不多 s.status= (p.status==QQ.QQ_STATUS_OFFLINE) ? QQ.QQ_STATUS_HIDDEN : p.status; s.qqNum= p.friendQQ; s.ip = new byte[4]; s.port = 0 ; s.unknown1=s.unknown2=0; s.unknown3 = '0'; s.unknownKey = new byte[QQ.QQ_LENGTH_KEY]; friendStatus.put(p.friendQQ, s); } String msg = "\nMilyQQ通知您: 好友 "+filterNewline(friendName) +"("+p.friendQQ+") " + getCurrentStatus(p.status); System.out.print(msg); System.out.printf(" 好友客户端版本:%04x\n", (int)p.clientVersion); System.out.print(chattingName+">"); if(isSound) soundPlayer.soundSystem(); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void processWeather(QQEvent e){ try{ WeatherOpReplyPacket p = (WeatherOpReplyPacket) e.getSource(); System.out.print("\n未来"+p.weathers.size()+"天内天气情况:\n"); for(Weather w : p.weathers){ String msg = w.year+"年" + w.month +"月"+ w.day +"日: " + w.shortDesc + ", "+w.wind+", 最低气温"+w.lowTemperature +"摄氏度, 最高气温"+w.highTemperature+"摄氏度" +"\n贴心小提示: "+w.hint+"\n\n"; System.out.print(msg); } if(isSound) soundPlayer.soundSystem(); System.out.print(chattingName+">"); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void processRemark(QQEvent e){ try{ FriendDataOpReplyPacket p = (FriendDataOpReplyPacket) e.getSource(); if(!p.hasRemark){ System.out.print("\n 没有找到备注信息...\n"); System.out.print(chattingName+">"); return; } String msg = "\n" + p.qqNum + " 的备注信息:" + ((p.remark.name.length()==0) ? "" : ("\n 姓名:"+ p.remark.name)) + ((p.remark.mobile.length()==0) ? "" : ("\n 手机号码:" + p.remark.mobile)) + ((p.remark.telephone.length()==0) ? "" : ("\n 电话号码:"+ p.remark.telephone)) + ((p.remark.address.length()==0) ? "" : ("\n 联系地址:" + p.remark.address)) + ((p.remark.email.length()==0) ? "" : ("\n 电子邮件:"+ p.remark.email)) + ((p.remark.zipcode.length()==0) ? "" : ("\n 邮编:" + p.remark.zipcode )) + ((p.remark.note.length()==0) ? "" : ("\n 备注:" + p.remark.note )) +"\n\n"; System.out.print(msg); System.out.print(chattingName+">"); if(isSound) soundPlayer.soundSystem(); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void processBatchRemark(QQEvent e) { try { FriendDataOpReplyPacket p = (FriendDataOpReplyPacket) e.getSource(); for (Map.Entry<Integer, FriendRemark> entry : p.remarks.entrySet()) { //其实我只对里面的名字字段感兴趣.....全塞进去好了 remarks.put(entry.getKey(), entry.getValue()); } if (p.hasRemark) { client.batchDownloadFriendRemark(++page); } } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void processUserInfo(QQEvent e){ String[] zodiac={"未知","鼠","牛","虎","兔","龙","蛇", "马","羊","猴","鸡","狗","猪"}; String[] blood={"未知","A","B","O","AB","其他"}; String[] horoscope={"未知","水瓶","双鱼","牧羊","金牛","双子", "巨蟹","狮子","处女","天秤","天蝎","射手","魔蝎"}; try{ GetUserInfoReplyPacket p = (GetUserInfoReplyPacket) e.getSource(); ContactInfo info=p.contactInfo; String msg = "\n"+info.nick+"("+info.qq+")"+" 性别:"+info.gender +" 年方:"+info.age +"\n来自: "+info.country+" "+info.province+"省 "+info.city+"市 " +"\n邮编:"+info.zipcode+" 地址:"+info.address +"\n电话: "+info.telephone+" 手机: "+info.mobile+"\n真名叫做:"+info.name +" E-mail为:"+info.email+"\n职业是:"+info.occupation+" 毕业于:"+info.college +"\n个人主页:"+info.homepage +"\n属"+zodiac[(info.zodiac>=0 && info.zodiac<=12)?info.zodiac:0] +"的, "+blood[(info.blood>=0 && info.blood<=5)?info.blood:0] +"型血, "+horoscope[(info.horoscope>=0 && info.horoscope<=12)?info.horoscope:0] +"座.\n开场白:\n "+info.intro+"\n"; System.out.print(msg); System.out.print(chattingName+">"); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void processFriendOnline(QQEvent e) { try { GetOnlineOpReplyPacket p = (GetOnlineOpReplyPacket) e.getSource(); if (isOnlineFinished) { friendStatus.clear(); isOnlineFinished = false; } for (FriendOnlineEntry f : p.onlineFriends) { friendStatus.put(f.status.qqNum, f.status); } if (!p.finished) { client.getFriendOnline(p.position); } else { if(isDebug) System.out.print("好友列表被刷新一次.\n>"); isOnlineFinished = true; //initStep ++; } } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } /** * 处理群成员信息,一个保存hash表的hash表中,用来显示每个群的成员 */ private void processMemberInfo(QQEvent e) { try { ClusterCommandReplyPacket p = (ClusterCommandReplyPacket) e.getSource(); HashMap<Integer, QQFriend> temp =new HashMap<Integer, QQFriend>(); for (QQFriend f : p.memberInfos) { //群信息全部保存到一个临时hash表 temp.put(f.qqNum,f); } if(members.containsKey(p.clusterId)){ //如果外表中已经含有同样的群号键值,则先取出来,放到上面的temp表中 for (Map.Entry<Integer, QQFriend> entry : members.get(p.clusterId).entrySet()){ temp.put(entry.getKey(),entry.getValue()); } //然后再把temp表保存到外表中 members.put(p.clusterId,temp); }else{ //没有键值就直接往里面压 members.put(p.clusterId,temp); } } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void processClusterInfo(QQEvent e) { try { ClusterCommandReplyPacket p = (ClusterCommandReplyPacket)e.getSource(); // 如果是固定群,externalId表示外部ID,如果是临时群,这个表示父群ID clusters.put(p.info.externalId, p.info); //p.members字段为群成员列表,元素类型为Integer,包含了成员的QQ号 client.getClusterMemberInfo(p.info.clusterId, p.members); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } //处理好友分组,主要是群 private void processGroupFriend(QQEvent e) { try { DownloadGroupFriendReplyPacket p = (DownloadGroupFriendReplyPacket) e.getSource(); for (DownloadFriendEntry entry : p.friends) { if (entry.isCluster()) { client.getClusterInfo(entry.qqNum); } else { //好友分组,不作处理 } } if (p.beginFrom != 0) { client.downloadFriend(p.beginFrom); } else { System.out.print("下载好友分组完成.\n>"); //请求备注消息:remarks 从第一页开始 client.batchDownloadFriendRemark(page=1); initStep ++; } } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } //处理好友名单 private void processFriendList(QQEvent e) { try { GetFriendListReplyPacket p = (GetFriendListReplyPacket) e.getSource(); for (QQFriend f : p.friends) { friends.put(f.qqNum, f); qqNumList.add(f.qqNum); } if (p.position != 0xFFFF) { client.getFriendList(p.position); } else { System.out.print("获取好友列表完成.\n>"); client.getFriendOnline(); //请求个性签名 requestSignature(); initStep++; } } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } //处理普通消息 private void processNormalIM(QQEvent e) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); ReceiveIMPacket p = (ReceiveIMPacket) e.getSource(); NormalIM im = p.normalIM; String senderName = friends.containsKey(p.normalHeader.sender) ? friends.get(p.normalHeader.sender).nick : ""; if (senderName == null) senderName = ""; int num=0; if(index.contains(p.normalHeader.sender)) num=1+index.indexOf(p.normalHeader.sender); String msg="\n[" + (num>0 ? num : "") + "] " + senderName + "(" + p.normalHeader.sender + ") " + sdf.format(new Date(p.normalHeader.sendTime)) + "\n" + new String(im.messageBytes) + "\n"; dispAndLog(msg); chattingNo = p.normalHeader.sender; chattingName = senderName; chattingType = 0; System.out.print(chattingName+">"); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } //处理群消息 private void processClusterIM(QQEvent e) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); ReceiveIMPacket p = (ReceiveIMPacket) e.getSource(); ClusterIM im = p.clusterIM; String sDate = sdf.format(new Date(im.sendTime)); String clusterName = clusters.containsKey(im.externalId) ? clusters.get(im.externalId).name : ""; String senderName = ""; int clusterId = clusters.containsKey(im.externalId) ? clusters.get(im.externalId).clusterId : 0; if(members.containsKey(clusterId)){ HashMap<Integer,QQFriend> oneCluster = members.get(clusterId); if(oneCluster.containsKey(im.sender)) senderName = oneCluster.get(im.sender).nick; } int num=0; if(index.contains(im.externalId)) num=1+index.indexOf(im.externalId); String msg = "\n[" + (num>0 ? num : "") +"] 群: " + clusterName + "(" + im.externalId + ") 里的 " + senderName + "(" + im.sender + ") 于 " + sDate + " 说:\n" + new String(im.messageBytes) + "\n"; dispAndLog(msg); System.out.print(chattingName+">"); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } //一些有用的方法 private void dispAndLog(String msg) { try { out.write(msg+"\n"); out.flush(); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } if(isSound) soundPlayer.soundMsg(); if (initStep >= stepCounter && isMask) { messages.add(msg+"\n"); } else { System.out.print(msg+"\n"); } } private void log(String msg){ try { out.write(msg + "\n"); out.flush(); } catch (Exception ex) { if(isDebug) ex.printStackTrace(); } } private void getCurrentStatus(){ switch(user.getStatus()){ case QQ.QQ_STATUS_ONLINE: System.out.println(" 当前状态: 在线");break; case QQ.QQ_STATUS_OFFLINE: System.out.println(" 当前状态: 离线");break; case QQ.QQ_STATUS_AWAY: System.out.println(" 当前状态: 离开");break; case QQ.QQ_STATUS_HIDDEN: System.out.println(" 当前状态: 隐身");break; } } private String getCurrentStatus(byte status){ switch(status){ case QQ.QQ_STATUS_ONLINE: return "在线"; case QQ.QQ_STATUS_OFFLINE: return "离线"; case QQ.QQ_STATUS_AWAY: return "离开"; case QQ.QQ_STATUS_HIDDEN: return "隐身"; default: return "未知"; } } private void execExternalCMD(String command){ try{ Process process = Runtime.getRuntime().exec(command); InputStreamReader ir=new InputStreamReader(process.getInputStream()); LineNumberReader input = new LineNumberReader (ir); String line; while ((line = input.readLine()) != null) System.out.println(line); } catch (java.io.IOException e){ System.err.println("抱歉,MilyQQ不能执行这个外部命令..."); return; } } private boolean isMilyQQCommand(String cmd){ for(int i=0;i<commandArray.length;i++){ if(commandArray[i].equals(cmd)) return true; } return false; } private void doPause(){ System.out.print("<敲回车继续...>\n"); try{ System.in.read(); } catch (Exception ex) {} } //编号: 从1开始 private int indexToQQNumber(int num){ if(num>=1 && num<=index.size()) return index.get(num-1); else if(num<1) return 1; else return num; } public String filterNewline(String str){ StringBuffer sb=new StringBuffer(); sb.append(str); int len = sb.length(); for(int i = len - 1; i >=0; i--) { char c = sb.charAt(i); if(c==(char)'\n'||c==(char)'\r'||c==(char)'\t') sb.deleteCharAt(i); } return sb.toString(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -