summaryrefslogtreecommitdiff
path: root/protocols/Steam/src/steam_avatars.cpp
diff options
context:
space:
mode:
authorRobert Pösel <robyer@seznam.cz>2014-12-04 06:53:31 +0000
committerRobert Pösel <robyer@seznam.cz>2014-12-04 06:53:31 +0000
commit355f69d42075967db7f51081f9520fed3ea9a801 (patch)
tree40c96765e2c187cc0ccd13fd112f813f5f156f6d /protocols/Steam/src/steam_avatars.cpp
parent2c53355b27f4a44f2109f9a045d2f9e40cb06216 (diff)
Steam: Reworked avatars support; version bump
This result in downloading avatars only when changed and not at every login git-svn-id: http://svn.miranda-ng.org/main/trunk@11236 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Steam/src/steam_avatars.cpp')
-rw-r--r--protocols/Steam/src/steam_avatars.cpp122
1 files changed, 90 insertions, 32 deletions
diff --git a/protocols/Steam/src/steam_avatars.cpp b/protocols/Steam/src/steam_avatars.cpp
index b009e1c32d..22b80f1f26 100644
--- a/protocols/Steam/src/steam_avatars.cpp
+++ b/protocols/Steam/src/steam_avatars.cpp
@@ -1,6 +1,6 @@
#include "common.h"
-wchar_t * CSteamProto::GetAvatarFilePath(MCONTACT hContact)
+TCHAR* CSteamProto::GetAvatarFilePath(MCONTACT hContact)
{
TCHAR path[MAX_PATH];
mir_sntprintf(path, SIZEOF(path), _T("%s\\%S"), VARST(_T("%miranda_avatarcache%")), m_szModuleName);
@@ -9,36 +9,86 @@ wchar_t * CSteamProto::GetAvatarFilePath(MCONTACT hContact)
if (dwAttributes == 0xffffffff || (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
CallService(MS_UTILS_CREATEDIRTREET, 0, (LPARAM)path);
- ptrW steamId(db_get_wsa(hContact, m_szModuleName, "SteamID"));
- if (hContact != NULL)
- mir_sntprintf(path, MAX_PATH, _T("%s\\%s.jpg"), path, steamId);
- else if (steamId != NULL)
- mir_sntprintf(path, MAX_PATH, _T("%s\\%s avatar.jpg"), path, steamId);
+ ptrA steamId(getStringA(hContact, "SteamID"));
+ if (steamId != NULL)
+ mir_sntprintf(path, MAX_PATH, _T("%s\\%s.jpg"), path, _A2T(steamId));
else
return NULL;
- return mir_wstrdup(path);
+ return mir_tstrdup(path);
}
-INT_PTR CSteamProto::GetAvatarInfo(WPARAM, LPARAM lParam)
+bool CSteamProto::GetDbAvatarInfo(PROTO_AVATAR_INFORMATIONT &pai)
{
- PROTO_AVATAR_INFORMATIONW *pai = (PROTO_AVATAR_INFORMATIONW *)lParam;
+ ptrT path(GetAvatarFilePath(pai.hContact));
+ if (!path)
+ return false;
- if (ptrA(getStringA(pai->hContact, "AvatarUrl")))
+ _tcsncpy_s(pai.filename, path, _TRUNCATE);
+ pai.format = PA_FORMAT_JPEG;
+
+ return true;
+}
+
+void CSteamProto::CheckAvatarChange(MCONTACT hContact, std::string avatarUrl)
+{
+ if (avatarUrl.empty())
+ return;
+
+ // Check for avatar change
+ ptrA oldAvatarUrl(getStringA(hContact, "AvatarUrl"));
+ bool update_required = (!oldAvatarUrl || avatarUrl.compare(oldAvatarUrl));
+
+ if (update_required)
+ setString(hContact, "AvatarUrl", avatarUrl.c_str());
+
+ if (!hContact)
+ {
+ PROTO_AVATAR_INFORMATIONT pai = { sizeof(pai) };
+ if (GetAvatarInfo(update_required ? GAIF_FORCE : 0, (LPARAM)&pai) != GAIR_WAITFOR)
+ CallService(MS_AV_REPORTMYAVATARCHANGED, (WPARAM)m_szModuleName, 0);
+ }
+ else if (update_required)
+ {
+ db_set_b(hContact, "ContactPhoto", "NeedUpdate", 1);
+ ProtoBroadcastAck(hContact, ACKTYPE_AVATAR, ACKRESULT_STATUS, NULL, 0);
+ }
+}
+
+INT_PTR CSteamProto::GetAvatarInfo(WPARAM wParam, LPARAM lParam)
+{
+ if (!lParam)
return GAIR_NOAVATAR;
- ptrA steamId(getStringA(pai->hContact, "SteamID"));
- if (steamId)
+ PROTO_AVATAR_INFORMATIONT* pai = (PROTO_AVATAR_INFORMATIONT*)lParam;
+
+ ptrA avatarUrl(getStringA(pai->hContact, "AvatarUrl"));
+ if (!avatarUrl)
+ return GAIR_NOAVATAR;
+
+ if (GetDbAvatarInfo(*pai))
{
- ptrW path(GetAvatarFilePath(pai->hContact));
- if (path && !_waccess(path, 0))
+ bool fileExist = _taccess(pai->filename, 0) == 0;
+
+ bool needLoad;
+ if (pai->hContact)
+ needLoad = (wParam & GAIF_FORCE) && (!fileExist || db_get_b(pai->hContact, "ContactPhoto", "NeedUpdate", 0));
+ else
+ needLoad = (wParam & GAIF_FORCE) || !fileExist;
+
+ if (needLoad)
{
- wcsncpy(pai->filename, path, SIZEOF(pai->filename));
- pai->format = PA_FORMAT_JPEG;
- return GAIR_SUCCESS;
+ PushRequest(
+ new SteamWebApi::GetAvatarRequest(avatarUrl),
+ &CSteamProto::OnGotAvatar,
+ (void*)pai->hContact);
+
+ return GAIR_WAITFOR;
}
- }
+ else if (fileExist)
+ return GAIR_SUCCESS;
+ }
return GAIR_NOAVATAR;
}
@@ -73,14 +123,14 @@ INT_PTR CSteamProto::GetAvatarCaps(WPARAM wParam, LPARAM lParam)
// server accepts images of 32000 bytees, not bigger
return 32000;*/
- /*case AF_DELAYAFTERFAIL:
- // do not request avatar again if server gave an error
- return 1;// * 60 * 60 * 1000; // one hour*/
-
- /*case AF_FETCHIFPROTONOTVISIBLE:
+ case AF_DELAYAFTERFAIL:
+ // request avatar again in one hour if server gave an error
+ return 60 * 60 * 1000;
+
+ case AF_FETCHIFPROTONOTVISIBLE:
case AF_FETCHIFCONTACTOFFLINE:
// avatars can be fetched all the time (server only operation)
- return 1;*/
+ return 1;
}
return 0;
@@ -88,15 +138,23 @@ INT_PTR CSteamProto::GetAvatarCaps(WPARAM wParam, LPARAM lParam)
INT_PTR CSteamProto::GetMyAvatar(WPARAM wParam, LPARAM lParam)
{
- if (!wParam)
- return -2;
+ if (!wParam || !lParam)
+ return -3;
- ptrW path(GetAvatarFilePath(NULL));
- if (path && !_waccess(path, 0))
- {
- wcsncpy((wchar_t *)wParam, path, (int)lParam);
+ TCHAR* buf = (TCHAR*)wParam;
+ int size = (int)lParam;
+
+ PROTO_AVATAR_INFORMATIONT ai = { sizeof(ai) };
+ switch (GetAvatarInfo(0, (LPARAM)&ai)) {
+ case GAIR_SUCCESS:
+ _tcsncpy(buf, ai.filename, size);
+ buf[size - 1] = 0;
return 0;
- }
- return -1;
+ case GAIR_WAITFOR:
+ return -1;
+
+ default:
+ return -2;
+ }
} \ No newline at end of file