diff --git a/include/znc/Modules.h b/include/znc/Modules.h index 489c257a..02433e8b 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 ece6363a..118f875a 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,24 @@ + + + + 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 f410b47c..fa0f85f2 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,29 @@ + + + + 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 65bbca0f..a599c180 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,34 @@ title="" /> + + + + checked="checked" + + disabled="disabled"/> + + + + + + + + + checked="checked" + + disabled="disabled"/> + + + + + diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index 11c52842..3ce2637f 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -752,6 +752,14 @@ 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()) { l["Disabled"] = "true"; } @@ -1209,8 +1217,22 @@ 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["CanBeLoadedByNetwork"] = CString(Info.SupportsType(CModInfo::NetworkModule)); + l["LoadedByAllNetworks"] = CString(networksWithRenderedModuleCount == userNetworks.size()); + l["LoadedBySomeNetworks"] = CString(networksWithRenderedModuleCount != 0); + } if (pModule) { l["Checked"] = "true"; l["Args"] = pModule->GetArgs(); @@ -1218,6 +1240,9 @@ 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); if (!spSession->IsAdmin() && pUser && pUser->DenyLoadMod()) { l["Disabled"] = "true"; @@ -1626,6 +1651,38 @@ 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/or by all or some networks + unsigned int usersWithRenderedModuleCount = 0; + unsigned int networksWithRenderedModuleCount = 0; + 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["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;