⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 milyqq.java

📁 MilyQQ是一个使用控制台的QQ客户端,基于LumaQQ的核心JQL包开发,只有一个可执行的jar包(MilyQQ.jar),携带方便,由于是Java程序,因此理论上应该可以运行于所有平台,不过基于
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		}		}	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 + -