Skip to content

Commit 6f5fb9c

Browse files
committed
Allow user to pass multiple resource names to start/stop/restart (Fixes #3918)
1 parent b24ff88 commit 6f5fb9c

File tree

2 files changed

+122
-93
lines changed

2 files changed

+122
-93
lines changed

Server/mods/deathmatch/logic/CConsoleCommands.cpp

Lines changed: 119 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -62,85 +62,104 @@ static void EndConsoleOutputCapture(CClient* pClient, const SString& strIfNoOutp
6262

6363
bool CConsoleCommands::StartResource(CConsole* pConsole, const char* szArguments, CClient* pClient, CClient* pEchoClient)
6464
{
65-
SString strResponse;
65+
if (!szArguments || !szArguments[0])
66+
{
67+
pEchoClient->SendConsole("* Syntax: start <resource1> <resource2> ...");
68+
return false;
69+
}
6670

67-
if (szArguments && szArguments[0])
71+
if (pClient->GetNick())
72+
CLogger::LogPrintf("start: Requested by %s\n", GetAdminNameForLog(pClient).c_str());
73+
74+
CSplitString resourceNames(szArguments, " ");
75+
CResourceManager* resourceManager = g_pGame->GetResourceManager();
76+
77+
for (const std::string& resourceName : resourceNames)
6878
{
69-
CResource* resource = g_pGame->GetResourceManager()->GetResource(szArguments);
70-
if (resource)
79+
CResource* resource = resourceManager->GetResource(resourceName.c_str());
80+
81+
if (!resource)
7182
{
72-
if (pClient->GetNick())
73-
CLogger::LogPrintf("start: Requested by %s\n", GetAdminNameForLog(pClient).c_str());
83+
pEchoClient->SendConsole(SString("start: Resource '%s' could not be found", resourceName.c_str()));
84+
continue;
85+
}
7486

75-
if (resource->IsLoaded())
76-
{
77-
if (!resource->IsActive())
78-
{
79-
if (g_pGame->GetResourceManager()->StartResource(resource, NULL, true))
80-
{
81-
strResponse = SString("start: Resource '%s' started", szArguments);
82-
}
83-
else
84-
{
85-
strResponse = SString("start: Resource '%s' start was requested (%s)", szArguments, resource->GetFailureReason().c_str());
86-
}
87-
}
88-
else
89-
strResponse = "start: Resource is already running";
90-
}
91-
else
92-
strResponse = SString("start: Resource is loaded, but has errors (%s)", resource->GetFailureReason().c_str());
87+
if (!resource->IsLoaded())
88+
{
89+
pEchoClient->SendConsole(SString("start: Resource '%s' is loaded, but has errors (%s)", resourceName.c_str(), resource->GetFailureReason().c_str()));
90+
continue;
91+
}
92+
93+
if (resource->IsActive())
94+
{
95+
pEchoClient->SendConsole(SString("start: Resource '%s' is already running", resourceName.c_str()));
96+
continue;
97+
}
98+
99+
if (resourceManager->StartResource(resource, nullptr, true))
100+
{
101+
pEchoClient->SendConsole(SString("start: Resource '%s' started", resourceName.c_str()));
93102
}
94103
else
95-
strResponse = "start: Resource could not be found";
104+
{
105+
pEchoClient->SendConsole(SString("start: Resource '%s' start was requested (%s)", resourceName.c_str(), resource->GetFailureReason().c_str()));
106+
}
96107
}
97-
else
98-
strResponse = "* Syntax: start <resource-name>";
99108

100-
pEchoClient->SendConsole(strResponse);
101109
return true;
102110
}
103111

104112
bool CConsoleCommands::RestartResource(CConsole* pConsole, const char* szArguments, CClient* pClient, CClient* pEchoClient)
105113
{
106-
if (szArguments && szArguments[0])
114+
if (!szArguments || !szArguments[0])
107115
{
108-
CResource* resource = g_pGame->GetResourceManager()->GetResource(szArguments);
109-
if (resource)
116+
pEchoClient->SendConsole("* Syntax: restart <resource1> <resource2> ...");
117+
return false;
118+
}
119+
120+
if (pClient->GetNick())
121+
CLogger::LogPrintf("restart: Requested by %s\n", GetAdminNameForLog(pClient).c_str());
122+
123+
CSplitString resourceNames(szArguments, " ");
124+
CResourceManager* resourceManager = g_pGame->GetResourceManager();
125+
126+
for (const std::string& resourceName : resourceNames)
127+
{
128+
CResource* resource = resourceManager->GetResource(resourceName.c_str());
129+
130+
if (!resource)
110131
{
111-
if (pClient->GetNick())
112-
CLogger::LogPrintf("restart: Requested by %s\n", GetAdminNameForLog(pClient).c_str());
132+
pEchoClient->SendConsole(SString("restart: Resource '%s' could not be found", resourceName.c_str()));
133+
continue;
134+
}
113135

114-
if (resource->IsLoaded())
115-
{
116-
if (resource->IsActive())
117-
{
118-
if (resource->IsProtected())
119-
{
120-
if (!g_pGame->GetACLManager()->CanObjectUseRight(pClient->GetNick(), CAccessControlListGroupObject::OBJECT_TYPE_USER,
121-
"restart.protected", CAccessControlListRight::RIGHT_TYPE_COMMAND, false))
122-
{
123-
pEchoClient->SendConsole("restart: Resource could not be restarted as it is protected");
124-
return false;
125-
}
126-
}
136+
if (!resource->IsLoaded())
137+
{
138+
pEchoClient->SendConsole(SString("restart: Resource '%s' is loaded, but has errors (%s)", resourceName.c_str(), resource->GetFailureReason().c_str()));
139+
continue;
140+
}
127141

128-
g_pGame->GetResourceManager()->QueueResource(resource, CResourceManager::QUEUE_RESTART, NULL);
129-
pEchoClient->SendConsole("restart: Resource restarting...");
130-
}
131-
else
132-
pEchoClient->SendConsole("restart: Resource is not running");
142+
if (!resource->IsActive())
143+
{
144+
pEchoClient->SendConsole(SString("restart: Resource '%s' is not running", resourceName.c_str()));
145+
continue;
146+
}
147+
148+
if (resource->IsProtected())
149+
{
150+
if (!g_pGame->GetACLManager()->CanObjectUseRight(pClient->GetNick(), CAccessControlListGroupObject::OBJECT_TYPE_USER, "restart.protected",
151+
CAccessControlListRight::RIGHT_TYPE_COMMAND, false))
152+
{
153+
pEchoClient->SendConsole(SString("restart: Resource '%s' could not be restarted as it is protected", resourceName.c_str()));
154+
continue;
133155
}
134-
else
135-
pEchoClient->SendConsole(SString("restart: Resource is loaded, but has errors (%s)", resource->GetFailureReason().c_str()));
136156
}
137-
else
138-
pEchoClient->SendConsole("restart: Resource could not be found");
139-
return true;
157+
158+
resourceManager->QueueResource(resource, CResourceManager::QUEUE_RESTART, nullptr);
159+
pEchoClient->SendConsole(SString("restart: Resource '%s' restarting...", resourceName.c_str()));
140160
}
141-
else
142-
pEchoClient->SendConsole("* Syntax: restart <resource-name>");
143-
return false;
161+
162+
return true;
144163
}
145164

146165
bool CConsoleCommands::RefreshResources(CConsole* pConsole, const char* szArguments, CClient* pClient, CClient* pEchoClient)
@@ -195,45 +214,55 @@ bool CConsoleCommands::ResourceInfo(CConsole* pConsole, const char* szArguments,
195214

196215
bool CConsoleCommands::StopResource(CConsole* pConsole, const char* szArguments, CClient* pClient, CClient* pEchoClient)
197216
{
198-
if (szArguments && szArguments[0])
217+
if (!szArguments || !szArguments[0])
199218
{
200-
CResource* resource = g_pGame->GetResourceManager()->GetResource(szArguments);
201-
if (resource)
219+
pEchoClient->SendConsole("* Syntax: stop <resource1> <resource2> ...");
220+
return false;
221+
}
222+
223+
if (pClient->GetNick())
224+
CLogger::LogPrintf("stop: Requested by %s\n", GetAdminNameForLog(pClient).c_str());
225+
226+
CSplitString resourceNames(szArguments, " ");
227+
CResourceManager* resourceManager = g_pGame->GetResourceManager();
228+
229+
for (const std::string& resourceName : resourceNames)
230+
{
231+
CResource* resource = resourceManager->GetResource(resourceName.c_str());
232+
233+
if (!resource)
202234
{
203-
if (pClient->GetNick())
204-
CLogger::LogPrintf("stop: Requested by %s\n", GetAdminNameForLog(pClient).c_str());
235+
pEchoClient->SendConsole(SString("stop: Resource '%s' could not be found", resourceName.c_str()));
236+
continue;
237+
}
205238

206-
if (resource->IsLoaded())
207-
{
208-
if (resource->IsActive())
209-
{
210-
if (resource->IsProtected())
211-
{
212-
if (!g_pGame->GetACLManager()->CanObjectUseRight(pClient->GetNick(), CAccessControlListGroupObject::OBJECT_TYPE_USER, "stop.protected",
213-
CAccessControlListRight::RIGHT_TYPE_COMMAND, false))
214-
{
215-
pEchoClient->SendConsole("stop: Resource could not be stopped as it is protected");
216-
return false;
217-
}
218-
}
239+
if (!resource->IsLoaded())
240+
{
241+
pEchoClient->SendConsole(SString("stop: Resource '%s' is loaded, but has errors (%s)", resourceName.c_str(), resource->GetFailureReason().c_str()));
242+
continue;
243+
}
219244

220-
g_pGame->GetResourceManager()->QueueResource(resource, CResourceManager::QUEUE_STOP, NULL);
221-
pEchoClient->SendConsole("stop: Resource stopping");
222-
}
223-
else
224-
pEchoClient->SendConsole("stop: Resource is not running");
245+
if (!resource->IsActive())
246+
{
247+
pEchoClient->SendConsole(SString("stop: Resource '%s' is not running", resourceName.c_str()));
248+
continue;
249+
}
250+
251+
if (resource->IsProtected())
252+
{
253+
if (!g_pGame->GetACLManager()->CanObjectUseRight(pClient->GetNick(), CAccessControlListGroupObject::OBJECT_TYPE_USER, "stop.protected",
254+
CAccessControlListRight::RIGHT_TYPE_COMMAND, false))
255+
{
256+
pEchoClient->SendConsole(SString("stop: Resource '%s' could not be stopped as it is protected", resourceName.c_str()));
257+
continue;
225258
}
226-
else
227-
pEchoClient->SendConsole(SString("stop: Resource is loaded, but has errors (%s)", resource->GetFailureReason().c_str()));
228259
}
229-
else
230-
pEchoClient->SendConsole("stop: Resource could not be found");
231-
return true;
260+
261+
resourceManager->QueueResource(resource, CResourceManager::QUEUE_STOP, nullptr);
262+
pEchoClient->SendConsole(SString("stop: Resource '%s' stopping...", resourceName.c_str()));
232263
}
233-
else
234-
pEchoClient->SendConsole("* Syntax: stop <resource-name>");
235264

236-
return false;
265+
return true;
237266
}
238267

239268
bool CConsoleCommands::StopAllResources(CConsole* pConsole, const char* szArguments, CClient* pClient, CClient* pEchoClient)

Server/mods/deathmatch/logic/CMainConfig.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -768,10 +768,10 @@ bool CMainConfig::LoadExtended()
768768
CLogger::SetMinLogLevel(LOGLEVEL_LOW);
769769

770770
// Register the commands
771-
RegisterCommand("start", CConsoleCommands::StartResource, false, "Usage: start <resource-name>\nStart a loaded resource eg: start admin");
772-
RegisterCommand("stop", CConsoleCommands::StopResource, false, "Usage: stop <resource-name>\nStop a resource eg: stop admin");
771+
RegisterCommand("start", CConsoleCommands::StartResource, false, "Usage: start <resource1> <resource2> ...\nStart a loaded resource eg: start admin");
772+
RegisterCommand("stop", CConsoleCommands::StopResource, false, "Usage: stop <resource1> <resource2> ...\nStop a resource eg: stop admin");
773773
RegisterCommand("stopall", CConsoleCommands::StopAllResources, false, "Stop all running resources");
774-
RegisterCommand("restart", CConsoleCommands::RestartResource, false, "Usage: restart <resource-name>\nRestarts a running resource eg: restart admin");
774+
RegisterCommand("restart", CConsoleCommands::RestartResource, false, "Usage: restart <resource1> <resource2> ...\nRestarts a running resource eg: restart admin");
775775
RegisterCommand("refresh", CConsoleCommands::RefreshResources, false, "Refresh resource list to find new resources");
776776
RegisterCommand("refreshall", CConsoleCommands::RefreshAllResources, false, "Refresh resources and restart any changed resources");
777777
RegisterCommand("list", CConsoleCommands::ListResources, false, "Shows a list of resources");

0 commit comments

Comments
 (0)