incomplete sban import logic (mod still unusable)

master
y 2019-06-13 06:28:21 +01:00
parent afefd92991
commit 5c449e099d
1 changed files with 136 additions and 6 deletions

142
data.lua
View File

@ -55,6 +55,7 @@ local function get_full_table(query)
row[names[col_id]] = values[col_id]
end
table.insert(row)
return 0
end
local status = db:exec(query, populate_table)
@ -78,17 +79,146 @@ end -- init_db()
init_db()
function verbana.data.import_from_sban(filename)
-- this method isn't as complicated as it looks; 2/3 of it is repetative error handling
local sban_db, _, errormsg = sql.open(filename, sql.OPEN_READONLY)
if not sban_db then
return false, ('Error opening %s: %s'):format(filename, errormsg)
end
-- IMPORT INTO VERBANA --
local insert_player_sql = 'INSERT OR IGNORE INTO player (name) VALUES (?)'
local insert_player_statement = db:prepare()
for name in sban_db:urows('SELECT DISTINCT name FROM playerdata') do
local rv = insert_player_statement:bind_values(name)
if rv ~= sql.OK then
verbana.log('error', 'error binding %q in %q: %s', name, insert_player_sql, rv)
return false, 'Error importing players (see server log)'
end
local rv = insert_player_statement:step()
if rv ~= sql.DONE then
verbana.log('error', 'error stepping %q: %s', insert_player_sql, rv)
return false, 'Error importing players (see server log)'
end
insert_player_statement:reset()
end
local rv = insert_player_statement:finalize()
if rv ~= sql.OK then
verbana.log('error', 'error finalizing %q: %s', insert_player_sql, rv)
return false, 'Error importing player names (see server log)'
end
-- GET VERBANA PLAYER IDS --
local player_id_by_name = {}
for id, name in db:urows('SELECT id, name FROM player') do
player_id_by_name[name] = id
end
-- associations --
local insert_assoc_sql = 'INSERT OR IGNORE INTO assoc (player_id, ip, asn) VALUES (?, ?, ?)'
local insert_assoc_statement = db:prepare(insert_assoc_sql)
for name, ipstr in sban_db:urows('SELECT DISTINCT name, ip FROM playerdata') do
local player_id = player_id_by_name[name]
if not verbana.ip.is_valid_ip(ipstr) then
verbana.log('error', '%s is not a valid IPv4 address', ipstr)
return false, 'error processing IPs in SBAN (see server log)'
end
local ipint = verbana.ip.ipstr_to_number(ipstr)
local asn = verbana.asn.lookup(ipint)
local player_data = get_full_table([[
SELECT id, name, ip, created, last_login FROM playerdata
]])
local bans_data = get_full_table([[
SELECT id, name, source, created, reason, expires, u_source, u_reason, u_date, active, last_pos FROM bans
]])
local rv = insert_assoc_statement:bind_values(player_id, ipint, asn)
if rv ~= sql.OK then
verbana.log('error', 'error binding %q %q %q in %q: %s', player_id, ipint, asn, insert_assoc_sql, rv)
return false, 'Error importing associations (see server log)'
end
local rv = insert_assoc_statement:step()
if rv ~= sql.DONE then
verbana.log('error', 'error stepping %q: %s', insert_assoc_sql, rv)
return false, 'Error importing associations (see server log)'
end
insert_assoc_statement:reset()
end
local rv = insert_assoc_statement:finalize()
if rv ~= sql.OK then
verbana.log('error', 'error finalizing %q: %s', insert_assoc_sql, rv)
return false, 'Error IP importing associations (see server log)'
end
-- player action --
local insert_player_action_sql = [[
INSERT OR IGNORE
INTO player_action_log (executor_id, player_id, status_id, timestamp, reason, expires)
VALUES (?, ?, ?, ?, ?, ?)
]]
local insert_player_action_statement = db:prepare(insert_player_action_sql)
local select_bans_sql = [[
SELECT name, source, created, reason, expires, u_source, u_reason, u_date
FROM bans
ORDER BY name, created
]]
local default_player_status_id = verbana.data.player_status_id.default
local banned_player_status_id = verbana.data.player_status_id.banned
local tempbanned_player_status_id = verbana.data.player_status_id.tempbanned
for name, source, created, reason, expires, u_source, u_reason, u_date in sban_db:urows(select_bans_sql) do
local player_id = player_id_by_name[name]
local source_id = player_id_by_name[source]
local unban_source_id
if u_source and u_source == 'sban' then
unban_source_id = source_id
else
unban_source_id = player_id_by_name[u_source]
end
local status_id
if expires then
status_id = tempbanned_player_status_id
else
status_id = banned_player_status_id
end
local rv = insert_player_action_statement:bind_values(
source_id, player_id, status_id, created, reason, expires
)
if rv ~= sql.OK then
verbana.log('error', 'bans: error binding %q %q %q %q %q %q in %q: %s',
source_id, player_id, status_id, created, reason, expires, insert_player_action_sql, rv
)
return false, 'Error importing bans (see server log)'
end
local rv = insert_player_action_statement:step()
if rv ~= sql.DONE then
verbana.log('error', 'bans: error stepping %q: %s', insert_player_action_sql, rv)
return false, 'Error importing bans (see server log)'
end
insert_player_action_statement:reset()
if unban_source_id then
local status_id = default_player_status_id
local rv = insert_player_action_statement:bind_values(
unban_source_id, player_id, status_id, u_date, u_reason, nil
)
if rv ~= sql.OK then
verbana.log('error', 'unbans: error binding %q %q %q %q %q %q in %q: %s',
unban_source_id, player_id, status_id, u_date, u_reason, nil, insert_player_action_sql, rv
)
return false, 'Error importing bans (see server log)'
end
local rv = insert_player_action_statement:step()
if rv ~= sql.DONE then
verbana.log('error', 'unbans: error stepping %q: %s', insert_player_action_sql, rv)
return false, 'Error importing bans (see server log)'
end
insert_player_action_statement:reset()
end
end
local rv = insert_player_action_statement.finalize()
if rv ~= sql.OK then
verbana.log('error', 'error finalizing %q: %s', insert_player_action_sql, rv)
return false, 'Error importing bans (see server log)'
end
-- set the current player actions
-- local player_data = get_full_table([[
-- SELECT id, name, ip, created, last_login FROM playerdata
-- ]])
-- local bans_data = get_full_table([[
-- SELECT id, name, source, created, reason, expires, u_source, u_reason, u_date, active, last_pos FROM bans
-- ]])
sban_db.close()
end