7 m_lastPing (0) |
7 m_lastPing (0) |
8 { |
8 { |
9 if (not m_socket.set_blocking (false)) |
9 if (not m_socket.set_blocking (false)) |
10 { |
10 { |
11 // TODO: find a better way to deal with errors |
11 // TODO: find a better way to deal with errors |
12 fprintf (stderr, "unable to set socket as non-blocking: %s\n", |
12 print ("unable to set socket as non-blocking: %s\n", |
13 m_socket.error_string().chars()); |
13 m_socket.error_string().chars()); |
14 } |
14 } |
15 } |
15 } |
16 |
16 |
17 // ------------------------------------------------------------------------------------------------- |
17 // ------------------------------------------------------------------------------------------------- |
91 bool ok = true; |
91 bool ok = true; |
92 |
92 |
93 while (packet.bytes_left() > 0) |
93 while (packet.bytes_left() > 0) |
94 { |
94 { |
95 int header = packet.read_byte (&ok); |
95 int header = packet.read_byte (&ok); |
|
96 print ("Recieved packet with header %1\n", header); |
96 |
97 |
97 switch (ServerResponse (header)) |
98 switch (ServerResponse (header)) |
98 { |
99 { |
99 case SVRC_OLDPROTOCOL: |
100 case SVRC_OLDPROTOCOL: |
100 fprintf (stderr, "wrong version\n"); |
101 print ("wrong version\n"); |
101 m_state = RCON_DISCONNECTED; |
102 m_state = RCON_DISCONNECTED; |
102 break; |
103 break; |
103 |
104 |
104 case SVRC_BANNED: |
105 case SVRC_BANNED: |
105 fprintf (stderr, "you're banned\n"); |
106 print ("you're banned\n"); |
106 m_state = RCON_DISCONNECTED; |
107 m_state = RCON_DISCONNECTED; |
107 break; |
108 break; |
108 |
109 |
109 case SVRC_SALT: |
110 case SVRC_SALT: |
110 { |
111 { |
113 m_state = RCON_AUTHENTICATING; |
114 m_state = RCON_AUTHENTICATING; |
114 send_password(); |
115 send_password(); |
115 } |
116 } |
116 break; |
117 break; |
117 |
118 |
118 case SVRC_LOGGEDIN: |
|
119 fprintf (stderr, "login successful\n"); |
|
120 m_state = RCON_CONNECTED; |
|
121 break; |
|
122 |
|
123 case SVRC_INVALIDPASSWORD: |
119 case SVRC_INVALIDPASSWORD: |
124 fprintf (stderr, "bad password\n"); |
120 print ("bad password\n"); |
125 m_state = RCON_DISCONNECTED; |
121 m_state = RCON_DISCONNECTED; |
126 break; |
122 break; |
127 |
123 |
128 case SVRC_MESSAGE: |
124 case SVRC_MESSAGE: |
129 { |
125 { |
130 String message = packet.read_string(); |
126 String message = packet.read_string(); |
131 print_to (stderr, "message: %1\n", message); |
127 if (message.ends_with ("\n")) |
|
128 message.remove_from_end (1); |
|
129 print ("message: %1\n", message); |
132 } |
130 } |
133 break; |
131 break; |
134 |
132 |
|
133 case SVRC_LOGGEDIN: |
|
134 print ("login successful\n"); |
|
135 m_serverProtocol = packet.read_byte(); |
|
136 m_hostname = packet.read_string(); |
|
137 m_state = RCON_CONNECTED; |
|
138 |
|
139 for (int i = packet.read_byte(); i > 0; --i) |
|
140 process_server_updates (packet); |
|
141 |
|
142 for (int i = packet.read_byte(); i > 0; --i) |
|
143 { |
|
144 String message = packet.read_string(); |
|
145 message.normalize(); |
|
146 print ("--- %1\n", message); |
|
147 } |
|
148 |
|
149 break; |
|
150 |
135 case SVRC_UPDATE: |
151 case SVRC_UPDATE: |
136 switch (RCONUpdateType (packet.read_byte (&ok))) |
152 process_server_updates (packet); |
137 { |
|
138 case SVRCU_PLAYERDATA: |
|
139 { |
|
140 int numplayers = packet.read_byte (&ok); |
|
141 Vector<String> players; |
|
142 |
|
143 while (numplayers--) |
|
144 players << packet.read_string (&ok); |
|
145 |
|
146 print_to (stderr, "players: %1\n", players); |
|
147 } |
|
148 break; |
|
149 |
|
150 case SVRCU_ADMINCOUNT: |
|
151 print_to (stderr, "num admins: %1\n", packet.read_byte (&ok)); |
|
152 break; |
|
153 |
|
154 case SVRCU_MAP: |
|
155 print_to (stderr, "new map: %1\n", packet.read_string (&ok)); |
|
156 break; |
|
157 } |
|
158 |
|
159 break; |
153 break; |
160 } |
154 } |
161 |
155 |
162 if (not ok) |
156 if (not ok) |
163 print_to (stderr, "error while reading packet\n"); |
157 print ("error while reading packet\n"); |
|
158 } |
|
159 } |
|
160 |
|
161 METHOD |
|
162 RCONSession::process_server_updates (Bytestream& packet) -> void |
|
163 { |
|
164 switch (RCONUpdateType (packet.read_byte())) |
|
165 { |
|
166 case SVRCU_PLAYERDATA: |
|
167 { |
|
168 Vector<String> players; |
|
169 for (int i = packet.read_byte(); i > 0; --i) |
|
170 players << packet.read_string(); |
|
171 print ("players: %1\n", players); |
|
172 } |
|
173 break; |
|
174 |
|
175 case SVRCU_ADMINCOUNT: |
|
176 print ("num admins: %d1\n", packet.read_byte()); |
|
177 break; |
|
178 |
|
179 case SVRCU_MAP: |
|
180 print ("new map: %1\n", packet.read_string()); |
|
181 break; |
164 } |
182 } |
165 } |
183 } |
166 |
184 |
167 // ------------------------------------------------------------------------------------------------- |
185 // ------------------------------------------------------------------------------------------------- |
168 // |
186 // |