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 @@
ENDIF ?>
VAR Description ?> |
+
+ IF CanBeLoadedGlobally ?>
+
+ checked="checked"
+ ENDIF ?>
+ disabled="disabled"/>
+ ENDIF ?>
+ |
+
+ IF CanBeLoadedByUser ?>
+
+ checked="checked"
+ ENDIF ?>
+ disabled="disabled"/>
+ ENDIF ?>
+ |
ENDLOOP ?>
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 @@
ENDIF ?>
VAR Description ?> |
+
+ IF CanBeLoadedGlobally ?>
+
+ checked="checked"
+ ENDIF ?>
+ disabled="disabled"/>
+ ENDIF ?>
+ |
+
+ IF CanBeLoadedByNetwork ?>
+
+ checked="checked"
+ ENDIF ?>
+ disabled="disabled"/>
+ IF LoadedBySomeNetworks && !LoadedByAllNetworks ?>
+
+ ENDIF ?>
+ ENDIF ?>
+ |
ENDLOOP ?>
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 @@
IF ArgsHelpText ?> title=" VAR ArgsHelpText ?>" ENDIF ?> />
VAR Description ?> |
+
+ IF CanBeLoadedByNetwork ?>
+
+ checked="checked"
+ ENDIF ?>
+ disabled="disabled"/>
+ IF LoadedBySomeNetworks && !LoadedByAllNetworks ?>
+
+ ENDIF ?>
+ ENDIF ?>
+ |
+
+ IF CanBeLoadedByUser ?>
+
+ checked="checked"
+ ENDIF ?>
+ disabled="disabled"/>
+ IF LoadedBySomeUsers && !LoadedByAllUsers ?>
+
+ ENDIF ?>
+ ENDIF ?>
+ |
ENDLOOP ?>
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;