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:
13: namespace Clansuite\ServerQuery;
14:
15: use function array_keys;
16: use Clansuite\ServerQuery\ServerProtocols\AgeOfTime;
17: use Clansuite\ServerQuery\ServerProtocols\ArkSurvivalEvolved;
18: use Clansuite\ServerQuery\ServerProtocols\Arma;
19: use Clansuite\ServerQuery\ServerProtocols\Arma3;
20: use Clansuite\ServerQuery\ServerProtocols\ArmaReforger;
21: use Clansuite\ServerQuery\ServerProtocols\Battlefield4;
22: use Clansuite\ServerQuery\ServerProtocols\Bc2;
23: use Clansuite\ServerQuery\ServerProtocols\Bf1942;
24: use Clansuite\ServerQuery\ServerProtocols\Bf2;
25: use Clansuite\ServerQuery\ServerProtocols\Bf3;
26: use Clansuite\ServerQuery\ServerProtocols\Blackops;
27: use Clansuite\ServerQuery\ServerProtocols\Blackopsmac;
28: use Clansuite\ServerQuery\ServerProtocols\Blockland;
29: use Clansuite\ServerQuery\ServerProtocols\Brink;
30: use Clansuite\ServerQuery\ServerProtocols\Bt;
31: use Clansuite\ServerQuery\ServerProtocols\Cod4;
32: use Clansuite\ServerQuery\ServerProtocols\Conan;
33: use Clansuite\ServerQuery\ServerProtocols\CounterStrike16;
34: use Clansuite\ServerQuery\ServerProtocols\CounterStrikeSource;
35: use Clansuite\ServerQuery\ServerProtocols\Cs2;
36: use Clansuite\ServerQuery\ServerProtocols\Csgo;
37: use Clansuite\ServerQuery\ServerProtocols\Cube;
38: use Clansuite\ServerQuery\ServerProtocols\DayOfDefeatSource;
39: use Clansuite\ServerQuery\ServerProtocols\Dayz;
40: use Clansuite\ServerQuery\ServerProtocols\Dayzmod;
41: use Clansuite\ServerQuery\ServerProtocols\Ddnet;
42: use Clansuite\ServerQuery\ServerProtocols\Deadside;
43: use Clansuite\ServerQuery\ServerProtocols\DontStarveTogether;
44: use Clansuite\ServerQuery\ServerProtocols\Doom3;
45: use Clansuite\ServerQuery\ServerProtocols\Eco;
46: use Clansuite\ServerQuery\ServerProtocols\Et;
47: use Clansuite\ServerQuery\ServerProtocols\Etqw;
48: use Clansuite\ServerQuery\ServerProtocols\Factorio;
49: use Clansuite\ServerQuery\ServerProtocols\FarmingSimulator;
50: use Clansuite\ServerQuery\ServerProtocols\Fear;
51: use Clansuite\ServerQuery\ServerProtocols\Ffow;
52: use Clansuite\ServerQuery\ServerProtocols\Gamespy2;
53: use Clansuite\ServerQuery\ServerProtocols\Gmod;
54: use Clansuite\ServerQuery\ServerProtocols\GtaMta;
55: use Clansuite\ServerQuery\ServerProtocols\Halflife;
56: use Clansuite\ServerQuery\ServerProtocols\Halflife2;
57: use Clansuite\ServerQuery\ServerProtocols\Halo;
58: use Clansuite\ServerQuery\ServerProtocols\Hl2zp;
59: use Clansuite\ServerQuery\ServerProtocols\Homefront;
60: use Clansuite\ServerQuery\ServerProtocols\Ins;
61: use Clansuite\ServerQuery\ServerProtocols\Jc2;
62: use Clansuite\ServerQuery\ServerProtocols\Kf2;
63: use Clansuite\ServerQuery\ServerProtocols\KillingFloor;
64: use Clansuite\ServerQuery\ServerProtocols\L4d;
65: use Clansuite\ServerQuery\ServerProtocols\L4d2;
66: use Clansuite\ServerQuery\ServerProtocols\Lifyo;
67: use Clansuite\ServerQuery\ServerProtocols\Minecraft;
68: use Clansuite\ServerQuery\ServerProtocols\Minecraftpe;
69: use Clansuite\ServerQuery\ServerProtocols\Miscreated;
70: use Clansuite\ServerQuery\ServerProtocols\Moh;
71: use Clansuite\ServerQuery\ServerProtocols\Mohw;
72: use Clansuite\ServerQuery\ServerProtocols\Ns2;
73: use Clansuite\ServerQuery\ServerProtocols\Pixark;
74: use Clansuite\ServerQuery\ServerProtocols\Quake;
75: use Clansuite\ServerQuery\ServerProtocols\Quake2;
76: use Clansuite\ServerQuery\ServerProtocols\Quake3Arena;
77: use Clansuite\ServerQuery\ServerProtocols\Quake4;
78: use Clansuite\ServerQuery\ServerProtocols\QuakeLive;
79: use Clansuite\ServerQuery\ServerProtocols\Ravaged;
80: use Clansuite\ServerQuery\ServerProtocols\Ro2;
81: use Clansuite\ServerQuery\ServerProtocols\Ror;
82: use Clansuite\ServerQuery\ServerProtocols\Rordh;
83: use Clansuite\ServerQuery\ServerProtocols\Rust;
84: use Clansuite\ServerQuery\ServerProtocols\Samp;
85: use Clansuite\ServerQuery\ServerProtocols\ScpSecretLaboratory;
86: use Clansuite\ServerQuery\ServerProtocols\Scum;
87: use Clansuite\ServerQuery\ServerProtocols\Skulltag;
88: use Clansuite\ServerQuery\ServerProtocols\SniperElite2;
89: use Clansuite\ServerQuery\ServerProtocols\Squad;
90: use Clansuite\ServerQuery\ServerProtocols\Starbound;
91: use Clansuite\ServerQuery\ServerProtocols\StarWarsJK;
92: use Clansuite\ServerQuery\ServerProtocols\Steam;
93: use Clansuite\ServerQuery\ServerProtocols\Swat4;
94: use Clansuite\ServerQuery\ServerProtocols\Swbf2;
95: use Clansuite\ServerQuery\ServerProtocols\Teamspeak3;
96: use Clansuite\ServerQuery\ServerProtocols\Terraria;
97: use Clansuite\ServerQuery\ServerProtocols\Tf2;
98: use Clansuite\ServerQuery\ServerProtocols\Tibia;
99: use Clansuite\ServerQuery\ServerProtocols\Tribes2;
100: use Clansuite\ServerQuery\ServerProtocols\Unreal2;
101: use Clansuite\ServerQuery\ServerProtocols\UrbanTerror;
102: use Clansuite\ServerQuery\ServerProtocols\Ut;
103: use Clansuite\ServerQuery\ServerProtocols\Warhead;
104: use Clansuite\ServerQuery\ServerProtocols\Wolf;
105: use Clansuite\ServerQuery\ServerProtocols\Zandronum;
106:
107: /**
108: * Supported Server Protocols Registry.
109: *
110: * Contains the mapping of protocol names to their implementing classes.
111: */
112: class 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: }
475: