From 4bdaa3cc22d813fbe3fe9666e75b2991dfde5a01 Mon Sep 17 00:00:00 2001 From: Vasily Fomin Date: Thu, 29 May 2014 17:14:32 +0200 Subject: [PATCH 1/6] Add "Loaded" flag to the global settings page. --- modules/data/webadmin/tmpl/settings.tmpl | 24 +++++++++++++++ modules/webadmin.cpp | 37 ++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/modules/data/webadmin/tmpl/settings.tmpl b/modules/data/webadmin/tmpl/settings.tmpl index 65bbca0f..b1f50c39 100644 --- a/modules/data/webadmin/tmpl/settings.tmpl +++ b/modules/data/webadmin/tmpl/settings.tmpl @@ -167,6 +167,8 @@ Name Arguments Description + Loaded by networks + Loaded by users @@ -186,6 +188,28 @@ title="" /> + + + + + + + + + + + + + + + + diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 11c52842..96a759d3 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -1626,6 +1626,43 @@ public: l["Wiki"] = Info.GetWikiPage(); l["HasArgs"] = CString(Info.GetHasArgs()); l["ArgsHelpText"] = Info.GetArgsHelpText(); + + // Check if the module is loaded by all or some users and collect all available networks for future processing + vector allNetworks; + unsigned int usersWithRenderedModuleCount = 0; + const map& allUsers = CZNC::Get().GetUserMap(); + allNetworks.reserve(allUsers.size()); // Reserve for at least one network per scene + for (map::const_iterator usersIt = allUsers.begin(); usersIt != allUsers.end(); ++usersIt) { + const CUser& User = *usersIt->second; + const vector& userNetworks = User.GetNetworks(); + allNetworks.insert(allNetworks.end(), userNetworks.begin(), userNetworks.end()); + const CModules& userModules = User.GetModules(); + for (unsigned int userModuleIndex = 0; userModuleIndex < userModules.size(); ++userModuleIndex) { + const CModule* pCurModule = userModules[userModuleIndex]; + if (Info.GetName() == pCurModule->GetModName()) { + usersWithRenderedModuleCount++; + } + } + } + l["LoadedByAllUsers"] = CString(usersWithRenderedModuleCount == allUsers.size()); + const bool isLoadedBySomeUsers = (usersWithRenderedModuleCount != 0) && (usersWithRenderedModuleCount < allUsers.size()); + l["LoadedBySomeUsers"] = CString(isLoadedBySomeUsers); + + // Check if module is loaded by all or some networks + unsigned int networksWithRenderedModuleCount = 0; + for (unsigned int networkIndex = 0; networkIndex < allNetworks.size(); ++networkIndex) { + const CIRCNetwork* pCurrentNetwork = allNetworks[networkIndex]; + const CModules& networkModules = pCurrentNetwork->GetModules(); + for (unsigned int networkModuleIndex = 0; networkModuleIndex < networkModules.size(); ++networkModuleIndex) { + const CModule* pCurModule = networkModules[networkModuleIndex]; + if (Info.GetName() == pCurModule->GetModName()) { + networksWithRenderedModuleCount++; + } + } + } + l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == allNetworks.size()); + const bool isLoadedBySomeNetworks = (networksWithRenderedModuleCount != 0) && (networksWithRenderedModuleCount < allNetworks.size()); + l["LoadedBySomeNetworks"] = CString(isLoadedBySomeNetworks); } return true; From 78f7897dfcee5134005479f9cf6f4fd20dcbe8d2 Mon Sep 17 00:00:00 2001 From: Vasily Fomin Date: Thu, 29 May 2014 17:37:25 +0200 Subject: [PATCH 2/6] Add "Loaded" flag to the network page. --- modules/data/webadmin/tmpl/add_edit_network.tmpl | 12 ++++++++++++ modules/webadmin.cpp | 8 +++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/modules/data/webadmin/tmpl/add_edit_network.tmpl b/modules/data/webadmin/tmpl/add_edit_network.tmpl index ece6363a..1e84593f 100644 --- a/modules/data/webadmin/tmpl/add_edit_network.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_network.tmpl @@ -162,6 +162,8 @@ Name Arguments Description + Loaded globally + Loaded by user @@ -181,6 +183,16 @@ + + + + + + + + + + diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 96a759d3..0dce9048 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -749,9 +749,15 @@ public: if (pModule) { l["Checked"] = "true"; l["Args"] = pModule->GetArgs(); - } + } } + // Check if module is loaded globally + l["LoadedGlobally"] = CString(CZNC::Get().GetModules().FindModule(Info.GetName()) != NULL); + + // Check if module is loaded by user + l["LoadedByUser"] = CString(pUser->GetModules().FindModule(Info.GetName()) != NULL); + if (!spSession->IsAdmin() && pUser->DenyLoadMod()) { l["Disabled"] = "true"; } From 3ad285243d282270f7195c6efc8a3a7df32b9658 Mon Sep 17 00:00:00 2001 From: Vasily Fomin Date: Thu, 29 May 2014 17:49:41 +0200 Subject: [PATCH 3/6] Add "Loaded" flag to the user page. --- modules/data/webadmin/tmpl/add_edit_user.tmpl | 18 +++++++++++++++++ modules/webadmin.cpp | 20 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/modules/data/webadmin/tmpl/add_edit_user.tmpl b/modules/data/webadmin/tmpl/add_edit_user.tmpl index f410b47c..0c177bdb 100644 --- a/modules/data/webadmin/tmpl/add_edit_user.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_user.tmpl @@ -172,6 +172,8 @@ Name Arguments Description + Loaded globally + Loaded by networks @@ -191,6 +193,22 @@ + + + + + + + + + + + + + diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 0dce9048..e27a0d35 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -1225,6 +1225,26 @@ public: } } + // Check if module is loaded globally + l["LoadedGlobally"] = CString(CZNC::Get().GetModules().FindModule(Info.GetName()) != NULL); + + // Check if module is loaded by all or some networks + const vector& userNetworks = pUser->GetNetworks(); + unsigned int networksWithRenderedModuleCount = 0; + for (unsigned int networkIndex = 0; networkIndex < userNetworks.size(); ++networkIndex) { + const CIRCNetwork* pCurrentNetwork = userNetworks[networkIndex]; + const CModules& networkModules = pCurrentNetwork->GetModules(); + for (unsigned int networkModuleIndex = 0; networkModuleIndex < networkModules.size(); ++networkModuleIndex) { + const CModule* pCurModule = networkModules[networkModuleIndex]; + if (Info.GetName() == pCurModule->GetModName()) { + networksWithRenderedModuleCount++; + } + } + } + l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == userNetworks.size()); + const bool isLoadedBySomeNetworks = (networksWithRenderedModuleCount != 0) && (networksWithRenderedModuleCount < userNetworks.size()); + l["LoadedBySomeNetworks"] = CString(isLoadedBySomeNetworks); + if (!spSession->IsAdmin() && pUser && pUser->DenyLoadMod()) { l["Disabled"] = "true"; } From 16697d93ce7d17c03f0c7fb7b071b0c56cee3ec4 Mon Sep 17 00:00:00 2001 From: Vasily Fomin Date: Fri, 30 May 2014 00:13:09 +0200 Subject: [PATCH 4/6] Fixes seg fault with new user page. Refactor loops and templates so less code is needed. --- modules/data/webadmin/tmpl/add_edit_user.tmpl | 14 +-- modules/data/webadmin/tmpl/settings.tmpl | 28 +++--- modules/webadmin.cpp | 86 ++++++++----------- 3 files changed, 58 insertions(+), 70 deletions(-) diff --git a/modules/data/webadmin/tmpl/add_edit_user.tmpl b/modules/data/webadmin/tmpl/add_edit_user.tmpl index 0c177bdb..762b4e63 100644 --- a/modules/data/webadmin/tmpl/add_edit_user.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_user.tmpl @@ -199,14 +199,14 @@ - + - - - + + + diff --git a/modules/data/webadmin/tmpl/settings.tmpl b/modules/data/webadmin/tmpl/settings.tmpl index b1f50c39..dcafecc9 100644 --- a/modules/data/webadmin/tmpl/settings.tmpl +++ b/modules/data/webadmin/tmpl/settings.tmpl @@ -189,25 +189,25 @@ - + - - - + + + - + - - - + + + diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index e27a0d35..becf1853 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -749,7 +749,7 @@ public: if (pModule) { l["Checked"] = "true"; l["Args"] = pModule->GetArgs(); - } + } } // Check if module is loaded globally @@ -1215,8 +1215,21 @@ public: l["ArgsHelpText"] = Info.GetArgsHelpText(); CModule *pModule = NULL; - if (pUser) + if (pUser) { pModule = pUser->GetModules().FindModule(Info.GetName()); + // Check if module is loaded by all or some networks + const vector& userNetworks = pUser->GetNetworks(); + unsigned int networksWithRenderedModuleCount = 0; + for (unsigned int networkIndex = 0; networkIndex < userNetworks.size(); ++networkIndex) { + const CIRCNetwork* pCurrentNetwork = userNetworks[networkIndex]; + const CModules& networkModules = pCurrentNetwork->GetModules(); + if (networkModules.FindModule(Info.GetName())) { + networksWithRenderedModuleCount++; + } + } + l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == userNetworks.size()); + l["LoadedBySomeNetworks"] = CString(networksWithRenderedModuleCount != 0); + } if (pModule) { l["Checked"] = "true"; l["Args"] = pModule->GetArgs(); @@ -1228,23 +1241,6 @@ public: // Check if module is loaded globally l["LoadedGlobally"] = CString(CZNC::Get().GetModules().FindModule(Info.GetName()) != NULL); - // Check if module is loaded by all or some networks - const vector& userNetworks = pUser->GetNetworks(); - unsigned int networksWithRenderedModuleCount = 0; - for (unsigned int networkIndex = 0; networkIndex < userNetworks.size(); ++networkIndex) { - const CIRCNetwork* pCurrentNetwork = userNetworks[networkIndex]; - const CModules& networkModules = pCurrentNetwork->GetModules(); - for (unsigned int networkModuleIndex = 0; networkModuleIndex < networkModules.size(); ++networkModuleIndex) { - const CModule* pCurModule = networkModules[networkModuleIndex]; - if (Info.GetName() == pCurModule->GetModName()) { - networksWithRenderedModuleCount++; - } - } - } - l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == userNetworks.size()); - const bool isLoadedBySomeNetworks = (networksWithRenderedModuleCount != 0) && (networksWithRenderedModuleCount < userNetworks.size()); - l["LoadedBySomeNetworks"] = CString(isLoadedBySomeNetworks); - if (!spSession->IsAdmin() && pUser && pUser->DenyLoadMod()) { l["Disabled"] = "true"; } @@ -1653,42 +1649,34 @@ public: l["HasArgs"] = CString(Info.GetHasArgs()); l["ArgsHelpText"] = Info.GetArgsHelpText(); - // Check if the module is loaded by all or some users and collect all available networks for future processing - vector allNetworks; + // Check if the module is loaded by all or some users, and/or by all or some networks unsigned int usersWithRenderedModuleCount = 0; - const map& allUsers = CZNC::Get().GetUserMap(); - allNetworks.reserve(allUsers.size()); // Reserve for at least one network per scene - for (map::const_iterator usersIt = allUsers.begin(); usersIt != allUsers.end(); ++usersIt) { - const CUser& User = *usersIt->second; - const vector& userNetworks = User.GetNetworks(); - allNetworks.insert(allNetworks.end(), userNetworks.begin(), userNetworks.end()); - const CModules& userModules = User.GetModules(); - for (unsigned int userModuleIndex = 0; userModuleIndex < userModules.size(); ++userModuleIndex) { - const CModule* pCurModule = userModules[userModuleIndex]; - if (Info.GetName() == pCurModule->GetModName()) { - usersWithRenderedModuleCount++; - } - } - } - l["LoadedByAllUsers"] = CString(usersWithRenderedModuleCount == allUsers.size()); - const bool isLoadedBySomeUsers = (usersWithRenderedModuleCount != 0) && (usersWithRenderedModuleCount < allUsers.size()); - l["LoadedBySomeUsers"] = CString(isLoadedBySomeUsers); - - // Check if module is loaded by all or some networks unsigned int networksWithRenderedModuleCount = 0; - for (unsigned int networkIndex = 0; networkIndex < allNetworks.size(); ++networkIndex) { - const CIRCNetwork* pCurrentNetwork = allNetworks[networkIndex]; - const CModules& networkModules = pCurrentNetwork->GetModules(); - for (unsigned int networkModuleIndex = 0; networkModuleIndex < networkModules.size(); ++networkModuleIndex) { - const CModule* pCurModule = networkModules[networkModuleIndex]; - if (Info.GetName() == pCurModule->GetModName()) { + unsigned int networksCount = 0; + const map& allUsers = CZNC::Get().GetUserMap(); + for (map::const_iterator usersIt = allUsers.begin(); usersIt != allUsers.end(); ++usersIt) { + const CUser& User = *usersIt->second; + + // Count users which has loaded a render module + const CModules& userModules = User.GetModules(); + if (userModules.FindModule(Info.GetName())) { + usersWithRenderedModuleCount++; + } + // Count networks which has loaded a render module + const vector& userNetworks = User.GetNetworks(); + networksCount += userNetworks.size(); + for (unsigned int networkIndex = 0; networkIndex < userNetworks.size(); ++networkIndex) + { + const CIRCNetwork *pCurrentNetwork = userNetworks[networkIndex]; + if (pCurrentNetwork->GetModules().FindModule(Info.GetName())) { networksWithRenderedModuleCount++; } } } - l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == allNetworks.size()); - const bool isLoadedBySomeNetworks = (networksWithRenderedModuleCount != 0) && (networksWithRenderedModuleCount < allNetworks.size()); - l["LoadedBySomeNetworks"] = CString(isLoadedBySomeNetworks); + l["LoadedByAllUsers"] = CString(usersWithRenderedModuleCount == allUsers.size()); + l["LoadedBySomeUsers"] = CString(usersWithRenderedModuleCount != 0); + l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == networksCount); + l["LoadedBySomeNetworks"] = CString(networksWithRenderedModuleCount != 0); } return true; From 16b268deefea5dfca2d43d4c71c0077fd66fdc3e Mon Sep 17 00:00:00 2001 From: Vasily Fomin Date: Fri, 30 May 2014 22:44:26 +0200 Subject: [PATCH 5/6] Update pages template so no unnecessary global JS variable is being introduced. --- modules/data/webadmin/tmpl/add_edit_user.tmpl | 3 +-- modules/data/webadmin/tmpl/settings.tmpl | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/data/webadmin/tmpl/add_edit_user.tmpl b/modules/data/webadmin/tmpl/add_edit_user.tmpl index 762b4e63..489ef828 100644 --- a/modules/data/webadmin/tmpl/add_edit_user.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_user.tmpl @@ -203,8 +203,7 @@ diff --git a/modules/data/webadmin/tmpl/settings.tmpl b/modules/data/webadmin/tmpl/settings.tmpl index dcafecc9..f3216acd 100644 --- a/modules/data/webadmin/tmpl/settings.tmpl +++ b/modules/data/webadmin/tmpl/settings.tmpl @@ -193,8 +193,7 @@ @@ -204,8 +203,7 @@ From 4338ae5cc521a5348a4dfc9574d05cd33e12bfa0 Mon Sep 17 00:00:00 2001 From: Vasily Fomin Date: Sun, 1 Jun 2014 21:37:39 +0200 Subject: [PATCH 6/6] Show empty checkbox if module can be loaded by the topic column. Fix const correctnes of the CModInfo::SupportsType method. --- include/znc/Modules.h | 2 +- .../data/webadmin/tmpl/add_edit_network.tmpl | 16 +++++++++++---- modules/data/webadmin/tmpl/add_edit_user.tmpl | 20 +++++++++++++------ modules/data/webadmin/tmpl/settings.tmpl | 20 +++++++++++++------ modules/webadmin.cpp | 12 ++++++++--- 5 files changed, 50 insertions(+), 20 deletions(-) diff --git a/include/znc/Modules.h b/include/znc/Modules.h index 6ffa9485..ca8e1182 100644 --- a/include/znc/Modules.h +++ b/include/znc/Modules.h @@ -203,7 +203,7 @@ public: return (GetName() < Info.GetName()); } - bool SupportsType(EModuleType eType) { + bool SupportsType(EModuleType eType) const { return m_seType.find(eType) != m_seType.end(); } diff --git a/modules/data/webadmin/tmpl/add_edit_network.tmpl b/modules/data/webadmin/tmpl/add_edit_network.tmpl index 1e84593f..118f875a 100644 --- a/modules/data/webadmin/tmpl/add_edit_network.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_network.tmpl @@ -184,13 +184,21 @@ - - + + + checked="checked" + + disabled="disabled"/> - - + + + checked="checked" + + disabled="disabled"/> diff --git a/modules/data/webadmin/tmpl/add_edit_user.tmpl b/modules/data/webadmin/tmpl/add_edit_user.tmpl index 489ef828..fa0f85f2 100644 --- a/modules/data/webadmin/tmpl/add_edit_user.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_user.tmpl @@ -194,14 +194,22 @@ - - - + + + checked="checked" + + disabled="disabled"/> + - - - + + + checked="checked" + + disabled="disabled"/> + diff --git a/modules/data/webadmin/tmpl/settings.tmpl b/modules/data/webadmin/tmpl/settings.tmpl index f3216acd..a599c180 100644 --- a/modules/data/webadmin/tmpl/settings.tmpl +++ b/modules/data/webadmin/tmpl/settings.tmpl @@ -189,9 +189,13 @@ - - - + + + checked="checked" + + disabled="disabled"/> + @@ -199,9 +203,13 @@ - - - + + + checked="checked" + + disabled="disabled"/> + diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index becf1853..3ce2637f 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -753,9 +753,11 @@ public: } // Check if module is loaded globally + l["CanBeLoadedGlobally"] = CString(Info.SupportsType(CModInfo::GlobalModule)); l["LoadedGlobally"] = CString(CZNC::Get().GetModules().FindModule(Info.GetName()) != NULL); // Check if module is loaded by user + l["CanBeLoadedByUser"] = CString(Info.SupportsType(CModInfo::UserModule)); l["LoadedByUser"] = CString(pUser->GetModules().FindModule(Info.GetName()) != NULL); if (!spSession->IsAdmin() && pUser->DenyLoadMod()) { @@ -1227,6 +1229,7 @@ public: networksWithRenderedModuleCount++; } } + l["CanBeLoadedByNetwork"] = CString(Info.SupportsType(CModInfo::NetworkModule)); l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == userNetworks.size()); l["LoadedBySomeNetworks"] = CString(networksWithRenderedModuleCount != 0); } @@ -1237,7 +1240,7 @@ public: l["Disabled"] = "true"; } } - + l["CanBeLoadedGlobally"] = CString(Info.SupportsType(CModInfo::GlobalModule)); // Check if module is loaded globally l["LoadedGlobally"] = CString(CZNC::Get().GetModules().FindModule(Info.GetName()) != NULL); @@ -1673,10 +1676,13 @@ public: } } } - l["LoadedByAllUsers"] = CString(usersWithRenderedModuleCount == allUsers.size()); - l["LoadedBySomeUsers"] = CString(usersWithRenderedModuleCount != 0); + l["CanBeLoadedByNetwork"] = CString(Info.SupportsType(CModInfo::NetworkModule)); l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == networksCount); l["LoadedBySomeNetworks"] = CString(networksWithRenderedModuleCount != 0); + + l["CanBeLoadedByUser"] = CString(Info.SupportsType(CModInfo::UserModule)); + l["LoadedByAllUsers"] = CString(usersWithRenderedModuleCount == allUsers.size()); + l["LoadedBySomeUsers"] = CString(usersWithRenderedModuleCount != 0); } return true;