diff --git a/src/bnetd/account.cpp b/src/bnetd/account.cpp index 43d0a93..b1cff27 100644 --- a/src/bnetd/account.cpp +++ b/src/bnetd/account.cpp @@ -81,16 +81,25 @@ namespace pvpgn register unsigned int h; register unsigned int len = std::strlen(username); + int c; for (h = 5381; len > 0; --len, ++username) { h += h << 5; - if (std::isupper((int)*username) == 0) + + c = (int)*username; + // FIXME: (HarpyWar) I add this condition because if we call connlist_find_connection_by_accountname + // with wrong account name, then it fails on std::isupper(c) + if (c < -1 || c > 255) + break; + + if (std::isupper(c) == 0) h ^= *username; else - h ^= std::tolower((int)*username); + h ^= std::tolower(c); } return h; } + static t_account * account_create(char const * username, char const * passhash1) { t_account * account; diff --git a/src/bnetd/connection.cpp b/src/bnetd/connection.cpp index 04c8c71..305d4a1 100644 --- a/src/bnetd/connection.cpp +++ b/src/bnetd/connection.cpp @@ -76,6 +76,10 @@ #include "common/setup_after.h" #include "icons.h" +#ifdef WITH_LUA +#include "luainterface.h" +#endif + namespace pvpgn { @@ -2185,6 +2189,7 @@ namespace pvpgn if (!(c->protocol.game = gamelist_find_game_available(gamename, c->protocol.client.clienttag, type)) && !gamelist_find_game_available(gamename, c->protocol.client.clienttag, game_type_all)) { /* do not allow creation of games with same name of same clienttag when game is not started or done */ + // create game with initial values c->protocol.game = game_create(gamename, gamepass, gameinfo, type, version, c->protocol.client.clienttag, conn_get_gameversion(c)); if (c->protocol.game && conn_get_realm(c) && conn_get_charname(c)) { @@ -2195,11 +2200,18 @@ namespace pvpgn } if (c->protocol.game) { + // add new player to the game if (game_add_player(conn_get_game(c), gamepass, version, c) < 0) { c->protocol.game = NULL; // bad password or version # return -1; } +#ifdef WITH_LUA + // handle game create when it's owner joins the game + if (c == game_get_owner(c->protocol.game)) + lua_handle_game(c->protocol.game, luaevent_game_create); +#endif + if (game_is_ladder(c->protocol.game)) { if (c == game_get_owner(c->protocol.game)) message_send_text(c, message_type_info, c, "Created ladder game"); @@ -2207,6 +2219,8 @@ namespace pvpgn message_send_text(c, message_type_info, c, "Joined ladder game"); } } + + } else c->protocol.game = NULL; diff --git a/src/bnetd/game.cpp b/src/bnetd/game.cpp index d5a0bbe..f5eb296 100644 --- a/src/bnetd/game.cpp +++ b/src/bnetd/game.cpp @@ -42,6 +42,9 @@ #include "game_conv.h" #include "common/setup_after.h" +#ifdef WITH_LUA +#include "luainterface.h" +#endif namespace pvpgn { @@ -471,6 +474,10 @@ namespace pvpgn eventlog(eventlog_level_error, __FUNCTION__, "got NULL game"); return; } + +#ifdef WITH_LUA + lua_handle_game(game, luaevent_game_destroy); +#endif elist_del(&game->glist_link); glist_length--; @@ -736,6 +743,10 @@ namespace pvpgn return -1; } +#ifdef WITH_LUA + lua_handle_game(game, luaevent_game_end); +#endif + if (game->clienttag == CLIENTTAG_WARCRAFT3_UINT || game->clienttag == CLIENTTAG_WAR3XP_UINT) // war3 game reporting is done elsewhere, so we can skip this function return 0; @@ -1098,6 +1109,10 @@ namespace pvpgn } std::fprintf(fp, "\nThis game lasted %lu minutes (elapsed).\n", ((unsigned long int)std::difftime(now, game->start_time)) / 60); + +#ifdef WITH_LUA + lua_handle_game(game, luaevent_game_report); +#endif if (std::fclose(fp) < 0) { @@ -1437,6 +1452,10 @@ namespace pvpgn if (status == game_status_started && game->start_time == (std::time_t)0) game->start_time = now; game->status = status; + +#ifdef WITH_LUA + lua_handle_game(game, luaevent_game_changestatus); +#endif } @@ -1730,6 +1749,9 @@ namespace pvpgn game_choose_host(game); +#ifdef WITH_LUA + lua_handle_user(c, game, luaevent_user_leftgame); +#endif return 0; } diff --git a/src/bnetd/handle_bnet.cpp b/src/bnetd/handle_bnet.cpp index 76fd504..bfa0f75 100644 --- a/src/bnetd/handle_bnet.cpp +++ b/src/bnetd/handle_bnet.cpp @@ -76,7 +76,9 @@ #include <win32/winmain.h> #endif #include "common/setup_after.h" - +#ifdef WITH_LUA +#include "luainterface.h" +#endif namespace pvpgn { @@ -3793,6 +3795,10 @@ namespace pvpgn else eventlog(eventlog_level_info, __FUNCTION__, "[%d] \"%s\" joined game \"%s\"", conn_get_socket(c), conn_get_username(c), gamename); +#ifdef WITH_LUA + lua_handle_user(c, game, luaevent_user_joingame); +#endif + return 0; } @@ -4029,6 +4035,7 @@ namespace pvpgn else { eventlog(eventlog_level_error, __FUNCTION__, "[%d] unknown startgame4 status %d (clienttag: %s)", conn_get_socket(c), status, clienttag_uint_to_str(conn_get_clienttag(c))); } + } else if ((status & CLIENT_STARTGAME4_STATUSMASK_INIT_VALID) == status) { /*valid creation status would be: @@ -4041,11 +4048,13 @@ namespace pvpgn gtype = bngtype_to_gtype(conn_get_clienttag(c), bngtype); if ((gtype == game_type_ladder && account_get_auth_createladdergame(conn_get_account(c)) == 0) || (gtype != game_type_ladder && account_get_auth_createnormalgame(conn_get_account(c)) == 0)) eventlog(eventlog_level_info, __FUNCTION__, "[%d] game start for \"%s\" refused (no authority)", conn_get_socket(c), conn_get_username(c)); - else { + else + { //find is there any existing game with same name and allow the host to create game // with same name only when another game is already started or already done if ((!(game = gamelist_find_game_available(gamename, conn_get_clienttag(c), game_type_all))) && - (conn_set_game(c, gamename, gamepass, gameinfo, gtype, STARTVER_GW4) == 0)) { + (conn_set_game(c, gamename, gamepass, gameinfo, gtype, STARTVER_GW4) == 0)) + { game_set_option(conn_get_game(c), bngoption_to_goption(conn_get_clienttag(c), gtype, option)); if (status & CLIENT_STARTGAME4_STATUS_PRIVATE) game_set_flag(conn_get_game(c), game_flag_private); @@ -4054,6 +4063,7 @@ namespace pvpgn if (bngtype == CLIENT_GAMELISTREQ_LOADED) /* PELISH: seems strange but it is really needed for loaded games */ game_set_status(conn_get_game(c), game_status_loaded); //FIXME: still need special handling for status disc-is-loss and replay + } } } diff --git a/src/bnetd/luainterface.cpp b/src/bnetd/luainterface.cpp index c8534c5..26a2b89 100644 --- a/src/bnetd/luainterface.cpp +++ b/src/bnetd/luainterface.cpp @@ -15,6 +15,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#define GAME_INTERNAL_ACCESS + #include "common/setup_before.h" #include "command.h" @@ -23,6 +25,8 @@ #include <cstring> #include <cstdlib> + + #include "compat/strcasecmp.h" #include "compat/snprintf.h" #include "common/tag.h" @@ -71,8 +75,8 @@ #include "attrlayer.h" - #include "luawrapper.h" +#include "luainterface.h" namespace pvpgn { @@ -83,34 +87,53 @@ namespace pvpgn void _register_functions(); + std::map<std::string, std::string> get_account_object(const char *username); + std::map<std::string, std::string> get_account_object(t_connection * c); + std::map<std::string, std::string> get_game_object(t_game * game); + + + template <class T, class A> + T join(const A &begin, const A &end, const T &t); + int _sum(lua_State* L); int __message_send_text(lua_State* L); + int __eventlog(lua_State* L); + int __get_account(lua_State* L); - char xmsgtemp[MAX_MESSAGE_LEN]; - char xmsgtemp2[MAX_MESSAGE_LEN]; + char _msgtemp[MAX_MESSAGE_LEN]; + char _msgtemp2[MAX_MESSAGE_LEN]; - /* Reload all the lua scripts */ + /* Unload all the lua scripts */ extern void lua_unload() { - + // nothing to do, "vm.initialize()" already destroys lua vm before initialize } /* Initialize lua, register functions and load scripts */ extern void lua_load(char const * scriptdir) { + eventlog(eventlog_level_info, __FUNCTION__, "Loading Lua interface..."); + try { - // initialize vm.initialize(); std::vector<std::string> files = dir_getfiles(std::string(scriptdir), ".lua", true); - + // load all files from the script directory for (int i = 0; i < files.size(); ++i) + { vm.load_file(files[i].c_str()); + snprintf(_msgtemp, sizeof(_msgtemp), "%s", files[i].c_str()); + eventlog(eventlog_level_info, __FUNCTION__, _msgtemp); + } + _register_functions(); + + snprintf(_msgtemp, sizeof(_msgtemp), "Lua sripts were successfully loaded (%u files)", files.size()); + eventlog(eventlog_level_info, __FUNCTION__, _msgtemp); } catch (const std::exception& e) { @@ -122,60 +145,220 @@ namespace pvpgn } } + /* Register C++ functions to be able use them from lua scripts */ void _register_functions() { + // global variables + lua::table g(vm); + g.update("PVPGN_SOFTWARE", PVPGN_SOFTWARE); + g.update("PVPGN_VERSION", PVPGN_VERSION); + // register CFunction vm.reg("sum", _sum); vm.reg("message_send_text", __message_send_text); + vm.reg("eventlog", __eventlog); + vm.reg("get_account", __get_account); // FIXME: - + // register package 'event' + static const luaL_Reg event[] = + { + { 0, 0 } + }; + vm.reg("event", event); } -/* Lua Events */ + + /* Lua Events (called from scripts) */ #ifndef _LUA_EVENTS_ extern int lua_handle_command(t_connection * c, char const * text) { - unsigned int sessionkey; // FIXME: unsigned int - int result; - - sessionkey = conn_get_sessionkey(c); - - lua::transaction(vm) << lua::lookup("handle_command") << sessionkey << text << lua::invoke >> result << lua::end; - + int result = 0; + std::map<std::string, std::string> o_account = get_account_object(c); + try + { + // invoke lua method + lua::transaction(vm) << lua::lookup("handle_command") << o_account << text << lua::invoke >> result << lua::end; + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, e.what()); + } + catch (...) + { + eventlog(eventlog_level_error, __FUNCTION__, "lua exception\n"); + } return result; } + extern void lua_handle_game(t_game * game, t_luaevent_type luaevent) + { + const char * func_name; + switch (luaevent) + { + case luaevent_game_create: + func_name = "handle_game_create"; + break; + case luaevent_game_report: + func_name = "handle_game_report"; + break; + case luaevent_game_end: + func_name = "handle_game_end"; + break; + case luaevent_game_destroy: + func_name = "handle_game_destroy"; + break; + case luaevent_game_changestatus: + func_name = "handle_game_changestatus"; + break; + } + + try + { + std::map<std::string, std::string> o_game = get_game_object(game); + lua::transaction(vm) << lua::lookup(func_name) << o_game << lua::invoke << lua::end; + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, e.what()); + } + catch (...) + { + eventlog(eventlog_level_error, __FUNCTION__, "lua exception\n"); + } + } + + extern void lua_handle_user(t_connection * c, t_game * game, t_luaevent_type luaevent) + { + const char * func_name; + switch (luaevent) + { + case luaevent_user_joingame: + func_name = "handle_user_joingame"; + break; + + case luaevent_user_leftgame: + func_name = "handle_user_leftgame"; + break; + } + + std::map<std::string, std::string> o_account = get_account_object(c); + std::map<std::string, std::string> o_game = get_game_object(game); + try + { + lua::transaction(vm) << lua::lookup("handle_user_leftgame") << o_account << o_game << lua::invoke << lua::end; + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, e.what()); + } + catch (...) + { + eventlog(eventlog_level_error, __FUNCTION__, "lua exception\n"); + } + } + #endif -/* --- Lua Functions (called from scripts) */ + /* --- Lua Functions (called from scripts) */ #ifndef _LUA_FUNCTIONS_ + /* Send message text to user */ int __message_send_text(lua_State* L) { - lua::stack st(L); - unsigned int sessionkey_src, sessionkey_dst; const char *text; + const char *username_src, *username_dst; int message_type; - t_connection *c_src, *c_dst; + t_connection *c_src = NULL, *c_dst = NULL; - // get vars - st.at(1, sessionkey_dst); - st.at(2, message_type); - st.at(3, sessionkey_src); - st.at(4, text); + try + { + lua::stack st(L); + // get args + st.at(1, username_dst); + st.at(2, message_type); + st.at(3, username_src); + st.at(4, text); + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, e.what()); + } + catch (...) + { + eventlog(eventlog_level_error, __FUNCTION__, "lua exception\n"); + } // get user connections - c_dst = connlist_find_connection_by_sessionkey(sessionkey_dst); - c_src = connlist_find_connection_by_sessionkey(sessionkey_src); + if (t_account * account = accountlist_find_account(username_dst)) + c_dst = account_get_conn(account); + + if (username_src) + if (t_account * account = accountlist_find_account(username_src)) + c_src = account_get_conn(account); // send message - message_send_text(c_dst, (t_message_type)message_type, c_src, text); + // (source can be NULL, but destination cant) + if (c_dst) + message_send_text(c_dst, (t_message_type)message_type, c_src, text); return 0; } + /* Log text into logfile */ + int __eventlog(lua_State* L) + { + int loglevel; + const char *text, *function; + + try + { + lua::stack st(L); + // get args + st.at(1, loglevel); + st.at(2, function); + st.at(3, text); + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, e.what()); + } + catch (...) + { + eventlog(eventlog_level_error, __FUNCTION__, "lua exception\n"); + } + eventlog(t_eventlog_level(loglevel), function, text); + + return 0; + } + + /* Log text into logfile */ + int __get_account(lua_State* L) + { + const char *username; + std::map<std::string, std::string> o_account; + + try + { + lua::stack st(L); + // get args + st.at(1, username); + o_account = get_account_object(username); + + st.push(o_account); + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, e.what()); + } + catch (...) + { + eventlog(eventlog_level_error, __FUNCTION__, "lua exception\n"); + } + + return 1; + } int _sum(lua_State* L) @@ -194,5 +377,134 @@ namespace pvpgn #endif + + std::map<std::string, std::string> get_account_object(const char *username) + { + std::map<std::string, std::string> o_account; + if (t_connection *c = connlist_find_connection_by_accountname(username)) + o_account = get_account_object(c); + + return o_account; + } + + std::map<std::string, std::string> get_account_object(t_connection * c) + { + std::map<std::string, std::string> o_account; + + t_account * account = conn_get_account(c); + if (!account) + return o_account; + + o_account["id"] = std::to_string(account_get_uid(account)); + o_account["name"] = account_get_name(account); + o_account["email"] = account_get_email(account); + o_account["commandgroups"] = std::to_string(account_get_command_groups(account)); + o_account["locked"] = account_get_auth_lock(account) ? "true" : "false"; + o_account["muted"] = account_get_auth_mute(account) ? "true" : "false"; + o_account["country"] = conn_get_country(c); + o_account["clientver"] = conn_get_clientver(c); + o_account["latency"] = std::to_string(conn_get_latency(c)); + if (t_clienttag clienttag = conn_get_clienttag(c)) + o_account["clienttag"] = clienttag_uint_to_str(clienttag); + if (t_game *game = conn_get_game(c)) + o_account["game_id"] = std::to_string(game_get_id(game)); + if (t_channel *channel = conn_get_channel(c)) + o_account["channel_id"] = std::to_string(channel_get_channelid(channel)); + + return o_account; + } + + + std::map<std::string, std::string> get_game_object(t_game * game) + { + std::map<std::string, std::string> o_game; + + if (!game) + return o_game; + + o_game["id"] = std::to_string(game->id); + o_game["name"] = game->name; + o_game["pass"] = game->pass; + o_game["info"] = game->info; + o_game["type"] = std::to_string(game->type); + o_game["flag"] = std::to_string(game->flag); + + o_game["address"] = addr_num_to_ip_str(game->addr); + o_game["port"] = std::to_string(game->port); + o_game["status"] = std::to_string(game->status); + o_game["currentplayers"] = std::to_string(game->ref); + o_game["totalplayers"] = std::to_string(game->count); + o_game["maxplayers"] = std::to_string(game->maxplayers); + o_game["mapname"] = game->mapname; + o_game["option"] = std::to_string(game->option); + o_game["maptype"] = std::to_string(game->maptype); + o_game["tileset"] = std::to_string(game->tileset); + o_game["speed"] = std::to_string(game->speed); + o_game["mapsize_x"] = std::to_string(game->mapsize_x); + o_game["mapsize_y"] = std::to_string(game->mapsize_y); + if (t_connection *c = game->owner) + { + if (t_account *account = conn_get_account(c)) + o_game["owner"] = account_get_name(account); + } + + std::vector<std::string> players; + for (int i = 0; i < game->ref; i++) + { + if (t_account *account = game->players[i]) + players.push_back(account_get_name(account)); + } + o_game["players"] = join(players.begin(), players.end(), std::string(",")); + + + o_game["bad"] = std::to_string(game->bad); // if 1, then the results will be ignored + + std::vector<std::string> results; + if (game->results) + { + for (int i = 0; i < game->count; i++) + results.push_back(std::to_string(game->results[i])); + } + o_game["results"] = join(results.begin(), results.end(), std::string(",")); + // UNDONE: add report_heads and report_bodies: they are XML strings + + o_game["create_time"] = std::to_string(game->create_time); + o_game["start_time"] = std::to_string(game->start_time); + o_game["lastaccess_time"] = std::to_string(game->lastaccess_time); + + o_game["difficulty"] = std::to_string(game->difficulty); + o_game["version"] = vernum_to_verstr(game->version); + o_game["startver"] = std::to_string(game->startver); + + if (t_clienttag clienttag = game->clienttag) + o_game["clienttag"] = clienttag_uint_to_str(clienttag); + + + if (game->description) + o_game["description"] = game->description; + if (game->realmname) + o_game["realmname"] = game->realmname; + + return o_game; + } + + + + + /* Join two vector objects to string by delimeter */ + template <class T, class A> + T join(const A &begin, const A &end, const T &t) + { + T result; + for (A it = begin; + it != end; + it++) + { + if (!result.empty()) + result.append(t); + result.append(*it); + } + return result; + } } } \ No newline at end of file diff --git a/src/bnetd/luainterface.h b/src/bnetd/luainterface.h index 1425397..3ce2899 100644 --- a/src/bnetd/luainterface.h +++ b/src/bnetd/luainterface.h @@ -39,12 +39,39 @@ namespace pvpgn namespace bnetd { + typedef enum { + luaevent_game_create, + luaevent_game_report, + luaevent_game_end, + luaevent_game_destroy, + luaevent_game_changestatus, + + luaevent_channel_create, + luaevent_channel_destroy, + + luaevent_user_joingame, + luaevent_user_leftgame, + luaevent_user_joinchannel, + luaevent_user_leftchannel, + + luaevent_user_message, // user-to-channel + luaevent_user_whisper, // user-to-user + luaevent_user_login, + luaevent_user_disconnect + + } t_luaevent_type; extern void lua_load(char const * scriptdir); extern void lua_unload(); extern int lua_handle_command(t_connection * c, char const * text); + extern void lua_handle_game(t_game * game, t_luaevent_type luaevent); // game events + extern void lua_handle_user(t_connection * c, t_game * game, t_luaevent_type luaevent); // + //extern void lua_handle_user(t_connection * c, t_connection * c_dst, const char * text, t_luaevent_type luaevent); + //extern void lua_handle_user(t_connection * c, t_channel * channel, const char * text, t_luaevent_type luaevent); + //extern void lua_handle_user(t_connection * c, t_channel * channel, t_luaevent_type luaevent); + //extern void lua_handle_user(t_connection * c, t_luaevent_type luaevent); } diff --git a/src/bnetd/luawrapper.cpp b/src/bnetd/luawrapper.cpp index 34e304d..1688214 100644 --- a/src/bnetd/luawrapper.cpp +++ b/src/bnetd/luawrapper.cpp @@ -1,138 +1,138 @@ -/* - * Copyright (C) Anton Burdinuk +/* + * Copyright (C) Anton Burdinuk */ - + #include "luawrapper.h" namespace lua { - invoke_type invoke; - m_invoke_type m_invoke; - release_type end; + invoke_type invoke; + m_invoke_type m_invoke; + release_type end; } -void lua::throw_lua_exception(lua_State* st,const std::string& addinfo) throw(std::exception) +void lua::throw_lua_exception(lua_State* st, const std::string& addinfo) throw(std::exception) { - size_t len=0; - - const char* p=lua_tolstring(st,-1,&len); - - std::string s(p,len); - - if(addinfo.length()) - { - s.append(" ",1); - s.append(addinfo); - } + size_t len = 0; - lua_pop(st,1); - - throw(exception(s)); + const char* p = lua_tolstring(st, -1, &len); + + std::string s(p, len); + + if (addinfo.length()) + { + s.append(" ", 1); + s.append(addinfo); + } + + lua_pop(st, 1); + + throw(exception(s)); } void lua::vm::initialize(void) throw(std::exception) { - done(); + done(); - st=lua_open(); + st = lua_open(); - if(!st) - throw(exception("can`t create lua virtual machine instance")); + if (!st) + throw(exception("can`t create lua virtual machine instance")); - luaL_openlibs(st); + luaL_openlibs(st); } void lua::vm::load_file(const char* file) throw(std::exception) { - if(!st) - throw(exception("lua virtual machine is not ready")); - - if(luaL_loadfile(st,file) || lua_pcall(st,0,0,0)) - throw_lua_exception(st); + if (!st) + throw(exception("lua virtual machine is not ready")); + + if (luaL_loadfile(st, file) || lua_pcall(st, 0, 0, 0)) + throw_lua_exception(st); } -void lua::vm::eval(const std::string& stmt,int offset) throw(std::exception) +void lua::vm::eval(const std::string& stmt, int offset) throw(std::exception) { - enum {max_chunk_name_len=64}; + enum { max_chunk_name_len = 64 }; - if(offset>stmt.length()) - offset=stmt.length(); + if (offset > stmt.length()) + offset = stmt.length(); - const char* p=stmt.c_str()+offset; + const char* p = stmt.c_str() + offset; - int n=stmt.length()-offset; + int n = stmt.length() - offset; - if(luaL_loadbuffer(st,p,n,n>max_chunk_name_len?(std::string(p,max_chunk_name_len)+"...").c_str():p) || lua_pcall(st,0,0,0)) - throw_lua_exception(st); + if (luaL_loadbuffer(st, p, n, n > max_chunk_name_len ? (std::string(p, max_chunk_name_len) + "...").c_str() : p) || lua_pcall(st, 0, 0, 0)) + throw_lua_exception(st); } void lua::bind::lookup(const char* name) throw() { - if(!refuse) - { - if(lua_type(st,cur_index)!=LUA_TNIL) + if (!refuse) { - lua_getfield(st,cur_index,name); - cur_index=size(); + if (lua_type(st, cur_index) != LUA_TNIL) + { + lua_getfield(st, cur_index, name); + cur_index = size(); + } } - } } void lua::bind::end(void) throw() { - if(!refuse && mutex) - { - int n=size()-st_top; - if(n>0) - lua_pop(st,n); + if (!refuse && mutex) + { + int n = size() - st_top; + if (n > 0) + lua_pop(st, n); - mutex=0; - - args_number=retvals_number=0; - cur_index=LUA_GLOBALSINDEX; - } + mutex = 0; + + args_number = retvals_number = 0; + cur_index = LUA_GLOBALSINDEX; + } } void lua::bind::invoke(void) throw(std::exception) { - int function_index=-(args_number+1); - - if(!refuse && lua_isfunction(st,function_index)) - { - int n=size(); - - if(lua_pcall(st,args_number,LUA_MULTRET,0)) - throw_lua_exception(st); + int function_index = -(args_number + 1); - retvals_number=size()+args_number+1-n; - } + if (!refuse && lua_isfunction(st, function_index)) + { + int n = size(); + + if (lua_pcall(st, args_number, LUA_MULTRET, 0)) + throw_lua_exception(st); + + retvals_number = size() + args_number + 1 - n; + } } void lua::bind::m_invoke(void) throw(std::exception) { - if(!refuse) - { - int function_index=-(args_number+1); - int this_index=function_index-1; - - if(lua_isfunction(st,function_index) && lua_istable(st,this_index)) + if (!refuse) { - lua_pushvalue(st,this_index); - args_number++; - lua_insert(st,-args_number); - + int function_index = -(args_number + 1); + int this_index = function_index - 1; - int n=size(); - - if(lua_pcall(st,args_number,LUA_MULTRET,0)) - throw_lua_exception(st); + if (lua_isfunction(st, function_index) && lua_istable(st, this_index)) + { + lua_pushvalue(st, this_index); + args_number++; + lua_insert(st, -args_number); - retvals_number=size()+args_number+1-n; + + int n = size(); + + if (lua_pcall(st, args_number, LUA_MULTRET, 0)) + throw_lua_exception(st); + + retvals_number = size() + args_number + 1 - n; + } } - } } diff --git a/src/bnetd/luawrapper.h b/src/bnetd/luawrapper.h index ae3cd8c..15f520d1 100644 --- a/src/bnetd/luawrapper.h +++ b/src/bnetd/luawrapper.h @@ -141,8 +141,8 @@ namespace lua void get(int& v, int index) throw() { v = lua_tointeger(st, index); } void get(double& v, int index) throw() { v = lua_tonumber(st, index); } void get(const char*& v, int index) throw() - { - size_t len = 0; + { + size_t len = 0; v = lua_tolstring(st, index, &len); } void get(std::string& v, int index) throw()