diff options
Diffstat (limited to 'protocols/Discord')
-rw-r--r-- | protocols/Discord/src/main.cpp | 10 | ||||
-rw-r--r-- | protocols/Discord/src/proto.cpp | 7 | ||||
-rw-r--r-- | protocols/Discord/src/proto.h | 16 | ||||
-rw-r--r-- | protocols/Discord/src/voice.cpp | 39 |
4 files changed, 65 insertions, 7 deletions
diff --git a/protocols/Discord/src/main.cpp b/protocols/Discord/src/main.cpp index 98f0b120de..17a10bf78e 100644 --- a/protocols/Discord/src/main.cpp +++ b/protocols/Discord/src/main.cpp @@ -56,12 +56,20 @@ IconItem g_iconList[] = { LPGEN("Call ended"), "voiceend", IDI_VOICE_ENDED }
};
-static int OnModulesLoaded(WPARAM, LPARAM)
+static int OnModuleLoaded(WPARAM, LPARAM)
{
g_plugin.bVoiceService = ServiceExists(MS_VOICESERVICE_REGISTER);
return 0;
}
+static int OnModulesLoaded(WPARAM, LPARAM)
+{
+ HookEvent(ME_SYSTEM_MODULELOAD, &OnModuleLoaded);
+ HookEvent(ME_SYSTEM_MODULEUNLOAD, &OnModuleLoaded);
+ OnModuleLoaded(0, 0);
+ return 0;
+}
+
int CMPlugin::Load()
{
HookEvent(ME_SYSTEM_MODULESLOADED, &OnModulesLoaded);
diff --git a/protocols/Discord/src/proto.cpp b/protocols/Discord/src/proto.cpp index 5056282794..22f6f35e05 100644 --- a/protocols/Discord/src/proto.cpp +++ b/protocols/Discord/src/proto.cpp @@ -63,6 +63,10 @@ CDiscordProto::CDiscordProto(const char *proto_name, const wchar_t *username) : CreateProtoService(PS_GETMYAVATAR, &CDiscordProto::GetMyAvatar);
CreateProtoService(PS_SETMYAVATAR, &CDiscordProto::SetMyAvatar);
+ CreateProtoService(PS_VOICE_CALL, &CDiscordProto::VoiceCallCreate);
+ CreateProtoService(PS_VOICE_DROPCALL, &CDiscordProto::VoiceCallCancel);
+ CreateProtoService(PS_VOICE_ANSWERCALL, &CDiscordProto::VoiceCallAnswer);
+
CreateProtoService(PS_MENU_REQAUTH, &CDiscordProto::RequestFriendship);
CreateProtoService(PS_MENU_LOADHISTORY, &CDiscordProto::OnMenuLoadHistory);
@@ -185,6 +189,7 @@ void CDiscordProto::OnModulesLoaded() HookProtoEvent(ME_GC_BUILDMENU, &CDiscordProto::GroupchatMenuHook);
InitMenus();
+ InitVoip(true);
// Voice support
if (g_plugin.bVoiceService) {
@@ -205,6 +210,8 @@ void CDiscordProto::OnShutdown() m_bTerminated = true;
SetEvent(m_evRequestsQueue);
+ InitVoip(false);
+
for (auto &it : arGuilds)
it->SaveToFile();
diff --git a/protocols/Discord/src/proto.h b/protocols/Discord/src/proto.h index aaa00c0cd5..31fda24fd3 100644 --- a/protocols/Discord/src/proto.h +++ b/protocols/Discord/src/proto.h @@ -411,6 +411,18 @@ class CDiscordProto : public PROTO<CDiscordProto> void OnSendTotp(MHttpResponse *, struct AsyncHttpRequest *);
//////////////////////////////////////////////////////////////////////////////////////
+ // voice
+
+ void InitVoip(bool bEnable);
+
+ INT_PTR __cdecl VoiceCaps(WPARAM, LPARAM);
+ INT_PTR __cdecl VoiceCallCreate(WPARAM, LPARAM);
+ INT_PTR __cdecl VoiceCallAnswer(WPARAM, LPARAM);
+ INT_PTR __cdecl VoiceCallCancel(WPARAM, LPARAM);
+
+ int __cdecl OnVoiceState(WPARAM, LPARAM);
+
+ //////////////////////////////////////////////////////////////////////////////////////
// misc methods
SnowFlake getId(const char *szName);
@@ -472,16 +484,12 @@ public: INT_PTR __cdecl GetMyAvatar(WPARAM, LPARAM);
INT_PTR __cdecl SetMyAvatar(WPARAM, LPARAM);
- INT_PTR __cdecl VoiceCaps(WPARAM, LPARAM);
-
//////////////////////////////////////////////////////////////////////////////////////
// Events
int __cdecl OnOptionsInit(WPARAM, LPARAM);
int __cdecl OnAccountChanged(WPARAM, LPARAM);
- int __cdecl OnVoiceState(WPARAM, LPARAM);
-
//////////////////////////////////////////////////////////////////////////////////////
// dispatch commands
diff --git a/protocols/Discord/src/voice.cpp b/protocols/Discord/src/voice.cpp index 48e5290c23..ee6369777b 100644 --- a/protocols/Discord/src/voice.cpp +++ b/protocols/Discord/src/voice.cpp @@ -88,12 +88,27 @@ void CDiscordProto::OnCommandCallUpdated(const JSONNode&) /////////////////////////////////////////////////////////////////////////////////////////
// Events & services
-INT_PTR __cdecl CDiscordProto::VoiceCaps(WPARAM, LPARAM)
+INT_PTR CDiscordProto::VoiceCaps(WPARAM, LPARAM)
{
return VOICE_CAPS_VOICE | VOICE_CAPS_CALL_CONTACT;
}
-int __cdecl CDiscordProto::OnVoiceState(WPARAM wParam, LPARAM)
+INT_PTR CDiscordProto::VoiceCallCreate(WPARAM, LPARAM)
+{
+ return 0;
+}
+
+INT_PTR CDiscordProto::VoiceCallAnswer(WPARAM, LPARAM)
+{
+ return 0;
+}
+
+INT_PTR CDiscordProto::VoiceCallCancel(WPARAM, LPARAM)
+{
+ return 0;
+}
+
+int CDiscordProto::OnVoiceState(WPARAM wParam, LPARAM)
{
auto *pVoice = (VOICE_CALL *)wParam;
if (mir_strcmp(pVoice->moduleName, m_szModuleName))
@@ -114,3 +129,23 @@ int __cdecl CDiscordProto::OnVoiceState(WPARAM wParam, LPARAM) debugLogA("Call %s state changed to %d", pVoice->id, pVoice->state);
return 0;
}
+
+void CDiscordProto::InitVoip(bool bEnable)
+{
+ if (!g_plugin.bVoiceService)
+ return;
+
+ if (bEnable) {
+ VOICE_MODULE vsr = {};
+ vsr.cbSize = sizeof(VOICE_MODULE);
+ vsr.description = m_tszUserName;
+ vsr.name = m_szModuleName;
+ vsr.icon = g_plugin.getIconHandle(IDI_MAIN);
+ vsr.flags = VOICE_CAPS_VOICE | VOICE_CAPS_CALL_CONTACT;
+ CallService(MS_VOICESERVICE_REGISTER, (WPARAM)&vsr, 0);
+ }
+ else {
+ // TerminateSession();
+ CallService(MS_VOICESERVICE_UNREGISTER, (WPARAM)m_szModuleName, 0);
+ }
+}
|