Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
241 / 241
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
ServerProtocols
100.00% covered (success)
100.00%
241 / 241
100.00% covered (success)
100.00%
3 / 3
3
100.00% covered (success)
100.00%
1 / 1
 getProtocolsMap
100.00% covered (success)
100.00%
237 / 237
100.00% covered (success)
100.00%
1 / 1
1
 getSupportedProtocols
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getProtocolClass
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php declare(strict_types=1);
2
3/**
4 * Clansuite Server Query
5 *
6 * SPDX-FileCopyrightText: 2003-2025 Jens A. Koch
7 * SPDX-License-Identifier: MIT
8 *
9 * For the full copyright and license information, please view
10 * the LICENSE file that was distributed with this source code.
11 */
12
13namespace Clansuite\ServerQuery;
14
15use function array_keys;
16use Clansuite\ServerQuery\ServerProtocols\AgeOfTime;
17use Clansuite\ServerQuery\ServerProtocols\ArkSurvivalEvolved;
18use Clansuite\ServerQuery\ServerProtocols\Arma;
19use Clansuite\ServerQuery\ServerProtocols\Arma3;
20use Clansuite\ServerQuery\ServerProtocols\ArmaReforger;
21use Clansuite\ServerQuery\ServerProtocols\Battlefield4;
22use Clansuite\ServerQuery\ServerProtocols\Bc2;
23use Clansuite\ServerQuery\ServerProtocols\Bf1942;
24use Clansuite\ServerQuery\ServerProtocols\Bf2;
25use Clansuite\ServerQuery\ServerProtocols\Bf3;
26use Clansuite\ServerQuery\ServerProtocols\Blackops;
27use Clansuite\ServerQuery\ServerProtocols\Blackopsmac;
28use Clansuite\ServerQuery\ServerProtocols\Blockland;
29use Clansuite\ServerQuery\ServerProtocols\Brink;
30use Clansuite\ServerQuery\ServerProtocols\Bt;
31use Clansuite\ServerQuery\ServerProtocols\Cod4;
32use Clansuite\ServerQuery\ServerProtocols\Conan;
33use Clansuite\ServerQuery\ServerProtocols\CounterStrike16;
34use Clansuite\ServerQuery\ServerProtocols\CounterStrikeSource;
35use Clansuite\ServerQuery\ServerProtocols\Cs2;
36use Clansuite\ServerQuery\ServerProtocols\Csgo;
37use Clansuite\ServerQuery\ServerProtocols\Cube;
38use Clansuite\ServerQuery\ServerProtocols\DayOfDefeatSource;
39use Clansuite\ServerQuery\ServerProtocols\Dayz;
40use Clansuite\ServerQuery\ServerProtocols\Dayzmod;
41use Clansuite\ServerQuery\ServerProtocols\Ddnet;
42use Clansuite\ServerQuery\ServerProtocols\Deadside;
43use Clansuite\ServerQuery\ServerProtocols\DontStarveTogether;
44use Clansuite\ServerQuery\ServerProtocols\Doom3;
45use Clansuite\ServerQuery\ServerProtocols\Eco;
46use Clansuite\ServerQuery\ServerProtocols\Et;
47use Clansuite\ServerQuery\ServerProtocols\Etqw;
48use Clansuite\ServerQuery\ServerProtocols\Factorio;
49use Clansuite\ServerQuery\ServerProtocols\FarmingSimulator;
50use Clansuite\ServerQuery\ServerProtocols\Fear;
51use Clansuite\ServerQuery\ServerProtocols\Ffow;
52use Clansuite\ServerQuery\ServerProtocols\Gamespy2;
53use Clansuite\ServerQuery\ServerProtocols\Gmod;
54use Clansuite\ServerQuery\ServerProtocols\GtaMta;
55use Clansuite\ServerQuery\ServerProtocols\Halflife;
56use Clansuite\ServerQuery\ServerProtocols\Halflife2;
57use Clansuite\ServerQuery\ServerProtocols\Halo;
58use Clansuite\ServerQuery\ServerProtocols\Hl2zp;
59use Clansuite\ServerQuery\ServerProtocols\Homefront;
60use Clansuite\ServerQuery\ServerProtocols\Ins;
61use Clansuite\ServerQuery\ServerProtocols\Jc2;
62use Clansuite\ServerQuery\ServerProtocols\Kf2;
63use Clansuite\ServerQuery\ServerProtocols\KillingFloor;
64use Clansuite\ServerQuery\ServerProtocols\L4d;
65use Clansuite\ServerQuery\ServerProtocols\L4d2;
66use Clansuite\ServerQuery\ServerProtocols\Lifyo;
67use Clansuite\ServerQuery\ServerProtocols\Minecraft;
68use Clansuite\ServerQuery\ServerProtocols\Minecraftpe;
69use Clansuite\ServerQuery\ServerProtocols\Miscreated;
70use Clansuite\ServerQuery\ServerProtocols\Moh;
71use Clansuite\ServerQuery\ServerProtocols\Mohw;
72use Clansuite\ServerQuery\ServerProtocols\Ns2;
73use Clansuite\ServerQuery\ServerProtocols\Pixark;
74use Clansuite\ServerQuery\ServerProtocols\Quake;
75use Clansuite\ServerQuery\ServerProtocols\Quake2;
76use Clansuite\ServerQuery\ServerProtocols\Quake3Arena;
77use Clansuite\ServerQuery\ServerProtocols\Quake4;
78use Clansuite\ServerQuery\ServerProtocols\QuakeLive;
79use Clansuite\ServerQuery\ServerProtocols\Ravaged;
80use Clansuite\ServerQuery\ServerProtocols\Ro2;
81use Clansuite\ServerQuery\ServerProtocols\Ror;
82use Clansuite\ServerQuery\ServerProtocols\Rordh;
83use Clansuite\ServerQuery\ServerProtocols\Rust;
84use Clansuite\ServerQuery\ServerProtocols\Samp;
85use Clansuite\ServerQuery\ServerProtocols\ScpSecretLaboratory;
86use Clansuite\ServerQuery\ServerProtocols\Scum;
87use Clansuite\ServerQuery\ServerProtocols\Skulltag;
88use Clansuite\ServerQuery\ServerProtocols\SniperElite2;
89use Clansuite\ServerQuery\ServerProtocols\Squad;
90use Clansuite\ServerQuery\ServerProtocols\Starbound;
91use Clansuite\ServerQuery\ServerProtocols\StarWarsJK;
92use Clansuite\ServerQuery\ServerProtocols\Steam;
93use Clansuite\ServerQuery\ServerProtocols\Swat4;
94use Clansuite\ServerQuery\ServerProtocols\Swbf2;
95use Clansuite\ServerQuery\ServerProtocols\Teamspeak3;
96use Clansuite\ServerQuery\ServerProtocols\Terraria;
97use Clansuite\ServerQuery\ServerProtocols\Tf2;
98use Clansuite\ServerQuery\ServerProtocols\Tibia;
99use Clansuite\ServerQuery\ServerProtocols\Tribes2;
100use Clansuite\ServerQuery\ServerProtocols\Unreal2;
101use Clansuite\ServerQuery\ServerProtocols\UrbanTerror;
102use Clansuite\ServerQuery\ServerProtocols\Ut;
103use Clansuite\ServerQuery\ServerProtocols\Warhead;
104use Clansuite\ServerQuery\ServerProtocols\Wolf;
105use Clansuite\ServerQuery\ServerProtocols\Zandronum;
106
107/**
108 * Supported Server Protocols Registry.
109 *
110 * Contains the mapping of protocol names to their implementing classes.
111 */
112class ServerProtocols
113{
114    /**
115     * Returns a map of supported protocols to their implementing class names.
116     *
117     * @return array<string, string> An array with names of the supported protocols
118     */
119    public static function getProtocolsMap(): array
120    {
121        return [
122            'Steam'     => Steam::class,
123            'Halflife'  => Halflife::class,
124            'Halflife2' => Halflife2::class,
125            'Halo'      => Halo::class,
126            'Homefront' => Homefront::class,
127            // Zombie Panic! Source
128            'Hl2zp' => Hl2zp::class,
129            'hl2zp' => Hl2zp::class,
130            // Insurgency
131            'Ins' => Ins::class,
132            'ins' => Ins::class,
133            // Just Cause 2
134            'Jc2' => Jc2::class,
135            // Doom
136            'Doom3' => Doom3::class,
137            'Etqw'  => Etqw::class,
138            'Fear'  => Fear::class,
139            'Ffow'  => Ffow::class,
140            // Quake series
141            'Quake'   => Quake::class,
142            'Quake2'  => Quake2::class,
143            'Quake3a' => Quake3Arena::class,
144            'Quake4'  => Quake4::class,
145            // Unreal Tournament 2004
146            'ut2k4' => Unreal2::class,
147            // Counter Strike 1.6
148            'Cs16'                => CounterStrike16::class,
149            'CounterStrike16'     => CounterStrike16::class,
150            'CounterStrikeSource' => CounterStrikeSource::class,
151            // Battlefield 4
152            'Bf4' => Battlefield4::class,
153            // Battlefield Hardline
154            'bfhl' => Battlefield4::class,
155            // Battlefield 1942
156            'Bf1942' => Bf1942::class,
157            // Battlefield Vietnam
158            'bfv' => Bf1942::class,
159            // Battlefield 2
160            'Bf2' => Bf2::class,
161            // Battlefield 3
162            'Bf3'                => Bf3::class,
163            'ArkSurvivalEvolved' => ArkSurvivalEvolved::class,
164            // ARK: Survival Evolved
165            'Arkse' => ArkSurvivalEvolved::class,
166            // PixARK
167            'Pixark' => Pixark::class,
168            'pixark' => Pixark::class,
169            // Counter-Strike: Global Offensive
170            'Csgo' => Csgo::class,
171            // Counter-Strike 2 (CS2) - Valve A2S (Steam)
172            'CounterStrike2' => Cs2::class,
173            'counterstrike2' => Cs2::class,
174            'cs2'            => Cs2::class,
175            'Arma3'          => Arma3::class,
176            'ArmaReforger'   => ArmaReforger::class,
177            // Counter-Strike: Condition Zero (GoldSource) - use CounterStrike16 implementation
178            'Czero' => CounterStrike16::class,
179            // Counter-Strike: Condition Zero (GoldSource) - use CounterStrike16 implementation
180            'czero' => CounterStrike16::class,
181            'Rust'  => Rust::class,
182            'Gmod'  => Gmod::class,
183            // Team Fortress 2
184            'Tf2' => Tf2::class,
185            // Left 4 Dead 2
186            'L4d2' => L4d2::class,
187            'L4d'  => L4d::class,
188            // Killing Floor 2
189            'Kf2'  => Kf2::class,
190            'Dayz' => Dayz::class,
191            // Call of Duty
192            'Cod' => Quake3Arena::class,
193            'cod' => Quake3Arena::class,
194            // Call of Duty 2
195            'Cod2' => Quake3Arena::class,
196            'cod2' => Quake3Arena::class,
197            // Call of Duty 4
198            'Cod4' => Cod4::class,
199            // Call of Duty: Black Ops
200            'blackops' => Blackops::class,
201            // Call of Duty: World at War
202            'codww' => Quake3Arena::class,
203            // Call of Duty United Offensive
204            'uo' => Quake3Arena::class,
205            // Medal of Honor Allied Assault
206            'mohaa' => Quake3Arena::class,
207            // Medal of Honor Spearhead
208            'sh' => Quake3Arena::class,
209            // Battlefield Bad Company 2
210            'Bc2' => Bc2::class,
211            // Cube 1
212            'Cube'  => Cube::class,
213            'cube'  => Cube::class,
214            'Cube1' => Cube::class,
215            // Assault Cube
216            'AssaultCube' => Cube::class,
217            // Cube 2: Sauerbraten
218            'Sauerbraten' => Cube::class,
219            // Blood Frontier
220            'BloodFrontier'     => Cube::class,
221            'Minecraft'         => Minecraft::class,
222            'DayOfDefeatSource' => DayOfDefeatSource::class,
223            // Day of Defeat: Source
224            'dods' => DayOfDefeatSource::class,
225            // 7 Days to Die
226            '7daystodie' => Steam::class,
227            // Alien Swarm
228            'Alienswarm' => Steam::class,
229            'alienswarm' => Steam::class,
230            // Team Fortress Classic 1.6
231            'Tfc' => Steam::class,
232            'tfc' => Steam::class,
233            // Day of Defeat
234            'Dod' => Steam::class,
235            'dod' => Steam::class,
236            // Insurgency: Sandstorm
237            'InsSandstorm'  => Steam::class,
238            'ins_sandstorm' => Steam::class,
239            // Contagion
240            'Contagion' => Steam::class,
241            'contagion' => Steam::class,
242            // America's Army 3
243            'Aa3' => Steam::class,
244            'aa3' => Steam::class,
245            // America's Army 2.0
246            'aa' => Gamespy2::class,
247            // ARMA 2
248            'Arma2' => Steam::class,
249            'arma2' => Steam::class,
250            // Battalion 1944
251            'Battalion1944' => Steam::class,
252            'battalion1944' => Steam::class,
253            // Fortress Forever
254            'FortressForever' => Steam::class,
255            'ff'              => Steam::class,
256            // Insurgency (2014)
257            'Insurgency2014' => Steam::class,
258            'insurgency2014' => Steam::class,
259            // Natural Selection
260            'NaturalSelection' => Steam::class,
261            'hlns'             => Steam::class,
262            // Monday Night Combat
263            'MondayNightCombat' => Steam::class,
264            'mnc'               => Steam::class,
265            // Hurtworld
266            'Hurtworld' => Steam::class,
267            'hurtworld' => Steam::class,
268            // Space Engineers
269            'SpaceEngineers' => Steam::class,
270            'spaceengi'      => Steam::class,
271            // Dota 2
272            'Dota2' => Steam::class,
273            'dota2' => Steam::class,
274            // Avorion
275            'Avorion' => Steam::class,
276            'avorion' => Steam::class,
277            // Black Mesa
278            'BlackMesa' => Steam::class,
279            'blackmesa' => Steam::class,
280            // Blade Symphony
281            'BladeSymphony' => Steam::class,
282            'bladesymphony' => Steam::class,
283            // Base Defense
284            'BaseDefense' => Steam::class,
285            'basedefense' => Steam::class,
286            // Action Half-Life
287            'ActionHalfLife' => Steam::class,
288            'ahl'            => Steam::class,
289            // Age of Chivalry
290            'AgeOfChivalry' => Steam::class,
291            'aoc'           => Steam::class,
292            // Aliens vs. Predator (2010)
293            'AvP2010' => Steam::class,
294            'avp2010' => Steam::class,
295            // The Ship
296            'TheShip' => Steam::class,
297            'theship' => Steam::class,
298            // Tower Unite
299            'TowerUnite' => Steam::class,
300            'towerunite' => Steam::class,
301            // Ballistic Overkill
302            'BallisticOverkill' => Steam::class,
303            'ballisticoverkill' => Steam::class,
304            // Barotrauma
305            'Barotrauma' => Steam::class,
306            'barotrauma' => Steam::class,
307            // Abiotic Factor
308            'AbioticFactor' => Steam::class,
309            'abioticfactor' => Steam::class,
310            // Atlas
311            'Atlas' => Steam::class,
312            'atlas' => Steam::class,
313            // BrainBread
314            'BrainBread' => Steam::class,
315            'brainbread' => Steam::class,
316            // BrainBread 2
317            'BrainBread2' => Steam::class,
318            'brainbread2' => Steam::class,
319            // Breach
320            'Breach' => Steam::class,
321            'breach' => Steam::class,
322            // Chivalry: Medieval Warfare
323            'Chivalry' => Steam::class,
324            'cmw'      => Steam::class,
325            // Colony Survival
326            'ColonySurvival' => Steam::class,
327            'colonysurvival' => Steam::class,
328            // Core Keeper
329            'CoreKeeper' => Steam::class,
330            'corekeeper' => Steam::class,
331            // Creativerse
332            'Creativerse'  => Steam::class,
333            'creativverse' => Steam::class,
334            // The Forest
335            'TheForest' => Steam::class,
336            // The Forest
337            'theforest'         => Steam::class,
338            'Unturned'          => Steam::class,
339            'unturned'          => Steam::class,
340            'Valheim'           => Steam::class,
341            'valheim'           => Steam::class,
342            'VRising'           => Steam::class,
343            'vrising'           => Steam::class,
344            'ZombiePanicSource' => Steam::class,
345            'zps'               => Steam::class,
346            'Scum'              => Scum::class,
347            'scum'              => Scum::class,
348            'Terraria'          => Terraria::class,
349            'terraria'          => Terraria::class,
350            // Tibia
351            'Tibia' => Tibia::class,
352            'tibia' => Tibia::class,
353            // Skulltag
354            'Skulltag' => Skulltag::class,
355            'skulltag' => Skulltag::class,
356            // Multi Theft Auto (GTA: San Andreas - MTA)
357            'mta' => GtaMta::class,
358            // Zandronum
359            'Zandronum' => Zandronum::class,
360            'zandronum' => Zandronum::class,
361            // DDnet
362            'Ddnet' => Ddnet::class,
363            'ddnet' => Ddnet::class,
364            // Eco
365            'Eco' => Eco::class,
366            'eco' => Eco::class,
367            // Factorio
368            'Factorio' => Factorio::class,
369            'factorio' => Factorio::class,
370            // Farming Simulator
371            'FarmingSimulator' => FarmingSimulator::class,
372            'farmingsimulator' => FarmingSimulator::class,
373            // Citadel: Forged with Fire
374            'Citadel' => Steam::class,
375            'citadel' => Steam::class,
376            // Conan Exiles
377            'Conan' => Conan::class,
378            'conan' => Conan::class,
379            // Conan Exiles (Source)
380            'conanexiles' => Steam::class,
381            // Miscreated
382            'Miscreated' => Miscreated::class,
383            'miscreated' => Miscreated::class,
384            // Project Zomboid
385            'Zomboid' => Steam::class,
386            'zomboid' => Steam::class,
387            // Wurm Online
388            'Wurm'                => Steam::class,
389            'wurm'                => Steam::class,
390            'source'              => Steam::class,
391            'quake3'              => Quake3Arena::class,
392            'doom3'               => Doom3::class,
393            'etqw'                => Etqw::class,
394            'fear'                => Fear::class,
395            'ffow'                => Ffow::class,
396            'halo'                => Homefront::class,
397            'homefront'           => Homefront::class,
398            'bf1942'              => Bf1942::class,
399            'bf2'                 => Bf2::class,
400            'bf3'                 => Bf3::class,
401            'bc2'                 => Bc2::class,
402            'brink'               => Brink::class,
403            'minecraft'           => Minecraft::class,
404            'minecraftpe'         => Minecraftpe::class,
405            'dayz'                => Dayz::class,
406            'dayzmod'             => Dayzmod::class,
407            'l4d'                 => L4d::class,
408            'lifyo'               => Lifyo::class,
409            'jc2'                 => Jc2::class,
410            'killingfloor'        => KillingFloor::class,
411            'mw3'                 => Steam::class,
412            'bt'                  => Bt::class,
413            'cod4'                => Cod4::class,
414            'blackopsmac'         => Blackopsmac::class,
415            'moh'                 => Moh::class,
416            'mohw'                => Mohw::class,
417            'unreal2'             => Unreal2::class,
418            'arma'                => Arma::class,
419            'starbound'           => Starbound::class,
420            'swat4'               => Swat4::class,
421            'ut'                  => Ut::class,
422            'teamspeak3'          => Teamspeak3::class,
423            'et'                  => Et::class,
424            'urbanterror'         => UrbanTerror::class,
425            'ql'                  => QuakeLive::class,
426            'wolf'                => Wolf::class,
427            'StarWarsJK'          => StarWarsJK::class,
428            'ravaged'             => Ravaged::class,
429            'ro2'                 => Ro2::class,
430            'ror'                 => Ror::class,
431            'rordh'               => Rordh::class,
432            'sniperelite2'        => SniperElite2::class,
433            'armareforger'        => ArmaReforger::class,
434            'deadside'            => Deadside::class,
435            'dontstarvetogether'  => DontStarveTogether::class,
436            'samp'                => Samp::class,
437            'scpsecretlaboratory' => ScpSecretLaboratory::class,
438            'ns2'                 => Ns2::class,
439            'warhead'             => Warhead::class,
440            'swbf2'               => Swbf2::class,
441            'swjk'                => StarWarsJK::class,
442            'tribes2'             => Tribes2::class,
443            'ageoftime'           => AgeOfTime::class,
444            'blockland'           => Blockland::class,
445            'squad'               => Squad::class,
446        ];
447    }
448
449    /**
450     * Returns the names of the supported server protocols.
451     *
452     * @return array<string> An array with names of the supported protocols
453     */
454    public static function getSupportedProtocols(): array
455    {
456        $protocolMap = self::getProtocolsMap();
457
458        return array_keys($protocolMap);
459    }
460
461    /**
462     * Return the class name for a given protocol.
463     *
464     * @param string $protocolClassname the protocol name
465     *
466     * @return string the class name
467     */
468    public static function getProtocolClass(string $protocolClassname): mixed
469    {
470        $protocolMap = self::getProtocolsMap();
471
472        return $className = $protocolMap[$protocolClassname] ?? $protocolClassname;
473    }
474}