summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--protocols/Steam/src/main.cpp3
-rw-r--r--protocols/Steam/src/steam_chats.cpp17
-rw-r--r--protocols/Steam/src/steam_contacts.cpp24
-rw-r--r--protocols/Steam/src/steam_menus.cpp4
-rw-r--r--protocols/Steam/src/steam_proto.cpp2
-rw-r--r--protocols/Steam/src/steam_proto.h1
-rw-r--r--src/mir_app/src/chat_clist.cpp50
7 files changed, 52 insertions, 49 deletions
diff --git a/protocols/Steam/src/main.cpp b/protocols/Steam/src/main.cpp
index db0028325e..577b55700f 100644
--- a/protocols/Steam/src/main.cpp
+++ b/protocols/Steam/src/main.cpp
@@ -176,11 +176,12 @@ void CMPlugin::InitSteamServices()
serviceHandlers[GetMyChatRoomGroups] = ServiceResponseHandler(&CSteamProto::OnGetMyChats);
serviceHandlers[GetChatHistory] = ServiceResponseHandler(&CSteamProto::OnGetChatHistory);
serviceHandlers[DeleteChatMessage] = ServiceResponseHandler(&CSteamProto::OnDoNothing);
+ serviceHandlers[LeaveChatGroup] = ServiceResponseHandler(&CSteamProto::OnDoNothing);
serviceHandlers[NotifyIncomingChatMessage] = ServiceResponseHandler(&CSteamProto::OnGetChatMessage);
serviceHandlers[NotifyAckChatMessageEcho] = ServiceResponseHandler(&CSteamProto::OnDoNothing);
serviceHandlers[NotifyModifiedChatMessage] = ServiceResponseHandler(&CSteamProto::OnDoNothing);
serviceHandlers[NotifyChatGroupUserStateChanged] = ServiceResponseHandler(&CSteamProto::OnChatChanged);
-
+
serviceHandlers[GetOwnAuthorizedDevices] = ServiceResponseHandler(&CSteamProto::OnGotDeviceList);
serviceHandlers[NotificationReceived] = ServiceResponseHandler(&CSteamProto::OnGotNotification);
diff --git a/protocols/Steam/src/steam_chats.cpp b/protocols/Steam/src/steam_chats.cpp
index b6c4663f2e..c56a34e9b1 100644
--- a/protocols/Steam/src/steam_chats.cpp
+++ b/protocols/Steam/src/steam_chats.cpp
@@ -44,7 +44,7 @@ void CSteamProto::OnGetMyChats(const CChatRoomGetMyChatRoomGroupsResponse &reply
// clean garbage
for (auto &cc : AccContacts())
- if (getByte(cc, "ChatRoom") == GCW_CHATROOM && chatIds.find(cc) == chatIds.end())
+ if (Contact::IsGroupChat(cc, m_szModuleName) == GCW_CHATROOM && chatIds.find(cc) == chatIds.end())
db_delete_contact(cc, CDF_DEL_CONTACT);
}
@@ -169,7 +169,7 @@ void CSteamProto::OnGotClanInfo(const CMsgClientClanState &reply, const CMsgProt
CMStringW wszId(FORMAT, L"%lld", reply.steamid_clan);
auto *si = Chat_Find(wszId, m_szModuleName);
if (si == nullptr) {
- si = Chat_NewSession(GCW_SERVER, m_szModuleName, wszId, Utf2T(reply.name_info->clan_name));
+ si = Chat_NewSession(GCW_SERVER, m_szModuleName, wszId, reply.name_info ? Utf2T(reply.name_info->clan_name) : wszId.c_str());
Chat_Control(si, WINDOW_HIDDEN);
Chat_Control(si, SESSION_ONLINE);
}
@@ -331,13 +331,19 @@ void CSteamProto::OnGetChatMessage(const CChatRoomIncomingChatMessageNotificatio
INT_PTR CSteamProto::SvcLeaveChat(WPARAM hContact, LPARAM)
{
CChatRoomLeaveChatRoomGroupRequest request;
- request.chat_group_id = GetId(hContact, DBKEY_STEAM_ID); request.has_chat_group_id = true;
+ if (Contact::IsGroupChat(hContact) == GCW_SERVER)
+ request.chat_group_id = GetId(hContact, DBKEY_GROUP_ID);
+ else
+ request.chat_group_id = GetId(hContact, DBKEY_STEAM_ID);
+ request.has_chat_group_id = true;
WSSendService(LeaveChatGroup, request);
return 0;
}
void CSteamProto::LeaveGroupChat(int64_t chatGroupId)
{
+ std::vector<MCONTACT> ids;
+
for (auto &cc : AccContacts()) {
if (!Contact::IsGroupChat(cc) || GetId(cc, DBKEY_STEAM_ID) != chatGroupId)
continue;
@@ -346,8 +352,11 @@ void CSteamProto::LeaveGroupChat(int64_t chatGroupId)
if (auto *si = Chat_Find(wszId, m_szModuleName))
Chat_Terminate(si);
- db_delete_contact(cc, CDF_FROM_SERVER);
+ ids.push_back(cc);
}
+
+ for (auto &cc: ids)
+ db_delete_contact(cc, CDF_FROM_SERVER);
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/protocols/Steam/src/steam_contacts.cpp b/protocols/Steam/src/steam_contacts.cpp
index 462bd6cb1f..7cb747e244 100644
--- a/protocols/Steam/src/steam_contacts.cpp
+++ b/protocols/Steam/src/steam_contacts.cpp
@@ -98,7 +98,17 @@ void CSteamProto::OnGotFriendInfo(const CMsgClientPersonaState &reply, const CMs
}
// set name
- if (!F->clan_data) {
+ if (auto *cd = F->clan_data) {
+ if (F->player_name)
+ setUString(hContact, "Nick", "Server: " + CMStringA(F->player_name));
+
+ setByte(hContact, "ChatRoom", GCW_SERVER);
+ if (cd->has_chat_group_id)
+ SetId(hContact, DBKEY_GROUP_ID, cd->chat_group_id);
+ else
+ delSetting(hContact, DBKEY_GROUP_ID);
+ }
+ else {
if (F->player_name) {
CMStringW realName(Utf2T(F->player_name));
@@ -225,18 +235,6 @@ void CSteamProto::OnGotFriendInfo(const CMsgClientPersonaState &reply, const CMs
SetContactExtraIcon(hContact, NULL);
}
-
- // clan information
- if (auto *cd = F->clan_data) {
- if (F->player_name)
- setUString(hContact, "Nick", F->player_name);
-
- setByte(hContact, "ChatRoom", GCW_SERVER);
- if (cd->has_chat_group_id)
- SetId(hContact, DBKEY_CHAT_ID, cd->chat_group_id);
- else
- delSetting(hContact, DBKEY_CHAT_ID);
- }
}
}
diff --git a/protocols/Steam/src/steam_menus.cpp b/protocols/Steam/src/steam_menus.cpp
index a1b5df2edc..c5bc24e395 100644
--- a/protocols/Steam/src/steam_menus.cpp
+++ b/protocols/Steam/src/steam_menus.cpp
@@ -38,8 +38,8 @@ INT_PTR CSteamProto::JoinGameCommand(WPARAM hContact, LPARAM)
INT_PTR CSteamProto::JoinChatCommand(WPARAM hContact, LPARAM)
{
CChatRoomJoinChatRoomGroupRequest request;
- request.chat_group_id = GetId(hContact, DBKEY_STEAM_ID); request.has_chat_group_id = true;
- request.chat_id = getDword(hContact, DBKEY_CHAT_ID); request.has_chat_id = true;
+ request.chat_group_id = GetId(hContact, DBKEY_GROUP_ID); request.has_chat_group_id = true;
+ // request.chat_id = getDword(hContact, DBKEY_CHAT_ID); request.has_chat_id = true;
WSSendService(JoinChatRoomGroup, request);
return 0;
}
diff --git a/protocols/Steam/src/steam_proto.cpp b/protocols/Steam/src/steam_proto.cpp
index 442fd8cfee..7952a237a4 100644
--- a/protocols/Steam/src/steam_proto.cpp
+++ b/protocols/Steam/src/steam_proto.cpp
@@ -300,7 +300,7 @@ bool CSteamProto::OnContactDeleted(MCONTACT hContact, uint32_t flags)
if (flags & CDF_FROM_SERVER)
return true;
- if (Contact::IsGroupChat(hContact))
+ if (Contact::IsGroupChat(hContact) == GCW_CHATROOM)
SvcLeaveChat(hContact, 0);
else if (!getByte(hContact, "Auth")) // remove only authorized contacts
SendUserRemoveRequest(hContact);
diff --git a/protocols/Steam/src/steam_proto.h b/protocols/Steam/src/steam_proto.h
index f28bc41407..977f985ab4 100644
--- a/protocols/Steam/src/steam_proto.h
+++ b/protocols/Steam/src/steam_proto.h
@@ -15,6 +15,7 @@
#define DBKEY_CLIENT_ID "ClientID"
#define DBKEY_STEAM_ID "SteamID"
#define DBKEY_CHAT_ID "ChatId"
+#define DBKEY_GROUP_ID "GroupId"
#define DBKEY_ACCOUNT_NAME "Username"
// Steam services
diff --git a/src/mir_app/src/chat_clist.cpp b/src/mir_app/src/chat_clist.cpp
index 6e90497932..8faf99d478 100644
--- a/src/mir_app/src/chat_clist.cpp
+++ b/src/mir_app/src/chat_clist.cpp
@@ -25,9 +25,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
static MCONTACT FindRoom(const char *pszModule, const wchar_t *pszRoom)
{
for (auto &hContact : Contacts(pszModule)) {
- if (!Contact::IsGroupChat(hContact, pszModule))
- continue;
-
ptrW roomid(Contact::GetInfo(CNF_UNIQUEID, hContact, pszModule));
if (roomid != nullptr && !mir_wstrcmpi(roomid, pszRoom))
return hContact;
@@ -49,36 +46,33 @@ MCONTACT AddRoom(const char *pszModule, const wchar_t *pszRoom, const wchar_t *p
if (!mir_wstrlen(pwszOldGroup))
Clist_SetGroup(hContact, wszGroup);
}
-
- db_set_w(hContact, pszModule, "Status", ID_STATUS_OFFLINE);
- db_set_ws(hContact, pszModule, "Nick", pszDisplayName);
- return hContact;
}
+ else {
+ // here we create a new one since no one is to be found
+ if ((hContact = db_add_contact()) == 0)
+ return 0;
- // here we create a new one since no one is to be found
- if ((hContact = db_add_contact()) == 0)
- return 0;
-
- Proto_AddToContact(hContact, pszModule);
+ Proto_AddToContact(hContact, pszModule);
- // create the 'Chat rooms' group only if needed
- if (bNeedGroup) {
- MGROUP hGroup = Clist_GroupExists(wszGroup);
- if (hGroup == 0) {
- hGroup = Clist_GroupCreate(0, wszGroup);
- if (hGroup)
- Clist_GroupSetExpanded(hGroup, 1);
+ // create the 'Chat rooms' group only if needed
+ if (bNeedGroup) {
+ MGROUP hGroup = Clist_GroupExists(wszGroup);
+ if (hGroup == 0) {
+ hGroup = Clist_GroupCreate(0, wszGroup);
+ if (hGroup)
+ Clist_GroupSetExpanded(hGroup, 1);
+ }
+
+ Clist_SetGroup(hContact, wszGroup);
}
- Clist_SetGroup(hContact, wszGroup);
- }
-
- if (auto *pa = Proto_GetAccount(pszModule)) {
- if (MBaseProto *pd = g_arProtos.find((MBaseProto *)&pa->szProtoName)) {
- if (pd->iUniqueIdType == DBVT_DWORD)
- db_set_dw(hContact, pszModule, pd->szUniqueId, _wtoi(pszRoom));
- else
- db_set_ws(hContact, pszModule, pd->szUniqueId, pszRoom);
+ if (auto *pa = Proto_GetAccount(pszModule)) {
+ if (MBaseProto *pd = g_arProtos.find((MBaseProto *)&pa->szProtoName)) {
+ if (pd->iUniqueIdType == DBVT_DWORD)
+ db_set_dw(hContact, pszModule, pd->szUniqueId, _wtoi(pszRoom));
+ else
+ db_set_ws(hContact, pszModule, pd->szUniqueId, pszRoom);
+ }
}
}