Skip to content

Commit

Permalink
Fixed DPP builds
Browse files Browse the repository at this point in the history
Moved discord to CResource

Easier to manager, multiple bots can be hosted in one server.

Added DiscordGuild type for lua
  • Loading branch information
TracerDS committed Aug 24, 2024
1 parent 972789c commit 1e3c644
Show file tree
Hide file tree
Showing 29 changed files with 368 additions and 152 deletions.
71 changes: 67 additions & 4 deletions Server/mods/deathmatch/logic/CDiscord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,85 @@

#include "StdInc.h"
#include "CDiscord.h"
#include <CIdArray.h>

IDiscord::IDiscord() noexcept : dpp::cluster("")
{
on_ready.attach([this](const dpp::ready_t& event) {
if (m_hasStarted)
return;

m_hasStarted = true;
});
on(DiscordEvent::on_ready, []() {});
}

CDiscord::CDiscord() noexcept
IDiscord::~IDiscord() noexcept
{
this->stop();
}

bool IDiscord::HasStarted() const noexcept
{
return m_hasStarted;
}

void CDiscord::login(const std::string_view& string) noexcept
void IDiscord::login(const std::string_view& string) noexcept
{
this->token = string;
}

void CDiscord::start() noexcept
void IDiscord::start()
{
dpp::cluster::start(dpp::st_return);
}

void IDiscord::stop()
{
if (!m_hasStarted)
return;
m_hasStarted = false;
this->shutdown();
}

template <typename F>
void IDiscord::on(DiscordEvent event, F&& func)
{

}


IDiscordGuild::IDiscordGuild()
{
m_scriptID = CIdArray::PopUniqueId(this, EIdClass::DISCORD_GUILD);
m_scriptID = INVALID_ARRAY_ID;
}

IDiscordGuild::~IDiscordGuild()
{
CIdArray::PushUniqueId(this, EIdClass::DISCORD_GUILD, m_scriptID);
}

std::uint32_t IDiscordGuild::GetScriptID() const noexcept
{
return m_scriptID;
}

IDiscordGuild* IDiscordGuild::GetFromSciptID(std::uint32_t id)
{
return (IDiscordGuild*)CIdArray::FindEntry(id, EIdClass::DISCORD_GUILD);
}

CDiscord::CDiscord() noexcept
{
}

CDiscordGuild* CDiscord::GetGuild(dpp::snowflake id) const noexcept
{
return dynamic_cast<CDiscordGuild*>(dpp::find_guild(id));
}

CDiscordGuild* CDiscordGuild::GetFromSciptID(std::uint32_t id)
{
dynamic_cast<dpp::cluster*>(this)->start(dpp::st_return);
return dynamic_cast<CDiscordGuild*>(IDiscordGuild::GetFromSciptID(id));
}
52 changes: 45 additions & 7 deletions Server/mods/deathmatch/logic/CDiscord.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,25 @@

#pragma once

#include "dpp/dpp.h"
#include <dpp/event_router.h>
#ifdef _WIN32
#include <dpp/win32_safe_warnings.h>
#endif
#include <DPP/dpp.h>

// Interfaces for modules

class IDiscordGuild : public dpp::guild
{
public:
IDiscordGuild();
~IDiscordGuild();

std::uint32_t GetScriptID() const noexcept;
static IDiscordGuild* GetFromSciptID(std::uint32_t id);

protected:
std::uint32_t m_scriptID;
};

class IDiscord : public dpp::cluster
{
Expand Down Expand Up @@ -105,18 +122,39 @@ class IDiscord : public dpp::cluster

public:
IDiscord() noexcept;
~IDiscord() noexcept;

bool HasStarted() const noexcept;

void login(const std::string_view& token) noexcept;
void start();
void start(bool) = delete;
void stop();

virtual void login(const std::string_view& token) noexcept = 0;
virtual void start() noexcept = 0;
void start(bool) = delete;
template <typename F>
void on(DiscordEvent event, F&& func);

virtual IDiscordGuild* GetGuild(dpp::snowflake id) const noexcept = 0;

protected:
std::atomic<bool> m_hasStarted;
std::unordered_map<DiscordEvent, std::vector<bool>> m_eventHandlers;
};

// Usable classes

class CDiscordGuild : public IDiscordGuild
{
public:
static CDiscordGuild* GetFromSciptID(std::uint32_t id);
};

class CDiscord : public IDiscord
{
public:
CDiscord() noexcept;

void login(const std::string_view& token) noexcept override;
void start() noexcept override;
CDiscordGuild* GetGuild(dpp::snowflake id) const noexcept override;

protected:
};
1 change: 0 additions & 1 deletion Server/mods/deathmatch/logic/CGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,6 @@ bool CGame::Start(int iArgumentCount, char* szArguments[])
m_pCustomWeaponManager = new CCustomWeaponManager();

m_pTrainTrackManager = std::make_shared<CTrainTrackManager>();
//m_discord = std::make_unique<CDiscord>();

// Parse the commandline
if (!m_CommandLineParser.Parse(iArgumentCount, szArguments))
Expand Down
4 changes: 0 additions & 4 deletions Server/mods/deathmatch/logic/CGame.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,6 @@ class CGame
CMasterServerAnnouncer* GetMasterServerAnnouncer() { return m_pMasterServerAnnouncer; }
SharedUtil::CAsyncTaskScheduler* GetAsyncTaskScheduler() { return m_pAsyncTaskScheduler; }

const CDiscord* GetDiscordManager() const noexcept { return m_discord.get(); }
CDiscord* GetDiscordManager() noexcept { return m_discord.get(); }

std::shared_ptr<CTrainTrackManager> GetTrainTrackManager() { return m_pTrainTrackManager; }

void JoinPlayer(CPlayer& Player);
Expand Down Expand Up @@ -571,7 +568,6 @@ class CGame
CBuildingRemovalManager* m_pBuildingRemovalManager;

std::shared_ptr<CTrainTrackManager> m_pTrainTrackManager;
std::unique_ptr<CDiscord> m_discord;

CCustomWeaponManager* m_pCustomWeaponManager;
CFunctionUseLogger* m_pFunctionUseLogger;
Expand Down
4 changes: 4 additions & 0 deletions Server/mods/deathmatch/logic/CResource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1039,6 +1039,8 @@ bool CResource::Start(std::list<CResource*>* pDependents, bool bManualStart, con
// Sort by priority, for start grouping on the client
m_StartedResources.sort([](CResource* a, CResource* b) { return a->m_iDownloadPriorityGroup > b->m_iDownloadPriorityGroup; });

m_discord = std::make_unique<CDiscord>();

return true;
}

Expand Down Expand Up @@ -1174,6 +1176,8 @@ bool CResource::Stop(bool bManualStop)

OnResourceStateChange("loaded");
m_eState = EResourceState::Loaded;

m_discord.reset();
return true;
}

Expand Down
5 changes: 5 additions & 0 deletions Server/mods/deathmatch/logic/CResource.h
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,9 @@ class CResource : public EHS
*/
CResourceFile* GetResourceFile(const SString& relativePath) const;


const CDiscord* GetDiscordManager() const noexcept { return m_discord.get(); }
CDiscord* GetDiscordManager() noexcept { return m_discord.get(); }
public:
static std::list<CResource*> m_StartedResources;

Expand Down Expand Up @@ -365,6 +368,8 @@ class CResource : public EHS
bool IsHttpAccessAllowed(CAccount* pAccount);

private:
std::unique_ptr<CDiscord> m_discord;

EResourceState m_eState = EResourceState::None;
bool m_bClientSync = false;

Expand Down
8 changes: 8 additions & 0 deletions Server/mods/deathmatch/logic/lua/CLuaArguments.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,14 @@ CLuaArgument* CLuaArguments::PushDbQuery(CDbJobData* pJobData)
return pArgument;
}

CLuaArgument* CLuaArguments::PushDiscordGuild(dpp::guild* guild)
{
CLuaArgument* arg = new CLuaArgument;
arg->ReadScriptID(guild->id);
m_Arguments.push_back(arg);
return arg;
}

void CLuaArguments::DeleteArguments()
{
// Delete each item
Expand Down
2 changes: 2 additions & 0 deletions Server/mods/deathmatch/logic/lua/CLuaArguments.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ extern "C"
#include "../common/CBitStream.h"
#include "json.h"
#include "CLuaFunctionRef.h"
#include <CDiscord.h>

inline void LUA_CHECKSTACK(lua_State* L, int size)
{
Expand Down Expand Up @@ -80,6 +81,7 @@ class CLuaArguments
CLuaArgument* PushTextItem(CTextItem* pTextItem);
CLuaArgument* PushTimer(CLuaTimer* pLuaTimer);
CLuaArgument* PushDbQuery(CDbJobData* pJobData);
CLuaArgument* PushDiscordGuild(dpp::guild* guild);

CLuaArgument* PushArgument(const CLuaArgument& argument);
CLuaArgument* PushTable(CLuaArguments* table);
Expand Down
5 changes: 5 additions & 0 deletions Server/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,11 @@ CClient* UserDataCast(CClient* ptr, lua_State* luaState)
return pClient;
}

CDiscordGuild* UserDataCast(CDiscordGuild* ptr, lua_State* luaState)
{
return CDiscordGuild::GetFromSciptID(reinterpret_cast<std::uint32_t>(ptr));
}

//
// Get best guess at name of userdata type
//
Expand Down
9 changes: 9 additions & 0 deletions Server/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,10 @@ inline SString GetClassTypeName(CLuaMatrix*)
{
return "matrix";
}
inline SString GetClassTypeName(const dpp::guild*)
{
return "discord-guild";
}

//
// CResource from userdata
Expand Down Expand Up @@ -361,6 +365,11 @@ CPlayer* UserDataCast(CPlayer* ptr, lua_State* luaState);
//
CClient* UserDataCast(CClient* ptr, lua_State* luaState);

//
// Discord guild
//
CDiscordGuild* UserDataCast(CDiscordGuild* ptr, lua_State* luaState);

//
// CElement ( something )
//
Expand Down
2 changes: 2 additions & 0 deletions Server/mods/deathmatch/logic/lua/CLuaMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ extern CNetServer* g_pRealNetServer;
#include "luascripts/coroutine_debug.lua.h"
#include "luascripts/exports.lua.h"
#include "luascripts/inspect.lua.h"
#include <luadefs/CLuaDiscordDefs.h>

CLuaMain::CLuaMain(CLuaManager* pLuaManager, CObjectManager* pObjectManager, CPlayerManager* pPlayerManager, CVehicleManager* pVehicleManager,
CBlipManager* pBlipManager, CRadarAreaManager* pRadarAreaManager, CMapManager* pMapManager, CResource* pResourceOwner, bool bEnableOOP)
Expand Down Expand Up @@ -178,6 +179,7 @@ void CLuaMain::InitClasses(lua_State* luaVM)
CLuaBlipDefs ::AddClass(luaVM);
CLuaColShapeDefs ::AddClass(luaVM);
CLuaDatabaseDefs ::AddClass(luaVM);
CLuaDiscordDefs::AddClass(luaVM);
CLuaMarkerDefs ::AddClass(luaVM);
CLuaObjectDefs ::AddClass(luaVM);
CLuaPedDefs ::AddClass(luaVM);
Expand Down
2 changes: 2 additions & 0 deletions Server/mods/deathmatch/logic/lua/CLuaManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
#include "luadefs/CLuaVoiceDefs.h"
#include "luadefs/CLuaWorldDefs.h"
#include "luadefs/CLuaCompatibilityDefs.h"
#include <luadefs/CLuaDiscordDefs.h>

extern CGame* g_pGame;

Expand Down Expand Up @@ -194,6 +195,7 @@ void CLuaManager::LoadCFunctions()
CLuaCameraDefs::LoadFunctions();
CLuaColShapeDefs::LoadFunctions();
CLuaDatabaseDefs::LoadFunctions();
CLuaDiscordDefs::LoadFunctions();
CLuaElementDefs::LoadFunctions();
CLuaHandlingDefs::LoadFunctions();
CLuaMarkerDefs::LoadFunctions();
Expand Down
9 changes: 9 additions & 0 deletions Server/mods/deathmatch/logic/lua/LuaCommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ void lua_pushuserdata(lua_State* luaVM, void* pData)
return lua_pushtextitem(luaVM, pTextItem);
else if (CDbJobData* pQuery = UserDataCast((CDbJobData*)pData, luaVM))
return lua_pushquery(luaVM, pQuery);
else if (CDiscordGuild* pGuild = UserDataCast((CDiscordGuild*)pData, luaVM))
return lua_pushdiscordguild(luaVM, pGuild);

lua_pushobject(luaVM, NULL, pData);
}
Expand Down Expand Up @@ -281,6 +283,13 @@ void lua_pushmatrix(lua_State* luaVM, const CMatrix& matrix)
lua_addtotalbytes(luaVM, LUA_GC_EXTRA_BYTES);
}

void lua_pushdiscordguild(lua_State* luaVM, const CDiscordGuild* guild)
{
std::uint32_t id = guild ? guild->GetScriptID() : -1;
lua_pushobject(luaVM, CLuaClassDefs::GetDiscordGuildClass(), static_cast<void*>(reinterpret_cast<std::uint32_t*>(id)), true);
lua_addtotalbytes(luaVM, LUA_GC_EXTRA_BYTES);
}

CLuaMain& lua_getownercluamain(lua_State* L)
{
return *static_cast<class CLuaMain*>(lua_getmtasaowner(L));
Expand Down
3 changes: 3 additions & 0 deletions Server/mods/deathmatch/logic/lua/LuaCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ extern "C"
}

#include "CLuaFunctionRef.h"
#include <CDiscord.h>

#define TO_ELEMENTID(x) ((ElementID) reinterpret_cast<unsigned long>(x))

Expand Down Expand Up @@ -49,6 +50,8 @@ void lua_pushvector(lua_State* luaVM, const CVector& vector);
void lua_pushvector(lua_State* luaVM, const CVector4D& vector);
void lua_pushmatrix(lua_State* luaVM, const CMatrix& matrix);

void lua_pushdiscordguild(lua_State* luaVM, const CDiscordGuild* guild);

class CLuaMain& lua_getownercluamain(lua_State* L);
class CResource& lua_getownerresource(lua_State* L);

Expand Down
5 changes: 5 additions & 0 deletions Server/mods/deathmatch/logic/luadefs/CLuaClassDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,11 @@ const char* CLuaClassDefs::GetQueryClass(CDbJobData* pJobData)
return "QueryHandle";
}

const char* CLuaClassDefs::GetDiscordGuildClass() noexcept
{
return "DiscordGuild";
}

// absolutely ugly, need a better way
const char* CLuaClassDefs::GetElementClass(CElement* pElement)
{
Expand Down
1 change: 1 addition & 0 deletions Server/mods/deathmatch/logic/luadefs/CLuaClassDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,5 @@ class CLuaClassDefs : public CLuaDefs
static const char* GetBanClass(CBan* pBan);
static const char* GetQueryClass(CDbJobData* pJobData);
static const char* GetElementClass(CElement* pElement);
static const char* GetDiscordGuildClass() noexcept;
};
Loading

0 comments on commit 1e3c644

Please sign in to comment.