1 /***
2 * Jetrix TetriNET Server
3 * Copyright (C) 2001-2003 Emmanuel Bourg
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 package net.jetrix;
21
22 import java.net.InetAddress;
23 import java.util.Collection;
24 import java.util.Iterator;
25 import java.util.Map;
26 import java.util.List;
27 import java.util.ArrayList;
28 import java.util.concurrent.ConcurrentSkipListMap;
29
30 /***
31 * Repository of clients connected to the server.
32 *
33 * @author Emmanuel Bourg
34 * @version $Revision: 794 $, $Date: 2009-02-17 20:08:39 +0100 (Tue, 17 Feb 2009) $
35 */
36 public class ClientRepository
37 {
38 private static ClientRepository instance = new ClientRepository();
39 private Map<String, Client> clients = new ConcurrentSkipListMap<String, Client>();
40
41 private ClientRepository()
42 {
43 }
44
45 public static ClientRepository getInstance()
46 {
47 return instance;
48 }
49
50 /***
51 * Add a client into the repository.
52 *
53 * @param client the client to add
54 */
55 public void addClient(Client client)
56 {
57 if (client != null)
58 {
59 clients.put(client.getUser().getName().toLowerCase(), client);
60 }
61 }
62
63 /***
64 * Remove a client from the repository.
65 *
66 * @param client the client to remove
67 */
68 public void removeClient(Client client)
69 {
70 if (client != null)
71 {
72 clients.remove(client.getUser().getName().toLowerCase());
73 }
74 }
75
76 /***
77 * Return an iterator of players online in alphabetical order.
78 */
79 public Iterator<Client> getPlayers()
80 {
81 List<Client> player = new ArrayList<Client>();
82
83 for (Client client : clients.values())
84 {
85 if (client.getUser().isPlayer())
86 {
87 player.add(client);
88 }
89 }
90
91 return player.iterator();
92 }
93
94 /***
95 * Return the number of players connected to this server.
96 */
97 public int getPlayerCount()
98 {
99 int count = 0;
100 for (Client client : clients.values())
101 {
102 if (client.getUser().isPlayer())
103 {
104 count++;
105 }
106 }
107
108 return count;
109 }
110
111 /***
112 * Return an iterator of spectators online in alphabetical order.
113 */
114 public Iterator<Client> getSpectators()
115 {
116 List<Client> spectators = new ArrayList<Client>();
117
118 for (Client client : clients.values())
119 {
120 if (client.getUser().isSpectator())
121 {
122 spectators.add(client);
123 }
124 }
125
126 return spectators.iterator();
127 }
128
129 /***
130 * Return the number of spectators connected to this server.
131 */
132 public int getSpectatorCount()
133 {
134 int count = 0;
135 for (Client client : clients.values())
136 {
137 if (client.getUser().isSpectator())
138 {
139 count++;
140 }
141 }
142
143 return count;
144 }
145
146 /***
147 * Return an iterator of operators online in alphabetical order.
148 */
149 public Iterator<Client> getOperators()
150 {
151 List<Client> operators = new ArrayList<Client>();
152
153 for (Client client : clients.values())
154 {
155 if (client.getUser().getAccessLevel() > 0)
156 {
157 operators.add(client);
158 }
159 }
160
161 return operators.iterator();
162 }
163
164 /***
165 * Return the client of the player or spectator with
166 * the specified nickname.
167 *
168 * @param nickname nickname of the client to return
169 */
170 public Client getClient(String nickname)
171 {
172 return (nickname == null) ? null : clients.get(nickname.toLowerCase());
173 }
174
175 /***
176 * Return an iterator of all clients online in alphabetical order.
177 */
178 public Collection<Client> getClients()
179 {
180 return clients.values();
181 }
182
183 /***
184 * Return the number of clients connected to this server.
185 */
186 public int getClientCount()
187 {
188 return clients.size();
189 }
190
191 /***
192 * Return the number of clients connected from the specified
193 * internet address.
194 *
195 * @param address
196 */
197 public int getHostCount(InetAddress address)
198 {
199 int count = 0;
200
201 for (Client client : clients.values())
202 {
203 if (address.equals(client.getInetAddress()))
204 {
205 count++;
206 }
207 }
208
209 return count;
210 }
211
212 public void clear()
213 {
214 clients.clear();
215 }
216
217 }