summaryrefslogtreecommitdiff
path: root/protocols/ICQ-WIM/src/server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/ICQ-WIM/src/server.cpp')
-rw-r--r--protocols/ICQ-WIM/src/server.cpp92
1 files changed, 69 insertions, 23 deletions
diff --git a/protocols/ICQ-WIM/src/server.cpp b/protocols/ICQ-WIM/src/server.cpp
index 0e95605bdd..265b6ba632 100644
--- a/protocols/ICQ-WIM/src/server.cpp
+++ b/protocols/ICQ-WIM/src/server.cpp
@@ -366,7 +366,10 @@ void CIcqProto::ParseMessage(MCONTACT hContact, __int64 &lastMsgId, const JSONNo
wszUrl = TranslateT("Unknown sticker");
wszText.Format(L"%s\n%s", TranslateT("User sent a sticker:"), wszUrl.c_str());
}
- else wszText = it["text"].as_mstring();
+ else {
+ wszText = it["text"].as_mstring();
+ TryFetchFileInfo(wszText);
+ }
int iMsgTime = (bFromHistory) ? it["time"].as_int() : time(0);
@@ -464,6 +467,19 @@ void CIcqProto::RetrieveUserInfo(MCONTACT hContact)
Push(pReq);
}
+void CIcqProto::TryFetchFileInfo(CMStringW &wszText)
+{
+ wszText.TrimRight();
+
+ if (wszText.Left(26) == L"https://files.icq.net/get/") {
+ CMStringA szUrl(FORMAT, ICQ_FILE_SERVER "/info/%S/", wszText.Mid(26).c_str());
+ auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, szUrl, &CIcqProto::OnFileInfo);
+ pReq << CHAR_PARAM("aimsid", m_aimsid) << CHAR_PARAM("previews", "600");
+ pReq->pUserInfo = &wszText;
+ ExecuteRequest(pReq);
+ }
+}
+
AsyncHttpRequest* CIcqProto::UserInfoRequest(MCONTACT hContact)
{
auto *pReq = new AsyncHttpRequest(CONN_MAIN, REQUEST_GET, ICQ_API_SERVER "/presence/get", &CIcqProto::OnGetUserInfo);
@@ -584,7 +600,6 @@ void CIcqProto::StartSession()
<< INT_PARAM("rawMsg", 0) << INT_PARAM("sessionTimeout", 7776000) << INT_PARAM("ts", ts) << CHAR_PARAM("view", "online");
CalcHash(pReq);
-
Push(pReq);
}
@@ -593,29 +608,30 @@ void CIcqProto::StartSession()
void CIcqProto::OnAddBuddy(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
{
JsonReply root(pReply);
- if (root.error() == 200) {
- CMStringW wszId = getMStringW(pReq->hContact, DB_KEY_ID);
- for (auto &it : root.data()["results"]) {
- if (it["buddy"].as_mstring() != wszId)
- continue;
-
- int iResultCode = it["resultCode"].as_int();
- if (iResultCode != 0) {
- debugLogA("Contact %d failed to add: error %d", pReq->hContact, iResultCode);
-
- POPUPDATAW Popup = {};
- Popup.lchIcon = IcoLib_GetIconByHandle(Skin_GetIconHandle(SKINICON_ERROR));
- wcsncpy_s(Popup.lpwzText, TranslateT("Buddy addition failed"), _TRUNCATE);
- wcsncpy_s(Popup.lpwzContactName, Clist_GetContactDisplayName(pReq->hContact), _TRUNCATE);
- Popup.iSeconds = 20;
- PUAddPopupW(&Popup);
-
- // Contact_RemoveFromList(pReq->hContact);
- }
+ if (root.error() != 200)
+ return;
+
+ CMStringW wszId = getMStringW(pReq->hContact, DB_KEY_ID);
+ for (auto &it : root.data()["results"]) {
+ if (it["buddy"].as_mstring() != wszId)
+ continue;
+
+ int iResultCode = it["resultCode"].as_int();
+ if (iResultCode != 0) {
+ debugLogA("Contact %d failed to add: error %d", pReq->hContact, iResultCode);
+
+ POPUPDATAW Popup = {};
+ Popup.lchIcon = IcoLib_GetIconByHandle(Skin_GetIconHandle(SKINICON_ERROR));
+ wcsncpy_s(Popup.lpwzText, TranslateT("Buddy addition failed"), _TRUNCATE);
+ wcsncpy_s(Popup.lpwzContactName, Clist_GetContactDisplayName(pReq->hContact), _TRUNCATE);
+ Popup.iSeconds = 20;
+ PUAddPopupW(&Popup);
- RetrieveUserInfo(pReq->hContact);
- Contact_PutOnList(pReq->hContact);
+ // Contact_RemoveFromList(pReq->hContact);
}
+
+ RetrieveUserInfo(pReq->hContact);
+ Contact_PutOnList(pReq->hContact);
}
}
@@ -723,6 +739,8 @@ void CIcqProto::OnFileContinue(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld
Push(pReq);
// Send the same message to myself
+ TryFetchFileInfo(wszUrl);
+
T2Utf msgText(wszUrl);
PROTORECVEVENT recv = {};
recv.flags = PREF_CREATEREAD | PREF_SENT;
@@ -780,6 +798,34 @@ void CIcqProto::OnFileInit(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pOld)
ProtoBroadcastAck(pTransfer->pfts.hContact, ACKTYPE_FILE, ACKRESULT_DATA, pTransfer, (LPARAM)&pTransfer->pfts);
}
+void CIcqProto::OnFileInfo(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest *pReq)
+{
+ CMStringW *wszText = (CMStringW *)pReq->pUserInfo;
+
+ RobustReply root(pReply);
+ if (root.error() != 200)
+ return;
+
+ wszText->Empty();
+ auto &data = root.result();
+ CMStringW tmp(data["extra"]["file_type"].as_mstring());
+ wszText->AppendFormat(L"%s\r\n", (tmp == "image") ? TranslateT("Image received:") : TranslateT("File received"));
+
+ tmp = data["info"]["file_name"].as_mstring();
+ if (!tmp.IsEmpty())
+ wszText->AppendFormat(L"%s: %s\r\n", TranslateT("File name"), tmp.c_str());
+
+ tmp = data["info"]["dlink"].as_mstring();
+ if (!tmp.IsEmpty())
+ wszText->AppendFormat(L"%s: %s\r\n", TranslateT("URL"), tmp.c_str());
+
+ if (data["info"]["has_previews"].as_bool()) {
+ tmp = data["previews"]["600"].as_mstring();
+ if (!tmp.IsEmpty())
+ wszText->AppendFormat(L"%s: %s\r\n", TranslateT("Preview"), tmp.c_str());
+ }
+}
+
void CIcqProto::OnGenToken(NETLIBHTTPREQUEST *pReply, AsyncHttpRequest*)
{
RobustReply root(pReply);