diff options
author | George Hazan <ghazan@miranda.im> | 2018-10-27 20:32:44 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2018-10-27 20:32:44 +0300 |
commit | 60abc2fbd6fc10083e821340f9edc3593de5637e (patch) | |
tree | 6c7851c199c28938e88863de5db31297bffbe104 | |
parent | d5931de04d23f15930e915bc03fe59a127cc5f16 (diff) |
Discord: list of guild's channels separated for each guild
-rw-r--r-- | protocols/Discord/src/dispatch.cpp | 12 | ||||
-rw-r--r-- | protocols/Discord/src/groupchat.cpp | 2 | ||||
-rw-r--r-- | protocols/Discord/src/guilds.cpp | 24 | ||||
-rw-r--r-- | protocols/Discord/src/proto.h | 5 |
4 files changed, 30 insertions, 13 deletions
diff --git a/protocols/Discord/src/dispatch.cpp b/protocols/Discord/src/dispatch.cpp index bca40644a2..002f45fb36 100644 --- a/protocols/Discord/src/dispatch.cpp +++ b/protocols/Discord/src/dispatch.cpp @@ -194,7 +194,7 @@ void CDiscordProto::OnCommandGuildDeleted(const JSONNode &pRoot) auto T = arUsers.rev_iter(); for (auto &it : T) - if (it->guildId == pGuild->id) { + if (it->pGuild == pGuild) { Chat_Terminate(m_szModuleName, it->wszUsername, true); arUsers.remove(T.indexOf(&it)); } @@ -220,7 +220,7 @@ void CDiscordProto::OnCommandGuildMemberRemoved(const JSONNode &pRoot) CMStringW wszUserId = pRoot["user"]["id"].as_mstring(); for (auto &pUser : arUsers) { - if (pUser->guildId != pGuild->id) + if (pUser->pGuild != pGuild) continue; GCEVENT gce = { m_szModuleName, pUser->wszUsername, GC_EVENT_PART }; @@ -246,7 +246,7 @@ void CDiscordProto::OnCommandGuildMemberUpdated(const JSONNode &pRoot) gm->wszNick = pRoot["user"]["username"].as_mstring() + L"#" + pRoot["user"]["discriminator"].as_mstring(); for (auto &it : arUsers) { - if (it->guildId != pGuild->id) + if (it->pGuild != pGuild) continue; CMStringW wszOldNick; @@ -295,7 +295,7 @@ void CDiscordProto::OnCommandRoleDeleted(const JSONNode &pRoot) it->position--; for (auto &it : arUsers) { - if (it->guildId != pGuild->id) + if (it->pGuild != pGuild) continue; SESSION_INFO *si = g_chatApi.SM_FindSession(it->wszUsername, m_szModuleName); @@ -368,9 +368,9 @@ void CDiscordProto::OnCommandMessage(const JSONNode &pRoot) return; } - CDiscordGuild *pGuild = FindGuild(pUser->guildId); + CDiscordGuild *pGuild = pUser->pGuild; if (pGuild == nullptr) { - debugLogA("message to unknown guild %lld ignored", pUser->guildId); + debugLogA("message to unknown guild ignored"); return; } diff --git a/protocols/Discord/src/groupchat.cpp b/protocols/Discord/src/groupchat.cpp index 942100d58a..d8ac8eb4dc 100644 --- a/protocols/Discord/src/groupchat.cpp +++ b/protocols/Discord/src/groupchat.cpp @@ -140,7 +140,7 @@ void CDiscordProto::Chat_ProcessLogMenu(GCHOOK *gch) es.recentCount = 5; if (EnterString(&es)) { JSONNode root; root << WCHAR_PARAM("nick", es.ptszResult); - CMStringA szUrl(FORMAT, "/guilds/%lld/members/@me/nick", pUser->guildId); + CMStringA szUrl(FORMAT, "/guilds/%lld/members/@me/nick", pUser->pGuild->id); Push(new AsyncHttpRequest(this, REQUEST_PATCH, szUrl, nullptr, &root)); mir_free(es.ptszResult); } diff --git a/protocols/Discord/src/guilds.cpp b/protocols/Discord/src/guilds.cpp index 751ecf54da..c494d141ac 100644 --- a/protocols/Discord/src/guilds.cpp +++ b/protocols/Discord/src/guilds.cpp @@ -17,6 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include "stdafx.h" +int compareUsers(const CDiscordUser *p1, const CDiscordUser *p2); + static int compareRoles(const CDiscordRole *p1, const CDiscordRole *p2) { return compareInt64(p1->id, p2->id); @@ -29,6 +31,7 @@ static int compareChatUsers(const CDiscordGuildMember *p1, const CDiscordGuildMe CDiscordGuild::CDiscordGuild(SnowFlake _id) : id(_id), + arChannels(10, compareUsers), arChatUsers(30, compareChatUsers), arRoles(10, compareRoles) { @@ -38,6 +41,12 @@ CDiscordGuild::~CDiscordGuild() { } +CDiscordUser::~CDiscordUser() +{ + if (pGuild != nullptr) + pGuild->arChannels.remove(this); +} + ///////////////////////////////////////////////////////////////////////////////////////// // reads a role from json @@ -70,8 +79,8 @@ void CDiscordProto::BatchChatCreate(void *param) { CDiscordGuild *pGuild = (CDiscordGuild*)param; - for (auto &it : arUsers) - if (it->guildId == pGuild->id && !it->bIsPrivate) + for (auto &it : pGuild->arChannels) + if (!it->bIsPrivate) CreateChat(pGuild, it); } @@ -161,6 +170,7 @@ CDiscordUser* CDiscordProto::ProcessGuildChannel(CDiscordGuild *pGuild, const JS pUser->channelId = channelId; pUser->bIsGroup = true; arUsers.insert(pUser); + pGuild->arChannels.insert(pUser); MGROUP grpId = Clist_GroupCreate(pGuild->groupId, wszName); pUser->wszChannelName = Clist_GroupGetName(grpId); @@ -176,10 +186,14 @@ CDiscordUser* CDiscordProto::ProcessGuildChannel(CDiscordGuild *pGuild, const JS pUser->channelId = channelId; arUsers.insert(pUser); } + + if (pGuild->arChannels.find(pUser) == nullptr) + pGuild->arChannels.insert(pUser); + pUser->wszUsername = wszChannelId; pUser->wszChannelName = L"#" + wszName; pUser->wszTopic = pch["topic"].as_mstring(); - pUser->guildId = pGuild->id; + pUser->pGuild = pGuild; pUser->lastMsg = CDiscordMessage(::getId(pch["last_message_id"])); pUser->parentId = _wtoi64(pch["parent_id"].as_mstring()); @@ -273,8 +287,8 @@ void CDiscordProto::ParseGuildContents(CDiscordGuild *pGuild, const JSONNode &pR AddGuildUser(pGuild, *pm); // retrieve missing histories - for (auto &it : arUsers) { - if (it->bIsPrivate || it->guildId != pGuild->id) + for (auto &it : pGuild->arChannels) { + if (it->bIsPrivate) continue; SnowFlake oldMsgId = getId(it->hContact, DB_KEY_LASTMSGID); diff --git a/protocols/Discord/src/proto.h b/protocols/Discord/src/proto.h index 7f31402a2a..debd6db7e7 100644 --- a/protocols/Discord/src/proto.h +++ b/protocols/Discord/src/proto.h @@ -79,16 +79,18 @@ struct CDiscordUser : public MZeroedObject id(_id) {} + ~CDiscordUser(); + SnowFlake id; MCONTACT hContact; - SnowFlake guildId; SnowFlake channelId; SnowFlake lastReadId; SnowFlake parentId; bool bIsPrivate; bool bIsGroup; + struct CDiscordGuild *pGuild; CDiscordMessage lastMsg; CMStringW wszUsername, wszChannelName, wszTopic; @@ -125,6 +127,7 @@ struct CDiscordGuild : public MZeroedObject CMStringW wszName; MCONTACT hContact; MGROUP groupId; + LIST<CDiscordUser> arChannels; GCSessionInfoBase *pParentSi; OBJLIST<CDiscordGuildMember> arChatUsers; |