summaryrefslogtreecommitdiff
path: root/protocols/Steam/src
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2023-06-14 15:19:46 +0300
committerGeorge Hazan <george.hazan@gmail.com>2023-06-14 15:19:50 +0300
commit6ef86b18b0e29e142868bc6a86621c50390e3b79 (patch)
tree51348e15ebc482fc8c888b6b569d9bd0bb83af69 /protocols/Steam/src
parent9491ceb3134992b895cfb86d5d99bb2a0eb66121 (diff)
Steam: we don't need polling anymore
Diffstat (limited to 'protocols/Steam/src')
-rw-r--r--protocols/Steam/src/steam_login.cpp5
-rw-r--r--protocols/Steam/src/steam_polling.cpp240
-rw-r--r--protocols/Steam/src/steam_proto.h7
3 files changed, 1 insertions, 251 deletions
diff --git a/protocols/Steam/src/steam_login.cpp b/protocols/Steam/src/steam_login.cpp
index 9e7e998610..bd6e738e54 100644
--- a/protocols/Steam/src/steam_login.cpp
+++ b/protocols/Steam/src/steam_login.cpp
@@ -2,7 +2,7 @@
bool CSteamProto::IsOnline()
{
- return m_iStatus > ID_STATUS_OFFLINE && m_hPollingThread;
+ return m_iStatus > ID_STATUS_OFFLINE;
}
bool CSteamProto::IsMe(const char *steamId)
@@ -360,9 +360,6 @@ void CSteamProto::OnLoggedOn(const HttpResponse &response, void *)
// go to online now
ProtoBroadcastAck(NULL, ACKTYPE_STATUS, ACKRESULT_SUCCESS, (HANDLE)ID_STATUS_CONNECTING, m_iStatus = m_iDesiredStatus);
-
- // start polling thread
- m_hPollingThread = ForkThreadEx(&CSteamProto::PollingThread, nullptr, nullptr);
}
void CSteamProto::OnReLogin(const JSONNode &root, void*)
diff --git a/protocols/Steam/src/steam_polling.cpp b/protocols/Steam/src/steam_polling.cpp
deleted file mode 100644
index 3b526975b5..0000000000
--- a/protocols/Steam/src/steam_polling.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-#include "stdafx.h"
-
-void CSteamProto::ParsePollData(const JSONNode &data)
-{
- std::string steamIds;
-
- for (auto &item : data) {
- json_string steamId = item["steamid_from"].as_string();
- json_string type = item["type"].as_string();
- time_t timestamp = _wtol(item["utc_timestamp"].as_mstring());
-
- bool bIsMe = IsMe(steamId.c_str());
- MCONTACT hContact;
- if (!bIsMe) {
- hContact = GetContact(steamId.c_str());
- if (hContact == 0)
- continue;
- }
- else hContact = 0;
-
- if (type == "personarelationship") {
- PersonaRelationshipAction state = (PersonaRelationshipAction)item["persona_state"].as_int();
- switch (state) {
- case PersonaRelationshipAction::Remove:
- if (hContact)
- ContactIsRemoved(hContact);
- break;
-
- case PersonaRelationshipAction::Ignore:
- if (hContact)
- ContactIsBlocked(hContact);
- break;
-
- case PersonaRelationshipAction::AuthRequest:
- hContact = AddContact(steamId.c_str());
- if (hContact)
- ContactIsAskingAuth(hContact);
- break;
-
- case PersonaRelationshipAction::AuthRequested:
- if (hContact)
- ContactIsFriend(hContact);
- break;
- }
- continue;
- }
-
- // probably this is a packet from random player playing on the same server, so we ignore it
- if (!bIsMe && !hContact)
- continue;
-
- if (type == "my_saytext" || type =="my_emote") {
- json_string text = item["text"].as_string();
-
- if (timestamp > getDword(hContact, DB_KEY_LASTMSGTS))
- setDword(hContact, DB_KEY_LASTMSGTS, timestamp);
-
- PROTORECVEVENT recv = { 0 };
- recv.timestamp = timestamp;
- recv.szMessage = (char*)text.c_str();
- recv.flags = PREF_SENT;
- RecvMsg(hContact, &recv);
- continue;
- }
-
- if (type == "saytext" || type == "emote") {
- json_string text = item["text"].as_string();
-
- if (timestamp > getDword(hContact, DB_KEY_LASTMSGTS))
- setDword(hContact, DB_KEY_LASTMSGTS, timestamp);
-
- PROTORECVEVENT recv = { 0 };
- recv.timestamp = timestamp;
- recv.szMessage = (char*)text.c_str();
- ProtoChainRecvMsg(hContact, &recv);
-
- CallService(MS_PROTO_CONTACTISTYPING, hContact, (LPARAM)PROTOTYPE_CONTACTTYPING_OFF);
- m_typingTimestamps[steamId] = 0;
- continue;
- }
-
- if (type == "typing") {
- auto it = m_typingTimestamps.find(steamId);
- if (it != m_typingTimestamps.end()) {
- if ((timestamp - it->second) < STEAM_TYPING_TIME)
- continue;
- }
- CallService(MS_PROTO_CONTACTISTYPING, hContact, (LPARAM)STEAM_TYPING_TIME);
- m_typingTimestamps[steamId] = timestamp;
- continue;
- }
-
- if (type == "personastate") {
- if (!IsMe(steamId.c_str())) {
- // there no sense to change own status
- const JSONNode &node = item["persona_state"];
- if (node) {
- int status = SteamToMirandaStatus((PersonaState)node.as_int());
- SetContactStatus(hContact, status);
- }
- }
- steamIds.append(steamId).append(",");
- continue;
- }
-
- if (type == "leftconversation") {
- if (!getBool("ShowChatEvents", true))
- continue;
-
- uint8_t bEventType = STEAM_DB_EVENT_CHATSTATES_GONE;
- DBEVENTINFO dbei = {};
- dbei.pBlob = &bEventType;
- dbei.cbBlob = 1;
- dbei.eventType = EVENTTYPE_STEAM_CHATSTATES;
- dbei.flags = DBEF_READ;
- dbei.timestamp = now();
- dbei.szModule = m_szModuleName;
- db_event_add(hContact, &dbei);
- continue;
- }
-
- debugLogA(__FUNCTION__ ": Unknown event type \"%s\"", type.c_str());
- }
-
- if (!steamIds.empty()) {
- steamIds.pop_back();
- PushRequest(new GetUserSummariesRequest(this, steamIds.c_str()), &CSteamProto::OnGotUserSummaries);
- }
-}
-
-struct PollParam
-{
- int errors;
- int errorsLimit;
-};
-
-void CSteamProto::OnGotPoll(const HttpResponse &response, void *arg)
-{
- PollParam *param = (PollParam*)arg;
- if (!response) {
- // bad response
- debugLogA(__FUNCTION__ ": server returns bad response (%d)", response.GetStatusCode());
- param->errors++;
- Sleep(STEAM_API_TIMEOUT * 1000);
- return;
- }
-
- // handling of known errors
- if (!response.IsSuccess()) {
- switch (response.GetStatusCode()) {
- case HTTP_CODE_SERVICE_UNAVAILABLE:
- // server on maintenance
- SetAllContactStatuses(ID_STATUS_OFFLINE);
- Sleep(STEAM_API_TIMEOUT * 1000);
- return;
-
- case HTTP_CODE_UNAUTHORIZED:
- // token has expired
- debugLogA(__FUNCTION__ ": access is denied");
- delSetting("TokenSecret");
- param->errors = param->errorsLimit;
- return;
-
- default:
- debugLogA(__FUNCTION__ ": server returns unexpected status code (%d)", response.GetStatusCode());
- param->errors++;
- Sleep(STEAM_API_TIMEOUT * 1000);
- return;
- }
- }
-
- JSONNode root = JSONNode::parse(response.Content);
- if (!root) {
- debugLogA(__FUNCTION__ ": could not recognize a response");
- param->errors++;
- return;
- }
-
- json_string error = root["error"].as_string();
- if (error == "Timeout") {
- // too low timeout?
- int timeout = root["sectimeout"].as_int();
- if (timeout < STEAM_API_TIMEOUT) {
- debugLogA(__FUNCTION__ ": Timeout is too low (%d)", timeout);
- // perhaps it will break connection
- Sleep(STEAM_API_TIMEOUT * 1000);
- }
-
- // do nothing as this is not necessarily an error
- return;
- }
-
- if (error == "OK") {
- long messageId = root["messagelast"].as_int();
- setDword("MessageID", messageId);
-
- ParsePollData(root["messages"]);
-
- // Reset error counter only when we've got OK
- param->errors = 0;
- return;
- }
-
- if (error == "Not Logged On") {
- // need to relogin
- debugLogA(__FUNCTION__ ": not logged on");
- param->errors = param->errorsLimit;
- // try to reconnect only when we're actually online (during normal logout we will still got this error anyway, but in that case our status is already offline)
- if (IsOnline()) {
- ptrA token(getStringA("TokenSecret"));
- SendRequest(new LogonRequest(token), &CSteamProto::OnReLogin);
- }
- return;
- }
-
- // something wrong
- debugLogA(__FUNCTION__ ": %s (%d)", error.c_str(), response.GetStatusCode());
-
- // let it jump out of further processing
- param->errors = param->errorsLimit;
-}
-
-void CSteamProto::PollingThread(void*)
-{
- debugLogA(__FUNCTION__ ": entering");
-
- PollParam param;
- param.errors = 0;
- param.errorsLimit = getByte("PollingErrorsLimit", STEAM_API_POLLING_ERRORS_LIMIT);
- while (IsOnline() && param.errors < param.errorsLimit)
- SendRequest(new PollRequest(this), &CSteamProto::OnGotPoll, &param);
-
- if (IsOnline()) {
- debugLogA(__FUNCTION__ ": unexpected termination; switching protocol to offline");
- SetStatus(ID_STATUS_OFFLINE);
- }
-
- m_hPollingThread = nullptr;
- debugLogA(__FUNCTION__ ": leaving");
-}
diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h
index b6605e50e3..8d90fef211 100644
--- a/protocols/Steam/src/steam_proto.h
+++ b/protocols/Steam/src/steam_proto.h
@@ -71,13 +71,11 @@ class CSteamProto : public PROTO<CSteamProto>
LIST<RequestQueueItem> m_requestQueue;
// polling
- HANDLE m_hPollingThread;
ULONG hAuthProcess;
ULONG hMessageProcess;
mir_cs m_addContactLock;
mir_cs m_setStatusLock;
std::map<HANDLE, time_t> m_mpOutMessages;
- std::map<std::string, time_t> m_typingTimestamps;
public:
// PROTO_INTERFACE
@@ -125,11 +123,6 @@ protected:
void ProcessRequestQueue();
void __cdecl RequestQueueThread(void*);
- // pooling
- void ParsePollData(const JSONNode &data);
- void OnGotPoll(const HttpResponse &response, void *arg);
- void __cdecl PollingThread(void*);
-
// login
bool IsOnline();
bool IsMe(const char *steamId);