1
0

Converted entire Core plugin including WebAdmin interface to new plugin method/system/thingy and sexyfied it.

Made some changes to WebAdmin to make the new plugins work
Old plugins still work like they're supposed to
Not all hooks have been programmed for the new plugins yet, this still needs to be done

git-svn-id: http://mc-server.googlecode.com/svn/trunk@182 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
faketruth
2012-01-27 23:47:32 +00:00
parent f17dd0f8dc
commit de29399987
36 changed files with 936 additions and 106 deletions

149
source/cWebPlugin_Lua.cpp Normal file
View File

@@ -0,0 +1,149 @@
#include "cMCLogger.h"
#include "cWebPlugin_Lua.h"
#include "cPlugin_NewLua.h"
#include <string>
#include "tolua++.h"
#include "cWebAdmin.h"
extern bool report_errors(lua_State* lua, int status);
extern std::vector<std::string> StringSplit(std::string str, std::string delim);
struct cWebPlugin_Lua::sWebPluginTab
{
std::string Title;
std::string SafeTitle;
int Reference;
};
cWebPlugin_Lua::cWebPlugin_Lua( cPlugin_NewLua* a_Plugin )
: cWebPlugin( a_Plugin->GetLuaState() )
, m_Plugin( a_Plugin )
{
}
cWebPlugin_Lua::~cWebPlugin_Lua()
{
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
delete *itr;
}
m_Tabs.clear();
}
bool cWebPlugin_Lua::AddTab( const char* a_Title, lua_State * a_LuaState, int a_FunctionReference )
{
if( a_LuaState != m_Plugin->GetLuaState() )
{
LOGERROR("Only allowed to add a tab to a WebPlugin of your own Plugin!");
return false;
}
sWebPluginTab* Tab = new sWebPluginTab();
Tab->Title = a_Title;
Tab->SafeTitle = a_Title; // TODO - Convert all non alphabet/digit letters to underscores
Tab->Reference = a_FunctionReference;
m_Tabs.push_back( Tab );
return true;
}
std::string cWebPlugin_Lua::HandleRequest( HTTPRequest* a_Request )
{
lua_State* LuaState = m_Plugin->GetLuaState();
std::string RetVal = "";
std::string TabName = GetTabNameForRequest(a_Request);
if( TabName.empty() )
return "";
sWebPluginTab* Tab = 0;
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
if( (*itr)->Title.compare( TabName ) == 0 ) // This is the one! Rawr
{
Tab = *itr;
break;
}
}
if( Tab )
{
LOGINFO("1. Stack size: %i", lua_gettop(LuaState) );
lua_rawgeti( LuaState, LUA_REGISTRYINDEX, Tab->Reference); // same as lua_getref()
LOGINFO("2. Stack size: %i", lua_gettop(LuaState) );
// Push HTTPRequest
tolua_pushusertype( LuaState, a_Request, "HTTPRequest" );
LOGINFO("Calling bound function! :D");
int s = lua_pcall( LuaState, 1, 1, 0);
if( report_errors( LuaState, s ) )
{
LOGINFO("error. Stack size: %i", lua_gettop(LuaState) );
return false;
}
if( !lua_isstring( LuaState, -1 ) )
{
LOGWARN("WARNING: WebPlugin tab '%s' did not return a string!", Tab->Title.c_str() );
lua_pop(LuaState, 1); // Pop return value
return "";
}
RetVal += tolua_tostring(LuaState, -1, 0);
lua_pop(LuaState, 1); // Pop return value
LOGINFO("ok. Stack size: %i", lua_gettop(LuaState) );
}
return RetVal;
}
void cWebPlugin_Lua::Initialize()
{
}
std::string cWebPlugin_Lua::GetTabNameForRequest( HTTPRequest* a_Request )
{
std::vector<std::string> Split = StringSplit( a_Request->Path, "/" );
if( Split.size() > 1 )
{
sWebPluginTab* Tab = 0;
if( Split.size() > 2 ) // If we got the tab name, show that page
{
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
if( (*itr)->SafeTitle.compare( Split[2] ) == 0 ) // This is the one! Rawr
{
Tab = *itr;
break;
}
}
}
else // Otherwise show the first tab
{
if( m_Tabs.size() > 0 )
Tab = *m_Tabs.begin();
}
if( Tab )
{
return Tab->Title;
}
}
return "";
}
std::list< std::string > cWebPlugin_Lua::GetTabNames()
{
std::list< std::string > NameList;
for( TabList::iterator itr = m_Tabs.begin(); itr != m_Tabs.end(); ++itr )
{
NameList.push_back( (*itr)->Title );
}
return NameList;
}