Improved Core's WebAmin interface a bit.
Can now kick players through WebAdmin Can now enable/disable whitelist through WebAdmin Tick speed is limited in a better way now, instead of always sleeping 50ms before each tick, it now add only sleeps additional time when the tick time was faster than 50ms. Server should run slightly faster because of this (and use more cpu%) git-svn-id: http://mc-server.googlecode.com/svn/trunk@167 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
ec7aacebaa
commit
738b1b3467
@ -572,15 +572,33 @@ end
|
||||
function PlayerListWeb:HandleRequest( Request )
|
||||
local World = cRoot:Get():GetWorld()
|
||||
local Content = ""
|
||||
Content = Content .. "<br>Connected Players: <b>" .. World:GetNumPlayers() .. "</b><br>"
|
||||
Content = Content .. "<ul>"
|
||||
|
||||
if( Request.Params:get("playerlist-kick") ~= "" ) then
|
||||
local KickPlayerName = Request.Params:get("playerlist-kick")
|
||||
local Player = World:GetPlayer( KickPlayerName )
|
||||
if( Player == nil ) then
|
||||
Content = Content .. "<p>Could not find player " .. KickPlayerName .. " !</p>"
|
||||
elseif( Player:GetName() == KickPlayerName ) then
|
||||
Player:GetClientHandle():Kick("You were kicked from the game!")
|
||||
Content = Content .. "<p>" .. KickPlayerName .. " has been kicked from the game!</p>"
|
||||
end
|
||||
end
|
||||
|
||||
Content = Content .. "<p>Connected Players: <b>" .. World:GetNumPlayers() .. "</b></p>"
|
||||
Content = Content .. "<table>"
|
||||
|
||||
|
||||
local PlayerList = World:GetAllPlayers()
|
||||
for i, Player in ipairs( PlayerList ) do
|
||||
Content = Content .. "<li>" .. Player:GetName()
|
||||
Content = Content .. "<tr>"
|
||||
Content = Content .. "<td style='width: 10px;'>" .. i .. ".</td>"
|
||||
Content = Content .. "<td>" .. Player:GetName() .. "</td>"
|
||||
Content = Content .. "<td><a href='?playerlist-kick=" .. Player:GetName() .. "'>Kick</a></td>"
|
||||
Content = Content .. "</tr>"
|
||||
end
|
||||
|
||||
Content = Content .. "</ul>"
|
||||
Content = Content .. "</table>"
|
||||
Content = Content .. "<br>"
|
||||
return Content
|
||||
end
|
||||
|
||||
@ -607,12 +625,12 @@ function ReloadWeb:HandleRequest( Request )
|
||||
|
||||
if( Request.Params:get("reload") ~= "" ) then
|
||||
Content = Content .. "<head><meta http-equiv=\"refresh\" content=\"1;././\"></head>"
|
||||
Content = Content .. "<br>Reloading plugins...<br>"
|
||||
Content = Content .. "<p>Reloading plugins...</p>"
|
||||
cRoot:Get():GetPluginManager():ReloadPlugins()
|
||||
else
|
||||
Content = Content .. "<br>Click the reload button to reload all plugins!<br>"
|
||||
Content = Content .. "<form method=GET>"
|
||||
Content = Content .. "<input type=\"submit\" name=\"reload\" value=\"Reload!\">"
|
||||
Content = Content .. "<p>Click the reload button to reload all plugins!<br>"
|
||||
Content = Content .. "<input type=\"submit\" name=\"reload\" value=\"Reload!\"></p>"
|
||||
Content = Content .. "</form>"
|
||||
end
|
||||
return Content
|
||||
@ -661,19 +679,43 @@ function WhiteListWeb:HandleRequest( Request )
|
||||
WhiteListIni:Erase() -- Empty entire loaded ini first, otherwise weird shit goes down
|
||||
WhiteListIni:ReadFile()
|
||||
UpdateMessage = "Loaded from disk"
|
||||
elseif( Request.Params:get("whitelist-setenable") ~= "" ) then
|
||||
local Enabled = Request.Params:get("whitelist-setenable");
|
||||
local CreateNewValue = false;
|
||||
if( WhiteListIni:FindValue( WhiteListIni:FindKey("WhiteListSettings"), "WhiteListOn" ) == cIniFile.noID ) then -- Find out whether the value is in the ini
|
||||
CreateNewValue = true
|
||||
end
|
||||
|
||||
if( Enabled == "1" ) then
|
||||
WhiteListIni:SetValueB("WhiteListSettings", "WhiteListOn", true, CreateNewValue )
|
||||
else
|
||||
WhiteListIni:SetValueB("WhiteListSettings", "WhiteListOn", false, CreateNewValue )
|
||||
end
|
||||
WhiteListIni:WriteFile()
|
||||
end
|
||||
|
||||
|
||||
local Content = ""
|
||||
|
||||
local WhiteListEnabled = WhiteListIni:GetValueB("WhiteListSettings", "WhiteListOn", false)
|
||||
if( WhiteListEnabled == false ) then
|
||||
Content = Content .. "<p>Whitelist is currently disabled! Click <a href='?whitelist-setenable=1'>here</a> to enable.</p>"
|
||||
end
|
||||
|
||||
|
||||
Content = Content .. "<h4>Whitelisted players</h4>"
|
||||
Content = Content .. "<table>"
|
||||
local KeyNum = WhiteListIni:FindKey("WhiteList")
|
||||
local NumValues = WhiteListIni:GetNumValues(KeyNum)
|
||||
for Num = 0, NumValues-1 do
|
||||
if( WhiteListIni:GetValue(KeyNum, Num, "0") == "1" ) then
|
||||
local PlayerName = WhiteListIni:GetValueName(KeyNum, Num )
|
||||
Content = Content .. "<tr><td>" .. PlayerName .. "</td><td>" .. HTMLDeleteButton( PlayerName ) .. "</td></tr>"
|
||||
if( NumValues > 0 ) then
|
||||
for Num = 0, NumValues-1 do
|
||||
if( WhiteListIni:GetValue(KeyNum, Num, "0") == "1" ) then
|
||||
local PlayerName = WhiteListIni:GetValueName(KeyNum, Num )
|
||||
Content = Content .. "<tr><td>" .. PlayerName .. "</td><td>" .. HTMLDeleteButton( PlayerName ) .. "</td></tr>"
|
||||
end
|
||||
end
|
||||
else
|
||||
Content = Content .. "<tr><td>None</td></tr>"
|
||||
end
|
||||
Content = Content .. "</table>"
|
||||
Content = Content .. "<br><h4>Add player to whitelist</h4>"
|
||||
@ -684,6 +726,11 @@ function WhiteListWeb:HandleRequest( Request )
|
||||
Content = Content .. "<input type=\"submit\" name=\"whitelist-reload\" value=\"Reload from disk\">"
|
||||
Content = Content .. "</form>"
|
||||
Content = Content .. "<br>"..UpdateMessage
|
||||
|
||||
if( WhiteListEnabled == true ) then
|
||||
Content = Content .. "<br><br><p>Whitelist is currently enabled, click <a href='?whitelist-setenable=0'>here</a> to disable.</p>"
|
||||
end
|
||||
|
||||
return Content
|
||||
end
|
||||
|
||||
|
@ -45,7 +45,7 @@ private:
|
||||
std::string CheckCase( std::string s) const;
|
||||
|
||||
public:
|
||||
enum errors{ noID = -1};
|
||||
enum errors{ noID = -1}; //tolua_export
|
||||
cIniFile( const std::string iniPath = ""); //tolua_export
|
||||
virtual ~cIniFile() {}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Lua binding: AllToLua
|
||||
** Generated automatically by tolua++-1.0.92 on 01/01/12 19:41:18.
|
||||
** Generated automatically by tolua++-1.0.92 on 01/22/12 20:44:42.
|
||||
*/
|
||||
|
||||
#ifndef __cplusplus
|
||||
@ -12820,6 +12820,40 @@ static int tolua_AllToLua_Vector3d_Cross00(lua_State* tolua_S)
|
||||
}
|
||||
#endif //#ifndef TOLUA_DISABLE
|
||||
|
||||
/* method: Equals of class Vector3d */
|
||||
#ifndef TOLUA_DISABLE_tolua_AllToLua_Vector3d_Equals00
|
||||
static int tolua_AllToLua_Vector3d_Equals00(lua_State* tolua_S)
|
||||
{
|
||||
#ifndef TOLUA_RELEASE
|
||||
tolua_Error tolua_err;
|
||||
if (
|
||||
!tolua_isusertype(tolua_S,1,"const Vector3d",0,&tolua_err) ||
|
||||
(tolua_isvaluenil(tolua_S,2,&tolua_err) || !tolua_isusertype(tolua_S,2,"const Vector3d",0,&tolua_err)) ||
|
||||
!tolua_isnoobj(tolua_S,3,&tolua_err)
|
||||
)
|
||||
goto tolua_lerror;
|
||||
else
|
||||
#endif
|
||||
{
|
||||
const Vector3d* self = (const Vector3d*) tolua_tousertype(tolua_S,1,0);
|
||||
const Vector3d* v = ((const Vector3d*) tolua_tousertype(tolua_S,2,0));
|
||||
#ifndef TOLUA_RELEASE
|
||||
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'Equals'", NULL);
|
||||
#endif
|
||||
{
|
||||
bool tolua_ret = (bool) self->Equals(*v);
|
||||
tolua_pushboolean(tolua_S,(bool)tolua_ret);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
#ifndef TOLUA_RELEASE
|
||||
tolua_lerror:
|
||||
tolua_error(tolua_S,"#ferror in function 'Equals'.",&tolua_err);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
#endif //#ifndef TOLUA_DISABLE
|
||||
|
||||
/* method: operator+ of class Vector3d */
|
||||
#ifndef TOLUA_DISABLE_tolua_AllToLua_Vector3d__add00
|
||||
static int tolua_AllToLua_Vector3d__add00(lua_State* tolua_S)
|
||||
@ -14628,6 +14662,36 @@ static int tolua_set_cPacket_Login_m_MapSeed(lua_State* tolua_S)
|
||||
}
|
||||
#endif //#ifndef TOLUA_DISABLE
|
||||
|
||||
/* get function: m_LevelType of class cPacket_Login */
|
||||
#ifndef TOLUA_DISABLE_tolua_get_cPacket_Login_m_LevelType
|
||||
static int tolua_get_cPacket_Login_m_LevelType(lua_State* tolua_S)
|
||||
{
|
||||
cPacket_Login* self = (cPacket_Login*) tolua_tousertype(tolua_S,1,0);
|
||||
#ifndef TOLUA_RELEASE
|
||||
if (!self) tolua_error(tolua_S,"invalid 'self' in accessing variable 'm_LevelType'",NULL);
|
||||
#endif
|
||||
tolua_pushcppstring(tolua_S,(const char*)self->m_LevelType);
|
||||
return 1;
|
||||
}
|
||||
#endif //#ifndef TOLUA_DISABLE
|
||||
|
||||
/* set function: m_LevelType of class cPacket_Login */
|
||||
#ifndef TOLUA_DISABLE_tolua_set_cPacket_Login_m_LevelType
|
||||
static int tolua_set_cPacket_Login_m_LevelType(lua_State* tolua_S)
|
||||
{
|
||||
cPacket_Login* self = (cPacket_Login*) tolua_tousertype(tolua_S,1,0);
|
||||
#ifndef TOLUA_RELEASE
|
||||
tolua_Error tolua_err;
|
||||
if (!self) tolua_error(tolua_S,"invalid 'self' in accessing variable 'm_LevelType'",NULL);
|
||||
if (!tolua_iscppstring(tolua_S,2,0,&tolua_err))
|
||||
tolua_error(tolua_S,"#vinvalid type in variable assignment.",&tolua_err);
|
||||
#endif
|
||||
self->m_LevelType = ((std::string) tolua_tocppstring(tolua_S,2,0))
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
#endif //#ifndef TOLUA_DISABLE
|
||||
|
||||
/* get function: m_ServerMode of class cPacket_Login */
|
||||
#ifndef TOLUA_DISABLE_tolua_get_cPacket_Login_m_ServerMode
|
||||
static int tolua_get_cPacket_Login_m_ServerMode(lua_State* tolua_S)
|
||||
@ -15407,6 +15471,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
|
||||
tolua_cclass(tolua_S,"cIniFile","cIniFile","",NULL);
|
||||
#endif
|
||||
tolua_beginmodule(tolua_S,"cIniFile");
|
||||
tolua_constant(tolua_S,"noID",cIniFile::noID);
|
||||
tolua_function(tolua_S,"new",tolua_AllToLua_cIniFile_new00);
|
||||
tolua_function(tolua_S,"new_local",tolua_AllToLua_cIniFile_new00_local);
|
||||
tolua_function(tolua_S,".call",tolua_AllToLua_cIniFile_new00_local);
|
||||
@ -16375,6 +16440,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
|
||||
tolua_function(tolua_S,"SqrLength",tolua_AllToLua_Vector3d_SqrLength00);
|
||||
tolua_function(tolua_S,"Dot",tolua_AllToLua_Vector3d_Dot00);
|
||||
tolua_function(tolua_S,"Cross",tolua_AllToLua_Vector3d_Cross00);
|
||||
tolua_function(tolua_S,"Equals",tolua_AllToLua_Vector3d_Equals00);
|
||||
tolua_function(tolua_S,".add",tolua_AllToLua_Vector3d__add00);
|
||||
tolua_function(tolua_S,".add",tolua_AllToLua_Vector3d__add01);
|
||||
tolua_function(tolua_S,".sub",tolua_AllToLua_Vector3d__sub00);
|
||||
@ -16474,6 +16540,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
|
||||
tolua_variable(tolua_S,"m_ProtocolVersion",tolua_get_cPacket_Login_m_ProtocolVersion,tolua_set_cPacket_Login_m_ProtocolVersion);
|
||||
tolua_variable(tolua_S,"m_Username",tolua_get_cPacket_Login_m_Username,tolua_set_cPacket_Login_m_Username);
|
||||
tolua_variable(tolua_S,"m_MapSeed",tolua_get_cPacket_Login_m_MapSeed,tolua_set_cPacket_Login_m_MapSeed);
|
||||
tolua_variable(tolua_S,"m_LevelType",tolua_get_cPacket_Login_m_LevelType,tolua_set_cPacket_Login_m_LevelType);
|
||||
tolua_variable(tolua_S,"m_ServerMode",tolua_get_cPacket_Login_m_ServerMode,tolua_set_cPacket_Login_m_ServerMode);
|
||||
tolua_variable(tolua_S,"m_Dimension",tolua_get_cPacket_Login_m_Dimension,tolua_set_cPacket_Login_m_Dimension);
|
||||
tolua_variable(tolua_S,"m_Difficulty",tolua_get_cPacket_Login_m_Difficulty,tolua_set_cPacket_Login_m_Difficulty);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Lua binding: AllToLua
|
||||
** Generated automatically by tolua++-1.0.92 on 01/01/12 19:41:18.
|
||||
** Generated automatically by tolua++-1.0.92 on 01/22/12 20:44:42.
|
||||
*/
|
||||
|
||||
/* Exported function */
|
||||
|
@ -278,11 +278,9 @@ void cServer::StartListenClient()
|
||||
|
||||
bool cServer::Tick(float a_Dt)
|
||||
{
|
||||
//LOG("1. Tick");
|
||||
//LOG("1. Tick %0.2f", a_Dt);
|
||||
if( a_Dt > 100.f ) a_Dt = 100.f; // Don't go over 1/10 second
|
||||
|
||||
cSleep::MilliSleep( 50 ); // Don't tick too much
|
||||
|
||||
m_Millisecondsf += a_Dt;
|
||||
if( m_Millisecondsf > 1.f )
|
||||
{
|
||||
@ -331,6 +329,7 @@ void ServerTickThread( void * a_Param )
|
||||
|
||||
cTimer Timer;
|
||||
|
||||
long long msPerTick = 50; // TODO - Put this in server config file
|
||||
long long LastTime = Timer.GetNowTime();
|
||||
|
||||
bool bKeepGoing = true;
|
||||
@ -339,6 +338,13 @@ void ServerTickThread( void * a_Param )
|
||||
long long NowTime = Timer.GetNowTime();
|
||||
float DeltaTime = (float)(NowTime-LastTime);
|
||||
bKeepGoing = CServerObj->Tick( DeltaTime );
|
||||
long long TickTime = Timer.GetNowTime() - NowTime;
|
||||
|
||||
if( TickTime < msPerTick ) // Stretch tick time until it's at least msPerTick
|
||||
{
|
||||
cSleep::MilliSleep( (unsigned int)( msPerTick - TickTime ) );
|
||||
}
|
||||
|
||||
LastTime = NowTime;
|
||||
}
|
||||
|
||||
|
@ -99,28 +99,7 @@ void cWebAdmin::Request_Handler(webserver::http_request* r)
|
||||
std::string Menu;
|
||||
std::string Content;
|
||||
std::string Template = WebAdmin->GetTemplate();
|
||||
|
||||
Content += "<h3>Current Game</h3>";
|
||||
Content += "<h4>Server Name:</h4>";
|
||||
Content += "<p>" + std::string( cRoot::Get()->GetServer()->GetServerID() ) + "</p>";
|
||||
|
||||
Content += "<h4>Plugins:</h4><p>";
|
||||
cPluginManager* PM = cRoot::Get()->GetPluginManager();
|
||||
const cPluginManager::PluginList & List = PM->GetAllPlugins();
|
||||
for( cPluginManager::PluginList::const_iterator itr = List.begin(); itr != List.end(); ++itr )
|
||||
{
|
||||
Content += std::string( (*itr)->GetName() ) + "<br>";
|
||||
}
|
||||
Content += "</p>";
|
||||
Content += "<h4>Players:</h4><p>";
|
||||
|
||||
cWorld* World = cRoot::Get()->GetWorld(); // TODO - Create a list of worlds and players
|
||||
cWorld::PlayerList PlayerList = World->GetAllPlayers();
|
||||
for( cWorld::PlayerList::iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr )
|
||||
{
|
||||
Content += std::string( (*itr)->GetName() ) + "<br>";
|
||||
}
|
||||
Content += "</p>";
|
||||
std::string FoundPlugin;
|
||||
|
||||
for( PluginList::iterator itr = WebAdmin->m_Plugins.begin(); itr != WebAdmin->m_Plugins.end(); ++itr )
|
||||
{
|
||||
@ -133,9 +112,11 @@ void cWebAdmin::Request_Handler(webserver::http_request* r)
|
||||
Request.Params = new cStringMap(r->params_);
|
||||
Request.Path = r->path_;
|
||||
|
||||
|
||||
|
||||
if( Split.size() > 1 )
|
||||
{
|
||||
std::string FoundPlugin = "";
|
||||
|
||||
for( PluginList::iterator itr = WebAdmin->m_Plugins.begin(); itr != WebAdmin->m_Plugins.end(); ++itr )
|
||||
{
|
||||
if( (*itr)->GetName() == Split[1] )
|
||||
@ -145,15 +126,41 @@ void cWebAdmin::Request_Handler(webserver::http_request* r)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( FoundPlugin.compare("") != 0 ) // Add some header
|
||||
{
|
||||
Content = "<h3>" + FoundPlugin + "</h3>\n<p>" + Content + "</p>";
|
||||
}
|
||||
}
|
||||
|
||||
delete Request.Params;
|
||||
|
||||
if( FoundPlugin.empty() ) // Default page
|
||||
{
|
||||
Content.clear();
|
||||
FoundPlugin = "Current Game";
|
||||
Content += "<h4>Server Name:</h4>";
|
||||
Content += "<p>" + std::string( cRoot::Get()->GetServer()->GetServerID() ) + "</p>";
|
||||
|
||||
Content += "<h4>Plugins:</h4><ul>";
|
||||
cPluginManager* PM = cRoot::Get()->GetPluginManager();
|
||||
if( PM )
|
||||
{
|
||||
const cPluginManager::PluginList & List = PM->GetAllPlugins();
|
||||
for( cPluginManager::PluginList::const_iterator itr = List.begin(); itr != List.end(); ++itr )
|
||||
{
|
||||
Content += std::string("<li>") + std::string( (*itr)->GetName() ) + "</li>";
|
||||
}
|
||||
}
|
||||
Content += "</ul>";
|
||||
Content += "<h4>Players:</h4><ul>";
|
||||
|
||||
cWorld* World = cRoot::Get()->GetWorld(); // TODO - Create a list of worlds and players
|
||||
cWorld::PlayerList PlayerList = World->GetAllPlayers();
|
||||
for( cWorld::PlayerList::iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr )
|
||||
{
|
||||
Content += std::string("<li>") + std::string( (*itr)->GetName() ) + "</li>";
|
||||
}
|
||||
Content += "</ul><br>";
|
||||
}
|
||||
|
||||
|
||||
|
||||
if( Split.size() > 1 )
|
||||
{
|
||||
Content += "\n<p><a href='";
|
||||
@ -192,6 +199,7 @@ void cWebAdmin::Request_Handler(webserver::http_request* r)
|
||||
|
||||
ReplaceString( Template, std::string("{USERNAME}"), r->username_ );
|
||||
ReplaceString( Template, std::string("{MENU}"), Menu );
|
||||
ReplaceString( Template, std::string("{PLUGIN_NAME}"), FoundPlugin );
|
||||
ReplaceString( Template, std::string("{CONTENT}"), Content );
|
||||
ReplaceString( Template, std::string("{TITLE}"), "MCServer" );
|
||||
|
||||
|
@ -252,6 +252,17 @@
|
||||
padding: 0 0 0 10px;
|
||||
margin: 20px 0 10px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
padding: 0 0 0 10px;
|
||||
margin: 20px 0 10px;
|
||||
}
|
||||
|
||||
#main ul {
|
||||
padding: 0 0 0 10px;
|
||||
list-style-type: circle;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
#main table {
|
||||
border-top: 1px solid #ddd;
|
||||
@ -340,8 +351,9 @@
|
||||
<h2>Welcome {USERNAME}</h2>
|
||||
|
||||
<div id="main">
|
||||
|
||||
<p>{CONTENT}</p>
|
||||
<h3>{PLUGIN_NAME}</h3>
|
||||
|
||||
{CONTENT}
|
||||
|
||||
</div>
|
||||
<!-- // #main -->
|
||||
|
Loading…
Reference in New Issue
Block a user