From e8cfaff4970726c7f15c0241e0c6b210ead2f0bd Mon Sep 17 00:00:00 2001
From: Sergey Bolhovskoy <elzorfox@ya.ru>
Date: Sat, 11 Oct 2014 13:40:24 +0000
Subject: =?UTF-8?q?VKontakte:=20fix=20for=20leave=20chat=20menuitem=20on?=
 =?UTF-8?q?=20clist=20contact=E2=80=99s=20menu=20fix=20for=20mark=20messag?=
 =?UTF-8?q?es=20as=20read=20for=20chat=20messages?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

git-svn-id: http://svn.miranda-ng.org/main/trunk@10764 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
---
 protocols/VKontakte/src/vk_chats.cpp  | 29 +++++++++++++++++++++++++++++
 protocols/VKontakte/src/vk_proto.cpp  |  3 ++-
 protocols/VKontakte/src/vk_proto.h    |  1 +
 protocols/VKontakte/src/vk_thread.cpp |  7 ++++---
 4 files changed, 36 insertions(+), 4 deletions(-)

(limited to 'protocols')

diff --git a/protocols/VKontakte/src/vk_chats.cpp b/protocols/VKontakte/src/vk_chats.cpp
index 8ddfaa201a..d559450383 100644
--- a/protocols/VKontakte/src/vk_chats.cpp
+++ b/protocols/VKontakte/src/vk_chats.cpp
@@ -465,6 +465,35 @@ void CVkProto::LogMenuHook(CVkChatInfo *cc, GCHOOK *gch)
 	}
 }
 
+INT_PTR __cdecl CVkProto::OnLeaveChat(WPARAM hContact, LPARAM)
+{
+	debugLogA("CVkProto::OnLeaveChat");
+	ptrT tszChatID(getTStringA(hContact, "ChatRoomID"));
+	if (tszChatID == NULL)
+		return 1;
+
+	CVkChatInfo *cc = GetChatById(tszChatID);
+	if (cc == NULL)
+		return 1;
+	
+	if (IDYES == MessageBox(NULL,
+		TranslateT("This chat is going to be destroyed forever with all its contents. This action cannot be undone. Are you sure?"),
+		TranslateT("Warning"), MB_YESNOCANCEL | MB_ICONQUESTION))
+	{
+		CMStringA code;
+		code.Format("var Hist = API.messages.getHistory({\"chat_id\":%d, \"count\":200});"
+			"var countMsg = Hist.count;var itemsMsg = Hist.items@.id; "
+			"while (countMsg > 1) { API.messages.delete({\"message_ids\":itemsMsg});"
+			"Hist=API.messages.getHistory({\"chat_id\":%d, \"count\":200});"
+			"countMsg = Hist.count;itemsMsg = Hist.items@.id;}; return 1;", cc->m_chatid, cc->m_chatid);
+		Push(new AsyncHttpRequest(this, REQUEST_GET, "/method/execute.json", true, &CVkProto::OnChatDestroy)
+			<< CHAR_PARAM("code", code)
+			<< VER_API)->pUserInfo = cc;
+		return 0;
+	}
+	return 1;
+}
+
 void CVkProto::OnChatDestroy(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pReq)
 {
 	debugLogA("CVkProto::OnChatDestroy %d", reply->resultCode);
diff --git a/protocols/VKontakte/src/vk_proto.cpp b/protocols/VKontakte/src/vk_proto.cpp
index 910c79b0f4..f1706d2659 100644
--- a/protocols/VKontakte/src/vk_proto.cpp
+++ b/protocols/VKontakte/src/vk_proto.cpp
@@ -102,9 +102,10 @@ int CVkProto::OnModulesLoaded(WPARAM wParam, LPARAM lParam)
 	gcr.nColors = SIZEOF(sttColors);
 	gcr.pColors = sttColors;
 	CallServiceSync(MS_GC_REGISTER, NULL, (LPARAM)&gcr);
-	
+	CreateProtoService(PS_LEAVECHAT, &CVkProto::OnLeaveChat);
 	HookProtoEvent(ME_GC_EVENT, &CVkProto::OnChatEvent);
 	HookProtoEvent(ME_GC_BUILDMENU, &CVkProto::OnGcMenuHook);
+	// Other hooks
 	HookProtoEvent(ME_MSG_WINDOWEVENT, &CVkProto::OnProcessSrmmEvent);
 	HookProtoEvent(ME_DB_EVENT_MARKED_READ, &CVkProto::OnDbEventRead);
 
diff --git a/protocols/VKontakte/src/vk_proto.h b/protocols/VKontakte/src/vk_proto.h
index 2aabbe2abe..5381a7b37d 100644
--- a/protocols/VKontakte/src/vk_proto.h
+++ b/protocols/VKontakte/src/vk_proto.h
@@ -445,6 +445,7 @@ private:
 	void OnChatDestroy(NETLIBHTTPREQUEST*, AsyncHttpRequest*);
 	int __cdecl OnChatEvent(WPARAM, LPARAM);
 	int __cdecl OnGcMenuHook(WPARAM, LPARAM);
+	INT_PTR __cdecl OnLeaveChat(WPARAM, LPARAM);
 	void LogMenuHook(CVkChatInfo*, GCHOOK*);
 	void NickMenuHook(CVkChatInfo*, GCHOOK*);
 	LPTSTR ChangeChatTopic(CVkChatInfo*);
diff --git a/protocols/VKontakte/src/vk_thread.cpp b/protocols/VKontakte/src/vk_thread.cpp
index e9e8bb035a..5d36024b34 100644
--- a/protocols/VKontakte/src/vk_thread.cpp
+++ b/protocols/VKontakte/src/vk_thread.cpp
@@ -562,15 +562,16 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe
 			ptszBody = mir_tstrdup(CMString(ptszBody) + GetAttachmentDescr(pAttachments));
 
 		MCONTACT hContact = FindUser(uid, true);
+		int chat_id = json_as_int(json_get(pMsg, "chat_id"));
+
 		char szMid[40];
 		_itoa(mid, szMid, 10);
-		if (m_iMarkMessageReadOn == markOnReceive){
+		if ((m_iMarkMessageReadOn == markOnReceive) || (chat_id != 0)){
 			if (!mids.IsEmpty())
 				mids.AppendChar(',');
 			mids.Append(szMid);
 		}
 
-		int chat_id = json_as_int(json_get(pMsg, "chat_id"));
 		if (chat_id != 0) {
 			AppendChatMessage(chat_id, pMsg, false);
 			continue;
@@ -598,7 +599,7 @@ void CVkProto::OnReceiveMessages(NETLIBHTTPREQUEST *reply, AsyncHttpRequest *pRe
 		}
 	}
 
-	if (m_iMarkMessageReadOn == markOnReceive)
+	if (!mids.IsEmpty())
 		MarkMessagesRead(mids);
 }
 
-- 
cgit v1.2.3