/*
* Created by IntelliJ IDEA.
* User: rkinney
* Date: Jul 23, 2002
* Time: 6:04:16 AM
* To change template for new class use
* Code Style | Class Templates options (Tools | IDE Options).
*/
package VASSAL.chat.peer2peer;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Random;
import org.litesoft.p2pchat.PeerInfo;
import VASSAL.build.module.Chatter;
import VASSAL.chat.ChatServerConnection;
import VASSAL.chat.Player;
import VASSAL.chat.SimpleRoom;
import VASSAL.command.Command;
public class EchoClient implements Runnable, PropertyChangeListener {
public static final String NAME = "EchoBot"; //$NON-NLS-1$
private static Random rng = new Random();
private int changeRoom;
private int numRooms;
private FileWriter log;
private ChatServerConnection client;
public EchoClient(ChatServerConnection client, int changeRoom, int numRooms, FileWriter log) {
this.client = client;
this.changeRoom = changeRoom;
this.numRooms = numRooms;
this.log = log;
client.addPropertyChangeListener(ChatServerConnection.AVAILABLE_ROOMS, this);
client.addPropertyChangeListener(ChatServerConnection.STATUS, new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
System.err.println(String.valueOf(evt.getNewValue())); //$NON-NLS-1$
}
});
client.setConnected(true);
client.setRoom(new SimpleRoom("Room0")); //$NON-NLS-1$
new Thread(this).start();
}
public synchronized void showCHAT(PeerInfo pPeerInfo, String msg) {
Player sender = new P2PPlayer(pPeerInfo);
if (!sender.getName().startsWith(NAME)
&& msg.startsWith("CHAT")) { //$NON-NLS-1$
msg = "<" + client.getUserInfo().getName() //$NON-NLS-1$
+ msg.substring(msg.indexOf("> -")); //$NON-NLS-1$
Command c = new Chatter.DisplayText(null,msg);
client.sendTo(sender, c);
}
}
public void run() {
while (true) {
try {
int nextSleep = Math.round(rng.nextFloat() * 2 * changeRoom * 1000);
Thread.sleep(nextSleep);
}
catch (InterruptedException e) {
}
String newRoom = "Room" + (int) (numRooms * rng.nextFloat()); //$NON-NLS-1$
client.setRoom(new SimpleRoom(newRoom));
}
}
public void propertyChange(PropertyChangeEvent evt) {
if (log != null
&& evt.getPropertyName().equals(ChatServerConnection.AVAILABLE_ROOMS)) {
try {
log.write("----------" + (new Date()) + "---------\n"); //$NON-NLS-1$ //$NON-NLS-2$
log.write(report((VASSAL.chat.Room[]) evt.getNewValue()));
log.flush();
}
// FIXME: review error message
catch (IOException e) {
e.printStackTrace();
}
}
}
public static String report(VASSAL.chat.Room[] r) {
final StringBuilder buffer = new StringBuilder();
for (int i = 0; i < r.length; ++i) {
buffer.append(r[i].getName() + ": "); //$NON-NLS-1$
VASSAL.chat.Player[] l = (VASSAL.chat.Player[]) r[i].getPlayerList().toArray();
for (int j = 0; j < l.length; ++j) {
buffer.append(l[j]);
if (j < l.length - 1) {
buffer.append(", "); //$NON-NLS-1$
}
}
buffer.append("\n"); //$NON-NLS-1$
}
return buffer.toString();
}
/* public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("-module [module name] -clients [num clients] -host [host] -port [port] -rooms [num rooms] -wait [wait time] -log [true|false] -type [CGI|Proxy|Brokered|hierarchical]");
System.exit(0);
}
Properties p = new ArgsParser(args).getProperties();
String modName = p.getProperty("module","test");
String host = p.getProperty("host","localhost");
int port = Integer.parseInt(p.getProperty("port","5050"));
int nClients = Integer.parseInt(p.getProperty("clients","2"));
int nRooms = Integer.parseInt(p.getProperty("rooms","4"));
int wait = Integer.parseInt(p.getProperty("wait","10"));
boolean writeLogs = "true".equals(p.getProperty("log","true"));
String poolType = p.getProperty("type","Proxy");
StringTokenizer st = new StringTokenizer(modName, ",");
MessageBoard msgSvr = new MessageBoard() {
public Message[] getMessages() {
return new Message[0];
}
public void postMessage(String msg) {
}
};
WelcomeMessageServer welcomer = new WelcomeMessageServer() {
public Command getWelcomeMessage() {
return new NullCommand();
}
};
while (st.hasMoreTokens()) {
final String moduleName = st.nextToken();
for (int i = 0; i < nClients; ++i) {
final String userName = NAME+i;
PeerPoolInfo info = new PeerPoolInfo() {
public String getModuleName() {
return moduleName;
}
public String getUserName() {
return userName;
}
};
PeerPool pool;
pool = new DirectPeerPool();
Thread.sleep((int) (wait * 1000 * rng.nextFloat()));
ChatServerConnection client = null;
if (poolType.startsWith("hier")) {
client = new SocketNodeClient(new TextClient.Encoder(), info, host, port, msgSvr, welcomer);
}
else {
client = new P2PClient(new TextClient.Encoder(), msgSvr, welcomer, pool);
}
client.setUserInfo(new SimplePlayer(userName));
new EchoClient(client, wait, nRooms,
writeLogs ? new FileWriter("Log" + i) : null);
}
}
}
*/}