package org.formalin14.tq;
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
import edu.tsinghua.lumaqq.qq.*;
import edu.tsinghua.lumaqq.qq.beans.*;
import edu.tsinghua.lumaqq.qq.events.*;
import edu.tsinghua.lumaqq.qq.packets.in.*;
/**
* @author Achilles Xu
*
*/
public class TQ implements IQQListener {
private QQClient client;
private QQUser user;
// config
private String server;
private boolean udp;
private int qqno;
private String qqpass;
private boolean initHide;
private boolean useProxy;
private String proxyServer;
private int proxyPort;
private String proxyUser;
private String proxyPass;
private String proxyType;
private int state;
private int stepCount = 5;
private Hashtable<Integer, String> friends;
private Hashtable<Integer, String> clusters;
private Hashtable<Integer, Integer> clustersInternal;
private Hashtable<Integer, String> members;
private Hashtable<Integer, String> onlines;
private ArrayList<String> messages;
private int distNo;
private int distType; // 0 - normal user, 1 - cluster
private String distName;
private boolean onlineFinished = false;
private BufferedWriter out;
private boolean go;
public TQ() {
try {
out = new BufferedWriter(new FileWriter("msg.log", true));
} catch (Exception ex) {
System.out.println("can not open log file, exit.");
System.exit(-2);
}
if (!loadConfig()) {
return;
}
try {
state = 0;
friends = new Hashtable<Integer, String>();
clusters = new Hashtable<Integer, String>();
clustersInternal = new Hashtable<Integer, Integer>();
members = new Hashtable<Integer, String>();
messages = new ArrayList<String>();
onlines = new Hashtable<Integer, String>();
distNo = 0;
distName = "";
distType = 0;
go = false;
user = new QQUser(qqno, qqpass);
if (initHide) {
user.setStatus(QQ.QQ_LOGIN_MODE_HIDDEN);
}
client = new QQClient();
client.addQQListener(this);
user.setUdp(udp);
client.setUser(user);
client.setLoginServer(server);
if (useProxy) {
client.setProxy(new InetSocketAddress(proxyServer, proxyPort));
client.setProxyType(proxyType);
if (!proxyUser.equals("")) {
client.setProxyUsername(proxyUser);
client.setProxyPassword(proxyPass);
}
}
client.login();
} catch (Exception e) {
log(e);
log("Init QQClient error, exit.");
}
log("Welcome to use TQ.\nAuthor: Achilles Xu\nSupport: [email protected]");
while (true) {
if (state >= stepCount) {
try {
System.out.print(distName + ">");
BufferedReader in = new BufferedReader(
new InputStreamReader(System.in));
String cmd = in.readLine().trim();
processInput(cmd);
} catch (Exception e) {
log(e);
}
}
try {
Thread.sleep(500);
} catch (Exception e) {
}
}
}
private void processInput(String cmd) {
try {
out.write(distName + ">" + cmd + "\n");
out.flush();
} catch (Exception ex) {}
if (cmd.equals("")) {
} else if (cmd.startsWith("/")) {
processCommand(cmd.substring(1).toLowerCase());
} else if (distNo != 0) {
switch (distType) {
case 0:
client.sendIM(distNo, cmd);
break;
case 1:
client.sendClusterIM(distNo, cmd);
break;
}
}
for(String msg : messages) {
System.out.print(msg);
}
messages.clear();
}
private void processCommand(String cmd) {
if (cmd.equals("exit") || cmd.equals("q") || cmd.equals("quit")) {
System.exit(0);
} else if (cmd.equals("friends")) {
for (Map.Entry<Integer, String> entry : friends.entrySet()) {
log(entry.getKey().toString() + "\t" + entry.getValue());
}
} else if (cmd.equals("clusters")) {
for (Map.Entry<Integer, String> entry : clusters.entrySet()) {
log(entry.getKey().toString() + "\t" + entry.getValue());
}
} else if (cmd.equals("clustersinternal")) {
for (Map.Entry<Integer, Integer> entry : clustersInternal.entrySet()) {
log(entry.getKey().toString() + "\t" + entry.getValue().toString());
}
} else if (cmd.equals("who")) {
for (Map.Entry<Integer, String> entry : onlines.entrySet()) {
log(entry.getKey().toString() + "\t" + entry.getValue());
}
} else if (cmd.startsWith("cd ")) {
try {
int nTemp = Integer.parseInt(cmd.substring(3));
String sTemp = null;
if ((sTemp = friends.get(nTemp)) != null) {
distNo = nTemp;
distName = String.valueOf(distNo + " " + sTemp);
distType = 0;
} else if (clusters.get(nTemp) != null && clustersInternal.get(nTemp) != null) {
distNo = clustersInternal.get(nTemp);
distName = String.valueOf(nTemp) + " " + clusters.get(nTemp);
distType = 1;
} else {
log("invalid qq number!");
}
} catch (Exception ex) {
log("wrong format! shoule be: /cd <qq number or cluster number>");
}
} else if (cmd.startsWith("m ")) {
try {
String[] sa = cmd.split("\\s+", 3);
if (sa.length == 3) {
int nTemp = Integer.parseInt(sa[1]);
if (friends.get(nTemp) != null) {
client.sendIM(nTemp, sa[2]);
} else if (clusters.get(nTemp) != null && clustersInternal.get(nTemp) != null) {
client.sendClusterIM(clustersInternal.get(nTemp), sa[2]);
} else {
log("invalid qq number!");
}
} else {
throw new Exception("");
}
} catch (Exception ex) {
log("wrong format! shoule be: /cd <qq number or cluster number>");
}
} else if (cmd.equals("go")) {
go = true;
} else if (cmd.equals("stop")) {
go = false;
} else {
log("Command not found!");
}
}
/**
* read config
*/
private boolean loadConfig() {
try {
Properties config = new Properties();
config.load(new FileInputStream("config.ini"));
server = config.getProperty("server");
if (server == null || server.trim().equals("")) {
throw new Exception("cannot find server in config file.");
}
if (config.getProperty("udp", "0").equals("1")) {
udp = true;
} else {
udp = false;
}
qqno = Integer.parseInt(config.getProperty("qqno"));
qqpass = config.getProperty("qqpass", "");
if (config.getProperty("hide", "0").equals("1")) {
initHide = true;
} else {
initHide = false;
}
if (config.getProperty("proxy", "0").equals("1")) {
useProxy = true;
proxyServer = config.getProperty("proxyserver", "");
proxyPort = Integer.parseInt(config.getProperty("proxyport", ""));
proxyUser = config.getProperty("proxyuser", "");
proxyPass = config.getProperty("proxypass", "");
proxyType = config.getProperty("proxytype", "None");
} else {
useProxy = false;
}
return true;
} catch (Exception e) {
log(e);
log("Load config file error, program will exit.");
}
return false;
}
private void log(String msg) {
lognw(msg + "\n");
}
private void lognw(String msg) {
try {
out.write(msg);
out.flush();
} catch (Exception ex) {
}
if (state >= stepCount && !go) {
messages.add(msg);
} else {
System.out.print(msg);
}
}
private void log(Exception e) {
e.printStackTrace();
}
/**
* @param args
*/
public static void main(String[] args) {
TQ tq = new TQ();
}
public void qqEvent(QQEvent e) {
switch (e.type) {
case QQEvent.QQ_LOGIN_SUCCESS:
log("login succeeded, waiting for status change ......");
state = 1;
break;
case QQEvent.QQ_LOGIN_PASSWORD_ERROR:
case QQEvent.QQ_LOGIN_REDIRECT_NULL:
case QQEvent.QQ_LOGIN_UNKNOWN_ERROR:
log("login failed");
System.exit(-1);
break;
case QQEvent.QQ_CHANGE_STATUS_SUCCESS:
log("changed status ok.");
if (state == 1) {
state = 2;
client.getFriendList();
client.downloadFriend(0);
}
break;
case Q