2021-04-19 20:58:47 -04:00
# include <imgui.h>
# include <spdlog/spdlog.h>
# include <module.h>
# include <gui/gui.h>
# include <gui/style.h>
# include <core.h>
2021-04-19 21:19:16 -04:00
# include <discord_rpc.h>
2021-04-20 18:31:28 -04:00
# include <thread>
2021-04-19 21:19:16 -04:00
2021-04-19 20:58:47 -04:00
SDRPP_MOD_INFO {
2021-04-20 18:14:58 -04:00
/* Name: */ " discord-integration " ,
2021-04-19 20:58:47 -04:00
/* Description: */ " Discord Rich Presence module for SDR++ " ,
2021-04-20 18:31:28 -04:00
/* Author: */ " Starman0620 & Ryzerth " ,
2021-04-21 19:25:15 -04:00
/* Version: */ 0 , 0 , 2 ,
2021-04-20 18:14:58 -04:00
/* Max instances */ 1
2021-04-19 20:58:47 -04:00
} ;
2021-04-20 18:31:28 -04:00
DiscordRichPresence presence ;
uint64_t lastFreq ;
char * freq = new char [ 24 ] ;
// Threading
int workerCounter = 0 ;
std : : thread workerThread ;
bool workerRunning ;
2021-04-19 21:47:11 -04:00
2021-04-19 20:58:47 -04:00
class PresenceModule : public ModuleManager : : Instance {
public :
PresenceModule ( std : : string name ) {
this - > name = name ;
2021-04-19 21:47:11 -04:00
2021-04-20 18:31:28 -04:00
workerRunning = true ;
workerThread = std : : thread ( & PresenceModule : : worker , this ) ;
2021-04-20 14:26:48 -04:00
startPresence ( ) ;
2021-04-19 20:58:47 -04:00
}
~ PresenceModule ( ) {
2021-04-20 18:31:28 -04:00
workerRunning = false ;
if ( workerThread . joinable ( ) ) { workerThread . join ( ) ; }
2021-04-19 20:58:47 -04:00
}
void enable ( ) {
2021-04-20 18:31:28 -04:00
workerRunning = true ;
2021-04-19 20:58:47 -04:00
enabled = true ;
}
void disable ( ) {
2021-04-20 18:31:28 -04:00
workerRunning = false ;
2021-04-19 20:58:47 -04:00
enabled = false ;
2021-04-21 11:58:58 -04:00
Discord_ClearPresence ( ) ;
2021-04-19 20:58:47 -04:00
}
bool isEnabled ( ) {
return enabled ;
}
private :
2021-04-20 18:31:28 -04:00
// Main thread
void worker ( ) {
while ( workerRunning ) {
workerCounter + + ;
if ( workerCounter > = 1000 ) {
workerCounter = 0 ;
updatePresence ( ) ;
}
std : : this_thread : : sleep_for ( std : : chrono : : milliseconds ( 10 ) ) ;
}
}
2021-04-20 14:26:48 -04:00
static void updatePresence ( ) {
2021-04-20 18:19:58 -04:00
if ( gui : : freqSelect . frequency ! = lastFreq ) {
presence . details = " Listening " ; // This really doesn't need to be re-set each time but it'll remain since it will be used once proper status can be displayed
sprintf ( freq , " %.2fMHz " , ( float ) gui : : freqSelect . frequency / 1000000 ) ;
presence . state = freq ;
Discord_UpdatePresence ( & presence ) ;
lastFreq = gui : : freqSelect . frequency ;
}
2021-04-20 14:26:48 -04:00
}
static void startPresence ( ) {
// Discord initialization
DiscordEventHandlers handlers ;
memset ( & handlers , 0 , sizeof ( handlers ) ) ;
memset ( & presence , 0 , sizeof ( presence ) ) ;
Discord_Initialize ( " 833485588954742864 " , & handlers , 1 , " " ) ;
// Set the first presence
presence . details = " Initializing rich presence... " ;
presence . startTimestamp = time ( 0 ) ;
presence . largeImageKey = " image_large " ;
Discord_UpdatePresence ( & presence ) ;
}
2021-04-19 20:58:47 -04:00
std : : string name ;
bool enabled = true ;
} ;
MOD_EXPORT void _INIT_ ( ) {
}
MOD_EXPORT ModuleManager : : Instance * _CREATE_INSTANCE_ ( std : : string name ) {
return new PresenceModule ( name ) ;
}
MOD_EXPORT void _DELETE_INSTANCE_ ( void * instance ) {
delete ( PresenceModule * ) instance ;
}
MOD_EXPORT void _END_ ( ) {
}