]> git.lizzy.rs Git - minetest.git/blob - src/script/lua_api/l_rollback.cpp
Remove setlocal and setupvalue from `debug` table whitelist
[minetest.git] / src / script / lua_api / l_rollback.cpp
1 /*
2 Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (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 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #include "lua_api/l_rollback.h"
21 #include "lua_api/l_internal.h"
22 #include "common/c_converter.h"
23 #include "server.h"
24 #include "rollback_interface.h"
25
26
27 void push_RollbackNode(lua_State *L, RollbackNode &node)
28 {
29         lua_createtable(L, 0, 3);
30         lua_pushstring(L, node.name.c_str());
31         lua_setfield(L, -2, "name");
32         lua_pushnumber(L, node.param1);
33         lua_setfield(L, -2, "param1");
34         lua_pushnumber(L, node.param2);
35         lua_setfield(L, -2, "param2");
36 }
37
38 // rollback_get_node_actions(pos, range, seconds, limit) -> {{actor, pos, time, oldnode, newnode}, ...}
39 int ModApiRollback::l_rollback_get_node_actions(lua_State *L)
40 {
41         NO_MAP_LOCK_REQUIRED;
42
43         v3s16 pos = read_v3s16(L, 1);
44         int range = luaL_checknumber(L, 2);
45         time_t seconds = (time_t) luaL_checknumber(L, 3);
46         int limit = luaL_checknumber(L, 4);
47         Server *server = getServer(L);
48         IRollbackManager *rollback = server->getRollbackManager();
49         if (rollback == NULL) {
50                 return 0;
51         }
52
53         std::list<RollbackAction> actions = rollback->getNodeActors(pos, range, seconds, limit);
54         std::list<RollbackAction>::iterator iter = actions.begin();
55
56         lua_createtable(L, actions.size(), 0);
57         for (unsigned int i = 1; iter != actions.end(); ++iter, ++i) {
58                 lua_createtable(L, 0, 5); // Make a table with enough space pre-allocated
59
60                 lua_pushstring(L, iter->actor.c_str());
61                 lua_setfield(L, -2, "actor");
62
63                 push_v3s16(L, iter->p);
64                 lua_setfield(L, -2, "pos");
65
66                 lua_pushnumber(L, iter->unix_time);
67                 lua_setfield(L, -2, "time");
68
69                 push_RollbackNode(L, iter->n_old);
70                 lua_setfield(L, -2, "oldnode");
71
72                 push_RollbackNode(L, iter->n_new);
73                 lua_setfield(L, -2, "newnode");
74
75                 lua_rawseti(L, -2, i); // Add action table to main table
76         }
77
78         return 1;
79 }
80
81 // rollback_revert_actions_by(actor, seconds) -> bool, log messages
82 int ModApiRollback::l_rollback_revert_actions_by(lua_State *L)
83 {
84         MAP_LOCK_REQUIRED;
85
86         std::string actor = luaL_checkstring(L, 1);
87         int seconds = luaL_checknumber(L, 2);
88         Server *server = getServer(L);
89         IRollbackManager *rollback = server->getRollbackManager();
90
91         // If rollback is disabled, tell it's not a success.
92         if (rollback == NULL) {
93                 lua_pushboolean(L, false);
94                 lua_newtable(L);
95                 return 2;
96         }
97         std::list<RollbackAction> actions = rollback->getRevertActions(actor, seconds);
98         std::list<std::string> log;
99         bool success = server->rollbackRevertActions(actions, &log);
100         // Push boolean result
101         lua_pushboolean(L, success);
102         lua_createtable(L, log.size(), 0);
103         unsigned long i = 0;
104         for(std::list<std::string>::const_iterator iter = log.begin();
105                         iter != log.end(); ++i, ++iter) {
106                 lua_pushnumber(L, i);
107                 lua_pushstring(L, iter->c_str());
108                 lua_settable(L, -3);
109         }
110         return 2;
111 }
112
113 void ModApiRollback::Initialize(lua_State *L, int top)
114 {
115         API_FCT(rollback_get_node_actions);
116         API_FCT(rollback_revert_actions_by);
117 }