[jetrix-cvs] SF.net SVN: jetrix:[746] jetrix/trunk/src
Brought to you by:
smanux
From: <sm...@us...> - 2008-08-27 14:44:50
|
Revision: 746 http://jetrix.svn.sourceforge.net/jetrix/?rev=746&view=rev Author: smanux Date: 2008-08-27 14:44:44 +0000 (Wed, 27 Aug 2008) Log Message: ----------- Added TetrinetAgent to write tetrinet bots or clients Modified Paths: -------------- jetrix/trunk/src/java/net/jetrix/agent/TSpecAgent.java jetrix/trunk/src/java/net/jetrix/clients/TetrinetClient.java jetrix/trunk/src/test/net/jetrix/agent/QueryAgentTest.java jetrix/trunk/src/test/net/jetrix/agent/TSpecAgentTest.java Added Paths: ----------- jetrix/trunk/src/java/net/jetrix/agent/TetrinetAgent.java jetrix/trunk/src/test/net/jetrix/agent/TetrinetAgentTest.java Modified: jetrix/trunk/src/java/net/jetrix/agent/TSpecAgent.java =================================================================== --- jetrix/trunk/src/java/net/jetrix/agent/TSpecAgent.java 2008-08-27 14:39:18 UTC (rev 745) +++ jetrix/trunk/src/java/net/jetrix/agent/TSpecAgent.java 2008-08-27 14:44:44 UTC (rev 746) @@ -19,216 +19,49 @@ package net.jetrix.agent; -import net.jetrix.*; -import net.jetrix.messages.*; -import net.jetrix.protocols.*; +import java.io.IOException; -import java.io.*; -import java.net.*; -import java.util.*; +import net.jetrix.messages.PlayerNumMessage; +import net.jetrix.messages.TeamMessage; +import net.jetrix.protocols.TspecProtocol; /** - * A TSpec agent to log on a TetriNET server as a spectator. + * TSpec agent to log on a TetriNET server as a spectator. * * @author Emmanuel Bourg * @version $Revision$, $Date$ */ -public class TSpecAgent implements Agent +public class TSpecAgent extends TetrinetAgent { - private String name; private String password; - private Socket socket; - private BufferedReader in; - private Writer out; - private TspecProtocol protocol = new TspecProtocol(); - private boolean running; public TSpecAgent(String name, String password) { - this.name = name; + super(name); this.password = password; + this.protocol = new TspecProtocol(); } public void connect(String hostname) throws IOException { - socket = new Socket(hostname, 31458); - in = new BufferedReader(new InputStreamReader(socket.getInputStream())); - out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); - - send(TetrinetProtocol.encode(name, password, socket.getInetAddress().getAddress(), false)); - running = true; - - Thread t = new Thread() - { - public void run() - { - try - { - while (running) - { - String line = protocol.readLine(in); - Message message = protocol.getMessage(line); - - receive(message); - } - } - catch (IOException e) - { - e.printStackTrace(); - running = false; - } - } - }; - - t.start(); + connect(hostname, 31458, password); } - public void disconnect() throws IOException + public void onMessage(PlayerNumMessage m) { - if (socket != null) + super.onMessage(m); + + // send the tspec password as the team name + TeamMessage team = new TeamMessage(); + team.setSlot(m.getSlot()); + team.setName(password); + try { - running = false; - socket.close(); + send(team); } - } - - private void send(String message) throws IOException - { - out.write(message); - out.write(protocol.getEOL()); - out.flush(); - } - - public void send(Message message) throws IOException - { - send(protocol.translate(message, Locale.getDefault())); - } - - public final void receive(Message m) - { - // overwritable pre processing - onMessage(m); - - // message dispatching - if (m instanceof SpecialMessage) { onMessage((SpecialMessage) m); } - else if (m instanceof FieldMessage) { onMessage((FieldMessage) m); } - else if (m instanceof CommandMessage) { onMessage((CommandMessage) m); } - else if (m instanceof PlineMessage) { onMessage((PlineMessage) m); } - else if (m instanceof LevelMessage) { onMessage((LevelMessage) m); } - else if (m instanceof PlayerLostMessage) { onMessage((PlayerLostMessage) m); } - else if (m instanceof PlineActMessage) { onMessage((PlineActMessage) m); } - else if (m instanceof TeamMessage) { onMessage((TeamMessage) m); } - else if (m instanceof JoinMessage) { onMessage((JoinMessage) m); } - else if (m instanceof LeaveMessage) { onMessage((LeaveMessage) m); } - else if (m instanceof PlayerNumMessage) { onMessage((PlayerNumMessage) m); } - else if (m instanceof StartGameMessage) { onMessage((StartGameMessage) m); } - else if (m instanceof StopGameMessage) { onMessage((StopGameMessage) m); } - else if (m instanceof NewGameMessage) { onMessage((NewGameMessage) m); } - else if (m instanceof EndGameMessage) { onMessage((EndGameMessage) m); } - else if (m instanceof PauseMessage) { onMessage((PauseMessage) m); } - else if (m instanceof ResumeMessage) { onMessage((ResumeMessage) m); } - else if (m instanceof GmsgMessage) { onMessage((GmsgMessage) m); } - else if (m instanceof PlayerWonMessage) { onMessage((PlayerWonMessage) m); } - else + catch (IOException e) { - // nothing, log an error ? + e.printStackTrace(); } - - // todo add onMessage(DisconnectedMessage) } - - /** - * Message pre-processing. This method is called at the beginning of the - * <tt>process(Message m, List out)</tt> method and allow custom - * processing for all filtered messages. - */ - public void onMessage(Message m) { } - - public void onMessage(PlineMessage m) { } - - public void onMessage(PlineActMessage m) { } - - public void onMessage(TeamMessage m) { } - - public void onMessage(JoinMessage m) { } - - public void onMessage(LeaveMessage m) { } - - public void onMessage(PlayerNumMessage m) { } - - public void onMessage(StartGameMessage m) { } - - public void onMessage(StopGameMessage m) { } - - public void onMessage(NewGameMessage m) { } - - public void onMessage(EndGameMessage m) { } - - public void onMessage(PauseMessage m) { } - - public void onMessage(ResumeMessage m) { } - - public void onMessage(GmsgMessage m) { } - - private void onMessage(SpecialMessage m) - { - // message pre-processing - onSpecial(m); - - // message dispatching - if (m instanceof OneLineAddedMessage) { onMessage((OneLineAddedMessage) m); } - else if (m instanceof TwoLinesAddedMessage) { onMessage((TwoLinesAddedMessage) m); } - else if (m instanceof FourLinesAddedMessage) { onMessage((FourLinesAddedMessage) m); } - else if (m instanceof AddLineMessage) { onMessage((AddLineMessage) m); } - else if (m instanceof ClearLineMessage) { onMessage((ClearLineMessage) m); } - else if (m instanceof ClearSpecialsMessage) { onMessage((ClearSpecialsMessage) m); } - else if (m instanceof RandomClearMessage) { onMessage((RandomClearMessage) m); } - else if (m instanceof BlockQuakeMessage) { onMessage((BlockQuakeMessage) m); } - else if (m instanceof BlockBombMessage) { onMessage((BlockBombMessage) m); } - else if (m instanceof GravityMessage) { onMessage((GravityMessage) m); } - else if (m instanceof NukeFieldMessage) { onMessage((NukeFieldMessage) m); } - else if (m instanceof SwitchFieldsMessage) { onMessage((SwitchFieldsMessage) m); } - } - - /** - * Special block message pre-processing. This method is called for all - * specials filtered and allow custom processing for all specials - * (lines added, blockbomb switchs, etc...). - */ - public void onSpecial(SpecialMessage m) { } - - public void onMessage(LevelMessage m) { } - - public void onMessage(FieldMessage m) { } - - public void onMessage(PlayerLostMessage m) { } - - public void onMessage(PlayerWonMessage m) { } - - public void onMessage(CommandMessage m) { } - - public void onMessage(OneLineAddedMessage m) { } - - public void onMessage(TwoLinesAddedMessage m) { } - - public void onMessage(FourLinesAddedMessage m) { } - - public void onMessage(AddLineMessage m) { } - - public void onMessage(ClearLineMessage m) { } - - public void onMessage(NukeFieldMessage m) { } - - public void onMessage(RandomClearMessage m) { } - - public void onMessage(SwitchFieldsMessage m) { } - - public void onMessage(ClearSpecialsMessage m) { } - - public void onMessage(GravityMessage m) { } - - public void onMessage(BlockQuakeMessage m) { } - - public void onMessage(BlockBombMessage m) { } - } Added: jetrix/trunk/src/java/net/jetrix/agent/TetrinetAgent.java =================================================================== --- jetrix/trunk/src/java/net/jetrix/agent/TetrinetAgent.java (rev 0) +++ jetrix/trunk/src/java/net/jetrix/agent/TetrinetAgent.java 2008-08-27 14:44:44 UTC (rev 746) @@ -0,0 +1,302 @@ +/** + * Jetrix TetriNET Server + * Copyright (C) 2008 Emmanuel Bourg + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package net.jetrix.agent; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.net.Socket; +import java.util.Locale; + +import net.jetrix.Message; +import net.jetrix.Protocol; +import net.jetrix.protocols.TetrinetProtocol; +import net.jetrix.messages.*; + +/** + * Tetrinet agent to log on a server as a player. + * + * @author Emmanuel Bourg + * @version $Revision$, $Date$ + */ +public class TetrinetAgent implements Agent +{ + private String name; + private String hostname; + + private int slot; + + private Socket socket; + private BufferedReader in; + private Writer out; + + protected Protocol protocol = new TetrinetProtocol(); + private boolean running; + + public TetrinetAgent(String name) + { + this.name = name; + } + + public String getHostname() + { + return hostname; + } + + public void connect(String hostname) throws IOException + { + connect(hostname, 31457, "1.13"); + } + + protected void connect(String hostname, int port, String version) throws IOException + { + if (running) + { + return; + } + + socket = new Socket(hostname, port); + this.hostname = hostname; + in = new BufferedReader(new InputStreamReader(socket.getInputStream())); + out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); + + send(TetrinetProtocol.encode(name, version, socket.getInetAddress().getAddress(), false)); + + // block until the playernum message is received + String line = protocol.readLine(in); + Message message = protocol.getMessage(line); + receive(message); + + if (message instanceof NoConnectingMessage) + { + throw new IOException("Connexion rejected (noconnecting) : " + ((NoConnectingMessage) message).getText()); + } + + running = true; + + // start the message listener + new MessageListener().start(); + } + + private class MessageListener extends Thread + { + private MessageListener() + { + setName("listener"); + } + + public void run() + { + try + { + while (running) + { + String line = protocol.readLine(in); + + Message message = protocol.getMessage(line); + + receive(message); + } + } + catch (IOException e) + { + if (running) + { + e.printStackTrace(); + running = false; + } + } + } + } + + public void disconnect() throws IOException + { + if (socket != null) + { + running = false; + socket.close(); + } + } + + protected void send(String message) throws IOException + { + out.write(message); + out.write(protocol.getEOL()); + out.flush(); + } + + public void send(Message message) throws IOException + { + // set the slot for channel messages + if (message instanceof ChannelMessage) + { + ((ChannelMessage) message).setSlot(slot); + } + + send(protocol.translate(message, Locale.getDefault())); + } + + /** + * Join the specified channel + * + * @param channel + */ + public void join(String channel) throws IOException + { + send(new PlineMessage("/join " + channel)); + } + + public final void receive(Message m) + { + // overwritable pre processing + onMessage(m); + + // message dispatching + if (m instanceof SpecialMessage) { onMessage((SpecialMessage) m); } + else if (m instanceof FieldMessage) { onMessage((FieldMessage) m); } + else if (m instanceof CommandMessage) { onMessage((CommandMessage) m); } + else if (m instanceof PlineMessage) { onMessage((PlineMessage) m); } + else if (m instanceof LevelMessage) { onMessage((LevelMessage) m); } + else if (m instanceof PlayerLostMessage) { onMessage((PlayerLostMessage) m); } + else if (m instanceof PlineActMessage) { onMessage((PlineActMessage) m); } + else if (m instanceof TeamMessage) { onMessage((TeamMessage) m); } + else if (m instanceof JoinMessage) { onMessage((JoinMessage) m); } + else if (m instanceof LeaveMessage) { onMessage((LeaveMessage) m); } + else if (m instanceof PlayerNumMessage) { onMessage((PlayerNumMessage) m); } + else if (m instanceof StartGameMessage) { onMessage((StartGameMessage) m); } + else if (m instanceof StopGameMessage) { onMessage((StopGameMessage) m); } + else if (m instanceof NewGameMessage) { onMessage((NewGameMessage) m); } + else if (m instanceof EndGameMessage) { onMessage((EndGameMessage) m); } + else if (m instanceof PauseMessage) { onMessage((PauseMessage) m); } + else if (m instanceof ResumeMessage) { onMessage((ResumeMessage) m); } + else if (m instanceof GmsgMessage) { onMessage((GmsgMessage) m); } + else if (m instanceof PlayerWonMessage) { onMessage((PlayerWonMessage) m); } + else if (m instanceof NoConnectingMessage) { onMessage((NoConnectingMessage) m); } + else + { + // nothing, log an error ? + } + + // todo add onMessage(DisconnectedMessage) + } + + /** + * Message pre-processing. This method is called at the beginning of the + * <tt>process(Message m, List out)</tt> method and allow custom + * processing for all filtered messages. + */ + public void onMessage(Message m) { } + + public void onMessage(PlineMessage m) { } + + public void onMessage(PlineActMessage m) { } + + public void onMessage(NoConnectingMessage m) { } + + public void onMessage(TeamMessage m) { } + + public void onMessage(JoinMessage m) { } + + public void onMessage(LeaveMessage m) { } + + public void onMessage(PlayerNumMessage m) + { + this.slot = m.getSlot(); + } + + public void onMessage(StartGameMessage m) { } + + public void onMessage(StopGameMessage m) { } + + public void onMessage(NewGameMessage m) { } + + public void onMessage(EndGameMessage m) { } + + public void onMessage(PauseMessage m) { } + + public void onMessage(ResumeMessage m) { } + + public void onMessage(GmsgMessage m) { } + + private void onMessage(SpecialMessage m) + { + // message pre-processing + onSpecial(m); + + // message dispatching + if (m instanceof OneLineAddedMessage) { onMessage((OneLineAddedMessage) m); } + else if (m instanceof TwoLinesAddedMessage) { onMessage((TwoLinesAddedMessage) m); } + else if (m instanceof FourLinesAddedMessage) { onMessage((FourLinesAddedMessage) m); } + else if (m instanceof AddLineMessage) { onMessage((AddLineMessage) m); } + else if (m instanceof ClearLineMessage) { onMessage((ClearLineMessage) m); } + else if (m instanceof ClearSpecialsMessage) { onMessage((ClearSpecialsMessage) m); } + else if (m instanceof RandomClearMessage) { onMessage((RandomClearMessage) m); } + else if (m instanceof BlockQuakeMessage) { onMessage((BlockQuakeMessage) m); } + else if (m instanceof BlockBombMessage) { onMessage((BlockBombMessage) m); } + else if (m instanceof GravityMessage) { onMessage((GravityMessage) m); } + else if (m instanceof NukeFieldMessage) { onMessage((NukeFieldMessage) m); } + else if (m instanceof SwitchFieldsMessage) { onMessage((SwitchFieldsMessage) m); } + } + + /** + * Special block message pre-processing. This method is called for all + * specials filtered and allow custom processing for all specials + * (lines added, blockbomb switchs, etc...). + */ + public void onSpecial(SpecialMessage m) { } + + public void onMessage(LevelMessage m) { } + + public void onMessage(FieldMessage m) { } + + public void onMessage(PlayerLostMessage m) { } + + public void onMessage(PlayerWonMessage m) { } + + public void onMessage(CommandMessage m) { } + + public void onMessage(OneLineAddedMessage m) { } + + public void onMessage(TwoLinesAddedMessage m) { } + + public void onMessage(FourLinesAddedMessage m) { } + + public void onMessage(AddLineMessage m) { } + + public void onMessage(ClearLineMessage m) { } + + public void onMessage(NukeFieldMessage m) { } + + public void onMessage(RandomClearMessage m) { } + + public void onMessage(SwitchFieldsMessage m) { } + + public void onMessage(ClearSpecialsMessage m) { } + + public void onMessage(GravityMessage m) { } + + public void onMessage(BlockQuakeMessage m) { } + + public void onMessage(BlockBombMessage m) { } + +} Property changes on: jetrix/trunk/src/java/net/jetrix/agent/TetrinetAgent.java ___________________________________________________________________ Added: svn:keywords + Date Author Id Revision HeadURL Added: svn:eol-style + native Modified: jetrix/trunk/src/java/net/jetrix/clients/TetrinetClient.java =================================================================== --- jetrix/trunk/src/java/net/jetrix/clients/TetrinetClient.java 2008-08-27 14:39:18 UTC (rev 745) +++ jetrix/trunk/src/java/net/jetrix/clients/TetrinetClient.java 2008-08-27 14:44:44 UTC (rev 746) @@ -26,7 +26,6 @@ import java.util.logging.*; import net.jetrix.*; -import net.jetrix.protocols.AbstractProtocol; import net.jetrix.config.*; import net.jetrix.messages.*; @@ -132,6 +131,8 @@ // discard unknown messages if (message == null) continue; + // todo check the slot on channel messages + if (message.getDestination() != null) { message.getDestination().send(message); @@ -249,7 +250,7 @@ public Message receive() throws IOException { // read raw message from socket - String line = ((AbstractProtocol) protocol).readLine(in); + String line = protocol.readLine(in); lastMessageTime = System.currentTimeMillis(); if (log.isLoggable(Level.FINER)) { Modified: jetrix/trunk/src/test/net/jetrix/agent/QueryAgentTest.java =================================================================== --- jetrix/trunk/src/test/net/jetrix/agent/QueryAgentTest.java 2008-08-27 14:39:18 UTC (rev 745) +++ jetrix/trunk/src/test/net/jetrix/agent/QueryAgentTest.java 2008-08-27 14:44:44 UTC (rev 746) @@ -19,13 +19,9 @@ package net.jetrix.agent; -import junit.framework.TestCase; - import java.util.List; -import net.jetrix.agent.ChannelInfo; -import net.jetrix.agent.PlayerInfo; -import net.jetrix.agent.QueryAgent; +import junit.framework.TestCase; /** * @author Emmanuel Bourg Modified: jetrix/trunk/src/test/net/jetrix/agent/TSpecAgentTest.java =================================================================== --- jetrix/trunk/src/test/net/jetrix/agent/TSpecAgentTest.java 2008-08-27 14:39:18 UTC (rev 745) +++ jetrix/trunk/src/test/net/jetrix/agent/TSpecAgentTest.java 2008-08-27 14:44:44 UTC (rev 746) @@ -30,11 +30,14 @@ { public void testConnect() throws Exception { - TSpecAgent agent = new TSpecAgent("SmanuxBot", "none"); + TSpecAgent agent = new TSpecAgent("JetrixSpec", "rien"); agent.connect("tetrinet.fr"); - agent.send(new PlineMessage("// Waza !!!")); + agent.send(new PlineMessage("// Hi!")); + agent.send(new PlineMessage("Hello there!")); + Thread.sleep(1000); + agent.disconnect(); } } Added: jetrix/trunk/src/test/net/jetrix/agent/TetrinetAgentTest.java =================================================================== --- jetrix/trunk/src/test/net/jetrix/agent/TetrinetAgentTest.java (rev 0) +++ jetrix/trunk/src/test/net/jetrix/agent/TetrinetAgentTest.java 2008-08-27 14:44:44 UTC (rev 746) @@ -0,0 +1,43 @@ +/** + * Jetrix TetriNET Server + * Copyright (C) 2008 Emmanuel Bourg + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package net.jetrix.agent; + +import junit.framework.TestCase; + +import net.jetrix.messages.PlineMessage; +import net.jetrix.messages.TeamMessage; + +/** + * @author Emmanuel Bourg + * @version $Revision$, $Date$ + */ +public class TetrinetAgentTest extends TestCase +{ + public void testConnect() throws Exception + { + TetrinetAgent agent = new TetrinetAgent("JetrixBot"); + agent.connect("tetrinet.fr"); + + agent.send(new TeamMessage()); + agent.send(new PlineMessage("Hi there!")); + + agent.disconnect(); + } +} Property changes on: jetrix/trunk/src/test/net/jetrix/agent/TetrinetAgentTest.java ___________________________________________________________________ Added: svn:keywords + Date Author Id Revision HeadURL Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |