/*
* PtokaX - hub server for Direct Connect peer to peer network.
* Copyright (C) 2004-2022 Petr Kozelka, PPK at PtokaX dot org
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3
* as published by the Free Software Foundation.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//---------------------------------------------------------------------------
#include "stdinc.h"
//---------------------------------------------------------------------------
#include "LuaInc.h"
//---------------------------------------------------------------------------
#include "LuaIP2CountryLib.h"
//---------------------------------------------------------------------------
#include "LuaScriptManager.h"
#include "User.h"
#include "utility.h"
//---------------------------------------------------------------------------
#ifdef _WIN32
#pragma hdrstop
#endif
//---------------------------------------------------------------------------
#include "IP2Country.h"
#include "LuaScript.h"
#include "GlobalDataQueue.h"
//---------------------------------------------------------------------------
static int GetCountryCode(lua_State * pLua)
{
GlobalDataQueue::m_Ptr->PrometheusLuaInc(__func__);
if (lua_gettop(pLua) != 1)
{
luaL_error(pLua, "bad argument count to 'GetCountryCode' (1 expected, got %d)", lua_gettop(pLua));
lua_settop(pLua, 0);
lua_pushnil(pLua);
return 1;
}
if (lua_type(pLua, 1) != LUA_TSTRING)
{
luaL_error(pLua, "bad argument to 'GetCountryCode' (string expected, got %s)", lua_typename(pLua, lua_type(pLua, 1)));
lua_settop(pLua, 0);
lua_pushnil(pLua);
return 1;
}
size_t szLen;
const char * sIP = lua_tolstring(pLua, 1, &szLen);
Hash128 ui128Hash;
if (szLen == 0 || HashIP(sIP, ui128Hash) == false)
{
lua_settop(pLua, 0);
lua_pushnil(pLua);
return 1;
}
const char * sCountry = IpP2Country::m_Ptr->Find(ui128Hash, false);
lua_settop(pLua, 0);
lua_pushlstring(pLua, sCountry, 2);
return 1;
}
//------------------------------------------------------------------------------
static int GetCountryName(lua_State * pLua)
{
GlobalDataQueue::m_Ptr->PrometheusLuaInc(__func__);
if (lua_gettop(pLua) != 1)
{
luaL_error(pLua, "bad argument count to 'GetCountryName' (1 expected, got %d)", lua_gettop(pLua));
lua_settop(pLua, 0);
lua_pushnil(pLua);
return 1;
}
const char * sCountry;
if (lua_type(pLua, 1) == LUA_TSTRING)
{
size_t szLen;
const char * sIP = lua_tolstring(pLua, 1, &szLen);
Hash128 ui128Hash;
// alex82 ... ���������� ������ �� ����
if (szLen == 2)
{
lua_settop(pLua, 0);
lua_pushstring(pLua, IpP2Country::m_Ptr->GetCountryName(sIP));
return 1;
}
else if (szLen == 0 || HashIP(sIP, ui128Hash) == false)
{
lua_settop(pLua, 0);
lua_pushnil(pLua);
return 1;
}
sCountry = IpP2Country::m_Ptr->Find(ui128Hash, true);
}
else if (lua_type(pLua, 1) == LUA_TTABLE)
{
User * u = ScriptGetUser(pLua, 1, "GetCountryName");
if (u == NULL)
{
lua_settop(pLua, 0);
lua_pushnil(pLua);
return 1;
}
sCountry = IpP2Country::m_Ptr->GetCountry(u->m_ui8Country, true);
}
else
{
luaL_error(pLua, "bad argument to 'GetCountryName' (string or table expected, got %s)", lua_typename(pLua, lua_type(pLua, 1)));
lua_settop(pLua, 0);
lua_pushnil(pLua);
return 1;
}
lua_settop(pLua, 0);
lua_pushstring(pLua, sCountry);
return 1;
}
//------------------------------------------------------------------------------
static int Reload(lua_State * pLua)
{
GlobalDataQueue::m_Ptr->PrometheusLuaInc(__func__);
if (lua_gettop(pLua) != 0)
{
luaL_error(pLua, "bad argument count to 'IP2Country.Reload' (0 expected, got %d)", lua_gettop(pLua));
lua_settop(pLua, 0);
return 0;
}
IpP2Country::m_Ptr->Reload();
return 0;
}
//------------------------------------------------------------------------------
static const luaL_Reg Ip2CountryRegs[] =
{
{ "GetCountryCode", GetCountryCode },
{ "GetCountryName", GetCountryName },
{ "Reload", Reload },
{ NULL, NULL }
};
//---------------------------------------------------------------------------
#if LUA_VERSION_NUM > 501
int RegIP2Country(lua_State * pLua)
{
luaL_newlib(pLua, Ip2CountryRegs);
return 1;
#else
void RegIP2Country(lua_State * pLua)
{
luaL_register(pLua, "IP2Country", Ip2CountryRegs);
#endif
}
//---------------------------------------------------------------------------
↑ V1042 This file is marked with copyleft license, which requires you to open the derived source code.