View Javadoc
1   /******************************************************************************
2    * Player.java - Describe one FIBS player
3    * $Id$
4    * 
5    * BuckoFIBS - Backgammon by BuckoSoft
6    * Copyright� 2008 - Dick Balaska - BuckoSoft, Corp.
7    * 
8    * $Log$
9    * Revision 1.6  2011/01/04 17:42:02  dick
10   * Mixing ready and !isPlaying() is a bad idea.
11   *
12   * Revision 1.5  2011/01/01 00:17:39  dick
13   * Convienence constructor to set the player's name.
14   *
15   * Revision 1.4  2010/12/30 04:09:43  dick
16   * He's really only ready if he is not playing.
17   *
18   * Revision 1.3  2010/12/24 02:59:07  dick
19   * WinLoss becomes a light object instead of a String.
20   *
21   * Revision 1.2  2010/02/04 09:17:13  inim
22   * Made player parsing a little more robust
23   *
24   * Revision 1.1  2010/02/04 05:57:53  inim
25   * Mavenized project folder layout
26   *
27   * Revision 1.13  2010/01/23 06:17:02  dick
28   * Add the invited flag.
29   *
30   * Revision 1.12  2009/03/04 18:53:59  dick
31   * Add the winLoss attribute.
32   *
33   * Revision 1.11  2009/02/24 06:58:06  dick
34   * Add isPlaying().
35   *
36   * Revision 1.10  2009/02/20 10:26:26  dick
37   * Add id, which is a database key.
38   *
39   * Revision 1.9  2009/02/14 15:43:01  dick
40   * BuckoFIBS is released under the GNU license.
41   * Javadoc.
42   *
43   * Revision 1.8  2009/02/11 09:09:13  dick
44   * setName(s) for when we get an invite from an unknown player.
45   *
46   * Revision 1.7  2009/02/01 21:14:23  dick
47   * Add the MissManners attribute.
48   *
49   * Revision 1.6  2009/02/01 09:00:08  dick
50   * Add a saved match status string.
51   *
52   * Revision 1.5  2009/01/28 22:10:57  dick
53   * Wacky parsing error?  How ss[1] be null?
54   *
55   * Revision 1.4  2009/01/28 02:52:31  dick
56   * Javadoc.
57   *
58   * Revision 1.3  2009/01/27 19:15:24  dick
59   * Add bfStatus stuff to handle player warnings.
60   *
61   * Revision 1.2  2008/12/11 10:01:28  dick
62   * Parse opponent named "-" as empty (no opponent).
63   *
64   * Revision 1.1  2008/03/31 07:10:56  dick
65   * Describe one FIBS player.
66   */
67  
68  /* 
69   * This program is free software: you can redistribute it and/or modify
70   * it under the terms of the GNU General Public License as published by
71   * the Free Software Foundation, either version 3 of the License, or
72   * (at your option) any later version.
73   *
74   * This program is distributed in the hope that it will be useful,
75   * but WITHOUT ANY WARRANTY; without even the implied warranty of
76   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
77   * GNU General Public License for more details.
78   *
79   * You should have received a copy of the GNU General Public License
80   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
81   *
82   * The Original Code is BuckoFIBS, <http://www.buckosoft.com/BuckoFIBS/>.
83   * The Initial Developer of the Original Code is Dick Balaska and BuckoSoft, Corp.
84   * 
85   */
86  package com.buckosoft.fibs.domain;
87  
88  import org.slf4j.Logger;
89  import org.slf4j.LoggerFactory;
90  
91  
92  /** Describe one FIBS player. <br>
93   * Most of these fields don't have setters because this object is mostly filled out from FIBS.
94   * See {@link #parsePlayer(String)}.
95   * @author Dick Balaska
96   * @since 2008/03/31
97   * @version $Revision$ <br> $Date$
98   * @see <a href="http://cvs.buckosoft.com/Projects/BuckoFIBS/BuckoFIBS/src/main/java/com/buckosoft/fibs/domain/Player.java">cvs Player.java</a>
99   */
100 public class Player implements Comparable<Player> {
101 	private	final static boolean DEBUG = false;
102 	private Logger logger = LoggerFactory.getLogger(getClass());
103 
104 	private	int		id = 0;
105 	private	String	name = "???";
106 	private	String	opponent = "";
107 	private	String	watching = "";
108 	private	boolean	ready = false;
109 	private	boolean	away = false;
110 	private	double	rating = 0.0;
111 	private	int		experience = 0;
112 	private	int		idleTime = 0;
113 	private	long	loginTime = 0;
114 	private	String	hostName = "";
115 	private	String	client = "";
116 	private	String	email = "";
117 	private	WinLoss	winLoss = null;
118 
119 	private	int		bfFlag = 0;
120 	private	String	bfStatus;
121 
122 	private	boolean	invited = false;
123 	
124 //	private	boolean	hasSavedGame = false;
125 	private	String	savedMatch;
126 	private	String	missManners;
127 
128 	/** Create a default/empty Player
129 	 */
130 	public Player() {}
131 	
132 	/** Convienence constructor to set the player's name.
133 	 * @param playerName The name of this new player.
134 	 */
135 	public Player(String playerName) {
136 		this.name = playerName;
137 	}
138 
139 	/** Get the local player id.
140 	 * This is a key to our local database, and is not a FIBS number at all.
141 	 * @return the id
142 	 */
143 	public int getId() {
144 		return id;
145 	}
146 
147 	/** Set the local player id.
148 	 * This is a key to our local database, and is not a FIBS number at all.
149 	 * @param id the id to set
150 	 */
151 	public void setId(int id) {
152 		this.id = id;
153 	}
154 
155 	/** Get the username of this player
156 	 * @return The username
157 	 */
158 	public String	getName() {
159 		return(name);
160 	}
161 
162 	/** Set the username of this player.
163 	 * This is useful when we get an invite from an unknown player.
164 	 * @param name The player's name
165 	 */
166 	public void setName(String name) {
167 		this.name = name;
168 	}
169 
170 	/** Return true if this player is playing someone.
171 	 * This field is derived from the opponent field.
172 	 * @return true if playing.
173 	 */
174 	public boolean isPlaying() {
175 		if (opponent.length() > 0)
176 			return(true);
177 		return(false);
178 	}
179 
180 	/** If this player is playing someone, then return the opponent's name.
181 	 * @return The opponent's name or the empty string if not playing anyone.
182 	 */
183 	public	String getOpponent() {
184 		return(opponent);
185 	}
186 
187 	/** If this player is watching someone, then return the name of the player we are watching.
188 	 * @return The player being watched or the empty string if not watching anyone.
189 	 */
190 	public	String	getWatching() {
191 		return(watching);
192 	}
193 
194 	/** Is this player ready to play?
195 	 * @return true if ready to play.
196 	 */
197 	public	boolean isReady() {
198 		return(ready);
199 	}
200 
201 	/** Has this player marked himself as away?
202 	 * @return true = yes
203 	 */
204 	public	boolean	isAway() {
205 		return(away);
206 	}
207 
208 	/** Get the rating for this player
209 	 * @return The rating
210 	 */
211 	public	double	getRating() {
212 		return(rating);
213 	}
214 
215 	/** Get the number of games this player has played
216 	 * @return The Experience
217 	 */
218 	public int getExperience() {
219 		return(experience);
220 	}
221 
222 	/** How long has this player been idle?
223 	 * @return The number of seconds he has not done anything.
224 	 */
225 	public int getIdleTime() {
226 		return(idleTime);
227 	}
228 
229 	/** When did this player log in?
230 	 * @return The number of seconds since Jan. 1, 1970
231 	 */
232 	public long getLoginTime() {
233 		return(loginTime);
234 	}
235 
236 	/** Get the hostname of the machine this player is playing on.
237 	 * @return The hostname
238 	 */
239 	public String getHostName() {
240 		return(hostName);
241 	}
242 	
243 	/** What client is this player using?
244 	 * @return The name of the client.
245 	 */
246 	public String getClient() {
247 		return(client);
248 	}
249 
250 	/** Set the name of the client that this player is using.
251 	 * @param client
252 	 */
253 	public void setClient(String client) {
254 		this.client = client;
255 	}
256 
257 	/** What is this player's email address?
258 	 * @return The email address that the player gave to FIBS (probably not a real email address).
259 	 */
260 	public String getEmail() {
261 		return(email);
262 	}
263 
264 	/** Return a string of your won/loss record against this player.
265 	 * @return the winLoss
266 	 */
267 	public WinLoss getWinLoss() {
268 		return(winLoss);
269 //		if (winLoss == null)
270 //			return("");
271 //		return winLoss.toString();
272 	}
273 
274 	/** Set the string of your won/loss record against this player.
275 	 * @param wins The number of times you have beaten this opponent.
276 	 * @param losses The number of times you have lost to this opponent.
277 	 */
278 	public void setWinLoss(int wins, int losses) {
279 		this.winLoss = new WinLoss(wins, losses);
280 	}
281 
282 	/** Get the BuckoFIBS flag (not used yet)
283 	 * @return the bfFlag
284 	 */
285 	public int getBfFlag() {
286 		return bfFlag;
287 	}
288 
289 	/** Set the BuckoFIBS flag (not used yet)
290 	 * @param bfFlag the bfFlag to set
291 	 */
292 	public void setBfFlag(int bfFlag) {
293 		this.bfFlag = bfFlag;
294 	}
295 
296 	/** If this player has a special status string, like an invite warning, it goes here.
297 	 * @return the bfStatus The status string.
298 	 */
299 	public String getBfStatus() {
300 		return bfStatus;
301 	}
302 
303 	/** If this player has a special status string, like an invite warning, it goes here.
304 	 * @param bfStatus the bfStatus to set
305 	 */
306 	public void setBfStatus(String bfStatus) {
307 		this.bfStatus = bfStatus;
308 	}
309 
310 	/** Have we invited this player?
311 	 * @return the invited
312 	 */
313 	public boolean isInvited() {
314 		return invited;
315 	}
316 
317 	/**
318 	 * @param invited the invited to set
319 	 */
320 	public void setInvited(boolean invited) {
321 		this.invited = invited;
322 	}
323 
324 	/** If you have a saved match with this player, then this string describes it. 
325 	 * @return the savedMatch or null if none
326 	 */
327 	public String getSavedMatch() {
328 		return savedMatch;
329 	}
330 
331 	/** Set the savedMatch (tooltip) text
332 	 * @param savedMatch the savedMatch to set
333 	 */
334 	public void setSavedMatch(String savedMatch) {
335 		this.savedMatch = savedMatch;
336 	}
337 
338 	/** If this player has a MissManners warning, this is it.
339 	 * @return the missManners warning, or null if this player has none.
340 	 */
341 	public String getMissManners() {
342 		return missManners;
343 	}
344 
345 	/** Set the MissManners warning issued about this player
346 	 * @param missManners the missManners to set
347 	 */
348 	public void setMissManners(String missManners) {
349 		this.missManners = missManners;
350 	}
351 
352 	/** Parse this player from a FIBS string.
353 	 * Fills in most of this object's fields from the FIBS 
354 	 * <a href="http://www.fibs.com/fibs_interface.html#clip_who_info">who info</a> line.
355 	 * @param s The who info line from FIBS
356 	 * @return success
357 	 */
358 	public boolean parsePlayer(String s) {
359 		String[] ss = s.split(" ");
360 		if (ss.length != 13) {
361 			if (DEBUG) {
362 				logger.info("Error parsing player");
363 				logger.info(s);
364 			}
365 			return(false);
366 		}
367 		name = ss[1];
368 		opponent = ss[2];
369 		if ("-".equals(ss[2]) || opponent == null)
370 			opponent = "";
371 		watching = ss[3];
372 		if ("-".equals(watching))
373 			watching = "";
374 		ready = "1".equals(ss[4]);
375 		away = "1".equals(ss[5]);
376 		rating = Double.parseDouble(ss[6]);
377 		experience = Integer.parseInt(ss[7]);
378 		idleTime = Integer.parseInt(ss[8]);
379 		loginTime = Long.parseLong(ss[9]);
380 		hostName = ss[10];
381 		client = ss[11];
382 		email = ss[12];
383 		return(true);
384 	}
385 
386 	/** String compare the name of this player with that one.
387 	 * @param o The other player to compare
388 	 */
389 	@Override
390 	public int compareTo(Player o) {
391 		return(this.name.compareToIgnoreCase(o.getName()));
392 	}
393 	
394 }