@@ -116,24 +116,18 @@ int ModApiServer::l_get_player_privs(lua_State *L)
116116int ModApiServer::l_get_player_ip (lua_State *L)
117117{
118118 NO_MAP_LOCK_REQUIRED;
119- const char * name = luaL_checkstring (L, 1 );
120- RemotePlayer *player = dynamic_cast <ServerEnvironment *>(getEnv (L))->getPlayer (name);
121- if (player == NULL )
122- {
119+
120+ Server *server = getServer (L);
121+
122+ const char *name = luaL_checkstring (L, 1 );
123+ RemotePlayer *player = server->getEnv ().getPlayer (name);
124+ if (!player) {
123125 lua_pushnil (L); // no such player
124126 return 1 ;
125127 }
126- try
127- {
128- Address addr = getServer (L)->getPeerAddress (player->getPeerId ());
129- std::string ip_str = addr.serializeString ();
130- lua_pushstring (L, ip_str.c_str ());
131- return 1 ;
132- } catch (const con::PeerNotFoundException &) {
133- dstream << FUNCTION_NAME << " : peer was not found" << std::endl;
134- lua_pushnil (L); // error
135- return 1 ;
136- }
128+
129+ lua_pushstring (L, server->getPeerAddress (player->getPeerId ()).serializeString ().c_str ());
130+ return 1 ;
137131}
138132
139133// get_player_information(name)
@@ -150,26 +144,18 @@ int ModApiServer::l_get_player_information(lua_State *L)
150144 return 1 ;
151145 }
152146
153- Address addr;
154- try {
155- addr = server->getPeerAddress (player->getPeerId ());
156- } catch (const con::PeerNotFoundException &) {
157- dstream << FUNCTION_NAME << " : peer was not found" << std::endl;
158- lua_pushnil (L); // error
159- return 1 ;
160- }
161-
162- float min_rtt, max_rtt, avg_rtt, min_jitter, max_jitter, avg_jitter;
163- ClientState state;
164- u32 uptime;
165- u16 prot_vers;
166- u8 ser_vers, major, minor, patch;
167- std::string vers_string, lang_code;
147+ /*
148+ Be careful not to introduce a depdendency on the connection to
149+ the peer here. This function is >>REQUIRED<< to still be able to return
150+ values even when the peer unexpectedly disappears.
151+ Hence all the ConInfo values here are optional.
152+ */
168153
169154 auto getConInfo = [&] (con::rtt_stat_type type, float *value) -> bool {
170155 return server->getClientConInfo (player->getPeerId (), type, value);
171156 };
172157
158+ float min_rtt, max_rtt, avg_rtt, min_jitter, max_jitter, avg_jitter;
173159 bool have_con_info =
174160 getConInfo (con::MIN_RTT, &min_rtt) &&
175161 getConInfo (con::MAX_RTT, &max_rtt) &&
@@ -178,11 +164,9 @@ int ModApiServer::l_get_player_information(lua_State *L)
178164 getConInfo (con::MAX_JITTER, &max_jitter) &&
179165 getConInfo (con::AVG_JITTER, &avg_jitter);
180166
181- bool r = server->getClientInfo (player->getPeerId (), &state, &uptime,
182- &ser_vers, &prot_vers, &major, &minor, &patch, &vers_string,
183- &lang_code);
184- if (!r) {
185- dstream << FUNCTION_NAME << " : peer was not found" << std::endl;
167+ ClientInfo info;
168+ if (!server->getClientInfo (player->getPeerId (), info)) {
169+ warningstream << FUNCTION_NAME << " : no client info?!" << std::endl;
186170 lua_pushnil (L); // error
187171 return 1 ;
188172 }
@@ -191,13 +175,13 @@ int ModApiServer::l_get_player_information(lua_State *L)
191175 int table = lua_gettop (L);
192176
193177 lua_pushstring (L," address" );
194- lua_pushstring (L, addr.serializeString ().c_str ());
178+ lua_pushstring (L, info. addr .serializeString ().c_str ());
195179 lua_settable (L, table);
196180
197181 lua_pushstring (L," ip_version" );
198- if (addr.getFamily () == AF_INET) {
182+ if (info. addr .getFamily () == AF_INET) {
199183 lua_pushnumber (L, 4 );
200- } else if (addr.getFamily () == AF_INET6) {
184+ } else if (info. addr .getFamily () == AF_INET6) {
201185 lua_pushnumber (L, 6 );
202186 } else {
203187 lua_pushnumber (L, 0 );
@@ -231,44 +215,44 @@ int ModApiServer::l_get_player_information(lua_State *L)
231215 }
232216
233217 lua_pushstring (L," connection_uptime" );
234- lua_pushnumber (L, uptime);
218+ lua_pushnumber (L, info. uptime );
235219 lua_settable (L, table);
236220
237221 lua_pushstring (L," protocol_version" );
238- lua_pushnumber (L, prot_vers);
222+ lua_pushnumber (L, info. prot_vers );
239223 lua_settable (L, table);
240224
241225 lua_pushstring (L, " formspec_version" );
242226 lua_pushnumber (L, player->formspec_version );
243227 lua_settable (L, table);
244228
245229 lua_pushstring (L, " lang_code" );
246- lua_pushstring (L, lang_code.c_str ());
230+ lua_pushstring (L, info. lang_code .c_str ());
247231 lua_settable (L, table);
248232
249233#ifndef NDEBUG
250234 lua_pushstring (L," serialization_version" );
251- lua_pushnumber (L, ser_vers);
235+ lua_pushnumber (L, info. ser_vers );
252236 lua_settable (L, table);
253237
254238 lua_pushstring (L," major" );
255- lua_pushnumber (L, major);
239+ lua_pushnumber (L, info. major );
256240 lua_settable (L, table);
257241
258242 lua_pushstring (L," minor" );
259- lua_pushnumber (L, minor);
243+ lua_pushnumber (L, info. minor );
260244 lua_settable (L, table);
261245
262246 lua_pushstring (L," patch" );
263- lua_pushnumber (L, patch);
247+ lua_pushnumber (L, info. patch );
264248 lua_settable (L, table);
265249
266250 lua_pushstring (L," version_string" );
267- lua_pushstring (L, vers_string.c_str ());
251+ lua_pushstring (L, info. vers_string .c_str ());
268252 lua_settable (L, table);
269253
270254 lua_pushstring (L," state" );
271- lua_pushstring (L,ClientInterface::state2Name (state).c_str ());
255+ lua_pushstring (L, ClientInterface::state2Name (info. state ).c_str ());
272256 lua_settable (L, table);
273257#endif
274258
@@ -296,23 +280,18 @@ int ModApiServer::l_get_ban_description(lua_State *L)
296280int ModApiServer::l_ban_player (lua_State *L)
297281{
298282 NO_MAP_LOCK_REQUIRED;
299- const char * name = luaL_checkstring (L, 1 );
300- RemotePlayer *player = dynamic_cast <ServerEnvironment *>(getEnv (L))->getPlayer (name);
301- if (player == NULL ) {
283+
284+ Server *server = getServer (L);
285+
286+ const char *name = luaL_checkstring (L, 1 );
287+ RemotePlayer *player = server->getEnv ().getPlayer (name);
288+ if (!player) {
302289 lua_pushboolean (L, false ); // no such player
303290 return 1 ;
304291 }
305- try
306- {
307- Address addr = getServer (L)->getPeerAddress (
308- dynamic_cast <ServerEnvironment *>(getEnv (L))->getPlayer (name)->getPeerId ());
309- std::string ip_str = addr.serializeString ();
310- getServer (L)->setIpBanned (ip_str, name);
311- } catch (const con::PeerNotFoundException &) {
312- dstream << FUNCTION_NAME << " : peer was not found" << std::endl;
313- lua_pushboolean (L, false ); // error
314- return 1 ;
315- }
292+
293+ std::string ip_str = server->getPeerAddress (player->getPeerId ()).serializeString ();
294+ server->setIpBanned (ip_str, name);
316295 lua_pushboolean (L, true );
317296 return 1 ;
318297}
0 commit comments