summaryrefslogtreecommitdiff
path: root/protocols/Discord
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2016-12-27 22:06:02 +0300
committerGeorge Hazan <ghazan@miranda.im>2016-12-27 22:06:02 +0300
commit8db6b3f25e173f7c305580fad8cbd67a7121b169 (patch)
treee12f6518d302efc46f159c6a3bf35fce471076a6 /protocols/Discord
parentcd689cb08d614fb2f405167debec66c7c2ef6843 (diff)
implementation of CDiscordProto::SetStatus
Diffstat (limited to 'protocols/Discord')
-rw-r--r--protocols/Discord/src/connection.cpp23
-rw-r--r--protocols/Discord/src/main.cpp2
-rw-r--r--protocols/Discord/src/options.cpp8
-rw-r--r--protocols/Discord/src/proto.cpp58
-rw-r--r--protocols/Discord/src/proto.h11
-rw-r--r--protocols/Discord/src/utils.cpp25
6 files changed, 107 insertions, 20 deletions
diff --git a/protocols/Discord/src/connection.cpp b/protocols/Discord/src/connection.cpp
new file mode 100644
index 0000000000..a7e3babd41
--- /dev/null
+++ b/protocols/Discord/src/connection.cpp
@@ -0,0 +1,23 @@
+/*
+Copyright © 2016 Miranda NG team
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "stdafx.h"
+
+void CDiscordProto::ServerThread(void*)
+{
+
+}
diff --git a/protocols/Discord/src/main.cpp b/protocols/Discord/src/main.cpp
index 9779dd8817..340ce425bb 100644
--- a/protocols/Discord/src/main.cpp
+++ b/protocols/Discord/src/main.cpp
@@ -55,7 +55,7 @@ extern "C" __declspec(dllexport) const MUUID MirandaInterfaces[] = { MIID_PROTOC
static PROTO_INTERFACE* protoInit(const char *proto_name, const wchar_t *username)
{
- return new ÑDiscordProto(proto_name, username);
+ return new CDiscordProto(proto_name, username);
}
static int protoUninit(PROTO_INTERFACE *proto)
diff --git a/protocols/Discord/src/options.cpp b/protocols/Discord/src/options.cpp
index 6b9fe9b497..2f16811b6a 100644
--- a/protocols/Discord/src/options.cpp
+++ b/protocols/Discord/src/options.cpp
@@ -17,13 +17,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
-class CDiscardAccountOptions : public CProtoDlgBase<ÑDiscordProto>
+class CDiscardAccountOptions : public CProtoDlgBase<CDiscordProto>
{
CCtrlEdit m_edGroup, m_edUserName, m_edPassword;
public:
- CDiscardAccountOptions(ÑDiscordProto *ppro) :
- CProtoDlgBase<ÑDiscordProto>(ppro, IDD_OPTIONS_ACCOUNT),
+ CDiscardAccountOptions(CDiscordProto *ppro) :
+ CProtoDlgBase<CDiscordProto>(ppro, IDD_OPTIONS_ACCOUNT),
m_edGroup(this, IDC_GROUP),
m_edUserName(this, IDC_USERNAME),
m_edPassword(this, IDC_PASSWORD)
@@ -56,7 +56,7 @@ public:
}
};
-int ÑDiscordProto::OnOptionsInit(WPARAM wParam, LPARAM)
+int CDiscordProto::OnOptionsInit(WPARAM wParam, LPARAM)
{
OPTIONSDIALOGPAGE odp = { 0 };
odp.hInstance = g_hInstance;
diff --git a/protocols/Discord/src/proto.cpp b/protocols/Discord/src/proto.cpp
index c0af3fe2bd..1c557daaa7 100644
--- a/protocols/Discord/src/proto.cpp
+++ b/protocols/Discord/src/proto.cpp
@@ -17,22 +17,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
-ÑDiscordProto::ÑDiscordProto(const char *proto_name, const wchar_t *username) :
- PROTO<ÑDiscordProto>(proto_name, username)
+CDiscordProto::CDiscordProto(const char *proto_name, const wchar_t *username) :
+ PROTO<CDiscordProto>(proto_name, username)
{
// Services
- CreateProtoService(PS_GETNAME, &ÑDiscordProto::GetName);
- CreateProtoService(PS_GETSTATUS, &ÑDiscordProto::GetStatus);
+ CreateProtoService(PS_GETNAME, &CDiscordProto::GetName);
+ CreateProtoService(PS_GETSTATUS, &CDiscordProto::GetStatus);
// Events
- HookProtoEvent(ME_OPT_INITIALISE, &ÑDiscordProto::OnOptionsInit);
+ HookProtoEvent(ME_OPT_INITIALISE, &CDiscordProto::OnOptionsInit);
}
-ÑDiscordProto::~ÑDiscordProto()
+CDiscordProto::~CDiscordProto()
{
}
-DWORD_PTR ÑDiscordProto::GetCaps(int type, MCONTACT)
+DWORD_PTR CDiscordProto::GetCaps(int type, MCONTACT)
{
switch (type) {
case PFLAGNUM_1:
@@ -51,32 +51,66 @@ DWORD_PTR ÑDiscordProto::GetCaps(int type, MCONTACT)
return 0;
}
-INT_PTR ÑDiscordProto::GetName(WPARAM wParam, LPARAM lParam)
+INT_PTR CDiscordProto::GetName(WPARAM wParam, LPARAM lParam)
{
mir_strncpy((char*)lParam, m_szModuleName, (int)wParam);
return 0;
}
-INT_PTR ÑDiscordProto::GetStatus(WPARAM, LPARAM)
+INT_PTR CDiscordProto::GetStatus(WPARAM, LPARAM)
{
return m_iStatus;
}
+int CDiscordProto::SetStatus(int iNewStatus)
+{
+ if (iNewStatus == m_iStatus)
+ return 0;
+
+ m_iDesiredStatus = iNewStatus;
+ int iOldStatus = m_iStatus;
+
+ // all statuses but offline are treated as online
+ if (iNewStatus >= ID_STATUS_ONLINE && iNewStatus <= ID_STATUS_OUTTOLUNCH) {
+ m_iDesiredStatus = ID_STATUS_ONLINE;
+
+ // if we're already connecting and they want to go online
+ if (IsStatusConnecting(m_iStatus))
+ return 0;
+
+ // if we're already connected, don't try to reconnect
+ if (m_iStatus >= ID_STATUS_ONLINE && m_iStatus <= ID_STATUS_OUTTOLUNCH)
+ return 0;
+
+ m_iStatus = ID_STATUS_CONNECTING;
+ ProtoBroadcastAck(0, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)iOldStatus, m_iStatus);
+ ForkThread(&CDiscordProto::ServerThread, this);
+ }
+ else if (iNewStatus == ID_STATUS_OFFLINE) {
+ m_iStatus = m_iDesiredStatus;
+ SetAllContactStatuses(ID_STATUS_OFFLINE);
+
+ ProtoBroadcastAck(0, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)iOldStatus, m_iStatus);
+ }
+
+ return 0;
+}
+
/////////////////////////////////////////////////////////////////////////////////////////
-int ÑDiscordProto::OnModulesLoaded(WPARAM, LPARAM)
+int CDiscordProto::OnModulesLoaded(WPARAM, LPARAM)
{
return 0;
}
-int ÑDiscordProto::OnPreShutdown(WPARAM, LPARAM)
+int CDiscordProto::OnPreShutdown(WPARAM, LPARAM)
{
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////
-int ÑDiscordProto::OnEvent(PROTOEVENTTYPE event, WPARAM wParam, LPARAM lParam)
+int CDiscordProto::OnEvent(PROTOEVENTTYPE event, WPARAM wParam, LPARAM lParam)
{
switch (event) {
case EV_PROTO_ONLOAD: return OnModulesLoaded(wParam, lParam);
diff --git a/protocols/Discord/src/proto.h b/protocols/Discord/src/proto.h
index e0c7e2c073..26466bcfae 100644
--- a/protocols/Discord/src/proto.h
+++ b/protocols/Discord/src/proto.h
@@ -1,14 +1,19 @@
-class ÑDiscordProto : public PROTO<ÑDiscordProto>
+class CDiscordProto : public PROTO<CDiscordProto>
{
+ void __cdecl ServerThread(void*);
+
+ void SetAllContactStatuses(int iStatus);
public:
- ÑDiscordProto(const char*,const wchar_t*);
- ~ÑDiscordProto();
+ CDiscordProto(const char*,const wchar_t*);
+ ~CDiscordProto();
// PROTO_INTERFACE
virtual DWORD_PTR __cdecl GetCaps(int, MCONTACT = 0) override;
+ virtual int __cdecl SetStatus(int iNewStatus) override;
+
virtual int __cdecl OnEvent(PROTOEVENTTYPE, WPARAM, LPARAM) override;
// Services
diff --git a/protocols/Discord/src/utils.cpp b/protocols/Discord/src/utils.cpp
new file mode 100644
index 0000000000..a542a4a7c5
--- /dev/null
+++ b/protocols/Discord/src/utils.cpp
@@ -0,0 +1,25 @@
+/*
+Copyright © 2016 Miranda NG team
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "stdafx.h"
+
+void CDiscordProto::SetAllContactStatuses(int status)
+{
+ for (MCONTACT hContact = db_find_first(m_szModuleName); hContact; hContact = db_find_next(hContact, m_szModuleName))
+ if (!getByte(hContact, "ChatRoom"))
+ setWord(hContact, "Status", (WORD)status);
+}