1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
/*
* Discord.cpp, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
#include "StdInc.h"
#include "Discord.h"
#ifdef ENABLE_DISCORD
#include <discord-rpc.hpp>
#endif
#include "../lib/CConfigHandler.h"
#include "../lib/StartInfo.h"
#include "../lib/mapping/CMap.h"
#include "../lib/campaign/CampaignState.h"
Discord::Discord() :
enabled(settings["general"]["enableDiscordRichPresence"].Bool())
{
#ifdef ENABLE_DISCORD
if(!enabled)
return;
// ID of an App created in discord for VCMI. Needed for title and icon
constexpr auto APPLICATION_ID = "1416538363254669455";
discord::RPCManager::get().initialize();
discord::RPCManager::get()
.setClientID(APPLICATION_ID)
.onReady([](discord::User const& user) {
logGlobal->info("Discord: connected to user %s#%s - %s", user.username, user.discriminator, user.id);
})
.onDisconnected([](int errcode, std::string_view message) {
logGlobal->warn("Discord: disconnected with error code %s - %s", errcode, message);
})
.onErrored([](int errcode, std::string_view message) {
logGlobal->error("Discord: error with code %s - %s", errcode, message);
});
startTime = time(nullptr);
setStatus("", "", {0, 0});
#endif
}
Discord::~Discord()
{
#ifdef ENABLE_DISCORD
if(!enabled)
return;
clearStatus();
discord::RPCManager::get().shutdown();
#endif
}
void Discord::setStatus(std::string state, std::string details, std::tuple<int, int> partySize)
{
#ifdef ENABLE_DISCORD
if(!enabled)
return;
discord::RPCManager::get().getPresence()
.setState(state)
.setActivityType(discord::ActivityType::Game)
.setStatusDisplayType(discord::StatusDisplayType::Name)
.setDetails(details)
.setStartTimestamp(startTime)
.setLargeImageKey("canary-large")
.setSmallImageKey("ptb-small")
.setInstance(false)
.setPartySize(std::get<0>(partySize))
.setPartyMax(std::get<1>(partySize))
.refresh();
#endif
}
void Discord::clearStatus()
{
#ifdef ENABLE_DISCORD
if(!enabled)
return;
discord::RPCManager::get().clearPresence();
#endif
}
void Discord::setPlayingStatus(std::shared_ptr<StartInfo> si, const CMap * map, int humanInterfacesCount)
{
#ifdef ENABLE_DISCORD
if(!enabled)
return;
bool isCampaign = si->campState != nullptr;
bool isMulti = humanInterfacesCount > 1;
int humanPlayersCount = 0;
for(auto & player : map->players)
if(player.canHumanPlay)
humanPlayersCount++;
std::string title = "Playing " + std::string(isCampaign ? "Campaign" : "Map") + (isMulti ? " (Multiplayer)" : " (Singleplayer)");
std::string subTitle = std::string(isCampaign ? si->campState->getNameTranslated() + " - " : "") + map->name.toString();
setStatus(subTitle, title, {humanInterfacesCount, isMulti ? humanPlayersCount : 0});
#endif
}
|