From 3a2676e06ec95f7f489b5417bb91d49007424c2d Mon Sep 17 00:00:00 2001 From: Erreur32 Date: Tue, 2 Feb 2021 23:40:13 +0100 Subject: [PATCH] first commit --- .gitignore | 5 +- GameQ/.github/FUNDING.yml | 12 - GameQ/.github/issue_label_bot.yaml | 4 - GameQ/.github/stale.yml | 19 - GameQ/Autoloader.php | 60 - GameQ/Buffer.php | 501 --- GameQ/CONTRIBUTING.md | 39 - GameQ/Exception/Protocol.php | 30 - GameQ/Exception/Query.php | 30 - GameQ/Exception/Server.php | 30 - GameQ/Filters/Base.php | 58 - GameQ/Filters/Normalize.php | 133 - GameQ/Filters/Secondstohuman.php | 121 - GameQ/Filters/Stripcolors.php | 115 - GameQ/Filters/Test.php | 47 - GameQ/GameQ.php | 649 ---- GameQ/LICENSE.lgpl | 165 - GameQ/Protocol.php | 500 --- GameQ/Protocols/Aa3.php | 53 - GameQ/Protocols/Aapg.php | 42 - GameQ/Protocols/Arkse.php | 51 - GameQ/Protocols/Arma.php | 43 - GameQ/Protocols/Arma3.php | 181 - GameQ/Protocols/Armedassault2oa.php | 50 - GameQ/Protocols/Armedassault3.php | 32 - GameQ/Protocols/Ase.php | 208 - GameQ/Protocols/Atlas.php | 55 - GameQ/Protocols/Batt1944.php | 68 - GameQ/Protocols/Bf1942.php | 88 - GameQ/Protocols/Bf2.php | 98 - GameQ/Protocols/Bf3.php | 348 -- GameQ/Protocols/Bf4.php | 114 - GameQ/Protocols/Bfbc2.php | 326 -- GameQ/Protocols/Bfh.php | 43 - GameQ/Protocols/Brink.php | 50 - GameQ/Protocols/Cod.php | 43 - GameQ/Protocols/Cod2.php | 42 - GameQ/Protocols/Cod4.php | 42 - GameQ/Protocols/Codmw3.php | 50 - GameQ/Protocols/Coduo.php | 43 - GameQ/Protocols/Codwaw.php | 43 - GameQ/Protocols/Conanexiles.php | 42 - GameQ/Protocols/Contagion.php | 42 - GameQ/Protocols/Crysis.php | 43 - GameQ/Protocols/Crysis2.php | 43 - GameQ/Protocols/Crysiswars.php | 43 - GameQ/Protocols/Cs15.php | 45 - GameQ/Protocols/Cs16.php | 69 - GameQ/Protocols/Cs2d.php | 263 -- GameQ/Protocols/Cscz.php | 45 - GameQ/Protocols/Csgo.php | 43 - GameQ/Protocols/Css.php | 42 - GameQ/Protocols/Dal.php | 43 - GameQ/Protocols/Dayz.php | 66 - GameQ/Protocols/Dayzmod.php | 44 - GameQ/Protocols/Dod.php | 45 - GameQ/Protocols/Dods.php | 42 - GameQ/Protocols/Dow.php | 69 - GameQ/Protocols/Eco.php | 123 - GameQ/Protocols/Egs.php | 51 - GameQ/Protocols/Et.php | 43 - GameQ/Protocols/Etqw.php | 234 -- GameQ/Protocols/Ffe.php | 43 - GameQ/Protocols/Ffow.php | 243 -- GameQ/Protocols/Gamespy.php | 181 - GameQ/Protocols/Gamespy2.php | 269 -- GameQ/Protocols/Gamespy3.php | 340 -- GameQ/Protocols/Gamespy4.php | 34 - GameQ/Protocols/Gmod.php | 42 - GameQ/Protocols/Grav.php | 42 - GameQ/Protocols/Gta5m.php | 173 - GameQ/Protocols/Gtan.php | 163 - GameQ/Protocols/Gtar.php | 164 - GameQ/Protocols/Hl2dm.php | 42 - GameQ/Protocols/Http.php | 67 - GameQ/Protocols/Hurtworld.php | 42 - GameQ/Protocols/Insurgency.php | 42 - GameQ/Protocols/Insurgencysand.php | 49 - GameQ/Protocols/Jediacademy.php | 42 - GameQ/Protocols/Jedioutcast.php | 42 - GameQ/Protocols/Justcause2.php | 127 - GameQ/Protocols/Justcause3.php | 50 - GameQ/Protocols/Killingfloor.php | 96 - GameQ/Protocols/Killingfloor2.php | 51 - GameQ/Protocols/L4d.php | 42 - GameQ/Protocols/L4d2.php | 42 - GameQ/Protocols/Lhmp.php | 214 -- GameQ/Protocols/Minecraft.php | 87 - GameQ/Protocols/Minecraftpe.php | 44 - GameQ/Protocols/Mohaa.php | 79 - GameQ/Protocols/Mordhau.php | 53 - GameQ/Protocols/Mta.php | 59 - GameQ/Protocols/Mumble.php | 194 - GameQ/Protocols/Ns2.php | 49 - GameQ/Protocols/Pixark.php | 43 - GameQ/Protocols/Projectrealitybf2.php | 45 - GameQ/Protocols/Quake2.php | 219 -- GameQ/Protocols/Quake3.php | 214 -- GameQ/Protocols/Quakelive.php | 42 - GameQ/Protocols/Redorchestra2.php | 50 - GameQ/Protocols/Redorchestraostfront.php | 43 - GameQ/Protocols/Risingstorm2.php | 55 - GameQ/Protocols/Rust.php | 43 - GameQ/Protocols/Samp.php | 279 -- GameQ/Protocols/Serioussam.php | 75 - GameQ/Protocols/Sevendaystodie.php | 49 - GameQ/Protocols/Ship.php | 95 - GameQ/Protocols/Sof2.php | 49 - GameQ/Protocols/Soldat.php | 59 - GameQ/Protocols/Source.php | 522 --- GameQ/Protocols/Spaceengineers.php | 42 - GameQ/Protocols/Squad.php | 53 - GameQ/Protocols/Starmade.php | 226 -- GameQ/Protocols/Swat4.php | 50 - GameQ/Protocols/Teamspeak2.php | 290 -- GameQ/Protocols/Teamspeak3.php | 328 -- GameQ/Protocols/Teeworlds.php | 181 - GameQ/Protocols/Terraria.php | 59 - GameQ/Protocols/Tf2.php | 42 - GameQ/Protocols/Theforrest.php | 50 - GameQ/Protocols/Tibia.php | 142 - GameQ/Protocols/Tshock.php | 157 - GameQ/Protocols/Unreal2.php | 246 -- GameQ/Protocols/Unturned.php | 49 - GameQ/Protocols/Urbanterror.php | 49 - GameQ/Protocols/Ut.php | 73 - GameQ/Protocols/Ut2004.php | 42 - GameQ/Protocols/Ut3.php | 133 - GameQ/Protocols/Ventrilo.php | 877 ----- GameQ/Protocols/Warsow.php | 96 - GameQ/Protocols/Won.php | 66 - GameQ/Protocols/Wurm.php | 42 - GameQ/Query/Core.php | 164 - GameQ/Query/Native.php | 221 -- GameQ/Result.php | 130 - GameQ/Server.php | 380 -- GameQ/composer.json | 90 - GameQ/examples/list.php | 131 - GameQ/expansion.php | 171 - GameQ/expansion_.php | 170 - GameQ/index.php | 152 - GameQ/src/GameQ/Autoloader.php | 60 - GameQ/src/GameQ/Buffer.php | 501 --- GameQ/src/GameQ/Exception/Protocol.php | 30 - GameQ/src/GameQ/Exception/Query.php | 30 - GameQ/src/GameQ/Exception/Server.php | 30 - GameQ/src/GameQ/Filters/Base.php | 58 - GameQ/src/GameQ/Filters/Normalize.php | 133 - GameQ/src/GameQ/Filters/Secondstohuman.php | 121 - GameQ/src/GameQ/Filters/Stripcolors.php | 115 - GameQ/src/GameQ/Filters/Test.php | 47 - GameQ/src/GameQ/GameQ.php | 649 ---- GameQ/src/GameQ/Protocol.php | 500 --- GameQ/src/GameQ/Protocols/Aa3.php | 53 - GameQ/src/GameQ/Protocols/Aapg.php | 42 - GameQ/src/GameQ/Protocols/Arkse.php | 51 - GameQ/src/GameQ/Protocols/Arma.php | 43 - GameQ/src/GameQ/Protocols/Arma3.php | 181 - GameQ/src/GameQ/Protocols/Armedassault2oa.php | 50 - GameQ/src/GameQ/Protocols/Armedassault3.php | 32 - GameQ/src/GameQ/Protocols/Ase.php | 208 - GameQ/src/GameQ/Protocols/Atlas.php | 55 - GameQ/src/GameQ/Protocols/Batt1944.php | 68 - GameQ/src/GameQ/Protocols/Bf1942.php | 88 - GameQ/src/GameQ/Protocols/Bf2.php | 98 - GameQ/src/GameQ/Protocols/Bf3.php | 348 -- GameQ/src/GameQ/Protocols/Bf4.php | 114 - GameQ/src/GameQ/Protocols/Bfbc2.php | 326 -- GameQ/src/GameQ/Protocols/Bfh.php | 43 - GameQ/src/GameQ/Protocols/Brink.php | 50 - GameQ/src/GameQ/Protocols/Cod.php | 43 - GameQ/src/GameQ/Protocols/Cod2.php | 42 - GameQ/src/GameQ/Protocols/Cod4.php | 42 - GameQ/src/GameQ/Protocols/Codmw3.php | 50 - GameQ/src/GameQ/Protocols/Coduo.php | 43 - GameQ/src/GameQ/Protocols/Codwaw.php | 43 - GameQ/src/GameQ/Protocols/Conanexiles.php | 42 - GameQ/src/GameQ/Protocols/Contagion.php | 42 - GameQ/src/GameQ/Protocols/Crysis.php | 43 - GameQ/src/GameQ/Protocols/Crysis2.php | 43 - GameQ/src/GameQ/Protocols/Crysiswars.php | 43 - GameQ/src/GameQ/Protocols/Cs15.php | 45 - GameQ/src/GameQ/Protocols/Cs16.php | 69 - GameQ/src/GameQ/Protocols/Cs2d.php | 263 -- GameQ/src/GameQ/Protocols/Cscz.php | 45 - GameQ/src/GameQ/Protocols/Csgo.php | 43 - GameQ/src/GameQ/Protocols/Css.php | 42 - GameQ/src/GameQ/Protocols/Dal.php | 43 - GameQ/src/GameQ/Protocols/Dayz.php | 66 - GameQ/src/GameQ/Protocols/Dayzmod.php | 44 - GameQ/src/GameQ/Protocols/Dod.php | 45 - GameQ/src/GameQ/Protocols/Dods.php | 42 - GameQ/src/GameQ/Protocols/Dow.php | 69 - GameQ/src/GameQ/Protocols/Eco.php | 123 - GameQ/src/GameQ/Protocols/Egs.php | 51 - GameQ/src/GameQ/Protocols/Et.php | 43 - GameQ/src/GameQ/Protocols/Etqw.php | 234 -- GameQ/src/GameQ/Protocols/Ffe.php | 43 - GameQ/src/GameQ/Protocols/Ffow.php | 243 -- GameQ/src/GameQ/Protocols/Gamespy.php | 181 - GameQ/src/GameQ/Protocols/Gamespy2.php | 269 -- GameQ/src/GameQ/Protocols/Gamespy3.php | 340 -- GameQ/src/GameQ/Protocols/Gamespy4.php | 34 - GameQ/src/GameQ/Protocols/Gmod.php | 42 - GameQ/src/GameQ/Protocols/Grav.php | 42 - GameQ/src/GameQ/Protocols/Gta5m.php | 173 - GameQ/src/GameQ/Protocols/Gtan.php | 163 - GameQ/src/GameQ/Protocols/Hl2dm.php | 42 - GameQ/src/GameQ/Protocols/Http.php | 67 - GameQ/src/GameQ/Protocols/Hurtworld.php | 42 - GameQ/src/GameQ/Protocols/Insurgency.php | 42 - GameQ/src/GameQ/Protocols/Insurgencysand.php | 49 - GameQ/src/GameQ/Protocols/Jediacademy.php | 42 - GameQ/src/GameQ/Protocols/Jedioutcast.php | 42 - GameQ/src/GameQ/Protocols/Justcause2.php | 127 - GameQ/src/GameQ/Protocols/Justcause3.php | 50 - GameQ/src/GameQ/Protocols/Killingfloor.php | 96 - GameQ/src/GameQ/Protocols/Killingfloor2.php | 51 - GameQ/src/GameQ/Protocols/L4d.php | 42 - GameQ/src/GameQ/Protocols/L4d2.php | 42 - GameQ/src/GameQ/Protocols/Lhmp.php | 214 -- GameQ/src/GameQ/Protocols/Minecraft.php | 87 - GameQ/src/GameQ/Protocols/Minecraftpe.php | 44 - GameQ/src/GameQ/Protocols/Mohaa.php | 79 - GameQ/src/GameQ/Protocols/Mordhau.php | 53 - GameQ/src/GameQ/Protocols/Mta.php | 59 - GameQ/src/GameQ/Protocols/Mumble.php | 194 - GameQ/src/GameQ/Protocols/Ns2.php | 49 - GameQ/src/GameQ/Protocols/Pixark.php | 43 - .../src/GameQ/Protocols/Projectrealitybf2.php | 45 - GameQ/src/GameQ/Protocols/Quake2.php | 219 -- GameQ/src/GameQ/Protocols/Quake3.php | 214 -- GameQ/src/GameQ/Protocols/Quakelive.php | 42 - GameQ/src/GameQ/Protocols/Redorchestra2.php | 50 - .../GameQ/Protocols/Redorchestraostfront.php | 43 - GameQ/src/GameQ/Protocols/Risingstorm2.php | 55 - GameQ/src/GameQ/Protocols/Rust.php | 43 - GameQ/src/GameQ/Protocols/Samp.php | 279 -- GameQ/src/GameQ/Protocols/Serioussam.php | 75 - GameQ/src/GameQ/Protocols/Sevendaystodie.php | 49 - GameQ/src/GameQ/Protocols/Ship.php | 95 - GameQ/src/GameQ/Protocols/Sof2.php | 49 - GameQ/src/GameQ/Protocols/Soldat.php | 59 - GameQ/src/GameQ/Protocols/Source.php | 522 --- GameQ/src/GameQ/Protocols/Spaceengineers.php | 42 - GameQ/src/GameQ/Protocols/Squad.php | 53 - GameQ/src/GameQ/Protocols/Starmade.php | 226 -- GameQ/src/GameQ/Protocols/Swat4.php | 50 - GameQ/src/GameQ/Protocols/Teamspeak2.php | 290 -- GameQ/src/GameQ/Protocols/Teamspeak3.php | 328 -- GameQ/src/GameQ/Protocols/Teeworlds.php | 181 - GameQ/src/GameQ/Protocols/Terraria.php | 59 - GameQ/src/GameQ/Protocols/Tf2.php | 42 - GameQ/src/GameQ/Protocols/Theforrest.php | 50 - GameQ/src/GameQ/Protocols/Tibia.php | 142 - GameQ/src/GameQ/Protocols/Tshock.php | 157 - GameQ/src/GameQ/Protocols/Unreal2.php | 246 -- GameQ/src/GameQ/Protocols/Unturned.php | 49 - GameQ/src/GameQ/Protocols/Urbanterror.php | 49 - GameQ/src/GameQ/Protocols/Ut.php | 73 - GameQ/src/GameQ/Protocols/Ut2004.php | 42 - GameQ/src/GameQ/Protocols/Ut3.php | 133 - GameQ/src/GameQ/Protocols/Ventrilo.php | 877 ----- GameQ/src/GameQ/Protocols/Warsow.php | 96 - GameQ/src/GameQ/Protocols/Won.php | 66 - GameQ/src/GameQ/Protocols/Wurm.php | 42 - GameQ/src/GameQ/Query/Core.php | 164 - GameQ/src/GameQ/Query/Native.php | 221 -- GameQ/src/GameQ/Result.php | 130 - GameQ/src/GameQ/Server.php | 380 -- GameQ/status_expansion.php | 206 - GameQ/status_livonia.php | 200 - gameq/.coveralls.yml | 8 - gameq/.gitattributes | 12 - gameq/.gitignore | 12 - gameq/.scrutinizer.yml | 91 - gameq/.travis.yml | 30 - gameq/CONTRIBUTING.md | 39 - gameq/LICENSE.lgpl | 165 - gameq/README.md | 53 - gameq/build/config/phpcs.xml | 31 - gameq/build/config/phpmd.xml | 58 - gameq/cmds.md | 6 - gameq/composer.json | 71 - gameq/examples/list.php | 131 - gameq/index.php | 197 - gameq/phpunit.xml | 27 - gameq/phpunit.xml.dist | 27 - gameq/src/GameQ/Autoloader.php | 60 - gameq/src/GameQ/Buffer.php | 501 --- gameq/src/GameQ/Exception/Protocol.php | 30 - gameq/src/GameQ/Exception/Query.php | 30 - gameq/src/GameQ/Exception/Server.php | 30 - gameq/src/GameQ/Filters/Base.php | 58 - gameq/src/GameQ/Filters/Normalize.php | 133 - gameq/src/GameQ/Filters/Secondstohuman.php | 119 - gameq/src/GameQ/Filters/Stripcolors.php | 101 - gameq/src/GameQ/Filters/Test.php | 47 - gameq/src/GameQ/GameQ.php | 672 ---- gameq/src/GameQ/Protocol.php | 500 --- gameq/src/GameQ/Protocols/Aa3.php | 53 - gameq/src/GameQ/Protocols/Aapg.php | 42 - gameq/src/GameQ/Protocols/Arkse.php | 51 - gameq/src/GameQ/Protocols/Arma3.php | 176 - gameq/src/GameQ/Protocols/Armedassault2oa.php | 50 - gameq/src/GameQ/Protocols/Armedassault3.php | 32 - gameq/src/GameQ/Protocols/Ase.php | 208 - gameq/src/GameQ/Protocols/Batt1944.php | 68 - gameq/src/GameQ/Protocols/Bf1942.php | 88 - gameq/src/GameQ/Protocols/Bf2.php | 98 - gameq/src/GameQ/Protocols/Bf3.php | 348 -- gameq/src/GameQ/Protocols/Bf4.php | 114 - gameq/src/GameQ/Protocols/Bfbc2.php | 326 -- gameq/src/GameQ/Protocols/Bfh.php | 43 - gameq/src/GameQ/Protocols/Cod2.php | 42 - gameq/src/GameQ/Protocols/Cod4.php | 42 - gameq/src/GameQ/Protocols/Codmw3.php | 50 - gameq/src/GameQ/Protocols/Conanexiles.php | 42 - gameq/src/GameQ/Protocols/Crysiswars.php | 43 - gameq/src/GameQ/Protocols/Cs15.php | 45 - gameq/src/GameQ/Protocols/Cs16.php | 69 - gameq/src/GameQ/Protocols/Cscz.php | 45 - gameq/src/GameQ/Protocols/Csgo.php | 43 - gameq/src/GameQ/Protocols/Css.php | 42 - gameq/src/GameQ/Protocols/Dayz.php | 68 - gameq/src/GameQ/Protocols/Dayzmod.php | 44 - gameq/src/GameQ/Protocols/Dod.php | 45 - gameq/src/GameQ/Protocols/Dods.php | 42 - gameq/src/GameQ/Protocols/Dow.php | 69 - gameq/src/GameQ/Protocols/Eco.php | 123 - gameq/src/GameQ/Protocols/Egs.php | 51 - gameq/src/GameQ/Protocols/Etqw.php | 234 -- gameq/src/GameQ/Protocols/Ffe.php | 43 - gameq/src/GameQ/Protocols/Ffow.php | 243 -- gameq/src/GameQ/Protocols/Gamespy.php | 178 - gameq/src/GameQ/Protocols/Gamespy3.php | 335 -- gameq/src/GameQ/Protocols/Gamespy4.php | 34 - gameq/src/GameQ/Protocols/Gmod.php | 42 - gameq/src/GameQ/Protocols/Grav.php | 42 - gameq/src/GameQ/Protocols/Gta5m.php | 173 - gameq/src/GameQ/Protocols/Gtan.php | 163 - gameq/src/GameQ/Protocols/Hl2dm.php | 42 - gameq/src/GameQ/Protocols/Http.php | 67 - gameq/src/GameQ/Protocols/Insurgency.php | 42 - gameq/src/GameQ/Protocols/Jediacademy.php | 42 - gameq/src/GameQ/Protocols/Jedioutcast.php | 42 - gameq/src/GameQ/Protocols/Justcause2.php | 127 - gameq/src/GameQ/Protocols/Justcause3.php | 50 - gameq/src/GameQ/Protocols/Killingfloor.php | 96 - gameq/src/GameQ/Protocols/Killingfloor2.php | 51 - gameq/src/GameQ/Protocols/L4d.php | 42 - gameq/src/GameQ/Protocols/L4d2.php | 42 - gameq/src/GameQ/Protocols/Lhmp.php | 214 -- gameq/src/GameQ/Protocols/Minecraft.php | 87 - gameq/src/GameQ/Protocols/Minecraftpe.php | 44 - gameq/src/GameQ/Protocols/Mohaa.php | 79 - gameq/src/GameQ/Protocols/Mta.php | 59 - gameq/src/GameQ/Protocols/Mumble.php | 194 - gameq/src/GameQ/Protocols/Ns2.php | 49 - .../src/GameQ/Protocols/Projectrealitybf2.php | 45 - gameq/src/GameQ/Protocols/Quake2.php | 219 -- gameq/src/GameQ/Protocols/Quake3.php | 203 - gameq/src/GameQ/Protocols/Quakelive.php | 42 - gameq/src/GameQ/Protocols/Redorchestra2.php | 50 - gameq/src/GameQ/Protocols/Risingstorm2.php | 55 - gameq/src/GameQ/Protocols/Rust.php | 43 - gameq/src/GameQ/Protocols/Samp.php | 272 -- gameq/src/GameQ/Protocols/Sevendaystodie.php | 49 - gameq/src/GameQ/Protocols/Ship.php | 95 - gameq/src/GameQ/Protocols/Soldat.php | 59 - gameq/src/GameQ/Protocols/Source.php | 522 --- gameq/src/GameQ/Protocols/Spaceengineers.php | 42 - gameq/src/GameQ/Protocols/Squad.php | 53 - gameq/src/GameQ/Protocols/Starmade.php | 226 -- gameq/src/GameQ/Protocols/Teamspeak2.php | 290 -- gameq/src/GameQ/Protocols/Teamspeak3.php | 328 -- gameq/src/GameQ/Protocols/Teeworlds.php | 181 - gameq/src/GameQ/Protocols/Terraria.php | 59 - gameq/src/GameQ/Protocols/Tf2.php | 42 - gameq/src/GameQ/Protocols/Theforrest.php | 50 - gameq/src/GameQ/Protocols/Tibia.php | 142 - gameq/src/GameQ/Protocols/Tshock.php | 157 - gameq/src/GameQ/Protocols/Unreal2.php | 246 -- gameq/src/GameQ/Protocols/Unturned.php | 49 - gameq/src/GameQ/Protocols/Ut.php | 73 - gameq/src/GameQ/Protocols/Ut2004.php | 42 - gameq/src/GameQ/Protocols/Ut3.php | 133 - gameq/src/GameQ/Protocols/Ventrilo.php | 877 ----- gameq/src/GameQ/Protocols/Warsow.php | 96 - gameq/src/GameQ/Protocols/Won.php | 66 - gameq/src/GameQ/Protocols/Wurm.php | 42 - gameq/src/GameQ/Query/Core.php | 164 - gameq/src/GameQ/Query/Native.php | 221 -- gameq/src/GameQ/Result.php | 127 - gameq/src/GameQ/Server.php | 380 -- gameq/stat.php | 157 - gameq/tests/Buffer.php | 257 -- gameq/tests/Filters/Base.php | 104 - gameq/tests/Filters/Normalize.php | 87 - .../Filters/Providers/Normalize/css_1.json | 1 - .../Filters/Providers/Normalize/css_2.json | 1 - .../Filters/Providers/Normalize/mumble_1.json | 1 - .../Filters/Providers/Stripcolors/cod4_1.json | 1 - .../Filters/Providers/Stripcolors/cod4_2.json | 1 - .../Providers/Stripcolors/minecraft_1.json | 1 - gameq/tests/Filters/Secondstohuman.php | 142 - gameq/tests/Filters/Stripcolors.php | 86 - gameq/tests/GameQ.php | 280 -- gameq/tests/Issues/Issue307.php | 80 - gameq/tests/Issues/Issue382.php | 83 - gameq/tests/Issues/Providers/307.txt | Bin 4483 -> 0 bytes gameq/tests/Issues/Providers/382.txt | Bin 1206 -> 0 bytes gameq/tests/Protocol.php | 162 - gameq/tests/Protocols/Aa3.php | 50 - gameq/tests/Protocols/Aapg.php | 50 - gameq/tests/Protocols/Arkse.php | 50 - gameq/tests/Protocols/Arma3.php | 50 - gameq/tests/Protocols/Armedassault2oa.php | 50 - gameq/tests/Protocols/Ase.php | 61 - gameq/tests/Protocols/Base.php | 130 - gameq/tests/Protocols/Batt1944.php | 50 - gameq/tests/Protocols/Bf1942.php | 46 - gameq/tests/Protocols/Bf2.php | 46 - gameq/tests/Protocols/Bf3.php | 106 - gameq/tests/Protocols/Bf4.php | 46 - gameq/tests/Protocols/Bfbc2.php | 106 - gameq/tests/Protocols/Bfh.php | 46 - gameq/tests/Protocols/Cod2.php | 50 - gameq/tests/Protocols/Cod4.php | 50 - gameq/tests/Protocols/Codmw3.php | 50 - gameq/tests/Protocols/Conanexiles.php | 54 - gameq/tests/Protocols/Crysiswars.php | 50 - gameq/tests/Protocols/Cs15.php | 50 - gameq/tests/Protocols/Cs16.php | 50 - gameq/tests/Protocols/Cscz.php | 50 - gameq/tests/Protocols/Csgo.php | 50 - gameq/tests/Protocols/Css.php | 50 - gameq/tests/Protocols/Dayz.php | 50 - gameq/tests/Protocols/Dayzmod.php | 50 - gameq/tests/Protocols/Dod.php | 50 - gameq/tests/Protocols/Dods.php | 50 - gameq/tests/Protocols/Dow.php | 50 - gameq/tests/Protocols/Eco.php | 84 - gameq/tests/Protocols/Egs.php | 50 - gameq/tests/Protocols/Etqw.php | 121 - gameq/tests/Protocols/Ffe.php | 50 - gameq/tests/Protocols/Ffow.php | 153 - gameq/tests/Protocols/Gamespy.php | 99 - gameq/tests/Protocols/Gmod.php | 50 - gameq/tests/Protocols/Grav.php | 50 - gameq/tests/Protocols/Gta5m.php | 121 - gameq/tests/Protocols/Gtan.php | 84 - gameq/tests/Protocols/Hl2dm.php | 50 - gameq/tests/Protocols/Insurgency.php | 50 - gameq/tests/Protocols/Jediacademy.php | 50 - gameq/tests/Protocols/Jedioutcast.php | 50 - gameq/tests/Protocols/Justcause2.php | 85 - gameq/tests/Protocols/Justcause3.php | 50 - gameq/tests/Protocols/Killingfloor.php | 50 - gameq/tests/Protocols/Killingfloor2.php | 50 - gameq/tests/Protocols/L4d.php | 50 - gameq/tests/Protocols/L4d2.php | 50 - gameq/tests/Protocols/Lhmp.php | 99 - gameq/tests/Protocols/Minecraft.php | 50 - gameq/tests/Protocols/Minecraftpe.php | 50 - gameq/tests/Protocols/Mohaa.php | 79 - gameq/tests/Protocols/Mta.php | 50 - gameq/tests/Protocols/Mumble.php | 102 - gameq/tests/Protocols/Ns2.php | 50 - gameq/tests/Protocols/Projectrealitybf2.php | 50 - .../Protocols/Providers/Aa3/1_response.txt | Bin 528 -> 0 bytes .../Protocols/Providers/Aa3/1_result.json | 1 - .../Protocols/Providers/Aa3/2_response.txt | Bin 178 -> 0 bytes .../Protocols/Providers/Aa3/2_result.json | 1 - .../Protocols/Providers/Aapg/1_response.txt | Bin 896 -> 0 bytes .../Protocols/Providers/Aapg/1_result.json | 1 - .../Protocols/Providers/Aapg/2_response.txt | Bin 226 -> 0 bytes .../Protocols/Providers/Aapg/2_result.json | 1 - .../Protocols/Providers/Arkse/1_response.txt | Bin 598 -> 0 bytes .../Protocols/Providers/Arkse/1_result.json | 1 - .../Protocols/Providers/Arkse/2_response.txt | Bin 2170 -> 0 bytes .../Protocols/Providers/Arkse/2_result.json | 1 - .../Protocols/Providers/Arkse/3_response.txt | Bin 2393 -> 0 bytes .../Protocols/Providers/Arkse/3_result.json | 1 - .../Protocols/Providers/Arma3/1_response.txt | Bin 2290 -> 0 bytes .../Protocols/Providers/Arma3/1_result.json | 1 - .../Protocols/Providers/Arma3/2_response.txt | Bin 460 -> 0 bytes .../Protocols/Providers/Arma3/2_result.json | 1 - .../Protocols/Providers/Arma3/3_response.txt | Bin 1473 -> 0 bytes .../Protocols/Providers/Arma3/3_result.json | 1 - .../Providers/Armedassault2oa/1_response.txt | Bin 1047 -> 0 bytes .../Providers/Armedassault2oa/1_result.json | 1 - .../Providers/Armedassault2oa/2_response.txt | Bin 1247 -> 0 bytes .../Providers/Armedassault2oa/2_result.json | 1 - .../Providers/Armedassault2oa/3_response.txt | Bin 814 -> 0 bytes .../Providers/Armedassault2oa/3_result.json | 1 - .../Providers/Batt1944/1_response.txt | Bin 483 -> 0 bytes .../Providers/Batt1944/1_result.json | 1 - .../Providers/Batt1944/2_response.txt | Bin 492 -> 0 bytes .../Providers/Batt1944/2_result.json | 1 - .../Protocols/Providers/Bf1942/1_response.txt | 5 - .../Protocols/Providers/Bf1942/1_result.json | 1 - .../Protocols/Providers/Bf1942/2_response.txt | 1 - .../Protocols/Providers/Bf1942/2_result.json | 1 - .../Protocols/Providers/Bf1942/3_response.txt | 3 - .../Protocols/Providers/Bf1942/3_result.json | 1 - .../Protocols/Providers/Bf2/1_response.txt | Bin 3124 -> 0 bytes .../Protocols/Providers/Bf2/1_result.json | 1 - .../Protocols/Providers/Bf2/2_response.txt | Bin 1279 -> 0 bytes .../Protocols/Providers/Bf2/2_result.json | 1 - .../Protocols/Providers/Bf2/3_response.txt | Bin 3176 -> 0 bytes .../Protocols/Providers/Bf2/3_result.json | 1 - .../Protocols/Providers/Bf2/4_response.txt | Bin 1010 -> 0 bytes .../Protocols/Providers/Bf2/4_result.json | 1 - .../Protocols/Providers/Bf3/1_response.txt | Bin 3317 -> 0 bytes .../Protocols/Providers/Bf3/1_result.json | 1 - .../Protocols/Providers/Bf3/2_response.txt | Bin 4150 -> 0 bytes .../Protocols/Providers/Bf3/2_result.json | 1 - .../Protocols/Providers/Bf3/3_response.txt | Bin 3458 -> 0 bytes .../Protocols/Providers/Bf3/3_result.json | 1 - .../Protocols/Providers/Bf4/1_response.txt | Bin 5181 -> 0 bytes .../Protocols/Providers/Bf4/1_result.json | 1 - .../Protocols/Providers/Bf4/2_response.txt | Bin 4931 -> 0 bytes .../Protocols/Providers/Bf4/2_result.json | 1 - .../Protocols/Providers/Bfbc2/1_response.txt | Bin 2653 -> 0 bytes .../Protocols/Providers/Bfbc2/1_result.json | 1 - .../Protocols/Providers/Bfbc2/2_response.txt | Bin 2619 -> 0 bytes .../Protocols/Providers/Bfbc2/2_result.json | 1 - .../Protocols/Providers/Bfbc2/3_response.txt | Bin 457 -> 0 bytes .../Protocols/Providers/Bfbc2/3_result.json | 1 - .../Protocols/Providers/Bfh/1_response.txt | Bin 3609 -> 0 bytes .../Protocols/Providers/Bfh/1_result.json | 1 - .../Protocols/Providers/Bfh/2_response.txt | Bin 464 -> 0 bytes .../Protocols/Providers/Bfh/2_result.json | 1 - .../Protocols/Providers/Cod2/1_response.txt | 26 - .../Protocols/Providers/Cod2/1_result.json | 1 - .../Protocols/Providers/Cod2/2_response.txt | 40 - .../Protocols/Providers/Cod2/2_result.json | 1 - .../Protocols/Providers/Cod4/1_response.txt | 16 - .../Protocols/Providers/Cod4/1_result.json | 1 - .../Protocols/Providers/Cod4/2_response.txt | 29 - .../Protocols/Providers/Cod4/2_result.json | 1 - .../Protocols/Providers/Codmw3/1_response.txt | Bin 254 -> 0 bytes .../Protocols/Providers/Codmw3/1_result.json | 1 - .../Protocols/Providers/Codmw3/2_response.txt | Bin 557 -> 0 bytes .../Protocols/Providers/Codmw3/2_result.json | 1 - .../Providers/Conanexiles/1_response.txt | Bin 1065 -> 0 bytes .../Providers/Conanexiles/1_result.json | 1 - .../Providers/Conanexiles/2_response.txt | Bin 1133 -> 0 bytes .../Providers/Conanexiles/2_result.json | 1 - .../Providers/Conanexiles/3_response.txt | Bin 1011 -> 0 bytes .../Providers/Conanexiles/3_result.json | 1 - .../Providers/Crysiswars/1_response.txt | Bin 868 -> 0 bytes .../Providers/Crysiswars/1_result.json | 1 - .../Protocols/Providers/Cs15/1_response.txt | Bin 1933 -> 0 bytes .../Protocols/Providers/Cs15/1_result.json | 1 - .../Protocols/Providers/Cs15/2_response.txt | Bin 1919 -> 0 bytes .../Protocols/Providers/Cs15/2_result.json | 1 - .../Protocols/Providers/Cs16/1_response.txt | Bin 2476 -> 0 bytes .../Protocols/Providers/Cs16/1_result.json | 1 - .../Protocols/Providers/Cs16/2_response.txt | Bin 3078 -> 0 bytes .../Protocols/Providers/Cs16/2_result.json | 1 - .../Protocols/Providers/Cs16/3_response.txt | Bin 3208 -> 0 bytes .../Protocols/Providers/Cs16/3_result.json | 1 - .../Protocols/Providers/Cscz/1_response.txt | Bin 3043 -> 0 bytes .../Protocols/Providers/Cscz/1_result.json | 1 - .../Protocols/Providers/Cscz/2_response.txt | Bin 3026 -> 0 bytes .../Protocols/Providers/Cscz/2_result.json | 1 - .../Protocols/Providers/Csgo/1_response.txt | Bin 822 -> 0 bytes .../Protocols/Providers/Csgo/1_result.json | 1 - .../Protocols/Providers/Csgo/2_response.txt | Bin 788 -> 0 bytes .../Protocols/Providers/Csgo/2_result.json | 1 - .../Protocols/Providers/Css/1_response.txt | Bin 3316 -> 0 bytes .../Protocols/Providers/Css/1_result.json | 1 - .../Protocols/Providers/Css/2_response.txt | Bin 3414 -> 0 bytes .../Protocols/Providers/Css/2_result.json | 1 - .../Protocols/Providers/Css/3_response.txt | Bin 2608 -> 0 bytes .../Protocols/Providers/Css/3_result.json | 1 - .../Protocols/Providers/Dayz/1_response.txt | Bin 1137 -> 0 bytes .../Protocols/Providers/Dayz/1_result.json | 1 - .../Protocols/Providers/Dayz/2_response.txt | Bin 295 -> 0 bytes .../Protocols/Providers/Dayz/2_result.json | 1 - .../Providers/Dayzmod/1_response.txt | Bin 769 -> 0 bytes .../Protocols/Providers/Dayzmod/1_result.json | 1 - .../Providers/Dayzmod/2_response.txt | Bin 758 -> 0 bytes .../Protocols/Providers/Dayzmod/2_result.json | 1 - .../Protocols/Providers/Dod/1_response.txt | Bin 2811 -> 0 bytes .../Protocols/Providers/Dod/1_result.json | 1 - .../Protocols/Providers/Dod/2_response.txt | Bin 2704 -> 0 bytes .../Protocols/Providers/Dod/2_result.json | 1 - .../Protocols/Providers/Dods/1_response.txt | Bin 2146 -> 0 bytes .../Protocols/Providers/Dods/1_result.json | 1 - .../Protocols/Providers/Dods/2_response.txt | Bin 3014 -> 0 bytes .../Protocols/Providers/Dods/2_result.json | 1 - .../Protocols/Providers/Dow/1_response.txt | Bin 451 -> 0 bytes .../Protocols/Providers/Dow/1_result.json | 1 - .../Protocols/Providers/Dow/2_response.txt | Bin 469 -> 0 bytes .../Protocols/Providers/Dow/2_result.json | 1 - .../Protocols/Providers/Eco/1_response.txt | 267 -- .../Protocols/Providers/Eco/1_result.json | 1 - .../Protocols/Providers/Eco/2_response.txt | 266 -- .../Protocols/Providers/Eco/2_result.json | 1 - .../Protocols/Providers/Egs/1_response.txt | Bin 591 -> 0 bytes .../Protocols/Providers/Egs/1_result.json | 1 - .../Protocols/Providers/Egs/2_response.txt | Bin 974 -> 0 bytes .../Protocols/Providers/Egs/2_result.json | 1 - .../Protocols/Providers/Etqw/1_response.txt | Bin 1736 -> 0 bytes .../Protocols/Providers/Etqw/1_result.json | 1 - .../Protocols/Providers/Etqw/2_response.txt | Bin 2063 -> 0 bytes .../Protocols/Providers/Etqw/2_result.json | 1 - .../Protocols/Providers/Etqw/3_response.txt | Bin 918 -> 0 bytes .../Protocols/Providers/Etqw/3_result.json | 1 - .../Protocols/Providers/Ffe/1_response.txt | Bin 1211 -> 0 bytes .../Protocols/Providers/Ffe/1_result.json | 1 - .../Protocols/Providers/Ffe/2_response.txt | Bin 995 -> 0 bytes .../Protocols/Providers/Ffe/2_result.json | 1 - .../Protocols/Providers/Ffe/3_response.txt | Bin 891 -> 0 bytes .../Protocols/Providers/Ffe/3_result.json | 1 - .../Protocols/Providers/Ffow/1_response.txt | Bin 570 -> 0 bytes .../Protocols/Providers/Ffow/1_result.json | 1 - .../Protocols/Providers/Ffow/2_response.txt | Bin 371 -> 0 bytes .../Protocols/Providers/Ffow/2_result.json | 1 - .../Protocols/Providers/Gmod/1_response.txt | Bin 4194 -> 0 bytes .../Protocols/Providers/Gmod/1_result.json | 1 - .../Protocols/Providers/Gmod/2_response.txt | Bin 2716 -> 0 bytes .../Protocols/Providers/Gmod/2_result.json | 1 - .../Protocols/Providers/Grav/1_response.txt | Bin 1104 -> 0 bytes .../Protocols/Providers/Grav/1_result.json | 1 - .../Protocols/Providers/Gta5m/1_response.txt | 2 - .../Protocols/Providers/Gta5m/1_result.json | 1 - .../Protocols/Providers/Gta5m/2_response.txt | 2 - .../Protocols/Providers/Gta5m/2_result.json | 1 - .../Protocols/Providers/Gta5m/3_response.txt | 2 - .../Protocols/Providers/Gta5m/3_result.json | 1 - .../Protocols/Providers/Gtan/1_response.txt | 9 - .../Protocols/Providers/Gtan/1_result.json | 1 - .../Protocols/Providers/Gtan/2_response.txt | 9 - .../Protocols/Providers/Gtan/2_result.json | 1 - .../Protocols/Providers/Hl2dm/1_response.txt | Bin 2657 -> 0 bytes .../Protocols/Providers/Hl2dm/1_result.json | 1 - .../Protocols/Providers/Hl2dm/2_response.txt | Bin 2771 -> 0 bytes .../Protocols/Providers/Hl2dm/2_result.json | 1 - .../Providers/Insurgency/1_response.txt | Bin 536 -> 0 bytes .../Providers/Insurgency/1_result.json | 1 - .../Providers/Insurgency/2_response.txt | Bin 239 -> 0 bytes .../Providers/Insurgency/2_result.json | 1 - .../Providers/Jediacademy/1_response.txt | 32 - .../Providers/Jediacademy/1_result.json | 1 - .../Providers/Jediacademy/2_response.txt | 7 - .../Providers/Jediacademy/2_result.json | 1 - .../Providers/Jediacademy/3_response.txt | 2 - .../Providers/Jediacademy/3_result.json | 1 - .../Providers/Jedioutcast/1_response.txt | 6 - .../Providers/Jedioutcast/1_result.json | 1 - .../Providers/Jedioutcast/2_response.txt | 17 - .../Providers/Jedioutcast/2_result.json | 1 - .../Providers/Jedioutcast/3_response.txt | 4 - .../Providers/Jedioutcast/3_result.json | 1 - .../Providers/Justcause2/1_response.txt | Bin 435 -> 0 bytes .../Providers/Justcause2/1_result.json | 1 - .../Providers/Justcause2/2_response.txt | Bin 1629 -> 0 bytes .../Providers/Justcause2/2_result.json | 1 - .../Providers/Justcause2/3_response.txt | Bin 435 -> 0 bytes .../Providers/Justcause2/3_result.json | 1 - .../Providers/Justcause3/1_response.txt | Bin 315 -> 0 bytes .../Providers/Justcause3/1_result.json | 1 - .../Providers/Justcause3/2_response.txt | Bin 341 -> 0 bytes .../Providers/Justcause3/2_result.json | 1 - .../Providers/Killingfloor/1_response.txt | Bin 1898 -> 0 bytes .../Providers/Killingfloor/1_result.json | 1 - .../Providers/Killingfloor/2_response.txt | Bin 2196 -> 0 bytes .../Providers/Killingfloor/2_result.json | 1 - .../Providers/Killingfloor2/1_response.txt | Bin 1460 -> 0 bytes .../Providers/Killingfloor2/1_result.json | 1 - .../Providers/Killingfloor2/2_response.txt | Bin 1022 -> 0 bytes .../Providers/Killingfloor2/2_result.json | 1 - .../Providers/Killingfloor2/3_response.txt | Bin 1034 -> 0 bytes .../Providers/Killingfloor2/3_result.json | 1 - .../Protocols/Providers/L4d/1_response.txt | Bin 4666 -> 0 bytes .../Protocols/Providers/L4d/1_result.json | 1 - .../Protocols/Providers/L4d/2_response.txt | Bin 717 -> 0 bytes .../Protocols/Providers/L4d/2_result.json | 1 - .../Protocols/Providers/L4d2/1_response.txt | Bin 4744 -> 0 bytes .../Protocols/Providers/L4d2/1_result.json | 1 - .../Protocols/Providers/L4d2/2_response.txt | Bin 3012 -> 0 bytes .../Protocols/Providers/L4d2/2_result.json | 1 - .../Protocols/Providers/Lhmp/1_response.txt | Bin 100 -> 0 bytes .../Protocols/Providers/Lhmp/1_result.json | 1 - .../Protocols/Providers/Lhmp/2_response.txt | Bin 100 -> 0 bytes .../Protocols/Providers/Lhmp/2_result.json | 1 - .../Providers/Minecraft/1_response.txt | Bin 800 -> 0 bytes .../Providers/Minecraft/1_result.json | 1 - .../Providers/Minecraft/2_response.txt | Bin 1594 -> 0 bytes .../Providers/Minecraft/2_result.json | 1 - .../Providers/Minecraft/3_response.txt | Bin 842 -> 0 bytes .../Providers/Minecraft/3_result.json | 1 - .../Providers/Minecraft/4_response.txt | Bin 945 -> 0 bytes .../Providers/Minecraft/4_result.json | 1 - .../Providers/Minecraftpe/1_response.txt | Bin 305 -> 0 bytes .../Providers/Minecraftpe/1_result.json | 1 - .../Providers/Minecraftpe/2_response.txt | Bin 1186 -> 0 bytes .../Providers/Minecraftpe/2_result.json | 1 - .../Protocols/Providers/Mohaa/1_response.txt | 3 - .../Protocols/Providers/Mohaa/1_result.json | 1 - .../Protocols/Providers/Mohaa/2_response.txt | 1 - .../Protocols/Providers/Mohaa/2_result.json | 1 - .../Protocols/Providers/Mohaa/3_response.txt | 1 - .../Protocols/Providers/Mohaa/3_result.json | 1 - .../Protocols/Providers/Mta/1_response.txt | 18 - .../Protocols/Providers/Mta/1_result.json | 1 - .../Protocols/Providers/Mta/2_response.txt | 5 - .../Protocols/Providers/Mta/2_result.json | 1 - .../Protocols/Providers/Mumble/1_response.txt | 3371 ----------------- .../Protocols/Providers/Mumble/1_result.json | 1 - .../Protocols/Providers/Mumble/2_response.txt | 1718 --------- .../Protocols/Providers/Mumble/2_result.json | 1 - .../Protocols/Providers/Ns2/1_response.txt | Bin 817 -> 0 bytes .../Protocols/Providers/Ns2/1_result.json | 1 - .../Protocols/Providers/Ns2/2_response.txt | Bin 739 -> 0 bytes .../Protocols/Providers/Ns2/2_result.json | 1 - .../Projectrealitybf2/1_response.txt | Bin 3774 -> 0 bytes .../Providers/Projectrealitybf2/1_result.json | 1 - .../Projectrealitybf2/2_response.txt | Bin 1214 -> 0 bytes .../Providers/Projectrealitybf2/2_result.json | 1 - .../Projectrealitybf2/3_response.txt | Bin 1420 -> 0 bytes .../Providers/Projectrealitybf2/3_result.json | 1 - .../Protocols/Providers/Quake2/1_response.txt | 13 - .../Protocols/Providers/Quake2/1_result.json | 1 - .../Protocols/Providers/Quake2/2_response.txt | 12 - .../Protocols/Providers/Quake2/2_result.json | 1 - .../Protocols/Providers/Quake2/3_response.txt | 2 - .../Protocols/Providers/Quake2/3_result.json | 1 - .../Protocols/Providers/Quake3/1_response.txt | 12 - .../Protocols/Providers/Quake3/1_result.json | 1 - .../Protocols/Providers/Quake3/2_response.txt | 2 - .../Protocols/Providers/Quake3/2_result.json | 1 - .../Providers/Quakelive/1_response.txt | Bin 1308 -> 0 bytes .../Providers/Quakelive/1_result.json | 1 - .../Providers/Quakelive/2_response.txt | Bin 1221 -> 0 bytes .../Providers/Quakelive/2_result.json | 1 - .../Providers/Quakelive/3_response.txt | Bin 1048 -> 0 bytes .../Providers/Quakelive/3_result.json | 1 - .../Providers/Redorchestra2/1_response.txt | Bin 2243 -> 0 bytes .../Providers/Redorchestra2/1_result.json | 1 - .../Providers/Redorchestra2/2_response.txt | Bin 2051 -> 0 bytes .../Providers/Redorchestra2/2_result.json | 1 - .../Providers/Risingstorm2/1_response.txt | Bin 1002 -> 0 bytes .../Providers/Risingstorm2/1_result.json | 1 - .../Providers/Risingstorm2/2_response.txt | Bin 799 -> 0 bytes .../Providers/Risingstorm2/2_result.json | 1 - .../Providers/Risingstorm2/3_response.txt | Bin 2068 -> 0 bytes .../Providers/Risingstorm2/3_result.json | 1 - .../Protocols/Providers/Rust/1_response.txt | Bin 2019 -> 0 bytes .../Protocols/Providers/Rust/1_result.json | 1 - .../Protocols/Providers/Rust/2_response.txt | Bin 1200 -> 0 bytes .../Protocols/Providers/Rust/2_result.json | 1 - .../Protocols/Providers/Samp/1_response.txt | Bin 779 -> 0 bytes .../Protocols/Providers/Samp/1_result.json | 1 - .../Protocols/Providers/Samp/2_response.txt | 0 .../Protocols/Providers/Samp/2_result.json | 1 - .../Providers/Sevendaystodie/1_response.txt | Bin 1328 -> 0 bytes .../Providers/Sevendaystodie/1_result.json | 1 - .../Providers/Sevendaystodie/2_response.txt | Bin 1346 -> 0 bytes .../Providers/Sevendaystodie/2_result.json | 1 - .../Protocols/Providers/Ship/1_response.txt | Bin 1054 -> 0 bytes .../Protocols/Providers/Ship/1_result.json | 1 - .../Protocols/Providers/Ship/2_response.txt | Bin 1322 -> 0 bytes .../Protocols/Providers/Ship/2_result.json | 1 - .../Protocols/Providers/Ship/3_response.txt | Bin 1882 -> 0 bytes .../Protocols/Providers/Ship/3_result.json | 1 - .../Providers/Spaceengineers/1_response.txt | Bin 303 -> 0 bytes .../Providers/Spaceengineers/1_result.json | 1 - .../Providers/Spaceengineers/2_response.txt | Bin 1004 -> 0 bytes .../Providers/Spaceengineers/2_result.json | 1 - .../Protocols/Providers/Squad/1_response.txt | Bin 2780 -> 0 bytes .../Protocols/Providers/Squad/1_result.json | 1 - .../Protocols/Providers/Squad/2_response.txt | Bin 2891 -> 0 bytes .../Protocols/Providers/Squad/2_result.json | 1 - .../Providers/Starmade/1_response.txt | Bin 139 -> 0 bytes .../Providers/Starmade/1_result.json | 1 - .../Providers/Teamspeak2/1_response.txt | 77 - .../Providers/Teamspeak2/1_result.json | 1 - .../Providers/Teamspeak3/1_response.txt | 64 - .../Providers/Teamspeak3/1_result.json | 1 - .../Providers/Teamspeak3/2_response.txt | 48 - .../Providers/Teamspeak3/2_result.json | 1 - .../Providers/Teeworlds/1_response.txt | Bin 116 -> 0 bytes .../Providers/Teeworlds/1_result.json | 1 - .../Providers/Teeworlds/2_response.txt | Bin 81 -> 0 bytes .../Providers/Teeworlds/2_result.json | 1 - .../Providers/Teeworlds/3_response.txt | Bin 529 -> 0 bytes .../Providers/Teeworlds/3_result.json | 1 - .../Providers/Terraria/1_response.txt | 100 - .../Providers/Terraria/1_result.json | 1 - .../Providers/Terraria/2_response.txt | 0 .../Providers/Terraria/2_result.json | 1 - .../Protocols/Providers/Tf2/1_response.txt | Bin 5278 -> 0 bytes .../Protocols/Providers/Tf2/1_result.json | 1 - .../Protocols/Providers/Tf2/2_response.txt | Bin 5107 -> 0 bytes .../Protocols/Providers/Tf2/2_result.json | 1 - .../Providers/Theforrest/1_response.txt | Bin 6 -> 0 bytes .../Providers/Theforrest/1_result.json | 1 - .../Providers/Theforrest/2_response.txt | Bin 223 -> 0 bytes .../Providers/Theforrest/2_result.json | 1 - .../Protocols/Providers/Tibia/1_response.txt | 2 - .../Protocols/Providers/Tibia/1_result.json | 1 - .../Protocols/Providers/Tibia/2_response.txt | 2 - .../Protocols/Providers/Tibia/2_result.json | 1 - .../Providers/Unturned/1_response.txt | Bin 630 -> 0 bytes .../Providers/Unturned/1_result.json | 1 - .../Providers/Unturned/2_response.txt | Bin 520 -> 0 bytes .../Providers/Unturned/2_result.json | 1 - .../Protocols/Providers/Ut/1_response.txt | 5 - .../Protocols/Providers/Ut/1_result.json | 1 - .../Protocols/Providers/Ut/2_response.txt | 5 - .../Protocols/Providers/Ut/2_result.json | 1 - .../Protocols/Providers/Ut/3_response.txt | 1 - .../Protocols/Providers/Ut/3_result.json | 1 - .../Protocols/Providers/Ut2004/1_response.txt | Bin 1332 -> 0 bytes .../Protocols/Providers/Ut2004/1_result.json | 1 - .../Protocols/Providers/Ut2004/2_response.txt | Bin 1287 -> 0 bytes .../Protocols/Providers/Ut2004/2_result.json | 1 - .../Protocols/Providers/Ut3/1_response.txt | Bin 1410 -> 0 bytes .../Protocols/Providers/Ut3/1_result.json | 1 - .../Providers/Ventrilo/1_response.txt | Bin 4687 -> 0 bytes .../Providers/Ventrilo/1_result.json | 1 - .../Providers/Ventrilo/2_response.txt | Bin 3906 -> 0 bytes .../Providers/Ventrilo/2_result.json | 1 - .../Protocols/Providers/Warsow/1_response.txt | 19 - .../Protocols/Providers/Warsow/1_result.json | 1 - .../Protocols/Providers/Warsow/2_response.txt | 14 - .../Protocols/Providers/Warsow/2_result.json | 1 - .../Protocols/Providers/Wurm/1_response.txt | Bin 294 -> 0 bytes .../Protocols/Providers/Wurm/1_result.json | 1 - .../Protocols/Providers/Wurm/2_response.txt | Bin 1372 -> 0 bytes .../Protocols/Providers/Wurm/2_result.json | 1 - .../Protocols/Providers/Wurm/3_response.txt | Bin 172 -> 0 bytes .../Protocols/Providers/Wurm/3_result.json | 1 - .../Protocols/Providers/server_list1.json | 12 - .../Protocols/Providers/server_list_bad.json | 12 - gameq/tests/Protocols/Quake2.php | 122 - gameq/tests/Protocols/Quake3.php | 122 - gameq/tests/Protocols/Quakelive.php | 50 - gameq/tests/Protocols/Redorchestra2.php | 50 - gameq/tests/Protocols/Risingstorm2.php | 78 - gameq/tests/Protocols/Rust.php | 50 - gameq/tests/Protocols/Samp.php | 160 - gameq/tests/Protocols/Sevendaystodie.php | 50 - gameq/tests/Protocols/Ship.php | 50 - gameq/tests/Protocols/Source.php | 127 - gameq/tests/Protocols/Spaceengineers.php | 50 - gameq/tests/Protocols/Squad.php | 50 - gameq/tests/Protocols/Starmade.php | 88 - gameq/tests/Protocols/Teamspeak2.php | 210 - gameq/tests/Protocols/Teamspeak3.php | 211 -- gameq/tests/Protocols/Teeworlds.php | 142 - gameq/tests/Protocols/Terraria.php | 46 - gameq/tests/Protocols/Tf2.php | 50 - gameq/tests/Protocols/Theforrest.php | 50 - gameq/tests/Protocols/Tibia.php | 120 - gameq/tests/Protocols/Unreal2.php | 100 - gameq/tests/Protocols/Unturned.php | 50 - gameq/tests/Protocols/Ut.php | 52 - gameq/tests/Protocols/Ut2004.php | 54 - gameq/tests/Protocols/Ut3.php | 54 - gameq/tests/Protocols/Ventrilo.php | 90 - gameq/tests/Protocols/Warsow.php | 50 - gameq/tests/Protocols/Wurm.php | 54 - gameq/tests/Protocols/generate_provider | 119 - .../tests/Providers/Buffer/16bitsigned_1.txt | 1 - .../tests/Providers/Buffer/16bitsigned_2.txt | 1 - .../Providers/Buffer/16bitsigned_be_1.txt | 1 - .../Providers/Buffer/16bitsigned_be_2.txt | 1 - .../Providers/Buffer/16bitunsigned_1.txt | 1 - .../Providers/Buffer/16bitunsigned_2.txt | 1 - .../Providers/Buffer/16bitunsigned_be_1.txt | 1 - .../Providers/Buffer/16bitunsigned_be_2.txt | 1 - .../tests/Providers/Buffer/32bitsigned_1.txt | 1 - .../tests/Providers/Buffer/32bitsigned_2.txt | 1 - .../Providers/Buffer/32bitsigned_be_1.txt | 1 - .../Providers/Buffer/32bitsigned_be_2.txt | 1 - .../Providers/Buffer/32bitunsigned_1.txt | 1 - .../Providers/Buffer/32bitunsigned_2.txt | 1 - .../Providers/Buffer/32bitunsigned_be_1.txt | 1 - .../Providers/Buffer/32bitunsigned_be_2.txt | 1 - gameq/tests/Providers/Buffer/32float_1.txt | 1 - gameq/tests/Providers/Buffer/32float_2.txt | 1 - gameq/tests/Providers/Buffer/32float_be_1.txt | 1 - gameq/tests/Providers/Buffer/32float_be_2.txt | 1 - .../Providers/Buffer/64bitunsigned_1.txt | 1 - .../Providers/Buffer/64bitunsigned_2.txt | Bin 8 -> 0 bytes .../Providers/Buffer/64bitunsigned_be_1.txt | 1 - .../Providers/Buffer/64bitunsigned_be_2.txt | Bin 8 -> 0 bytes gameq/tests/Providers/Buffer/8bitsigned_1.txt | 1 - gameq/tests/Providers/Buffer/8bitsigned_2.txt | 1 - .../tests/Providers/Buffer/8bitunsigned_1.txt | 1 - .../tests/Providers/Buffer/8bitunsigned_2.txt | 1 - gameq/tests/Query/Core.php | 66 - gameq/tests/Server.php | 284 -- gameq/tests/TestBase.php | 48 - gameq/vbox.md | 13 - 901 files changed, 2 insertions(+), 60319 deletions(-) delete mode 100644 GameQ/.github/FUNDING.yml delete mode 100644 GameQ/.github/issue_label_bot.yaml delete mode 100644 GameQ/.github/stale.yml delete mode 100644 GameQ/Autoloader.php delete mode 100644 GameQ/Buffer.php delete mode 100644 GameQ/CONTRIBUTING.md delete mode 100644 GameQ/Exception/Protocol.php delete mode 100644 GameQ/Exception/Query.php delete mode 100644 GameQ/Exception/Server.php delete mode 100644 GameQ/Filters/Base.php delete mode 100644 GameQ/Filters/Normalize.php delete mode 100644 GameQ/Filters/Secondstohuman.php delete mode 100644 GameQ/Filters/Stripcolors.php delete mode 100644 GameQ/Filters/Test.php delete mode 100644 GameQ/GameQ.php delete mode 100644 GameQ/LICENSE.lgpl delete mode 100644 GameQ/Protocol.php delete mode 100644 GameQ/Protocols/Aa3.php delete mode 100644 GameQ/Protocols/Aapg.php delete mode 100644 GameQ/Protocols/Arkse.php delete mode 100644 GameQ/Protocols/Arma.php delete mode 100644 GameQ/Protocols/Arma3.php delete mode 100644 GameQ/Protocols/Armedassault2oa.php delete mode 100644 GameQ/Protocols/Armedassault3.php delete mode 100644 GameQ/Protocols/Ase.php delete mode 100644 GameQ/Protocols/Atlas.php delete mode 100644 GameQ/Protocols/Batt1944.php delete mode 100644 GameQ/Protocols/Bf1942.php delete mode 100644 GameQ/Protocols/Bf2.php delete mode 100644 GameQ/Protocols/Bf3.php delete mode 100644 GameQ/Protocols/Bf4.php delete mode 100644 GameQ/Protocols/Bfbc2.php delete mode 100644 GameQ/Protocols/Bfh.php delete mode 100644 GameQ/Protocols/Brink.php delete mode 100644 GameQ/Protocols/Cod.php delete mode 100644 GameQ/Protocols/Cod2.php delete mode 100644 GameQ/Protocols/Cod4.php delete mode 100644 GameQ/Protocols/Codmw3.php delete mode 100644 GameQ/Protocols/Coduo.php delete mode 100644 GameQ/Protocols/Codwaw.php delete mode 100644 GameQ/Protocols/Conanexiles.php delete mode 100644 GameQ/Protocols/Contagion.php delete mode 100644 GameQ/Protocols/Crysis.php delete mode 100644 GameQ/Protocols/Crysis2.php delete mode 100644 GameQ/Protocols/Crysiswars.php delete mode 100644 GameQ/Protocols/Cs15.php delete mode 100644 GameQ/Protocols/Cs16.php delete mode 100644 GameQ/Protocols/Cs2d.php delete mode 100644 GameQ/Protocols/Cscz.php delete mode 100644 GameQ/Protocols/Csgo.php delete mode 100644 GameQ/Protocols/Css.php delete mode 100644 GameQ/Protocols/Dal.php delete mode 100644 GameQ/Protocols/Dayz.php delete mode 100644 GameQ/Protocols/Dayzmod.php delete mode 100644 GameQ/Protocols/Dod.php delete mode 100644 GameQ/Protocols/Dods.php delete mode 100644 GameQ/Protocols/Dow.php delete mode 100644 GameQ/Protocols/Eco.php delete mode 100644 GameQ/Protocols/Egs.php delete mode 100644 GameQ/Protocols/Et.php delete mode 100644 GameQ/Protocols/Etqw.php delete mode 100644 GameQ/Protocols/Ffe.php delete mode 100644 GameQ/Protocols/Ffow.php delete mode 100644 GameQ/Protocols/Gamespy.php delete mode 100644 GameQ/Protocols/Gamespy2.php delete mode 100644 GameQ/Protocols/Gamespy3.php delete mode 100644 GameQ/Protocols/Gamespy4.php delete mode 100644 GameQ/Protocols/Gmod.php delete mode 100644 GameQ/Protocols/Grav.php delete mode 100644 GameQ/Protocols/Gta5m.php delete mode 100644 GameQ/Protocols/Gtan.php delete mode 100644 GameQ/Protocols/Gtar.php delete mode 100644 GameQ/Protocols/Hl2dm.php delete mode 100644 GameQ/Protocols/Http.php delete mode 100644 GameQ/Protocols/Hurtworld.php delete mode 100644 GameQ/Protocols/Insurgency.php delete mode 100644 GameQ/Protocols/Insurgencysand.php delete mode 100644 GameQ/Protocols/Jediacademy.php delete mode 100644 GameQ/Protocols/Jedioutcast.php delete mode 100644 GameQ/Protocols/Justcause2.php delete mode 100644 GameQ/Protocols/Justcause3.php delete mode 100644 GameQ/Protocols/Killingfloor.php delete mode 100644 GameQ/Protocols/Killingfloor2.php delete mode 100644 GameQ/Protocols/L4d.php delete mode 100644 GameQ/Protocols/L4d2.php delete mode 100644 GameQ/Protocols/Lhmp.php delete mode 100644 GameQ/Protocols/Minecraft.php delete mode 100644 GameQ/Protocols/Minecraftpe.php delete mode 100644 GameQ/Protocols/Mohaa.php delete mode 100644 GameQ/Protocols/Mordhau.php delete mode 100644 GameQ/Protocols/Mta.php delete mode 100644 GameQ/Protocols/Mumble.php delete mode 100644 GameQ/Protocols/Ns2.php delete mode 100644 GameQ/Protocols/Pixark.php delete mode 100644 GameQ/Protocols/Projectrealitybf2.php delete mode 100644 GameQ/Protocols/Quake2.php delete mode 100644 GameQ/Protocols/Quake3.php delete mode 100644 GameQ/Protocols/Quakelive.php delete mode 100644 GameQ/Protocols/Redorchestra2.php delete mode 100644 GameQ/Protocols/Redorchestraostfront.php delete mode 100644 GameQ/Protocols/Risingstorm2.php delete mode 100644 GameQ/Protocols/Rust.php delete mode 100644 GameQ/Protocols/Samp.php delete mode 100644 GameQ/Protocols/Serioussam.php delete mode 100644 GameQ/Protocols/Sevendaystodie.php delete mode 100644 GameQ/Protocols/Ship.php delete mode 100644 GameQ/Protocols/Sof2.php delete mode 100644 GameQ/Protocols/Soldat.php delete mode 100644 GameQ/Protocols/Source.php delete mode 100644 GameQ/Protocols/Spaceengineers.php delete mode 100644 GameQ/Protocols/Squad.php delete mode 100644 GameQ/Protocols/Starmade.php delete mode 100644 GameQ/Protocols/Swat4.php delete mode 100644 GameQ/Protocols/Teamspeak2.php delete mode 100644 GameQ/Protocols/Teamspeak3.php delete mode 100644 GameQ/Protocols/Teeworlds.php delete mode 100644 GameQ/Protocols/Terraria.php delete mode 100644 GameQ/Protocols/Tf2.php delete mode 100644 GameQ/Protocols/Theforrest.php delete mode 100644 GameQ/Protocols/Tibia.php delete mode 100644 GameQ/Protocols/Tshock.php delete mode 100644 GameQ/Protocols/Unreal2.php delete mode 100644 GameQ/Protocols/Unturned.php delete mode 100644 GameQ/Protocols/Urbanterror.php delete mode 100644 GameQ/Protocols/Ut.php delete mode 100644 GameQ/Protocols/Ut2004.php delete mode 100644 GameQ/Protocols/Ut3.php delete mode 100644 GameQ/Protocols/Ventrilo.php delete mode 100644 GameQ/Protocols/Warsow.php delete mode 100644 GameQ/Protocols/Won.php delete mode 100644 GameQ/Protocols/Wurm.php delete mode 100644 GameQ/Query/Core.php delete mode 100644 GameQ/Query/Native.php delete mode 100644 GameQ/Result.php delete mode 100644 GameQ/Server.php delete mode 100644 GameQ/composer.json delete mode 100644 GameQ/examples/list.php delete mode 100644 GameQ/expansion.php delete mode 100644 GameQ/expansion_.php delete mode 100644 GameQ/index.php delete mode 100644 GameQ/src/GameQ/Autoloader.php delete mode 100644 GameQ/src/GameQ/Buffer.php delete mode 100644 GameQ/src/GameQ/Exception/Protocol.php delete mode 100644 GameQ/src/GameQ/Exception/Query.php delete mode 100644 GameQ/src/GameQ/Exception/Server.php delete mode 100644 GameQ/src/GameQ/Filters/Base.php delete mode 100644 GameQ/src/GameQ/Filters/Normalize.php delete mode 100644 GameQ/src/GameQ/Filters/Secondstohuman.php delete mode 100644 GameQ/src/GameQ/Filters/Stripcolors.php delete mode 100644 GameQ/src/GameQ/Filters/Test.php delete mode 100644 GameQ/src/GameQ/GameQ.php delete mode 100644 GameQ/src/GameQ/Protocol.php delete mode 100644 GameQ/src/GameQ/Protocols/Aa3.php delete mode 100644 GameQ/src/GameQ/Protocols/Aapg.php delete mode 100644 GameQ/src/GameQ/Protocols/Arkse.php delete mode 100644 GameQ/src/GameQ/Protocols/Arma.php delete mode 100644 GameQ/src/GameQ/Protocols/Arma3.php delete mode 100644 GameQ/src/GameQ/Protocols/Armedassault2oa.php delete mode 100644 GameQ/src/GameQ/Protocols/Armedassault3.php delete mode 100644 GameQ/src/GameQ/Protocols/Ase.php delete mode 100644 GameQ/src/GameQ/Protocols/Atlas.php delete mode 100644 GameQ/src/GameQ/Protocols/Batt1944.php delete mode 100644 GameQ/src/GameQ/Protocols/Bf1942.php delete mode 100644 GameQ/src/GameQ/Protocols/Bf2.php delete mode 100644 GameQ/src/GameQ/Protocols/Bf3.php delete mode 100644 GameQ/src/GameQ/Protocols/Bf4.php delete mode 100644 GameQ/src/GameQ/Protocols/Bfbc2.php delete mode 100644 GameQ/src/GameQ/Protocols/Bfh.php delete mode 100644 GameQ/src/GameQ/Protocols/Brink.php delete mode 100644 GameQ/src/GameQ/Protocols/Cod.php delete mode 100644 GameQ/src/GameQ/Protocols/Cod2.php delete mode 100644 GameQ/src/GameQ/Protocols/Cod4.php delete mode 100644 GameQ/src/GameQ/Protocols/Codmw3.php delete mode 100644 GameQ/src/GameQ/Protocols/Coduo.php delete mode 100644 GameQ/src/GameQ/Protocols/Codwaw.php delete mode 100644 GameQ/src/GameQ/Protocols/Conanexiles.php delete mode 100644 GameQ/src/GameQ/Protocols/Contagion.php delete mode 100644 GameQ/src/GameQ/Protocols/Crysis.php delete mode 100644 GameQ/src/GameQ/Protocols/Crysis2.php delete mode 100644 GameQ/src/GameQ/Protocols/Crysiswars.php delete mode 100644 GameQ/src/GameQ/Protocols/Cs15.php delete mode 100644 GameQ/src/GameQ/Protocols/Cs16.php delete mode 100644 GameQ/src/GameQ/Protocols/Cs2d.php delete mode 100644 GameQ/src/GameQ/Protocols/Cscz.php delete mode 100644 GameQ/src/GameQ/Protocols/Csgo.php delete mode 100644 GameQ/src/GameQ/Protocols/Css.php delete mode 100644 GameQ/src/GameQ/Protocols/Dal.php delete mode 100644 GameQ/src/GameQ/Protocols/Dayz.php delete mode 100644 GameQ/src/GameQ/Protocols/Dayzmod.php delete mode 100644 GameQ/src/GameQ/Protocols/Dod.php delete mode 100644 GameQ/src/GameQ/Protocols/Dods.php delete mode 100644 GameQ/src/GameQ/Protocols/Dow.php delete mode 100644 GameQ/src/GameQ/Protocols/Eco.php delete mode 100644 GameQ/src/GameQ/Protocols/Egs.php delete mode 100644 GameQ/src/GameQ/Protocols/Et.php delete mode 100644 GameQ/src/GameQ/Protocols/Etqw.php delete mode 100644 GameQ/src/GameQ/Protocols/Ffe.php delete mode 100644 GameQ/src/GameQ/Protocols/Ffow.php delete mode 100644 GameQ/src/GameQ/Protocols/Gamespy.php delete mode 100644 GameQ/src/GameQ/Protocols/Gamespy2.php delete mode 100644 GameQ/src/GameQ/Protocols/Gamespy3.php delete mode 100644 GameQ/src/GameQ/Protocols/Gamespy4.php delete mode 100644 GameQ/src/GameQ/Protocols/Gmod.php delete mode 100644 GameQ/src/GameQ/Protocols/Grav.php delete mode 100644 GameQ/src/GameQ/Protocols/Gta5m.php delete mode 100644 GameQ/src/GameQ/Protocols/Gtan.php delete mode 100644 GameQ/src/GameQ/Protocols/Hl2dm.php delete mode 100644 GameQ/src/GameQ/Protocols/Http.php delete mode 100644 GameQ/src/GameQ/Protocols/Hurtworld.php delete mode 100644 GameQ/src/GameQ/Protocols/Insurgency.php delete mode 100644 GameQ/src/GameQ/Protocols/Insurgencysand.php delete mode 100644 GameQ/src/GameQ/Protocols/Jediacademy.php delete mode 100644 GameQ/src/GameQ/Protocols/Jedioutcast.php delete mode 100644 GameQ/src/GameQ/Protocols/Justcause2.php delete mode 100644 GameQ/src/GameQ/Protocols/Justcause3.php delete mode 100644 GameQ/src/GameQ/Protocols/Killingfloor.php delete mode 100644 GameQ/src/GameQ/Protocols/Killingfloor2.php delete mode 100644 GameQ/src/GameQ/Protocols/L4d.php delete mode 100644 GameQ/src/GameQ/Protocols/L4d2.php delete mode 100644 GameQ/src/GameQ/Protocols/Lhmp.php delete mode 100644 GameQ/src/GameQ/Protocols/Minecraft.php delete mode 100644 GameQ/src/GameQ/Protocols/Minecraftpe.php delete mode 100644 GameQ/src/GameQ/Protocols/Mohaa.php delete mode 100644 GameQ/src/GameQ/Protocols/Mordhau.php delete mode 100644 GameQ/src/GameQ/Protocols/Mta.php delete mode 100644 GameQ/src/GameQ/Protocols/Mumble.php delete mode 100644 GameQ/src/GameQ/Protocols/Ns2.php delete mode 100644 GameQ/src/GameQ/Protocols/Pixark.php delete mode 100644 GameQ/src/GameQ/Protocols/Projectrealitybf2.php delete mode 100644 GameQ/src/GameQ/Protocols/Quake2.php delete mode 100644 GameQ/src/GameQ/Protocols/Quake3.php delete mode 100644 GameQ/src/GameQ/Protocols/Quakelive.php delete mode 100644 GameQ/src/GameQ/Protocols/Redorchestra2.php delete mode 100644 GameQ/src/GameQ/Protocols/Redorchestraostfront.php delete mode 100644 GameQ/src/GameQ/Protocols/Risingstorm2.php delete mode 100644 GameQ/src/GameQ/Protocols/Rust.php delete mode 100644 GameQ/src/GameQ/Protocols/Samp.php delete mode 100644 GameQ/src/GameQ/Protocols/Serioussam.php delete mode 100644 GameQ/src/GameQ/Protocols/Sevendaystodie.php delete mode 100644 GameQ/src/GameQ/Protocols/Ship.php delete mode 100644 GameQ/src/GameQ/Protocols/Sof2.php delete mode 100644 GameQ/src/GameQ/Protocols/Soldat.php delete mode 100644 GameQ/src/GameQ/Protocols/Source.php delete mode 100644 GameQ/src/GameQ/Protocols/Spaceengineers.php delete mode 100644 GameQ/src/GameQ/Protocols/Squad.php delete mode 100644 GameQ/src/GameQ/Protocols/Starmade.php delete mode 100644 GameQ/src/GameQ/Protocols/Swat4.php delete mode 100644 GameQ/src/GameQ/Protocols/Teamspeak2.php delete mode 100644 GameQ/src/GameQ/Protocols/Teamspeak3.php delete mode 100644 GameQ/src/GameQ/Protocols/Teeworlds.php delete mode 100644 GameQ/src/GameQ/Protocols/Terraria.php delete mode 100644 GameQ/src/GameQ/Protocols/Tf2.php delete mode 100644 GameQ/src/GameQ/Protocols/Theforrest.php delete mode 100644 GameQ/src/GameQ/Protocols/Tibia.php delete mode 100644 GameQ/src/GameQ/Protocols/Tshock.php delete mode 100644 GameQ/src/GameQ/Protocols/Unreal2.php delete mode 100644 GameQ/src/GameQ/Protocols/Unturned.php delete mode 100644 GameQ/src/GameQ/Protocols/Urbanterror.php delete mode 100644 GameQ/src/GameQ/Protocols/Ut.php delete mode 100644 GameQ/src/GameQ/Protocols/Ut2004.php delete mode 100644 GameQ/src/GameQ/Protocols/Ut3.php delete mode 100644 GameQ/src/GameQ/Protocols/Ventrilo.php delete mode 100644 GameQ/src/GameQ/Protocols/Warsow.php delete mode 100644 GameQ/src/GameQ/Protocols/Won.php delete mode 100644 GameQ/src/GameQ/Protocols/Wurm.php delete mode 100644 GameQ/src/GameQ/Query/Core.php delete mode 100644 GameQ/src/GameQ/Query/Native.php delete mode 100644 GameQ/src/GameQ/Result.php delete mode 100644 GameQ/src/GameQ/Server.php delete mode 100644 GameQ/status_expansion.php delete mode 100644 GameQ/status_livonia.php delete mode 100644 gameq/.coveralls.yml delete mode 100644 gameq/.gitattributes delete mode 100644 gameq/.gitignore delete mode 100644 gameq/.scrutinizer.yml delete mode 100644 gameq/.travis.yml delete mode 100644 gameq/CONTRIBUTING.md delete mode 100644 gameq/LICENSE.lgpl delete mode 100644 gameq/README.md delete mode 100644 gameq/build/config/phpcs.xml delete mode 100644 gameq/build/config/phpmd.xml delete mode 100644 gameq/cmds.md delete mode 100644 gameq/composer.json delete mode 100644 gameq/examples/list.php delete mode 100644 gameq/index.php delete mode 100644 gameq/phpunit.xml delete mode 100644 gameq/phpunit.xml.dist delete mode 100644 gameq/src/GameQ/Autoloader.php delete mode 100644 gameq/src/GameQ/Buffer.php delete mode 100644 gameq/src/GameQ/Exception/Protocol.php delete mode 100644 gameq/src/GameQ/Exception/Query.php delete mode 100644 gameq/src/GameQ/Exception/Server.php delete mode 100644 gameq/src/GameQ/Filters/Base.php delete mode 100644 gameq/src/GameQ/Filters/Normalize.php delete mode 100644 gameq/src/GameQ/Filters/Secondstohuman.php delete mode 100644 gameq/src/GameQ/Filters/Stripcolors.php delete mode 100644 gameq/src/GameQ/Filters/Test.php delete mode 100644 gameq/src/GameQ/GameQ.php delete mode 100644 gameq/src/GameQ/Protocol.php delete mode 100644 gameq/src/GameQ/Protocols/Aa3.php delete mode 100644 gameq/src/GameQ/Protocols/Aapg.php delete mode 100644 gameq/src/GameQ/Protocols/Arkse.php delete mode 100644 gameq/src/GameQ/Protocols/Arma3.php delete mode 100644 gameq/src/GameQ/Protocols/Armedassault2oa.php delete mode 100644 gameq/src/GameQ/Protocols/Armedassault3.php delete mode 100644 gameq/src/GameQ/Protocols/Ase.php delete mode 100644 gameq/src/GameQ/Protocols/Batt1944.php delete mode 100644 gameq/src/GameQ/Protocols/Bf1942.php delete mode 100644 gameq/src/GameQ/Protocols/Bf2.php delete mode 100644 gameq/src/GameQ/Protocols/Bf3.php delete mode 100644 gameq/src/GameQ/Protocols/Bf4.php delete mode 100644 gameq/src/GameQ/Protocols/Bfbc2.php delete mode 100644 gameq/src/GameQ/Protocols/Bfh.php delete mode 100644 gameq/src/GameQ/Protocols/Cod2.php delete mode 100644 gameq/src/GameQ/Protocols/Cod4.php delete mode 100644 gameq/src/GameQ/Protocols/Codmw3.php delete mode 100644 gameq/src/GameQ/Protocols/Conanexiles.php delete mode 100644 gameq/src/GameQ/Protocols/Crysiswars.php delete mode 100644 gameq/src/GameQ/Protocols/Cs15.php delete mode 100644 gameq/src/GameQ/Protocols/Cs16.php delete mode 100644 gameq/src/GameQ/Protocols/Cscz.php delete mode 100644 gameq/src/GameQ/Protocols/Csgo.php delete mode 100644 gameq/src/GameQ/Protocols/Css.php delete mode 100644 gameq/src/GameQ/Protocols/Dayz.php delete mode 100644 gameq/src/GameQ/Protocols/Dayzmod.php delete mode 100644 gameq/src/GameQ/Protocols/Dod.php delete mode 100644 gameq/src/GameQ/Protocols/Dods.php delete mode 100644 gameq/src/GameQ/Protocols/Dow.php delete mode 100644 gameq/src/GameQ/Protocols/Eco.php delete mode 100644 gameq/src/GameQ/Protocols/Egs.php delete mode 100644 gameq/src/GameQ/Protocols/Etqw.php delete mode 100644 gameq/src/GameQ/Protocols/Ffe.php delete mode 100644 gameq/src/GameQ/Protocols/Ffow.php delete mode 100644 gameq/src/GameQ/Protocols/Gamespy.php delete mode 100644 gameq/src/GameQ/Protocols/Gamespy3.php delete mode 100644 gameq/src/GameQ/Protocols/Gamespy4.php delete mode 100644 gameq/src/GameQ/Protocols/Gmod.php delete mode 100644 gameq/src/GameQ/Protocols/Grav.php delete mode 100644 gameq/src/GameQ/Protocols/Gta5m.php delete mode 100644 gameq/src/GameQ/Protocols/Gtan.php delete mode 100644 gameq/src/GameQ/Protocols/Hl2dm.php delete mode 100644 gameq/src/GameQ/Protocols/Http.php delete mode 100644 gameq/src/GameQ/Protocols/Insurgency.php delete mode 100644 gameq/src/GameQ/Protocols/Jediacademy.php delete mode 100644 gameq/src/GameQ/Protocols/Jedioutcast.php delete mode 100644 gameq/src/GameQ/Protocols/Justcause2.php delete mode 100644 gameq/src/GameQ/Protocols/Justcause3.php delete mode 100644 gameq/src/GameQ/Protocols/Killingfloor.php delete mode 100644 gameq/src/GameQ/Protocols/Killingfloor2.php delete mode 100644 gameq/src/GameQ/Protocols/L4d.php delete mode 100644 gameq/src/GameQ/Protocols/L4d2.php delete mode 100644 gameq/src/GameQ/Protocols/Lhmp.php delete mode 100644 gameq/src/GameQ/Protocols/Minecraft.php delete mode 100644 gameq/src/GameQ/Protocols/Minecraftpe.php delete mode 100644 gameq/src/GameQ/Protocols/Mohaa.php delete mode 100644 gameq/src/GameQ/Protocols/Mta.php delete mode 100644 gameq/src/GameQ/Protocols/Mumble.php delete mode 100644 gameq/src/GameQ/Protocols/Ns2.php delete mode 100644 gameq/src/GameQ/Protocols/Projectrealitybf2.php delete mode 100644 gameq/src/GameQ/Protocols/Quake2.php delete mode 100644 gameq/src/GameQ/Protocols/Quake3.php delete mode 100644 gameq/src/GameQ/Protocols/Quakelive.php delete mode 100644 gameq/src/GameQ/Protocols/Redorchestra2.php delete mode 100644 gameq/src/GameQ/Protocols/Risingstorm2.php delete mode 100644 gameq/src/GameQ/Protocols/Rust.php delete mode 100644 gameq/src/GameQ/Protocols/Samp.php delete mode 100644 gameq/src/GameQ/Protocols/Sevendaystodie.php delete mode 100644 gameq/src/GameQ/Protocols/Ship.php delete mode 100644 gameq/src/GameQ/Protocols/Soldat.php delete mode 100644 gameq/src/GameQ/Protocols/Source.php delete mode 100644 gameq/src/GameQ/Protocols/Spaceengineers.php delete mode 100644 gameq/src/GameQ/Protocols/Squad.php delete mode 100644 gameq/src/GameQ/Protocols/Starmade.php delete mode 100644 gameq/src/GameQ/Protocols/Teamspeak2.php delete mode 100644 gameq/src/GameQ/Protocols/Teamspeak3.php delete mode 100644 gameq/src/GameQ/Protocols/Teeworlds.php delete mode 100644 gameq/src/GameQ/Protocols/Terraria.php delete mode 100644 gameq/src/GameQ/Protocols/Tf2.php delete mode 100644 gameq/src/GameQ/Protocols/Theforrest.php delete mode 100644 gameq/src/GameQ/Protocols/Tibia.php delete mode 100644 gameq/src/GameQ/Protocols/Tshock.php delete mode 100644 gameq/src/GameQ/Protocols/Unreal2.php delete mode 100644 gameq/src/GameQ/Protocols/Unturned.php delete mode 100644 gameq/src/GameQ/Protocols/Ut.php delete mode 100644 gameq/src/GameQ/Protocols/Ut2004.php delete mode 100644 gameq/src/GameQ/Protocols/Ut3.php delete mode 100644 gameq/src/GameQ/Protocols/Ventrilo.php delete mode 100644 gameq/src/GameQ/Protocols/Warsow.php delete mode 100644 gameq/src/GameQ/Protocols/Won.php delete mode 100644 gameq/src/GameQ/Protocols/Wurm.php delete mode 100644 gameq/src/GameQ/Query/Core.php delete mode 100644 gameq/src/GameQ/Query/Native.php delete mode 100644 gameq/src/GameQ/Result.php delete mode 100644 gameq/src/GameQ/Server.php delete mode 100644 gameq/stat.php delete mode 100644 gameq/tests/Buffer.php delete mode 100644 gameq/tests/Filters/Base.php delete mode 100644 gameq/tests/Filters/Normalize.php delete mode 100644 gameq/tests/Filters/Providers/Normalize/css_1.json delete mode 100644 gameq/tests/Filters/Providers/Normalize/css_2.json delete mode 100644 gameq/tests/Filters/Providers/Normalize/mumble_1.json delete mode 100644 gameq/tests/Filters/Providers/Stripcolors/cod4_1.json delete mode 100644 gameq/tests/Filters/Providers/Stripcolors/cod4_2.json delete mode 100644 gameq/tests/Filters/Providers/Stripcolors/minecraft_1.json delete mode 100644 gameq/tests/Filters/Secondstohuman.php delete mode 100644 gameq/tests/Filters/Stripcolors.php delete mode 100644 gameq/tests/GameQ.php delete mode 100644 gameq/tests/Issues/Issue307.php delete mode 100644 gameq/tests/Issues/Issue382.php delete mode 100644 gameq/tests/Issues/Providers/307.txt delete mode 100644 gameq/tests/Issues/Providers/382.txt delete mode 100644 gameq/tests/Protocol.php delete mode 100644 gameq/tests/Protocols/Aa3.php delete mode 100644 gameq/tests/Protocols/Aapg.php delete mode 100644 gameq/tests/Protocols/Arkse.php delete mode 100644 gameq/tests/Protocols/Arma3.php delete mode 100644 gameq/tests/Protocols/Armedassault2oa.php delete mode 100644 gameq/tests/Protocols/Ase.php delete mode 100644 gameq/tests/Protocols/Base.php delete mode 100644 gameq/tests/Protocols/Batt1944.php delete mode 100644 gameq/tests/Protocols/Bf1942.php delete mode 100644 gameq/tests/Protocols/Bf2.php delete mode 100644 gameq/tests/Protocols/Bf3.php delete mode 100644 gameq/tests/Protocols/Bf4.php delete mode 100644 gameq/tests/Protocols/Bfbc2.php delete mode 100644 gameq/tests/Protocols/Bfh.php delete mode 100644 gameq/tests/Protocols/Cod2.php delete mode 100644 gameq/tests/Protocols/Cod4.php delete mode 100644 gameq/tests/Protocols/Codmw3.php delete mode 100644 gameq/tests/Protocols/Conanexiles.php delete mode 100644 gameq/tests/Protocols/Crysiswars.php delete mode 100644 gameq/tests/Protocols/Cs15.php delete mode 100644 gameq/tests/Protocols/Cs16.php delete mode 100644 gameq/tests/Protocols/Cscz.php delete mode 100644 gameq/tests/Protocols/Csgo.php delete mode 100644 gameq/tests/Protocols/Css.php delete mode 100644 gameq/tests/Protocols/Dayz.php delete mode 100644 gameq/tests/Protocols/Dayzmod.php delete mode 100644 gameq/tests/Protocols/Dod.php delete mode 100644 gameq/tests/Protocols/Dods.php delete mode 100644 gameq/tests/Protocols/Dow.php delete mode 100644 gameq/tests/Protocols/Eco.php delete mode 100644 gameq/tests/Protocols/Egs.php delete mode 100644 gameq/tests/Protocols/Etqw.php delete mode 100644 gameq/tests/Protocols/Ffe.php delete mode 100644 gameq/tests/Protocols/Ffow.php delete mode 100644 gameq/tests/Protocols/Gamespy.php delete mode 100644 gameq/tests/Protocols/Gmod.php delete mode 100644 gameq/tests/Protocols/Grav.php delete mode 100644 gameq/tests/Protocols/Gta5m.php delete mode 100644 gameq/tests/Protocols/Gtan.php delete mode 100644 gameq/tests/Protocols/Hl2dm.php delete mode 100644 gameq/tests/Protocols/Insurgency.php delete mode 100644 gameq/tests/Protocols/Jediacademy.php delete mode 100644 gameq/tests/Protocols/Jedioutcast.php delete mode 100644 gameq/tests/Protocols/Justcause2.php delete mode 100644 gameq/tests/Protocols/Justcause3.php delete mode 100644 gameq/tests/Protocols/Killingfloor.php delete mode 100644 gameq/tests/Protocols/Killingfloor2.php delete mode 100644 gameq/tests/Protocols/L4d.php delete mode 100644 gameq/tests/Protocols/L4d2.php delete mode 100644 gameq/tests/Protocols/Lhmp.php delete mode 100644 gameq/tests/Protocols/Minecraft.php delete mode 100644 gameq/tests/Protocols/Minecraftpe.php delete mode 100644 gameq/tests/Protocols/Mohaa.php delete mode 100644 gameq/tests/Protocols/Mta.php delete mode 100644 gameq/tests/Protocols/Mumble.php delete mode 100644 gameq/tests/Protocols/Ns2.php delete mode 100644 gameq/tests/Protocols/Projectrealitybf2.php delete mode 100644 gameq/tests/Protocols/Providers/Aa3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Aa3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Aa3/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Aa3/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Aapg/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Aapg/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Aapg/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Aapg/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Arkse/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Arkse/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Arkse/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Arkse/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Arkse/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Arkse/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Arma3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Arma3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Arma3/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Arma3/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Arma3/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Arma3/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Armedassault2oa/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Armedassault2oa/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Armedassault2oa/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Armedassault2oa/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Armedassault2oa/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Armedassault2oa/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Batt1944/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Batt1944/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Batt1944/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Batt1944/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf1942/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf1942/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf1942/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf1942/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf1942/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf1942/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf2/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf2/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf2/4_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf2/4_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf3/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf3/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf3/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf3/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf4/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf4/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bf4/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bf4/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bfbc2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bfbc2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bfbc2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bfbc2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bfbc2/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bfbc2/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bfh/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bfh/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Bfh/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Bfh/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cod2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cod2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cod2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cod2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cod4/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cod4/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cod4/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cod4/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Codmw3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Codmw3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Codmw3/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Codmw3/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Conanexiles/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Conanexiles/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Conanexiles/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Conanexiles/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Conanexiles/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Conanexiles/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Crysiswars/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Crysiswars/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cs15/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cs15/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cs15/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cs15/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cs16/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cs16/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cs16/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cs16/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cs16/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cs16/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cscz/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cscz/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Cscz/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Cscz/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Csgo/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Csgo/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Csgo/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Csgo/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Css/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Css/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Css/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Css/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Css/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Css/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dayz/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dayz/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dayz/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dayz/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dayzmod/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dayzmod/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dayzmod/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dayzmod/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dod/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dod/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dod/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dod/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dods/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dods/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dods/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dods/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dow/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dow/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Dow/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Dow/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Eco/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Eco/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Eco/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Eco/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Egs/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Egs/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Egs/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Egs/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Etqw/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Etqw/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Etqw/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Etqw/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Etqw/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Etqw/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ffe/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ffe/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ffe/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ffe/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ffe/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ffe/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ffow/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ffow/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ffow/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ffow/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Gmod/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Gmod/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Gmod/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Gmod/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Grav/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Grav/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Gta5m/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Gta5m/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Gta5m/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Gta5m/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Gta5m/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Gta5m/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Gtan/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Gtan/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Gtan/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Gtan/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Hl2dm/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Hl2dm/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Hl2dm/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Hl2dm/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Insurgency/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Insurgency/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Insurgency/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Insurgency/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Jediacademy/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Jediacademy/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Jediacademy/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Jediacademy/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Jediacademy/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Jediacademy/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Jedioutcast/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Jedioutcast/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Jedioutcast/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Jedioutcast/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Jedioutcast/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Jedioutcast/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Justcause2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Justcause2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Justcause2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Justcause2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Justcause2/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Justcause2/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Justcause3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Justcause3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Justcause3/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Justcause3/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor2/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Killingfloor2/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/L4d/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/L4d/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/L4d/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/L4d/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/L4d2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/L4d2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/L4d2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/L4d2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Lhmp/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Lhmp/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Lhmp/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Lhmp/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/4_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Minecraft/4_result.json delete mode 100644 gameq/tests/Protocols/Providers/Minecraftpe/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Minecraftpe/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Minecraftpe/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Minecraftpe/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Mohaa/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Mohaa/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Mohaa/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Mohaa/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Mohaa/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Mohaa/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Mta/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Mta/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Mta/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Mta/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Mumble/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Mumble/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Mumble/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Mumble/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ns2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ns2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ns2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ns2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Projectrealitybf2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Projectrealitybf2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Projectrealitybf2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Projectrealitybf2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Projectrealitybf2/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Projectrealitybf2/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quake2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quake2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quake2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quake2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quake2/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quake2/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quake3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quake3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quake3/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quake3/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quakelive/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quakelive/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quakelive/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quakelive/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Quakelive/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Quakelive/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Redorchestra2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Redorchestra2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Redorchestra2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Redorchestra2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Risingstorm2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Risingstorm2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Risingstorm2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Risingstorm2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Risingstorm2/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Risingstorm2/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Rust/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Rust/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Rust/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Rust/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Samp/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Samp/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Samp/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Samp/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Sevendaystodie/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Sevendaystodie/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Sevendaystodie/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Sevendaystodie/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ship/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ship/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ship/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ship/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ship/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ship/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Spaceengineers/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Spaceengineers/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Spaceengineers/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Spaceengineers/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Squad/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Squad/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Squad/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Squad/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Starmade/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Starmade/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Teamspeak2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Teamspeak2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Teamspeak3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Teamspeak3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Teamspeak3/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Teamspeak3/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Teeworlds/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Teeworlds/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Teeworlds/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Teeworlds/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Teeworlds/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Teeworlds/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Terraria/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Terraria/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Terraria/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Terraria/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Tf2/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Tf2/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Tf2/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Tf2/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Theforrest/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Theforrest/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Theforrest/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Theforrest/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Tibia/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Tibia/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Tibia/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Tibia/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Unturned/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Unturned/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Unturned/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Unturned/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ut/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ut/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ut/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ut/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ut/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ut/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ut2004/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ut2004/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ut2004/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ut2004/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ut3/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ut3/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ventrilo/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ventrilo/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Ventrilo/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Ventrilo/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Warsow/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Warsow/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Warsow/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Warsow/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Wurm/1_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Wurm/1_result.json delete mode 100644 gameq/tests/Protocols/Providers/Wurm/2_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Wurm/2_result.json delete mode 100644 gameq/tests/Protocols/Providers/Wurm/3_response.txt delete mode 100644 gameq/tests/Protocols/Providers/Wurm/3_result.json delete mode 100644 gameq/tests/Protocols/Providers/server_list1.json delete mode 100644 gameq/tests/Protocols/Providers/server_list_bad.json delete mode 100644 gameq/tests/Protocols/Quake2.php delete mode 100644 gameq/tests/Protocols/Quake3.php delete mode 100644 gameq/tests/Protocols/Quakelive.php delete mode 100644 gameq/tests/Protocols/Redorchestra2.php delete mode 100644 gameq/tests/Protocols/Risingstorm2.php delete mode 100644 gameq/tests/Protocols/Rust.php delete mode 100644 gameq/tests/Protocols/Samp.php delete mode 100644 gameq/tests/Protocols/Sevendaystodie.php delete mode 100644 gameq/tests/Protocols/Ship.php delete mode 100644 gameq/tests/Protocols/Source.php delete mode 100644 gameq/tests/Protocols/Spaceengineers.php delete mode 100644 gameq/tests/Protocols/Squad.php delete mode 100644 gameq/tests/Protocols/Starmade.php delete mode 100644 gameq/tests/Protocols/Teamspeak2.php delete mode 100644 gameq/tests/Protocols/Teamspeak3.php delete mode 100644 gameq/tests/Protocols/Teeworlds.php delete mode 100644 gameq/tests/Protocols/Terraria.php delete mode 100644 gameq/tests/Protocols/Tf2.php delete mode 100644 gameq/tests/Protocols/Theforrest.php delete mode 100644 gameq/tests/Protocols/Tibia.php delete mode 100644 gameq/tests/Protocols/Unreal2.php delete mode 100644 gameq/tests/Protocols/Unturned.php delete mode 100644 gameq/tests/Protocols/Ut.php delete mode 100644 gameq/tests/Protocols/Ut2004.php delete mode 100644 gameq/tests/Protocols/Ut3.php delete mode 100644 gameq/tests/Protocols/Ventrilo.php delete mode 100644 gameq/tests/Protocols/Warsow.php delete mode 100644 gameq/tests/Protocols/Wurm.php delete mode 100644 gameq/tests/Protocols/generate_provider delete mode 100644 gameq/tests/Providers/Buffer/16bitsigned_1.txt delete mode 100644 gameq/tests/Providers/Buffer/16bitsigned_2.txt delete mode 100644 gameq/tests/Providers/Buffer/16bitsigned_be_1.txt delete mode 100644 gameq/tests/Providers/Buffer/16bitsigned_be_2.txt delete mode 100644 gameq/tests/Providers/Buffer/16bitunsigned_1.txt delete mode 100644 gameq/tests/Providers/Buffer/16bitunsigned_2.txt delete mode 100644 gameq/tests/Providers/Buffer/16bitunsigned_be_1.txt delete mode 100644 gameq/tests/Providers/Buffer/16bitunsigned_be_2.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitsigned_1.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitsigned_2.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitsigned_be_1.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitsigned_be_2.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitunsigned_1.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitunsigned_2.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitunsigned_be_1.txt delete mode 100644 gameq/tests/Providers/Buffer/32bitunsigned_be_2.txt delete mode 100644 gameq/tests/Providers/Buffer/32float_1.txt delete mode 100644 gameq/tests/Providers/Buffer/32float_2.txt delete mode 100644 gameq/tests/Providers/Buffer/32float_be_1.txt delete mode 100644 gameq/tests/Providers/Buffer/32float_be_2.txt delete mode 100644 gameq/tests/Providers/Buffer/64bitunsigned_1.txt delete mode 100644 gameq/tests/Providers/Buffer/64bitunsigned_2.txt delete mode 100644 gameq/tests/Providers/Buffer/64bitunsigned_be_1.txt delete mode 100644 gameq/tests/Providers/Buffer/64bitunsigned_be_2.txt delete mode 100644 gameq/tests/Providers/Buffer/8bitsigned_1.txt delete mode 100644 gameq/tests/Providers/Buffer/8bitsigned_2.txt delete mode 100644 gameq/tests/Providers/Buffer/8bitunsigned_1.txt delete mode 100644 gameq/tests/Providers/Buffer/8bitunsigned_2.txt delete mode 100644 gameq/tests/Query/Core.php delete mode 100644 gameq/tests/Server.php delete mode 100644 gameq/tests/TestBase.php delete mode 100644 gameq/vbox.md diff --git a/.gitignore b/.gitignore index 6b1b140..34ca616 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ test/ -GameQ/ -gameq/ -.gitignore +test + diff --git a/GameQ/.github/FUNDING.yml b/GameQ/.github/FUNDING.yml deleted file mode 100644 index ab0b19c..0000000 --- a/GameQ/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: ["https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VAU2KADATP5PU"] diff --git a/GameQ/.github/issue_label_bot.yaml b/GameQ/.github/issue_label_bot.yaml deleted file mode 100644 index fffb9aa..0000000 --- a/GameQ/.github/issue_label_bot.yaml +++ /dev/null @@ -1,4 +0,0 @@ -label-alias: - bug: 'Bug' - feature_request: 'Feature Request' - question: 'Support' diff --git a/GameQ/.github/stale.yml b/GameQ/.github/stale.yml deleted file mode 100644 index befa7b4..0000000 --- a/GameQ/.github/stale.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 28 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 14 -# Issues with these labels will never be considered stale -exemptLabels: - - Bug - - Feature Request - - Support -# Label to use when marking an issue as stale -staleLabel: Stale -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false - diff --git a/GameQ/Autoloader.php b/GameQ/Autoloader.php deleted file mode 100644 index 7c8eb41..0000000 --- a/GameQ/Autoloader.php +++ /dev/null @@ -1,60 +0,0 @@ -. - * - * - */ - -/** - * A simple PSR-4 spec auto loader to allow GameQ to function the same as if it were loaded via Composer - * - * To use this just include this file in your script and the GameQ namespace will be made available - * - * i.e. require_once('/path/to/src/GameQ/Autoloader.php'); - * - * See: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md - * - * @codeCoverageIgnore - */ -spl_autoload_register(function ($class) { - - // project-specific namespace prefix - $prefix = 'GameQ\\'; - - // base directory for the namespace prefix - $base_dir = __DIR__ . DIRECTORY_SEPARATOR; - - // does the class use the namespace prefix? - $len = strlen($prefix); - - if (strncmp($prefix, $class, $len) !== 0) { - // no, move to the next registered autoloader - return; - } - - // get the relative class name - $relative_class = substr($class, $len); - - // replace the namespace prefix with the base directory, replace namespace - // separators with directory separators in the relative class name, append - // with .php - $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; - - // if the file exists, require it - if (file_exists($file)) { - require $file; - } -}); diff --git a/GameQ/Buffer.php b/GameQ/Buffer.php deleted file mode 100644 index e9e1552..0000000 --- a/GameQ/Buffer.php +++ /dev/null @@ -1,501 +0,0 @@ -. - * - * - */ - -namespace GameQ; - -use GameQ\Exception\Protocol as Exception; - -/** - * Class Buffer - * - * Read specific byte sequences from a provided string or Buffer - * - * @package GameQ - * - * @author Austin Bischoff - * @author Aidan Lister - * @author Tom Buskens - */ -class Buffer -{ - - /** - * Constants for the byte code types we need to read as - */ - const NUMBER_TYPE_BIGENDIAN = 'be', - NUMBER_TYPE_LITTLEENDIAN = 'le', - NUMBER_TYPE_MACHINE = 'm'; - - /** - * The number type we use for reading integers. Defaults to little endian - * - * @type string - */ - private $number_type = self::NUMBER_TYPE_LITTLEENDIAN; - - /** - * The original data - * - * @type string - */ - private $data; - - /** - * The original data - * - * @type int - */ - private $length; - - /** - * Position of pointer - * - * @type int - */ - private $index = 0; - - /** - * Constructor - * - * @param string $data - * @param string $number_type - */ - public function __construct($data, $number_type = self::NUMBER_TYPE_LITTLEENDIAN) - { - - $this->number_type = $number_type; - $this->data = $data; - $this->length = strlen($data); - } - - /** - * Return all the data - * - * @return string The data - */ - public function getData() - { - - return $this->data; - } - - /** - * Return data currently in the buffer - * - * @return string The data currently in the buffer - */ - public function getBuffer() - { - - return substr($this->data, $this->index); - } - - /** - * Returns the number of bytes in the buffer - * - * @return int Length of the buffer - */ - public function getLength() - { - - return max($this->length - $this->index, 0); - } - - /** - * Read from the buffer - * - * @param int $length - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function read($length = 1) - { - - if (($length + $this->index) > $this->length) { - throw new Exception("Unable to read length={$length} from buffer. Bad protocol format or return?"); - } - - $string = substr($this->data, $this->index, $length); - $this->index += $length; - - return $string; - } - - /** - * Read the last character from the buffer - * - * Unlike the other read functions, this function actually removes - * the character from the buffer. - * - * @return string - */ - public function readLast() - { - - $len = strlen($this->data); - $string = $this->data[strlen($this->data) - 1]; - $this->data = substr($this->data, 0, $len - 1); - $this->length -= 1; - - return $string; - } - - /** - * Look at the buffer, but don't remove - * - * @param int $length - * - * @return string - */ - public function lookAhead($length = 1) - { - - return substr($this->data, $this->index, $length); - } - - /** - * Skip forward in the buffer - * - * @param int $length - */ - public function skip($length = 1) - { - - $this->index += $length; - } - - /** - * Jump to a specific position in the buffer, - * will not jump past end of buffer - * - * @param $index - */ - public function jumpto($index) - { - - $this->index = min($index, $this->length - 1); - } - - /** - * Get the current pointer position - * - * @return int - */ - public function getPosition() - { - - return $this->index; - } - - /** - * Read from buffer until delimiter is reached - * - * If not found, return everything - * - * @param string $delim - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function readString($delim = "\x00") - { - - // Get position of delimiter - $len = strpos($this->data, $delim, min($this->index, $this->length)); - - // If it is not found then return whole buffer - if ($len === false) { - return $this->read(strlen($this->data) - $this->index); - } - - // Read the string and remove the delimiter - $string = $this->read($len - $this->index); - ++$this->index; - - return $string; - } - - /** - * Reads a pascal string from the buffer - * - * @param int $offset Number of bits to cut off the end - * @param bool $read_offset True if the data after the offset is to be read - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function readPascalString($offset = 0, $read_offset = false) - { - - // Get the proper offset - $len = $this->readInt8(); - $offset = max($len - $offset, 0); - - // Read the data - if ($read_offset) { - return $this->read($offset); - } else { - return substr($this->read($len), 0, $offset); - } - } - - /** - * Read from buffer until any of the delimiters is reached - * - * If not found, return everything - * - * @param $delims - * @param null $delimfound - * - * @return string - * @throws \GameQ\Exception\Protocol - * - * @todo: Check to see if this is even used anymore - */ - public function readStringMulti($delims, &$delimfound = null) - { - - // Get position of delimiters - $pos = []; - foreach ($delims as $delim) { - if ($p = strpos($this->data, $delim, min($this->index, $this->length))) { - $pos[] = $p; - } - } - - // If none are found then return whole buffer - if (empty($pos)) { - return $this->read(strlen($this->data) - $this->index); - } - - // Read the string and remove the delimiter - sort($pos); - $string = $this->read($pos[0] - $this->index); - $delimfound = $this->read(); - - return $string; - } - - /** - * Read an 8-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt8() - { - - $int = unpack('Cint', $this->read(1)); - - return $int['int']; - } - - /** - * Read and 8-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt8Signed() - { - - $int = unpack('cint', $this->read(1)); - - return $int['int']; - } - - /** - * Read a 16-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt16() - { - - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'nint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'vint'; - break; - - default: - $type = 'Sint'; - } - - $int = unpack($type, $this->read(2)); - - return $int['int']; - } - - /** - * Read a 16-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt16Signed() - { - - // Read the data into a string - $string = $this->read(2); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $int = unpack('sint', $string); - - unset($string); - - return $int['int']; - } - - /** - * Read a 32-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt32() - { - - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'Nint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'Vint'; - break; - - default: - $type = 'Lint'; - } - - // Unpack the number - $int = unpack($type, $this->read(4)); - - return $int['int']; - } - - /** - * Read a 32-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt32Signed() - { - - // Read the data into a string - $string = $this->read(4); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $int = unpack('lint', $string); - - unset($string); - - return $int['int']; - } - - /** - * Read a 64-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt64() - { - - // We have the pack 64-bit codes available. See: http://php.net/manual/en/function.pack.php - if (version_compare(PHP_VERSION, '5.6.3') >= 0 && PHP_INT_SIZE == 8) { - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'Jint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'Pint'; - break; - - default: - $type = 'Qint'; - } - - $int64 = unpack($type, $this->read(8)); - - $int = $int64['int']; - - unset($int64); - } else { - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $high = $this->readInt32(); - $low = $this->readInt32(); - } else { - $low = $this->readInt32(); - $high = $this->readInt32(); - } - - // We have to determine the number via bitwise - $int = ($high << 32) | $low; - - unset($low, $high); - } - - return $int; - } - - /** - * Read a 32-bit float - * - * @return float - * @throws \GameQ\Exception\Protocol - */ - public function readFloat32() - { - - // Read the data into a string - $string = $this->read(4); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $float = unpack('ffloat', $string); - - unset($string); - - return $float['float']; - } -} diff --git a/GameQ/CONTRIBUTING.md b/GameQ/CONTRIBUTING.md deleted file mode 100644 index c504042..0000000 --- a/GameQ/CONTRIBUTING.md +++ /dev/null @@ -1,39 +0,0 @@ -# Contributing - -Contributions are **welcome** and will be fully **credited**. - -## Pull Requests - -- **Document any change in behavior** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. - -- **Create feature branches** - Don't ask us to pull from your master branch. - -- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. - -## Coding Standard - -- The **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** is to be used for all code. -- **[PHPMD](http://phpmd.org/)** is used to help keep the code clean but exceptions can exist. - -- Use the following commands to check your code before committing it: - -```sh -$ vendor/bin/phpcs src tests --extensions=php --ignore=bootstrap --report=checkstyle --report-file=build/logs/checkstyle.xml --standard=build/config/phpcs.xml -v -$ vendor/bin/phpmd src,tests xml build/config/phpmd.xml -``` - - -## Tests - -- **Add tests!** - Your patch won't be accepted if it doesn't have tests. - -- Run tests by calling `phpunit` -```sh -$ vendor/bin/phpunit -``` - -The coding standard, mess detection and tests are validated by [Travis CI](.travis.yml). - -# Can't Contribute? -If you do not feel comfortable writing your own changes feel free open up a [new issue](https://github.com/Austinb/GameQ/issues/new) for -to add a game or feature. \ No newline at end of file diff --git a/GameQ/Exception/Protocol.php b/GameQ/Exception/Protocol.php deleted file mode 100644 index 035fc6d..0000000 --- a/GameQ/Exception/Protocol.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Protocol extends \Exception -{ -} diff --git a/GameQ/Exception/Query.php b/GameQ/Exception/Query.php deleted file mode 100644 index cc69f39..0000000 --- a/GameQ/Exception/Query.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Query extends \Exception -{ -} diff --git a/GameQ/Exception/Server.php b/GameQ/Exception/Server.php deleted file mode 100644 index 4024551..0000000 --- a/GameQ/Exception/Server.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Server extends \Exception -{ -} diff --git a/GameQ/Filters/Base.php b/GameQ/Filters/Base.php deleted file mode 100644 index 1a3f4e5..0000000 --- a/GameQ/Filters/Base.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Abstract base class which all filters must inherit - * - * @author Austin Bischoff - */ -abstract class Base -{ - - /** - * Holds the options for this instance of the filter - * - * @type array - */ - protected $options = []; - - /** - * Construct - * - * @param array $options - */ - public function __construct(array $options = []) - { - - $this->options = $options; - } - - /** - * Apply the filter to the data - * - * @param array $result - * @param \GameQ\Server $server - * - * @return mixed - */ - abstract public function apply(array $result, Server $server); -} diff --git a/GameQ/Filters/Normalize.php b/GameQ/Filters/Normalize.php deleted file mode 100644 index 5771c92..0000000 --- a/GameQ/Filters/Normalize.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Normalize - * - * @package GameQ\Filters - */ -class Normalize extends Base -{ - - /** - * Holds the protocol specific normalize information - * - * @type array - */ - protected $normalize = []; - - /** - * Apply this filter - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - // No result passed so just return - if (empty($result)) { - return $result; - } - - //$data = [ ]; - //$data['raw'][$server->id()] = $result; - - // Grab the normalize for this protocol for the specific server - $this->normalize = $server->protocol()->getNormalize(); - - // Do general information - $result = array_merge($result, $this->check('general', $result)); - - // Do player information - if (isset($result['players']) && count($result['players']) > 0) { - // Iterate - foreach ($result['players'] as $key => $player) { - $result['players'][$key] = array_merge($player, $this->check('player', $player)); - } - } else { - $result['players'] = []; - } - - // Do team information - if (isset($result['teams']) && count($result['teams']) > 0) { - // Iterate - foreach ($result['teams'] as $key => $team) { - $result['teams'][$key] = array_merge($team, $this->check('team', $team)); - } - } else { - $result['teams'] = []; - } - - //$data['filtered'][$server->id()] = $result; - /*file_put_contents( - sprintf('%s/../../../tests/Filters/Providers/Normalize/%s_1.json', __DIR__, $server->protocol()->getProtocol()), - json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) - );*/ - - // Return the normalized result - return $result; - } - - /** - * Check a section for normalization - * - * @param $section - * @param $data - * - * @return array - */ - protected function check($section, $data) - { - - // Normalized return array - $normalized = []; - - if (isset($this->normalize[$section]) && !empty($this->normalize[$section])) { - foreach ($this->normalize[$section] as $property => $raw) { - // Default the value for the new key as null - $value = null; - - if (is_array($raw)) { - // Iterate over the raw property we want to use - foreach ($raw as $check) { - if (array_key_exists($check, $data)) { - $value = $data[$check]; - break; - } - } - } else { - // String - if (array_key_exists($raw, $data)) { - $value = $data[$raw]; - } - } - - $normalized['gq_' . $property] = $value; - } - } - - return $normalized; - } -} diff --git a/GameQ/Filters/Secondstohuman.php b/GameQ/Filters/Secondstohuman.php deleted file mode 100644 index 1b413f7..0000000 --- a/GameQ/Filters/Secondstohuman.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Secondstohuman - * - * This class converts seconds into a human readable time string 'hh:mm:ss'. This is mainly for converting - * a player's connected time into a readable string. Note that most game servers DO NOT return a player's connected - * time. Source (A2S) based games generally do but not always. This class can also be used to convert other time - * responses into readable time - * - * @package GameQ\Filters - * @author Austin Bischoff - */ -class Secondstohuman extends Base -{ - - /** - * The options key for setting the data key(s) to look for to convert - */ - const OPTION_TIMEKEYS = 'timekeys'; - - /** - * The result key added when applying this filter to a result - */ - const RESULT_KEY = 'gq_%s_human'; - - /** - * Holds the default 'time' keys from the response array. This is key is usually 'time' from A2S responses - * - * @var array - */ - protected $timeKeysDefault = ['time']; - - /** - * Secondstohuman constructor. - * - * @param array $options - */ - public function __construct(array $options = []) - { - // Check for passed keys - if (!array_key_exists(self::OPTION_TIMEKEYS, $options)) { - // Use default - $options[self::OPTION_TIMEKEYS] = $this->timeKeysDefault; - } else { - // Used passed key(s) and make sure it is an array - $options[self::OPTION_TIMEKEYS] = (!is_array($options[self::OPTION_TIMEKEYS])) ? - [$options[self::OPTION_TIMEKEYS]] : $options[self::OPTION_TIMEKEYS]; - } - - parent::__construct($options); - } - - /** - * Apply this filter to the result data - * - * @param array $result - * @param Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - // Send the results off to be iterated and return the updated result - return $this->iterate($result); - } - - /** - * Home grown iterate function. Would like to replace this with an internal PHP method(s) but could not find a way - * to make the iterate classes add new keys to the response. They all seemed to be read-only. - * - * @todo: See if there is a more internal way of handling this instead of foreach looping and recursive calling - * - * @param array $result - * - * @return array - */ - protected function iterate(array &$result) - { - // Iterate over the results - foreach ($result as $key => $value) { - // Offload to itself if we have another array - if (is_array($value)) { - // Iterate and update the result - $result[$key] = $this->iterate($value); - } elseif (in_array($key, $this->options[self::OPTION_TIMEKEYS])) { - // Make sure the value is a float (throws E_WARNING in PHP 7.1+) - $value = floatval($value); - // We match one of the keys we are wanting to convert so add it and move on - $result[sprintf(self::RESULT_KEY, $key)] = sprintf( - "%02d:%02d:%02d", - floor($value / 3600), - ($value / 60) % 60, - $value % 60 - ); - } - } - - return $result; - } -} diff --git a/GameQ/Filters/Stripcolors.php b/GameQ/Filters/Stripcolors.php deleted file mode 100644 index 5895304..0000000 --- a/GameQ/Filters/Stripcolors.php +++ /dev/null @@ -1,115 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Strip Colors - * - * Strip color codes from UT and Quake based games - * - * @package GameQ\Filters - */ -class Stripcolors extends Base -{ - - /** - * Apply this filter - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - // No result passed so just return - if (empty($result)) { - return $result; - } - - //$data = []; - //$data['raw'][ $server->id() ] = $result; - - // Switch based on the base (not game) protocol - switch ($server->protocol()->getProtocol()) { - case 'quake2': - case 'quake3': - case 'doom3': - array_walk_recursive($result, [$this, 'stripQuake']); - break; - case 'unreal2': - case 'ut3': - case 'gamespy3': //not sure if gamespy3 supports ut colors but won't hurt - case 'gamespy2': - array_walk_recursive($result, [$this, 'stripUnreal']); - break; - case 'source': - array_walk_recursive($result, [$this, 'stripSource']); - break; - } - - /*$data['filtered'][ $server->id() ] = $result; - file_put_contents( - sprintf( - '%s/../../../tests/Filters/Providers/Stripcolors\%s_1.json', - __DIR__, - $server->protocol()->getProtocol() - ), - json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) - );*/ - - // Return the stripped result - return $result; - } - - /** - * Strip color codes from quake based games - * - * @param string $string - */ - protected function stripQuake(&$string) - { - $string = preg_replace('#(\^.)#', '', $string); - } - - /** - * Strip color codes from Unreal based games - * - * @param string $string - */ - protected function stripUnreal(&$string) - { - $string = preg_replace('/\x1b.../', '', $string); - } - - /** - * Strip color codes from Source based games - * - * @param string $string - */ - protected function stripSource(&$string) - { - $string = strip_tags($string); - } -} diff --git a/GameQ/Filters/Test.php b/GameQ/Filters/Test.php deleted file mode 100644 index 836ddf3..0000000 --- a/GameQ/Filters/Test.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Test - * - * This is a test filter to be used for testing purposes only. - * - * @package GameQ\Filters - */ -class Test extends Base -{ - /** - * Apply the filter. For this we just return whatever is sent - * - * @SuppressWarnings(PHPMD) - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - return $result; - } -} diff --git a/GameQ/GameQ.php b/GameQ/GameQ.php deleted file mode 100644 index d3dd9ea..0000000 --- a/GameQ/GameQ.php +++ /dev/null @@ -1,649 +0,0 @@ -. - */ - -namespace GameQ; - -use GameQ\Exception\Protocol as ProtocolException; -use GameQ\Exception\Query as QueryException; - -/** - * Base GameQ Class - * - * This class should be the only one that is included when you use GameQ to query - * any games servers. - * - * Requirements: See wiki or README for more information on the requirements - * - PHP 5.4.14+ - * * Bzip2 - http://www.php.net/manual/en/book.bzip2.php - * - * @author Austin Bischoff - * - * @property bool $debug - * @property string $capture_packets_file - * @property int $stream_timeout - * @property int $timeout - * @property int $write_wait - */ -class GameQ -{ - /* - * Constants - */ - const PROTOCOLS_DIRECTORY = __DIR__ . '/Protocols'; - - /* Static Section */ - - /** - * Holds the instance of itself - * - * @type self - */ - protected static $instance = null; - - /** - * Create a new instance of this class - * - * @return \GameQ\GameQ - */ - public static function factory() - { - - // Create a new instance - self::$instance = new self(); - - // Return this new instance - return self::$instance; - } - - /* Dynamic Section */ - - /** - * Default options - * - * @type array - */ - protected $options = [ - 'debug' => false, - 'timeout' => 3, // Seconds - 'filters' => [ - // Default normalize - 'normalize_d751713988987e9331980363e24189ce' => [ - 'filter' => 'normalize', - 'options' => [], - ], - ], - // Advanced settings - 'stream_timeout' => 200000, // See http://www.php.net/manual/en/function.stream-select.php for more info - 'write_wait' => 500, - // How long (in micro-seconds) to pause between writing to server sockets, helps cpu usage - - // Used for generating protocol test data - 'capture_packets_file' => null, - ]; - - /** - * Array of servers being queried - * - * @type array - */ - protected $servers = []; - - /** - * The query library to use. Default is Native - * - * @type string - */ - protected $queryLibrary = 'GameQ\\Query\\Native'; - - /** - * Holds the instance of the queryLibrary - * - * @type \GameQ\Query\Core|null - */ - protected $query = null; - - /** - * GameQ constructor. - * - * Do some checks as needed so this will operate - */ - public function __construct() - { - // Check for missing utf8_encode function - if (!function_exists('utf8_encode')) { - throw new \Exception("PHP's utf8_encode() function is required - " - . "http://php.net/manual/en/function.utf8-encode.php. Check your php installation."); - } - } - - /** - * Get an option's value - * - * @param mixed $option - * - * @return mixed|null - */ - public function __get($option) - { - - return isset($this->options[$option]) ? $this->options[$option] : null; - } - - /** - * Set an option's value - * - * @param mixed $option - * @param mixed $value - * - * @return bool - */ - public function __set($option, $value) - { - - $this->options[$option] = $value; - - return true; - } - - /** - * Chainable call to __set, uses set as the actual setter - * - * @param mixed $var - * @param mixed $value - * - * @return $this - */ - public function setOption($var, $value) - { - - // Use magic - $this->{$var} = $value; - - return $this; // Make chainable - } - - /** - * Add a single server - * - * @param array $server_info - * - * @return $this - */ - public function addServer(array $server_info = []) - { - - // Add and validate the server - $this->servers[uniqid()] = new Server($server_info); - - return $this; // Make calls chainable - } - - /** - * Add multiple servers in a single call - * - * @param array $servers - * - * @return $this - */ - public function addServers(array $servers = []) - { - - // Loop through all the servers and add them - foreach ($servers as $server_info) { - $this->addServer($server_info); - } - - return $this; // Make calls chainable - } - - /** - * Add a set of servers from a file or an array of files. - * Supported formats: - * JSON - * - * @param array $files - * - * @return $this - * @throws \Exception - */ - public function addServersFromFiles($files = []) - { - - // Since we expect an array let us turn a string (i.e. single file) into an array - if (!is_array($files)) { - $files = [$files]; - } - - // Iterate over the file(s) and add them - foreach ($files as $file) { - // Check to make sure the file exists and we can read it - if (!file_exists($file) || !is_readable($file)) { - continue; - } - - // See if this file is JSON - if (($servers = json_decode(file_get_contents($file), true)) === null - && json_last_error() !== JSON_ERROR_NONE - ) { - // Type not supported - continue; - } - - // Add this list of servers - $this->addServers($servers); - } - - return $this; - } - - /** - * Clear all of the defined servers - * - * @return $this - */ - public function clearServers() - { - - // Reset all the servers - $this->servers = []; - - return $this; // Make Chainable - } - - /** - * Add a filter to the processing list - * - * @param string $filterName - * @param array $options - * - * @return $this - */ - public function addFilter($filterName, $options = []) - { - // Create the filter hash so we can run multiple versions of the same filter - $filterHash = sprintf('%s_%s', strtolower($filterName), md5(json_encode($options))); - - // Add the filter - $this->options['filters'][$filterHash] = [ - 'filter' => strtolower($filterName), - 'options' => $options, - ]; - - unset($filterHash); - - return $this; - } - - /** - * Remove an added filter - * - * @param string $filterHash - * - * @return $this - */ - public function removeFilter($filterHash) - { - // Make lower case - $filterHash = strtolower($filterHash); - - // Remove this filter if it has been defined - if (array_key_exists($filterHash, $this->options['filters'])) { - unset($this->options['filters'][$filterHash]); - } - - unset($filterHash); - - return $this; - } - - /** - * Return the list of applied filters - * - * @return array - */ - public function listFilters() - { - return $this->options['filters']; - } - - /** - * Main method used to actually process all of the added servers and return the information - * - * @return array - * @throws \Exception - */ - public function process() - { - - // Initialize the query library we are using - $class = new \ReflectionClass($this->queryLibrary); - - // Set the query pointer to the new instance of the library - $this->query = $class->newInstance(); - - unset($class); - - // Define the return - $results = []; - - // @todo: Add break up into loop to split large arrays into smaller chunks - - // Do server challenge(s) first, if any - $this->doChallenges(); - - // Do packets for server(s) and get query responses - $this->doQueries(); - - // Now we should have some information to process for each server - foreach ($this->servers as $server) { - /* @var $server \GameQ\Server */ - - // Parse the responses for this server - $result = $this->doParseResponse($server); - - // Apply the filters - $result = array_merge($result, $this->doApplyFilters($result, $server)); - - // Sort the keys so they are alphabetical and nicer to look at - ksort($result); - - // Add the result to the results array - $results[$server->id()] = $result; - } - - return $results; - } - - /** - * Do server challenges, where required - */ - protected function doChallenges() - { - - // Initialize the sockets for reading - $sockets = []; - - // By default we don't have any challenges to process - $server_challenge = false; - - // Do challenge packets - foreach ($this->servers as $server_id => $server) { - /* @var $server \GameQ\Server */ - - // This protocol has a challenge packet that needs to be sent - if ($server->protocol()->hasChallenge()) { - // We have a challenge, set the flag - $server_challenge = true; - - // Let's make a clone of the query class - $socket = clone $this->query; - - // Set the information for this query socket - $socket->set( - $server->protocol()->transport(), - $server->ip, - $server->port_query, - $this->timeout - ); - - try { - // Now write the challenge packet to the socket. - $socket->write($server->protocol()->getPacket(Protocol::PACKET_CHALLENGE)); - - // Add the socket information so we can reference it easily - $sockets[(int)$socket->get()] = [ - 'server_id' => $server_id, - 'socket' => $socket, - ]; - } catch (QueryException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - } - - unset($socket); - - // Let's sleep shortly so we are not hammering out calls rapid fire style hogging cpu - usleep($this->write_wait); - } - } - - // We have at least one server with a challenge, we need to listen for responses - if ($server_challenge) { - // Now we need to listen for and grab challenge response(s) - $responses = call_user_func_array( - [$this->query, 'getResponses'], - [$sockets, $this->timeout, $this->stream_timeout] - ); - - // Iterate over the challenge responses - foreach ($responses as $socket_id => $response) { - // Back out the server_id we need to update the challenge response for - $server_id = $sockets[$socket_id]['server_id']; - - // Make this into a buffer so it is easier to manipulate - $challenge = new Buffer(implode('', $response)); - - // Grab the server instance - /* @var $server \GameQ\Server */ - $server = $this->servers[$server_id]; - - // Apply the challenge - $server->protocol()->challengeParseAndApply($challenge); - - // Add this socket to be reused, has to be reused in GameSpy3 for example - $server->socketAdd($sockets[$socket_id]['socket']); - - // Clear - unset($server); - } - } - } - - /** - * Run the actual queries and get the response(s) - */ - protected function doQueries() - { - - // Initialize the array of sockets - $sockets = []; - - // Iterate over the server list - foreach ($this->servers as $server_id => $server) { - /* @var $server \GameQ\Server */ - - // Invoke the beforeSend method - $server->protocol()->beforeSend($server); - - // Get all the non-challenge packets we need to send - $packets = $server->protocol()->getPacket('!' . Protocol::PACKET_CHALLENGE); - - if (count($packets) == 0) { - // Skip nothing else to do for some reason. - continue; - } - - // Try to use an existing socket - if (($socket = $server->socketGet()) === null) { - // Let's make a clone of the query class - $socket = clone $this->query; - - // Set the information for this query socket - $socket->set( - $server->protocol()->transport(), - $server->ip, - $server->port_query, - $this->timeout - ); - } - - try { - // Iterate over all the packets we need to send - foreach ($packets as $packet_data) { - // Now write the packet to the socket. - $socket->write($packet_data); - - // Let's sleep shortly so we are not hammering out calls rapid fire style - usleep($this->write_wait); - } - - unset($packets); - - // Add the socket information so we can reference it easily - $sockets[(int)$socket->get()] = [ - 'server_id' => $server_id, - 'socket' => $socket, - ]; - } catch (QueryException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - - break; - } - - // Clean up the sockets, if any left over - $server->socketCleanse(); - } - - // Now we need to listen for and grab response(s) - $responses = call_user_func_array( - [$this->query, 'getResponses'], - [$sockets, $this->timeout, $this->stream_timeout] - ); - - // Iterate over the responses - foreach ($responses as $socket_id => $response) { - // Back out the server_id - $server_id = $sockets[$socket_id]['server_id']; - - // Grab the server instance - /* @var $server \GameQ\Server */ - $server = $this->servers[$server_id]; - - // Save the response from this packet - $server->protocol()->packetResponse($response); - - unset($server); - } - - // Now we need to close all of the sockets - foreach ($sockets as $socketInfo) { - /* @var $socket \GameQ\Query\Core */ - $socket = $socketInfo['socket']; - - // Close the socket - $socket->close(); - - unset($socket); - } - - unset($sockets); - } - - /** - * Parse the response for a specific server - * - * @param \GameQ\Server $server - * - * @return array - * @throws \Exception - */ - protected function doParseResponse(Server $server) - { - - try { - // @codeCoverageIgnoreStart - // We want to save this server's response to a file (useful for unit testing) - if (!is_null($this->capture_packets_file)) { - file_put_contents( - $this->capture_packets_file, - implode(PHP_EOL . '||' . PHP_EOL, $server->protocol()->packetResponse()) - ); - } - // @codeCoverageIgnoreEnd - - // Get the server response - $results = $server->protocol()->processResponse(); - - // Check for online before we do anything else - $results['gq_online'] = (count($results) > 0); - } catch (ProtocolException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - - // We ignore this server - $results = [ - 'gq_online' => false, - ]; - } - - // Now add some default stuff - $results['gq_address'] = (isset($results['gq_address'])) ? $results['gq_address'] : $server->ip(); - $results['gq_port_client'] = $server->portClient(); - $results['gq_port_query'] = (isset($results['gq_port_query'])) ? $results['gq_port_query'] : $server->portQuery(); - $results['gq_protocol'] = $server->protocol()->getProtocol(); - $results['gq_type'] = (string)$server->protocol(); - $results['gq_name'] = $server->protocol()->nameLong(); - $results['gq_transport'] = $server->protocol()->transport(); - - // Process the join link - if (!isset($results['gq_joinlink']) || empty($results['gq_joinlink'])) { - $results['gq_joinlink'] = $server->getJoinLink(); - } - - return $results; - } - - /** - * Apply any filters to the results - * - * @param array $results - * @param \GameQ\Server $server - * - * @return array - */ - protected function doApplyFilters(array $results, Server $server) - { - - // Loop over the filters - foreach ($this->options['filters'] as $filterOptions) { - // Try to do this filter - try { - // Make a new reflection class - $class = new \ReflectionClass(sprintf('GameQ\\Filters\\%s', ucfirst($filterOptions['filter']))); - - // Create a new instance of the filter class specified - $filter = $class->newInstanceArgs([$filterOptions['options']]); - - // Apply the filter to the data - $results = $filter->apply($results, $server); - } catch (\ReflectionException $e) { - // Invalid, skip it - continue; - } - } - - return $results; - } -} diff --git a/GameQ/LICENSE.lgpl b/GameQ/LICENSE.lgpl deleted file mode 100644 index 02bbb60..0000000 --- a/GameQ/LICENSE.lgpl +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. \ No newline at end of file diff --git a/GameQ/Protocol.php b/GameQ/Protocol.php deleted file mode 100644 index 6d94a45..0000000 --- a/GameQ/Protocol.php +++ /dev/null @@ -1,500 +0,0 @@ -. - * - * - */ - -namespace GameQ; - -/** - * Handles the core functionality for the protocols - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - * - * @author Austin Bischoff - */ -abstract class Protocol -{ - - /** - * Constants for class states - */ - const STATE_TESTING = 1; - - const STATE_BETA = 2; - - const STATE_STABLE = 3; - - const STATE_DEPRECATED = 4; - - /** - * Constants for packet keys - */ - const PACKET_ALL = 'all'; // Some protocols allow all data to be sent back in one call. - - const PACKET_BASIC = 'basic'; - - const PACKET_CHALLENGE = 'challenge'; - - const PACKET_CHANNELS = 'channels'; // Voice servers - - const PACKET_DETAILS = 'details'; - - const PACKET_INFO = 'info'; - - const PACKET_PLAYERS = 'players'; - - const PACKET_STATUS = 'status'; - - const PACKET_RULES = 'rules'; - - const PACKET_VERSION = 'version'; - - /** - * Transport constants - */ - const TRANSPORT_UDP = 'udp'; - - const TRANSPORT_TCP = 'tcp'; - - const TRANSPORT_SSL = 'ssl'; - - const TRANSPORT_TLS = 'tls'; - - /** - * Short name of the protocol - * - * @type string - */ - protected $name = 'unknown'; - - /** - * The longer, fancier name for the protocol - * - * @type string - */ - protected $name_long = 'unknown'; - - /** - * The difference between the client port and query port - * - * @type int - */ - protected $port_diff = 0; - - /** - * The transport method to use to actually send the data - * Default is UDP - * - * @type string - */ - protected $transport = self::TRANSPORT_UDP; - - /** - * The protocol type used when querying the server - * - * @type string - */ - protected $protocol = 'unknown'; - - /** - * Holds the valid packet types this protocol has available. - * - * @type array - */ - protected $packets = []; - - /** - * Holds the response headers and the method to use to process them. - * - * @type array - */ - protected $responses = []; - - /** - * Holds the list of methods to run when parsing the packet response(s) data. These - * methods should provide all the return information. - * - * @type array - */ - protected $process_methods = []; - - /** - * The packet responses received - * - * @type array - */ - protected $packets_response = []; - - /** - * Holds the instance of the result class - * - * @type null - */ - protected $result = null; - - /** - * Options for this protocol - * - * @type array - */ - protected $options = []; - - /** - * Define the state of this class - * - * @type int - */ - protected $state = self::STATE_STABLE; - - /** - * Holds specific normalize settings - * - * @todo: Remove this ugly bulk by moving specific ones to their specific game(s) - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => [ - 'listenserver', - 'dedic', - 'bf2dedicated', - 'netserverdedicated', - 'bf2142dedicated', - 'dedicated', - ], - 'gametype' => ['ggametype', 'sigametype', 'matchtype'], - 'hostname' => ['svhostname', 'servername', 'siname', 'name'], - 'mapname' => ['map', 'simap'], - 'maxplayers' => ['svmaxclients', 'simaxplayers', 'maxclients', 'max_players'], - 'mod' => ['game', 'gamedir', 'gamevariant'], - 'numplayers' => ['clients', 'sinumplayers', 'num_players'], - 'password' => ['protected', 'siusepass', 'sineedpass', 'pswrd', 'gneedpass', 'auth', 'passsord'], - ], - // Indvidual - 'player' => [ - 'name' => ['nick', 'player', 'playername', 'name'], - 'kills' => ['kills'], - 'deaths' => ['deaths'], - 'score' => ['kills', 'frags', 'skill', 'score'], - 'ping' => ['ping'], - ], - // Team - 'team' => [ - 'name' => ['name', 'teamname', 'team_t'], - 'score' => ['score', 'score_t'], - ], - ]; - - /** - * Quick join link - * - * @type string - */ - protected $join_link = ''; - - /** - * @param array $options - */ - public function __construct(array $options = []) - { - - // Set the options for this specific instance of the class - $this->options = $options; - } - - /** - * String name of this class - * - * @return string - */ - public function __toString() - { - - return $this->name; - } - - /** - * Get the port difference between the server's client (game) and query ports - * - * @return int - */ - public function portDiff() - { - - return $this->port_diff; - } - - /** - * "Find" the query port based off of the client port and port_diff - * - * This method is meant to be overloaded for more complex maths or lookup tables - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - - return $clientPort + $this->port_diff; - } - - /** - * Return the join_link as defined by the protocol class - * - * @return string - */ - public function joinLink() - { - - return $this->join_link; - } - - /** - * Short (callable) name of this class - * - * @return string - */ - public function name() - { - - return $this->name; - } - - /** - * Long name of this class - * - * @return string - */ - public function nameLong() - { - - return $this->name_long; - } - - /** - * Return the status of this Protocol Class - * - * @return int - */ - public function state() - { - - return $this->state; - } - - /** - * Return the protocol property - * - * @return string - */ - public function getProtocol() - { - - return $this->protocol; - } - - /** - * Get/set the transport type for this protocol - * - * @param string|null $type - * - * @return string - */ - public function transport($type = null) - { - - // Act as setter - if (!is_null($type)) { - $this->transport = $type; - } - - return $this->transport; - } - - /** - * Set the options for the protocol call - * - * @param array $options - * - * @return array - */ - public function options($options = []) - { - - // Act as setter - if (!empty($options)) { - $this->options = $options; - } - - return $this->options; - } - - - /* - * Packet Section - */ - - /** - * Return specific packet(s) - * - * @param array $type - * - * @return array - */ - public function getPacket($type = []) - { - - $packets = []; - - - // We want an array of packets back - if (is_array($type) && !empty($type)) { - // Loop the packets - foreach ($this->packets as $packet_type => $packet_data) { - // We want this packet - if (in_array($packet_type, $type)) { - $packets[$packet_type] = $packet_data; - } - } - } elseif ($type == '!challenge') { - // Loop the packets - foreach ($this->packets as $packet_type => $packet_data) { - // Dont want challenge packets - if ($packet_type != self::PACKET_CHALLENGE) { - $packets[$packet_type] = $packet_data; - } - } - } elseif (is_string($type)) { - // Return specific packet type - $packets = $this->packets[$type]; - } else { - // Return all packets - $packets = $this->packets; - } - - // Return the packets - return $packets; - } - - /** - * Get/set the packet response - * - * @param array|null $response - * - * @return array - */ - public function packetResponse(array $response = null) - { - - // Act as setter - if (!empty($response)) { - $this->packets_response = $response; - } - - return $this->packets_response; - } - - - /* - * Challenge section - */ - - /** - * Determine whether or not this protocol has a challenge needed before querying - * - * @return bool - */ - public function hasChallenge() - { - - return (isset($this->packets[self::PACKET_CHALLENGE]) && !empty($this->packets[self::PACKET_CHALLENGE])); - } - - /** - * Parse the challenge response and add it to the buffer items that need it. - * This should be overloaded by extending class - * - * @codeCoverageIgnore - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - - return true; - } - - /** - * Apply the challenge string to all the packets that need it. - * - * @param string $challenge_string - * - * @return bool - */ - protected function challengeApply($challenge_string) - { - - // Let's loop through all the packets and append the challenge where it is needed - foreach ($this->packets as $packet_type => $packet) { - $this->packets[$packet_type] = sprintf($packet, $challenge_string); - } - - return true; - } - - /** - * Get the normalize settings for the protocol - * - * @return array - */ - public function getNormalize() - { - - return $this->normalize; - } - - /* - * General - */ - - /** - * Generic method to allow protocol classes to do work right before the query is sent - * - * @codeCoverageIgnore - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param \GameQ\Server $server - */ - public function beforeSend(Server $server) - { - } - - /** - * Method called to process query response data. Each extending class has to have one of these functions. - * - * @return mixed - */ - abstract public function processResponse(); -} diff --git a/GameQ/Protocols/Aa3.php b/GameQ/Protocols/Aa3.php deleted file mode 100644 index 6ffd412..0000000 --- a/GameQ/Protocols/Aa3.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Aa3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Aa3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'aa3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "America's Army 3"; - - /** - * Query port = client_port + 18243 - * - * client_port default 8777 - * query_port default 27020 - * - * @type int - */ - protected $port_diff = 18243; -} diff --git a/GameQ/Protocols/Aapg.php b/GameQ/Protocols/Aapg.php deleted file mode 100644 index a207d4f..0000000 --- a/GameQ/Protocols/Aapg.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Aapg - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Aapg extends Aa3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'aapg'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "America's Army: Proving Grounds"; -} diff --git a/GameQ/Protocols/Arkse.php b/GameQ/Protocols/Arkse.php deleted file mode 100644 index 3193c5a..0000000 --- a/GameQ/Protocols/Arkse.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class ARK: Survival Evolved - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Arkse extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arkse'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "ARK: Survival Evolved"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/GameQ/Protocols/Arma.php b/GameQ/Protocols/Arma.php deleted file mode 100644 index 2653872..0000000 --- a/GameQ/Protocols/Arma.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Arma - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Arma extends Gamespy2 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arma'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "ArmA Armed Assault"; -} diff --git a/GameQ/Protocols/Arma3.php b/GameQ/Protocols/Arma3.php deleted file mode 100644 index 2718587..0000000 --- a/GameQ/Protocols/Arma3.php +++ /dev/null @@ -1,181 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Armed Assault 3 - * - * Rules protocol reference: https://community.bistudio.com/wiki/Arma_3_ServerBrowserProtocol2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - * @author Memphis017 - */ -class Arma3 extends Source -{ - /** - * Defines the names for the specific game DLCs - * - * @var array - */ - protected $dlcNames = [ - 'af82811b' => 'Karts', - '94f76a1a' => 'Marksmen', - 'd0356eec' => 'Helicopters', - '19984a71' => 'Zeus', - '7fb4b1f3' => 'Apex', - '49c2c12b' => 'Jets', - '7e766e18' => 'Laws of War', - '99d71f90' => 'Malden', - 'a8b10cdf' => 'Tac-Ops', - '37680ce8' => 'Tanks', - '43f9c377' => 'Contact', - 'c4979557' => 'Enoch', - ]; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arma3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Arma3"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Process the rules since Arma3 changed their response for rules - * - * @param Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processRules(Buffer $buffer) - { - // Total number of packets, burn it - $buffer->readInt16(); - - // Will hold the data string - $data = ''; - - // Loop until we run out of strings - while ($buffer->getLength()) { - // Burn the delimiters (i.e. \x01\x04\x00) - $buffer->readString(); - - // Add the data to the string, we are reassembling it - $data .= $buffer->readString(); - } - - // Restore escaped sequences - $data = str_replace(["\x01\x01", "\x01\x02", "\x01\x03"], ["\x01", "\x00", "\xFF"], $data); - - // Make a new buffer with the reassembled data - $responseBuffer = new Buffer($data); - - // Kill the old buffer, should be empty - unset($buffer, $data); - - // Set the result to a new result instance - $result = new Result(); - - // Get results - $result->add('rules_protocol_version', $responseBuffer->readInt8()); - $result->add('overflow', $responseBuffer->readInt8()); - $dlcBit = decbin($responseBuffer->readInt8()); // Grab DLC bit 1 and use it later - $dlcBit2 = decbin($responseBuffer->readInt8()); // Grab DLC bit 2 and use it later - $dlcCount = substr_count($dlcBit, '1') + substr_count($dlcBit2, '1'); // Count the DLCs - - // Grab difficulty so we can man handle it... - $difficulty = $responseBuffer->readInt8(); - - // Process difficulty - $result->add('3rd_person', $difficulty >> 7); - $result->add('advanced_flight_mode', ($difficulty >> 6) & 1); - $result->add('difficulty_ai', ($difficulty >> 3) & 3); - $result->add('difficulty_level', $difficulty & 3); - - unset($difficulty); - - // Crosshair - $result->add('crosshair', $responseBuffer->readInt8()); - - // Loop over the DLC bit so we can pull in the info for the DLC (if enabled) - for ($x = 0; $x < $dlcCount; $x++) { - $dlcHash = dechex($responseBuffer->readInt32()); - isset($this->dlcNames[$dlcHash]) ? - $result->addSub('dlcs', 'name', $this->dlcNames[$dlcHash]) - : $result->addSub('dlcs', 'name', 'Unknown'); - $result->addSub('dlcs', 'hash', $dlcHash); - } - - // No longer needed - unset($dlcBit, $dlcBit2, $dlcCount, $dlcHash); - - // Grab the mod count - $modCount = $responseBuffer->readInt8(); - - // Add mod count - $result->add('mod_count', $modCount); - - // Loop the mod count and add them - for ($x = 0; $x < $modCount; $x++) { - // Add the mod to the list - $result->addSub('mods', 'hash', dechex($responseBuffer->readInt32())); - $result->addSub('mods', 'steam_id', hexdec($responseBuffer->readPascalString(0, true))); - $result->addSub('mods', 'name', $responseBuffer->readPascalString(0, true)); - } - - unset($modCount, $x); - - // Get the signatures count - $signatureCount = $responseBuffer->readInt8(); - $result->add('signature_count', $signatureCount); - - // Make signatures array - $signatures = []; - - // Loop until we run out of signatures - for ($x = 0; $x < $signatureCount; $x++) { - $signatures[] = $responseBuffer->readPascalString(0, true); - } - - // Add as a simple array - $result->add('signatures', $signatures); - - unset($responseBuffer, $signatureCount, $signatures, $x); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Armedassault2oa.php b/GameQ/Protocols/Armedassault2oa.php deleted file mode 100644 index e527a38..0000000 --- a/GameQ/Protocols/Armedassault2oa.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Armedassault2oa - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Armedassault2oa extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = "armedassault2oa"; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Armed Assault 2: Operation Arrowhead"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Armedassault3.php b/GameQ/Protocols/Armedassault3.php deleted file mode 100644 index 5bbca42..0000000 --- a/GameQ/Protocols/Armedassault3.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Armed assault 3 dummy Protocol Class - * - * Added for backward compatibility, please update to class arma3 - * - * @deprecated v3.0.10 - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Armedassault3 extends Arma3 -{ -} diff --git a/GameQ/Protocols/Ase.php b/GameQ/Protocols/Ase.php deleted file mode 100644 index cb5c6a4..0000000 --- a/GameQ/Protocols/Ase.php +++ /dev/null @@ -1,208 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * All-Seeing Eye Protocol class - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Ase extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "s", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ase'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ase'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "All-Seeing Eye"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'servername', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'team' => 'team', - 'ping' => 'ping', - 'time' => 'time', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Create a new buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Burn the header - $buffer->skip(4); - - // Create a new result - $result = new Result(); - - // Variables - $result->add('gamename', $buffer->readPascalString(1, true)); - $result->add('port', $buffer->readPascalString(1, true)); - $result->add('servername', $buffer->readPascalString(1, true)); - $result->add('gametype', $buffer->readPascalString(1, true)); - $result->add('map', $buffer->readPascalString(1, true)); - $result->add('version', $buffer->readPascalString(1, true)); - $result->add('password', $buffer->readPascalString(1, true)); - $result->add('num_players', $buffer->readPascalString(1, true)); - $result->add('max_players', $buffer->readPascalString(1, true)); - $result->add('dedicated', 1); - - // Offload the key/value pair processing - $this->processKeyValuePairs($buffer, $result); - - // Offload processing player and team info - $this->processPlayersAndTeams($buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles processing the extra key/value pairs for server settings - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processKeyValuePairs(Buffer &$buffer, Result &$result) - { - - // Key / value pairs - while ($buffer->getLength()) { - $key = $buffer->readPascalString(1, true); - - // If we have an empty key, we've reached the end - if (empty($key)) { - break; - } - - // Otherwise, add the pair - $result->add( - $key, - $buffer->readPascalString(1, true) - ); - } - - unset($key); - } - - /** - * Handles processing the player and team data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - - // Players and team info - while ($buffer->getLength()) { - // Get the flags - $flags = $buffer->readInt8(); - - // Get data according to the flags - if ($flags & 1) { - $result->addPlayer('name', $buffer->readPascalString(1, true)); - } - if ($flags & 2) { - $result->addPlayer('team', $buffer->readPascalString(1, true)); - } - if ($flags & 4) { - $result->addPlayer('skin', $buffer->readPascalString(1, true)); - } - if ($flags & 8) { - $result->addPlayer('score', $buffer->readPascalString(1, true)); - } - if ($flags & 16) { - $result->addPlayer('ping', $buffer->readPascalString(1, true)); - } - if ($flags & 32) { - $result->addPlayer('time', $buffer->readPascalString(1, true)); - } - } - } -} diff --git a/GameQ/Protocols/Atlas.php b/GameQ/Protocols/Atlas.php deleted file mode 100644 index 83406ba..0000000 --- a/GameQ/Protocols/Atlas.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Atlas - * - * @package GameQ\Protocols - * @author Wilson Jesus <> - */ -class Atlas extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'atlas'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Atlas"; - - /** - * query_port = client_port + 51800 - * 57561 = 5761 + 51800 - * - * this is the default value for the stock game server, both ports - * can be independently changed from the stock ones, - * making the port_diff logic useless. - * - * @type int - */ - protected $port_diff = 51800; -} diff --git a/GameQ/Protocols/Batt1944.php b/GameQ/Protocols/Batt1944.php deleted file mode 100644 index f0ff38e..0000000 --- a/GameQ/Protocols/Batt1944.php +++ /dev/null @@ -1,68 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battalion 1944 - * - * @package GameQ\Protocols - * @author TacTicToe66 - */ -class Batt1944 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'batt1944'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battalion 1944"; - - /** - * query_port = client_port + 3 - * - * @type int - */ - protected $port_diff = 3; - - /** - * Normalize main fields - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'bat_gamemode_s', - 'hostname' => 'bat_name_s', - 'mapname' => 'bat_map_s', - 'maxplayers' => 'bat_max_players_i', - 'numplayers' => 'bat_player_count_s', - 'password' => 'bat_has_password_s', - ], - ]; -} diff --git a/GameQ/Protocols/Bf1942.php b/GameQ/Protocols/Bf1942.php deleted file mode 100644 index 4cf06c5..0000000 --- a/GameQ/Protocols/Bf1942.php +++ /dev/null @@ -1,88 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battlefield 1942 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf1942 extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf1942'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 1942"; - - /** - * query_port = client_port + 8433 - * 23000 = 14567 + 8433 - * - * @type int - */ - protected $port_diff = 8433; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "bf1942://%s:%d"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'playername', - 'kills' => 'kills', - 'deaths' => 'deaths', - 'ping' => 'ping', - 'score' => 'score', - ], - 'team' => [ - 'name' => 'teamname', - ], - ]; -} diff --git a/GameQ/Protocols/Bf2.php b/GameQ/Protocols/Bf2.php deleted file mode 100644 index 0610f9d..0000000 --- a/GameQ/Protocols/Bf2.php +++ /dev/null @@ -1,98 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battlefield 2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf2 extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 2"; - - /** - * query_port = client_port + 8433 - * 29900 = 16567 + 13333 - * - * @type int - */ - protected $port_diff = 13333; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "bf2://%s:%d"; - - /** - * BF2 has a different query packet to send than "normal" Gamespy 3 - * - * @var array - */ - protected $packets = [ - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01", - ]; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'kills' => 'score', - 'deaths' => 'deaths', - 'ping' => 'ping', - 'score' => 'score', - ], - 'team' => [ - 'name' => 'team', - 'score' => 'score', - ], - ]; -} diff --git a/GameQ/Protocols/Bf3.php b/GameQ/Protocols/Bf3.php deleted file mode 100644 index 9084515..0000000 --- a/GameQ/Protocols/Bf3.php +++ /dev/null @@ -1,348 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Battlefield 3 Protocol Class - * - * Good place for doc status and info is http://www.fpsadmin.com/forum/showthread.php?t=24134 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf3 extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x00\x00\x00\x21\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - self::PACKET_VERSION => "\x00\x00\x00\x22\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - self::PACKET_PLAYERS => - "\x00\x00\x00\x23\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - 1627389952 => "processDetails", // a - 1644167168 => "processVersion", // b - 1660944384 => "processPlayers", // c - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'bf3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 3"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 22000 - * 47200 = 25200 + 22000 - * - * @type int - */ - protected $port_diff = 22000; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - 'team' => [ - 'score' => 'tickets', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Holds the results sent back - $results = []; - - // Holds the processed packets after having been reassembled - $processed = []; - - // Start up the index for the processed - $sequence_id_last = 0; - - foreach ($this->packets_response as $packet) { - // Create a new buffer - $buffer = new Buffer($packet); - - // Each "good" packet begins with sequence_id (32-bit) - $sequence_id = $buffer->readInt32(); - - // Sequence id is a response - if (array_key_exists($sequence_id, $this->responses)) { - $processed[$sequence_id] = $buffer->getBuffer(); - $sequence_id_last = $sequence_id; - } else { - // This is a continuation of the previous packet, reset the buffer and append - $buffer->jumpto(0); - - // Append - $processed[$sequence_id_last] .= $buffer->getBuffer(); - } - } - - unset($buffer, $sequence_id_last, $sequence_id); - - // Iterate over the combined packets and do some work - foreach ($processed as $sequence_id => $data) { - // Create a new buffer - $buffer = new Buffer($data); - - // Get the length of the packet - $packetLength = $buffer->getLength(); - - // Check to make sure the expected length matches the real length - // Subtract 4 for the sequence_id pulled out earlier - if ($packetLength != ($buffer->readInt32() - 4)) { - throw new Exception(__METHOD__ . " packet length does not match expected length!"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$sequence_id]], [$buffer]) - ); - } - - return $results; - } - - /* - * Internal Methods - */ - - /** - * Decode the buffer into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function decode(Buffer $buffer) - { - - $items = []; - - // Get the number of words in this buffer - $itemCount = $buffer->readInt32(); - - // Loop over the number of items - for ($i = 0; $i < $itemCount; $i++) { - // Length of the string - $buffer->readInt32(); - - // Just read the string - $items[$i] = $buffer->readString(); - } - - return $items; - } - - /** - * Process the server details - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int)$items[2]); - $result->add('max_players', (int)$items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int)$items[6]); - $result->add('roundstotal', (int)$items[7]); - $result->add('num_teams', (int)$items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int)$items[$index_current]); - $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty - $result->add('ranked', (int)$items[$index_current + 2]); - $result->add('punkbuster', (int)$items[$index_current + 3]); - $result->add('password', (int)$items[$index_current + 4]); - $result->add('uptime', (int)$items[$index_current + 5]); - $result->add('roundtime', (int)$items[$index_current + 6]); - // Added in R9 - $result->add('ip_port', $items[$index_current + 7]); - $result->add('punkbuster_version', $items[$index_current + 8]); - $result->add('join_queue', (int)$items[$index_current + 9]); - $result->add('region', $items[$index_current + 10]); - $result->add('pingsite', $items[$index_current + 11]); - $result->add('country', $items[$index_current + 12]); - // Added in R29, No docs as of yet - $result->add('quickmatch', (int)$items[$index_current + 13]); // Guessed from research - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } - - /** - * Process the server version - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processVersion(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - $result->add('version', $items[2]); - - unset($buffer, $items); - - return $result->fetch(); - } - - /** - * Process the players - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Number of data points per player - $numTags = $items[1]; - - // Grab the tags for each player - $tags = array_slice($items, 2, $numTags); - - // Get the player count - $playerCount = $items[$numTags + 2]; - - // Iterate over the index until we run out of players - for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { - // Loop over the player tags and extract the info for that tag - foreach ($tags as $index => $tag) { - $result->addPlayer($tag, $items[($x + $index)]); - } - } - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Bf4.php b/GameQ/Protocols/Bf4.php deleted file mode 100644 index 6951752..0000000 --- a/GameQ/Protocols/Bf4.php +++ /dev/null @@ -1,114 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Battlefield 4 Protocol class - * - * Good place for doc status and info is http://battlelog.battlefield.com/bf4/forum/view/2955064768683911198/ - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf4 extends Bf3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 4"; - - /** - * Handle processing details since they are different than BF3 - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int) $items[2]); - $result->add('max_players', (int) $items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int) $items[6]); - $result->add('roundstotal', (int) $items[7]); - $result->add('num_teams', (int) $items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int) $items[$index_current]); - $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty - $result->add('ranked', (int) $items[$index_current + 2]); - $result->add('punkbuster', (int) $items[$index_current + 3]); - $result->add('password', (int) $items[$index_current + 4]); - $result->add('uptime', (int) $items[$index_current + 5]); - $result->add('roundtime', (int) $items[$index_current + 6]); - $result->add('ip_port', $items[$index_current + 7]); - $result->add('punkbuster_version', $items[$index_current + 8]); - $result->add('join_queue', (int) $items[$index_current + 9]); - $result->add('region', $items[$index_current + 10]); - $result->add('pingsite', $items[$index_current + 11]); - $result->add('country', $items[$index_current + 12]); - //$result->add('quickmatch', (int) $items[$index_current + 13]); Supposed to be here according to R42 but is not - $result->add('blaze_player_count', (int) $items[$index_current + 13]); - $result->add('blaze_game_state', (int) $items[$index_current + 14]); - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Bfbc2.php b/GameQ/Protocols/Bfbc2.php deleted file mode 100644 index b7167a0..0000000 --- a/GameQ/Protocols/Bfbc2.php +++ /dev/null @@ -1,326 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Battlefield Bad Company 2 Protocol Class - * - * NOTE: There are no qualifiers to the response packets sent back from the server as to which response packet - * belongs to which query request. For now this class assumes the responses are in the same order as the order in - * which the packets were sent to the server. If this assumption turns out to be wrong there is easy way to tell which - * response belongs to which query. Hopefully this assumption will hold true as it has in my testing. - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bfbc2 extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_VERSION => "\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - self::PACKET_STATUS => "\x00\x00\x00\x00\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - self::PACKET_PLAYERS => "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "processVersion", - "processDetails", - "processPlayers", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'bfbc2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bfbc2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield Bad Company 2"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 29321 - * 48888 = 19567 + 29321 - * - * @type int - */ - protected $port_diff = 29321; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - 'team' => [ - 'score' => 'tickets', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - //print_r($this->packets_response); - - // Holds the results sent back - $results = []; - - // Iterate over the response packets - // @todo: This protocol has no packet ordering, ids or anyway to identify which packet coming back belongs to which initial call. - foreach ($this->packets_response as $i => $packet) { - // Create a new buffer - $buffer = new Buffer($packet); - - // Burn first 4 bytes, same across all packets - $buffer->skip(4); - - // Get the packet length - $packetLength = $buffer->getLength(); - - // Check to make sure the expected length matches the real length - // Subtract 4 for the header burn - if ($packetLength != ($buffer->readInt32() - 4)) { - throw new Exception(__METHOD__ . " packet length does not match expected length!"); - } - - // We assume the packets are coming back in the same order as sent, this maybe incorrect... - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$i]], [$buffer]) - ); - } - - unset($buffer, $packetLength); - - return $results; - } - - /* - * Internal Methods - */ - - /** - * Decode the buffer into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function decode(Buffer $buffer) - { - - $items = []; - - // Get the number of words in this buffer - $itemCount = $buffer->readInt32(); - - // Loop over the number of items - for ($i = 0; $i < $itemCount; $i++) { - // Length of the string - $buffer->readInt32(); - - // Just read the string - $items[$i] = $buffer->readString(); - } - - return $items; - } - - /** - * Process the server details - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int)$items[2]); - $result->add('max_players', (int)$items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int)$items[6]); - $result->add('roundstotal', (int)$items[7]); - $result->add('num_teams', (int)$items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int)$items[$index_current]); - $result->add('online', 1); // Forced true, shows accepting players - $result->add('ranked', (($items[$index_current + 2] == 'true') ? 1 : 0)); - $result->add('punkbuster', (($items[$index_current + 3] == 'true') ? 1 : 0)); - $result->add('password', (($items[$index_current + 4] == 'true') ? 1 : 0)); - $result->add('uptime', (int)$items[$index_current + 5]); - $result->add('roundtime', (int)$items[$index_current + 6]); - $result->add('mod', $items[$index_current + 7]); - - $result->add('ip_port', $items[$index_current + 9]); - $result->add('punkbuster_version', $items[$index_current + 10]); - $result->add('join_queue', (($items[$index_current + 11] == 'true') ? 1 : 0)); - $result->add('region', $items[$index_current + 12]); - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } - - /** - * Process the server version - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processVersion(Buffer $buffer) - { - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - $result->add('version', $items[2]); - - unset($buffer, $items); - - return $result->fetch(); - } - - /** - * Process the players - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Number of data points per player - $numTags = $items[1]; - - // Grab the tags for each player - $tags = array_slice($items, 2, $numTags); - - // Get the player count - $playerCount = $items[$numTags + 2]; - - // Iterate over the index until we run out of players - for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { - // Loop over the player tags and extract the info for that tag - foreach ($tags as $index => $tag) { - $result->addPlayer($tag, $items[($x + $index)]); - } - } - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Bfh.php b/GameQ/Protocols/Bfh.php deleted file mode 100644 index 067d77f..0000000 --- a/GameQ/Protocols/Bfh.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Battlefield Hardline Protocol class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bfh extends Bf4 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bfh'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield Hardline"; -} diff --git a/GameQ/Protocols/Brink.php b/GameQ/Protocols/Brink.php deleted file mode 100644 index 2022652..0000000 --- a/GameQ/Protocols/Brink.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Brink - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Brink extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'brink'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Brink"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Cod.php b/GameQ/Protocols/Cod.php deleted file mode 100644 index 2425ea6..0000000 --- a/GameQ/Protocols/Cod.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty Protocol Class - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Cod extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty"; -} diff --git a/GameQ/Protocols/Cod2.php b/GameQ/Protocols/Cod2.php deleted file mode 100644 index 79be7ca..0000000 --- a/GameQ/Protocols/Cod2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty 2 Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cod2 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty 2"; -} diff --git a/GameQ/Protocols/Cod4.php b/GameQ/Protocols/Cod4.php deleted file mode 100644 index 9838d9c..0000000 --- a/GameQ/Protocols/Cod4.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty 4 Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cod4 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty 4"; -} diff --git a/GameQ/Protocols/Codmw3.php b/GameQ/Protocols/Codmw3.php deleted file mode 100644 index 1049b60..0000000 --- a/GameQ/Protocols/Codmw3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Codmw3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Codmw3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'codmw3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty: Modern Warfare 3"; - - /** - * query_port = client_port + 2 - * - * @type int - */ - protected $port_diff = 2; -} diff --git a/GameQ/Protocols/Coduo.php b/GameQ/Protocols/Coduo.php deleted file mode 100644 index 2dd9a18..0000000 --- a/GameQ/Protocols/Coduo.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty United Offensive Class - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Coduo extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'coduo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty: United Offensive"; -} diff --git a/GameQ/Protocols/Codwaw.php b/GameQ/Protocols/Codwaw.php deleted file mode 100644 index f730678..0000000 --- a/GameQ/Protocols/Codwaw.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty World at War Class - * - * @package GameQ\Protocols - * @author naXe - * @author Austin Bischoff - */ -class Codwaw extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'codwaw'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty: World at War"; -} diff --git a/GameQ/Protocols/Conanexiles.php b/GameQ/Protocols/Conanexiles.php deleted file mode 100644 index a097e1d..0000000 --- a/GameQ/Protocols/Conanexiles.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Conanexiles - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Conanexiles extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'conanexiles'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Conan Exiles"; -} diff --git a/GameQ/Protocols/Contagion.php b/GameQ/Protocols/Contagion.php deleted file mode 100644 index 64d0b76..0000000 --- a/GameQ/Protocols/Contagion.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Contagion - * - * @package GameQ\Protocols - * @author Nikolay Ipanyuk - * @author Austin Bischoff - */ -class Contagion extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'contagion'; - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Contagion"; -} diff --git a/GameQ/Protocols/Crysis.php b/GameQ/Protocols/Crysis.php deleted file mode 100644 index e09a673..0000000 --- a/GameQ/Protocols/Crysis.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Crysis - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Crysis extends Gamespy3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'crysis'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Crysis"; -} diff --git a/GameQ/Protocols/Crysis2.php b/GameQ/Protocols/Crysis2.php deleted file mode 100644 index 75c6614..0000000 --- a/GameQ/Protocols/Crysis2.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Crysis2 - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Crysis2 extends Gamespy3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'crysis2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Crysis 2"; -} diff --git a/GameQ/Protocols/Crysiswars.php b/GameQ/Protocols/Crysiswars.php deleted file mode 100644 index 44dcdcf..0000000 --- a/GameQ/Protocols/Crysiswars.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Crysiswars - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Crysiswars extends Gamespy3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'crysiswars'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Crysis Wars"; -} diff --git a/GameQ/Protocols/Cs15.php b/GameQ/Protocols/Cs15.php deleted file mode 100644 index ba37524..0000000 --- a/GameQ/Protocols/Cs15.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Counter-Strike 1.5 Protocol Class - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - * - * @package GameQ\Protocols - */ -class Cs15 extends Won -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs15'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 1.5"; -} diff --git a/GameQ/Protocols/Cs16.php b/GameQ/Protocols/Cs16.php deleted file mode 100644 index 25a6602..0000000 --- a/GameQ/Protocols/Cs16.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Cs16 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cs16 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs16'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 1.6"; - - /** - * In the case of cs 1.6 we offload split packets here because the split packet response for rules is in - * the old gold source format - * - * @param $packet_id - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function processPackets($packet_id, array $packets = []) - { - - // The response is gold source if the packets are split - $this->source_engine = self::GOLDSOURCE_ENGINE; - - // Offload to the parent - $packs = parent::processPackets($packet_id, $packets); - - // Reset the engine - $this->source_engine = self::SOURCE_ENGINE; - - // Return the result - return $packs; - } -} diff --git a/GameQ/Protocols/Cs2d.php b/GameQ/Protocols/Cs2d.php deleted file mode 100644 index 0f238fd..0000000 --- a/GameQ/Protocols/Cs2d.php +++ /dev/null @@ -1,263 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Counter-Strike 2d Protocol Class - * - * Note: - * Unable to make player information calls work as the protocol does not like parallel requests - * - * @author Austin Bischoff - */ -class Cs2d extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x01\x00\xFB\x01", - //self::PACKET_STATUS => "\x01\x00\x03\x10\x21\xFB\x01\x75\x00", - self::PACKET_PLAYERS => "\x01\x00\xFB\x05", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x01\x00\xFB\x01" => "processDetails", - "\x01\x00\xFB\x05" => "processPlayers", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'cs2d'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs2d'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 2d"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "cs2d://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_mode', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'deaths' => 'deaths', - 'score' => 'score', - ], - ]; - - /** - * Process the response for the Tibia server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // We have a merged packet, try to split it back up - if (count($this->packets_response) == 1) { - // Temp buffer to make string manipulation easier - $buffer = new Buffer($this->packets_response[0]); - - // Grab the header and set the packet we need to split with - $packet = (($buffer->lookAhead(4) === $this->packets[self::PACKET_PLAYERS]) ? - self::PACKET_STATUS : self::PACKET_PLAYERS); - - // Explode the merged packet as the response - $responses = explode(substr($this->packets[$packet], 2), $buffer->getData()); - - // Try to rebuild the second packet to the same as if it was sent as two separate responses - $responses[1] = $this->packets[$packet] . ((count($responses) === 2) ? $responses[1] : ""); - - unset($buffer); - } else { - $responses = $this->packets_response; - } - - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($responses as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(4); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /** - * Handles processing the details data into a usable format - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processDetails(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // First int is the server flags - $serverFlags = $buffer->readInt8(); - - // Read server flags - $result->add('password', (int)$this->readFlag($serverFlags, 0)); - $result->add('registered_only', (int)$this->readFlag($serverFlags, 1)); - $result->add('fog_of_war', (int)$this->readFlag($serverFlags, 2)); - $result->add('friendly_fire', (int)$this->readFlag($serverFlags, 3)); - $result->add('bots_enabled', (int)$this->readFlag($serverFlags, 5)); - $result->add('lua_scripts', (int)$this->readFlag($serverFlags, 6)); - - // Read the rest of the buffer data - $result->add('servername', utf8_encode($buffer->readPascalString(0))); - $result->add('mapname', utf8_encode($buffer->readPascalString(0))); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('game_mode', $buffer->readInt8()); - $result->add('num_bots', (($this->readFlag($serverFlags, 5)) ? $buffer->readInt8() : 0)); - $result->add('dedicated', 1); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // First entry is the number of players in this list. Don't care - $buffer->read(); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt8()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString(0))); - $result->addPlayer('team', $buffer->readInt8()); - $result->addPlayer('score', $buffer->readInt32()); - $result->addPlayer('deaths', $buffer->readInt32()); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } - - /** - * Read flags from stored value - * - * @param $flags - * @param $offset - * - * @return bool - */ - protected function readFlag($flags, $offset) - { - return !!($flags & (1 << $offset)); - } -} diff --git a/GameQ/Protocols/Cscz.php b/GameQ/Protocols/Cscz.php deleted file mode 100644 index b539128..0000000 --- a/GameQ/Protocols/Cscz.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Cscz - * - * Based off of CS 1.6 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cscz extends Cs16 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cscz'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Condition Zero"; -} diff --git a/GameQ/Protocols/Csgo.php b/GameQ/Protocols/Csgo.php deleted file mode 100644 index 41af735..0000000 --- a/GameQ/Protocols/Csgo.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Csgo - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Csgo extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'csgo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Global Offensive"; -} diff --git a/GameQ/Protocols/Css.php b/GameQ/Protocols/Css.php deleted file mode 100644 index be75da3..0000000 --- a/GameQ/Protocols/Css.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Css - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Css extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'css'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Source"; -} diff --git a/GameQ/Protocols/Dal.php b/GameQ/Protocols/Dal.php deleted file mode 100644 index 6b05037..0000000 --- a/GameQ/Protocols/Dal.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dark and Light - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dal extends Arkse -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dal'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Dark and Light"; -} diff --git a/GameQ/Protocols/Dayz.php b/GameQ/Protocols/Dayz.php deleted file mode 100644 index 01c7c28..0000000 --- a/GameQ/Protocols/Dayz.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dayz - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dayz extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dayz'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "DayZ Standalone"; - - /** - * Overload the math used to guess at the Query Port - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - - /* - * Port layout: - * 2302 - 27016 - * 2402 - 27017 - * 2502 - 27018 - * 2602 - 27019 - * 2702 - 27020 - * ... - */ - - return 27016 + (($clientPort - 2302) / 100); - } -} diff --git a/GameQ/Protocols/Dayzmod.php b/GameQ/Protocols/Dayzmod.php deleted file mode 100644 index 2ce1076..0000000 --- a/GameQ/Protocols/Dayzmod.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dayzmod - * - * @package GameQ\Protocols - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Dayzmod extends Armedassault2oa -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dayzmod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "DayZ Mod"; -} diff --git a/GameQ/Protocols/Dod.php b/GameQ/Protocols/Dod.php deleted file mode 100644 index 0c7baf6..0000000 --- a/GameQ/Protocols/Dod.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dod - * - * Based off of CS 1.6 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dod extends Cs16 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Day of Defeat"; -} diff --git a/GameQ/Protocols/Dods.php b/GameQ/Protocols/Dods.php deleted file mode 100644 index 898d75b..0000000 --- a/GameQ/Protocols/Dods.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dods - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dods extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dods'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Day of Defeat: Source"; -} diff --git a/GameQ/Protocols/Dow.php b/GameQ/Protocols/Dow.php deleted file mode 100644 index b66512a..0000000 --- a/GameQ/Protocols/Dow.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; - -/** - * Class Dow - * - * Apparently the player response is incomplete as there is no information being returned for that packet - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dow extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Days of War"; - - /** - * Normalize main fields - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'G_s', - 'hostname' => 'ONM_s', - 'mapname' => 'MPN_s', - 'maxplayers' => 'P_i', - 'numplayers' => 'N_i', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; -} diff --git a/GameQ/Protocols/Eco.php b/GameQ/Protocols/Eco.php deleted file mode 100644 index a2292e9..0000000 --- a/GameQ/Protocols/Eco.php +++ /dev/null @@ -1,123 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; - -/** - * ECO Global Survival Protocol Class - * - * @author Austin Bischoff - */ -class Eco extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - self::PACKET_STATUS => "GET /frontpage HTTP/1.0\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Http protocol is SSL - * - * @var string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'eco'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'eco'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "ECO Global Survival"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'description', - 'maxplayers' => 'totalplayers', - 'numplayers' => 'onlineplayers', - 'password' => 'haspassword', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - if (empty($this->packets_response)) { - return []; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Eco server is invalid."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - foreach ($json->Info as $info => $setting) { - $result->add(strtolower($info), $setting); - } - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Egs.php b/GameQ/Protocols/Egs.php deleted file mode 100644 index 4f82aa8..0000000 --- a/GameQ/Protocols/Egs.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Empyrion - Galactic Survival - * - * @package GameQ\Protocols - * @author Austin Bischoff - * @author TacTicToe66 - */ -class EgS extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'egs'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Empyrion - Galactic Survival"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Et.php b/GameQ/Protocols/Et.php deleted file mode 100644 index 63b5beb..0000000 --- a/GameQ/Protocols/Et.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Wolfenstein Enemy Territory Protocol Class - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Et extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'et'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Wolfenstein Enemy Territory"; -} diff --git a/GameQ/Protocols/Etqw.php b/GameQ/Protocols/Etqw.php deleted file mode 100644 index 1f3a446..0000000 --- a/GameQ/Protocols/Etqw.php +++ /dev/null @@ -1,234 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * Enemy Territory Quake Wars Protocol Class - * - * @author Austin Bischoff - */ -class Etqw extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\xFF\xFFgetInfoEx\x00\x00\x00\x00", - //self::PACKET_STATUS => "\xFF\xFFgetInfo\x00\x00\x00\x00\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFFinfoExResponse" => "processStatus", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'etqw'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'etqw'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Enemy Territory Quake Wars"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'campaign', - 'hostname' => 'name', - 'mapname' => 'map', - 'maxplayers' => 'maxPlayers', - 'mod' => 'gamename', - 'numplayers' => 'numplayers', - 'password' => 'privateClients', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // In case it comes back as multiple packets (it shouldn't) - $buffer = new Buffer(implode('', $this->packets_response)); - - // Figure out what packet response this is for - $response_type = $buffer->readString(); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Offload the call - $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handle processing the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Defaults - $result->add('dedicated', 1); - - // Now burn the challenge, version and size - $buffer->skip(16); - - // Key / value pairs - while ($buffer->getLength()) { - $var = str_replace('si_', '', $buffer->readString()); - $val = $buffer->readString(); - if (empty($var) && empty($val)) { - break; - } - // Add the server prop - $result->add($var, $val); - } - // Now let's do the basic player info - $this->parsePlayers($buffer, $result); - - // Now grab the rest of the server info - $result->add('osmask', $buffer->readInt32()); - $result->add('ranked', $buffer->readInt8()); - $result->add('timeleft', $buffer->readInt32()); - $result->add('gamestate', $buffer->readInt8()); - $result->add('servertype', $buffer->readInt8()); - - // 0: regular server - if ($result->get('servertype') == 0) { - $result->add('interested_clients', $buffer->readInt8()); - } else { - // 1: tv server - $result->add('connected_clients', $buffer->readInt32()); - $result->add('max_clients', $buffer->readInt32()); - } - - // Now let's parse the extended player info - $this->parsePlayersExtra($buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Parse players out of the status ex response - * - * @param Buffer $buffer - * @param Result $result - */ - protected function parsePlayers(Buffer &$buffer, Result &$result) - { - // By default there are 0 players - $players = 0; - - // Iterate over the players until we run out - while (($id = $buffer->readInt8()) != 32) { - $result->addPlayer('id', $id); - $result->addPlayer('ping', $buffer->readInt16()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('clantag_pos', $buffer->readInt8()); - $result->addPlayer('clantag', $buffer->readString()); - $result->addPlayer('bot', $buffer->readInt8()); - $players++; - } - - // Let's add in the current players as a result - $result->add('numplayers', $players); - - // Free some memory - unset($id); - } - - /** - * Handle parsing extra player data - * - * @param Buffer $buffer - * @param Result $result - */ - protected function parsePlayersExtra(Buffer &$buffer, Result &$result) - { - // Iterate over the extra player info - while (($id = $buffer->readInt8()) != 32) { - $result->addPlayer('total_xp', $buffer->readFloat32()); - $result->addPlayer('teamname', $buffer->readString()); - $result->addPlayer('total_kills', $buffer->readInt32()); - $result->addPlayer('total_deaths', $buffer->readInt32()); - } - - // @todo: Add team stuff - - // Free some memory - unset($id); - } -} diff --git a/GameQ/Protocols/Ffe.php b/GameQ/Protocols/Ffe.php deleted file mode 100644 index c0947bd..0000000 --- a/GameQ/Protocols/Ffe.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Ffe - Fortress Forever - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Ffe extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ffe'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Fortress Forever"; -} diff --git a/GameQ/Protocols/Ffow.php b/GameQ/Protocols/Ffow.php deleted file mode 100644 index 00c33d4..0000000 --- a/GameQ/Protocols/Ffow.php +++ /dev/null @@ -1,243 +0,0 @@ - "\xFF\xFF\xFF\xFF\x57", - self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - self::PACKET_INFO => "\xFF\xFF\xFF\xFF\x46\x4C\x53\x51", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFF\x49\x02" => 'processInfo', // I - "\xFF\xFF\xFF\xFF\x45\x00" => 'processRules', // E - "\xFF\xFF\xFF\xFF\x44\x00" => 'processPlayers', // D - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ffow'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ffow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Frontlines Fuel of War"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 2 - * - * @type int - */ - protected $port_diff = 2; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamemode', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'mod' => 'modname', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - // Burn padding - $challenge_buffer->skip(5); - - // Apply the challenge and return - return $this->challengeApply($challenge_buffer->read(4)); - } - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Init results - $results = []; - - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Figure out what packet response this is for - $response_type = $buffer->read(6); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($response_type) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - $result->add('servername', $buffer->readString()); - $result->add('mapname', $buffer->readString()); - $result->add('modname', $buffer->readString()); - $result->add('gamemode', $buffer->readString()); - $result->add('description', $buffer->readString()); - $result->add('version', $buffer->readString()); - $result->add('port', $buffer->readInt16()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('dedicated', $buffer->readInt8()); - $result->add('os', $buffer->readInt8()); - $result->add('password', $buffer->readInt8()); - $result->add('anticheat', $buffer->readInt8()); - $result->add('average_fps', $buffer->readInt8()); - $result->add('round', $buffer->readInt8()); - $result->add('max_rounds', $buffer->readInt8()); - $result->add('time_left', $buffer->readInt16()); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing the server rules - * - * @param Buffer $buffer - * - * @return array - */ - protected function processRules(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn extra header - $buffer->skip(1); - - // Read rules until we run out of buffer - while ($buffer->getLength()) { - $key = $buffer->readString(); - // Check for map - if (strstr($key, "Map:")) { - $result->addSub("maplist", "name", $buffer->readString()); - } else // Regular rule - { - $result->add($key, $buffer->readString()); - } - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @todo: Build this out when there is a server with players to test against - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Gamespy.php b/GameQ/Protocols/Gamespy.php deleted file mode 100644 index b1a1e4f..0000000 --- a/GameQ/Protocols/Gamespy.php +++ /dev/null @@ -1,181 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use \GameQ\Exception\Protocol as Exception; - -/** - * GameSpy Protocol class - * - * @author Austin Bischoff - */ -class Gamespy extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x5C\x73\x74\x61\x74\x75\x73\x5C", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Process the response for this protocol - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // Holds the processed packets so we can sort them in case they come in an unordered - $processed = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Check to see if we had a preg_match error - if (($match = preg_match("#^(.*)\\\\queryid\\\\([^\\\\]+)(\\\\|$)#", $response, $matches)) === false - || $match != 1 - ) { - throw new Exception(__METHOD__ . " An error occurred while parsing the packets for 'queryid'"); - } - - // Multiply so we move the decimal point out of the way, if there is one - $key = (int)(floatval($matches[2]) * 1000); - - // Add this packet to the processed - $processed[$key] = $matches[1]; - } - - // Sort the new array to make sure the keys (query ids) are in the proper order - ksort($processed, SORT_NUMERIC); - - // Create buffer and offload processing - return $this->processStatus(new Buffer(implode('', $processed))); - } - - /* - * Internal methods - */ - - /** - * Handle processing the status buffer - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // By default dedicted - $result->add('dedicated', 1); - - // Lets peek and see if the data starts with a \ - if ($buffer->lookAhead(1) == '\\') { - // Burn the first one - $buffer->skip(1); - } - - // Explode the data - $data = explode('\\', $buffer->getBuffer()); - - // No longer needed - unset($buffer); - - // Init some vars - $numPlayers = 0; - $numTeams = 0; - - $itemCount = count($data); - - // Check to make sure we have more than 1 item in the array before trying to loop - if (count($data) > 1) { - // Now lets loop the array since we have items - for ($x = 0; $x < $itemCount; $x += 2) { - // Set some local vars - $key = $data[$x]; - $val = $data[$x + 1]; - - // Check for _ variable (i.e players) - if (($suffix = strrpos($key, '_')) !== false && is_numeric(substr($key, $suffix + 1))) { - // See if this is a team designation - if (substr($key, 0, $suffix) == 'teamname') { - $result->addTeam('teamname', $val); - $numTeams++; - } else { - // Its a player - if (substr($key, 0, $suffix) == 'playername') { - $numPlayers++; - } - $result->addPlayer(substr($key, 0, $suffix), utf8_encode($val)); - } - } else { - // Regular variable so just add the value. - $result->add($key, $val); - } - } - } - - // Add the player and team count - $result->add('num_players', $numPlayers); - $result->add('num_teams', $numTeams); - - // Unset some stuff to free up memory - unset($data, $key, $val, $suffix, $x, $itemCount); - - // Return the result - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Gamespy2.php b/GameQ/Protocols/Gamespy2.php deleted file mode 100644 index c7788d9..0000000 --- a/GameQ/Protocols/Gamespy2.php +++ /dev/null @@ -1,269 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * GameSpy2 Protocol class - * - * Given the ability for non utf-8 characters to be used as hostnames, player names, etc... this - * version returns all strings utf-8 encoded (utf8_encode). To access the proper version of a - * string response you must use utf8_decode() on the specific response. - * - * @author Austin Bischoff - */ -class Gamespy2 extends Protocol -{ - - /** - * Define the state of this class - * - * @type int - */ - protected $state = self::STATE_BETA; - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\xFE\xFD\x00\x43\x4F\x52\x59\xFF\x00\x00", - self::PACKET_PLAYERS => "\xFE\xFD\x00\x43\x4F\x52\x58\x00\xFF\xFF", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x00\x43\x4F\x52\x59" => "processDetails", - "\x00\x43\x4F\x52\x58" => "processPlayers", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy2 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'mod' => 'mod', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - ]; - - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // We go until we hit an empty key - while ($buffer->getLength()) { - $key = $buffer->readString(); - if (strlen($key) == 0) { - break; - } - $result->add($key, utf8_encode($buffer->readString())); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the players data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Skip the header - $buffer->skip(1); - - // Players are first - $this->parsePlayerTeam('players', $buffer, $result); - - // Teams are next - $this->parsePlayerTeam('teams', $buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Parse the player/team info returned from the player call - * - * @param string $dataType - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - * - * @throws Exception - */ - protected function parsePlayerTeam($dataType, Buffer &$buffer, Result &$result) - { - - // Do count - $result->add('num_' . $dataType, $buffer->readInt8()); - - // Variable names - $varNames = []; - - // Loop until we run out of length - while ($buffer->getLength()) { - $varNames[] = str_replace('_', '', $buffer->readString()); - - if ($buffer->lookAhead() === "\x00") { - $buffer->skip(); - break; - } - } - - // Check if there are any value entries - if ($buffer->lookAhead() == "\x00") { - $buffer->skip(); - - return; - } - - // Get the values - while ($buffer->getLength() > 4) { - foreach ($varNames as $varName) { - $result->addSub($dataType, utf8_encode($varName), utf8_encode($buffer->readString())); - } - if ($buffer->lookAhead() === "\x00") { - $buffer->skip(); - break; - } - } - - return; - } -} diff --git a/GameQ/Protocols/Gamespy3.php b/GameQ/Protocols/Gamespy3.php deleted file mode 100644 index 2df0a4b..0000000 --- a/GameQ/Protocols/Gamespy3.php +++ /dev/null @@ -1,340 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * GameSpy3 Protocol class - * - * Given the ability for non utf-8 characters to be used as hostnames, player names, etc... this - * version returns all strings utf-8 encoded (utf8_encode). To access the proper version of a - * string response you must use utf8_decode() on the specific response. - * - * @author Austin Bischoff - */ -class Gamespy3 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x01", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy3 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * This defines the split between the server info and player/team info. - * This value can vary by game. This value is the default split. - * - * @var string - */ - protected $packetSplit = "/\\x00\\x00\\x01/m"; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - // Pull out the challenge - $challenge = substr(preg_replace("/[^0-9\-]/si", "", $challenge_buffer->getBuffer()), 1); - - // By default, no challenge result (see #197) - $challenge_result = ''; - - // Check for valid challenge (see #197) - if ($challenge) { - // Encode chellenge result - $challenge_result = sprintf( - "%c%c%c%c", - ($challenge >> 24), - ($challenge >> 16), - ($challenge >> 8), - ($challenge >> 0) - ); - } - - // Apply the challenge and return - return $this->challengeApply($challenge_result); - } - - /** - * Process the response - * - * @return array - */ - public function processResponse() - { - - // Holds the processed packets - $processed = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Make a buffer - $buffer = new Buffer($response, Buffer::NUMBER_TYPE_BIGENDIAN); - - // Packet type = 0 - $buffer->readInt8(); - - // Session Id - $buffer->readInt32(); - - // We need to burn the splitnum\0 because it is not used - $buffer->skip(9); - - // Get the id - $id = $buffer->readInt8(); - - // Burn next byte not sure what it is used for - $buffer->skip(1); - - // Add this packet to the processed - $processed[$id] = $buffer->getBuffer(); - - unset($buffer, $id); - } - - // Sort packets, reset index - ksort($processed); - - // Offload cleaning up the packets if they happen to be split - $packets = $this->cleanPackets(array_values($processed)); - - // Split the packets by type general and the rest (i.e. players & teams) - $split = preg_split($this->packetSplit, implode('', $packets)); - - // Create a new result - $result = new Result(); - - // Assign variable due to pass by reference in PHP 7+ - $buffer = new Buffer($split[0], Buffer::NUMBER_TYPE_BIGENDIAN); - - // First key should be server details and rules - $this->processDetails($buffer, $result); - - // The rest should be the player and team information, if it exists - if (array_key_exists(1, $split)) { - $buffer = new Buffer($split[1], Buffer::NUMBER_TYPE_BIGENDIAN); - $this->processPlayersAndTeams($buffer, $result); - } - - unset($buffer); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles cleaning up packets since the responses can be a bit "dirty" - * - * @param array $packets - * - * @return array - */ - protected function cleanPackets(array $packets = []) - { - - // Get the number of packets - $packetCount = count($packets); - - // Compare last var of current packet with first var of next packet - // On a partial match, remove last var from current packet, - // variable header from next packet - for ($i = 0, $x = $packetCount; $i < $x - 1; $i++) { - // First packet - $fst = substr($packets[$i], 0, -1); - // Second packet - $snd = $packets[$i + 1]; - // Get last variable from first packet - $fstvar = substr($fst, strrpos($fst, "\x00") + 1); - // Get first variable from last packet - $snd = substr($snd, strpos($snd, "\x00") + 2); - $sndvar = substr($snd, 0, strpos($snd, "\x00")); - // Check if fstvar is a substring of sndvar - // If so, remove it from the first string - if (!empty($fstvar) && strpos($sndvar, $fstvar) !== false) { - $packets[$i] = preg_replace("#(\\x00[^\\x00]+\\x00)$#", "\x00", $packets[$i]); - } - } - - // Now let's loop the return and remove any dupe prefixes - for ($x = 1; $x < $packetCount; $x++) { - $buffer = new Buffer($packets[$x], Buffer::NUMBER_TYPE_BIGENDIAN); - - $prefix = $buffer->readString(); - - // Check to see if the return before has the same prefix present - if ($prefix != null && strstr($packets[($x - 1)], $prefix)) { - // Update the return by removing the prefix plus 2 chars - $packets[$x] = substr(str_replace($prefix, '', $packets[$x]), 2); - } - - unset($buffer); - } - - unset($x, $i, $snd, $sndvar, $fst, $fstvar); - - // Return cleaned packets - return $packets; - } - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processDetails(Buffer &$buffer, Result &$result) - { - - // We go until we hit an empty key - while ($buffer->getLength()) { - $key = $buffer->readString(); - if (strlen($key) == 0) { - break; - } - $result->add($key, utf8_encode($buffer->readString())); - } - } - - /** - * Handles processing the player and team data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - - /* - * Explode the data into groups. First is player, next is team (item_t) - * Each group should be as follows: - * - * [0] => item_ - * [1] => information for item_ - * ... - */ - $data = explode("\x00\x00", $buffer->getBuffer()); - - // By default item_group is blank, this will be set for each loop thru the data - $item_group = ''; - - // By default the item_type is blank, this will be set on each loop - $item_type = ''; - - // Save count as variable - $count = count($data); - - // Loop through all of the $data for information and pull it out into the result - for ($x = 0; $x < $count - 1; $x++) { - // Pull out the item - $item = $data[$x]; - // If this is an empty item, move on - if ($item == '' || $item == "\x00") { - continue; - } - /* - * Left as reference: - * - * Each block of player_ and team_t have preceding junk chars - * - * player_ is actually \x01player_ - * team_t is actually \x00\x02team_t - * - * Probably a by-product of the change to exploding the data from the original. - * - * For now we just strip out these characters - */ - // Check to see if $item has a _ at the end, this is player info - if (substr($item, -1) == '_') { - // Set the item group - $item_group = 'players'; - // Set the item type, rip off any trailing stuff and bad chars - $item_type = rtrim(str_replace("\x01", '', $item), '_'); - } elseif (substr($item, -2) == '_t') { - // Check to see if $item has a _t at the end, this is team info - // Set the item group - $item_group = 'teams'; - // Set the item type, rip off any trailing stuff and bad chars - $item_type = rtrim(str_replace(["\x00", "\x02"], '', $item), '_t'); - } else { - // We can assume it is data belonging to a previously defined item - - // Make a temp buffer so we have easier access to the data - $buf_temp = new Buffer($item, Buffer::NUMBER_TYPE_BIGENDIAN); - // Get the values - while ($buf_temp->getLength()) { - // No value so break the loop, end of string - if (($val = $buf_temp->readString()) === '') { - break; - } - // Add the value to the proper item in the correct group - $result->addSub($item_group, $item_type, utf8_encode(trim($val))); - } - // Unset our buffer - unset($buf_temp); - } - } - // Free up some memory - unset($count, $data, $item, $item_group, $item_type, $val); - } -} diff --git a/GameQ/Protocols/Gamespy4.php b/GameQ/Protocols/Gamespy4.php deleted file mode 100644 index e28755f..0000000 --- a/GameQ/Protocols/Gamespy4.php +++ /dev/null @@ -1,34 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * GameSpy4 Protocol Class - * - * By all accounts GameSpy 4 seems to be GameSpy 3. - * - * References: - * http://www.deletedscreen.com/?p=951 - * http://pastebin.com/2zZFDuTd - * - * @author Austin Bischoff - */ -class Gamespy4 extends Gamespy3 -{ -} diff --git a/GameQ/Protocols/Gmod.php b/GameQ/Protocols/Gmod.php deleted file mode 100644 index 6596724..0000000 --- a/GameQ/Protocols/Gmod.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Gmod - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Gmod extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gmod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Garry's Mod"; -} diff --git a/GameQ/Protocols/Grav.php b/GameQ/Protocols/Grav.php deleted file mode 100644 index e025075..0000000 --- a/GameQ/Protocols/Grav.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Grav Online Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Grav extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'grav'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GRAV Online"; -} diff --git a/GameQ/Protocols/Gta5m.php b/GameQ/Protocols/Gta5m.php deleted file mode 100644 index 0f0c50a..0000000 --- a/GameQ/Protocols/Gta5m.php +++ /dev/null @@ -1,173 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * GTA Five M Protocol Class - * - * Server base can be found at https://fivem.net/ - * - * Based on code found at https://github.com/LiquidObsidian/fivereborn-query - * - * @author Austin Bischoff - */ -class Gta5m extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\xFF\xFF\xFF\xFFgetinfo xxx", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFFinfoResponse" => "processStatus", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gta5m'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gta5m'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GTA Five M"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'sv_maxclients', - 'mod' => 'gamename', - 'numplayers' => 'clients', - 'password' => 'privateClients', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // In case it comes back as multiple packets (it shouldn't) - $buffer = new Buffer(implode('', $this->packets_response)); - - // Figure out what packet response this is for - $response_type = $buffer->readString(PHP_EOL); - - // Figure out which packet response this is - if (empty($response_type) || !array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Offload the call - $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handle processing the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Lets peek and see if the data starts with a \ - if ($buffer->lookAhead(1) == '\\') { - // Burn the first one - $buffer->skip(1); - } - - // Explode the data - $data = explode('\\', $buffer->getBuffer()); - - // No longer needed - unset($buffer); - - $itemCount = count($data); - - // Now lets loop the array - for ($x = 0; $x < $itemCount; $x += 2) { - // Set some local vars - $key = $data[$x]; - $val = $data[$x + 1]; - - if (in_array($key, ['challenge'])) { - continue; // skip - } - - // Regular variable so just add the value. - $result->add($key, $val); - } - - /*var_dump($data); - var_dump($result->fetch()); - - exit;*/ - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Gtan.php b/GameQ/Protocols/Gtan.php deleted file mode 100644 index f7b531e..0000000 --- a/GameQ/Protocols/Gtan.php +++ /dev/null @@ -1,163 +0,0 @@ -. - */ -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; -use GameQ\Server; - -/** - * Grand Theft Auto Network Protocol Class - * https://stats.gtanet.work/ - * - * Result from this call should be a header + JSON response - * - * References: - * - https://master.gtanet.work/apiservers - * - * @author Austin Bischoff - */ -class Gtan extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - //self::PACKET_STATUS => "GET /apiservers HTTP/1.0\r\nHost: master.gtanet.work\r\nAccept: */*\r\n\r\n", - self::PACKET_STATUS => "GET /gtan/api.php?ip=%s&raw HTTP/1.0\r\nHost: multiplayerhosting.info\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Http protocol is SSL - * - * @var string - */ - protected $transport = self::TRANSPORT_SSL; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'gtan'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'gtan'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "Grand Theft Auto Network"; - - /** - * Holds the real ip so we can overwrite it back - * - * @var string - */ - protected $realIp = null; - - protected $realPortQuery = null; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'mod' => 'mod', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - ]; - - public function beforeSend(Server $server) - { - // Loop over the packets and update them - foreach ($this->packets as $packetType => $packet) { - // Fill out the packet with the server info - $this->packets[$packetType] = sprintf($packet, $server->ip . ':' . $server->port_query); - } - - $this->realIp = $server->ip; - $this->realPortQuery = $server->port_query; - - // Override the existing settings - //$server->ip = 'master.gtanet.work'; - $server->ip = 'multiplayerhosting.info'; - $server->port_query = 443; - } - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // No response, assume offline - if (empty($this->packets_response)) { - return [ - 'gq_address' => $this->realIp, - 'gq_port_query' => $this->realPortQuery, - ]; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Gtan protocol is invalid."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - $result->add('gq_address', $this->realIp); - $result->add('gq_port_query', $this->realPortQuery); - - // Add server items - $result->add('hostname', $json->ServerName); - $result->add('serverversion', $json->ServerVersion); - $result->add('map', ((!empty($json->Map)) ? $json->Map : 'Los Santos/Blaine Country')); - $result->add('mod', $json->Gamemode); - $result->add('password', (int)$json->Passworded); - $result->add('numplayers', $json->CurrentPlayers); - $result->add('maxplayers', $json->MaxPlayers); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Gtar.php b/GameQ/Protocols/Gtar.php deleted file mode 100644 index 2121e07..0000000 --- a/GameQ/Protocols/Gtar.php +++ /dev/null @@ -1,164 +0,0 @@ -. - */ -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; -use GameQ\Server; - -/** - * Grand Theft Auto Rage Protocol Class - * https://rage.mp/masterlist/ - * - * Result from this call should be a header + JSON response - * - * @author K700 - * @author Austin Bischoff - */ -class Gtar extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - self::PACKET_STATUS => "GET /master/ HTTP/1.0\r\nHost: cdn.rage.mp\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Http protocol is SSL - * - * @var string - */ - protected $transport = self::TRANSPORT_SSL; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'gtar'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'gtar'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "Grand Theft Auto Rage"; - - /** - * Holds the real ip so we can overwrite it back - * - * @var string - */ - protected $realIp = null; - - protected $realPortQuery = null; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mod' => 'mod', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - ], - ]; - - public function beforeSend(Server $server) - { - // Loop over the packets and update them - foreach ($this->packets as $packetType => $packet) { - // Fill out the packet with the server info - $this->packets[$packetType] = sprintf($packet, $server->ip . ':' . $server->port_query); - } - - $this->realIp = $server->ip; - $this->realPortQuery = $server->port_query; - - // Override the existing settings - $server->ip = 'cdn.rage.mp'; - $server->port_query = 443; - } - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // No response, assume offline - if (empty($this->packets_response)) { - return [ - 'gq_address' => $this->realIp, - 'gq_port_query' => $this->realPortQuery, - ]; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Gtar protocol is invalid."); - } - - $address = $this->realIp.':'.$this->realPortQuery; - $server = $json->$address; - - if (empty($server)) { - return [ - 'gq_address' => $this->realIp, - 'gq_port_query' => $this->realPortQuery, - ]; - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - $result->add('gq_address', $this->realIp); - $result->add('gq_port_query', $this->realPortQuery); - - // Add server items - $result->add('hostname', $server->name); - $result->add('mod', $server->gamemode); - $result->add('numplayers', $server->players); - $result->add('maxplayers', $server->maxplayers); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Hl2dm.php b/GameQ/Protocols/Hl2dm.php deleted file mode 100644 index 15f881a..0000000 --- a/GameQ/Protocols/Hl2dm.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Hl2dm - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Hl2dm extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'hl2dm'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Half Life 2: Deathmatch"; -} diff --git a/GameQ/Protocols/Http.php b/GameQ/Protocols/Http.php deleted file mode 100644 index 2a86d8d..0000000 --- a/GameQ/Protocols/Http.php +++ /dev/null @@ -1,67 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; - -/** - * Class Http - * - * Generic HTTP protocol class. Useful for making http based requests - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -abstract class Http extends Protocol -{ - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'http'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'http'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Generic HTTP protocol"; - - /** - * Http protocol is TCP - * - * @var string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; -} diff --git a/GameQ/Protocols/Hurtworld.php b/GameQ/Protocols/Hurtworld.php deleted file mode 100644 index fa54654..0000000 --- a/GameQ/Protocols/Hurtworld.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Hurtworld - * - * @package GameQ\Protocols - * @author Nikolay Ipanyuk - * @author Austin Bischoff - */ -class Hurtworld extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'hurtworld'; - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Hurtworld"; -} diff --git a/GameQ/Protocols/Insurgency.php b/GameQ/Protocols/Insurgency.php deleted file mode 100644 index 77b8329..0000000 --- a/GameQ/Protocols/Insurgency.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Insurgency - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Insurgency extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'insurgency'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Insurgency"; -} diff --git a/GameQ/Protocols/Insurgencysand.php b/GameQ/Protocols/Insurgencysand.php deleted file mode 100644 index 407d6e2..0000000 --- a/GameQ/Protocols/Insurgencysand.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Insurgency Sandstorm Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Insurgencysand extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'insurgencysand'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Insurgency: Sandstorm"; - - /** - * query_port = client_port + 29 - * - * @type int - */ - protected $port_diff = 29; -} diff --git a/GameQ/Protocols/Jediacademy.php b/GameQ/Protocols/Jediacademy.php deleted file mode 100644 index a051a3a..0000000 --- a/GameQ/Protocols/Jediacademy.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Jedi Academy Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Jediacademy extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'jediacademy'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Star Wars Jedi Knight: Jedi Academy"; -} diff --git a/GameQ/Protocols/Jedioutcast.php b/GameQ/Protocols/Jedioutcast.php deleted file mode 100644 index 1afd9af..0000000 --- a/GameQ/Protocols/Jedioutcast.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Jedi Outcast Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Jedioutcast extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'jedioutcast'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Star Wars Jedi Knight II: Jedi Outcast"; -} diff --git a/GameQ/Protocols/Justcause2.php b/GameQ/Protocols/Justcause2.php deleted file mode 100644 index 648cb6d..0000000 --- a/GameQ/Protocols/Justcause2.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Just Cause 2 Multiplayer Protocol Class - * - * Special thanks to Woet for some insight on packing - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Justcause2 extends Gamespy4 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'justcause2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Just Cause 2 Multiplayer"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Change the packets used - * - * @var array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x02", - ]; - - /** - * Override the packet split - * - * @var string - */ - protected $packetSplit = "/\\x00\\x00\\x00/m"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - ], - ]; - - /** - * Overload so we can add in some static data points - * - * @param Buffer $buffer - * @param Result $result - */ - protected function processDetails(Buffer &$buffer, Result &$result) - { - parent::processDetails($buffer, $result); - - // Add in map - $result->add('mapname', 'Panau'); - $result->add('dedicated', 'true'); - } - - /** - * Override the parent, this protocol is returned differently - * - * @param Buffer $buffer - * @param Result $result - * - * @see Gamespy3::processPlayersAndTeams() - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - // Loop until we run out of data - while ($buffer->getLength()) { - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('steamid', $buffer->readString()); - $result->addPlayer('ping', $buffer->readInt16()); - } - } -} diff --git a/GameQ/Protocols/Justcause3.php b/GameQ/Protocols/Justcause3.php deleted file mode 100644 index c4e901d..0000000 --- a/GameQ/Protocols/Justcause3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Just Cause 3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Justcause3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'justcause3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Just Cause 3"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Killingfloor.php b/GameQ/Protocols/Killingfloor.php deleted file mode 100644 index 9cc1964..0000000 --- a/GameQ/Protocols/Killingfloor.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Killing floor - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Killingfloor extends Unreal2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'killing floor'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Killing Floor"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Overload the default detail process since this version is different - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('serverid', $buffer->readInt32()); // 0 - $result->add('serverip', $buffer->readPascalString(1)); // empty - $result->add('gameport', $buffer->readInt32()); - $result->add('queryport', $buffer->readInt32()); // 0 - - // We burn the first char since it is not always correct with the hostname - $buffer->skip(1); - - // Read as a regular string since the length is incorrect (what we skipped earlier) - $result->add('servername', utf8_encode($buffer->readString())); - - // The rest is read as normal - $result->add('mapname', utf8_encode($buffer->readPascalString(1))); - $result->add('gametype', $buffer->readPascalString(1)); - $result->add('numplayers', $buffer->readInt32()); - $result->add('maxplayers', $buffer->readInt32()); - $result->add('currentwave', $buffer->readInt32()); - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Killingfloor2.php b/GameQ/Protocols/Killingfloor2.php deleted file mode 100644 index a134f25..0000000 --- a/GameQ/Protocols/Killingfloor2.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Killing floor - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Killingfloor2 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'killing floor 2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Killing Floor 2"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/GameQ/Protocols/L4d.php b/GameQ/Protocols/L4d.php deleted file mode 100644 index 596452a..0000000 --- a/GameQ/Protocols/L4d.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class L4d - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class L4d extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'l4d'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Left 4 Dead"; -} diff --git a/GameQ/Protocols/L4d2.php b/GameQ/Protocols/L4d2.php deleted file mode 100644 index 475514c..0000000 --- a/GameQ/Protocols/L4d2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class L4d2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class L4d2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'l4d2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Left 4 Dead 2"; -} diff --git a/GameQ/Protocols/Lhmp.php b/GameQ/Protocols/Lhmp.php deleted file mode 100644 index 3d5e81f..0000000 --- a/GameQ/Protocols/Lhmp.php +++ /dev/null @@ -1,214 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Lost Heaven Protocol class - * - * Reference: http://lh-mp.eu/wiki/index.php/Query_System - * - * @author Austin Bischoff - */ -class Lhmp extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "LHMPo", - self::PACKET_PLAYERS => "LHMPp", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "LHMPo" => "processDetails", - "LHMPp" => "processPlayers", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'lhmp'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'lhmp'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Lost Heaven"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamemode', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$header}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('protocol', $buffer->readString()); - $result->add('password', $buffer->readString()); - $result->add('numplayers', $buffer->readInt16()); - $result->add('maxplayers', $buffer->readInt16()); - $result->add('servername', utf8_encode($buffer->readPascalString())); - $result->add('gamemode', $buffer->readPascalString()); - $result->add('website', utf8_encode($buffer->readPascalString())); - $result->add('mapname', utf8_encode($buffer->readPascalString())); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Get the number of players - $result->add('numplayers', $buffer->readInt16()); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt16()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString())); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Minecraft.php b/GameQ/Protocols/Minecraft.php deleted file mode 100644 index a895cb8..0000000 --- a/GameQ/Protocols/Minecraft.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Minecraft Protocol Class - * - * Thanks to https://github.com/xPaw/PHP-Minecraft-Query for helping me realize this is - * Gamespy 3 Protocol. Make sure you enable the items below for it to work. - * - * Information from original author: - * Instructions - * - * Before using this class, you need to make sure that your server is running GS4 status listener. - * - * Look for those settings in server.properties: - * - * enable-query=true - * query.port=25565 - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Minecraft extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'minecraft'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Minecraft"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "minecraft://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_id', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - ], - ]; -} diff --git a/GameQ/Protocols/Minecraftpe.php b/GameQ/Protocols/Minecraftpe.php deleted file mode 100644 index 21d1186..0000000 --- a/GameQ/Protocols/Minecraftpe.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Minecraft PE (BE) Protocol Class - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Minecraftpe extends Minecraft -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'minecraftpe'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "MinecraftPE"; -} diff --git a/GameQ/Protocols/Mohaa.php b/GameQ/Protocols/Mohaa.php deleted file mode 100644 index 66ddd7e..0000000 --- a/GameQ/Protocols/Mohaa.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Medal of honor: Allied Assault Protocol Class - * - * @package GameQ\Protocols - * @author Bram - * @author Austin Bischoff - */ -class Mohaa extends Gamespy -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mohaa'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Medal of honor: Allied Assault"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'score' => 'frags', - 'ping' => 'ping', - ], - ]; - - /** - * Query port is always the client port + 97 in MOHAA - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - return $clientPort + 97; - } -} diff --git a/GameQ/Protocols/Mordhau.php b/GameQ/Protocols/Mordhau.php deleted file mode 100644 index fa305ce..0000000 --- a/GameQ/Protocols/Mordhau.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class MORDHAU - * - * @package GameQ\Protocols - * @author Wilson Jesus <> - */ -class Mordhau extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mordhau'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "MORDHAU"; - - #protected $port = 7777; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - #protected $port_diff = 19238; -} diff --git a/GameQ/Protocols/Mta.php b/GameQ/Protocols/Mta.php deleted file mode 100644 index b95dc4c..0000000 --- a/GameQ/Protocols/Mta.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Multi Theft Auto - * - * @package GameQ\Protocols - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Mta extends Ase -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mta'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Multi Theft Auto"; - - /** - * query_port = client_port + 123 - * - * @type int - */ - protected $port_diff = 123; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "mtasa://%s:%d/"; -} diff --git a/GameQ/Protocols/Mumble.php b/GameQ/Protocols/Mumble.php deleted file mode 100644 index 299389c..0000000 --- a/GameQ/Protocols/Mumble.php +++ /dev/null @@ -1,194 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Mumble Protocol class - * - * References: - * https://github.com/edmundask/MurmurQuery - Thanks to skylord123 - * - * @author Austin Bischoff - */ -class Mumble extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "\x6A\x73\x6F\x6E", // JSON packet - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'mumble'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mumble'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Mumble Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "mumble://%s:%d/"; - - /** - * 27800 = 64738 - 36938 - * - * @type int - */ - protected $port_diff = -36938; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'name', - 'numplayers' => 'numplayers', - 'maxplayers' => 'x_gtmurmur_max_users', - ], - // Player - 'player' => [ - 'name' => 'name', - 'ping' => 'tcpPing', - 'team' => 'channel', - 'time' => 'onlinesecs', - ], - // Team - 'team' => [ - 'name' => 'name', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Try to json_decode, make it into an array - if (($data = json_decode(implode('', $this->packets_response), true)) === null) { - throw new Exception(__METHOD__ . " Unable to decode JSON data."); - } - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Let's iterate over the response items, there are a lot - foreach ($data as $key => $value) { - // Ignore root for now, that is where all of the channel/player info is housed - if (in_array($key, ['root'])) { - continue; - } - - // Add them as is - $result->add($key, $value); - } - - // Offload the channel and user parsing - $this->processChannelsAndUsers($data['root'], $result); - - unset($data); - - // Manually set the number of players - $result->add('numplayers', count($result->get('players'))); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles processing the the channels and user info - * - * @param array $data - * @param \GameQ\Result $result - */ - protected function processChannelsAndUsers(array $data, Result &$result) - { - - // Let's add all of the channel information - foreach ($data as $key => $value) { - // We will handle these later - if (in_array($key, ['channels', 'users'])) { - // skip - continue; - } - - // Add the channel property as a team - $result->addTeam($key, $value); - } - - // Itereate over the users in this channel - foreach ($data['users'] as $user) { - foreach ($user as $key => $value) { - $result->addPlayer($key, $value); - } - } - - // Offload more channels to parse - foreach ($data['channels'] as $channel) { - $this->processChannelsAndUsers($channel, $result); - } - } -} diff --git a/GameQ/Protocols/Ns2.php b/GameQ/Protocols/Ns2.php deleted file mode 100644 index 4c32392..0000000 --- a/GameQ/Protocols/Ns2.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Ns2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Ns2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ns2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Natural Selection 2"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Pixark.php b/GameQ/Protocols/Pixark.php deleted file mode 100644 index 2e67af0..0000000 --- a/GameQ/Protocols/Pixark.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class PixARK - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Pixark extends Arkse -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'pixark'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "PixARK"; -} diff --git a/GameQ/Protocols/Projectrealitybf2.php b/GameQ/Protocols/Projectrealitybf2.php deleted file mode 100644 index 6f4b5ce..0000000 --- a/GameQ/Protocols/Projectrealitybf2.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Projectrealitybf2 - * - * Based off of BF2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Projectrealitybf2 extends Bf2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'projectrealitybf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Project Reality: Battlefield 2"; -} diff --git a/GameQ/Protocols/Quake2.php b/GameQ/Protocols/Quake2.php deleted file mode 100644 index f0366c2..0000000 --- a/GameQ/Protocols/Quake2.php +++ /dev/null @@ -1,219 +0,0 @@ - "\xFF\xFF\xFF\xFFstatus\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFF\x70\x72\x69\x6e\x74" => 'processStatus', - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'quake2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quake2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake 2 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamename', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxclients', - 'mod' => 'g_gametype', - 'numplayers' => 'clients', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Make a buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Grab the header - $header = $buffer->readString("\x0A"); - - // Figure out which packet response this is - if (empty($header) || !array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - return call_user_func_array([$this, $this->responses[$header]], [$buffer]); - } - - /** - * Process the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // We need to split the data and offload - $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); - - $results = array_merge_recursive( - $results, - $this->processPlayers(new Buffer($buffer->getBuffer())) - ); - - unset($buffer); - - // Return results - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processServerInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn leading \ if one exists - $buffer->readString('\\'); - - // Key / value pairs - while ($buffer->getLength()) { - // Add result - $result->add( - trim($buffer->readString('\\')), - utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) - ); - } - - $result->add('password', 0); - $result->add('mod', 0); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - // Some games do not have a number of current players - $playerCount = 0; - - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Make a new buffer with this block - $playerInfo = new Buffer($buffer->readString("\x0A")); - - // Add player info - $result->addPlayer('frags', $playerInfo->readString("\x20")); - $result->addPlayer('ping', $playerInfo->readString("\x20")); - - // Skip first " - $playerInfo->skip(1); - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); - - // Skip first " - $playerInfo->skip(2); - - // Add address - $result->addPlayer('address', trim($playerInfo->readString('"'))); - - // Increment - $playerCount++; - - // Clear - unset($playerInfo); - } - - $result->add('clients', $playerCount); - - // Clear - unset($buffer, $playerCount); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Quake3.php b/GameQ/Protocols/Quake3.php deleted file mode 100644 index 6269b92..0000000 --- a/GameQ/Protocols/Quake3.php +++ /dev/null @@ -1,214 +0,0 @@ - "\xFF\xFF\xFF\xFF\x67\x65\x74\x73\x74\x61\x74\x75\x73\x0A", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFFstatusResponse" => 'processStatus', - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'quake3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quake3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake 3 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamename', - 'hostname' => 'sv_hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'sv_maxclients', - 'mod' => 'g_gametype', - 'numplayers' => 'clients', - 'password' => ['g_needpass', 'pswrd'], - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Make a buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Grab the header - $header = $buffer->readString("\x0A"); - - // Figure out which packet response this is - if (empty($header) || !array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - return call_user_func_array([$this, $this->responses[$header]], [$buffer]); - } - - protected function processStatus(Buffer $buffer) - { - // We need to split the data and offload - $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); - - $results = array_merge_recursive( - $results, - $this->processPlayers(new Buffer($buffer->getBuffer())) - ); - - unset($buffer); - - // Return results - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processServerInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn leading \ if one exists - $buffer->readString('\\'); - - // Key / value pairs - while ($buffer->getLength()) { - // Add result - $result->add( - trim($buffer->readString('\\')), - utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) - ); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processPlayers(Buffer $buffer) - { - // Some games do not have a number of current players - $playerCount = 0; - - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Add player info - $result->addPlayer('frags', $buffer->readString("\x20")); - $result->addPlayer('ping', $buffer->readString("\x20")); - - // Look ahead to see if we have a name or team - $checkTeam = $buffer->lookAhead(1); - - // We have team info - if ($checkTeam != '' and $checkTeam != '"') { - $result->addPlayer('team', $buffer->readString("\x20")); - } - - // Check to make sure we have player name - $checkPlayerName = $buffer->read(); - - // Bad response - if ($checkPlayerName !== '"') { - throw new Exception('Expected " but got ' . $checkPlayerName . ' for beginning of player name string!'); - } - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim($buffer->readString('"')))); - - // Burn ending delimiter - $buffer->read(); - - // Increment - $playerCount++; - } - - $result->add('clients', $playerCount); - - // Clear - unset($buffer, $playerCount); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Quakelive.php b/GameQ/Protocols/Quakelive.php deleted file mode 100644 index d5df350..0000000 --- a/GameQ/Protocols/Quakelive.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Quake Live - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Quakelive extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quakelive'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake Live"; -} diff --git a/GameQ/Protocols/Redorchestra2.php b/GameQ/Protocols/Redorchestra2.php deleted file mode 100644 index 6733016..0000000 --- a/GameQ/Protocols/Redorchestra2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Redorchestra2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Redorchestra2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'redorchestra2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Red Orchestra 2"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/GameQ/Protocols/Redorchestraostfront.php b/GameQ/Protocols/Redorchestraostfront.php deleted file mode 100644 index 4c83b7e..0000000 --- a/GameQ/Protocols/Redorchestraostfront.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Red Orchestra: Ostfront 41-45 Class - * - * @package GameQ\Protocols - * @author naXe - * @author Austin Bischoff - */ -class Redorchestraostfront extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'redorchestraostfront'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Red Orchestra: Ostfront 41-45"; -} diff --git a/GameQ/Protocols/Risingstorm2.php b/GameQ/Protocols/Risingstorm2.php deleted file mode 100644 index ddb82a5..0000000 --- a/GameQ/Protocols/Risingstorm2.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Rising Storm 2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Risingstorm2 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'rising storm 2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Rising Storm 2"; - - /** - * Query port is always 27015 - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - return 27015; - } -} diff --git a/GameQ/Protocols/Rust.php b/GameQ/Protocols/Rust.php deleted file mode 100644 index 81b0cce..0000000 --- a/GameQ/Protocols/Rust.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Rust - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Rust extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'rust'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Rust"; -} diff --git a/GameQ/Protocols/Samp.php b/GameQ/Protocols/Samp.php deleted file mode 100644 index cf01f83..0000000 --- a/GameQ/Protocols/Samp.php +++ /dev/null @@ -1,279 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * San Andreas Multiplayer Protocol Class (samp) - * - * Note: - * Player information will not be returned if player count is over 256 - * - * @author Austin Bischoff - */ -class Samp extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "SAMP%si", - self::PACKET_PLAYERS => "SAMP%sd", - self::PACKET_RULES => "SAMP%sr", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x69" => "processStatus", // i - "\x64" => "processPlayers", // d - "\x72" => "processRules", // r - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'samp'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'samp'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "San Andreas Multiplayer"; - - /** - * Holds the calculated server code that is passed when querying for information - * - * @type string - */ - protected $server_code = null; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "samp://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => ['hostname', 'servername'], - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - ]; - - /** - * Handle some work before sending the packets out to the server - * - * @param \GameQ\Server $server - */ - public function beforeSend(Server $server) - { - - // Build the server code - $this->server_code = implode('', array_map('chr', explode('.', $server->ip()))) . - pack("S", $server->portClient()); - - // Loop over the packets and update them - foreach ($this->packets as $packetType => $packet) { - // Fill out the packet with the server info - $this->packets[$packetType] = sprintf($packet, $this->server_code); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Results that will be returned - $results = []; - - // Get the length of the server code so we can figure out how much to read later - $serverCodeLength = strlen($this->server_code); - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - // Make new buffer - $buffer = new Buffer($response); - - // Check the header, should be SAMP - if (($header = $buffer->read(4)) !== 'SAMP') { - throw new Exception(__METHOD__ . " header response '{$header}' is not valid"); - } - - // Check to make sure the server response code matches what we sent - if ($buffer->read($serverCodeLength) !== $this->server_code) { - throw new Exception(__METHOD__ . " code check failed."); - } - - // Figure out what packet response this is for - $response_type = $buffer->read(1); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the server status data - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processStatus(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Pull out the server information - $result->add('password', $buffer->readInt8()); - $result->add('num_players', $buffer->readInt16()); - $result->add('max_players', $buffer->readInt16()); - - // These are read differently for these last 3 - $result->add('servername', utf8_encode($buffer->read($buffer->readInt32()))); - $result->add('gametype', $buffer->read($buffer->readInt32())); - $result->add('language', $buffer->read($buffer->readInt32())); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Number of players - $result->add('num_players', $buffer->readInt16()); - - // Run until we run out of buffer - while ($buffer->getLength()) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', utf8_encode($buffer->readPascalString())); - $result->addPlayer('score', $buffer->readInt32()); - $result->addPlayer('ping', $buffer->readInt32()); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Number of rules - $result->add('num_rules', $buffer->readInt16()); - - // Run until we run out of buffer - while ($buffer->getLength()) { - $result->add($buffer->readPascalString(), $buffer->readPascalString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Serioussam.php b/GameQ/Protocols/Serioussam.php deleted file mode 100644 index 32e0a10..0000000 --- a/GameQ/Protocols/Serioussam.php +++ /dev/null @@ -1,75 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Serious Sam Protocol Class - * - * @author ZCaliptium - */ -class SeriousSam extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'serioussam'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Serious Sam"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'mod' => 'activemod', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; -} diff --git a/GameQ/Protocols/Sevendaystodie.php b/GameQ/Protocols/Sevendaystodie.php deleted file mode 100644 index a5ddbf2..0000000 --- a/GameQ/Protocols/Sevendaystodie.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class 7 Days to Die - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Sevendaystodie extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'sevendaystodie'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "7 Days to Die"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Ship.php b/GameQ/Protocols/Ship.php deleted file mode 100644 index 9c3bee9..0000000 --- a/GameQ/Protocols/Ship.php +++ /dev/null @@ -1,95 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Ship - * - * @package GameQ\Protocols - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - */ -class Ship extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ship'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "The Ship"; - - /** - * Specific player parse for The Ship - * - * Player response has unknown data after the last real player - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // We need to read the number of players because this response has other data at the end usually - $num_players = $buffer->readInt8(); - - // Player count - $result->add('num_players', $num_players); - - // No players, no work - if ($num_players == 0) { - return $result->fetch(); - } - - // Players list - for ($player = 0; $player < $num_players; $player++) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('score', $buffer->readInt32Signed()); - $result->addPlayer('time', $buffer->readFloat32()); - } - - // Extra data - if ($buffer->getLength() > 0) { - for ($player = 0; $player < $num_players; $player++) { - $result->addPlayer('deaths', $buffer->readInt32Signed()); - $result->addPlayer('money', $buffer->readInt32Signed()); - } - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Sof2.php b/GameQ/Protocols/Sof2.php deleted file mode 100644 index 96a4db2..0000000 --- a/GameQ/Protocols/Sof2.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Soldier of Fortune 2 Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Sof2 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'sof2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Solder of Fortune II"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "sof2mp://%s:%d/"; -} diff --git a/GameQ/Protocols/Soldat.php b/GameQ/Protocols/Soldat.php deleted file mode 100644 index a9dbbc4..0000000 --- a/GameQ/Protocols/Soldat.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Soldat - * - * @package GameQ\Protocols - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Soldat extends Ase -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'soldat'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Soldat"; - - /** - * query_port = client_port + 123 - * - * @type int - */ - protected $port_diff = 123; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "soldat://%s:%d/"; -} diff --git a/GameQ/Protocols/Source.php b/GameQ/Protocols/Source.php deleted file mode 100644 index 9e4cb5d..0000000 --- a/GameQ/Protocols/Source.php +++ /dev/null @@ -1,522 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * Valve Source Engine Protocol Class (A2S) - * - * This class is used as the basis for all other source based servers - * that rely on the source protocol for game querying. - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - * - * @author Austin Bischoff - */ -class Source extends Protocol -{ - - /* - * Source engine type constants - */ - const SOURCE_ENGINE = 0, - GOLDSOURCE_ENGINE = 1; - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x56\x00\x00\x00\x00", - self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFTSource Engine Query\x00", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x49" => "processDetails", // I - "\x6d" => "processDetailsGoldSource", // m, goldsource - "\x44" => "processPlayers", // D - "\x45" => "processRules", // E - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'source'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'source'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Source Server"; - - /** - * Define the Source engine type. By default it is assumed to be Source - * - * @type int - */ - protected $source_engine = self::SOURCE_ENGINE; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_descr', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - - // Skip the header - $challenge_buffer->skip(5); - - // Apply the challenge and return - return $this->challengeApply($challenge_buffer->read(4)); - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Will hold the results when complete - $results = []; - - // Holds sorted response packets - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Get the header of packet (long) - $header = $buffer->readInt32Signed(); - - // Single packet - if ($header == -1) { - // We need to peek and see what kind of engine this is for later processing - if ($buffer->lookAhead(1) == "\x6d") { - $this->source_engine = self::GOLDSOURCE_ENGINE; - } - - $packets[] = $buffer->getBuffer(); - continue; - } else { - // Split packet - - // Packet Id (long) - $packet_id = $buffer->readInt32Signed() + 10; - - // Add the buffer to the packet as another array - $packets[$packet_id][] = $buffer->getBuffer(); - } - } - - // Free up memory - unset($response, $packet_id, $buffer, $header); - - // Now that we have the packets sorted we need to iterate and process them - foreach ($packets as $packet_id => $packet) { - // We first need to off load split packets to combine them - if (is_array($packet)) { - $buffer = new Buffer($this->processPackets($packet_id, $packet)); - } else { - $buffer = new Buffer($packet); - } - - // Figure out what packet response this is for - $response_type = $buffer->read(1); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - // Free up memory - unset($packets, $packet, $packet_id, $response_type); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Process the split packets and decompress if necessary - * - * @SuppressWarnings(PHPMD.UnusedLocalVariable) - * - * @param $packet_id - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function processPackets($packet_id, array $packets = []) - { - - // Init array so we can order - $packs = []; - - // We have multiple packets so we need to get them and order them - foreach ($packets as $i => $packet) { - // Make a buffer so we can read this info - $buffer = new Buffer($packet); - - // Gold source - if ($this->source_engine == self::GOLDSOURCE_ENGINE) { - // Grab the packet number (byte) - $packet_number = $buffer->readInt8(); - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $buffer->read(4); - } - - // Now add the rest of the packet to the new array with the packet_number as the id so we can order it - $packs[$packet_number] = $buffer->getBuffer(); - } else { - // Number of packets in this set (byte) - $buffer->readInt8(); - - // The current packet number (byte) - $packet_number = $buffer->readInt8(); - - // Check to see if this is compressed - // @todo: Check to make sure these decompress correctly, new changes may affect this loop. - if ($packet_id & 0x80000000) { - // Check to see if we have Bzip2 installed - if (!function_exists('bzdecompress')) { - // @codeCoverageIgnoreStart - throw new Exception( - 'Bzip2 is not installed. See http://www.php.net/manual/en/book.bzip2.php for more info.', - 0 - ); - // @codeCoverageIgnoreEnd - } - - // Get the length of the packet (long) - $packet_length = $buffer->readInt32Signed(); - - // Checksum for the decompressed packet (long), burn it - doesnt work in split responses - $buffer->readInt32Signed(); - - // Try to decompress - $result = bzdecompress($buffer->getBuffer()); - - // Now verify the length - if (strlen($result) != $packet_length) { - // @codeCoverageIgnoreStart - throw new Exception( - "Checksum for compressed packet failed! Length expected: {$packet_length}, length - returned: " . strlen($result) - ); - // @codeCoverageIgnoreEnd - } - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $result = substr($result, 4); - } - } else { - // Get the packet length (short), burn it - $buffer->readInt16Signed(); - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $buffer->read(4); - } - - // Grab the rest of the buffer as a result - $result = $buffer->getBuffer(); - } - - // Add this packet to the list - $packs[$packet_number] = $result; - } - - unset($buffer); - } - - // Free some memory - unset($packets, $packet); - - // Sort the packets by packet number - ksort($packs); - - // Now combine the packs into one and return - return implode("", $packs); - } - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - * @throws \GameQ\Exception\Protocol - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('protocol', $buffer->readInt8()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_dir', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('steamappid', $buffer->readInt16()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('num_bots', $buffer->readInt8()); - $result->add('dedicated', $buffer->read()); - $result->add('os', $buffer->read()); - $result->add('password', $buffer->readInt8()); - $result->add('secure', $buffer->readInt8()); - - // Special result for The Ship only (appid=2400) - if ($result->get('steamappid') == 2400) { - $result->add('game_mode', $buffer->readInt8()); - $result->add('witness_count', $buffer->readInt8()); - $result->add('witness_time', $buffer->readInt8()); - } - - $result->add('version', $buffer->readString()); - - // Because of php 5.4... - $edfCheck = $buffer->lookAhead(1); - - // Extra data flag - if (!empty($edfCheck)) { - $edf = $buffer->readInt8(); - - if ($edf & 0x80) { - $result->add('port', $buffer->readInt16Signed()); - } - - if ($edf & 0x10) { - $result->add('steam_id', $buffer->readInt64()); - } - - if ($edf & 0x40) { - $result->add('sourcetv_port', $buffer->readInt16Signed()); - $result->add('sourcetv_name', $buffer->readString()); - } - - if ($edf & 0x20) { - $result->add('keywords', $buffer->readString()); - } - - if ($edf & 0x01) { - $result->add('game_id', $buffer->readInt64()); - } - - unset($edf); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the server details from goldsource response - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processDetailsGoldSource(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('address', $buffer->readString()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_dir', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('version', $buffer->readInt8()); - $result->add('dedicated', $buffer->read()); - $result->add('os', $buffer->read()); - $result->add('password', $buffer->readInt8()); - - // Mod section - $result->add('ismod', $buffer->readInt8()); - - // We only run these if ismod is 1 (true) - if ($result->get('ismod') == 1) { - $result->add('mod_urlinfo', $buffer->readString()); - $result->add('mod_urldl', $buffer->readString()); - $buffer->skip(); - $result->add('mod_version', $buffer->readInt32Signed()); - $result->add('mod_size', $buffer->readInt32Signed()); - $result->add('mod_type', $buffer->readInt8()); - $result->add('mod_cldll', $buffer->readInt8()); - } - - $result->add('secure', $buffer->readInt8()); - $result->add('num_bots', $buffer->readInt8()); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Pull out the number of players - $num_players = $buffer->readInt8(); - - // Player count - $result->add('num_players', $num_players); - - // No players so no need to look any further - if ($num_players == 0) { - return $result->fetch(); - } - - // Players list - while ($buffer->getLength()) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('score', $buffer->readInt32Signed()); - $result->addPlayer('time', $buffer->readFloat32()); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Count the number of rules - $num_rules = $buffer->readInt16Signed(); - - // Add the count of the number of rules this server has - $result->add('num_rules', $num_rules); - - // Rules - while ($buffer->getLength()) { - $result->add($buffer->readString(), $buffer->readString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Spaceengineers.php b/GameQ/Protocols/Spaceengineers.php deleted file mode 100644 index ddf8567..0000000 --- a/GameQ/Protocols/Spaceengineers.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Space Engineers Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Spaceengineers extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'spaceengineers'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Space Engineers"; -} diff --git a/GameQ/Protocols/Squad.php b/GameQ/Protocols/Squad.php deleted file mode 100644 index 3c02188..0000000 --- a/GameQ/Protocols/Squad.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Squad - * - * Port reference: http://forums.joinsquad.com/topic/9559-query-ports/ - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Squad extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'squad'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Squad"; - - /** - * query_port = client_port + 19378 - * 27165 = 7787 + 19378 - * - * @type int - */ - protected $port_diff = 19378; -} diff --git a/GameQ/Protocols/Starmade.php b/GameQ/Protocols/Starmade.php deleted file mode 100644 index 09a033f..0000000 --- a/GameQ/Protocols/Starmade.php +++ /dev/null @@ -1,226 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * StarMade Protocol Class - * - * StarMade server query protocol class - * - * Credit to Robin Promesberger for providing Java based querying as a roadmap - * - * @author Austin Bischoff - */ -class Starmade extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x00\x00\x00\x09\x2a\xff\xff\x01\x6f\x00\x00\x00\x00", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'starmade'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'starmade'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "StarMade"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Implode the packets, not sure if there is any split logic for multiple packets - $buffer = new Buffer(implode('', $this->packets_response), Buffer::NUMBER_TYPE_BIGENDIAN); - - // Get the passed length in the data side of the packet - $buffer->readInt32Signed(); - - // Read off the timestamp (in milliseconds) - $buffer->readInt64(); - - // Burn the check id == 42 - $buffer->readInt8(); - - // Read packetId, unused - $buffer->readInt16Signed(); - - // Read commandId, unused - $buffer->readInt8Signed(); - - // Read type, unused - $buffer->readInt8Signed(); - - $parsed = $this->parseServerParameters($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Best guess info version is the type of response to expect. As of this commit the version is "2". - $result->add('info_version', $parsed[0]); - $result->add('version', $parsed[1]); - $result->add('hostname', $parsed[2]); - $result->add('game_descr', $parsed[3]); - $result->add('start_time', $parsed[4]); - $result->add('num_players', $parsed[5]); - $result->add('max_players', $parsed[6]); - $result->add('dedicated', 1); // All servers are dedicated as far as I can tell - $result->add('password', 0); // Unsure if you can password servers, cant read that value - //$result->add('map', 'Unknown'); - - unset($parsed); - - return $result->fetch(); - } - - /** - * Parse the server response parameters - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function parseServerParameters(Buffer &$buffer) - { - - // Init the parsed data array - $parsed = []; - - // Read the number of parameters to parse - $parameterSize = $buffer->readInt32Signed(); - - // Iterate over the parameter size - for ($i = 0; $i < $parameterSize; $i++) { - // Read the type of return this is - $dataType = $buffer->readInt8Signed(); - - switch ($dataType) { - // 32-bit int - case 1: - $parsed[$i] = $buffer->readInt32Signed(); - break; - - // 64-bit int - case 2: - $parsed[$i] = $buffer->readInt64(); - break; - - // Float - case 3: - $parsed[$i] = $buffer->readFloat32(); - break; - - // String - case 4: - // The first 2 bytes are the string length - $strLength = $buffer->readInt16Signed(); - - // Read the above length from the buffer - $parsed[$i] = $buffer->read($strLength); - - unset($strLength); - break; - - // Boolean - case 5: - $parsed[$i] = (bool)$buffer->readInt8Signed(); - break; - - // 8-bit int - case 6: - $parsed[$i] = $buffer->readInt8Signed(); - break; - - // 16-bit int - case 7: - $parsed[$i] = $buffer->readInt16Signed(); - break; - - // Array - case 8: - // Not implemented - throw new Exception("StarMade array parsing is not implemented!"); - } - } - - return $parsed; - } -} diff --git a/GameQ/Protocols/Swat4.php b/GameQ/Protocols/Swat4.php deleted file mode 100644 index 7b8e120..0000000 --- a/GameQ/Protocols/Swat4.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Swat4 - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Swat4 extends Gamespy2 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'swat4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "SWAT 4"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Teamspeak2.php b/GameQ/Protocols/Teamspeak2.php deleted file mode 100644 index df0d59a..0000000 --- a/GameQ/Protocols/Teamspeak2.php +++ /dev/null @@ -1,290 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * Teamspeak 2 Protocol Class - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Teamspeak2 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "sel %d\x0asi\x0a", - self::PACKET_CHANNELS => "sel %d\x0acl\x0a", - self::PACKET_PLAYERS => "sel %d\x0apl\x0a", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teamspeak2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teamspeak2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teamspeak 2"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "teamspeak://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'hostname' => 'server_name', - 'password' => 'server_password', - 'numplayers' => 'server_currentusers', - 'maxplayers' => 'server_maxusers', - ], - // Player - 'player' => [ - 'id' => 'p_id', - 'team' => 'c_id', - 'name' => 'nick', - ], - // Team - 'team' => [ - 'id' => 'id', - 'name' => 'name', - ], - ]; - - /** - * Before we send off the queries we need to update the packets - * - * @param \GameQ\Server $server - * - * @throws \GameQ\Exception\Protocol - */ - public function beforeSend(Server $server) - { - - // Check to make sure we have a query_port because it is required - if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - ) { - throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); - } - - // Let's loop the packets and set the proper pieces - foreach ($this->packets as $packet_type => $packet) { - // Update with the client port for the server - $this->packets[$packet_type] = sprintf($packet, $server->portClient()); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Make a new buffer out of all of the packets - $buffer = new Buffer(implode('', $this->packets_response)); - - // Check the header [TS] - if (($header = trim($buffer->readString("\n"))) !== '[TS]') { - throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected '[TS]'."); - } - - // Split this buffer as the data blocks are bound by "OK" and drop any empty values - $sections = array_filter(explode("OK", $buffer->getBuffer()), function ($value) { - - $value = trim($value); - - return !empty($value); - }); - - // Trim up the values to remove extra whitespace - $sections = array_map('trim', $sections); - - // Set the result to a new result instance - $result = new Result(); - - // Now we need to iterate over the sections and off load the processing - foreach ($sections as $section) { - // Grab a snip of the data so we can figure out what it is - $check = substr($section, 0, 7); - - // Offload to the proper method - if ($check == 'server_') { - // Server settings and info - $this->processDetails($section, $result); - } elseif ($check == "id\tcode") { - // Channel info - $this->processChannels($section, $result); - } elseif ($check == "p_id\tc_") { - // Player info - $this->processPlayers($section, $result); - } - } - - unset($buffer, $sections, $section, $check); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - - /** - * Handles processing the details data into a usable format - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processDetails($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // Always dedicated - $result->add('dedicated', 1); - - // Let's loop until we run out of data - while ($buffer->getLength()) { - // Grab the row, which is an item - $row = trim($buffer->readString("\n")); - - // Split out the information - list($key, $value) = explode('=', $row, 2); - - // Add this to the result - $result->add($key, utf8_encode($value)); - } - - unset($data, $buffer, $row, $key, $value); - } - - /** - * Process the channel listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processChannels($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // The first line holds the column names, data returned is in column/row format - $columns = explode("\t", trim($buffer->readString("\n")), 9); - - // Loop through the rows until we run out of information - while ($buffer->getLength()) { - // Grab the row, which is a tabbed list of items - $row = trim($buffer->readString("\n")); - - // Explode and merge the data with the columns, then parse - $data = array_combine($columns, explode("\t", $row, 9)); - - foreach ($data as $key => $value) { - // Now add the data to the result - $result->addTeam($key, utf8_encode($value)); - } - } - - unset($data, $buffer, $row, $columns, $key, $value); - } - - /** - * Process the user listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processPlayers($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // The first line holds the column names, data returned is in column/row format - $columns = explode("\t", trim($buffer->readString("\n")), 16); - - // Loop through the rows until we run out of information - while ($buffer->getLength()) { - // Grab the row, which is a tabbed list of items - $row = trim($buffer->readString("\n")); - - // Explode and merge the data with the columns, then parse - $data = array_combine($columns, explode("\t", $row, 16)); - - foreach ($data as $key => $value) { - // Now add the data to the result - $result->addPlayer($key, utf8_encode($value)); - } - } - - unset($data, $buffer, $row, $columns, $key, $value); - } -} diff --git a/GameQ/Protocols/Teamspeak3.php b/GameQ/Protocols/Teamspeak3.php deleted file mode 100644 index c66f6a4..0000000 --- a/GameQ/Protocols/Teamspeak3.php +++ /dev/null @@ -1,328 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * Teamspeak 3 Protocol Class - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Teamspeak3 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "use port=%d\x0Aserverinfo\x0A", - self::PACKET_PLAYERS => "use port=%d\x0Aclientlist\x0A", - self::PACKET_CHANNELS => "use port=%d\x0Achannellist -topic\x0A", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teamspeak3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teamspeak3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teamspeak 3"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "ts3server://%s?port=%d"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'hostname' => 'virtualserver_name', - 'password' => 'virtualserver_flag_password', - 'numplayers' => 'numplayers', - 'maxplayers' => 'virtualserver_maxclients', - ], - // Player - 'player' => [ - 'id' => 'clid', - 'team' => 'cid', - 'name' => 'client_nickname', - ], - // Team - 'team' => [ - 'id' => 'cid', - 'name' => 'channel_name', - ], - ]; - - /** - * Before we send off the queries we need to update the packets - * - * @param \GameQ\Server $server - * - * @throws \GameQ\Exception\Protocol - */ - public function beforeSend(Server $server) - { - - // Check to make sure we have a query_port because it is required - if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - ) { - throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); - } - - // Let's loop the packets and set the proper pieces - foreach ($this->packets as $packet_type => $packet) { - // Update with the client port for the server - $this->packets[$packet_type] = sprintf($packet, $server->portClient()); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Make a new buffer out of all of the packets - $buffer = new Buffer(implode('', $this->packets_response)); - - // Check the header TS3 - if (($header = trim($buffer->readString("\n"))) !== 'TS3') { - throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected 'TS3'."); - } - - // Convert all the escaped characters - $raw = str_replace( - [ - '\\\\', // Translate escaped \ - '\\/', // Translate escaped / - ], - [ - '\\', - '/', - ], - $buffer->getBuffer() - ); - - // Explode the sections and filter to remove empty, junk ones - $sections = array_filter(explode("\n", $raw), function ($value) { - - $value = trim($value); - - // Not empty string or a message response for "error id=\d" - return !empty($value) && substr($value, 0, 5) !== 'error'; - }); - - // Trim up the values to remove extra whitespace - $sections = array_map('trim', $sections); - - // Set the result to a new result instance - $result = new Result(); - - // Iterate over the sections and offload the parsing - foreach ($sections as $section) { - // Grab a snip of the data so we can figure out what it is - $check = substr(trim($section), 0, 4); - - // Use the first part of the response to figure out where we need to go - if ($check == 'virt') { - // Server info - $this->processDetails($section, $result); - } elseif ($check == 'cid=') { - // Channels - $this->processChannels($section, $result); - } elseif ($check == 'clid') { - // Clients (players) - $this->processPlayers($section, $result); - } - } - - unset($buffer, $sections, $section, $check); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Process the properties of the data. - * - * Takes data in "key1=value1 key2=value2 ..." and processes it into a usable format - * - * @param $data - * - * @return array - */ - protected function processProperties($data) - { - - // Will hold the properties we are sending back - $properties = []; - - // All of these are split on space - $items = explode(' ', $data); - - // Iterate over the items - foreach ($items as $item) { - // Explode and make sure we always have 2 items in the array - list($key, $value) = array_pad(explode('=', $item, 2), 2, ''); - - // Convert spaces and other character changes - $properties[$key] = utf8_encode(str_replace( - [ - '\\s', // Translate spaces - ], - [ - ' ', - ], - $value - )); - } - - return $properties; - } - - /** - * Handles processing the details data into a usable format - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processDetails($data, Result &$result) - { - - // Offload the parsing for these values - $properties = $this->processProperties($data); - - // Always dedicated - $result->add('dedicated', 1); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->add($key, $value); - } - - // We need to manually figure out the number of players - $result->add( - 'numplayers', - ($properties['virtualserver_clientsonline'] - $properties['virtualserver_queryclientsonline']) - ); - - unset($data, $properties, $key, $value); - } - - /** - * Process the channel listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processChannels($data, Result &$result) - { - - // We need to split the data at the pipe - $channels = explode('|', $data); - - // Iterate over the channels - foreach ($channels as $channel) { - // Offload the parsing for these values - $properties = $this->processProperties($channel); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->addTeam($key, $value); - } - } - - unset($data, $channel, $channels, $properties, $key, $value); - } - - /** - * Process the user listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processPlayers($data, Result &$result) - { - - // We need to split the data at the pipe - $players = explode('|', $data); - - // Iterate over the channels - foreach ($players as $player) { - // Offload the parsing for these values - $properties = $this->processProperties($player); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->addPlayer($key, $value); - } - } - - unset($data, $player, $players, $properties, $key, $value); - } -} diff --git a/GameQ/Protocols/Teeworlds.php b/GameQ/Protocols/Teeworlds.php deleted file mode 100644 index 1bdaa47..0000000 --- a/GameQ/Protocols/Teeworlds.php +++ /dev/null @@ -1,181 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Teeworlds Protocol class - * - * Only supports versions > 0.5 - * - * @author Austin Bischoff - * @author Marcel Bößendörfer - */ -class Teeworlds extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x69\x65\x33\x05", - // 0.5 Packet (not compatible, maybe some wants to implement "Teeworldsold") - //self::PACKET_STATUS => "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFgief", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35" => "processAll", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teeworlds'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teeworlds'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teeworlds Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'num_players_total', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // Holds the results - $results = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Make a buffer - $buffer = new Buffer($response); - - // Grab the header - $header = $buffer->readString(); - - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [$buffer]) - ); - } - - unset($buffer); - - return $results; - } - - /** - * Handle processing all of the data returned - * - * @param Buffer $buffer - * - * @return array - */ - protected function processAll(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - $result->add('version', $buffer->readString()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('flags', $buffer->readString()); // not sure about that - $result->add('num_players', $buffer->readString()); - $result->add('maxplayers', $buffer->readString()); - $result->add('num_players_total', $buffer->readString()); - $result->add('maxplayers_total', $buffer->readString()); - - // Players - while ($buffer->getLength()) { - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('clan', $buffer->readString()); - $result->addPlayer('flag', $buffer->readString()); - $result->addPlayer('score', $buffer->readString()); - $result->addPlayer('team', $buffer->readString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Terraria.php b/GameQ/Protocols/Terraria.php deleted file mode 100644 index d9455ef..0000000 --- a/GameQ/Protocols/Terraria.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Terraria - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Terraria extends Tshock -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'terraria'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Terraria"; - - /** - * query_port = client_port + 101 - * 7878 = 7777 + 101 - * - * @type int - */ - protected $port_diff = 101; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; -} diff --git a/GameQ/Protocols/Tf2.php b/GameQ/Protocols/Tf2.php deleted file mode 100644 index e08411b..0000000 --- a/GameQ/Protocols/Tf2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Tf2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Tf2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'tf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Team Fortress 2"; -} diff --git a/GameQ/Protocols/Theforrest.php b/GameQ/Protocols/Theforrest.php deleted file mode 100644 index 975c3f6..0000000 --- a/GameQ/Protocols/Theforrest.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Theforrest - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Theforrest extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'theforrest'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "The Forrest"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Tibia.php b/GameQ/Protocols/Tibia.php deleted file mode 100644 index 8702bfa..0000000 --- a/GameQ/Protocols/Tibia.php +++ /dev/null @@ -1,142 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Tibia Protocol Class - * - * Tibia server query protocol class - * - * Credit to Ahmad Fatoum for providing Perl based querying as a roadmap - * - * @author Yive - * @author Austin Bischoff - */ -class Tibia extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x06\x00\xFF\xFF\x69\x6E\x66\x6F", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'tibia'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'tibia'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Tibia"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "otserv://%s/%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'server', - 'hostname' => 'servername', - 'motd' => 'motd', - 'maxplayers' => 'players_max', - 'numplayers' => 'players_online', - 'map' => 'map_name', - ], - ]; - - /** - * Process the response for the Tibia server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Merge the response packets - $xmlString = implode('', $this->packets_response); - - // Check to make sure this is will decode into a valid XML Document - if (($xmlDoc = @simplexml_load_string($xmlString)) === false) { - throw new Exception(__METHOD__ . " Unable to load XML string."); - } - - // Set the result to a new result instance - $result = new Result(); - - // All servers are dedicated as far as I can tell - $result->add('dedicated', 1); - - // Iterate over the info - foreach (['serverinfo', 'owner', 'map', 'npcs', 'monsters', 'players'] as $property) { - foreach ($xmlDoc->{$property}->attributes() as $key => $value) { - if (!in_array($property, ['serverinfo'])) { - $key = $property . '_' . $key; - } - - // Add the result - $result->add($key, (string)$value); - } - } - - $result->add("motd", (string)$xmlDoc->motd); - - unset($xmlDoc, $xmlDoc); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Tshock.php b/GameQ/Protocols/Tshock.php deleted file mode 100644 index 551a09e..0000000 --- a/GameQ/Protocols/Tshock.php +++ /dev/null @@ -1,157 +0,0 @@ -. - */ -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; - -/** - * Tshock Protocol Class - * - * Result from this call should be a header + JSON response - * - * References: - * - https://tshock.atlassian.net/wiki/display/TSHOCKPLUGINS/REST+API+Endpoints#RESTAPIEndpoints-/status - * - http://tshock.co/xf/index.php?threads/rest-tshock-server-status-image.430/ - * - * Special thanks to intradox and Ruok2bu for game & protocol references - * - * @author Austin Bischoff - */ -class Tshock extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - self::PACKET_STATUS => "GET /v2/server/status?players=true&rules=true HTTP/1.0\r\nAccept: */*\r\n\r\n", - ]; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'tshock'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'tshock'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "Tshock"; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'world', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'nickname', - 'team' => 'team', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - if (empty($this->packets_response)) { - return []; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Tshock protocol is invalid."); - } - - // Check the status response - if ($json->status != 200) { - throw new Exception("JSON status from Tshock protocol response was '{$json->status}', expected '200'."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // Add server items - $result->add('hostname', $json->name); - $result->add('game_port', $json->port); - $result->add('serverversion', $json->serverversion); - $result->add('world', $json->world); - $result->add('uptime', $json->uptime); - $result->add('password', (int)$json->serverpassword); - $result->add('numplayers', $json->playercount); - $result->add('maxplayers', $json->maxplayers); - - // Parse players - foreach ($json->players as $player) { - $result->addPlayer('nickname', $player->nickname); - $result->addPlayer('username', $player->username); - $result->addPlayer('group', $player->group); - $result->addPlayer('active', (int)$player->active); - $result->addPlayer('state', $player->state); - $result->addPlayer('team', $player->team); - } - - // Make rules into simple array - $rules = []; - - // Parse rules - foreach ($json->rules as $rule => $value) { - // Add rule but convert boolean into int (0|1) - $rules[$rule] = (is_bool($value)) ? (int)$value : $value; - } - - // Add rules - $result->add('rules', $rules); - - unset($rules, $rule, $player, $value); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Unreal2.php b/GameQ/Protocols/Unreal2.php deleted file mode 100644 index 0ef0675..0000000 --- a/GameQ/Protocols/Unreal2.php +++ /dev/null @@ -1,246 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Unreal 2 Protocol class - * - * @author Austin Bischoff - */ -class Unreal2 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\x79\x00\x00\x00\x00", - self::PACKET_RULES => "\x79\x00\x00\x00\x01", - self::PACKET_PLAYERS => "\x79\x00\x00\x00\x02", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x80\x00\x00\x00\x00" => "processDetails", // 0 - "\x80\x00\x00\x00\x01" => "processRules", // 1 - "\x80\x00\x00\x00\x02" => "processPlayers", // 2 - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'unreal2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'unreal2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal 2"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'ServerMode', - 'gametype' => 'gametype', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - * @throws \GameQ\Exception\Protocol - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('serverid', $buffer->readInt32()); // 0 - $result->add('serverip', $buffer->readPascalString(1)); // empty - $result->add('gameport', $buffer->readInt32()); - $result->add('queryport', $buffer->readInt32()); // 0 - $result->add('servername', utf8_encode($buffer->readPascalString(1))); - $result->add('mapname', utf8_encode($buffer->readPascalString(1))); - $result->add('gametype', $buffer->readPascalString(1)); - $result->add('numplayers', $buffer->readInt32()); - $result->add('maxplayers', $buffer->readInt32()); - $result->add('ping', $buffer->readInt32()); // 0 - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt32()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString(1))); - $result->addPlayer('ping', $buffer->readInt32()); - $result->addPlayer('score', $buffer->readInt32()); - - // Skip the next 4, unsure what they are for - $buffer->skip(4); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Named values - $inc = -1; - while ($buffer->getLength()) { - // Grab the key - $key = $buffer->readPascalString(1); - - // Make sure mutators don't overwrite each other - if ($key === 'Mutator') { - $key .= ++$inc; - } - - $result->add(strtolower($key), utf8_encode($buffer->readPascalString(1))); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Unturned.php b/GameQ/Protocols/Unturned.php deleted file mode 100644 index 4829b37..0000000 --- a/GameQ/Protocols/Unturned.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unturned Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Unturned extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'unturned'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unturned"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/Protocols/Urbanterror.php b/GameQ/Protocols/Urbanterror.php deleted file mode 100644 index 682f91e..0000000 --- a/GameQ/Protocols/Urbanterror.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Urban Terror Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Urbanterror extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'urbanterror'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Urban Terror"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "urt://%s:%d/"; -} diff --git a/GameQ/Protocols/Ut.php b/GameQ/Protocols/Ut.php deleted file mode 100644 index 75722ce..0000000 --- a/GameQ/Protocols/Ut.php +++ /dev/null @@ -1,73 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament Protocol Class - * - * @author Austin Bischoff - */ -class Ut extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'frags', - ], - ]; -} diff --git a/GameQ/Protocols/Ut2004.php b/GameQ/Protocols/Ut2004.php deleted file mode 100644 index 953089f..0000000 --- a/GameQ/Protocols/Ut2004.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament 2004 Protocol Class - * - * @author Austin Bischoff - */ -class Ut2004 extends Unreal2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut2004'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament 2004"; -} diff --git a/GameQ/Protocols/Ut3.php b/GameQ/Protocols/Ut3.php deleted file mode 100644 index b55cc34..0000000 --- a/GameQ/Protocols/Ut3.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament 3 Protocol Class - * - * Note: The response from UT3 appears to not be consistent. Many times packets are incomplete or there are extra - * "echoes" in the responses. This may cause issues like odd characters showing up in the keys for the player and team - * array responses. Not sure much can be done about it. - * - * @author Austin Bischoff - */ -class Ut3 extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament 3"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'bIsDedicated', - 'hostname' => 'hostname', - 'numplayers' => 'numplayers', - ], - ]; - - /** - * Overload the response process so we can make some changes - * - * @return array - */ - public function processResponse() - { - - // Grab the result from the parent - /** @type array $result */ - $result = parent::processResponse(); - - // Move some stuff around - $this->renameResult($result, 'OwningPlayerName', 'hostname'); - $this->renameResult($result, 'p1073741825', 'mapname'); - $this->renameResult($result, 'p1073741826', 'gametype'); - $this->renameResult($result, 'p1073741827', 'servername'); - $this->renameResult($result, 'p1073741828', 'custom_mutators'); - $this->renameResult($result, 'gamemode', 'open'); - $this->renameResult($result, 's32779', 'gamemode'); - $this->renameResult($result, 's0', 'bot_skill'); - $this->renameResult($result, 's6', 'pure_server'); - $this->renameResult($result, 's7', 'password'); - $this->renameResult($result, 's8', 'vs_bots'); - $this->renameResult($result, 's10', 'force_respawn'); - $this->renameResult($result, 'p268435704', 'frag_limit'); - $this->renameResult($result, 'p268435705', 'time_limit'); - $this->renameResult($result, 'p268435703', 'numbots'); - $this->renameResult($result, 'p268435717', 'stock_mutators'); - - // Put custom mutators into an array - if (isset($result['custom_mutators'])) { - $result['custom_mutators'] = explode("\x1c", $result['custom_mutators']); - } - - // Delete some unknown stuff - $this->deleteResult($result, ['s1', 's9', 's11', 's12', 's13', 's14']); - - // Return the result - return $result; - } - - /** - * Dirty hack to rename result entries into something more useful - * - * @param array $result - * @param string $old - * @param string $new - */ - protected function renameResult(array &$result, $old, $new) - { - - // Check to see if the old item is there - if (isset($result[$old])) { - $result[$new] = $result[$old]; - unset($result[$old]); - } - } - - /** - * Dirty hack to delete result items - * - * @param array $result - * @param array $array - */ - protected function deleteResult(array &$result, array $array) - { - - foreach ($array as $key) { - unset($result[$key]); - } - } -} diff --git a/GameQ/Protocols/Ventrilo.php b/GameQ/Protocols/Ventrilo.php deleted file mode 100644 index 8a1e0e8..0000000 --- a/GameQ/Protocols/Ventrilo.php +++ /dev/null @@ -1,877 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Ventrilo Protocol Class - * - * Note that a password is not required for versions >= 3.0.3 - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Ventrilo extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => - "V\xc8\xf4\xf9`\xa2\x1e\xa5M\xfb\x03\xccQN\xa1\x10\x95\xaf\xb2g\x17g\x812\xfbW\xfd\x8e\xd2\x22r\x034z\xbb\x98", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ventrilo'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ventrilo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Ventrilo"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "ventrilo://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'password' => 'auth', - 'hostname' => 'name', - 'numplayers' => 'clientcount', - 'maxplayers' => 'maxclients', - ], - // Player - 'player' => [ - 'team' => 'cid', - 'name' => 'name', - ], - // Team - 'team' => [ - 'id' => 'cid', - 'name' => 'name', - ], - ]; - - /** - * Encryption table for the header - * - * @type array - */ - private $head_encrypt_table = [ - 0x80, - 0xe5, - 0x0e, - 0x38, - 0xba, - 0x63, - 0x4c, - 0x99, - 0x88, - 0x63, - 0x4c, - 0xd6, - 0x54, - 0xb8, - 0x65, - 0x7e, - 0xbf, - 0x8a, - 0xf0, - 0x17, - 0x8a, - 0xaa, - 0x4d, - 0x0f, - 0xb7, - 0x23, - 0x27, - 0xf6, - 0xeb, - 0x12, - 0xf8, - 0xea, - 0x17, - 0xb7, - 0xcf, - 0x52, - 0x57, - 0xcb, - 0x51, - 0xcf, - 0x1b, - 0x14, - 0xfd, - 0x6f, - 0x84, - 0x38, - 0xb5, - 0x24, - 0x11, - 0xcf, - 0x7a, - 0x75, - 0x7a, - 0xbb, - 0x78, - 0x74, - 0xdc, - 0xbc, - 0x42, - 0xf0, - 0x17, - 0x3f, - 0x5e, - 0xeb, - 0x74, - 0x77, - 0x04, - 0x4e, - 0x8c, - 0xaf, - 0x23, - 0xdc, - 0x65, - 0xdf, - 0xa5, - 0x65, - 0xdd, - 0x7d, - 0xf4, - 0x3c, - 0x4c, - 0x95, - 0xbd, - 0xeb, - 0x65, - 0x1c, - 0xf4, - 0x24, - 0x5d, - 0x82, - 0x18, - 0xfb, - 0x50, - 0x86, - 0xb8, - 0x53, - 0xe0, - 0x4e, - 0x36, - 0x96, - 0x1f, - 0xb7, - 0xcb, - 0xaa, - 0xaf, - 0xea, - 0xcb, - 0x20, - 0x27, - 0x30, - 0x2a, - 0xae, - 0xb9, - 0x07, - 0x40, - 0xdf, - 0x12, - 0x75, - 0xc9, - 0x09, - 0x82, - 0x9c, - 0x30, - 0x80, - 0x5d, - 0x8f, - 0x0d, - 0x09, - 0xa1, - 0x64, - 0xec, - 0x91, - 0xd8, - 0x8a, - 0x50, - 0x1f, - 0x40, - 0x5d, - 0xf7, - 0x08, - 0x2a, - 0xf8, - 0x60, - 0x62, - 0xa0, - 0x4a, - 0x8b, - 0xba, - 0x4a, - 0x6d, - 0x00, - 0x0a, - 0x93, - 0x32, - 0x12, - 0xe5, - 0x07, - 0x01, - 0x65, - 0xf5, - 0xff, - 0xe0, - 0xae, - 0xa7, - 0x81, - 0xd1, - 0xba, - 0x25, - 0x62, - 0x61, - 0xb2, - 0x85, - 0xad, - 0x7e, - 0x9d, - 0x3f, - 0x49, - 0x89, - 0x26, - 0xe5, - 0xd5, - 0xac, - 0x9f, - 0x0e, - 0xd7, - 0x6e, - 0x47, - 0x94, - 0x16, - 0x84, - 0xc8, - 0xff, - 0x44, - 0xea, - 0x04, - 0x40, - 0xe0, - 0x33, - 0x11, - 0xa3, - 0x5b, - 0x1e, - 0x82, - 0xff, - 0x7a, - 0x69, - 0xe9, - 0x2f, - 0xfb, - 0xea, - 0x9a, - 0xc6, - 0x7b, - 0xdb, - 0xb1, - 0xff, - 0x97, - 0x76, - 0x56, - 0xf3, - 0x52, - 0xc2, - 0x3f, - 0x0f, - 0xb6, - 0xac, - 0x77, - 0xc4, - 0xbf, - 0x59, - 0x5e, - 0x80, - 0x74, - 0xbb, - 0xf2, - 0xde, - 0x57, - 0x62, - 0x4c, - 0x1a, - 0xff, - 0x95, - 0x6d, - 0xc7, - 0x04, - 0xa2, - 0x3b, - 0xc4, - 0x1b, - 0x72, - 0xc7, - 0x6c, - 0x82, - 0x60, - 0xd1, - 0x0d, - ]; - - /** - * Encryption table for the data - * - * @type array - */ - private $data_encrypt_table = [ - 0x82, - 0x8b, - 0x7f, - 0x68, - 0x90, - 0xe0, - 0x44, - 0x09, - 0x19, - 0x3b, - 0x8e, - 0x5f, - 0xc2, - 0x82, - 0x38, - 0x23, - 0x6d, - 0xdb, - 0x62, - 0x49, - 0x52, - 0x6e, - 0x21, - 0xdf, - 0x51, - 0x6c, - 0x76, - 0x37, - 0x86, - 0x50, - 0x7d, - 0x48, - 0x1f, - 0x65, - 0xe7, - 0x52, - 0x6a, - 0x88, - 0xaa, - 0xc1, - 0x32, - 0x2f, - 0xf7, - 0x54, - 0x4c, - 0xaa, - 0x6d, - 0x7e, - 0x6d, - 0xa9, - 0x8c, - 0x0d, - 0x3f, - 0xff, - 0x6c, - 0x09, - 0xb3, - 0xa5, - 0xaf, - 0xdf, - 0x98, - 0x02, - 0xb4, - 0xbe, - 0x6d, - 0x69, - 0x0d, - 0x42, - 0x73, - 0xe4, - 0x34, - 0x50, - 0x07, - 0x30, - 0x79, - 0x41, - 0x2f, - 0x08, - 0x3f, - 0x42, - 0x73, - 0xa7, - 0x68, - 0xfa, - 0xee, - 0x88, - 0x0e, - 0x6e, - 0xa4, - 0x70, - 0x74, - 0x22, - 0x16, - 0xae, - 0x3c, - 0x81, - 0x14, - 0xa1, - 0xda, - 0x7f, - 0xd3, - 0x7c, - 0x48, - 0x7d, - 0x3f, - 0x46, - 0xfb, - 0x6d, - 0x92, - 0x25, - 0x17, - 0x36, - 0x26, - 0xdb, - 0xdf, - 0x5a, - 0x87, - 0x91, - 0x6f, - 0xd6, - 0xcd, - 0xd4, - 0xad, - 0x4a, - 0x29, - 0xdd, - 0x7d, - 0x59, - 0xbd, - 0x15, - 0x34, - 0x53, - 0xb1, - 0xd8, - 0x50, - 0x11, - 0x83, - 0x79, - 0x66, - 0x21, - 0x9e, - 0x87, - 0x5b, - 0x24, - 0x2f, - 0x4f, - 0xd7, - 0x73, - 0x34, - 0xa2, - 0xf7, - 0x09, - 0xd5, - 0xd9, - 0x42, - 0x9d, - 0xf8, - 0x15, - 0xdf, - 0x0e, - 0x10, - 0xcc, - 0x05, - 0x04, - 0x35, - 0x81, - 0xb2, - 0xd5, - 0x7a, - 0xd2, - 0xa0, - 0xa5, - 0x7b, - 0xb8, - 0x75, - 0xd2, - 0x35, - 0x0b, - 0x39, - 0x8f, - 0x1b, - 0x44, - 0x0e, - 0xce, - 0x66, - 0x87, - 0x1b, - 0x64, - 0xac, - 0xe1, - 0xca, - 0x67, - 0xb4, - 0xce, - 0x33, - 0xdb, - 0x89, - 0xfe, - 0xd8, - 0x8e, - 0xcd, - 0x58, - 0x92, - 0x41, - 0x50, - 0x40, - 0xcb, - 0x08, - 0xe1, - 0x15, - 0xee, - 0xf4, - 0x64, - 0xfe, - 0x1c, - 0xee, - 0x25, - 0xe7, - 0x21, - 0xe6, - 0x6c, - 0xc6, - 0xa6, - 0x2e, - 0x52, - 0x23, - 0xa7, - 0x20, - 0xd2, - 0xd7, - 0x28, - 0x07, - 0x23, - 0x14, - 0x24, - 0x3d, - 0x45, - 0xa5, - 0xc7, - 0x90, - 0xdb, - 0x77, - 0xdd, - 0xea, - 0x38, - 0x59, - 0x89, - 0x32, - 0xbc, - 0x00, - 0x3a, - 0x6d, - 0x61, - 0x4e, - 0xdb, - 0x29, - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // We need to decrypt the packets - $decrypted = $this->decryptPackets($this->packets_response); - - // Now let us convert special characters from hex to ascii all at once - $decrypted = preg_replace_callback( - '|%([0-9A-F]{2})|', - function ($matches) { - - // Pack this into ascii - return pack('H*', $matches[1]); - }, - $decrypted - ); - - // Explode into lines - $lines = explode("\n", $decrypted); - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Defaults - $channelFields = 5; - $playerFields = 7; - - // Iterate over the lines - foreach ($lines as $line) { - // Trim all the outlying space - $line = trim($line); - - // We dont have anything in this line - if (strlen($line) == 0) { - continue; - } - - /** - * Everything is in this format: ITEM: VALUE - * - * Example: - * ... - * MAXCLIENTS: 175 - * VOICECODEC: 3,Speex - * VOICEFORMAT: 31,32 KHz%2C 16 bit%2C 9 Qlty - * UPTIME: 9167971 - * PLATFORM: Linux-i386 - * VERSION: 3.0.6 - * ... - */ - - // Check to see if we have a colon, every line should - if (($colon_pos = strpos($line, ":")) !== false && $colon_pos > 0) { - // Split the line into key/value pairs - list($key, $value) = explode(':', $line, 2); - - // Lower the font of the key - $key = strtolower($key); - - // Trim the value of extra space - $value = trim($value); - - // Switch and offload items as needed - switch ($key) { - case 'client': - $this->processPlayer($value, $playerFields, $result); - break; - - case 'channel': - $this->processChannel($value, $channelFields, $result); - break; - - // Find the number of fields for the channels - case 'channelfields': - $channelFields = count(explode(',', $value)); - break; - - // Find the number of fields for the players - case 'clientfields': - $playerFields = count(explode(',', $value)); - break; - - // By default we just add they key as an item - default: - $result->add($key, utf8_encode($value)); - break; - } - } - } - - unset($decrypted, $line, $lines, $colon_pos, $key, $value); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Decrypt the incoming packets - * - * @codeCoverageIgnore - * - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function decryptPackets(array $packets = []) - { - - // This will be returned - $decrypted = []; - - foreach ($packets as $packet) { - # Header : - $header = substr($packet, 0, 20); - - $header_items = []; - - $header_key = unpack("n1", $header); - - $key = array_shift($header_key); - - $chars = unpack("C*", substr($header, 2)); - - $a1 = $key & 0xFF; - $a2 = $key >> 8; - - if ($a1 == 0) { - throw new Exception(__METHOD__ . ": Header key is invalid"); - } - - $table = $this->head_encrypt_table; - - $characterCount = count($chars); - - $key = 0; - for ($i = 1; $i <= $characterCount; $i++) { - $chars[$i] -= ($table[$a2] + (($i - 1) % 5)) & 0xFF; - $a2 = ($a2 + $a1) & 0xFF; - if (($i % 2) == 0) { - $short_array = unpack("n1", pack("C2", $chars[$i - 1], $chars[$i])); - $header_items[$key] = $short_array[1]; - ++$key; - } - } - - $header_items = array_combine([ - 'zero', - 'cmd', - 'id', - 'totlen', - 'len', - 'totpck', - 'pck', - 'datakey', - 'crc', - ], $header_items); - - // Check to make sure the number of packets match - if ($header_items['totpck'] != count($packets)) { - throw new Exception(__METHOD__ . ": Too few packets received"); - } - - # Data : - $table = $this->data_encrypt_table; - $a1 = $header_items['datakey'] & 0xFF; - $a2 = $header_items['datakey'] >> 8; - - if ($a1 == 0) { - throw new Exception(__METHOD__ . ": Data key is invalid"); - } - - $chars = unpack("C*", substr($packet, 20)); - $data = ""; - $characterCount = count($chars); - - for ($i = 1; $i <= $characterCount; $i++) { - $chars[$i] -= ($table[$a2] + (($i - 1) % 72)) & 0xFF; - $a2 = ($a2 + $a1) & 0xFF; - $data .= chr($chars[$i]); - } - //@todo: Check CRC ??? - $decrypted[$header_items['pck']] = $data; - } - - // Return the decrypted packets as one string - return implode('', $decrypted); - } - - /** - * Process the channel listing - * - * @param string $data - * @param int $fieldCount - * @param \GameQ\Result $result - */ - protected function processChannel($data, $fieldCount, Result &$result) - { - - // Split the items on the comma - $items = explode(",", $data, $fieldCount); - - // Iterate over the items for this channel - foreach ($items as $item) { - // Split the key=value pair - list($key, $value) = explode("=", $item, 2); - - $result->addTeam(strtolower($key), utf8_encode($value)); - } - } - - /** - * Process the user listing - * - * @param string $data - * @param int $fieldCount - * @param \GameQ\Result $result - */ - protected function processPlayer($data, $fieldCount, Result &$result) - { - - // Split the items on the comma - $items = explode(",", $data, $fieldCount); - - // Iterate over the items for this player - foreach ($items as $item) { - // Split the key=value pair - list($key, $value) = explode("=", $item, 2); - - $result->addPlayer(strtolower($key), utf8_encode($value)); - } - } -} diff --git a/GameQ/Protocols/Warsow.php b/GameQ/Protocols/Warsow.php deleted file mode 100644 index f1d629a..0000000 --- a/GameQ/Protocols/Warsow.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Warsow Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Warsow extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'warsow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Warsow"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "warsow://%s:%d/"; - - /** - * Handle player info, different than quake3 base - * - * @param Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processPlayers(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Make a new buffer with this block - $playerInfo = new Buffer($buffer->readString("\x0A")); - - // Add player info - $result->addPlayer('frags', $playerInfo->readString("\x20")); - $result->addPlayer('ping', $playerInfo->readString("\x20")); - - // Skip first " - $playerInfo->skip(1); - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); - - // Skip space - $playerInfo->skip(1); - - // Add team - $result->addPlayer('team', $playerInfo->read()); - - // Clear - unset($playerInfo); - } - - // Clear - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/Protocols/Won.php b/GameQ/Protocols/Won.php deleted file mode 100644 index bef0984..0000000 --- a/GameQ/Protocols/Won.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * World Opponent Network (WON) class - * - * Pre-cursor to the A2S (source) protocol system - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - * - * @package GameQ\Protocols - */ -class Won extends Source -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFdetails\x00", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFFplayers", - self::PACKET_RULES => "\xFF\xFF\xFF\xFFrules", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'won'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'won'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "World Opponent Network"; -} diff --git a/GameQ/Protocols/Wurm.php b/GameQ/Protocols/Wurm.php deleted file mode 100644 index c593652..0000000 --- a/GameQ/Protocols/Wurm.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Wurm Unlimited Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Wurm extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'wurm'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Wurm Unlimited"; -} diff --git a/GameQ/Query/Core.php b/GameQ/Query/Core.php deleted file mode 100644 index 5eb08ad..0000000 --- a/GameQ/Query/Core.php +++ /dev/null @@ -1,164 +0,0 @@ -. - */ - -namespace GameQ\Query; - -/** - * Core for the query mechanisms - * - * @author Austin Bischoff - */ -abstract class Core -{ - - /** - * The socket used by this resource - * - * @type null|resource - */ - public $socket = null; - - /** - * The transport type (udp, tcp, etc...) - * See http://php.net/manual/en/transports.php for the supported list - * - * @type string - */ - protected $transport = null; - - /** - * Connection IP address - * - * @type string - */ - protected $ip = null; - - /** - * Connection port - * - * @type int - */ - protected $port = null; - - /** - * The time in seconds to wait before timing out while connecting to the socket - * - * @type int - */ - protected $timeout = 3; // Seconds - - /** - * Socket is blocking? - * - * @type bool - */ - protected $blocking = false; - - /** - * Called when the class is cloned - */ - public function __clone() - { - - // Reset the properties for this class when cloned - $this->reset(); - } - - /** - * Set the connection information for the socket - * - * @param string $transport - * @param string $ip - * @param int $port - * @param int $timeout seconds - * @param bool $blocking - */ - public function set($transport, $ip, $port, $timeout = 3, $blocking = false) - { - - $this->transport = $transport; - - $this->ip = $ip; - - $this->port = $port; - - $this->timeout = $timeout; - - $this->blocking = $blocking; - } - - /** - * Reset this instance's properties - */ - public function reset() - { - - $this->transport = null; - - $this->ip = null; - - $this->port = null; - - $this->timeout = 3; - - $this->blocking = false; - } - - /** - * Create a new socket - * - * @return void - */ - abstract protected function create(); - - /** - * Get the socket - * - * @return mixed - */ - abstract public function get(); - - /** - * Write data to the socket - * - * @param string $data - * - * @return int The number of bytes written - */ - abstract public function write($data); - - /** - * Close the socket - * - * @return void - */ - abstract public function close(); - - /** - * Read the responses from the socket(s) - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param array $sockets - * @param int $timeout - * @param int $stream_timeout - * - * @return array - */ - abstract public function getResponses(array $sockets, $timeout, $stream_timeout); -} diff --git a/GameQ/Query/Native.php b/GameQ/Query/Native.php deleted file mode 100644 index b078c9c..0000000 --- a/GameQ/Query/Native.php +++ /dev/null @@ -1,221 +0,0 @@ -. - */ - -namespace GameQ\Query; - -use GameQ\Exception\Query as Exception; - -/** - * Native way of querying servers - * - * @author Austin Bischoff - */ -class Native extends Core -{ - /** - * Get the current socket or create one and return - * - * @return resource|null - * @throws \GameQ\Exception\Query - */ - public function get() - { - - // No socket for this server, make one - if (is_null($this->socket)) { - $this->create(); - } - - return $this->socket; - } - - /** - * Write data to the socket - * - * @param string $data - * - * @return int The number of bytes written - * @throws \GameQ\Exception\Query - */ - public function write($data) - { - - try { - // No socket for this server, make one - if (is_null($this->socket)) { - $this->create(); - } - - // Send the packet - return fwrite($this->socket, $data); - } catch (\Exception $e) { - throw new Exception($e->getMessage(), $e->getCode(), $e); - } - } - - /** - * Close the current socket - */ - public function close() - { - - if ($this->socket) { - fclose($this->socket); - $this->socket = null; - } - } - - /** - * Create a new socket for this query - * - * @throws \GameQ\Exception\Query - */ - protected function create() - { - - // Create the remote address - $remote_addr = sprintf("%s://%s:%d", $this->transport, $this->ip, $this->port); - - // Create context - $context = stream_context_create([ - 'socket' => [ - 'bindto' => '0:0', // Bind to any available IP and OS decided port - ], - ]); - - // Define these first - $errno = null; - $errstr = null; - - // Create the socket - if (($this->socket = - @stream_socket_client($remote_addr, $errno, $errstr, $this->timeout, STREAM_CLIENT_CONNECT, $context)) - !== false - ) { - // Set the read timeout on the streams - stream_set_timeout($this->socket, $this->timeout); - - // Set blocking mode - stream_set_blocking($this->socket, $this->blocking); - } else { - // Reset socket - $this->socket = null; - - // Something bad happened, throw query exception - throw new Exception( - __METHOD__ . " - Error creating socket to server {$this->ip}:{$this->port}. Error: " . $errstr, - $errno - ); - } - } - - /** - * Pull the responses out of the stream - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) - * - * @param array $sockets - * @param int $timeout - * @param int $stream_timeout - * - * @return array Raw responses - */ - public function getResponses(array $sockets, $timeout, $stream_timeout) - { - - // Set the loop to active - $loop_active = true; - - // Will hold the responses read from the sockets - $responses = []; - - // To store the sockets - $sockets_tmp = []; - - // Loop and pull out all the actual sockets we need to listen on - foreach ($sockets as $socket_id => $socket_data) { - // Get the socket - /* @var $socket \GameQ\Query\Core */ - $socket = $socket_data['socket']; - - // Append the actual socket we are listening to - $sockets_tmp[$socket_id] = $socket->get(); - - unset($socket); - } - - // Init some variables - $read = $sockets_tmp; - $write = null; - $except = null; - - // Check to see if $read is empty, if so stream_select() will throw a warning - if (empty($read)) { - return $responses; - } - - // This is when it should stop - $time_stop = microtime(true) + $timeout; - - // Let's loop until we break something. - while ($loop_active && microtime(true) < $time_stop) { - // Check to make sure $read is not empty, if so we are done - if (empty($read)) { - break; - } - - // Now lets listen for some streams, but do not cross the streams! - $streams = stream_select($read, $write, $except, 0, $stream_timeout); - - // We had error or no streams left, kill the loop - if ($streams === false || ($streams <= 0)) { - break; - } - - // Loop the sockets that received data back - foreach ($read as $socket) { - /* @var $socket resource */ - - // See if we have a response - if (($response = fread($socket, 8192)) === false) { - continue; // No response yet so lets continue. - } - - // Check to see if the response is empty, if so we are done with this server - if (strlen($response) == 0) { - // Remove this server from any future read loops - unset($sockets_tmp[(int)$socket]); - continue; - } - - // Add the response we got back - $responses[(int)$socket][] = $response; - } - - // Because stream_select modifies read we need to reset it each time to the original array of sockets - $read = $sockets_tmp; - } - - // Free up some memory - unset($streams, $read, $write, $except, $sockets_tmp, $time_stop, $response); - - // Return all of the responses, may be empty if something went wrong - return $responses; - } -} diff --git a/GameQ/Result.php b/GameQ/Result.php deleted file mode 100644 index 7023f17..0000000 --- a/GameQ/Result.php +++ /dev/null @@ -1,130 +0,0 @@ -. - */ - -namespace GameQ; - -/** - * Provide an interface for easy storage of a parsed server response - * - * @author Aidan Lister - * @author Tom Buskens - */ -class Result -{ - - /** - * Formatted server response - * - * @var array - */ - protected $result = []; - - /** - * Adds variable to results - * - * @param string $name Variable name - * @param string|array $value Variable value - */ - public function add($name, $value) - { - - $this->result[$name] = $value; - } - - /** - * Adds player variable to output - * - * @param string $name Variable name - * @param string $value Variable value - */ - public function addPlayer($name, $value) - { - - $this->addSub('players', $name, $value); - } - - /** - * Adds player variable to output - * - * @param string $name Variable name - * @param string $value Variable value - */ - public function addTeam($name, $value) - { - - $this->addSub('teams', $name, $value); - } - - /** - * Add a variable to a category - * - * @param $sub string The category - * @param $key string The variable name - * @param $value string The variable value - */ - public function addSub($sub, $key, $value) - { - - // Nothing of this type yet, set an empty array - if (!isset($this->result[$sub]) or !is_array($this->result[$sub])) { - $this->result[$sub] = []; - } - - // Find the first entry that doesn't have this variable - $found = false; - $count = count($this->result[$sub]); - for ($i = 0; $i != $count; $i++) { - if (!isset($this->result[$sub][$i][$key])) { - $this->result[$sub][$i][$key] = $value; - $found = true; - break; - } - } - - // Not found, create a new entry - if (!$found) { - $this->result[$sub][][$key] = $value; - } - - unset($count); - } - - /** - * Return all stored results - * - * @return array All results - */ - public function fetch() - { - - return $this->result; - } - - /** - * Return a single variable - * - * @param string $var The variable name - * - * @return mixed The variable value - */ - public function get($var) - { - - return isset($this->result[$var]) ? $this->result[$var] : null; - } -} diff --git a/GameQ/Server.php b/GameQ/Server.php deleted file mode 100644 index dff8f77..0000000 --- a/GameQ/Server.php +++ /dev/null @@ -1,380 +0,0 @@ -. - */ - -namespace GameQ; - -use GameQ\Exception\Server as Exception; - -/** - * Server class to represent each server entity - * - * @author Austin Bischoff - */ -class Server -{ - - /* - * Server array keys - */ - const SERVER_TYPE = 'type'; - - const SERVER_HOST = 'host'; - - const SERVER_ID = 'id'; - - const SERVER_OPTIONS = 'options'; - - /* - * Server options keys - */ - - /* - * Use this option when the query_port and client connect ports are different - */ - const SERVER_OPTIONS_QUERY_PORT = 'query_port'; - - /** - * The protocol class for this server - * - * @type \GameQ\Protocol - */ - protected $protocol = null; - - /** - * Id of this server - * - * @type string - */ - public $id = null; - - /** - * IP Address of this server - * - * @type string - */ - public $ip = null; - - /** - * The server's client port (connect port) - * - * @type int - */ - public $port_client = null; - - /** - * The server's query port - * - * @type int - */ - public $port_query = null; - - /** - * Holds other server specific options - * - * @type array - */ - protected $options = []; - - /** - * Holds the sockets already open for this server - * - * @type array - */ - protected $sockets = []; - - /** - * Construct the class with the passed options - * - * @param array $server_info - * - * @throws \GameQ\Exception\Server - */ - public function __construct(array $server_info = []) - { - - // Check for server type - if (!array_key_exists(self::SERVER_TYPE, $server_info) || empty($server_info[self::SERVER_TYPE])) { - throw new Exception("Missing server info key '" . self::SERVER_TYPE . "'!"); - } - - // Check for server host - if (!array_key_exists(self::SERVER_HOST, $server_info) || empty($server_info[self::SERVER_HOST])) { - throw new Exception("Missing server info key '" . self::SERVER_HOST . "'!"); - } - - // IP address and port check - $this->checkAndSetIpPort($server_info[self::SERVER_HOST]); - - // Check for server id - if (array_key_exists(self::SERVER_ID, $server_info) && !empty($server_info[self::SERVER_ID])) { - // Set the server id - $this->id = $server_info[self::SERVER_ID]; - } else { - // Make an id so each server has an id when returned - $this->id = sprintf('%s:%d', $this->ip, $this->port_client); - } - - // Check and set server options - if (array_key_exists(self::SERVER_OPTIONS, $server_info)) { - // Set the options - $this->options = $server_info[self::SERVER_OPTIONS]; - } - - try { - // Make the protocol class for this type - $class = new \ReflectionClass( - sprintf('GameQ\\Protocols\\%s', ucfirst(strtolower($server_info[self::SERVER_TYPE]))) - ); - - $this->protocol = $class->newInstanceArgs([$this->options]); - } catch (\ReflectionException $e) { - throw new Exception("Unable to locate Protocols class for '{$server_info[self::SERVER_TYPE]}'!"); - } - - // Check and set any server options - $this->checkAndSetServerOptions(); - - unset($server_info, $class); - } - - /** - * Check and set the ip address for this server - * - * @param $ip_address - * - * @throws \GameQ\Exception\Server - */ - protected function checkAndSetIpPort($ip_address) - { - - // Test for IPv6 - if (substr_count($ip_address, ':') > 1) { - // See if we have a port, input should be in the format [::1]:27015 or similar - if (strstr($ip_address, ']:')) { - // Explode to get port - $server_addr = explode(':', $ip_address); - - // Port is the last item in the array, remove it and save - $this->port_client = (int)array_pop($server_addr); - - // The rest is the address, recombine - $this->ip = implode(':', $server_addr); - - unset($server_addr); - } else { - // Just the IPv6 address, no port defined, fail - throw new Exception( - "The host address '{$ip_address}' is missing the port. All " - . "servers must have a port defined!" - ); - } - - // Now let's validate the IPv6 value sent, remove the square brackets ([]) first - if (!filter_var(trim($this->ip, '[]'), FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV6,])) { - throw new Exception("The IPv6 address '{$this->ip}' is invalid."); - } - } else { - // We have IPv4 with a port defined - if (strstr($ip_address, ':')) { - list($this->ip, $this->port_client) = explode(':', $ip_address); - - // Type case the port - $this->port_client = (int)$this->port_client; - } else { - // No port, fail - throw new Exception( - "The host address '{$ip_address}' is missing the port. All " - . "servers must have a port defined!" - ); - } - - // Validate the IPv4 value, if FALSE is not a valid IP, maybe a hostname. Try to resolve - if (!filter_var($this->ip, FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV4,]) - && $this->ip === gethostbyname($this->ip) - ) { - // When gethostbyname() fails it returns the original string - // so if ip and the result from gethostbyname() are equal this failed. - throw new Exception("Unable to resolve the host '{$this->ip}' to an IP address."); - } - } - } - - /** - * Check and set any server specific options - */ - protected function checkAndSetServerOptions() - { - - // Specific query port defined - if (array_key_exists(self::SERVER_OPTIONS_QUERY_PORT, $this->options)) { - $this->port_query = (int)$this->options[self::SERVER_OPTIONS_QUERY_PORT]; - } else { - // Do math based on the protocol class - $this->port_query = $this->protocol->findQueryPort($this->port_client); - } - } - - /** - * Set an option for this server - * - * @param $key - * @param $value - * - * @return $this - */ - public function setOption($key, $value) - { - - $this->options[$key] = $value; - - return $this; // Make chainable - } - - /** - * Return set option value - * - * @param mixed $key - * - * @return mixed - */ - public function getOption($key) - { - - return (array_key_exists($key, $this->options)) ? $this->options[$key] : null; - } - - /** - * Get the ID for this server - * - * @return string - */ - public function id() - { - - return $this->id; - } - - /** - * Get the IP address for this server - * - * @return string - */ - public function ip() - { - - return $this->ip; - } - - /** - * Get the client port for this server - * - * @return int - */ - public function portClient() - { - - return $this->port_client; - } - - /** - * Get the query port for this server - * - * @return int - */ - public function portQuery() - { - - return $this->port_query; - } - - /** - * Return the protocol class for this server - * - * @return \GameQ\Protocol - */ - public function protocol() - { - - return $this->protocol; - } - - /** - * Get the join link for this server - * - * @return string - */ - public function getJoinLink() - { - - return sprintf($this->protocol->joinLink(), $this->ip, $this->portClient()); - } - - /* - * Socket holding - */ - - /** - * Add a socket for this server to be reused - * - * @codeCoverageIgnore - * - * @param \GameQ\Query\Core $socket - */ - public function socketAdd(Query\Core $socket) - { - - $this->sockets[] = $socket; - } - - /** - * Get a socket from the list to reuse, if any are available - * - * @codeCoverageIgnore - * - * @return \GameQ\Query\Core|null - */ - public function socketGet() - { - - $socket = null; - - if (count($this->sockets) > 0) { - $socket = array_pop($this->sockets); - } - - return $socket; - } - - /** - * Clear any sockets still listed and attempt to close them - * - * @codeCoverageIgnore - */ - public function socketCleanse() - { - - // Close all of the sockets available - foreach ($this->sockets as $socket) { - /* @var $socket \GameQ\Query\Core */ - $socket->close(); - } - - // Reset the sockets list - $this->sockets = []; - } -} diff --git a/GameQ/composer.json b/GameQ/composer.json deleted file mode 100644 index f05819b..0000000 --- a/GameQ/composer.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "austinb/gameq", - "description": "GameQ Gameserver Library", - "keywords": [ - "gameq", - "serverstatus" - ], - "version": "v3.0.15", - "license": "LGPL-3.0+", - "authors": [ - { - "name": "Austin Bischoff", - "email": "austin.bischoff@gmail.com", - "role": "Packagist/Composer Maintainer, Developer", - "homepage": "https://github.com/Austinb" - }, - { - "name": "Christoph Kretzschmar", - "email": "blackskyliner@googlemail.com", - "role": "Developer", - "homepage": "https://github.com/Blackskyliner" - }, - { - "name": "Marcel Bößendörfer", - "email": "m.boessendoerfer@marbis.net", - "role": "Developer", - "homepage": "https://github.com/nitrado" - }, - { - "name": "Alexander Hambalgo", - "role": "Developer", - "homepage": "http://balgo.users.sourceforge.net/" - }, - { - "name": "Holger", - "role": "Developer", - "homepage": "http://icet33.users.sourceforge.net/" - }, - { - "name": "Sebastian Weidenbach", - "role": "Developer", - "homepage": "http://sebastianwe.users.sourceforge.net/" - } - ], - "support": { - "source": "https://github.com/Austinb/GameQ/v3", - "issues": "https://github.com/Austinb/GameQ/issues", - "wiki": "https://github.com/Austinb/GameQ/wiki" - }, - "require": { - "php": ">=5.6.40", - "ext-bz2": "*", - "ext-xml": "*" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8 || ^6.0 || ^7.0", - "phpunit/php-invoker": "*", - "phpmd/phpmd": "@stable", - "squizlabs/php_codesniffer": "3.*@stable", - "corneltek/getoptionkit": "~2", - "php-coveralls/php-coveralls": "^1.1 || ^2.1" - }, - "autoload": { - "psr-4": { - "GameQ\\": "src/GameQ/" - } - }, - "autoload-dev": { - "psr-4": { - "GameQ\\Tests\\": "tests" - } - }, - "scripts": { - "test": [ - "@test-phpcs", - "@test-phpmd", - "@test-php" - ], - "test-php": "vendor/bin/phpunit", - "test-phpcs": "vendor/bin/phpcs src tests --extensions=php --ignore=bootstrap --report=checkstyle --report-file=build/logs/checkstyle.xml --standard=build/config/phpcs.xml -v", - "test-phpmd": "vendor/bin/phpmd src,tests xml build/config/phpmd.xml" - }, - "scripts-descriptions": { - "test": "Run all tests!", - "test-php": "Run phpunit tests", - "test-phpcs": "Run PHP Code Style checks", - "test-phpmd": "Run PHP Mess Detector checks" - } -} diff --git a/GameQ/examples/list.php b/GameQ/examples/list.php deleted file mode 100644 index 6d143cf..0000000 --- a/GameQ/examples/list.php +++ /dev/null @@ -1,131 +0,0 @@ -read())) { - if (!is_file($protocols_path . $entry)) { - continue; - } - - // Lets get some info on the class - $reflection = new ReflectionClass('\\GameQ\\Protocols\\' . pathinfo($entry, PATHINFO_FILENAME)); - - // Check to make sure we can actually load the class - if (!$reflection->IsInstantiable()) { - continue; - } - - // Load up the class so we can get info - $class = $reflection->newInstance(); - - // Add it to the list - $protocols[ $class->name() ] = [ - 'name' => $class->nameLong(), - 'state' => $class->state(), - ]; - - // Unset the class - unset($class); -} - -// Close the directory -unset($dir); - -ksort($protocols); - -?> - - - - GameQ v3 - Supported Games - - - - -

GameQ v3 - Supported Games ()

- - - - - - - - - - $info) { - - - switch ($info['state']) { - case 1: - $state = 'Testing'; - break; - - case 2: - $state = 'Beta'; - break; - - case 3: - $state = 'Stable'; - break; - - case 4: - $state = 'Deprecated'; - break; - } - - $cls = empty($cls) ? ' class="uneven"' : ''; - printf("\n", $cls, - htmlentities($info['name']), - $gameq, - $state - ); - } - ?> - -
Game NameGameQ IdentifierState
%s%s%s
- - diff --git a/GameQ/expansion.php b/GameQ/expansion.php deleted file mode 100644 index e15eae2..0000000 --- a/GameQ/expansion.php +++ /dev/null @@ -1,171 +0,0 @@ -addServer([ - 'type' => 'dayz', - 'host' => '82.64.214.194:3201', - 'options' => [ - 'query_port' => 27021, - ], -]); - - -// 'type' => 'dayz', -// 'host' => '82.64.214.194:2303', -// 'options' => [ -// 'query_port' => 27023, -// ], - - - - -// Define the servers you wish you query -$GameQ = new \GameQ\GameQ(); // or //$GameQ = \GameQ\GameQ::factory(); - -$GameQ->setOption('timeout', 3); // 3 seconds -$results = $GameQ->process(); - -//print_r($results); - //echo "

// var dump

"; - //var_dump(json_decode($readjson, true)); -//echo "

// echo

"; -// echo $readjson
"; - //$data1 = json_decode("$readjson", true); -//echo "

//Print data1

" ; - //print_r($data1); -//echo "
"; - - -$data = json_decode($readjson); -// class -$name = $data->{'name'}; -$map = $data->{'map'}; -$password = $data->{'password'}; -$game = $data->{'raw'}->{'game'}; -$secure = $data->{'raw'}->{'secure'}; -$numplayers = $data->{'raw'}->{'numplayers'}; -$version = $data->{'raw'}->{'version'}; -$tags = $data->{'raw'}->{'tags'}; - -//$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; -//$island = $data->{'raw'}->{'rules'}->{'island'}; - - -$connect = $data->{'connect'}; -$ping = $data->{'ping'}; -$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; -$battleye = substr($tags,0,8); -$hive = substr($tags,18,8); -$players = $data->{'players'}; - -//if(empty($players)) -// $players = "0"; -//if (empty($players)) { "0"; } -//$playersuser = substr($players,0,8); -//$players = $data->{'array_filter($players)'}; -//$player = $data->{'players'}; - -?> - - - - - Dayz ToX Server: <?php echo"${name}"; ?> - - - - - - - - - - - - - - - - - - - - - - - -
Server Name IP server Ping Player Info Joueurs Version
- -
- - - - - Player: - - - - - - - -
print_r ";print_r($players); - -?> -
- - - - - - - - diff --git a/GameQ/expansion_.php b/GameQ/expansion_.php deleted file mode 100644 index d2c3af9..0000000 --- a/GameQ/expansion_.php +++ /dev/null @@ -1,170 +0,0 @@ -addServer([ - 'type' => 'dayz', - 'host' => '82.64.214.194:3201', - 'options' => [ - 'query_port' => 27021, - ] -]); - - -// 'type' => 'dayz', -// 'host' => '82.64.214.194:2303', -// 'options' => [ -// 'query_port' => 27023, -// ], - - -// Define the servers you wish you query -#$GameQ = new \GameQ\GameQ(); // or //$GameQ = \GameQ\GameQ::factory(); -$GameQ->setOption('timeout', 3); // 3 seconds - -$results = $GameQ->process(); - -//print_r($results); - //echo "

// var dump

"; - //var_dump(json_decode($readjson, true)); -//echo "

// echo

"; -// echo $readjson
"; - //$data1 = json_decode("$readjson", true); -//echo "

//Print data1

" ; - //print_r($data1); -//echo "
"; - - -$data = json_decode($readjson); -// class -$name = $data->{'name'}; -$map = $data->{'map'}; -$password = $data->{'password'}; -$game = $data->{'raw'}->{'game'}; -$secure = $data->{'raw'}->{'secure'}; -$numplayers = $data->{'raw'}->{'numplayers'}; -$version = $data->{'raw'}->{'version'}; -$tags = $data->{'raw'}->{'tags'}; - -//$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; -//$island = $data->{'raw'}->{'rules'}->{'island'}; - - -$connect = $data->{'connect'}; -$ping = $data->{'ping'}; -$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; -$battleye = substr($tags,0,8); -$hive = substr($tags,18,8); -$players = $data->{'players'}; - -//if(empty($players)) -// $players = "0"; -//if (empty($players)) { "0"; } -//$playersuser = substr($players,0,8); -//$players = $data->{'array_filter($players)'}; -//$player = $data->{'players'}; - -?> - - - - - Dayz ToX Server: <?php echo"${name}"; ?> - - - - - - - - - - - - - - - - - - - - - - - -
Server Name IP server Ping Player Info Joueurs Version
- -
- - - - - Player: - - - - - - - -
print_r ";print_r($players); - -?> -
- - - - - - - - diff --git a/GameQ/index.php b/GameQ/index.php deleted file mode 100644 index 2dccf42..0000000 --- a/GameQ/index.php +++ /dev/null @@ -1,152 +0,0 @@ -addServer([ - 'type' => 'dayz', - 'host' => '82.64.214.194:3222', - 'options' => [ - 'query_port' => 27022, - ], -]); - -// Define the servers you wish you query -//$GameQ = new \GameQ\GameQ(); // or //$GameQ = \GameQ\GameQ::factory(); - -$GameQ->setOption('timeout', 3); // 3 seconds -$results = $GameQ->process(); - -$data = json_decode($readjson); -// class -$name = $data->{'name'}; -$map = $data->{'map'}; -$password = $data->{'password'}; -$game = $data->{'raw'}->{'game'}; -$secure = $data->{'raw'}->{'secure'}; -$numplayers = $data->{'raw'}->{'numplayers'}; -$version = $data->{'raw'}->{'version'}; -$tags = $data->{'raw'}->{'tags'}; - -//$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; -//$island = $data->{'raw'}->{'rules'}->{'island'}; - - -$connect = $data->{'connect'}; -$ping = $data->{'ping'}; -$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; -$battleye = substr($tags,0,8); -$hive = substr($tags,18,8); -$players = $data->{'players'}; - -//if(empty($players)) -// $players = "0"; -//if (empty($players)) { "0"; } -//$playersuser = substr($players,0,8); -//$players = $data->{'array_filter($players)'}; -//$player = $data->{'players'}; - -?> - - - - - Dayz ToX Server: <?php echo"${name}"; ?> - - - - - - -
- - - - - - - - - - - - - - - - -
Server Name IP server Ping Player Info Joueurs Version
- -
- - - - - - Player: - - - - - - -
print_r ";print_r($players); - -?> -
- - - - - - - - diff --git a/GameQ/src/GameQ/Autoloader.php b/GameQ/src/GameQ/Autoloader.php deleted file mode 100644 index 7c8eb41..0000000 --- a/GameQ/src/GameQ/Autoloader.php +++ /dev/null @@ -1,60 +0,0 @@ -. - * - * - */ - -/** - * A simple PSR-4 spec auto loader to allow GameQ to function the same as if it were loaded via Composer - * - * To use this just include this file in your script and the GameQ namespace will be made available - * - * i.e. require_once('/path/to/src/GameQ/Autoloader.php'); - * - * See: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md - * - * @codeCoverageIgnore - */ -spl_autoload_register(function ($class) { - - // project-specific namespace prefix - $prefix = 'GameQ\\'; - - // base directory for the namespace prefix - $base_dir = __DIR__ . DIRECTORY_SEPARATOR; - - // does the class use the namespace prefix? - $len = strlen($prefix); - - if (strncmp($prefix, $class, $len) !== 0) { - // no, move to the next registered autoloader - return; - } - - // get the relative class name - $relative_class = substr($class, $len); - - // replace the namespace prefix with the base directory, replace namespace - // separators with directory separators in the relative class name, append - // with .php - $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; - - // if the file exists, require it - if (file_exists($file)) { - require $file; - } -}); diff --git a/GameQ/src/GameQ/Buffer.php b/GameQ/src/GameQ/Buffer.php deleted file mode 100644 index e9e1552..0000000 --- a/GameQ/src/GameQ/Buffer.php +++ /dev/null @@ -1,501 +0,0 @@ -. - * - * - */ - -namespace GameQ; - -use GameQ\Exception\Protocol as Exception; - -/** - * Class Buffer - * - * Read specific byte sequences from a provided string or Buffer - * - * @package GameQ - * - * @author Austin Bischoff - * @author Aidan Lister - * @author Tom Buskens - */ -class Buffer -{ - - /** - * Constants for the byte code types we need to read as - */ - const NUMBER_TYPE_BIGENDIAN = 'be', - NUMBER_TYPE_LITTLEENDIAN = 'le', - NUMBER_TYPE_MACHINE = 'm'; - - /** - * The number type we use for reading integers. Defaults to little endian - * - * @type string - */ - private $number_type = self::NUMBER_TYPE_LITTLEENDIAN; - - /** - * The original data - * - * @type string - */ - private $data; - - /** - * The original data - * - * @type int - */ - private $length; - - /** - * Position of pointer - * - * @type int - */ - private $index = 0; - - /** - * Constructor - * - * @param string $data - * @param string $number_type - */ - public function __construct($data, $number_type = self::NUMBER_TYPE_LITTLEENDIAN) - { - - $this->number_type = $number_type; - $this->data = $data; - $this->length = strlen($data); - } - - /** - * Return all the data - * - * @return string The data - */ - public function getData() - { - - return $this->data; - } - - /** - * Return data currently in the buffer - * - * @return string The data currently in the buffer - */ - public function getBuffer() - { - - return substr($this->data, $this->index); - } - - /** - * Returns the number of bytes in the buffer - * - * @return int Length of the buffer - */ - public function getLength() - { - - return max($this->length - $this->index, 0); - } - - /** - * Read from the buffer - * - * @param int $length - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function read($length = 1) - { - - if (($length + $this->index) > $this->length) { - throw new Exception("Unable to read length={$length} from buffer. Bad protocol format or return?"); - } - - $string = substr($this->data, $this->index, $length); - $this->index += $length; - - return $string; - } - - /** - * Read the last character from the buffer - * - * Unlike the other read functions, this function actually removes - * the character from the buffer. - * - * @return string - */ - public function readLast() - { - - $len = strlen($this->data); - $string = $this->data[strlen($this->data) - 1]; - $this->data = substr($this->data, 0, $len - 1); - $this->length -= 1; - - return $string; - } - - /** - * Look at the buffer, but don't remove - * - * @param int $length - * - * @return string - */ - public function lookAhead($length = 1) - { - - return substr($this->data, $this->index, $length); - } - - /** - * Skip forward in the buffer - * - * @param int $length - */ - public function skip($length = 1) - { - - $this->index += $length; - } - - /** - * Jump to a specific position in the buffer, - * will not jump past end of buffer - * - * @param $index - */ - public function jumpto($index) - { - - $this->index = min($index, $this->length - 1); - } - - /** - * Get the current pointer position - * - * @return int - */ - public function getPosition() - { - - return $this->index; - } - - /** - * Read from buffer until delimiter is reached - * - * If not found, return everything - * - * @param string $delim - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function readString($delim = "\x00") - { - - // Get position of delimiter - $len = strpos($this->data, $delim, min($this->index, $this->length)); - - // If it is not found then return whole buffer - if ($len === false) { - return $this->read(strlen($this->data) - $this->index); - } - - // Read the string and remove the delimiter - $string = $this->read($len - $this->index); - ++$this->index; - - return $string; - } - - /** - * Reads a pascal string from the buffer - * - * @param int $offset Number of bits to cut off the end - * @param bool $read_offset True if the data after the offset is to be read - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function readPascalString($offset = 0, $read_offset = false) - { - - // Get the proper offset - $len = $this->readInt8(); - $offset = max($len - $offset, 0); - - // Read the data - if ($read_offset) { - return $this->read($offset); - } else { - return substr($this->read($len), 0, $offset); - } - } - - /** - * Read from buffer until any of the delimiters is reached - * - * If not found, return everything - * - * @param $delims - * @param null $delimfound - * - * @return string - * @throws \GameQ\Exception\Protocol - * - * @todo: Check to see if this is even used anymore - */ - public function readStringMulti($delims, &$delimfound = null) - { - - // Get position of delimiters - $pos = []; - foreach ($delims as $delim) { - if ($p = strpos($this->data, $delim, min($this->index, $this->length))) { - $pos[] = $p; - } - } - - // If none are found then return whole buffer - if (empty($pos)) { - return $this->read(strlen($this->data) - $this->index); - } - - // Read the string and remove the delimiter - sort($pos); - $string = $this->read($pos[0] - $this->index); - $delimfound = $this->read(); - - return $string; - } - - /** - * Read an 8-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt8() - { - - $int = unpack('Cint', $this->read(1)); - - return $int['int']; - } - - /** - * Read and 8-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt8Signed() - { - - $int = unpack('cint', $this->read(1)); - - return $int['int']; - } - - /** - * Read a 16-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt16() - { - - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'nint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'vint'; - break; - - default: - $type = 'Sint'; - } - - $int = unpack($type, $this->read(2)); - - return $int['int']; - } - - /** - * Read a 16-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt16Signed() - { - - // Read the data into a string - $string = $this->read(2); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $int = unpack('sint', $string); - - unset($string); - - return $int['int']; - } - - /** - * Read a 32-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt32() - { - - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'Nint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'Vint'; - break; - - default: - $type = 'Lint'; - } - - // Unpack the number - $int = unpack($type, $this->read(4)); - - return $int['int']; - } - - /** - * Read a 32-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt32Signed() - { - - // Read the data into a string - $string = $this->read(4); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $int = unpack('lint', $string); - - unset($string); - - return $int['int']; - } - - /** - * Read a 64-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt64() - { - - // We have the pack 64-bit codes available. See: http://php.net/manual/en/function.pack.php - if (version_compare(PHP_VERSION, '5.6.3') >= 0 && PHP_INT_SIZE == 8) { - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'Jint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'Pint'; - break; - - default: - $type = 'Qint'; - } - - $int64 = unpack($type, $this->read(8)); - - $int = $int64['int']; - - unset($int64); - } else { - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $high = $this->readInt32(); - $low = $this->readInt32(); - } else { - $low = $this->readInt32(); - $high = $this->readInt32(); - } - - // We have to determine the number via bitwise - $int = ($high << 32) | $low; - - unset($low, $high); - } - - return $int; - } - - /** - * Read a 32-bit float - * - * @return float - * @throws \GameQ\Exception\Protocol - */ - public function readFloat32() - { - - // Read the data into a string - $string = $this->read(4); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $float = unpack('ffloat', $string); - - unset($string); - - return $float['float']; - } -} diff --git a/GameQ/src/GameQ/Exception/Protocol.php b/GameQ/src/GameQ/Exception/Protocol.php deleted file mode 100644 index 035fc6d..0000000 --- a/GameQ/src/GameQ/Exception/Protocol.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Protocol extends \Exception -{ -} diff --git a/GameQ/src/GameQ/Exception/Query.php b/GameQ/src/GameQ/Exception/Query.php deleted file mode 100644 index cc69f39..0000000 --- a/GameQ/src/GameQ/Exception/Query.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Query extends \Exception -{ -} diff --git a/GameQ/src/GameQ/Exception/Server.php b/GameQ/src/GameQ/Exception/Server.php deleted file mode 100644 index 4024551..0000000 --- a/GameQ/src/GameQ/Exception/Server.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Server extends \Exception -{ -} diff --git a/GameQ/src/GameQ/Filters/Base.php b/GameQ/src/GameQ/Filters/Base.php deleted file mode 100644 index 1a3f4e5..0000000 --- a/GameQ/src/GameQ/Filters/Base.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Abstract base class which all filters must inherit - * - * @author Austin Bischoff - */ -abstract class Base -{ - - /** - * Holds the options for this instance of the filter - * - * @type array - */ - protected $options = []; - - /** - * Construct - * - * @param array $options - */ - public function __construct(array $options = []) - { - - $this->options = $options; - } - - /** - * Apply the filter to the data - * - * @param array $result - * @param \GameQ\Server $server - * - * @return mixed - */ - abstract public function apply(array $result, Server $server); -} diff --git a/GameQ/src/GameQ/Filters/Normalize.php b/GameQ/src/GameQ/Filters/Normalize.php deleted file mode 100644 index 5771c92..0000000 --- a/GameQ/src/GameQ/Filters/Normalize.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Normalize - * - * @package GameQ\Filters - */ -class Normalize extends Base -{ - - /** - * Holds the protocol specific normalize information - * - * @type array - */ - protected $normalize = []; - - /** - * Apply this filter - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - // No result passed so just return - if (empty($result)) { - return $result; - } - - //$data = [ ]; - //$data['raw'][$server->id()] = $result; - - // Grab the normalize for this protocol for the specific server - $this->normalize = $server->protocol()->getNormalize(); - - // Do general information - $result = array_merge($result, $this->check('general', $result)); - - // Do player information - if (isset($result['players']) && count($result['players']) > 0) { - // Iterate - foreach ($result['players'] as $key => $player) { - $result['players'][$key] = array_merge($player, $this->check('player', $player)); - } - } else { - $result['players'] = []; - } - - // Do team information - if (isset($result['teams']) && count($result['teams']) > 0) { - // Iterate - foreach ($result['teams'] as $key => $team) { - $result['teams'][$key] = array_merge($team, $this->check('team', $team)); - } - } else { - $result['teams'] = []; - } - - //$data['filtered'][$server->id()] = $result; - /*file_put_contents( - sprintf('%s/../../../tests/Filters/Providers/Normalize/%s_1.json', __DIR__, $server->protocol()->getProtocol()), - json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) - );*/ - - // Return the normalized result - return $result; - } - - /** - * Check a section for normalization - * - * @param $section - * @param $data - * - * @return array - */ - protected function check($section, $data) - { - - // Normalized return array - $normalized = []; - - if (isset($this->normalize[$section]) && !empty($this->normalize[$section])) { - foreach ($this->normalize[$section] as $property => $raw) { - // Default the value for the new key as null - $value = null; - - if (is_array($raw)) { - // Iterate over the raw property we want to use - foreach ($raw as $check) { - if (array_key_exists($check, $data)) { - $value = $data[$check]; - break; - } - } - } else { - // String - if (array_key_exists($raw, $data)) { - $value = $data[$raw]; - } - } - - $normalized['gq_' . $property] = $value; - } - } - - return $normalized; - } -} diff --git a/GameQ/src/GameQ/Filters/Secondstohuman.php b/GameQ/src/GameQ/Filters/Secondstohuman.php deleted file mode 100644 index 1b413f7..0000000 --- a/GameQ/src/GameQ/Filters/Secondstohuman.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Secondstohuman - * - * This class converts seconds into a human readable time string 'hh:mm:ss'. This is mainly for converting - * a player's connected time into a readable string. Note that most game servers DO NOT return a player's connected - * time. Source (A2S) based games generally do but not always. This class can also be used to convert other time - * responses into readable time - * - * @package GameQ\Filters - * @author Austin Bischoff - */ -class Secondstohuman extends Base -{ - - /** - * The options key for setting the data key(s) to look for to convert - */ - const OPTION_TIMEKEYS = 'timekeys'; - - /** - * The result key added when applying this filter to a result - */ - const RESULT_KEY = 'gq_%s_human'; - - /** - * Holds the default 'time' keys from the response array. This is key is usually 'time' from A2S responses - * - * @var array - */ - protected $timeKeysDefault = ['time']; - - /** - * Secondstohuman constructor. - * - * @param array $options - */ - public function __construct(array $options = []) - { - // Check for passed keys - if (!array_key_exists(self::OPTION_TIMEKEYS, $options)) { - // Use default - $options[self::OPTION_TIMEKEYS] = $this->timeKeysDefault; - } else { - // Used passed key(s) and make sure it is an array - $options[self::OPTION_TIMEKEYS] = (!is_array($options[self::OPTION_TIMEKEYS])) ? - [$options[self::OPTION_TIMEKEYS]] : $options[self::OPTION_TIMEKEYS]; - } - - parent::__construct($options); - } - - /** - * Apply this filter to the result data - * - * @param array $result - * @param Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - // Send the results off to be iterated and return the updated result - return $this->iterate($result); - } - - /** - * Home grown iterate function. Would like to replace this with an internal PHP method(s) but could not find a way - * to make the iterate classes add new keys to the response. They all seemed to be read-only. - * - * @todo: See if there is a more internal way of handling this instead of foreach looping and recursive calling - * - * @param array $result - * - * @return array - */ - protected function iterate(array &$result) - { - // Iterate over the results - foreach ($result as $key => $value) { - // Offload to itself if we have another array - if (is_array($value)) { - // Iterate and update the result - $result[$key] = $this->iterate($value); - } elseif (in_array($key, $this->options[self::OPTION_TIMEKEYS])) { - // Make sure the value is a float (throws E_WARNING in PHP 7.1+) - $value = floatval($value); - // We match one of the keys we are wanting to convert so add it and move on - $result[sprintf(self::RESULT_KEY, $key)] = sprintf( - "%02d:%02d:%02d", - floor($value / 3600), - ($value / 60) % 60, - $value % 60 - ); - } - } - - return $result; - } -} diff --git a/GameQ/src/GameQ/Filters/Stripcolors.php b/GameQ/src/GameQ/Filters/Stripcolors.php deleted file mode 100644 index 5895304..0000000 --- a/GameQ/src/GameQ/Filters/Stripcolors.php +++ /dev/null @@ -1,115 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Strip Colors - * - * Strip color codes from UT and Quake based games - * - * @package GameQ\Filters - */ -class Stripcolors extends Base -{ - - /** - * Apply this filter - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - // No result passed so just return - if (empty($result)) { - return $result; - } - - //$data = []; - //$data['raw'][ $server->id() ] = $result; - - // Switch based on the base (not game) protocol - switch ($server->protocol()->getProtocol()) { - case 'quake2': - case 'quake3': - case 'doom3': - array_walk_recursive($result, [$this, 'stripQuake']); - break; - case 'unreal2': - case 'ut3': - case 'gamespy3': //not sure if gamespy3 supports ut colors but won't hurt - case 'gamespy2': - array_walk_recursive($result, [$this, 'stripUnreal']); - break; - case 'source': - array_walk_recursive($result, [$this, 'stripSource']); - break; - } - - /*$data['filtered'][ $server->id() ] = $result; - file_put_contents( - sprintf( - '%s/../../../tests/Filters/Providers/Stripcolors\%s_1.json', - __DIR__, - $server->protocol()->getProtocol() - ), - json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) - );*/ - - // Return the stripped result - return $result; - } - - /** - * Strip color codes from quake based games - * - * @param string $string - */ - protected function stripQuake(&$string) - { - $string = preg_replace('#(\^.)#', '', $string); - } - - /** - * Strip color codes from Unreal based games - * - * @param string $string - */ - protected function stripUnreal(&$string) - { - $string = preg_replace('/\x1b.../', '', $string); - } - - /** - * Strip color codes from Source based games - * - * @param string $string - */ - protected function stripSource(&$string) - { - $string = strip_tags($string); - } -} diff --git a/GameQ/src/GameQ/Filters/Test.php b/GameQ/src/GameQ/Filters/Test.php deleted file mode 100644 index 836ddf3..0000000 --- a/GameQ/src/GameQ/Filters/Test.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Test - * - * This is a test filter to be used for testing purposes only. - * - * @package GameQ\Filters - */ -class Test extends Base -{ - /** - * Apply the filter. For this we just return whatever is sent - * - * @SuppressWarnings(PHPMD) - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - return $result; - } -} diff --git a/GameQ/src/GameQ/GameQ.php b/GameQ/src/GameQ/GameQ.php deleted file mode 100644 index d3dd9ea..0000000 --- a/GameQ/src/GameQ/GameQ.php +++ /dev/null @@ -1,649 +0,0 @@ -. - */ - -namespace GameQ; - -use GameQ\Exception\Protocol as ProtocolException; -use GameQ\Exception\Query as QueryException; - -/** - * Base GameQ Class - * - * This class should be the only one that is included when you use GameQ to query - * any games servers. - * - * Requirements: See wiki or README for more information on the requirements - * - PHP 5.4.14+ - * * Bzip2 - http://www.php.net/manual/en/book.bzip2.php - * - * @author Austin Bischoff - * - * @property bool $debug - * @property string $capture_packets_file - * @property int $stream_timeout - * @property int $timeout - * @property int $write_wait - */ -class GameQ -{ - /* - * Constants - */ - const PROTOCOLS_DIRECTORY = __DIR__ . '/Protocols'; - - /* Static Section */ - - /** - * Holds the instance of itself - * - * @type self - */ - protected static $instance = null; - - /** - * Create a new instance of this class - * - * @return \GameQ\GameQ - */ - public static function factory() - { - - // Create a new instance - self::$instance = new self(); - - // Return this new instance - return self::$instance; - } - - /* Dynamic Section */ - - /** - * Default options - * - * @type array - */ - protected $options = [ - 'debug' => false, - 'timeout' => 3, // Seconds - 'filters' => [ - // Default normalize - 'normalize_d751713988987e9331980363e24189ce' => [ - 'filter' => 'normalize', - 'options' => [], - ], - ], - // Advanced settings - 'stream_timeout' => 200000, // See http://www.php.net/manual/en/function.stream-select.php for more info - 'write_wait' => 500, - // How long (in micro-seconds) to pause between writing to server sockets, helps cpu usage - - // Used for generating protocol test data - 'capture_packets_file' => null, - ]; - - /** - * Array of servers being queried - * - * @type array - */ - protected $servers = []; - - /** - * The query library to use. Default is Native - * - * @type string - */ - protected $queryLibrary = 'GameQ\\Query\\Native'; - - /** - * Holds the instance of the queryLibrary - * - * @type \GameQ\Query\Core|null - */ - protected $query = null; - - /** - * GameQ constructor. - * - * Do some checks as needed so this will operate - */ - public function __construct() - { - // Check for missing utf8_encode function - if (!function_exists('utf8_encode')) { - throw new \Exception("PHP's utf8_encode() function is required - " - . "http://php.net/manual/en/function.utf8-encode.php. Check your php installation."); - } - } - - /** - * Get an option's value - * - * @param mixed $option - * - * @return mixed|null - */ - public function __get($option) - { - - return isset($this->options[$option]) ? $this->options[$option] : null; - } - - /** - * Set an option's value - * - * @param mixed $option - * @param mixed $value - * - * @return bool - */ - public function __set($option, $value) - { - - $this->options[$option] = $value; - - return true; - } - - /** - * Chainable call to __set, uses set as the actual setter - * - * @param mixed $var - * @param mixed $value - * - * @return $this - */ - public function setOption($var, $value) - { - - // Use magic - $this->{$var} = $value; - - return $this; // Make chainable - } - - /** - * Add a single server - * - * @param array $server_info - * - * @return $this - */ - public function addServer(array $server_info = []) - { - - // Add and validate the server - $this->servers[uniqid()] = new Server($server_info); - - return $this; // Make calls chainable - } - - /** - * Add multiple servers in a single call - * - * @param array $servers - * - * @return $this - */ - public function addServers(array $servers = []) - { - - // Loop through all the servers and add them - foreach ($servers as $server_info) { - $this->addServer($server_info); - } - - return $this; // Make calls chainable - } - - /** - * Add a set of servers from a file or an array of files. - * Supported formats: - * JSON - * - * @param array $files - * - * @return $this - * @throws \Exception - */ - public function addServersFromFiles($files = []) - { - - // Since we expect an array let us turn a string (i.e. single file) into an array - if (!is_array($files)) { - $files = [$files]; - } - - // Iterate over the file(s) and add them - foreach ($files as $file) { - // Check to make sure the file exists and we can read it - if (!file_exists($file) || !is_readable($file)) { - continue; - } - - // See if this file is JSON - if (($servers = json_decode(file_get_contents($file), true)) === null - && json_last_error() !== JSON_ERROR_NONE - ) { - // Type not supported - continue; - } - - // Add this list of servers - $this->addServers($servers); - } - - return $this; - } - - /** - * Clear all of the defined servers - * - * @return $this - */ - public function clearServers() - { - - // Reset all the servers - $this->servers = []; - - return $this; // Make Chainable - } - - /** - * Add a filter to the processing list - * - * @param string $filterName - * @param array $options - * - * @return $this - */ - public function addFilter($filterName, $options = []) - { - // Create the filter hash so we can run multiple versions of the same filter - $filterHash = sprintf('%s_%s', strtolower($filterName), md5(json_encode($options))); - - // Add the filter - $this->options['filters'][$filterHash] = [ - 'filter' => strtolower($filterName), - 'options' => $options, - ]; - - unset($filterHash); - - return $this; - } - - /** - * Remove an added filter - * - * @param string $filterHash - * - * @return $this - */ - public function removeFilter($filterHash) - { - // Make lower case - $filterHash = strtolower($filterHash); - - // Remove this filter if it has been defined - if (array_key_exists($filterHash, $this->options['filters'])) { - unset($this->options['filters'][$filterHash]); - } - - unset($filterHash); - - return $this; - } - - /** - * Return the list of applied filters - * - * @return array - */ - public function listFilters() - { - return $this->options['filters']; - } - - /** - * Main method used to actually process all of the added servers and return the information - * - * @return array - * @throws \Exception - */ - public function process() - { - - // Initialize the query library we are using - $class = new \ReflectionClass($this->queryLibrary); - - // Set the query pointer to the new instance of the library - $this->query = $class->newInstance(); - - unset($class); - - // Define the return - $results = []; - - // @todo: Add break up into loop to split large arrays into smaller chunks - - // Do server challenge(s) first, if any - $this->doChallenges(); - - // Do packets for server(s) and get query responses - $this->doQueries(); - - // Now we should have some information to process for each server - foreach ($this->servers as $server) { - /* @var $server \GameQ\Server */ - - // Parse the responses for this server - $result = $this->doParseResponse($server); - - // Apply the filters - $result = array_merge($result, $this->doApplyFilters($result, $server)); - - // Sort the keys so they are alphabetical and nicer to look at - ksort($result); - - // Add the result to the results array - $results[$server->id()] = $result; - } - - return $results; - } - - /** - * Do server challenges, where required - */ - protected function doChallenges() - { - - // Initialize the sockets for reading - $sockets = []; - - // By default we don't have any challenges to process - $server_challenge = false; - - // Do challenge packets - foreach ($this->servers as $server_id => $server) { - /* @var $server \GameQ\Server */ - - // This protocol has a challenge packet that needs to be sent - if ($server->protocol()->hasChallenge()) { - // We have a challenge, set the flag - $server_challenge = true; - - // Let's make a clone of the query class - $socket = clone $this->query; - - // Set the information for this query socket - $socket->set( - $server->protocol()->transport(), - $server->ip, - $server->port_query, - $this->timeout - ); - - try { - // Now write the challenge packet to the socket. - $socket->write($server->protocol()->getPacket(Protocol::PACKET_CHALLENGE)); - - // Add the socket information so we can reference it easily - $sockets[(int)$socket->get()] = [ - 'server_id' => $server_id, - 'socket' => $socket, - ]; - } catch (QueryException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - } - - unset($socket); - - // Let's sleep shortly so we are not hammering out calls rapid fire style hogging cpu - usleep($this->write_wait); - } - } - - // We have at least one server with a challenge, we need to listen for responses - if ($server_challenge) { - // Now we need to listen for and grab challenge response(s) - $responses = call_user_func_array( - [$this->query, 'getResponses'], - [$sockets, $this->timeout, $this->stream_timeout] - ); - - // Iterate over the challenge responses - foreach ($responses as $socket_id => $response) { - // Back out the server_id we need to update the challenge response for - $server_id = $sockets[$socket_id]['server_id']; - - // Make this into a buffer so it is easier to manipulate - $challenge = new Buffer(implode('', $response)); - - // Grab the server instance - /* @var $server \GameQ\Server */ - $server = $this->servers[$server_id]; - - // Apply the challenge - $server->protocol()->challengeParseAndApply($challenge); - - // Add this socket to be reused, has to be reused in GameSpy3 for example - $server->socketAdd($sockets[$socket_id]['socket']); - - // Clear - unset($server); - } - } - } - - /** - * Run the actual queries and get the response(s) - */ - protected function doQueries() - { - - // Initialize the array of sockets - $sockets = []; - - // Iterate over the server list - foreach ($this->servers as $server_id => $server) { - /* @var $server \GameQ\Server */ - - // Invoke the beforeSend method - $server->protocol()->beforeSend($server); - - // Get all the non-challenge packets we need to send - $packets = $server->protocol()->getPacket('!' . Protocol::PACKET_CHALLENGE); - - if (count($packets) == 0) { - // Skip nothing else to do for some reason. - continue; - } - - // Try to use an existing socket - if (($socket = $server->socketGet()) === null) { - // Let's make a clone of the query class - $socket = clone $this->query; - - // Set the information for this query socket - $socket->set( - $server->protocol()->transport(), - $server->ip, - $server->port_query, - $this->timeout - ); - } - - try { - // Iterate over all the packets we need to send - foreach ($packets as $packet_data) { - // Now write the packet to the socket. - $socket->write($packet_data); - - // Let's sleep shortly so we are not hammering out calls rapid fire style - usleep($this->write_wait); - } - - unset($packets); - - // Add the socket information so we can reference it easily - $sockets[(int)$socket->get()] = [ - 'server_id' => $server_id, - 'socket' => $socket, - ]; - } catch (QueryException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - - break; - } - - // Clean up the sockets, if any left over - $server->socketCleanse(); - } - - // Now we need to listen for and grab response(s) - $responses = call_user_func_array( - [$this->query, 'getResponses'], - [$sockets, $this->timeout, $this->stream_timeout] - ); - - // Iterate over the responses - foreach ($responses as $socket_id => $response) { - // Back out the server_id - $server_id = $sockets[$socket_id]['server_id']; - - // Grab the server instance - /* @var $server \GameQ\Server */ - $server = $this->servers[$server_id]; - - // Save the response from this packet - $server->protocol()->packetResponse($response); - - unset($server); - } - - // Now we need to close all of the sockets - foreach ($sockets as $socketInfo) { - /* @var $socket \GameQ\Query\Core */ - $socket = $socketInfo['socket']; - - // Close the socket - $socket->close(); - - unset($socket); - } - - unset($sockets); - } - - /** - * Parse the response for a specific server - * - * @param \GameQ\Server $server - * - * @return array - * @throws \Exception - */ - protected function doParseResponse(Server $server) - { - - try { - // @codeCoverageIgnoreStart - // We want to save this server's response to a file (useful for unit testing) - if (!is_null($this->capture_packets_file)) { - file_put_contents( - $this->capture_packets_file, - implode(PHP_EOL . '||' . PHP_EOL, $server->protocol()->packetResponse()) - ); - } - // @codeCoverageIgnoreEnd - - // Get the server response - $results = $server->protocol()->processResponse(); - - // Check for online before we do anything else - $results['gq_online'] = (count($results) > 0); - } catch (ProtocolException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - - // We ignore this server - $results = [ - 'gq_online' => false, - ]; - } - - // Now add some default stuff - $results['gq_address'] = (isset($results['gq_address'])) ? $results['gq_address'] : $server->ip(); - $results['gq_port_client'] = $server->portClient(); - $results['gq_port_query'] = (isset($results['gq_port_query'])) ? $results['gq_port_query'] : $server->portQuery(); - $results['gq_protocol'] = $server->protocol()->getProtocol(); - $results['gq_type'] = (string)$server->protocol(); - $results['gq_name'] = $server->protocol()->nameLong(); - $results['gq_transport'] = $server->protocol()->transport(); - - // Process the join link - if (!isset($results['gq_joinlink']) || empty($results['gq_joinlink'])) { - $results['gq_joinlink'] = $server->getJoinLink(); - } - - return $results; - } - - /** - * Apply any filters to the results - * - * @param array $results - * @param \GameQ\Server $server - * - * @return array - */ - protected function doApplyFilters(array $results, Server $server) - { - - // Loop over the filters - foreach ($this->options['filters'] as $filterOptions) { - // Try to do this filter - try { - // Make a new reflection class - $class = new \ReflectionClass(sprintf('GameQ\\Filters\\%s', ucfirst($filterOptions['filter']))); - - // Create a new instance of the filter class specified - $filter = $class->newInstanceArgs([$filterOptions['options']]); - - // Apply the filter to the data - $results = $filter->apply($results, $server); - } catch (\ReflectionException $e) { - // Invalid, skip it - continue; - } - } - - return $results; - } -} diff --git a/GameQ/src/GameQ/Protocol.php b/GameQ/src/GameQ/Protocol.php deleted file mode 100644 index 6d94a45..0000000 --- a/GameQ/src/GameQ/Protocol.php +++ /dev/null @@ -1,500 +0,0 @@ -. - * - * - */ - -namespace GameQ; - -/** - * Handles the core functionality for the protocols - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - * - * @author Austin Bischoff - */ -abstract class Protocol -{ - - /** - * Constants for class states - */ - const STATE_TESTING = 1; - - const STATE_BETA = 2; - - const STATE_STABLE = 3; - - const STATE_DEPRECATED = 4; - - /** - * Constants for packet keys - */ - const PACKET_ALL = 'all'; // Some protocols allow all data to be sent back in one call. - - const PACKET_BASIC = 'basic'; - - const PACKET_CHALLENGE = 'challenge'; - - const PACKET_CHANNELS = 'channels'; // Voice servers - - const PACKET_DETAILS = 'details'; - - const PACKET_INFO = 'info'; - - const PACKET_PLAYERS = 'players'; - - const PACKET_STATUS = 'status'; - - const PACKET_RULES = 'rules'; - - const PACKET_VERSION = 'version'; - - /** - * Transport constants - */ - const TRANSPORT_UDP = 'udp'; - - const TRANSPORT_TCP = 'tcp'; - - const TRANSPORT_SSL = 'ssl'; - - const TRANSPORT_TLS = 'tls'; - - /** - * Short name of the protocol - * - * @type string - */ - protected $name = 'unknown'; - - /** - * The longer, fancier name for the protocol - * - * @type string - */ - protected $name_long = 'unknown'; - - /** - * The difference between the client port and query port - * - * @type int - */ - protected $port_diff = 0; - - /** - * The transport method to use to actually send the data - * Default is UDP - * - * @type string - */ - protected $transport = self::TRANSPORT_UDP; - - /** - * The protocol type used when querying the server - * - * @type string - */ - protected $protocol = 'unknown'; - - /** - * Holds the valid packet types this protocol has available. - * - * @type array - */ - protected $packets = []; - - /** - * Holds the response headers and the method to use to process them. - * - * @type array - */ - protected $responses = []; - - /** - * Holds the list of methods to run when parsing the packet response(s) data. These - * methods should provide all the return information. - * - * @type array - */ - protected $process_methods = []; - - /** - * The packet responses received - * - * @type array - */ - protected $packets_response = []; - - /** - * Holds the instance of the result class - * - * @type null - */ - protected $result = null; - - /** - * Options for this protocol - * - * @type array - */ - protected $options = []; - - /** - * Define the state of this class - * - * @type int - */ - protected $state = self::STATE_STABLE; - - /** - * Holds specific normalize settings - * - * @todo: Remove this ugly bulk by moving specific ones to their specific game(s) - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => [ - 'listenserver', - 'dedic', - 'bf2dedicated', - 'netserverdedicated', - 'bf2142dedicated', - 'dedicated', - ], - 'gametype' => ['ggametype', 'sigametype', 'matchtype'], - 'hostname' => ['svhostname', 'servername', 'siname', 'name'], - 'mapname' => ['map', 'simap'], - 'maxplayers' => ['svmaxclients', 'simaxplayers', 'maxclients', 'max_players'], - 'mod' => ['game', 'gamedir', 'gamevariant'], - 'numplayers' => ['clients', 'sinumplayers', 'num_players'], - 'password' => ['protected', 'siusepass', 'sineedpass', 'pswrd', 'gneedpass', 'auth', 'passsord'], - ], - // Indvidual - 'player' => [ - 'name' => ['nick', 'player', 'playername', 'name'], - 'kills' => ['kills'], - 'deaths' => ['deaths'], - 'score' => ['kills', 'frags', 'skill', 'score'], - 'ping' => ['ping'], - ], - // Team - 'team' => [ - 'name' => ['name', 'teamname', 'team_t'], - 'score' => ['score', 'score_t'], - ], - ]; - - /** - * Quick join link - * - * @type string - */ - protected $join_link = ''; - - /** - * @param array $options - */ - public function __construct(array $options = []) - { - - // Set the options for this specific instance of the class - $this->options = $options; - } - - /** - * String name of this class - * - * @return string - */ - public function __toString() - { - - return $this->name; - } - - /** - * Get the port difference between the server's client (game) and query ports - * - * @return int - */ - public function portDiff() - { - - return $this->port_diff; - } - - /** - * "Find" the query port based off of the client port and port_diff - * - * This method is meant to be overloaded for more complex maths or lookup tables - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - - return $clientPort + $this->port_diff; - } - - /** - * Return the join_link as defined by the protocol class - * - * @return string - */ - public function joinLink() - { - - return $this->join_link; - } - - /** - * Short (callable) name of this class - * - * @return string - */ - public function name() - { - - return $this->name; - } - - /** - * Long name of this class - * - * @return string - */ - public function nameLong() - { - - return $this->name_long; - } - - /** - * Return the status of this Protocol Class - * - * @return int - */ - public function state() - { - - return $this->state; - } - - /** - * Return the protocol property - * - * @return string - */ - public function getProtocol() - { - - return $this->protocol; - } - - /** - * Get/set the transport type for this protocol - * - * @param string|null $type - * - * @return string - */ - public function transport($type = null) - { - - // Act as setter - if (!is_null($type)) { - $this->transport = $type; - } - - return $this->transport; - } - - /** - * Set the options for the protocol call - * - * @param array $options - * - * @return array - */ - public function options($options = []) - { - - // Act as setter - if (!empty($options)) { - $this->options = $options; - } - - return $this->options; - } - - - /* - * Packet Section - */ - - /** - * Return specific packet(s) - * - * @param array $type - * - * @return array - */ - public function getPacket($type = []) - { - - $packets = []; - - - // We want an array of packets back - if (is_array($type) && !empty($type)) { - // Loop the packets - foreach ($this->packets as $packet_type => $packet_data) { - // We want this packet - if (in_array($packet_type, $type)) { - $packets[$packet_type] = $packet_data; - } - } - } elseif ($type == '!challenge') { - // Loop the packets - foreach ($this->packets as $packet_type => $packet_data) { - // Dont want challenge packets - if ($packet_type != self::PACKET_CHALLENGE) { - $packets[$packet_type] = $packet_data; - } - } - } elseif (is_string($type)) { - // Return specific packet type - $packets = $this->packets[$type]; - } else { - // Return all packets - $packets = $this->packets; - } - - // Return the packets - return $packets; - } - - /** - * Get/set the packet response - * - * @param array|null $response - * - * @return array - */ - public function packetResponse(array $response = null) - { - - // Act as setter - if (!empty($response)) { - $this->packets_response = $response; - } - - return $this->packets_response; - } - - - /* - * Challenge section - */ - - /** - * Determine whether or not this protocol has a challenge needed before querying - * - * @return bool - */ - public function hasChallenge() - { - - return (isset($this->packets[self::PACKET_CHALLENGE]) && !empty($this->packets[self::PACKET_CHALLENGE])); - } - - /** - * Parse the challenge response and add it to the buffer items that need it. - * This should be overloaded by extending class - * - * @codeCoverageIgnore - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - - return true; - } - - /** - * Apply the challenge string to all the packets that need it. - * - * @param string $challenge_string - * - * @return bool - */ - protected function challengeApply($challenge_string) - { - - // Let's loop through all the packets and append the challenge where it is needed - foreach ($this->packets as $packet_type => $packet) { - $this->packets[$packet_type] = sprintf($packet, $challenge_string); - } - - return true; - } - - /** - * Get the normalize settings for the protocol - * - * @return array - */ - public function getNormalize() - { - - return $this->normalize; - } - - /* - * General - */ - - /** - * Generic method to allow protocol classes to do work right before the query is sent - * - * @codeCoverageIgnore - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param \GameQ\Server $server - */ - public function beforeSend(Server $server) - { - } - - /** - * Method called to process query response data. Each extending class has to have one of these functions. - * - * @return mixed - */ - abstract public function processResponse(); -} diff --git a/GameQ/src/GameQ/Protocols/Aa3.php b/GameQ/src/GameQ/Protocols/Aa3.php deleted file mode 100644 index 6ffd412..0000000 --- a/GameQ/src/GameQ/Protocols/Aa3.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Aa3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Aa3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'aa3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "America's Army 3"; - - /** - * Query port = client_port + 18243 - * - * client_port default 8777 - * query_port default 27020 - * - * @type int - */ - protected $port_diff = 18243; -} diff --git a/GameQ/src/GameQ/Protocols/Aapg.php b/GameQ/src/GameQ/Protocols/Aapg.php deleted file mode 100644 index a207d4f..0000000 --- a/GameQ/src/GameQ/Protocols/Aapg.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Aapg - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Aapg extends Aa3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'aapg'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "America's Army: Proving Grounds"; -} diff --git a/GameQ/src/GameQ/Protocols/Arkse.php b/GameQ/src/GameQ/Protocols/Arkse.php deleted file mode 100644 index 3193c5a..0000000 --- a/GameQ/src/GameQ/Protocols/Arkse.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class ARK: Survival Evolved - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Arkse extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arkse'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "ARK: Survival Evolved"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/GameQ/src/GameQ/Protocols/Arma.php b/GameQ/src/GameQ/Protocols/Arma.php deleted file mode 100644 index 2653872..0000000 --- a/GameQ/src/GameQ/Protocols/Arma.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Arma - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Arma extends Gamespy2 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arma'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "ArmA Armed Assault"; -} diff --git a/GameQ/src/GameQ/Protocols/Arma3.php b/GameQ/src/GameQ/Protocols/Arma3.php deleted file mode 100644 index 2718587..0000000 --- a/GameQ/src/GameQ/Protocols/Arma3.php +++ /dev/null @@ -1,181 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Armed Assault 3 - * - * Rules protocol reference: https://community.bistudio.com/wiki/Arma_3_ServerBrowserProtocol2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - * @author Memphis017 - */ -class Arma3 extends Source -{ - /** - * Defines the names for the specific game DLCs - * - * @var array - */ - protected $dlcNames = [ - 'af82811b' => 'Karts', - '94f76a1a' => 'Marksmen', - 'd0356eec' => 'Helicopters', - '19984a71' => 'Zeus', - '7fb4b1f3' => 'Apex', - '49c2c12b' => 'Jets', - '7e766e18' => 'Laws of War', - '99d71f90' => 'Malden', - 'a8b10cdf' => 'Tac-Ops', - '37680ce8' => 'Tanks', - '43f9c377' => 'Contact', - 'c4979557' => 'Enoch', - ]; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arma3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Arma3"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Process the rules since Arma3 changed their response for rules - * - * @param Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processRules(Buffer $buffer) - { - // Total number of packets, burn it - $buffer->readInt16(); - - // Will hold the data string - $data = ''; - - // Loop until we run out of strings - while ($buffer->getLength()) { - // Burn the delimiters (i.e. \x01\x04\x00) - $buffer->readString(); - - // Add the data to the string, we are reassembling it - $data .= $buffer->readString(); - } - - // Restore escaped sequences - $data = str_replace(["\x01\x01", "\x01\x02", "\x01\x03"], ["\x01", "\x00", "\xFF"], $data); - - // Make a new buffer with the reassembled data - $responseBuffer = new Buffer($data); - - // Kill the old buffer, should be empty - unset($buffer, $data); - - // Set the result to a new result instance - $result = new Result(); - - // Get results - $result->add('rules_protocol_version', $responseBuffer->readInt8()); - $result->add('overflow', $responseBuffer->readInt8()); - $dlcBit = decbin($responseBuffer->readInt8()); // Grab DLC bit 1 and use it later - $dlcBit2 = decbin($responseBuffer->readInt8()); // Grab DLC bit 2 and use it later - $dlcCount = substr_count($dlcBit, '1') + substr_count($dlcBit2, '1'); // Count the DLCs - - // Grab difficulty so we can man handle it... - $difficulty = $responseBuffer->readInt8(); - - // Process difficulty - $result->add('3rd_person', $difficulty >> 7); - $result->add('advanced_flight_mode', ($difficulty >> 6) & 1); - $result->add('difficulty_ai', ($difficulty >> 3) & 3); - $result->add('difficulty_level', $difficulty & 3); - - unset($difficulty); - - // Crosshair - $result->add('crosshair', $responseBuffer->readInt8()); - - // Loop over the DLC bit so we can pull in the info for the DLC (if enabled) - for ($x = 0; $x < $dlcCount; $x++) { - $dlcHash = dechex($responseBuffer->readInt32()); - isset($this->dlcNames[$dlcHash]) ? - $result->addSub('dlcs', 'name', $this->dlcNames[$dlcHash]) - : $result->addSub('dlcs', 'name', 'Unknown'); - $result->addSub('dlcs', 'hash', $dlcHash); - } - - // No longer needed - unset($dlcBit, $dlcBit2, $dlcCount, $dlcHash); - - // Grab the mod count - $modCount = $responseBuffer->readInt8(); - - // Add mod count - $result->add('mod_count', $modCount); - - // Loop the mod count and add them - for ($x = 0; $x < $modCount; $x++) { - // Add the mod to the list - $result->addSub('mods', 'hash', dechex($responseBuffer->readInt32())); - $result->addSub('mods', 'steam_id', hexdec($responseBuffer->readPascalString(0, true))); - $result->addSub('mods', 'name', $responseBuffer->readPascalString(0, true)); - } - - unset($modCount, $x); - - // Get the signatures count - $signatureCount = $responseBuffer->readInt8(); - $result->add('signature_count', $signatureCount); - - // Make signatures array - $signatures = []; - - // Loop until we run out of signatures - for ($x = 0; $x < $signatureCount; $x++) { - $signatures[] = $responseBuffer->readPascalString(0, true); - } - - // Add as a simple array - $result->add('signatures', $signatures); - - unset($responseBuffer, $signatureCount, $signatures, $x); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Armedassault2oa.php b/GameQ/src/GameQ/Protocols/Armedassault2oa.php deleted file mode 100644 index e527a38..0000000 --- a/GameQ/src/GameQ/Protocols/Armedassault2oa.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Armedassault2oa - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Armedassault2oa extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = "armedassault2oa"; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Armed Assault 2: Operation Arrowhead"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Armedassault3.php b/GameQ/src/GameQ/Protocols/Armedassault3.php deleted file mode 100644 index 5bbca42..0000000 --- a/GameQ/src/GameQ/Protocols/Armedassault3.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Armed assault 3 dummy Protocol Class - * - * Added for backward compatibility, please update to class arma3 - * - * @deprecated v3.0.10 - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Armedassault3 extends Arma3 -{ -} diff --git a/GameQ/src/GameQ/Protocols/Ase.php b/GameQ/src/GameQ/Protocols/Ase.php deleted file mode 100644 index cb5c6a4..0000000 --- a/GameQ/src/GameQ/Protocols/Ase.php +++ /dev/null @@ -1,208 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * All-Seeing Eye Protocol class - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Ase extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "s", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ase'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ase'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "All-Seeing Eye"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'servername', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'team' => 'team', - 'ping' => 'ping', - 'time' => 'time', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Create a new buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Burn the header - $buffer->skip(4); - - // Create a new result - $result = new Result(); - - // Variables - $result->add('gamename', $buffer->readPascalString(1, true)); - $result->add('port', $buffer->readPascalString(1, true)); - $result->add('servername', $buffer->readPascalString(1, true)); - $result->add('gametype', $buffer->readPascalString(1, true)); - $result->add('map', $buffer->readPascalString(1, true)); - $result->add('version', $buffer->readPascalString(1, true)); - $result->add('password', $buffer->readPascalString(1, true)); - $result->add('num_players', $buffer->readPascalString(1, true)); - $result->add('max_players', $buffer->readPascalString(1, true)); - $result->add('dedicated', 1); - - // Offload the key/value pair processing - $this->processKeyValuePairs($buffer, $result); - - // Offload processing player and team info - $this->processPlayersAndTeams($buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles processing the extra key/value pairs for server settings - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processKeyValuePairs(Buffer &$buffer, Result &$result) - { - - // Key / value pairs - while ($buffer->getLength()) { - $key = $buffer->readPascalString(1, true); - - // If we have an empty key, we've reached the end - if (empty($key)) { - break; - } - - // Otherwise, add the pair - $result->add( - $key, - $buffer->readPascalString(1, true) - ); - } - - unset($key); - } - - /** - * Handles processing the player and team data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - - // Players and team info - while ($buffer->getLength()) { - // Get the flags - $flags = $buffer->readInt8(); - - // Get data according to the flags - if ($flags & 1) { - $result->addPlayer('name', $buffer->readPascalString(1, true)); - } - if ($flags & 2) { - $result->addPlayer('team', $buffer->readPascalString(1, true)); - } - if ($flags & 4) { - $result->addPlayer('skin', $buffer->readPascalString(1, true)); - } - if ($flags & 8) { - $result->addPlayer('score', $buffer->readPascalString(1, true)); - } - if ($flags & 16) { - $result->addPlayer('ping', $buffer->readPascalString(1, true)); - } - if ($flags & 32) { - $result->addPlayer('time', $buffer->readPascalString(1, true)); - } - } - } -} diff --git a/GameQ/src/GameQ/Protocols/Atlas.php b/GameQ/src/GameQ/Protocols/Atlas.php deleted file mode 100644 index 83406ba..0000000 --- a/GameQ/src/GameQ/Protocols/Atlas.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Atlas - * - * @package GameQ\Protocols - * @author Wilson Jesus <> - */ -class Atlas extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'atlas'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Atlas"; - - /** - * query_port = client_port + 51800 - * 57561 = 5761 + 51800 - * - * this is the default value for the stock game server, both ports - * can be independently changed from the stock ones, - * making the port_diff logic useless. - * - * @type int - */ - protected $port_diff = 51800; -} diff --git a/GameQ/src/GameQ/Protocols/Batt1944.php b/GameQ/src/GameQ/Protocols/Batt1944.php deleted file mode 100644 index f0ff38e..0000000 --- a/GameQ/src/GameQ/Protocols/Batt1944.php +++ /dev/null @@ -1,68 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battalion 1944 - * - * @package GameQ\Protocols - * @author TacTicToe66 - */ -class Batt1944 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'batt1944'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battalion 1944"; - - /** - * query_port = client_port + 3 - * - * @type int - */ - protected $port_diff = 3; - - /** - * Normalize main fields - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'bat_gamemode_s', - 'hostname' => 'bat_name_s', - 'mapname' => 'bat_map_s', - 'maxplayers' => 'bat_max_players_i', - 'numplayers' => 'bat_player_count_s', - 'password' => 'bat_has_password_s', - ], - ]; -} diff --git a/GameQ/src/GameQ/Protocols/Bf1942.php b/GameQ/src/GameQ/Protocols/Bf1942.php deleted file mode 100644 index 4cf06c5..0000000 --- a/GameQ/src/GameQ/Protocols/Bf1942.php +++ /dev/null @@ -1,88 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battlefield 1942 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf1942 extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf1942'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 1942"; - - /** - * query_port = client_port + 8433 - * 23000 = 14567 + 8433 - * - * @type int - */ - protected $port_diff = 8433; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "bf1942://%s:%d"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'playername', - 'kills' => 'kills', - 'deaths' => 'deaths', - 'ping' => 'ping', - 'score' => 'score', - ], - 'team' => [ - 'name' => 'teamname', - ], - ]; -} diff --git a/GameQ/src/GameQ/Protocols/Bf2.php b/GameQ/src/GameQ/Protocols/Bf2.php deleted file mode 100644 index 0610f9d..0000000 --- a/GameQ/src/GameQ/Protocols/Bf2.php +++ /dev/null @@ -1,98 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battlefield 2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf2 extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 2"; - - /** - * query_port = client_port + 8433 - * 29900 = 16567 + 13333 - * - * @type int - */ - protected $port_diff = 13333; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "bf2://%s:%d"; - - /** - * BF2 has a different query packet to send than "normal" Gamespy 3 - * - * @var array - */ - protected $packets = [ - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01", - ]; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'kills' => 'score', - 'deaths' => 'deaths', - 'ping' => 'ping', - 'score' => 'score', - ], - 'team' => [ - 'name' => 'team', - 'score' => 'score', - ], - ]; -} diff --git a/GameQ/src/GameQ/Protocols/Bf3.php b/GameQ/src/GameQ/Protocols/Bf3.php deleted file mode 100644 index 9084515..0000000 --- a/GameQ/src/GameQ/Protocols/Bf3.php +++ /dev/null @@ -1,348 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Battlefield 3 Protocol Class - * - * Good place for doc status and info is http://www.fpsadmin.com/forum/showthread.php?t=24134 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf3 extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x00\x00\x00\x21\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - self::PACKET_VERSION => "\x00\x00\x00\x22\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - self::PACKET_PLAYERS => - "\x00\x00\x00\x23\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - 1627389952 => "processDetails", // a - 1644167168 => "processVersion", // b - 1660944384 => "processPlayers", // c - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'bf3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 3"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 22000 - * 47200 = 25200 + 22000 - * - * @type int - */ - protected $port_diff = 22000; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - 'team' => [ - 'score' => 'tickets', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Holds the results sent back - $results = []; - - // Holds the processed packets after having been reassembled - $processed = []; - - // Start up the index for the processed - $sequence_id_last = 0; - - foreach ($this->packets_response as $packet) { - // Create a new buffer - $buffer = new Buffer($packet); - - // Each "good" packet begins with sequence_id (32-bit) - $sequence_id = $buffer->readInt32(); - - // Sequence id is a response - if (array_key_exists($sequence_id, $this->responses)) { - $processed[$sequence_id] = $buffer->getBuffer(); - $sequence_id_last = $sequence_id; - } else { - // This is a continuation of the previous packet, reset the buffer and append - $buffer->jumpto(0); - - // Append - $processed[$sequence_id_last] .= $buffer->getBuffer(); - } - } - - unset($buffer, $sequence_id_last, $sequence_id); - - // Iterate over the combined packets and do some work - foreach ($processed as $sequence_id => $data) { - // Create a new buffer - $buffer = new Buffer($data); - - // Get the length of the packet - $packetLength = $buffer->getLength(); - - // Check to make sure the expected length matches the real length - // Subtract 4 for the sequence_id pulled out earlier - if ($packetLength != ($buffer->readInt32() - 4)) { - throw new Exception(__METHOD__ . " packet length does not match expected length!"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$sequence_id]], [$buffer]) - ); - } - - return $results; - } - - /* - * Internal Methods - */ - - /** - * Decode the buffer into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function decode(Buffer $buffer) - { - - $items = []; - - // Get the number of words in this buffer - $itemCount = $buffer->readInt32(); - - // Loop over the number of items - for ($i = 0; $i < $itemCount; $i++) { - // Length of the string - $buffer->readInt32(); - - // Just read the string - $items[$i] = $buffer->readString(); - } - - return $items; - } - - /** - * Process the server details - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int)$items[2]); - $result->add('max_players', (int)$items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int)$items[6]); - $result->add('roundstotal', (int)$items[7]); - $result->add('num_teams', (int)$items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int)$items[$index_current]); - $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty - $result->add('ranked', (int)$items[$index_current + 2]); - $result->add('punkbuster', (int)$items[$index_current + 3]); - $result->add('password', (int)$items[$index_current + 4]); - $result->add('uptime', (int)$items[$index_current + 5]); - $result->add('roundtime', (int)$items[$index_current + 6]); - // Added in R9 - $result->add('ip_port', $items[$index_current + 7]); - $result->add('punkbuster_version', $items[$index_current + 8]); - $result->add('join_queue', (int)$items[$index_current + 9]); - $result->add('region', $items[$index_current + 10]); - $result->add('pingsite', $items[$index_current + 11]); - $result->add('country', $items[$index_current + 12]); - // Added in R29, No docs as of yet - $result->add('quickmatch', (int)$items[$index_current + 13]); // Guessed from research - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } - - /** - * Process the server version - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processVersion(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - $result->add('version', $items[2]); - - unset($buffer, $items); - - return $result->fetch(); - } - - /** - * Process the players - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Number of data points per player - $numTags = $items[1]; - - // Grab the tags for each player - $tags = array_slice($items, 2, $numTags); - - // Get the player count - $playerCount = $items[$numTags + 2]; - - // Iterate over the index until we run out of players - for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { - // Loop over the player tags and extract the info for that tag - foreach ($tags as $index => $tag) { - $result->addPlayer($tag, $items[($x + $index)]); - } - } - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Bf4.php b/GameQ/src/GameQ/Protocols/Bf4.php deleted file mode 100644 index 6951752..0000000 --- a/GameQ/src/GameQ/Protocols/Bf4.php +++ /dev/null @@ -1,114 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Battlefield 4 Protocol class - * - * Good place for doc status and info is http://battlelog.battlefield.com/bf4/forum/view/2955064768683911198/ - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf4 extends Bf3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 4"; - - /** - * Handle processing details since they are different than BF3 - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int) $items[2]); - $result->add('max_players', (int) $items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int) $items[6]); - $result->add('roundstotal', (int) $items[7]); - $result->add('num_teams', (int) $items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int) $items[$index_current]); - $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty - $result->add('ranked', (int) $items[$index_current + 2]); - $result->add('punkbuster', (int) $items[$index_current + 3]); - $result->add('password', (int) $items[$index_current + 4]); - $result->add('uptime', (int) $items[$index_current + 5]); - $result->add('roundtime', (int) $items[$index_current + 6]); - $result->add('ip_port', $items[$index_current + 7]); - $result->add('punkbuster_version', $items[$index_current + 8]); - $result->add('join_queue', (int) $items[$index_current + 9]); - $result->add('region', $items[$index_current + 10]); - $result->add('pingsite', $items[$index_current + 11]); - $result->add('country', $items[$index_current + 12]); - //$result->add('quickmatch', (int) $items[$index_current + 13]); Supposed to be here according to R42 but is not - $result->add('blaze_player_count', (int) $items[$index_current + 13]); - $result->add('blaze_game_state', (int) $items[$index_current + 14]); - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Bfbc2.php b/GameQ/src/GameQ/Protocols/Bfbc2.php deleted file mode 100644 index b7167a0..0000000 --- a/GameQ/src/GameQ/Protocols/Bfbc2.php +++ /dev/null @@ -1,326 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Battlefield Bad Company 2 Protocol Class - * - * NOTE: There are no qualifiers to the response packets sent back from the server as to which response packet - * belongs to which query request. For now this class assumes the responses are in the same order as the order in - * which the packets were sent to the server. If this assumption turns out to be wrong there is easy way to tell which - * response belongs to which query. Hopefully this assumption will hold true as it has in my testing. - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bfbc2 extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_VERSION => "\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - self::PACKET_STATUS => "\x00\x00\x00\x00\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - self::PACKET_PLAYERS => "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "processVersion", - "processDetails", - "processPlayers", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'bfbc2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bfbc2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield Bad Company 2"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 29321 - * 48888 = 19567 + 29321 - * - * @type int - */ - protected $port_diff = 29321; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - 'team' => [ - 'score' => 'tickets', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - //print_r($this->packets_response); - - // Holds the results sent back - $results = []; - - // Iterate over the response packets - // @todo: This protocol has no packet ordering, ids or anyway to identify which packet coming back belongs to which initial call. - foreach ($this->packets_response as $i => $packet) { - // Create a new buffer - $buffer = new Buffer($packet); - - // Burn first 4 bytes, same across all packets - $buffer->skip(4); - - // Get the packet length - $packetLength = $buffer->getLength(); - - // Check to make sure the expected length matches the real length - // Subtract 4 for the header burn - if ($packetLength != ($buffer->readInt32() - 4)) { - throw new Exception(__METHOD__ . " packet length does not match expected length!"); - } - - // We assume the packets are coming back in the same order as sent, this maybe incorrect... - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$i]], [$buffer]) - ); - } - - unset($buffer, $packetLength); - - return $results; - } - - /* - * Internal Methods - */ - - /** - * Decode the buffer into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function decode(Buffer $buffer) - { - - $items = []; - - // Get the number of words in this buffer - $itemCount = $buffer->readInt32(); - - // Loop over the number of items - for ($i = 0; $i < $itemCount; $i++) { - // Length of the string - $buffer->readInt32(); - - // Just read the string - $items[$i] = $buffer->readString(); - } - - return $items; - } - - /** - * Process the server details - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int)$items[2]); - $result->add('max_players', (int)$items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int)$items[6]); - $result->add('roundstotal', (int)$items[7]); - $result->add('num_teams', (int)$items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int)$items[$index_current]); - $result->add('online', 1); // Forced true, shows accepting players - $result->add('ranked', (($items[$index_current + 2] == 'true') ? 1 : 0)); - $result->add('punkbuster', (($items[$index_current + 3] == 'true') ? 1 : 0)); - $result->add('password', (($items[$index_current + 4] == 'true') ? 1 : 0)); - $result->add('uptime', (int)$items[$index_current + 5]); - $result->add('roundtime', (int)$items[$index_current + 6]); - $result->add('mod', $items[$index_current + 7]); - - $result->add('ip_port', $items[$index_current + 9]); - $result->add('punkbuster_version', $items[$index_current + 10]); - $result->add('join_queue', (($items[$index_current + 11] == 'true') ? 1 : 0)); - $result->add('region', $items[$index_current + 12]); - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } - - /** - * Process the server version - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processVersion(Buffer $buffer) - { - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - $result->add('version', $items[2]); - - unset($buffer, $items); - - return $result->fetch(); - } - - /** - * Process the players - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Number of data points per player - $numTags = $items[1]; - - // Grab the tags for each player - $tags = array_slice($items, 2, $numTags); - - // Get the player count - $playerCount = $items[$numTags + 2]; - - // Iterate over the index until we run out of players - for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { - // Loop over the player tags and extract the info for that tag - foreach ($tags as $index => $tag) { - $result->addPlayer($tag, $items[($x + $index)]); - } - } - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Bfh.php b/GameQ/src/GameQ/Protocols/Bfh.php deleted file mode 100644 index 067d77f..0000000 --- a/GameQ/src/GameQ/Protocols/Bfh.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Battlefield Hardline Protocol class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bfh extends Bf4 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bfh'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield Hardline"; -} diff --git a/GameQ/src/GameQ/Protocols/Brink.php b/GameQ/src/GameQ/Protocols/Brink.php deleted file mode 100644 index 2022652..0000000 --- a/GameQ/src/GameQ/Protocols/Brink.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Brink - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Brink extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'brink'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Brink"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Cod.php b/GameQ/src/GameQ/Protocols/Cod.php deleted file mode 100644 index 2425ea6..0000000 --- a/GameQ/src/GameQ/Protocols/Cod.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty Protocol Class - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Cod extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty"; -} diff --git a/GameQ/src/GameQ/Protocols/Cod2.php b/GameQ/src/GameQ/Protocols/Cod2.php deleted file mode 100644 index 79be7ca..0000000 --- a/GameQ/src/GameQ/Protocols/Cod2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty 2 Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cod2 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty 2"; -} diff --git a/GameQ/src/GameQ/Protocols/Cod4.php b/GameQ/src/GameQ/Protocols/Cod4.php deleted file mode 100644 index 9838d9c..0000000 --- a/GameQ/src/GameQ/Protocols/Cod4.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty 4 Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cod4 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty 4"; -} diff --git a/GameQ/src/GameQ/Protocols/Codmw3.php b/GameQ/src/GameQ/Protocols/Codmw3.php deleted file mode 100644 index 1049b60..0000000 --- a/GameQ/src/GameQ/Protocols/Codmw3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Codmw3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Codmw3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'codmw3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty: Modern Warfare 3"; - - /** - * query_port = client_port + 2 - * - * @type int - */ - protected $port_diff = 2; -} diff --git a/GameQ/src/GameQ/Protocols/Coduo.php b/GameQ/src/GameQ/Protocols/Coduo.php deleted file mode 100644 index 2dd9a18..0000000 --- a/GameQ/src/GameQ/Protocols/Coduo.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty United Offensive Class - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Coduo extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'coduo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty: United Offensive"; -} diff --git a/GameQ/src/GameQ/Protocols/Codwaw.php b/GameQ/src/GameQ/Protocols/Codwaw.php deleted file mode 100644 index f730678..0000000 --- a/GameQ/src/GameQ/Protocols/Codwaw.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty World at War Class - * - * @package GameQ\Protocols - * @author naXe - * @author Austin Bischoff - */ -class Codwaw extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'codwaw'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty: World at War"; -} diff --git a/GameQ/src/GameQ/Protocols/Conanexiles.php b/GameQ/src/GameQ/Protocols/Conanexiles.php deleted file mode 100644 index a097e1d..0000000 --- a/GameQ/src/GameQ/Protocols/Conanexiles.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Conanexiles - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Conanexiles extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'conanexiles'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Conan Exiles"; -} diff --git a/GameQ/src/GameQ/Protocols/Contagion.php b/GameQ/src/GameQ/Protocols/Contagion.php deleted file mode 100644 index 64d0b76..0000000 --- a/GameQ/src/GameQ/Protocols/Contagion.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Contagion - * - * @package GameQ\Protocols - * @author Nikolay Ipanyuk - * @author Austin Bischoff - */ -class Contagion extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'contagion'; - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Contagion"; -} diff --git a/GameQ/src/GameQ/Protocols/Crysis.php b/GameQ/src/GameQ/Protocols/Crysis.php deleted file mode 100644 index e09a673..0000000 --- a/GameQ/src/GameQ/Protocols/Crysis.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Crysis - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Crysis extends Gamespy3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'crysis'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Crysis"; -} diff --git a/GameQ/src/GameQ/Protocols/Crysis2.php b/GameQ/src/GameQ/Protocols/Crysis2.php deleted file mode 100644 index 75c6614..0000000 --- a/GameQ/src/GameQ/Protocols/Crysis2.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Crysis2 - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Crysis2 extends Gamespy3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'crysis2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Crysis 2"; -} diff --git a/GameQ/src/GameQ/Protocols/Crysiswars.php b/GameQ/src/GameQ/Protocols/Crysiswars.php deleted file mode 100644 index 44dcdcf..0000000 --- a/GameQ/src/GameQ/Protocols/Crysiswars.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Crysiswars - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Crysiswars extends Gamespy3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'crysiswars'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Crysis Wars"; -} diff --git a/GameQ/src/GameQ/Protocols/Cs15.php b/GameQ/src/GameQ/Protocols/Cs15.php deleted file mode 100644 index ba37524..0000000 --- a/GameQ/src/GameQ/Protocols/Cs15.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Counter-Strike 1.5 Protocol Class - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - * - * @package GameQ\Protocols - */ -class Cs15 extends Won -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs15'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 1.5"; -} diff --git a/GameQ/src/GameQ/Protocols/Cs16.php b/GameQ/src/GameQ/Protocols/Cs16.php deleted file mode 100644 index 25a6602..0000000 --- a/GameQ/src/GameQ/Protocols/Cs16.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Cs16 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cs16 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs16'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 1.6"; - - /** - * In the case of cs 1.6 we offload split packets here because the split packet response for rules is in - * the old gold source format - * - * @param $packet_id - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function processPackets($packet_id, array $packets = []) - { - - // The response is gold source if the packets are split - $this->source_engine = self::GOLDSOURCE_ENGINE; - - // Offload to the parent - $packs = parent::processPackets($packet_id, $packets); - - // Reset the engine - $this->source_engine = self::SOURCE_ENGINE; - - // Return the result - return $packs; - } -} diff --git a/GameQ/src/GameQ/Protocols/Cs2d.php b/GameQ/src/GameQ/Protocols/Cs2d.php deleted file mode 100644 index 0f238fd..0000000 --- a/GameQ/src/GameQ/Protocols/Cs2d.php +++ /dev/null @@ -1,263 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Counter-Strike 2d Protocol Class - * - * Note: - * Unable to make player information calls work as the protocol does not like parallel requests - * - * @author Austin Bischoff - */ -class Cs2d extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x01\x00\xFB\x01", - //self::PACKET_STATUS => "\x01\x00\x03\x10\x21\xFB\x01\x75\x00", - self::PACKET_PLAYERS => "\x01\x00\xFB\x05", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x01\x00\xFB\x01" => "processDetails", - "\x01\x00\xFB\x05" => "processPlayers", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'cs2d'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs2d'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 2d"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "cs2d://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_mode', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'deaths' => 'deaths', - 'score' => 'score', - ], - ]; - - /** - * Process the response for the Tibia server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // We have a merged packet, try to split it back up - if (count($this->packets_response) == 1) { - // Temp buffer to make string manipulation easier - $buffer = new Buffer($this->packets_response[0]); - - // Grab the header and set the packet we need to split with - $packet = (($buffer->lookAhead(4) === $this->packets[self::PACKET_PLAYERS]) ? - self::PACKET_STATUS : self::PACKET_PLAYERS); - - // Explode the merged packet as the response - $responses = explode(substr($this->packets[$packet], 2), $buffer->getData()); - - // Try to rebuild the second packet to the same as if it was sent as two separate responses - $responses[1] = $this->packets[$packet] . ((count($responses) === 2) ? $responses[1] : ""); - - unset($buffer); - } else { - $responses = $this->packets_response; - } - - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($responses as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(4); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /** - * Handles processing the details data into a usable format - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processDetails(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // First int is the server flags - $serverFlags = $buffer->readInt8(); - - // Read server flags - $result->add('password', (int)$this->readFlag($serverFlags, 0)); - $result->add('registered_only', (int)$this->readFlag($serverFlags, 1)); - $result->add('fog_of_war', (int)$this->readFlag($serverFlags, 2)); - $result->add('friendly_fire', (int)$this->readFlag($serverFlags, 3)); - $result->add('bots_enabled', (int)$this->readFlag($serverFlags, 5)); - $result->add('lua_scripts', (int)$this->readFlag($serverFlags, 6)); - - // Read the rest of the buffer data - $result->add('servername', utf8_encode($buffer->readPascalString(0))); - $result->add('mapname', utf8_encode($buffer->readPascalString(0))); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('game_mode', $buffer->readInt8()); - $result->add('num_bots', (($this->readFlag($serverFlags, 5)) ? $buffer->readInt8() : 0)); - $result->add('dedicated', 1); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // First entry is the number of players in this list. Don't care - $buffer->read(); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt8()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString(0))); - $result->addPlayer('team', $buffer->readInt8()); - $result->addPlayer('score', $buffer->readInt32()); - $result->addPlayer('deaths', $buffer->readInt32()); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } - - /** - * Read flags from stored value - * - * @param $flags - * @param $offset - * - * @return bool - */ - protected function readFlag($flags, $offset) - { - return !!($flags & (1 << $offset)); - } -} diff --git a/GameQ/src/GameQ/Protocols/Cscz.php b/GameQ/src/GameQ/Protocols/Cscz.php deleted file mode 100644 index b539128..0000000 --- a/GameQ/src/GameQ/Protocols/Cscz.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Cscz - * - * Based off of CS 1.6 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cscz extends Cs16 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cscz'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Condition Zero"; -} diff --git a/GameQ/src/GameQ/Protocols/Csgo.php b/GameQ/src/GameQ/Protocols/Csgo.php deleted file mode 100644 index 41af735..0000000 --- a/GameQ/src/GameQ/Protocols/Csgo.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Csgo - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Csgo extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'csgo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Global Offensive"; -} diff --git a/GameQ/src/GameQ/Protocols/Css.php b/GameQ/src/GameQ/Protocols/Css.php deleted file mode 100644 index be75da3..0000000 --- a/GameQ/src/GameQ/Protocols/Css.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Css - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Css extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'css'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Source"; -} diff --git a/GameQ/src/GameQ/Protocols/Dal.php b/GameQ/src/GameQ/Protocols/Dal.php deleted file mode 100644 index 6b05037..0000000 --- a/GameQ/src/GameQ/Protocols/Dal.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dark and Light - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dal extends Arkse -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dal'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Dark and Light"; -} diff --git a/GameQ/src/GameQ/Protocols/Dayz.php b/GameQ/src/GameQ/Protocols/Dayz.php deleted file mode 100644 index 01c7c28..0000000 --- a/GameQ/src/GameQ/Protocols/Dayz.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dayz - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dayz extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dayz'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "DayZ Standalone"; - - /** - * Overload the math used to guess at the Query Port - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - - /* - * Port layout: - * 2302 - 27016 - * 2402 - 27017 - * 2502 - 27018 - * 2602 - 27019 - * 2702 - 27020 - * ... - */ - - return 27016 + (($clientPort - 2302) / 100); - } -} diff --git a/GameQ/src/GameQ/Protocols/Dayzmod.php b/GameQ/src/GameQ/Protocols/Dayzmod.php deleted file mode 100644 index 2ce1076..0000000 --- a/GameQ/src/GameQ/Protocols/Dayzmod.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dayzmod - * - * @package GameQ\Protocols - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Dayzmod extends Armedassault2oa -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dayzmod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "DayZ Mod"; -} diff --git a/GameQ/src/GameQ/Protocols/Dod.php b/GameQ/src/GameQ/Protocols/Dod.php deleted file mode 100644 index 0c7baf6..0000000 --- a/GameQ/src/GameQ/Protocols/Dod.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dod - * - * Based off of CS 1.6 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dod extends Cs16 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Day of Defeat"; -} diff --git a/GameQ/src/GameQ/Protocols/Dods.php b/GameQ/src/GameQ/Protocols/Dods.php deleted file mode 100644 index 898d75b..0000000 --- a/GameQ/src/GameQ/Protocols/Dods.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dods - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dods extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dods'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Day of Defeat: Source"; -} diff --git a/GameQ/src/GameQ/Protocols/Dow.php b/GameQ/src/GameQ/Protocols/Dow.php deleted file mode 100644 index b66512a..0000000 --- a/GameQ/src/GameQ/Protocols/Dow.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; - -/** - * Class Dow - * - * Apparently the player response is incomplete as there is no information being returned for that packet - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dow extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Days of War"; - - /** - * Normalize main fields - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'G_s', - 'hostname' => 'ONM_s', - 'mapname' => 'MPN_s', - 'maxplayers' => 'P_i', - 'numplayers' => 'N_i', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; -} diff --git a/GameQ/src/GameQ/Protocols/Eco.php b/GameQ/src/GameQ/Protocols/Eco.php deleted file mode 100644 index a2292e9..0000000 --- a/GameQ/src/GameQ/Protocols/Eco.php +++ /dev/null @@ -1,123 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; - -/** - * ECO Global Survival Protocol Class - * - * @author Austin Bischoff - */ -class Eco extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - self::PACKET_STATUS => "GET /frontpage HTTP/1.0\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Http protocol is SSL - * - * @var string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'eco'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'eco'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "ECO Global Survival"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'description', - 'maxplayers' => 'totalplayers', - 'numplayers' => 'onlineplayers', - 'password' => 'haspassword', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - if (empty($this->packets_response)) { - return []; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Eco server is invalid."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - foreach ($json->Info as $info => $setting) { - $result->add(strtolower($info), $setting); - } - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Egs.php b/GameQ/src/GameQ/Protocols/Egs.php deleted file mode 100644 index 4f82aa8..0000000 --- a/GameQ/src/GameQ/Protocols/Egs.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Empyrion - Galactic Survival - * - * @package GameQ\Protocols - * @author Austin Bischoff - * @author TacTicToe66 - */ -class EgS extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'egs'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Empyrion - Galactic Survival"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Et.php b/GameQ/src/GameQ/Protocols/Et.php deleted file mode 100644 index 63b5beb..0000000 --- a/GameQ/src/GameQ/Protocols/Et.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Wolfenstein Enemy Territory Protocol Class - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Et extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'et'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Wolfenstein Enemy Territory"; -} diff --git a/GameQ/src/GameQ/Protocols/Etqw.php b/GameQ/src/GameQ/Protocols/Etqw.php deleted file mode 100644 index 1f3a446..0000000 --- a/GameQ/src/GameQ/Protocols/Etqw.php +++ /dev/null @@ -1,234 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * Enemy Territory Quake Wars Protocol Class - * - * @author Austin Bischoff - */ -class Etqw extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\xFF\xFFgetInfoEx\x00\x00\x00\x00", - //self::PACKET_STATUS => "\xFF\xFFgetInfo\x00\x00\x00\x00\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFFinfoExResponse" => "processStatus", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'etqw'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'etqw'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Enemy Territory Quake Wars"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'campaign', - 'hostname' => 'name', - 'mapname' => 'map', - 'maxplayers' => 'maxPlayers', - 'mod' => 'gamename', - 'numplayers' => 'numplayers', - 'password' => 'privateClients', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // In case it comes back as multiple packets (it shouldn't) - $buffer = new Buffer(implode('', $this->packets_response)); - - // Figure out what packet response this is for - $response_type = $buffer->readString(); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Offload the call - $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handle processing the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Defaults - $result->add('dedicated', 1); - - // Now burn the challenge, version and size - $buffer->skip(16); - - // Key / value pairs - while ($buffer->getLength()) { - $var = str_replace('si_', '', $buffer->readString()); - $val = $buffer->readString(); - if (empty($var) && empty($val)) { - break; - } - // Add the server prop - $result->add($var, $val); - } - // Now let's do the basic player info - $this->parsePlayers($buffer, $result); - - // Now grab the rest of the server info - $result->add('osmask', $buffer->readInt32()); - $result->add('ranked', $buffer->readInt8()); - $result->add('timeleft', $buffer->readInt32()); - $result->add('gamestate', $buffer->readInt8()); - $result->add('servertype', $buffer->readInt8()); - - // 0: regular server - if ($result->get('servertype') == 0) { - $result->add('interested_clients', $buffer->readInt8()); - } else { - // 1: tv server - $result->add('connected_clients', $buffer->readInt32()); - $result->add('max_clients', $buffer->readInt32()); - } - - // Now let's parse the extended player info - $this->parsePlayersExtra($buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Parse players out of the status ex response - * - * @param Buffer $buffer - * @param Result $result - */ - protected function parsePlayers(Buffer &$buffer, Result &$result) - { - // By default there are 0 players - $players = 0; - - // Iterate over the players until we run out - while (($id = $buffer->readInt8()) != 32) { - $result->addPlayer('id', $id); - $result->addPlayer('ping', $buffer->readInt16()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('clantag_pos', $buffer->readInt8()); - $result->addPlayer('clantag', $buffer->readString()); - $result->addPlayer('bot', $buffer->readInt8()); - $players++; - } - - // Let's add in the current players as a result - $result->add('numplayers', $players); - - // Free some memory - unset($id); - } - - /** - * Handle parsing extra player data - * - * @param Buffer $buffer - * @param Result $result - */ - protected function parsePlayersExtra(Buffer &$buffer, Result &$result) - { - // Iterate over the extra player info - while (($id = $buffer->readInt8()) != 32) { - $result->addPlayer('total_xp', $buffer->readFloat32()); - $result->addPlayer('teamname', $buffer->readString()); - $result->addPlayer('total_kills', $buffer->readInt32()); - $result->addPlayer('total_deaths', $buffer->readInt32()); - } - - // @todo: Add team stuff - - // Free some memory - unset($id); - } -} diff --git a/GameQ/src/GameQ/Protocols/Ffe.php b/GameQ/src/GameQ/Protocols/Ffe.php deleted file mode 100644 index c0947bd..0000000 --- a/GameQ/src/GameQ/Protocols/Ffe.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Ffe - Fortress Forever - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Ffe extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ffe'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Fortress Forever"; -} diff --git a/GameQ/src/GameQ/Protocols/Ffow.php b/GameQ/src/GameQ/Protocols/Ffow.php deleted file mode 100644 index 00c33d4..0000000 --- a/GameQ/src/GameQ/Protocols/Ffow.php +++ /dev/null @@ -1,243 +0,0 @@ - "\xFF\xFF\xFF\xFF\x57", - self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - self::PACKET_INFO => "\xFF\xFF\xFF\xFF\x46\x4C\x53\x51", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFF\x49\x02" => 'processInfo', // I - "\xFF\xFF\xFF\xFF\x45\x00" => 'processRules', // E - "\xFF\xFF\xFF\xFF\x44\x00" => 'processPlayers', // D - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ffow'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ffow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Frontlines Fuel of War"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 2 - * - * @type int - */ - protected $port_diff = 2; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamemode', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'mod' => 'modname', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - // Burn padding - $challenge_buffer->skip(5); - - // Apply the challenge and return - return $this->challengeApply($challenge_buffer->read(4)); - } - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Init results - $results = []; - - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Figure out what packet response this is for - $response_type = $buffer->read(6); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($response_type) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - $result->add('servername', $buffer->readString()); - $result->add('mapname', $buffer->readString()); - $result->add('modname', $buffer->readString()); - $result->add('gamemode', $buffer->readString()); - $result->add('description', $buffer->readString()); - $result->add('version', $buffer->readString()); - $result->add('port', $buffer->readInt16()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('dedicated', $buffer->readInt8()); - $result->add('os', $buffer->readInt8()); - $result->add('password', $buffer->readInt8()); - $result->add('anticheat', $buffer->readInt8()); - $result->add('average_fps', $buffer->readInt8()); - $result->add('round', $buffer->readInt8()); - $result->add('max_rounds', $buffer->readInt8()); - $result->add('time_left', $buffer->readInt16()); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing the server rules - * - * @param Buffer $buffer - * - * @return array - */ - protected function processRules(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn extra header - $buffer->skip(1); - - // Read rules until we run out of buffer - while ($buffer->getLength()) { - $key = $buffer->readString(); - // Check for map - if (strstr($key, "Map:")) { - $result->addSub("maplist", "name", $buffer->readString()); - } else // Regular rule - { - $result->add($key, $buffer->readString()); - } - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @todo: Build this out when there is a server with players to test against - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Gamespy.php b/GameQ/src/GameQ/Protocols/Gamespy.php deleted file mode 100644 index b1a1e4f..0000000 --- a/GameQ/src/GameQ/Protocols/Gamespy.php +++ /dev/null @@ -1,181 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use \GameQ\Exception\Protocol as Exception; - -/** - * GameSpy Protocol class - * - * @author Austin Bischoff - */ -class Gamespy extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x5C\x73\x74\x61\x74\x75\x73\x5C", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Process the response for this protocol - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // Holds the processed packets so we can sort them in case they come in an unordered - $processed = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Check to see if we had a preg_match error - if (($match = preg_match("#^(.*)\\\\queryid\\\\([^\\\\]+)(\\\\|$)#", $response, $matches)) === false - || $match != 1 - ) { - throw new Exception(__METHOD__ . " An error occurred while parsing the packets for 'queryid'"); - } - - // Multiply so we move the decimal point out of the way, if there is one - $key = (int)(floatval($matches[2]) * 1000); - - // Add this packet to the processed - $processed[$key] = $matches[1]; - } - - // Sort the new array to make sure the keys (query ids) are in the proper order - ksort($processed, SORT_NUMERIC); - - // Create buffer and offload processing - return $this->processStatus(new Buffer(implode('', $processed))); - } - - /* - * Internal methods - */ - - /** - * Handle processing the status buffer - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // By default dedicted - $result->add('dedicated', 1); - - // Lets peek and see if the data starts with a \ - if ($buffer->lookAhead(1) == '\\') { - // Burn the first one - $buffer->skip(1); - } - - // Explode the data - $data = explode('\\', $buffer->getBuffer()); - - // No longer needed - unset($buffer); - - // Init some vars - $numPlayers = 0; - $numTeams = 0; - - $itemCount = count($data); - - // Check to make sure we have more than 1 item in the array before trying to loop - if (count($data) > 1) { - // Now lets loop the array since we have items - for ($x = 0; $x < $itemCount; $x += 2) { - // Set some local vars - $key = $data[$x]; - $val = $data[$x + 1]; - - // Check for _ variable (i.e players) - if (($suffix = strrpos($key, '_')) !== false && is_numeric(substr($key, $suffix + 1))) { - // See if this is a team designation - if (substr($key, 0, $suffix) == 'teamname') { - $result->addTeam('teamname', $val); - $numTeams++; - } else { - // Its a player - if (substr($key, 0, $suffix) == 'playername') { - $numPlayers++; - } - $result->addPlayer(substr($key, 0, $suffix), utf8_encode($val)); - } - } else { - // Regular variable so just add the value. - $result->add($key, $val); - } - } - } - - // Add the player and team count - $result->add('num_players', $numPlayers); - $result->add('num_teams', $numTeams); - - // Unset some stuff to free up memory - unset($data, $key, $val, $suffix, $x, $itemCount); - - // Return the result - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Gamespy2.php b/GameQ/src/GameQ/Protocols/Gamespy2.php deleted file mode 100644 index c7788d9..0000000 --- a/GameQ/src/GameQ/Protocols/Gamespy2.php +++ /dev/null @@ -1,269 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * GameSpy2 Protocol class - * - * Given the ability for non utf-8 characters to be used as hostnames, player names, etc... this - * version returns all strings utf-8 encoded (utf8_encode). To access the proper version of a - * string response you must use utf8_decode() on the specific response. - * - * @author Austin Bischoff - */ -class Gamespy2 extends Protocol -{ - - /** - * Define the state of this class - * - * @type int - */ - protected $state = self::STATE_BETA; - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\xFE\xFD\x00\x43\x4F\x52\x59\xFF\x00\x00", - self::PACKET_PLAYERS => "\xFE\xFD\x00\x43\x4F\x52\x58\x00\xFF\xFF", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x00\x43\x4F\x52\x59" => "processDetails", - "\x00\x43\x4F\x52\x58" => "processPlayers", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy2 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'mod' => 'mod', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - ]; - - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // We go until we hit an empty key - while ($buffer->getLength()) { - $key = $buffer->readString(); - if (strlen($key) == 0) { - break; - } - $result->add($key, utf8_encode($buffer->readString())); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the players data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Skip the header - $buffer->skip(1); - - // Players are first - $this->parsePlayerTeam('players', $buffer, $result); - - // Teams are next - $this->parsePlayerTeam('teams', $buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Parse the player/team info returned from the player call - * - * @param string $dataType - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - * - * @throws Exception - */ - protected function parsePlayerTeam($dataType, Buffer &$buffer, Result &$result) - { - - // Do count - $result->add('num_' . $dataType, $buffer->readInt8()); - - // Variable names - $varNames = []; - - // Loop until we run out of length - while ($buffer->getLength()) { - $varNames[] = str_replace('_', '', $buffer->readString()); - - if ($buffer->lookAhead() === "\x00") { - $buffer->skip(); - break; - } - } - - // Check if there are any value entries - if ($buffer->lookAhead() == "\x00") { - $buffer->skip(); - - return; - } - - // Get the values - while ($buffer->getLength() > 4) { - foreach ($varNames as $varName) { - $result->addSub($dataType, utf8_encode($varName), utf8_encode($buffer->readString())); - } - if ($buffer->lookAhead() === "\x00") { - $buffer->skip(); - break; - } - } - - return; - } -} diff --git a/GameQ/src/GameQ/Protocols/Gamespy3.php b/GameQ/src/GameQ/Protocols/Gamespy3.php deleted file mode 100644 index 2df0a4b..0000000 --- a/GameQ/src/GameQ/Protocols/Gamespy3.php +++ /dev/null @@ -1,340 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * GameSpy3 Protocol class - * - * Given the ability for non utf-8 characters to be used as hostnames, player names, etc... this - * version returns all strings utf-8 encoded (utf8_encode). To access the proper version of a - * string response you must use utf8_decode() on the specific response. - * - * @author Austin Bischoff - */ -class Gamespy3 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x01", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy3 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * This defines the split between the server info and player/team info. - * This value can vary by game. This value is the default split. - * - * @var string - */ - protected $packetSplit = "/\\x00\\x00\\x01/m"; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - // Pull out the challenge - $challenge = substr(preg_replace("/[^0-9\-]/si", "", $challenge_buffer->getBuffer()), 1); - - // By default, no challenge result (see #197) - $challenge_result = ''; - - // Check for valid challenge (see #197) - if ($challenge) { - // Encode chellenge result - $challenge_result = sprintf( - "%c%c%c%c", - ($challenge >> 24), - ($challenge >> 16), - ($challenge >> 8), - ($challenge >> 0) - ); - } - - // Apply the challenge and return - return $this->challengeApply($challenge_result); - } - - /** - * Process the response - * - * @return array - */ - public function processResponse() - { - - // Holds the processed packets - $processed = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Make a buffer - $buffer = new Buffer($response, Buffer::NUMBER_TYPE_BIGENDIAN); - - // Packet type = 0 - $buffer->readInt8(); - - // Session Id - $buffer->readInt32(); - - // We need to burn the splitnum\0 because it is not used - $buffer->skip(9); - - // Get the id - $id = $buffer->readInt8(); - - // Burn next byte not sure what it is used for - $buffer->skip(1); - - // Add this packet to the processed - $processed[$id] = $buffer->getBuffer(); - - unset($buffer, $id); - } - - // Sort packets, reset index - ksort($processed); - - // Offload cleaning up the packets if they happen to be split - $packets = $this->cleanPackets(array_values($processed)); - - // Split the packets by type general and the rest (i.e. players & teams) - $split = preg_split($this->packetSplit, implode('', $packets)); - - // Create a new result - $result = new Result(); - - // Assign variable due to pass by reference in PHP 7+ - $buffer = new Buffer($split[0], Buffer::NUMBER_TYPE_BIGENDIAN); - - // First key should be server details and rules - $this->processDetails($buffer, $result); - - // The rest should be the player and team information, if it exists - if (array_key_exists(1, $split)) { - $buffer = new Buffer($split[1], Buffer::NUMBER_TYPE_BIGENDIAN); - $this->processPlayersAndTeams($buffer, $result); - } - - unset($buffer); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles cleaning up packets since the responses can be a bit "dirty" - * - * @param array $packets - * - * @return array - */ - protected function cleanPackets(array $packets = []) - { - - // Get the number of packets - $packetCount = count($packets); - - // Compare last var of current packet with first var of next packet - // On a partial match, remove last var from current packet, - // variable header from next packet - for ($i = 0, $x = $packetCount; $i < $x - 1; $i++) { - // First packet - $fst = substr($packets[$i], 0, -1); - // Second packet - $snd = $packets[$i + 1]; - // Get last variable from first packet - $fstvar = substr($fst, strrpos($fst, "\x00") + 1); - // Get first variable from last packet - $snd = substr($snd, strpos($snd, "\x00") + 2); - $sndvar = substr($snd, 0, strpos($snd, "\x00")); - // Check if fstvar is a substring of sndvar - // If so, remove it from the first string - if (!empty($fstvar) && strpos($sndvar, $fstvar) !== false) { - $packets[$i] = preg_replace("#(\\x00[^\\x00]+\\x00)$#", "\x00", $packets[$i]); - } - } - - // Now let's loop the return and remove any dupe prefixes - for ($x = 1; $x < $packetCount; $x++) { - $buffer = new Buffer($packets[$x], Buffer::NUMBER_TYPE_BIGENDIAN); - - $prefix = $buffer->readString(); - - // Check to see if the return before has the same prefix present - if ($prefix != null && strstr($packets[($x - 1)], $prefix)) { - // Update the return by removing the prefix plus 2 chars - $packets[$x] = substr(str_replace($prefix, '', $packets[$x]), 2); - } - - unset($buffer); - } - - unset($x, $i, $snd, $sndvar, $fst, $fstvar); - - // Return cleaned packets - return $packets; - } - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processDetails(Buffer &$buffer, Result &$result) - { - - // We go until we hit an empty key - while ($buffer->getLength()) { - $key = $buffer->readString(); - if (strlen($key) == 0) { - break; - } - $result->add($key, utf8_encode($buffer->readString())); - } - } - - /** - * Handles processing the player and team data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - - /* - * Explode the data into groups. First is player, next is team (item_t) - * Each group should be as follows: - * - * [0] => item_ - * [1] => information for item_ - * ... - */ - $data = explode("\x00\x00", $buffer->getBuffer()); - - // By default item_group is blank, this will be set for each loop thru the data - $item_group = ''; - - // By default the item_type is blank, this will be set on each loop - $item_type = ''; - - // Save count as variable - $count = count($data); - - // Loop through all of the $data for information and pull it out into the result - for ($x = 0; $x < $count - 1; $x++) { - // Pull out the item - $item = $data[$x]; - // If this is an empty item, move on - if ($item == '' || $item == "\x00") { - continue; - } - /* - * Left as reference: - * - * Each block of player_ and team_t have preceding junk chars - * - * player_ is actually \x01player_ - * team_t is actually \x00\x02team_t - * - * Probably a by-product of the change to exploding the data from the original. - * - * For now we just strip out these characters - */ - // Check to see if $item has a _ at the end, this is player info - if (substr($item, -1) == '_') { - // Set the item group - $item_group = 'players'; - // Set the item type, rip off any trailing stuff and bad chars - $item_type = rtrim(str_replace("\x01", '', $item), '_'); - } elseif (substr($item, -2) == '_t') { - // Check to see if $item has a _t at the end, this is team info - // Set the item group - $item_group = 'teams'; - // Set the item type, rip off any trailing stuff and bad chars - $item_type = rtrim(str_replace(["\x00", "\x02"], '', $item), '_t'); - } else { - // We can assume it is data belonging to a previously defined item - - // Make a temp buffer so we have easier access to the data - $buf_temp = new Buffer($item, Buffer::NUMBER_TYPE_BIGENDIAN); - // Get the values - while ($buf_temp->getLength()) { - // No value so break the loop, end of string - if (($val = $buf_temp->readString()) === '') { - break; - } - // Add the value to the proper item in the correct group - $result->addSub($item_group, $item_type, utf8_encode(trim($val))); - } - // Unset our buffer - unset($buf_temp); - } - } - // Free up some memory - unset($count, $data, $item, $item_group, $item_type, $val); - } -} diff --git a/GameQ/src/GameQ/Protocols/Gamespy4.php b/GameQ/src/GameQ/Protocols/Gamespy4.php deleted file mode 100644 index e28755f..0000000 --- a/GameQ/src/GameQ/Protocols/Gamespy4.php +++ /dev/null @@ -1,34 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * GameSpy4 Protocol Class - * - * By all accounts GameSpy 4 seems to be GameSpy 3. - * - * References: - * http://www.deletedscreen.com/?p=951 - * http://pastebin.com/2zZFDuTd - * - * @author Austin Bischoff - */ -class Gamespy4 extends Gamespy3 -{ -} diff --git a/GameQ/src/GameQ/Protocols/Gmod.php b/GameQ/src/GameQ/Protocols/Gmod.php deleted file mode 100644 index 6596724..0000000 --- a/GameQ/src/GameQ/Protocols/Gmod.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Gmod - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Gmod extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gmod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Garry's Mod"; -} diff --git a/GameQ/src/GameQ/Protocols/Grav.php b/GameQ/src/GameQ/Protocols/Grav.php deleted file mode 100644 index e025075..0000000 --- a/GameQ/src/GameQ/Protocols/Grav.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Grav Online Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Grav extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'grav'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GRAV Online"; -} diff --git a/GameQ/src/GameQ/Protocols/Gta5m.php b/GameQ/src/GameQ/Protocols/Gta5m.php deleted file mode 100644 index 0f0c50a..0000000 --- a/GameQ/src/GameQ/Protocols/Gta5m.php +++ /dev/null @@ -1,173 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * GTA Five M Protocol Class - * - * Server base can be found at https://fivem.net/ - * - * Based on code found at https://github.com/LiquidObsidian/fivereborn-query - * - * @author Austin Bischoff - */ -class Gta5m extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\xFF\xFF\xFF\xFFgetinfo xxx", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFFinfoResponse" => "processStatus", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gta5m'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gta5m'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GTA Five M"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'sv_maxclients', - 'mod' => 'gamename', - 'numplayers' => 'clients', - 'password' => 'privateClients', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // In case it comes back as multiple packets (it shouldn't) - $buffer = new Buffer(implode('', $this->packets_response)); - - // Figure out what packet response this is for - $response_type = $buffer->readString(PHP_EOL); - - // Figure out which packet response this is - if (empty($response_type) || !array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Offload the call - $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handle processing the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Lets peek and see if the data starts with a \ - if ($buffer->lookAhead(1) == '\\') { - // Burn the first one - $buffer->skip(1); - } - - // Explode the data - $data = explode('\\', $buffer->getBuffer()); - - // No longer needed - unset($buffer); - - $itemCount = count($data); - - // Now lets loop the array - for ($x = 0; $x < $itemCount; $x += 2) { - // Set some local vars - $key = $data[$x]; - $val = $data[$x + 1]; - - if (in_array($key, ['challenge'])) { - continue; // skip - } - - // Regular variable so just add the value. - $result->add($key, $val); - } - - /*var_dump($data); - var_dump($result->fetch()); - - exit;*/ - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Gtan.php b/GameQ/src/GameQ/Protocols/Gtan.php deleted file mode 100644 index f7b531e..0000000 --- a/GameQ/src/GameQ/Protocols/Gtan.php +++ /dev/null @@ -1,163 +0,0 @@ -. - */ -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; -use GameQ\Server; - -/** - * Grand Theft Auto Network Protocol Class - * https://stats.gtanet.work/ - * - * Result from this call should be a header + JSON response - * - * References: - * - https://master.gtanet.work/apiservers - * - * @author Austin Bischoff - */ -class Gtan extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - //self::PACKET_STATUS => "GET /apiservers HTTP/1.0\r\nHost: master.gtanet.work\r\nAccept: */*\r\n\r\n", - self::PACKET_STATUS => "GET /gtan/api.php?ip=%s&raw HTTP/1.0\r\nHost: multiplayerhosting.info\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Http protocol is SSL - * - * @var string - */ - protected $transport = self::TRANSPORT_SSL; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'gtan'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'gtan'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "Grand Theft Auto Network"; - - /** - * Holds the real ip so we can overwrite it back - * - * @var string - */ - protected $realIp = null; - - protected $realPortQuery = null; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'mod' => 'mod', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - ]; - - public function beforeSend(Server $server) - { - // Loop over the packets and update them - foreach ($this->packets as $packetType => $packet) { - // Fill out the packet with the server info - $this->packets[$packetType] = sprintf($packet, $server->ip . ':' . $server->port_query); - } - - $this->realIp = $server->ip; - $this->realPortQuery = $server->port_query; - - // Override the existing settings - //$server->ip = 'master.gtanet.work'; - $server->ip = 'multiplayerhosting.info'; - $server->port_query = 443; - } - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // No response, assume offline - if (empty($this->packets_response)) { - return [ - 'gq_address' => $this->realIp, - 'gq_port_query' => $this->realPortQuery, - ]; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Gtan protocol is invalid."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - $result->add('gq_address', $this->realIp); - $result->add('gq_port_query', $this->realPortQuery); - - // Add server items - $result->add('hostname', $json->ServerName); - $result->add('serverversion', $json->ServerVersion); - $result->add('map', ((!empty($json->Map)) ? $json->Map : 'Los Santos/Blaine Country')); - $result->add('mod', $json->Gamemode); - $result->add('password', (int)$json->Passworded); - $result->add('numplayers', $json->CurrentPlayers); - $result->add('maxplayers', $json->MaxPlayers); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Hl2dm.php b/GameQ/src/GameQ/Protocols/Hl2dm.php deleted file mode 100644 index 15f881a..0000000 --- a/GameQ/src/GameQ/Protocols/Hl2dm.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Hl2dm - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Hl2dm extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'hl2dm'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Half Life 2: Deathmatch"; -} diff --git a/GameQ/src/GameQ/Protocols/Http.php b/GameQ/src/GameQ/Protocols/Http.php deleted file mode 100644 index 2a86d8d..0000000 --- a/GameQ/src/GameQ/Protocols/Http.php +++ /dev/null @@ -1,67 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; - -/** - * Class Http - * - * Generic HTTP protocol class. Useful for making http based requests - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -abstract class Http extends Protocol -{ - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'http'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'http'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Generic HTTP protocol"; - - /** - * Http protocol is TCP - * - * @var string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; -} diff --git a/GameQ/src/GameQ/Protocols/Hurtworld.php b/GameQ/src/GameQ/Protocols/Hurtworld.php deleted file mode 100644 index fa54654..0000000 --- a/GameQ/src/GameQ/Protocols/Hurtworld.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Hurtworld - * - * @package GameQ\Protocols - * @author Nikolay Ipanyuk - * @author Austin Bischoff - */ -class Hurtworld extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'hurtworld'; - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Hurtworld"; -} diff --git a/GameQ/src/GameQ/Protocols/Insurgency.php b/GameQ/src/GameQ/Protocols/Insurgency.php deleted file mode 100644 index 77b8329..0000000 --- a/GameQ/src/GameQ/Protocols/Insurgency.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Insurgency - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Insurgency extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'insurgency'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Insurgency"; -} diff --git a/GameQ/src/GameQ/Protocols/Insurgencysand.php b/GameQ/src/GameQ/Protocols/Insurgencysand.php deleted file mode 100644 index 407d6e2..0000000 --- a/GameQ/src/GameQ/Protocols/Insurgencysand.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Insurgency Sandstorm Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Insurgencysand extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'insurgencysand'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Insurgency: Sandstorm"; - - /** - * query_port = client_port + 29 - * - * @type int - */ - protected $port_diff = 29; -} diff --git a/GameQ/src/GameQ/Protocols/Jediacademy.php b/GameQ/src/GameQ/Protocols/Jediacademy.php deleted file mode 100644 index a051a3a..0000000 --- a/GameQ/src/GameQ/Protocols/Jediacademy.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Jedi Academy Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Jediacademy extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'jediacademy'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Star Wars Jedi Knight: Jedi Academy"; -} diff --git a/GameQ/src/GameQ/Protocols/Jedioutcast.php b/GameQ/src/GameQ/Protocols/Jedioutcast.php deleted file mode 100644 index 1afd9af..0000000 --- a/GameQ/src/GameQ/Protocols/Jedioutcast.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Jedi Outcast Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Jedioutcast extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'jedioutcast'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Star Wars Jedi Knight II: Jedi Outcast"; -} diff --git a/GameQ/src/GameQ/Protocols/Justcause2.php b/GameQ/src/GameQ/Protocols/Justcause2.php deleted file mode 100644 index 648cb6d..0000000 --- a/GameQ/src/GameQ/Protocols/Justcause2.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Just Cause 2 Multiplayer Protocol Class - * - * Special thanks to Woet for some insight on packing - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Justcause2 extends Gamespy4 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'justcause2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Just Cause 2 Multiplayer"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Change the packets used - * - * @var array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x02", - ]; - - /** - * Override the packet split - * - * @var string - */ - protected $packetSplit = "/\\x00\\x00\\x00/m"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - ], - ]; - - /** - * Overload so we can add in some static data points - * - * @param Buffer $buffer - * @param Result $result - */ - protected function processDetails(Buffer &$buffer, Result &$result) - { - parent::processDetails($buffer, $result); - - // Add in map - $result->add('mapname', 'Panau'); - $result->add('dedicated', 'true'); - } - - /** - * Override the parent, this protocol is returned differently - * - * @param Buffer $buffer - * @param Result $result - * - * @see Gamespy3::processPlayersAndTeams() - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - // Loop until we run out of data - while ($buffer->getLength()) { - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('steamid', $buffer->readString()); - $result->addPlayer('ping', $buffer->readInt16()); - } - } -} diff --git a/GameQ/src/GameQ/Protocols/Justcause3.php b/GameQ/src/GameQ/Protocols/Justcause3.php deleted file mode 100644 index c4e901d..0000000 --- a/GameQ/src/GameQ/Protocols/Justcause3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Just Cause 3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Justcause3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'justcause3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Just Cause 3"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Killingfloor.php b/GameQ/src/GameQ/Protocols/Killingfloor.php deleted file mode 100644 index 9cc1964..0000000 --- a/GameQ/src/GameQ/Protocols/Killingfloor.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Killing floor - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Killingfloor extends Unreal2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'killing floor'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Killing Floor"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Overload the default detail process since this version is different - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('serverid', $buffer->readInt32()); // 0 - $result->add('serverip', $buffer->readPascalString(1)); // empty - $result->add('gameport', $buffer->readInt32()); - $result->add('queryport', $buffer->readInt32()); // 0 - - // We burn the first char since it is not always correct with the hostname - $buffer->skip(1); - - // Read as a regular string since the length is incorrect (what we skipped earlier) - $result->add('servername', utf8_encode($buffer->readString())); - - // The rest is read as normal - $result->add('mapname', utf8_encode($buffer->readPascalString(1))); - $result->add('gametype', $buffer->readPascalString(1)); - $result->add('numplayers', $buffer->readInt32()); - $result->add('maxplayers', $buffer->readInt32()); - $result->add('currentwave', $buffer->readInt32()); - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Killingfloor2.php b/GameQ/src/GameQ/Protocols/Killingfloor2.php deleted file mode 100644 index a134f25..0000000 --- a/GameQ/src/GameQ/Protocols/Killingfloor2.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Killing floor - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Killingfloor2 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'killing floor 2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Killing Floor 2"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/GameQ/src/GameQ/Protocols/L4d.php b/GameQ/src/GameQ/Protocols/L4d.php deleted file mode 100644 index 596452a..0000000 --- a/GameQ/src/GameQ/Protocols/L4d.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class L4d - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class L4d extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'l4d'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Left 4 Dead"; -} diff --git a/GameQ/src/GameQ/Protocols/L4d2.php b/GameQ/src/GameQ/Protocols/L4d2.php deleted file mode 100644 index 475514c..0000000 --- a/GameQ/src/GameQ/Protocols/L4d2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class L4d2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class L4d2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'l4d2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Left 4 Dead 2"; -} diff --git a/GameQ/src/GameQ/Protocols/Lhmp.php b/GameQ/src/GameQ/Protocols/Lhmp.php deleted file mode 100644 index 3d5e81f..0000000 --- a/GameQ/src/GameQ/Protocols/Lhmp.php +++ /dev/null @@ -1,214 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Lost Heaven Protocol class - * - * Reference: http://lh-mp.eu/wiki/index.php/Query_System - * - * @author Austin Bischoff - */ -class Lhmp extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "LHMPo", - self::PACKET_PLAYERS => "LHMPp", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "LHMPo" => "processDetails", - "LHMPp" => "processPlayers", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'lhmp'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'lhmp'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Lost Heaven"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamemode', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$header}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('protocol', $buffer->readString()); - $result->add('password', $buffer->readString()); - $result->add('numplayers', $buffer->readInt16()); - $result->add('maxplayers', $buffer->readInt16()); - $result->add('servername', utf8_encode($buffer->readPascalString())); - $result->add('gamemode', $buffer->readPascalString()); - $result->add('website', utf8_encode($buffer->readPascalString())); - $result->add('mapname', utf8_encode($buffer->readPascalString())); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Get the number of players - $result->add('numplayers', $buffer->readInt16()); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt16()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString())); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Minecraft.php b/GameQ/src/GameQ/Protocols/Minecraft.php deleted file mode 100644 index a895cb8..0000000 --- a/GameQ/src/GameQ/Protocols/Minecraft.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Minecraft Protocol Class - * - * Thanks to https://github.com/xPaw/PHP-Minecraft-Query for helping me realize this is - * Gamespy 3 Protocol. Make sure you enable the items below for it to work. - * - * Information from original author: - * Instructions - * - * Before using this class, you need to make sure that your server is running GS4 status listener. - * - * Look for those settings in server.properties: - * - * enable-query=true - * query.port=25565 - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Minecraft extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'minecraft'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Minecraft"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "minecraft://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_id', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - ], - ]; -} diff --git a/GameQ/src/GameQ/Protocols/Minecraftpe.php b/GameQ/src/GameQ/Protocols/Minecraftpe.php deleted file mode 100644 index 21d1186..0000000 --- a/GameQ/src/GameQ/Protocols/Minecraftpe.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Minecraft PE (BE) Protocol Class - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Minecraftpe extends Minecraft -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'minecraftpe'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "MinecraftPE"; -} diff --git a/GameQ/src/GameQ/Protocols/Mohaa.php b/GameQ/src/GameQ/Protocols/Mohaa.php deleted file mode 100644 index 66ddd7e..0000000 --- a/GameQ/src/GameQ/Protocols/Mohaa.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Medal of honor: Allied Assault Protocol Class - * - * @package GameQ\Protocols - * @author Bram - * @author Austin Bischoff - */ -class Mohaa extends Gamespy -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mohaa'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Medal of honor: Allied Assault"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'score' => 'frags', - 'ping' => 'ping', - ], - ]; - - /** - * Query port is always the client port + 97 in MOHAA - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - return $clientPort + 97; - } -} diff --git a/GameQ/src/GameQ/Protocols/Mordhau.php b/GameQ/src/GameQ/Protocols/Mordhau.php deleted file mode 100644 index fa305ce..0000000 --- a/GameQ/src/GameQ/Protocols/Mordhau.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class MORDHAU - * - * @package GameQ\Protocols - * @author Wilson Jesus <> - */ -class Mordhau extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mordhau'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "MORDHAU"; - - #protected $port = 7777; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - #protected $port_diff = 19238; -} diff --git a/GameQ/src/GameQ/Protocols/Mta.php b/GameQ/src/GameQ/Protocols/Mta.php deleted file mode 100644 index b95dc4c..0000000 --- a/GameQ/src/GameQ/Protocols/Mta.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Multi Theft Auto - * - * @package GameQ\Protocols - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Mta extends Ase -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mta'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Multi Theft Auto"; - - /** - * query_port = client_port + 123 - * - * @type int - */ - protected $port_diff = 123; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "mtasa://%s:%d/"; -} diff --git a/GameQ/src/GameQ/Protocols/Mumble.php b/GameQ/src/GameQ/Protocols/Mumble.php deleted file mode 100644 index 299389c..0000000 --- a/GameQ/src/GameQ/Protocols/Mumble.php +++ /dev/null @@ -1,194 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Mumble Protocol class - * - * References: - * https://github.com/edmundask/MurmurQuery - Thanks to skylord123 - * - * @author Austin Bischoff - */ -class Mumble extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "\x6A\x73\x6F\x6E", // JSON packet - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'mumble'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mumble'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Mumble Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "mumble://%s:%d/"; - - /** - * 27800 = 64738 - 36938 - * - * @type int - */ - protected $port_diff = -36938; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'name', - 'numplayers' => 'numplayers', - 'maxplayers' => 'x_gtmurmur_max_users', - ], - // Player - 'player' => [ - 'name' => 'name', - 'ping' => 'tcpPing', - 'team' => 'channel', - 'time' => 'onlinesecs', - ], - // Team - 'team' => [ - 'name' => 'name', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Try to json_decode, make it into an array - if (($data = json_decode(implode('', $this->packets_response), true)) === null) { - throw new Exception(__METHOD__ . " Unable to decode JSON data."); - } - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Let's iterate over the response items, there are a lot - foreach ($data as $key => $value) { - // Ignore root for now, that is where all of the channel/player info is housed - if (in_array($key, ['root'])) { - continue; - } - - // Add them as is - $result->add($key, $value); - } - - // Offload the channel and user parsing - $this->processChannelsAndUsers($data['root'], $result); - - unset($data); - - // Manually set the number of players - $result->add('numplayers', count($result->get('players'))); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles processing the the channels and user info - * - * @param array $data - * @param \GameQ\Result $result - */ - protected function processChannelsAndUsers(array $data, Result &$result) - { - - // Let's add all of the channel information - foreach ($data as $key => $value) { - // We will handle these later - if (in_array($key, ['channels', 'users'])) { - // skip - continue; - } - - // Add the channel property as a team - $result->addTeam($key, $value); - } - - // Itereate over the users in this channel - foreach ($data['users'] as $user) { - foreach ($user as $key => $value) { - $result->addPlayer($key, $value); - } - } - - // Offload more channels to parse - foreach ($data['channels'] as $channel) { - $this->processChannelsAndUsers($channel, $result); - } - } -} diff --git a/GameQ/src/GameQ/Protocols/Ns2.php b/GameQ/src/GameQ/Protocols/Ns2.php deleted file mode 100644 index 4c32392..0000000 --- a/GameQ/src/GameQ/Protocols/Ns2.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Ns2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Ns2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ns2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Natural Selection 2"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Pixark.php b/GameQ/src/GameQ/Protocols/Pixark.php deleted file mode 100644 index 2e67af0..0000000 --- a/GameQ/src/GameQ/Protocols/Pixark.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class PixARK - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Pixark extends Arkse -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'pixark'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "PixARK"; -} diff --git a/GameQ/src/GameQ/Protocols/Projectrealitybf2.php b/GameQ/src/GameQ/Protocols/Projectrealitybf2.php deleted file mode 100644 index 6f4b5ce..0000000 --- a/GameQ/src/GameQ/Protocols/Projectrealitybf2.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Projectrealitybf2 - * - * Based off of BF2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Projectrealitybf2 extends Bf2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'projectrealitybf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Project Reality: Battlefield 2"; -} diff --git a/GameQ/src/GameQ/Protocols/Quake2.php b/GameQ/src/GameQ/Protocols/Quake2.php deleted file mode 100644 index f0366c2..0000000 --- a/GameQ/src/GameQ/Protocols/Quake2.php +++ /dev/null @@ -1,219 +0,0 @@ - "\xFF\xFF\xFF\xFFstatus\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFF\x70\x72\x69\x6e\x74" => 'processStatus', - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'quake2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quake2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake 2 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamename', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxclients', - 'mod' => 'g_gametype', - 'numplayers' => 'clients', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Make a buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Grab the header - $header = $buffer->readString("\x0A"); - - // Figure out which packet response this is - if (empty($header) || !array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - return call_user_func_array([$this, $this->responses[$header]], [$buffer]); - } - - /** - * Process the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // We need to split the data and offload - $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); - - $results = array_merge_recursive( - $results, - $this->processPlayers(new Buffer($buffer->getBuffer())) - ); - - unset($buffer); - - // Return results - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processServerInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn leading \ if one exists - $buffer->readString('\\'); - - // Key / value pairs - while ($buffer->getLength()) { - // Add result - $result->add( - trim($buffer->readString('\\')), - utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) - ); - } - - $result->add('password', 0); - $result->add('mod', 0); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - // Some games do not have a number of current players - $playerCount = 0; - - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Make a new buffer with this block - $playerInfo = new Buffer($buffer->readString("\x0A")); - - // Add player info - $result->addPlayer('frags', $playerInfo->readString("\x20")); - $result->addPlayer('ping', $playerInfo->readString("\x20")); - - // Skip first " - $playerInfo->skip(1); - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); - - // Skip first " - $playerInfo->skip(2); - - // Add address - $result->addPlayer('address', trim($playerInfo->readString('"'))); - - // Increment - $playerCount++; - - // Clear - unset($playerInfo); - } - - $result->add('clients', $playerCount); - - // Clear - unset($buffer, $playerCount); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Quake3.php b/GameQ/src/GameQ/Protocols/Quake3.php deleted file mode 100644 index 6269b92..0000000 --- a/GameQ/src/GameQ/Protocols/Quake3.php +++ /dev/null @@ -1,214 +0,0 @@ - "\xFF\xFF\xFF\xFF\x67\x65\x74\x73\x74\x61\x74\x75\x73\x0A", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFFstatusResponse" => 'processStatus', - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'quake3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quake3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake 3 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamename', - 'hostname' => 'sv_hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'sv_maxclients', - 'mod' => 'g_gametype', - 'numplayers' => 'clients', - 'password' => ['g_needpass', 'pswrd'], - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Make a buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Grab the header - $header = $buffer->readString("\x0A"); - - // Figure out which packet response this is - if (empty($header) || !array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - return call_user_func_array([$this, $this->responses[$header]], [$buffer]); - } - - protected function processStatus(Buffer $buffer) - { - // We need to split the data and offload - $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); - - $results = array_merge_recursive( - $results, - $this->processPlayers(new Buffer($buffer->getBuffer())) - ); - - unset($buffer); - - // Return results - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processServerInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn leading \ if one exists - $buffer->readString('\\'); - - // Key / value pairs - while ($buffer->getLength()) { - // Add result - $result->add( - trim($buffer->readString('\\')), - utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) - ); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processPlayers(Buffer $buffer) - { - // Some games do not have a number of current players - $playerCount = 0; - - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Add player info - $result->addPlayer('frags', $buffer->readString("\x20")); - $result->addPlayer('ping', $buffer->readString("\x20")); - - // Look ahead to see if we have a name or team - $checkTeam = $buffer->lookAhead(1); - - // We have team info - if ($checkTeam != '' and $checkTeam != '"') { - $result->addPlayer('team', $buffer->readString("\x20")); - } - - // Check to make sure we have player name - $checkPlayerName = $buffer->read(); - - // Bad response - if ($checkPlayerName !== '"') { - throw new Exception('Expected " but got ' . $checkPlayerName . ' for beginning of player name string!'); - } - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim($buffer->readString('"')))); - - // Burn ending delimiter - $buffer->read(); - - // Increment - $playerCount++; - } - - $result->add('clients', $playerCount); - - // Clear - unset($buffer, $playerCount); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Quakelive.php b/GameQ/src/GameQ/Protocols/Quakelive.php deleted file mode 100644 index d5df350..0000000 --- a/GameQ/src/GameQ/Protocols/Quakelive.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Quake Live - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Quakelive extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quakelive'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake Live"; -} diff --git a/GameQ/src/GameQ/Protocols/Redorchestra2.php b/GameQ/src/GameQ/Protocols/Redorchestra2.php deleted file mode 100644 index 6733016..0000000 --- a/GameQ/src/GameQ/Protocols/Redorchestra2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Redorchestra2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Redorchestra2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'redorchestra2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Red Orchestra 2"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/GameQ/src/GameQ/Protocols/Redorchestraostfront.php b/GameQ/src/GameQ/Protocols/Redorchestraostfront.php deleted file mode 100644 index 4c83b7e..0000000 --- a/GameQ/src/GameQ/Protocols/Redorchestraostfront.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Red Orchestra: Ostfront 41-45 Class - * - * @package GameQ\Protocols - * @author naXe - * @author Austin Bischoff - */ -class Redorchestraostfront extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'redorchestraostfront'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Red Orchestra: Ostfront 41-45"; -} diff --git a/GameQ/src/GameQ/Protocols/Risingstorm2.php b/GameQ/src/GameQ/Protocols/Risingstorm2.php deleted file mode 100644 index ddb82a5..0000000 --- a/GameQ/src/GameQ/Protocols/Risingstorm2.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Rising Storm 2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Risingstorm2 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'rising storm 2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Rising Storm 2"; - - /** - * Query port is always 27015 - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - return 27015; - } -} diff --git a/GameQ/src/GameQ/Protocols/Rust.php b/GameQ/src/GameQ/Protocols/Rust.php deleted file mode 100644 index 81b0cce..0000000 --- a/GameQ/src/GameQ/Protocols/Rust.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Rust - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Rust extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'rust'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Rust"; -} diff --git a/GameQ/src/GameQ/Protocols/Samp.php b/GameQ/src/GameQ/Protocols/Samp.php deleted file mode 100644 index cf01f83..0000000 --- a/GameQ/src/GameQ/Protocols/Samp.php +++ /dev/null @@ -1,279 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * San Andreas Multiplayer Protocol Class (samp) - * - * Note: - * Player information will not be returned if player count is over 256 - * - * @author Austin Bischoff - */ -class Samp extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "SAMP%si", - self::PACKET_PLAYERS => "SAMP%sd", - self::PACKET_RULES => "SAMP%sr", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x69" => "processStatus", // i - "\x64" => "processPlayers", // d - "\x72" => "processRules", // r - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'samp'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'samp'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "San Andreas Multiplayer"; - - /** - * Holds the calculated server code that is passed when querying for information - * - * @type string - */ - protected $server_code = null; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "samp://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => ['hostname', 'servername'], - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - ]; - - /** - * Handle some work before sending the packets out to the server - * - * @param \GameQ\Server $server - */ - public function beforeSend(Server $server) - { - - // Build the server code - $this->server_code = implode('', array_map('chr', explode('.', $server->ip()))) . - pack("S", $server->portClient()); - - // Loop over the packets and update them - foreach ($this->packets as $packetType => $packet) { - // Fill out the packet with the server info - $this->packets[$packetType] = sprintf($packet, $this->server_code); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Results that will be returned - $results = []; - - // Get the length of the server code so we can figure out how much to read later - $serverCodeLength = strlen($this->server_code); - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - // Make new buffer - $buffer = new Buffer($response); - - // Check the header, should be SAMP - if (($header = $buffer->read(4)) !== 'SAMP') { - throw new Exception(__METHOD__ . " header response '{$header}' is not valid"); - } - - // Check to make sure the server response code matches what we sent - if ($buffer->read($serverCodeLength) !== $this->server_code) { - throw new Exception(__METHOD__ . " code check failed."); - } - - // Figure out what packet response this is for - $response_type = $buffer->read(1); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the server status data - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processStatus(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Pull out the server information - $result->add('password', $buffer->readInt8()); - $result->add('num_players', $buffer->readInt16()); - $result->add('max_players', $buffer->readInt16()); - - // These are read differently for these last 3 - $result->add('servername', utf8_encode($buffer->read($buffer->readInt32()))); - $result->add('gametype', $buffer->read($buffer->readInt32())); - $result->add('language', $buffer->read($buffer->readInt32())); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Number of players - $result->add('num_players', $buffer->readInt16()); - - // Run until we run out of buffer - while ($buffer->getLength()) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', utf8_encode($buffer->readPascalString())); - $result->addPlayer('score', $buffer->readInt32()); - $result->addPlayer('ping', $buffer->readInt32()); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Number of rules - $result->add('num_rules', $buffer->readInt16()); - - // Run until we run out of buffer - while ($buffer->getLength()) { - $result->add($buffer->readPascalString(), $buffer->readPascalString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Serioussam.php b/GameQ/src/GameQ/Protocols/Serioussam.php deleted file mode 100644 index 32e0a10..0000000 --- a/GameQ/src/GameQ/Protocols/Serioussam.php +++ /dev/null @@ -1,75 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Serious Sam Protocol Class - * - * @author ZCaliptium - */ -class SeriousSam extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'serioussam'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Serious Sam"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'mod' => 'activemod', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; -} diff --git a/GameQ/src/GameQ/Protocols/Sevendaystodie.php b/GameQ/src/GameQ/Protocols/Sevendaystodie.php deleted file mode 100644 index a5ddbf2..0000000 --- a/GameQ/src/GameQ/Protocols/Sevendaystodie.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class 7 Days to Die - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Sevendaystodie extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'sevendaystodie'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "7 Days to Die"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Ship.php b/GameQ/src/GameQ/Protocols/Ship.php deleted file mode 100644 index 9c3bee9..0000000 --- a/GameQ/src/GameQ/Protocols/Ship.php +++ /dev/null @@ -1,95 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Ship - * - * @package GameQ\Protocols - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - */ -class Ship extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ship'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "The Ship"; - - /** - * Specific player parse for The Ship - * - * Player response has unknown data after the last real player - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // We need to read the number of players because this response has other data at the end usually - $num_players = $buffer->readInt8(); - - // Player count - $result->add('num_players', $num_players); - - // No players, no work - if ($num_players == 0) { - return $result->fetch(); - } - - // Players list - for ($player = 0; $player < $num_players; $player++) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('score', $buffer->readInt32Signed()); - $result->addPlayer('time', $buffer->readFloat32()); - } - - // Extra data - if ($buffer->getLength() > 0) { - for ($player = 0; $player < $num_players; $player++) { - $result->addPlayer('deaths', $buffer->readInt32Signed()); - $result->addPlayer('money', $buffer->readInt32Signed()); - } - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Sof2.php b/GameQ/src/GameQ/Protocols/Sof2.php deleted file mode 100644 index 96a4db2..0000000 --- a/GameQ/src/GameQ/Protocols/Sof2.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Soldier of Fortune 2 Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Sof2 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'sof2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Solder of Fortune II"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "sof2mp://%s:%d/"; -} diff --git a/GameQ/src/GameQ/Protocols/Soldat.php b/GameQ/src/GameQ/Protocols/Soldat.php deleted file mode 100644 index a9dbbc4..0000000 --- a/GameQ/src/GameQ/Protocols/Soldat.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Soldat - * - * @package GameQ\Protocols - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Soldat extends Ase -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'soldat'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Soldat"; - - /** - * query_port = client_port + 123 - * - * @type int - */ - protected $port_diff = 123; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "soldat://%s:%d/"; -} diff --git a/GameQ/src/GameQ/Protocols/Source.php b/GameQ/src/GameQ/Protocols/Source.php deleted file mode 100644 index 9e4cb5d..0000000 --- a/GameQ/src/GameQ/Protocols/Source.php +++ /dev/null @@ -1,522 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * Valve Source Engine Protocol Class (A2S) - * - * This class is used as the basis for all other source based servers - * that rely on the source protocol for game querying. - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - * - * @author Austin Bischoff - */ -class Source extends Protocol -{ - - /* - * Source engine type constants - */ - const SOURCE_ENGINE = 0, - GOLDSOURCE_ENGINE = 1; - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x56\x00\x00\x00\x00", - self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFTSource Engine Query\x00", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x49" => "processDetails", // I - "\x6d" => "processDetailsGoldSource", // m, goldsource - "\x44" => "processPlayers", // D - "\x45" => "processRules", // E - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'source'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'source'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Source Server"; - - /** - * Define the Source engine type. By default it is assumed to be Source - * - * @type int - */ - protected $source_engine = self::SOURCE_ENGINE; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_descr', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - - // Skip the header - $challenge_buffer->skip(5); - - // Apply the challenge and return - return $this->challengeApply($challenge_buffer->read(4)); - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Will hold the results when complete - $results = []; - - // Holds sorted response packets - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Get the header of packet (long) - $header = $buffer->readInt32Signed(); - - // Single packet - if ($header == -1) { - // We need to peek and see what kind of engine this is for later processing - if ($buffer->lookAhead(1) == "\x6d") { - $this->source_engine = self::GOLDSOURCE_ENGINE; - } - - $packets[] = $buffer->getBuffer(); - continue; - } else { - // Split packet - - // Packet Id (long) - $packet_id = $buffer->readInt32Signed() + 10; - - // Add the buffer to the packet as another array - $packets[$packet_id][] = $buffer->getBuffer(); - } - } - - // Free up memory - unset($response, $packet_id, $buffer, $header); - - // Now that we have the packets sorted we need to iterate and process them - foreach ($packets as $packet_id => $packet) { - // We first need to off load split packets to combine them - if (is_array($packet)) { - $buffer = new Buffer($this->processPackets($packet_id, $packet)); - } else { - $buffer = new Buffer($packet); - } - - // Figure out what packet response this is for - $response_type = $buffer->read(1); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - // Free up memory - unset($packets, $packet, $packet_id, $response_type); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Process the split packets and decompress if necessary - * - * @SuppressWarnings(PHPMD.UnusedLocalVariable) - * - * @param $packet_id - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function processPackets($packet_id, array $packets = []) - { - - // Init array so we can order - $packs = []; - - // We have multiple packets so we need to get them and order them - foreach ($packets as $i => $packet) { - // Make a buffer so we can read this info - $buffer = new Buffer($packet); - - // Gold source - if ($this->source_engine == self::GOLDSOURCE_ENGINE) { - // Grab the packet number (byte) - $packet_number = $buffer->readInt8(); - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $buffer->read(4); - } - - // Now add the rest of the packet to the new array with the packet_number as the id so we can order it - $packs[$packet_number] = $buffer->getBuffer(); - } else { - // Number of packets in this set (byte) - $buffer->readInt8(); - - // The current packet number (byte) - $packet_number = $buffer->readInt8(); - - // Check to see if this is compressed - // @todo: Check to make sure these decompress correctly, new changes may affect this loop. - if ($packet_id & 0x80000000) { - // Check to see if we have Bzip2 installed - if (!function_exists('bzdecompress')) { - // @codeCoverageIgnoreStart - throw new Exception( - 'Bzip2 is not installed. See http://www.php.net/manual/en/book.bzip2.php for more info.', - 0 - ); - // @codeCoverageIgnoreEnd - } - - // Get the length of the packet (long) - $packet_length = $buffer->readInt32Signed(); - - // Checksum for the decompressed packet (long), burn it - doesnt work in split responses - $buffer->readInt32Signed(); - - // Try to decompress - $result = bzdecompress($buffer->getBuffer()); - - // Now verify the length - if (strlen($result) != $packet_length) { - // @codeCoverageIgnoreStart - throw new Exception( - "Checksum for compressed packet failed! Length expected: {$packet_length}, length - returned: " . strlen($result) - ); - // @codeCoverageIgnoreEnd - } - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $result = substr($result, 4); - } - } else { - // Get the packet length (short), burn it - $buffer->readInt16Signed(); - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $buffer->read(4); - } - - // Grab the rest of the buffer as a result - $result = $buffer->getBuffer(); - } - - // Add this packet to the list - $packs[$packet_number] = $result; - } - - unset($buffer); - } - - // Free some memory - unset($packets, $packet); - - // Sort the packets by packet number - ksort($packs); - - // Now combine the packs into one and return - return implode("", $packs); - } - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - * @throws \GameQ\Exception\Protocol - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('protocol', $buffer->readInt8()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_dir', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('steamappid', $buffer->readInt16()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('num_bots', $buffer->readInt8()); - $result->add('dedicated', $buffer->read()); - $result->add('os', $buffer->read()); - $result->add('password', $buffer->readInt8()); - $result->add('secure', $buffer->readInt8()); - - // Special result for The Ship only (appid=2400) - if ($result->get('steamappid') == 2400) { - $result->add('game_mode', $buffer->readInt8()); - $result->add('witness_count', $buffer->readInt8()); - $result->add('witness_time', $buffer->readInt8()); - } - - $result->add('version', $buffer->readString()); - - // Because of php 5.4... - $edfCheck = $buffer->lookAhead(1); - - // Extra data flag - if (!empty($edfCheck)) { - $edf = $buffer->readInt8(); - - if ($edf & 0x80) { - $result->add('port', $buffer->readInt16Signed()); - } - - if ($edf & 0x10) { - $result->add('steam_id', $buffer->readInt64()); - } - - if ($edf & 0x40) { - $result->add('sourcetv_port', $buffer->readInt16Signed()); - $result->add('sourcetv_name', $buffer->readString()); - } - - if ($edf & 0x20) { - $result->add('keywords', $buffer->readString()); - } - - if ($edf & 0x01) { - $result->add('game_id', $buffer->readInt64()); - } - - unset($edf); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the server details from goldsource response - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processDetailsGoldSource(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('address', $buffer->readString()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_dir', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('version', $buffer->readInt8()); - $result->add('dedicated', $buffer->read()); - $result->add('os', $buffer->read()); - $result->add('password', $buffer->readInt8()); - - // Mod section - $result->add('ismod', $buffer->readInt8()); - - // We only run these if ismod is 1 (true) - if ($result->get('ismod') == 1) { - $result->add('mod_urlinfo', $buffer->readString()); - $result->add('mod_urldl', $buffer->readString()); - $buffer->skip(); - $result->add('mod_version', $buffer->readInt32Signed()); - $result->add('mod_size', $buffer->readInt32Signed()); - $result->add('mod_type', $buffer->readInt8()); - $result->add('mod_cldll', $buffer->readInt8()); - } - - $result->add('secure', $buffer->readInt8()); - $result->add('num_bots', $buffer->readInt8()); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Pull out the number of players - $num_players = $buffer->readInt8(); - - // Player count - $result->add('num_players', $num_players); - - // No players so no need to look any further - if ($num_players == 0) { - return $result->fetch(); - } - - // Players list - while ($buffer->getLength()) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('score', $buffer->readInt32Signed()); - $result->addPlayer('time', $buffer->readFloat32()); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Count the number of rules - $num_rules = $buffer->readInt16Signed(); - - // Add the count of the number of rules this server has - $result->add('num_rules', $num_rules); - - // Rules - while ($buffer->getLength()) { - $result->add($buffer->readString(), $buffer->readString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Spaceengineers.php b/GameQ/src/GameQ/Protocols/Spaceengineers.php deleted file mode 100644 index ddf8567..0000000 --- a/GameQ/src/GameQ/Protocols/Spaceengineers.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Space Engineers Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Spaceengineers extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'spaceengineers'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Space Engineers"; -} diff --git a/GameQ/src/GameQ/Protocols/Squad.php b/GameQ/src/GameQ/Protocols/Squad.php deleted file mode 100644 index 3c02188..0000000 --- a/GameQ/src/GameQ/Protocols/Squad.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Squad - * - * Port reference: http://forums.joinsquad.com/topic/9559-query-ports/ - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Squad extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'squad'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Squad"; - - /** - * query_port = client_port + 19378 - * 27165 = 7787 + 19378 - * - * @type int - */ - protected $port_diff = 19378; -} diff --git a/GameQ/src/GameQ/Protocols/Starmade.php b/GameQ/src/GameQ/Protocols/Starmade.php deleted file mode 100644 index 09a033f..0000000 --- a/GameQ/src/GameQ/Protocols/Starmade.php +++ /dev/null @@ -1,226 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * StarMade Protocol Class - * - * StarMade server query protocol class - * - * Credit to Robin Promesberger for providing Java based querying as a roadmap - * - * @author Austin Bischoff - */ -class Starmade extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x00\x00\x00\x09\x2a\xff\xff\x01\x6f\x00\x00\x00\x00", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'starmade'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'starmade'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "StarMade"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Implode the packets, not sure if there is any split logic for multiple packets - $buffer = new Buffer(implode('', $this->packets_response), Buffer::NUMBER_TYPE_BIGENDIAN); - - // Get the passed length in the data side of the packet - $buffer->readInt32Signed(); - - // Read off the timestamp (in milliseconds) - $buffer->readInt64(); - - // Burn the check id == 42 - $buffer->readInt8(); - - // Read packetId, unused - $buffer->readInt16Signed(); - - // Read commandId, unused - $buffer->readInt8Signed(); - - // Read type, unused - $buffer->readInt8Signed(); - - $parsed = $this->parseServerParameters($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Best guess info version is the type of response to expect. As of this commit the version is "2". - $result->add('info_version', $parsed[0]); - $result->add('version', $parsed[1]); - $result->add('hostname', $parsed[2]); - $result->add('game_descr', $parsed[3]); - $result->add('start_time', $parsed[4]); - $result->add('num_players', $parsed[5]); - $result->add('max_players', $parsed[6]); - $result->add('dedicated', 1); // All servers are dedicated as far as I can tell - $result->add('password', 0); // Unsure if you can password servers, cant read that value - //$result->add('map', 'Unknown'); - - unset($parsed); - - return $result->fetch(); - } - - /** - * Parse the server response parameters - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function parseServerParameters(Buffer &$buffer) - { - - // Init the parsed data array - $parsed = []; - - // Read the number of parameters to parse - $parameterSize = $buffer->readInt32Signed(); - - // Iterate over the parameter size - for ($i = 0; $i < $parameterSize; $i++) { - // Read the type of return this is - $dataType = $buffer->readInt8Signed(); - - switch ($dataType) { - // 32-bit int - case 1: - $parsed[$i] = $buffer->readInt32Signed(); - break; - - // 64-bit int - case 2: - $parsed[$i] = $buffer->readInt64(); - break; - - // Float - case 3: - $parsed[$i] = $buffer->readFloat32(); - break; - - // String - case 4: - // The first 2 bytes are the string length - $strLength = $buffer->readInt16Signed(); - - // Read the above length from the buffer - $parsed[$i] = $buffer->read($strLength); - - unset($strLength); - break; - - // Boolean - case 5: - $parsed[$i] = (bool)$buffer->readInt8Signed(); - break; - - // 8-bit int - case 6: - $parsed[$i] = $buffer->readInt8Signed(); - break; - - // 16-bit int - case 7: - $parsed[$i] = $buffer->readInt16Signed(); - break; - - // Array - case 8: - // Not implemented - throw new Exception("StarMade array parsing is not implemented!"); - } - } - - return $parsed; - } -} diff --git a/GameQ/src/GameQ/Protocols/Swat4.php b/GameQ/src/GameQ/Protocols/Swat4.php deleted file mode 100644 index 7b8e120..0000000 --- a/GameQ/src/GameQ/Protocols/Swat4.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Swat4 - * - * @package GameQ\Protocols - * - * @author Wilson Jesus <> - */ -class Swat4 extends Gamespy2 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'swat4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "SWAT 4"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Teamspeak2.php b/GameQ/src/GameQ/Protocols/Teamspeak2.php deleted file mode 100644 index df0d59a..0000000 --- a/GameQ/src/GameQ/Protocols/Teamspeak2.php +++ /dev/null @@ -1,290 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * Teamspeak 2 Protocol Class - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Teamspeak2 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "sel %d\x0asi\x0a", - self::PACKET_CHANNELS => "sel %d\x0acl\x0a", - self::PACKET_PLAYERS => "sel %d\x0apl\x0a", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teamspeak2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teamspeak2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teamspeak 2"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "teamspeak://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'hostname' => 'server_name', - 'password' => 'server_password', - 'numplayers' => 'server_currentusers', - 'maxplayers' => 'server_maxusers', - ], - // Player - 'player' => [ - 'id' => 'p_id', - 'team' => 'c_id', - 'name' => 'nick', - ], - // Team - 'team' => [ - 'id' => 'id', - 'name' => 'name', - ], - ]; - - /** - * Before we send off the queries we need to update the packets - * - * @param \GameQ\Server $server - * - * @throws \GameQ\Exception\Protocol - */ - public function beforeSend(Server $server) - { - - // Check to make sure we have a query_port because it is required - if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - ) { - throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); - } - - // Let's loop the packets and set the proper pieces - foreach ($this->packets as $packet_type => $packet) { - // Update with the client port for the server - $this->packets[$packet_type] = sprintf($packet, $server->portClient()); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Make a new buffer out of all of the packets - $buffer = new Buffer(implode('', $this->packets_response)); - - // Check the header [TS] - if (($header = trim($buffer->readString("\n"))) !== '[TS]') { - throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected '[TS]'."); - } - - // Split this buffer as the data blocks are bound by "OK" and drop any empty values - $sections = array_filter(explode("OK", $buffer->getBuffer()), function ($value) { - - $value = trim($value); - - return !empty($value); - }); - - // Trim up the values to remove extra whitespace - $sections = array_map('trim', $sections); - - // Set the result to a new result instance - $result = new Result(); - - // Now we need to iterate over the sections and off load the processing - foreach ($sections as $section) { - // Grab a snip of the data so we can figure out what it is - $check = substr($section, 0, 7); - - // Offload to the proper method - if ($check == 'server_') { - // Server settings and info - $this->processDetails($section, $result); - } elseif ($check == "id\tcode") { - // Channel info - $this->processChannels($section, $result); - } elseif ($check == "p_id\tc_") { - // Player info - $this->processPlayers($section, $result); - } - } - - unset($buffer, $sections, $section, $check); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - - /** - * Handles processing the details data into a usable format - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processDetails($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // Always dedicated - $result->add('dedicated', 1); - - // Let's loop until we run out of data - while ($buffer->getLength()) { - // Grab the row, which is an item - $row = trim($buffer->readString("\n")); - - // Split out the information - list($key, $value) = explode('=', $row, 2); - - // Add this to the result - $result->add($key, utf8_encode($value)); - } - - unset($data, $buffer, $row, $key, $value); - } - - /** - * Process the channel listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processChannels($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // The first line holds the column names, data returned is in column/row format - $columns = explode("\t", trim($buffer->readString("\n")), 9); - - // Loop through the rows until we run out of information - while ($buffer->getLength()) { - // Grab the row, which is a tabbed list of items - $row = trim($buffer->readString("\n")); - - // Explode and merge the data with the columns, then parse - $data = array_combine($columns, explode("\t", $row, 9)); - - foreach ($data as $key => $value) { - // Now add the data to the result - $result->addTeam($key, utf8_encode($value)); - } - } - - unset($data, $buffer, $row, $columns, $key, $value); - } - - /** - * Process the user listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processPlayers($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // The first line holds the column names, data returned is in column/row format - $columns = explode("\t", trim($buffer->readString("\n")), 16); - - // Loop through the rows until we run out of information - while ($buffer->getLength()) { - // Grab the row, which is a tabbed list of items - $row = trim($buffer->readString("\n")); - - // Explode and merge the data with the columns, then parse - $data = array_combine($columns, explode("\t", $row, 16)); - - foreach ($data as $key => $value) { - // Now add the data to the result - $result->addPlayer($key, utf8_encode($value)); - } - } - - unset($data, $buffer, $row, $columns, $key, $value); - } -} diff --git a/GameQ/src/GameQ/Protocols/Teamspeak3.php b/GameQ/src/GameQ/Protocols/Teamspeak3.php deleted file mode 100644 index c66f6a4..0000000 --- a/GameQ/src/GameQ/Protocols/Teamspeak3.php +++ /dev/null @@ -1,328 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * Teamspeak 3 Protocol Class - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Teamspeak3 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "use port=%d\x0Aserverinfo\x0A", - self::PACKET_PLAYERS => "use port=%d\x0Aclientlist\x0A", - self::PACKET_CHANNELS => "use port=%d\x0Achannellist -topic\x0A", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teamspeak3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teamspeak3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teamspeak 3"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "ts3server://%s?port=%d"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'hostname' => 'virtualserver_name', - 'password' => 'virtualserver_flag_password', - 'numplayers' => 'numplayers', - 'maxplayers' => 'virtualserver_maxclients', - ], - // Player - 'player' => [ - 'id' => 'clid', - 'team' => 'cid', - 'name' => 'client_nickname', - ], - // Team - 'team' => [ - 'id' => 'cid', - 'name' => 'channel_name', - ], - ]; - - /** - * Before we send off the queries we need to update the packets - * - * @param \GameQ\Server $server - * - * @throws \GameQ\Exception\Protocol - */ - public function beforeSend(Server $server) - { - - // Check to make sure we have a query_port because it is required - if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - ) { - throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); - } - - // Let's loop the packets and set the proper pieces - foreach ($this->packets as $packet_type => $packet) { - // Update with the client port for the server - $this->packets[$packet_type] = sprintf($packet, $server->portClient()); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Make a new buffer out of all of the packets - $buffer = new Buffer(implode('', $this->packets_response)); - - // Check the header TS3 - if (($header = trim($buffer->readString("\n"))) !== 'TS3') { - throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected 'TS3'."); - } - - // Convert all the escaped characters - $raw = str_replace( - [ - '\\\\', // Translate escaped \ - '\\/', // Translate escaped / - ], - [ - '\\', - '/', - ], - $buffer->getBuffer() - ); - - // Explode the sections and filter to remove empty, junk ones - $sections = array_filter(explode("\n", $raw), function ($value) { - - $value = trim($value); - - // Not empty string or a message response for "error id=\d" - return !empty($value) && substr($value, 0, 5) !== 'error'; - }); - - // Trim up the values to remove extra whitespace - $sections = array_map('trim', $sections); - - // Set the result to a new result instance - $result = new Result(); - - // Iterate over the sections and offload the parsing - foreach ($sections as $section) { - // Grab a snip of the data so we can figure out what it is - $check = substr(trim($section), 0, 4); - - // Use the first part of the response to figure out where we need to go - if ($check == 'virt') { - // Server info - $this->processDetails($section, $result); - } elseif ($check == 'cid=') { - // Channels - $this->processChannels($section, $result); - } elseif ($check == 'clid') { - // Clients (players) - $this->processPlayers($section, $result); - } - } - - unset($buffer, $sections, $section, $check); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Process the properties of the data. - * - * Takes data in "key1=value1 key2=value2 ..." and processes it into a usable format - * - * @param $data - * - * @return array - */ - protected function processProperties($data) - { - - // Will hold the properties we are sending back - $properties = []; - - // All of these are split on space - $items = explode(' ', $data); - - // Iterate over the items - foreach ($items as $item) { - // Explode and make sure we always have 2 items in the array - list($key, $value) = array_pad(explode('=', $item, 2), 2, ''); - - // Convert spaces and other character changes - $properties[$key] = utf8_encode(str_replace( - [ - '\\s', // Translate spaces - ], - [ - ' ', - ], - $value - )); - } - - return $properties; - } - - /** - * Handles processing the details data into a usable format - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processDetails($data, Result &$result) - { - - // Offload the parsing for these values - $properties = $this->processProperties($data); - - // Always dedicated - $result->add('dedicated', 1); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->add($key, $value); - } - - // We need to manually figure out the number of players - $result->add( - 'numplayers', - ($properties['virtualserver_clientsonline'] - $properties['virtualserver_queryclientsonline']) - ); - - unset($data, $properties, $key, $value); - } - - /** - * Process the channel listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processChannels($data, Result &$result) - { - - // We need to split the data at the pipe - $channels = explode('|', $data); - - // Iterate over the channels - foreach ($channels as $channel) { - // Offload the parsing for these values - $properties = $this->processProperties($channel); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->addTeam($key, $value); - } - } - - unset($data, $channel, $channels, $properties, $key, $value); - } - - /** - * Process the user listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processPlayers($data, Result &$result) - { - - // We need to split the data at the pipe - $players = explode('|', $data); - - // Iterate over the channels - foreach ($players as $player) { - // Offload the parsing for these values - $properties = $this->processProperties($player); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->addPlayer($key, $value); - } - } - - unset($data, $player, $players, $properties, $key, $value); - } -} diff --git a/GameQ/src/GameQ/Protocols/Teeworlds.php b/GameQ/src/GameQ/Protocols/Teeworlds.php deleted file mode 100644 index 1bdaa47..0000000 --- a/GameQ/src/GameQ/Protocols/Teeworlds.php +++ /dev/null @@ -1,181 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Teeworlds Protocol class - * - * Only supports versions > 0.5 - * - * @author Austin Bischoff - * @author Marcel Bößendörfer - */ -class Teeworlds extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x69\x65\x33\x05", - // 0.5 Packet (not compatible, maybe some wants to implement "Teeworldsold") - //self::PACKET_STATUS => "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFgief", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35" => "processAll", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teeworlds'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teeworlds'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teeworlds Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'num_players_total', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // Holds the results - $results = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Make a buffer - $buffer = new Buffer($response); - - // Grab the header - $header = $buffer->readString(); - - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [$buffer]) - ); - } - - unset($buffer); - - return $results; - } - - /** - * Handle processing all of the data returned - * - * @param Buffer $buffer - * - * @return array - */ - protected function processAll(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - $result->add('version', $buffer->readString()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('flags', $buffer->readString()); // not sure about that - $result->add('num_players', $buffer->readString()); - $result->add('maxplayers', $buffer->readString()); - $result->add('num_players_total', $buffer->readString()); - $result->add('maxplayers_total', $buffer->readString()); - - // Players - while ($buffer->getLength()) { - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('clan', $buffer->readString()); - $result->addPlayer('flag', $buffer->readString()); - $result->addPlayer('score', $buffer->readString()); - $result->addPlayer('team', $buffer->readString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Terraria.php b/GameQ/src/GameQ/Protocols/Terraria.php deleted file mode 100644 index d9455ef..0000000 --- a/GameQ/src/GameQ/Protocols/Terraria.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Terraria - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Terraria extends Tshock -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'terraria'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Terraria"; - - /** - * query_port = client_port + 101 - * 7878 = 7777 + 101 - * - * @type int - */ - protected $port_diff = 101; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; -} diff --git a/GameQ/src/GameQ/Protocols/Tf2.php b/GameQ/src/GameQ/Protocols/Tf2.php deleted file mode 100644 index e08411b..0000000 --- a/GameQ/src/GameQ/Protocols/Tf2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Tf2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Tf2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'tf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Team Fortress 2"; -} diff --git a/GameQ/src/GameQ/Protocols/Theforrest.php b/GameQ/src/GameQ/Protocols/Theforrest.php deleted file mode 100644 index 975c3f6..0000000 --- a/GameQ/src/GameQ/Protocols/Theforrest.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Theforrest - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Theforrest extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'theforrest'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "The Forrest"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Tibia.php b/GameQ/src/GameQ/Protocols/Tibia.php deleted file mode 100644 index 8702bfa..0000000 --- a/GameQ/src/GameQ/Protocols/Tibia.php +++ /dev/null @@ -1,142 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Tibia Protocol Class - * - * Tibia server query protocol class - * - * Credit to Ahmad Fatoum for providing Perl based querying as a roadmap - * - * @author Yive - * @author Austin Bischoff - */ -class Tibia extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x06\x00\xFF\xFF\x69\x6E\x66\x6F", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'tibia'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'tibia'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Tibia"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "otserv://%s/%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'server', - 'hostname' => 'servername', - 'motd' => 'motd', - 'maxplayers' => 'players_max', - 'numplayers' => 'players_online', - 'map' => 'map_name', - ], - ]; - - /** - * Process the response for the Tibia server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Merge the response packets - $xmlString = implode('', $this->packets_response); - - // Check to make sure this is will decode into a valid XML Document - if (($xmlDoc = @simplexml_load_string($xmlString)) === false) { - throw new Exception(__METHOD__ . " Unable to load XML string."); - } - - // Set the result to a new result instance - $result = new Result(); - - // All servers are dedicated as far as I can tell - $result->add('dedicated', 1); - - // Iterate over the info - foreach (['serverinfo', 'owner', 'map', 'npcs', 'monsters', 'players'] as $property) { - foreach ($xmlDoc->{$property}->attributes() as $key => $value) { - if (!in_array($property, ['serverinfo'])) { - $key = $property . '_' . $key; - } - - // Add the result - $result->add($key, (string)$value); - } - } - - $result->add("motd", (string)$xmlDoc->motd); - - unset($xmlDoc, $xmlDoc); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Tshock.php b/GameQ/src/GameQ/Protocols/Tshock.php deleted file mode 100644 index 551a09e..0000000 --- a/GameQ/src/GameQ/Protocols/Tshock.php +++ /dev/null @@ -1,157 +0,0 @@ -. - */ -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; - -/** - * Tshock Protocol Class - * - * Result from this call should be a header + JSON response - * - * References: - * - https://tshock.atlassian.net/wiki/display/TSHOCKPLUGINS/REST+API+Endpoints#RESTAPIEndpoints-/status - * - http://tshock.co/xf/index.php?threads/rest-tshock-server-status-image.430/ - * - * Special thanks to intradox and Ruok2bu for game & protocol references - * - * @author Austin Bischoff - */ -class Tshock extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - self::PACKET_STATUS => "GET /v2/server/status?players=true&rules=true HTTP/1.0\r\nAccept: */*\r\n\r\n", - ]; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'tshock'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'tshock'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "Tshock"; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'world', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'nickname', - 'team' => 'team', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - if (empty($this->packets_response)) { - return []; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Tshock protocol is invalid."); - } - - // Check the status response - if ($json->status != 200) { - throw new Exception("JSON status from Tshock protocol response was '{$json->status}', expected '200'."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // Add server items - $result->add('hostname', $json->name); - $result->add('game_port', $json->port); - $result->add('serverversion', $json->serverversion); - $result->add('world', $json->world); - $result->add('uptime', $json->uptime); - $result->add('password', (int)$json->serverpassword); - $result->add('numplayers', $json->playercount); - $result->add('maxplayers', $json->maxplayers); - - // Parse players - foreach ($json->players as $player) { - $result->addPlayer('nickname', $player->nickname); - $result->addPlayer('username', $player->username); - $result->addPlayer('group', $player->group); - $result->addPlayer('active', (int)$player->active); - $result->addPlayer('state', $player->state); - $result->addPlayer('team', $player->team); - } - - // Make rules into simple array - $rules = []; - - // Parse rules - foreach ($json->rules as $rule => $value) { - // Add rule but convert boolean into int (0|1) - $rules[$rule] = (is_bool($value)) ? (int)$value : $value; - } - - // Add rules - $result->add('rules', $rules); - - unset($rules, $rule, $player, $value); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Unreal2.php b/GameQ/src/GameQ/Protocols/Unreal2.php deleted file mode 100644 index 0ef0675..0000000 --- a/GameQ/src/GameQ/Protocols/Unreal2.php +++ /dev/null @@ -1,246 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Unreal 2 Protocol class - * - * @author Austin Bischoff - */ -class Unreal2 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\x79\x00\x00\x00\x00", - self::PACKET_RULES => "\x79\x00\x00\x00\x01", - self::PACKET_PLAYERS => "\x79\x00\x00\x00\x02", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x80\x00\x00\x00\x00" => "processDetails", // 0 - "\x80\x00\x00\x00\x01" => "processRules", // 1 - "\x80\x00\x00\x00\x02" => "processPlayers", // 2 - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'unreal2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'unreal2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal 2"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'ServerMode', - 'gametype' => 'gametype', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - * @throws \GameQ\Exception\Protocol - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('serverid', $buffer->readInt32()); // 0 - $result->add('serverip', $buffer->readPascalString(1)); // empty - $result->add('gameport', $buffer->readInt32()); - $result->add('queryport', $buffer->readInt32()); // 0 - $result->add('servername', utf8_encode($buffer->readPascalString(1))); - $result->add('mapname', utf8_encode($buffer->readPascalString(1))); - $result->add('gametype', $buffer->readPascalString(1)); - $result->add('numplayers', $buffer->readInt32()); - $result->add('maxplayers', $buffer->readInt32()); - $result->add('ping', $buffer->readInt32()); // 0 - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt32()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString(1))); - $result->addPlayer('ping', $buffer->readInt32()); - $result->addPlayer('score', $buffer->readInt32()); - - // Skip the next 4, unsure what they are for - $buffer->skip(4); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Named values - $inc = -1; - while ($buffer->getLength()) { - // Grab the key - $key = $buffer->readPascalString(1); - - // Make sure mutators don't overwrite each other - if ($key === 'Mutator') { - $key .= ++$inc; - } - - $result->add(strtolower($key), utf8_encode($buffer->readPascalString(1))); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Unturned.php b/GameQ/src/GameQ/Protocols/Unturned.php deleted file mode 100644 index 4829b37..0000000 --- a/GameQ/src/GameQ/Protocols/Unturned.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unturned Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Unturned extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'unturned'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unturned"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/GameQ/src/GameQ/Protocols/Urbanterror.php b/GameQ/src/GameQ/Protocols/Urbanterror.php deleted file mode 100644 index 682f91e..0000000 --- a/GameQ/src/GameQ/Protocols/Urbanterror.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Urban Terror Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Urbanterror extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'urbanterror'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Urban Terror"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "urt://%s:%d/"; -} diff --git a/GameQ/src/GameQ/Protocols/Ut.php b/GameQ/src/GameQ/Protocols/Ut.php deleted file mode 100644 index 75722ce..0000000 --- a/GameQ/src/GameQ/Protocols/Ut.php +++ /dev/null @@ -1,73 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament Protocol Class - * - * @author Austin Bischoff - */ -class Ut extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'frags', - ], - ]; -} diff --git a/GameQ/src/GameQ/Protocols/Ut2004.php b/GameQ/src/GameQ/Protocols/Ut2004.php deleted file mode 100644 index 953089f..0000000 --- a/GameQ/src/GameQ/Protocols/Ut2004.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament 2004 Protocol Class - * - * @author Austin Bischoff - */ -class Ut2004 extends Unreal2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut2004'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament 2004"; -} diff --git a/GameQ/src/GameQ/Protocols/Ut3.php b/GameQ/src/GameQ/Protocols/Ut3.php deleted file mode 100644 index b55cc34..0000000 --- a/GameQ/src/GameQ/Protocols/Ut3.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament 3 Protocol Class - * - * Note: The response from UT3 appears to not be consistent. Many times packets are incomplete or there are extra - * "echoes" in the responses. This may cause issues like odd characters showing up in the keys for the player and team - * array responses. Not sure much can be done about it. - * - * @author Austin Bischoff - */ -class Ut3 extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament 3"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'bIsDedicated', - 'hostname' => 'hostname', - 'numplayers' => 'numplayers', - ], - ]; - - /** - * Overload the response process so we can make some changes - * - * @return array - */ - public function processResponse() - { - - // Grab the result from the parent - /** @type array $result */ - $result = parent::processResponse(); - - // Move some stuff around - $this->renameResult($result, 'OwningPlayerName', 'hostname'); - $this->renameResult($result, 'p1073741825', 'mapname'); - $this->renameResult($result, 'p1073741826', 'gametype'); - $this->renameResult($result, 'p1073741827', 'servername'); - $this->renameResult($result, 'p1073741828', 'custom_mutators'); - $this->renameResult($result, 'gamemode', 'open'); - $this->renameResult($result, 's32779', 'gamemode'); - $this->renameResult($result, 's0', 'bot_skill'); - $this->renameResult($result, 's6', 'pure_server'); - $this->renameResult($result, 's7', 'password'); - $this->renameResult($result, 's8', 'vs_bots'); - $this->renameResult($result, 's10', 'force_respawn'); - $this->renameResult($result, 'p268435704', 'frag_limit'); - $this->renameResult($result, 'p268435705', 'time_limit'); - $this->renameResult($result, 'p268435703', 'numbots'); - $this->renameResult($result, 'p268435717', 'stock_mutators'); - - // Put custom mutators into an array - if (isset($result['custom_mutators'])) { - $result['custom_mutators'] = explode("\x1c", $result['custom_mutators']); - } - - // Delete some unknown stuff - $this->deleteResult($result, ['s1', 's9', 's11', 's12', 's13', 's14']); - - // Return the result - return $result; - } - - /** - * Dirty hack to rename result entries into something more useful - * - * @param array $result - * @param string $old - * @param string $new - */ - protected function renameResult(array &$result, $old, $new) - { - - // Check to see if the old item is there - if (isset($result[$old])) { - $result[$new] = $result[$old]; - unset($result[$old]); - } - } - - /** - * Dirty hack to delete result items - * - * @param array $result - * @param array $array - */ - protected function deleteResult(array &$result, array $array) - { - - foreach ($array as $key) { - unset($result[$key]); - } - } -} diff --git a/GameQ/src/GameQ/Protocols/Ventrilo.php b/GameQ/src/GameQ/Protocols/Ventrilo.php deleted file mode 100644 index 8a1e0e8..0000000 --- a/GameQ/src/GameQ/Protocols/Ventrilo.php +++ /dev/null @@ -1,877 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Ventrilo Protocol Class - * - * Note that a password is not required for versions >= 3.0.3 - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Ventrilo extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => - "V\xc8\xf4\xf9`\xa2\x1e\xa5M\xfb\x03\xccQN\xa1\x10\x95\xaf\xb2g\x17g\x812\xfbW\xfd\x8e\xd2\x22r\x034z\xbb\x98", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ventrilo'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ventrilo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Ventrilo"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "ventrilo://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'password' => 'auth', - 'hostname' => 'name', - 'numplayers' => 'clientcount', - 'maxplayers' => 'maxclients', - ], - // Player - 'player' => [ - 'team' => 'cid', - 'name' => 'name', - ], - // Team - 'team' => [ - 'id' => 'cid', - 'name' => 'name', - ], - ]; - - /** - * Encryption table for the header - * - * @type array - */ - private $head_encrypt_table = [ - 0x80, - 0xe5, - 0x0e, - 0x38, - 0xba, - 0x63, - 0x4c, - 0x99, - 0x88, - 0x63, - 0x4c, - 0xd6, - 0x54, - 0xb8, - 0x65, - 0x7e, - 0xbf, - 0x8a, - 0xf0, - 0x17, - 0x8a, - 0xaa, - 0x4d, - 0x0f, - 0xb7, - 0x23, - 0x27, - 0xf6, - 0xeb, - 0x12, - 0xf8, - 0xea, - 0x17, - 0xb7, - 0xcf, - 0x52, - 0x57, - 0xcb, - 0x51, - 0xcf, - 0x1b, - 0x14, - 0xfd, - 0x6f, - 0x84, - 0x38, - 0xb5, - 0x24, - 0x11, - 0xcf, - 0x7a, - 0x75, - 0x7a, - 0xbb, - 0x78, - 0x74, - 0xdc, - 0xbc, - 0x42, - 0xf0, - 0x17, - 0x3f, - 0x5e, - 0xeb, - 0x74, - 0x77, - 0x04, - 0x4e, - 0x8c, - 0xaf, - 0x23, - 0xdc, - 0x65, - 0xdf, - 0xa5, - 0x65, - 0xdd, - 0x7d, - 0xf4, - 0x3c, - 0x4c, - 0x95, - 0xbd, - 0xeb, - 0x65, - 0x1c, - 0xf4, - 0x24, - 0x5d, - 0x82, - 0x18, - 0xfb, - 0x50, - 0x86, - 0xb8, - 0x53, - 0xe0, - 0x4e, - 0x36, - 0x96, - 0x1f, - 0xb7, - 0xcb, - 0xaa, - 0xaf, - 0xea, - 0xcb, - 0x20, - 0x27, - 0x30, - 0x2a, - 0xae, - 0xb9, - 0x07, - 0x40, - 0xdf, - 0x12, - 0x75, - 0xc9, - 0x09, - 0x82, - 0x9c, - 0x30, - 0x80, - 0x5d, - 0x8f, - 0x0d, - 0x09, - 0xa1, - 0x64, - 0xec, - 0x91, - 0xd8, - 0x8a, - 0x50, - 0x1f, - 0x40, - 0x5d, - 0xf7, - 0x08, - 0x2a, - 0xf8, - 0x60, - 0x62, - 0xa0, - 0x4a, - 0x8b, - 0xba, - 0x4a, - 0x6d, - 0x00, - 0x0a, - 0x93, - 0x32, - 0x12, - 0xe5, - 0x07, - 0x01, - 0x65, - 0xf5, - 0xff, - 0xe0, - 0xae, - 0xa7, - 0x81, - 0xd1, - 0xba, - 0x25, - 0x62, - 0x61, - 0xb2, - 0x85, - 0xad, - 0x7e, - 0x9d, - 0x3f, - 0x49, - 0x89, - 0x26, - 0xe5, - 0xd5, - 0xac, - 0x9f, - 0x0e, - 0xd7, - 0x6e, - 0x47, - 0x94, - 0x16, - 0x84, - 0xc8, - 0xff, - 0x44, - 0xea, - 0x04, - 0x40, - 0xe0, - 0x33, - 0x11, - 0xa3, - 0x5b, - 0x1e, - 0x82, - 0xff, - 0x7a, - 0x69, - 0xe9, - 0x2f, - 0xfb, - 0xea, - 0x9a, - 0xc6, - 0x7b, - 0xdb, - 0xb1, - 0xff, - 0x97, - 0x76, - 0x56, - 0xf3, - 0x52, - 0xc2, - 0x3f, - 0x0f, - 0xb6, - 0xac, - 0x77, - 0xc4, - 0xbf, - 0x59, - 0x5e, - 0x80, - 0x74, - 0xbb, - 0xf2, - 0xde, - 0x57, - 0x62, - 0x4c, - 0x1a, - 0xff, - 0x95, - 0x6d, - 0xc7, - 0x04, - 0xa2, - 0x3b, - 0xc4, - 0x1b, - 0x72, - 0xc7, - 0x6c, - 0x82, - 0x60, - 0xd1, - 0x0d, - ]; - - /** - * Encryption table for the data - * - * @type array - */ - private $data_encrypt_table = [ - 0x82, - 0x8b, - 0x7f, - 0x68, - 0x90, - 0xe0, - 0x44, - 0x09, - 0x19, - 0x3b, - 0x8e, - 0x5f, - 0xc2, - 0x82, - 0x38, - 0x23, - 0x6d, - 0xdb, - 0x62, - 0x49, - 0x52, - 0x6e, - 0x21, - 0xdf, - 0x51, - 0x6c, - 0x76, - 0x37, - 0x86, - 0x50, - 0x7d, - 0x48, - 0x1f, - 0x65, - 0xe7, - 0x52, - 0x6a, - 0x88, - 0xaa, - 0xc1, - 0x32, - 0x2f, - 0xf7, - 0x54, - 0x4c, - 0xaa, - 0x6d, - 0x7e, - 0x6d, - 0xa9, - 0x8c, - 0x0d, - 0x3f, - 0xff, - 0x6c, - 0x09, - 0xb3, - 0xa5, - 0xaf, - 0xdf, - 0x98, - 0x02, - 0xb4, - 0xbe, - 0x6d, - 0x69, - 0x0d, - 0x42, - 0x73, - 0xe4, - 0x34, - 0x50, - 0x07, - 0x30, - 0x79, - 0x41, - 0x2f, - 0x08, - 0x3f, - 0x42, - 0x73, - 0xa7, - 0x68, - 0xfa, - 0xee, - 0x88, - 0x0e, - 0x6e, - 0xa4, - 0x70, - 0x74, - 0x22, - 0x16, - 0xae, - 0x3c, - 0x81, - 0x14, - 0xa1, - 0xda, - 0x7f, - 0xd3, - 0x7c, - 0x48, - 0x7d, - 0x3f, - 0x46, - 0xfb, - 0x6d, - 0x92, - 0x25, - 0x17, - 0x36, - 0x26, - 0xdb, - 0xdf, - 0x5a, - 0x87, - 0x91, - 0x6f, - 0xd6, - 0xcd, - 0xd4, - 0xad, - 0x4a, - 0x29, - 0xdd, - 0x7d, - 0x59, - 0xbd, - 0x15, - 0x34, - 0x53, - 0xb1, - 0xd8, - 0x50, - 0x11, - 0x83, - 0x79, - 0x66, - 0x21, - 0x9e, - 0x87, - 0x5b, - 0x24, - 0x2f, - 0x4f, - 0xd7, - 0x73, - 0x34, - 0xa2, - 0xf7, - 0x09, - 0xd5, - 0xd9, - 0x42, - 0x9d, - 0xf8, - 0x15, - 0xdf, - 0x0e, - 0x10, - 0xcc, - 0x05, - 0x04, - 0x35, - 0x81, - 0xb2, - 0xd5, - 0x7a, - 0xd2, - 0xa0, - 0xa5, - 0x7b, - 0xb8, - 0x75, - 0xd2, - 0x35, - 0x0b, - 0x39, - 0x8f, - 0x1b, - 0x44, - 0x0e, - 0xce, - 0x66, - 0x87, - 0x1b, - 0x64, - 0xac, - 0xe1, - 0xca, - 0x67, - 0xb4, - 0xce, - 0x33, - 0xdb, - 0x89, - 0xfe, - 0xd8, - 0x8e, - 0xcd, - 0x58, - 0x92, - 0x41, - 0x50, - 0x40, - 0xcb, - 0x08, - 0xe1, - 0x15, - 0xee, - 0xf4, - 0x64, - 0xfe, - 0x1c, - 0xee, - 0x25, - 0xe7, - 0x21, - 0xe6, - 0x6c, - 0xc6, - 0xa6, - 0x2e, - 0x52, - 0x23, - 0xa7, - 0x20, - 0xd2, - 0xd7, - 0x28, - 0x07, - 0x23, - 0x14, - 0x24, - 0x3d, - 0x45, - 0xa5, - 0xc7, - 0x90, - 0xdb, - 0x77, - 0xdd, - 0xea, - 0x38, - 0x59, - 0x89, - 0x32, - 0xbc, - 0x00, - 0x3a, - 0x6d, - 0x61, - 0x4e, - 0xdb, - 0x29, - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // We need to decrypt the packets - $decrypted = $this->decryptPackets($this->packets_response); - - // Now let us convert special characters from hex to ascii all at once - $decrypted = preg_replace_callback( - '|%([0-9A-F]{2})|', - function ($matches) { - - // Pack this into ascii - return pack('H*', $matches[1]); - }, - $decrypted - ); - - // Explode into lines - $lines = explode("\n", $decrypted); - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Defaults - $channelFields = 5; - $playerFields = 7; - - // Iterate over the lines - foreach ($lines as $line) { - // Trim all the outlying space - $line = trim($line); - - // We dont have anything in this line - if (strlen($line) == 0) { - continue; - } - - /** - * Everything is in this format: ITEM: VALUE - * - * Example: - * ... - * MAXCLIENTS: 175 - * VOICECODEC: 3,Speex - * VOICEFORMAT: 31,32 KHz%2C 16 bit%2C 9 Qlty - * UPTIME: 9167971 - * PLATFORM: Linux-i386 - * VERSION: 3.0.6 - * ... - */ - - // Check to see if we have a colon, every line should - if (($colon_pos = strpos($line, ":")) !== false && $colon_pos > 0) { - // Split the line into key/value pairs - list($key, $value) = explode(':', $line, 2); - - // Lower the font of the key - $key = strtolower($key); - - // Trim the value of extra space - $value = trim($value); - - // Switch and offload items as needed - switch ($key) { - case 'client': - $this->processPlayer($value, $playerFields, $result); - break; - - case 'channel': - $this->processChannel($value, $channelFields, $result); - break; - - // Find the number of fields for the channels - case 'channelfields': - $channelFields = count(explode(',', $value)); - break; - - // Find the number of fields for the players - case 'clientfields': - $playerFields = count(explode(',', $value)); - break; - - // By default we just add they key as an item - default: - $result->add($key, utf8_encode($value)); - break; - } - } - } - - unset($decrypted, $line, $lines, $colon_pos, $key, $value); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Decrypt the incoming packets - * - * @codeCoverageIgnore - * - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function decryptPackets(array $packets = []) - { - - // This will be returned - $decrypted = []; - - foreach ($packets as $packet) { - # Header : - $header = substr($packet, 0, 20); - - $header_items = []; - - $header_key = unpack("n1", $header); - - $key = array_shift($header_key); - - $chars = unpack("C*", substr($header, 2)); - - $a1 = $key & 0xFF; - $a2 = $key >> 8; - - if ($a1 == 0) { - throw new Exception(__METHOD__ . ": Header key is invalid"); - } - - $table = $this->head_encrypt_table; - - $characterCount = count($chars); - - $key = 0; - for ($i = 1; $i <= $characterCount; $i++) { - $chars[$i] -= ($table[$a2] + (($i - 1) % 5)) & 0xFF; - $a2 = ($a2 + $a1) & 0xFF; - if (($i % 2) == 0) { - $short_array = unpack("n1", pack("C2", $chars[$i - 1], $chars[$i])); - $header_items[$key] = $short_array[1]; - ++$key; - } - } - - $header_items = array_combine([ - 'zero', - 'cmd', - 'id', - 'totlen', - 'len', - 'totpck', - 'pck', - 'datakey', - 'crc', - ], $header_items); - - // Check to make sure the number of packets match - if ($header_items['totpck'] != count($packets)) { - throw new Exception(__METHOD__ . ": Too few packets received"); - } - - # Data : - $table = $this->data_encrypt_table; - $a1 = $header_items['datakey'] & 0xFF; - $a2 = $header_items['datakey'] >> 8; - - if ($a1 == 0) { - throw new Exception(__METHOD__ . ": Data key is invalid"); - } - - $chars = unpack("C*", substr($packet, 20)); - $data = ""; - $characterCount = count($chars); - - for ($i = 1; $i <= $characterCount; $i++) { - $chars[$i] -= ($table[$a2] + (($i - 1) % 72)) & 0xFF; - $a2 = ($a2 + $a1) & 0xFF; - $data .= chr($chars[$i]); - } - //@todo: Check CRC ??? - $decrypted[$header_items['pck']] = $data; - } - - // Return the decrypted packets as one string - return implode('', $decrypted); - } - - /** - * Process the channel listing - * - * @param string $data - * @param int $fieldCount - * @param \GameQ\Result $result - */ - protected function processChannel($data, $fieldCount, Result &$result) - { - - // Split the items on the comma - $items = explode(",", $data, $fieldCount); - - // Iterate over the items for this channel - foreach ($items as $item) { - // Split the key=value pair - list($key, $value) = explode("=", $item, 2); - - $result->addTeam(strtolower($key), utf8_encode($value)); - } - } - - /** - * Process the user listing - * - * @param string $data - * @param int $fieldCount - * @param \GameQ\Result $result - */ - protected function processPlayer($data, $fieldCount, Result &$result) - { - - // Split the items on the comma - $items = explode(",", $data, $fieldCount); - - // Iterate over the items for this player - foreach ($items as $item) { - // Split the key=value pair - list($key, $value) = explode("=", $item, 2); - - $result->addPlayer(strtolower($key), utf8_encode($value)); - } - } -} diff --git a/GameQ/src/GameQ/Protocols/Warsow.php b/GameQ/src/GameQ/Protocols/Warsow.php deleted file mode 100644 index f1d629a..0000000 --- a/GameQ/src/GameQ/Protocols/Warsow.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Warsow Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Warsow extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'warsow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Warsow"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "warsow://%s:%d/"; - - /** - * Handle player info, different than quake3 base - * - * @param Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processPlayers(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Make a new buffer with this block - $playerInfo = new Buffer($buffer->readString("\x0A")); - - // Add player info - $result->addPlayer('frags', $playerInfo->readString("\x20")); - $result->addPlayer('ping', $playerInfo->readString("\x20")); - - // Skip first " - $playerInfo->skip(1); - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); - - // Skip space - $playerInfo->skip(1); - - // Add team - $result->addPlayer('team', $playerInfo->read()); - - // Clear - unset($playerInfo); - } - - // Clear - unset($buffer); - - return $result->fetch(); - } -} diff --git a/GameQ/src/GameQ/Protocols/Won.php b/GameQ/src/GameQ/Protocols/Won.php deleted file mode 100644 index bef0984..0000000 --- a/GameQ/src/GameQ/Protocols/Won.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * World Opponent Network (WON) class - * - * Pre-cursor to the A2S (source) protocol system - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - * - * @package GameQ\Protocols - */ -class Won extends Source -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFdetails\x00", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFFplayers", - self::PACKET_RULES => "\xFF\xFF\xFF\xFFrules", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'won'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'won'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "World Opponent Network"; -} diff --git a/GameQ/src/GameQ/Protocols/Wurm.php b/GameQ/src/GameQ/Protocols/Wurm.php deleted file mode 100644 index c593652..0000000 --- a/GameQ/src/GameQ/Protocols/Wurm.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Wurm Unlimited Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Wurm extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'wurm'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Wurm Unlimited"; -} diff --git a/GameQ/src/GameQ/Query/Core.php b/GameQ/src/GameQ/Query/Core.php deleted file mode 100644 index 5eb08ad..0000000 --- a/GameQ/src/GameQ/Query/Core.php +++ /dev/null @@ -1,164 +0,0 @@ -. - */ - -namespace GameQ\Query; - -/** - * Core for the query mechanisms - * - * @author Austin Bischoff - */ -abstract class Core -{ - - /** - * The socket used by this resource - * - * @type null|resource - */ - public $socket = null; - - /** - * The transport type (udp, tcp, etc...) - * See http://php.net/manual/en/transports.php for the supported list - * - * @type string - */ - protected $transport = null; - - /** - * Connection IP address - * - * @type string - */ - protected $ip = null; - - /** - * Connection port - * - * @type int - */ - protected $port = null; - - /** - * The time in seconds to wait before timing out while connecting to the socket - * - * @type int - */ - protected $timeout = 3; // Seconds - - /** - * Socket is blocking? - * - * @type bool - */ - protected $blocking = false; - - /** - * Called when the class is cloned - */ - public function __clone() - { - - // Reset the properties for this class when cloned - $this->reset(); - } - - /** - * Set the connection information for the socket - * - * @param string $transport - * @param string $ip - * @param int $port - * @param int $timeout seconds - * @param bool $blocking - */ - public function set($transport, $ip, $port, $timeout = 3, $blocking = false) - { - - $this->transport = $transport; - - $this->ip = $ip; - - $this->port = $port; - - $this->timeout = $timeout; - - $this->blocking = $blocking; - } - - /** - * Reset this instance's properties - */ - public function reset() - { - - $this->transport = null; - - $this->ip = null; - - $this->port = null; - - $this->timeout = 3; - - $this->blocking = false; - } - - /** - * Create a new socket - * - * @return void - */ - abstract protected function create(); - - /** - * Get the socket - * - * @return mixed - */ - abstract public function get(); - - /** - * Write data to the socket - * - * @param string $data - * - * @return int The number of bytes written - */ - abstract public function write($data); - - /** - * Close the socket - * - * @return void - */ - abstract public function close(); - - /** - * Read the responses from the socket(s) - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param array $sockets - * @param int $timeout - * @param int $stream_timeout - * - * @return array - */ - abstract public function getResponses(array $sockets, $timeout, $stream_timeout); -} diff --git a/GameQ/src/GameQ/Query/Native.php b/GameQ/src/GameQ/Query/Native.php deleted file mode 100644 index b078c9c..0000000 --- a/GameQ/src/GameQ/Query/Native.php +++ /dev/null @@ -1,221 +0,0 @@ -. - */ - -namespace GameQ\Query; - -use GameQ\Exception\Query as Exception; - -/** - * Native way of querying servers - * - * @author Austin Bischoff - */ -class Native extends Core -{ - /** - * Get the current socket or create one and return - * - * @return resource|null - * @throws \GameQ\Exception\Query - */ - public function get() - { - - // No socket for this server, make one - if (is_null($this->socket)) { - $this->create(); - } - - return $this->socket; - } - - /** - * Write data to the socket - * - * @param string $data - * - * @return int The number of bytes written - * @throws \GameQ\Exception\Query - */ - public function write($data) - { - - try { - // No socket for this server, make one - if (is_null($this->socket)) { - $this->create(); - } - - // Send the packet - return fwrite($this->socket, $data); - } catch (\Exception $e) { - throw new Exception($e->getMessage(), $e->getCode(), $e); - } - } - - /** - * Close the current socket - */ - public function close() - { - - if ($this->socket) { - fclose($this->socket); - $this->socket = null; - } - } - - /** - * Create a new socket for this query - * - * @throws \GameQ\Exception\Query - */ - protected function create() - { - - // Create the remote address - $remote_addr = sprintf("%s://%s:%d", $this->transport, $this->ip, $this->port); - - // Create context - $context = stream_context_create([ - 'socket' => [ - 'bindto' => '0:0', // Bind to any available IP and OS decided port - ], - ]); - - // Define these first - $errno = null; - $errstr = null; - - // Create the socket - if (($this->socket = - @stream_socket_client($remote_addr, $errno, $errstr, $this->timeout, STREAM_CLIENT_CONNECT, $context)) - !== false - ) { - // Set the read timeout on the streams - stream_set_timeout($this->socket, $this->timeout); - - // Set blocking mode - stream_set_blocking($this->socket, $this->blocking); - } else { - // Reset socket - $this->socket = null; - - // Something bad happened, throw query exception - throw new Exception( - __METHOD__ . " - Error creating socket to server {$this->ip}:{$this->port}. Error: " . $errstr, - $errno - ); - } - } - - /** - * Pull the responses out of the stream - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) - * - * @param array $sockets - * @param int $timeout - * @param int $stream_timeout - * - * @return array Raw responses - */ - public function getResponses(array $sockets, $timeout, $stream_timeout) - { - - // Set the loop to active - $loop_active = true; - - // Will hold the responses read from the sockets - $responses = []; - - // To store the sockets - $sockets_tmp = []; - - // Loop and pull out all the actual sockets we need to listen on - foreach ($sockets as $socket_id => $socket_data) { - // Get the socket - /* @var $socket \GameQ\Query\Core */ - $socket = $socket_data['socket']; - - // Append the actual socket we are listening to - $sockets_tmp[$socket_id] = $socket->get(); - - unset($socket); - } - - // Init some variables - $read = $sockets_tmp; - $write = null; - $except = null; - - // Check to see if $read is empty, if so stream_select() will throw a warning - if (empty($read)) { - return $responses; - } - - // This is when it should stop - $time_stop = microtime(true) + $timeout; - - // Let's loop until we break something. - while ($loop_active && microtime(true) < $time_stop) { - // Check to make sure $read is not empty, if so we are done - if (empty($read)) { - break; - } - - // Now lets listen for some streams, but do not cross the streams! - $streams = stream_select($read, $write, $except, 0, $stream_timeout); - - // We had error or no streams left, kill the loop - if ($streams === false || ($streams <= 0)) { - break; - } - - // Loop the sockets that received data back - foreach ($read as $socket) { - /* @var $socket resource */ - - // See if we have a response - if (($response = fread($socket, 8192)) === false) { - continue; // No response yet so lets continue. - } - - // Check to see if the response is empty, if so we are done with this server - if (strlen($response) == 0) { - // Remove this server from any future read loops - unset($sockets_tmp[(int)$socket]); - continue; - } - - // Add the response we got back - $responses[(int)$socket][] = $response; - } - - // Because stream_select modifies read we need to reset it each time to the original array of sockets - $read = $sockets_tmp; - } - - // Free up some memory - unset($streams, $read, $write, $except, $sockets_tmp, $time_stop, $response); - - // Return all of the responses, may be empty if something went wrong - return $responses; - } -} diff --git a/GameQ/src/GameQ/Result.php b/GameQ/src/GameQ/Result.php deleted file mode 100644 index 7023f17..0000000 --- a/GameQ/src/GameQ/Result.php +++ /dev/null @@ -1,130 +0,0 @@ -. - */ - -namespace GameQ; - -/** - * Provide an interface for easy storage of a parsed server response - * - * @author Aidan Lister - * @author Tom Buskens - */ -class Result -{ - - /** - * Formatted server response - * - * @var array - */ - protected $result = []; - - /** - * Adds variable to results - * - * @param string $name Variable name - * @param string|array $value Variable value - */ - public function add($name, $value) - { - - $this->result[$name] = $value; - } - - /** - * Adds player variable to output - * - * @param string $name Variable name - * @param string $value Variable value - */ - public function addPlayer($name, $value) - { - - $this->addSub('players', $name, $value); - } - - /** - * Adds player variable to output - * - * @param string $name Variable name - * @param string $value Variable value - */ - public function addTeam($name, $value) - { - - $this->addSub('teams', $name, $value); - } - - /** - * Add a variable to a category - * - * @param $sub string The category - * @param $key string The variable name - * @param $value string The variable value - */ - public function addSub($sub, $key, $value) - { - - // Nothing of this type yet, set an empty array - if (!isset($this->result[$sub]) or !is_array($this->result[$sub])) { - $this->result[$sub] = []; - } - - // Find the first entry that doesn't have this variable - $found = false; - $count = count($this->result[$sub]); - for ($i = 0; $i != $count; $i++) { - if (!isset($this->result[$sub][$i][$key])) { - $this->result[$sub][$i][$key] = $value; - $found = true; - break; - } - } - - // Not found, create a new entry - if (!$found) { - $this->result[$sub][][$key] = $value; - } - - unset($count); - } - - /** - * Return all stored results - * - * @return array All results - */ - public function fetch() - { - - return $this->result; - } - - /** - * Return a single variable - * - * @param string $var The variable name - * - * @return mixed The variable value - */ - public function get($var) - { - - return isset($this->result[$var]) ? $this->result[$var] : null; - } -} diff --git a/GameQ/src/GameQ/Server.php b/GameQ/src/GameQ/Server.php deleted file mode 100644 index dff8f77..0000000 --- a/GameQ/src/GameQ/Server.php +++ /dev/null @@ -1,380 +0,0 @@ -. - */ - -namespace GameQ; - -use GameQ\Exception\Server as Exception; - -/** - * Server class to represent each server entity - * - * @author Austin Bischoff - */ -class Server -{ - - /* - * Server array keys - */ - const SERVER_TYPE = 'type'; - - const SERVER_HOST = 'host'; - - const SERVER_ID = 'id'; - - const SERVER_OPTIONS = 'options'; - - /* - * Server options keys - */ - - /* - * Use this option when the query_port and client connect ports are different - */ - const SERVER_OPTIONS_QUERY_PORT = 'query_port'; - - /** - * The protocol class for this server - * - * @type \GameQ\Protocol - */ - protected $protocol = null; - - /** - * Id of this server - * - * @type string - */ - public $id = null; - - /** - * IP Address of this server - * - * @type string - */ - public $ip = null; - - /** - * The server's client port (connect port) - * - * @type int - */ - public $port_client = null; - - /** - * The server's query port - * - * @type int - */ - public $port_query = null; - - /** - * Holds other server specific options - * - * @type array - */ - protected $options = []; - - /** - * Holds the sockets already open for this server - * - * @type array - */ - protected $sockets = []; - - /** - * Construct the class with the passed options - * - * @param array $server_info - * - * @throws \GameQ\Exception\Server - */ - public function __construct(array $server_info = []) - { - - // Check for server type - if (!array_key_exists(self::SERVER_TYPE, $server_info) || empty($server_info[self::SERVER_TYPE])) { - throw new Exception("Missing server info key '" . self::SERVER_TYPE . "'!"); - } - - // Check for server host - if (!array_key_exists(self::SERVER_HOST, $server_info) || empty($server_info[self::SERVER_HOST])) { - throw new Exception("Missing server info key '" . self::SERVER_HOST . "'!"); - } - - // IP address and port check - $this->checkAndSetIpPort($server_info[self::SERVER_HOST]); - - // Check for server id - if (array_key_exists(self::SERVER_ID, $server_info) && !empty($server_info[self::SERVER_ID])) { - // Set the server id - $this->id = $server_info[self::SERVER_ID]; - } else { - // Make an id so each server has an id when returned - $this->id = sprintf('%s:%d', $this->ip, $this->port_client); - } - - // Check and set server options - if (array_key_exists(self::SERVER_OPTIONS, $server_info)) { - // Set the options - $this->options = $server_info[self::SERVER_OPTIONS]; - } - - try { - // Make the protocol class for this type - $class = new \ReflectionClass( - sprintf('GameQ\\Protocols\\%s', ucfirst(strtolower($server_info[self::SERVER_TYPE]))) - ); - - $this->protocol = $class->newInstanceArgs([$this->options]); - } catch (\ReflectionException $e) { - throw new Exception("Unable to locate Protocols class for '{$server_info[self::SERVER_TYPE]}'!"); - } - - // Check and set any server options - $this->checkAndSetServerOptions(); - - unset($server_info, $class); - } - - /** - * Check and set the ip address for this server - * - * @param $ip_address - * - * @throws \GameQ\Exception\Server - */ - protected function checkAndSetIpPort($ip_address) - { - - // Test for IPv6 - if (substr_count($ip_address, ':') > 1) { - // See if we have a port, input should be in the format [::1]:27015 or similar - if (strstr($ip_address, ']:')) { - // Explode to get port - $server_addr = explode(':', $ip_address); - - // Port is the last item in the array, remove it and save - $this->port_client = (int)array_pop($server_addr); - - // The rest is the address, recombine - $this->ip = implode(':', $server_addr); - - unset($server_addr); - } else { - // Just the IPv6 address, no port defined, fail - throw new Exception( - "The host address '{$ip_address}' is missing the port. All " - . "servers must have a port defined!" - ); - } - - // Now let's validate the IPv6 value sent, remove the square brackets ([]) first - if (!filter_var(trim($this->ip, '[]'), FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV6,])) { - throw new Exception("The IPv6 address '{$this->ip}' is invalid."); - } - } else { - // We have IPv4 with a port defined - if (strstr($ip_address, ':')) { - list($this->ip, $this->port_client) = explode(':', $ip_address); - - // Type case the port - $this->port_client = (int)$this->port_client; - } else { - // No port, fail - throw new Exception( - "The host address '{$ip_address}' is missing the port. All " - . "servers must have a port defined!" - ); - } - - // Validate the IPv4 value, if FALSE is not a valid IP, maybe a hostname. Try to resolve - if (!filter_var($this->ip, FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV4,]) - && $this->ip === gethostbyname($this->ip) - ) { - // When gethostbyname() fails it returns the original string - // so if ip and the result from gethostbyname() are equal this failed. - throw new Exception("Unable to resolve the host '{$this->ip}' to an IP address."); - } - } - } - - /** - * Check and set any server specific options - */ - protected function checkAndSetServerOptions() - { - - // Specific query port defined - if (array_key_exists(self::SERVER_OPTIONS_QUERY_PORT, $this->options)) { - $this->port_query = (int)$this->options[self::SERVER_OPTIONS_QUERY_PORT]; - } else { - // Do math based on the protocol class - $this->port_query = $this->protocol->findQueryPort($this->port_client); - } - } - - /** - * Set an option for this server - * - * @param $key - * @param $value - * - * @return $this - */ - public function setOption($key, $value) - { - - $this->options[$key] = $value; - - return $this; // Make chainable - } - - /** - * Return set option value - * - * @param mixed $key - * - * @return mixed - */ - public function getOption($key) - { - - return (array_key_exists($key, $this->options)) ? $this->options[$key] : null; - } - - /** - * Get the ID for this server - * - * @return string - */ - public function id() - { - - return $this->id; - } - - /** - * Get the IP address for this server - * - * @return string - */ - public function ip() - { - - return $this->ip; - } - - /** - * Get the client port for this server - * - * @return int - */ - public function portClient() - { - - return $this->port_client; - } - - /** - * Get the query port for this server - * - * @return int - */ - public function portQuery() - { - - return $this->port_query; - } - - /** - * Return the protocol class for this server - * - * @return \GameQ\Protocol - */ - public function protocol() - { - - return $this->protocol; - } - - /** - * Get the join link for this server - * - * @return string - */ - public function getJoinLink() - { - - return sprintf($this->protocol->joinLink(), $this->ip, $this->portClient()); - } - - /* - * Socket holding - */ - - /** - * Add a socket for this server to be reused - * - * @codeCoverageIgnore - * - * @param \GameQ\Query\Core $socket - */ - public function socketAdd(Query\Core $socket) - { - - $this->sockets[] = $socket; - } - - /** - * Get a socket from the list to reuse, if any are available - * - * @codeCoverageIgnore - * - * @return \GameQ\Query\Core|null - */ - public function socketGet() - { - - $socket = null; - - if (count($this->sockets) > 0) { - $socket = array_pop($this->sockets); - } - - return $socket; - } - - /** - * Clear any sockets still listed and attempt to close them - * - * @codeCoverageIgnore - */ - public function socketCleanse() - { - - // Close all of the sockets available - foreach ($this->sockets as $socket) { - /* @var $socket \GameQ\Query\Core */ - $socket->close(); - } - - // Reset the sockets list - $this->sockets = []; - } -} diff --git a/GameQ/status_expansion.php b/GameQ/status_expansion.php deleted file mode 100644 index dca5ef2..0000000 --- a/GameQ/status_expansion.php +++ /dev/null @@ -1,206 +0,0 @@ -addServer([ - 'type' => 'dayz', - 'host' => '82.64.214.194:3222', - 'options' => [ - 'query_port' => 27022, - ], -]); - - -// 'type' => 'dayz', -// 'host' => '82.64.214.194:2303', -// 'options' => [ -// 'query_port' => 27023, -// ], -//]); - -// Define the servers you wish you query -//$GameQ = new \GameQ\GameQ(); // or //$GameQ = \GameQ\GameQ::factory(); - -$GameQ->setOption('timeout', 3); // 3 seconds -$results = $GameQ->process(); - -//print_r($results); - //echo "

// var dump

"; - //var_dump(json_decode($readjson, true)); -//echo "

// echo

"; -// echo $readjson
"; - //$data1 = json_decode("$readjson", true); -//echo "

//Print data1

" ; - //print_r($data1); -echo "
"; - - -//$data = json_decode($readjson); -$data = json_decode($GameQ); -// class -$name = $data->{'name'}; -$map = $data->{'map'}; -$password = $data->{'password'}; -$game = $data->{'raw'}->{'game'}; -$secure = $data->{'raw'}->{'secure'}; -$numplayers = $data->{'raw'}->{'numplayers'}; -$version = $data->{'raw'}->{'version'}; -$tags = $data->{'raw'}->{'tags'}; - -//$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; -//$island = $data->{'raw'}->{'rules'}->{'island'}; - - -$connect = $data->{'connect'}; -$ping = $data->{'ping'}; -$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; -$battleye = substr($tags,0,8); -$hive = substr($tags,18,8); -$players = $data->{'players'}; - -//if(empty($players)) -// $players = "0"; -//if (empty($players)) { "0"; } -//$playersuser = substr($players,0,8); -//$players = $data->{'array_filter($players)'}; -//$player = $data->{'players'}; - -?> - - - - - Dayz ToX Server: <?php echo"${name}"; ?> - - - - - -

- - - - - - -
-
- - - - - - - - - - - - - - - -
- Server Name IP server Ping Time Player Info Joueurs Version Battleye
-
- -

- - - - - - - - - - - - -
Players Info Debug
Nameprint_r ";print_r($players); - -?> -
- -"; -echo "
Resultat
"; -echo "
Server Name: ${name} \n";echo "
"; -echo "Map: ${map}
"; -echo "Game: ${game}
"; -echo "IP: ${connect}
"; -echo "Secure: ${secure}
"; -echo "Version: ${version}
"; -//echo "Island: ${island}
"; -//echo "dedicated: ${dedicated}
"; -echo "Ping: ${ping}
"; -echo "Time: $time
"; -echo "Nombre Joueurs: ${numplayers}
"; -echo "Players: "; if(count($players) == 1) {echo "il y a des joueurs"; } else {echo "0 player" ;} -echo "
"; -echo "Tags: ($tags)"; //printf("[%0.45s]
",$tags); //print_r($tags); -echo "
hive: ${hive}
"; -echo "Battleye: ${battleye}"; -echo "
"; -?> - - - - - diff --git a/GameQ/status_livonia.php b/GameQ/status_livonia.php deleted file mode 100644 index 825d036..0000000 --- a/GameQ/status_livonia.php +++ /dev/null @@ -1,200 +0,0 @@ -addServer([ - 'type' => 'dayz', - 'host' => '82.64.214.194:3202', - 'options' => [ - 'query_port' => 27022, - ], -]); - - -// Define the servers you wish you query -//$GameQ = new \GameQ\GameQ(); // or //$GameQ = \GameQ\GameQ::factory(); - -$GameQ->setOption('timeout', 3); // 3 seconds -$results = $GameQ->process(); - -//print_r($results); - //echo "

// var dump

"; - //var_dump(json_decode($readjson, true)); -//echo "

// echo

"; -// echo $readjson
"; - //$data1 = json_decode("$readjson", true); -//echo "

//Print data1

" ; - //print_r($data1); -echo "
"; - - -$data = json_decode($readjson); -// class -$name = $data->{'name'}; -$map = $data->{'map'}; -$password = $data->{'password'}; -$game = $data->{'raw'}->{'game'}; -$secure = $data->{'raw'}->{'secure'}; -$numplayers = $data->{'raw'}->{'numplayers'}; -$version = $data->{'raw'}->{'version'}; -$tags = $data->{'raw'}->{'tags'}; - -//$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; -//$island = $data->{'raw'}->{'rules'}->{'island'}; - - -$connect = $data->{'connect'}; -$ping = $data->{'ping'}; -$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; -$battleye = substr($tags,0,8); -$hive = substr($tags,18,8); -$players = $data->{'players'}; - -//if(empty($players)) -// $players = "0"; -//if (empty($players)) { "0"; } -//$playersuser = substr($players,0,8); -//$players = $data->{'array_filter($players)'}; -//$player = $data->{'players'}; -7 -?> - - - - - Dayz ToX Server: <?php echo"${name}"; ?> - - - - - -

- - - - - - -
-
- - - - - - - - - - - - - - - -
- Server Name IP server Ping Time Player Info Joueurs Version Battleye
-
- -

- - - - - - - - - - - - -
Players Info Debug
Nameprint_r ";print_r($players); - -?> -
- -"; -echo "
Resultat
"; -echo "
Server Name: ${name} \n";echo "
"; -echo "Map: ${map}
"; -echo "Game: ${game}
"; -echo "IP: ${connect}
"; -echo "Secure: ${secure}
"; -echo "Version: ${version}
"; -//echo "Island: ${island}
"; -//echo "dedicated: ${dedicated}
"; -echo "Ping: ${ping}
"; -echo "Time: $time
"; -echo "Nombre Joueurs: ${numplayers}
"; -echo "Players: "; if(count($players) == 1) {echo "il y a des joueurs"; } else {echo "0 player" ;} -echo "
"; -echo "Tags: ($tags)"; //printf("[%0.45s]
",$tags); //print_r($tags); -echo "
hive: ${hive}
"; -echo "Battleye: ${battleye}"; -echo "
"; -?> - - - - - diff --git a/gameq/.coveralls.yml b/gameq/.coveralls.yml deleted file mode 100644 index dc54b92..0000000 --- a/gameq/.coveralls.yml +++ /dev/null @@ -1,8 +0,0 @@ -# .coveralls.yml example configuration - -# service name -service_name: travis-ci - -# for php-coveralls -coverage_clover: build/logs/clover.xml -json_path: build/logs/coveralls-upload.json diff --git a/gameq/.gitattributes b/gameq/.gitattributes deleted file mode 100644 index 69f6917..0000000 --- a/gameq/.gitattributes +++ /dev/null @@ -1,12 +0,0 @@ -* text=auto - -/build export-ignore -/tests export-ignore -/.coveralls.yml export-ignore -/.scrutinizer.yml export-ignore -/.gitattributes export-ignore -/.gitignore export-ignore -/.travis.yml export-ignore -/phpunit.xml export-ignore -/phpunit.xml.dist export-ignore -/README.md export-ignore diff --git a/gameq/.gitignore b/gameq/.gitignore deleted file mode 100644 index 90acae5..0000000 --- a/gameq/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ - -/.buildpath -/.project -/.settings/* -vendor -/.idea -composer.lock -composer.phar -coverage/ -build/logs/ -test.php -*.iml diff --git a/gameq/.scrutinizer.yml b/gameq/.scrutinizer.yml deleted file mode 100644 index f4812e8..0000000 --- a/gameq/.scrutinizer.yml +++ /dev/null @@ -1,91 +0,0 @@ -filter: - excluded_paths: [vendor/*, examples/*, tests/*] -before_commands: - - 'composer --prefer-source install' - - 'cp phpunit.xml.dist phpunit.xml' -coding_style: - php: - indentation: - general: - use_tabs: false - switch: - indent_case: true - spaces: - before_parentheses: - closure_definition: true - array_initializer: false - around_operators: - concatenation: true - within: - array_initializer: true - ternary_operator: - in_short_version: true - upper_lower_casing: - keywords: - general: lower - constants: - true_false_null: lower -tools: - external_code_coverage: - enabled: true - timeout: 1800 # Timeout in seconds. - php_mess_detector: - config: - ruleset: build/config/phpmd.xml - php_analyzer: - config: - parameter_reference_check: { enabled: false } - checkstyle: { enabled: false, no_trailing_whitespace: true } - unreachable_code: { enabled: true } - check_access_control: { enabled: false } - typo_checks: { enabled: true } - check_variables: { enabled: true } - suspicious_code: { enabled: false, overriding_parameter: false, overriding_closure_use: false, parameter_closure_use_conflict: false, parameter_multiple_times: false, non_existent_class_in_instanceof_check: false, non_existent_class_in_catch_clause: false, assignment_of_null_return: false, non_commented_switch_fallthrough: false, non_commented_empty_catch_block: false, overriding_private_members: false, use_statement_alias_conflict: false, precedence_in_condition_assignment: false } - dead_assignments: { enabled: true } - verify_php_doc_comments: { enabled: true, parameters: true, return: true, suggest_more_specific_types: true, ask_for_return_if_not_inferrable: true, ask_for_param_type_annotation: true } - loops_must_use_braces: { enabled: true } - check_usage_context: { enabled: true, method_call_on_non_object: { enabled: true, ignore_null_pointer: true }, foreach: { value_as_reference: true, traversable: true }, missing_argument: true, argument_type_checks: lenient } - simplify_boolean_return: { enabled: true } - phpunit_checks: { enabled: true } - reflection_checks: { enabled: false } - precedence_checks: { enabled: true, assignment_in_condition: true, comparison_of_bit_result: true } - basic_semantic_checks: { enabled: true } - doc_comment_fixes: { enabled: true } - reflection_fixes: { enabled: false } - use_statement_fixes: { enabled: true, remove_unused: true, preserve_multiple: false, order_alphabetically: false } - php_code_sniffer: - config: - ruleset: build/config/phpcs.xml - php_cs_fixer: - enabled: false - config: - level: psr2 - fixers: - indentation: false - linefeed: true - trailing_spaces: true - unused_use: true - phpdoc_params: false - visibility: true - return: false - short_tag: true - braces: false - include: true - php_closing_tag: true - extra_empty_lines: true - controls_spaces: true - elseif: true - eof_ending: true - php_code_coverage: - enabled: true - config_path: phpunit.xml.dist - php_pdepend: true - php_loc: - enabled: true - excluded_dirs: [vendor, tests, examples] - php_cpd: - enabled: true - excluded_dirs: [vendor, tests, examples] - php_sim: false - sensiolabs_security_checker: - enabled: true \ No newline at end of file diff --git a/gameq/.travis.yml b/gameq/.travis.yml deleted file mode 100644 index 31bda8d..0000000 --- a/gameq/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: php - -php: - - 5.4.45 - - 5.5.38 - - 5.6.36 - - 7.0.31 - - 7.1.21 - - 7.2.9 - -matrix: - allow_failures: - -before_script: - - travis_retry composer self-update - - travis_retry composer install --no-interaction --prefer-source - -script: - - mkdir -p build/logs - - vendor/bin/phpcs src tests --extensions=php --ignore=bootstrap --report=checkstyle --report-file=build/logs/checkstyle.xml --standard=build/config/phpcs.xml -v - - vendor/bin/phpmd src,tests xml build/config/phpmd.xml --reportfile build/logs/pmd.xml - - vendor/bin/phpunit -c phpunit.xml --verbose - -after_script: - - php vendor/bin/coveralls -v - - wget https://scrutinizer-ci.com/ocular.phar - - php ocular.phar code-coverage:upload --format=php-clover build/logs/clover.xml - -after_success: - - travis_retry php vendor/bin/coveralls -v diff --git a/gameq/CONTRIBUTING.md b/gameq/CONTRIBUTING.md deleted file mode 100644 index c504042..0000000 --- a/gameq/CONTRIBUTING.md +++ /dev/null @@ -1,39 +0,0 @@ -# Contributing - -Contributions are **welcome** and will be fully **credited**. - -## Pull Requests - -- **Document any change in behavior** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. - -- **Create feature branches** - Don't ask us to pull from your master branch. - -- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. - -## Coding Standard - -- The **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** is to be used for all code. -- **[PHPMD](http://phpmd.org/)** is used to help keep the code clean but exceptions can exist. - -- Use the following commands to check your code before committing it: - -```sh -$ vendor/bin/phpcs src tests --extensions=php --ignore=bootstrap --report=checkstyle --report-file=build/logs/checkstyle.xml --standard=build/config/phpcs.xml -v -$ vendor/bin/phpmd src,tests xml build/config/phpmd.xml -``` - - -## Tests - -- **Add tests!** - Your patch won't be accepted if it doesn't have tests. - -- Run tests by calling `phpunit` -```sh -$ vendor/bin/phpunit -``` - -The coding standard, mess detection and tests are validated by [Travis CI](.travis.yml). - -# Can't Contribute? -If you do not feel comfortable writing your own changes feel free open up a [new issue](https://github.com/Austinb/GameQ/issues/new) for -to add a game or feature. \ No newline at end of file diff --git a/gameq/LICENSE.lgpl b/gameq/LICENSE.lgpl deleted file mode 100644 index 02bbb60..0000000 --- a/gameq/LICENSE.lgpl +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. \ No newline at end of file diff --git a/gameq/README.md b/gameq/README.md deleted file mode 100644 index c719a79..0000000 --- a/gameq/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# GameQ Version 3 -[![Build Status](https://travis-ci.org/Austinb/GameQ.svg?branch=v3&style=flat-square)](https://travis-ci.org/Austinb/GameQ) -[![Code Coverage](https://scrutinizer-ci.com/g/Austinb/GameQ/badges/coverage.png?b=v3)](https://scrutinizer-ci.com/g/Austinb/GameQ/?branch=v3) -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Austinb/GameQ/badges/quality-score.png?b=v3&style=flat-square)](https://scrutinizer-ci.com/g/Austinb/GameQ/?branch=v3) -[![License](https://img.shields.io/badge/license-LGPL-blue.svg?style=flat)](https://packagist.org/packages/austinb/gameq) -[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VAU2KADATP5PU) - -[![Testing status](http://php-eye.com/badge/austinb/gameq/tested.svg?branch=v3.x-dev&style=flat)](http://php-eye.com/package/austinb/gameq) - -GameQ is a PHP library that allows you to query multiple types of multiplayer game & voice servers at the same time. - -## Requirements -* PHP 5.4.14+ - [Tested](https://travis-ci.org/Austinb/GameQ) in PHP 5.4, 5.5, 5.6, 7.0, 7.1 & 7.2 -* [Bzip2](http://www.php.net/manual/en/book.bzip2.php) - Used for A2S Compressed responses - -## Installation -#### [Composer](https://getcomposer.org/) -This method assumes you already have composer [installed](https://getcomposer.org/doc/00-intro.md) and working properly. Add `austinb/gameq` as a requirement to composer.json by using `composer require austinb/gameq:~3.0` or by manually adding the following to the *composer.json* file in the **require** section: - -```javascript -"austinb/gameq": "~3.0" -``` - -Update your packages with `composer update` or install with `composer install`. - -#### Standalone Library -Download the [latest version](https://github.com/Austinb/GameQ/releases) of the library and unpack it into your project. Add the following to your bootstrap file: -```php -require_once('/path/to/src/GameQ/Autoloader.php'); -``` -The Autoloader.php file provides the same auto loading functionality as the Composer install. - -## Example -```php -$GameQ = new \GameQ\GameQ(); -$GameQ->addServer([ - 'type' => 'css', - 'host' => '127.0.0.1:27015', -]); -$results = $GameQ->process(); -``` -Need more? See [Examples](https://github.com/Austinb/GameQ/wiki/Examples-v3). - -## Contributing - -Please see [CONTRIBUTING](CONTRIBUTING.md) for details. - -## License -See [LICENSE](LICENSE.lgpl) for more information - -Donations -========= -[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=VAU2KADATP5PU) diff --git a/gameq/build/config/phpcs.xml b/gameq/build/config/phpcs.xml deleted file mode 100644 index 82a58e1..0000000 --- a/gameq/build/config/phpcs.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - The coding standard for standard PHP application - */img/* - */images/* - */less/* - */css/* - */js/* - *.html - *.twig - *.yml - *.xml - *.txt - *.less - *.css - *.js - *.jpg - *.jpeg - *.png - *.gif - - - - - - - - - - - diff --git a/gameq/build/config/phpmd.xml b/gameq/build/config/phpmd.xml deleted file mode 100644 index 6cb8921..0000000 --- a/gameq/build/config/phpmd.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - GameQ v3 mess detector rule set - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/gameq/cmds.md b/gameq/cmds.md deleted file mode 100644 index 61c4996..0000000 --- a/gameq/cmds.md +++ /dev/null @@ -1,6 +0,0 @@ - -### PHPUnit testing -`./vendor/bin/phpunit` - -### Update API Files -`apigen generate -s src -d ../gameqpages/api --todo --tree --deprecated --download` \ No newline at end of file diff --git a/gameq/composer.json b/gameq/composer.json deleted file mode 100644 index f26bcd1..0000000 --- a/gameq/composer.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "austinb/gameq", - "description": "GameQ Gameserver Library", - "keywords": ["gameq","serverstatus"], - "version": "v3.0.14", - "license": "LGPL-3.0+", - "authors": [ - { - "name": "Austin Bischoff", - "email": "austin.bischoff@gmail.com", - "role": "Packagist/Composer Maintainer, Developer", - "homepage": "https://github.com/Austinb" - }, - { - "name": "Christoph Kretzschmar", - "email": "blackskyliner@googlemail.com", - "role": "Developer", - "homepage": "https://github.com/Blackskyliner" - }, - { - "name": "Marcel Bößendörfer", - "email": "m.boessendoerfer@marbis.net", - "role": "Developer", - "homepage": "https://github.com/nitrado" - }, - { - "name": "Alexander Hambalgo", - "role": "Developer", - "homepage": "http://balgo.users.sourceforge.net/" - }, - { - "name": "Holger", - "role": "Developer", - "homepage": "http://icet33.users.sourceforge.net/" - }, - { - "name": "Sebastian Weidenbach", - "role": "Developer", - "homepage": "http://sebastianwe.users.sourceforge.net/" - } - ], - "support": { - "source": "https://github.com/Austinb/GameQ/v3", - "issues": "https://github.com/Austinb/GameQ/issues", - "wiki": "https://github.com/Austinb/GameQ/wiki" - }, - "require": { - "php": ">=5.4.14", - "ext-bz2": "*", - "ext-xml": "*" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.8 || ^6.0", - "phpunit/php-invoker": "*", - "phpmd/phpmd" : "@stable", - "squizlabs/php_codesniffer": "3.*@stable", - "satooshi/php-coveralls": "~1.0", - "corneltek/getoptionkit": "~2" - }, - "autoload": { - "psr-4": { - "GameQ\\": "src/GameQ/" - } - }, - "autoload-dev": { - "psr-4": { - "GameQ\\Tests\\": "tests" - } - } -} diff --git a/gameq/examples/list.php b/gameq/examples/list.php deleted file mode 100644 index 6d143cf..0000000 --- a/gameq/examples/list.php +++ /dev/null @@ -1,131 +0,0 @@ -read())) { - if (!is_file($protocols_path . $entry)) { - continue; - } - - // Lets get some info on the class - $reflection = new ReflectionClass('\\GameQ\\Protocols\\' . pathinfo($entry, PATHINFO_FILENAME)); - - // Check to make sure we can actually load the class - if (!$reflection->IsInstantiable()) { - continue; - } - - // Load up the class so we can get info - $class = $reflection->newInstance(); - - // Add it to the list - $protocols[ $class->name() ] = [ - 'name' => $class->nameLong(), - 'state' => $class->state(), - ]; - - // Unset the class - unset($class); -} - -// Close the directory -unset($dir); - -ksort($protocols); - -?> - - - - GameQ v3 - Supported Games - - - - -

GameQ v3 - Supported Games ()

- - - - - - - - - - $info) { - - - switch ($info['state']) { - case 1: - $state = 'Testing'; - break; - - case 2: - $state = 'Beta'; - break; - - case 3: - $state = 'Stable'; - break; - - case 4: - $state = 'Deprecated'; - break; - } - - $cls = empty($cls) ? ' class="uneven"' : ''; - printf("\n", $cls, - htmlentities($info['name']), - $gameq, - $state - ); - } - ?> - -
Game NameGameQ IdentifierState
%s%s%s
- - diff --git a/gameq/index.php b/gameq/index.php deleted file mode 100644 index 6beea67..0000000 --- a/gameq/index.php +++ /dev/null @@ -1,197 +0,0 @@ -addServer([ - 'type' => 'dayz', - 'host' => '82.64.214.194:3201', - 'options' => [ - 'query_port' => 27001, - ], -]); - -// Define the servers you wish you query -//$GameQ = new \GameQ\GameQ(); -// or //$GameQ = \GameQ\GameQ::factory(); - -$GameQ->setOption('timeout', 3); // 3 seconds -$results = $GameQ->process(); - -print_r($results); -echo "
"; - -//Decode JSON -//var_dump(json_decode("$readjson")); -//$data = json_decode("$readjson", true); -//print_r($data); - -// -// receive the JSON Post data -//$data = json_decode( file_get_contents('../server.json'), true); -//print_r($data); - -// Read JSON file -$readjson = file_get_contents('../server.json'); -$data = json_decode("$readjson", true); - -// class -$name = $data->{'gp_name'}; -$map = $data->{'gp_map'}; -$password = $data->{'password'}; -$game = $data->{'raw'}->{'game'}; -$secure = $data->{'raw'}->{'secure'}; -$numplayers = $data->{'raw'}->{'numplayers'}; -$version = $data->{'raw'}->{'version'}; -$tags = $data->{'raw'}->{'tags'}; -$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; -$island = $data->{'raw'}->{'rules'}->{'island'}; -$connect = $data->{'connect'}; -$ping = $data->{'ping'}; -$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; -$battleye = substr($tags,0,8); -$hive = substr($tags,18,8); -$players = $data->{'players'}; - -//if(empty($players)) -// $players = "0"; -//if (empty($players)) { "0"; } -//$playersuser = substr($players,0,8); -//$players = $data->{'array_filter($players)'}; -//$player = $data->{'players'}; -?> - - - - - - Dayz ToX Server: <?php echo"${name}"; ?> - - - - - -
-

- - - - - - -
-
- - - - - - - - - - - - - - - - -
- Server Name IP server Ping Time Player Info Joueurs Version Battleye
-
-
- - - - - - - - - - - -
Players Info Debug
Nameprint_r ";print_r($players); - -?> -
- -"; -//echo "
Resultat
"; -echo "
Server Name: ${name} \n";echo "
"; -echo "Map: ${map}
"; -echo "Game: ${game}
"; -echo "IP: ${connect}
"; -//echo "Secure: ${secure}
"; -echo "Version: ${version}
"; -echo "Island: ${island}
"; -//echo "dedicated: ${dedicated}
"; -echo "Ping: ${ping}
"; -echo "Time: $time
"; -echo "Nombre Joueurs: ${numplayers}
"; -echo "Players: "; if(count($players) == 1) {echo "il y a des joueurs"; } else {echo "0 player" ;} -echo "
"; -echo "Tags: ($tags)"; //printf("[%0.45s]
",$tags); //print_r($tags); -echo "
hive: ${hive}
"; -echo "Battleye: ${battleye}"; -echo "
"; -?> - - - - - diff --git a/gameq/phpunit.xml b/gameq/phpunit.xml deleted file mode 100644 index 11bf35a..0000000 --- a/gameq/phpunit.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - ./tests/ - - - - - ./src - - - - - - - - diff --git a/gameq/phpunit.xml.dist b/gameq/phpunit.xml.dist deleted file mode 100644 index 11bf35a..0000000 --- a/gameq/phpunit.xml.dist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - ./tests/ - - - - - ./src - - - - - - - - diff --git a/gameq/src/GameQ/Autoloader.php b/gameq/src/GameQ/Autoloader.php deleted file mode 100644 index 7c8eb41..0000000 --- a/gameq/src/GameQ/Autoloader.php +++ /dev/null @@ -1,60 +0,0 @@ -. - * - * - */ - -/** - * A simple PSR-4 spec auto loader to allow GameQ to function the same as if it were loaded via Composer - * - * To use this just include this file in your script and the GameQ namespace will be made available - * - * i.e. require_once('/path/to/src/GameQ/Autoloader.php'); - * - * See: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md - * - * @codeCoverageIgnore - */ -spl_autoload_register(function ($class) { - - // project-specific namespace prefix - $prefix = 'GameQ\\'; - - // base directory for the namespace prefix - $base_dir = __DIR__ . DIRECTORY_SEPARATOR; - - // does the class use the namespace prefix? - $len = strlen($prefix); - - if (strncmp($prefix, $class, $len) !== 0) { - // no, move to the next registered autoloader - return; - } - - // get the relative class name - $relative_class = substr($class, $len); - - // replace the namespace prefix with the base directory, replace namespace - // separators with directory separators in the relative class name, append - // with .php - $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; - - // if the file exists, require it - if (file_exists($file)) { - require $file; - } -}); diff --git a/gameq/src/GameQ/Buffer.php b/gameq/src/GameQ/Buffer.php deleted file mode 100644 index b7b1a15..0000000 --- a/gameq/src/GameQ/Buffer.php +++ /dev/null @@ -1,501 +0,0 @@ -. - * - * - */ - -namespace GameQ; - -use GameQ\Exception\Protocol as Exception; - -/** - * Class Buffer - * - * Read specific byte sequences from a provided string or Buffer - * - * @package GameQ - * - * @author Austin Bischoff - * @author Aidan Lister - * @author Tom Buskens - */ -class Buffer -{ - - /** - * Constants for the byte code types we need to read as - */ - const NUMBER_TYPE_BIGENDIAN = 'be', - NUMBER_TYPE_LITTLEENDIAN = 'le', - NUMBER_TYPE_MACHINE = 'm'; - - /** - * The number type we use for reading integers. Defaults to little endian - * - * @type string - */ - private $number_type = self::NUMBER_TYPE_LITTLEENDIAN; - - /** - * The original data - * - * @type string - */ - private $data; - - /** - * The original data - * - * @type int - */ - private $length; - - /** - * Position of pointer - * - * @type int - */ - private $index = 0; - - /** - * Constructor - * - * @param string $data - * @param string $number_type - */ - public function __construct($data, $number_type = self::NUMBER_TYPE_LITTLEENDIAN) - { - - $this->number_type = $number_type; - $this->data = $data; - $this->length = strlen($data); - } - - /** - * Return all the data - * - * @return string The data - */ - public function getData() - { - - return $this->data; - } - - /** - * Return data currently in the buffer - * - * @return string The data currently in the buffer - */ - public function getBuffer() - { - - return substr($this->data, $this->index); - } - - /** - * Returns the number of bytes in the buffer - * - * @return int Length of the buffer - */ - public function getLength() - { - - return max($this->length - $this->index, 0); - } - - /** - * Read from the buffer - * - * @param int $length - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function read($length = 1) - { - - if (($length + $this->index) > $this->length) { - throw new Exception("Unable to read length={$length} from buffer. Bad protocol format or return?"); - } - - $string = substr($this->data, $this->index, $length); - $this->index += $length; - - return $string; - } - - /** - * Read the last character from the buffer - * - * Unlike the other read functions, this function actually removes - * the character from the buffer. - * - * @return string - */ - public function readLast() - { - - $len = strlen($this->data); - $string = $this->data{strlen($this->data) - 1}; - $this->data = substr($this->data, 0, $len - 1); - $this->length -= 1; - - return $string; - } - - /** - * Look at the buffer, but don't remove - * - * @param int $length - * - * @return string - */ - public function lookAhead($length = 1) - { - - return substr($this->data, $this->index, $length); - } - - /** - * Skip forward in the buffer - * - * @param int $length - */ - public function skip($length = 1) - { - - $this->index += $length; - } - - /** - * Jump to a specific position in the buffer, - * will not jump past end of buffer - * - * @param $index - */ - public function jumpto($index) - { - - $this->index = min($index, $this->length - 1); - } - - /** - * Get the current pointer position - * - * @return int - */ - public function getPosition() - { - - return $this->index; - } - - /** - * Read from buffer until delimiter is reached - * - * If not found, return everything - * - * @param string $delim - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function readString($delim = "\x00") - { - - // Get position of delimiter - $len = strpos($this->data, $delim, min($this->index, $this->length)); - - // If it is not found then return whole buffer - if ($len === false) { - return $this->read(strlen($this->data) - $this->index); - } - - // Read the string and remove the delimiter - $string = $this->read($len - $this->index); - ++$this->index; - - return $string; - } - - /** - * Reads a pascal string from the buffer - * - * @param int $offset Number of bits to cut off the end - * @param bool $read_offset True if the data after the offset is to be read - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - public function readPascalString($offset = 0, $read_offset = false) - { - - // Get the proper offset - $len = $this->readInt8(); - $offset = max($len - $offset, 0); - - // Read the data - if ($read_offset) { - return $this->read($offset); - } else { - return substr($this->read($len), 0, $offset); - } - } - - /** - * Read from buffer until any of the delimiters is reached - * - * If not found, return everything - * - * @param $delims - * @param null $delimfound - * - * @return string - * @throws \GameQ\Exception\Protocol - * - * @todo: Check to see if this is even used anymore - */ - public function readStringMulti($delims, &$delimfound = null) - { - - // Get position of delimiters - $pos = []; - foreach ($delims as $delim) { - if ($p = strpos($this->data, $delim, min($this->index, $this->length))) { - $pos[] = $p; - } - } - - // If none are found then return whole buffer - if (empty($pos)) { - return $this->read(strlen($this->data) - $this->index); - } - - // Read the string and remove the delimiter - sort($pos); - $string = $this->read($pos[0] - $this->index); - $delimfound = $this->read(); - - return $string; - } - - /** - * Read an 8-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt8() - { - - $int = unpack('Cint', $this->read(1)); - - return $int['int']; - } - - /** - * Read and 8-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt8Signed() - { - - $int = unpack('cint', $this->read(1)); - - return $int['int']; - } - - /** - * Read a 16-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt16() - { - - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'nint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'vint'; - break; - - default: - $type = 'Sint'; - } - - $int = unpack($type, $this->read(2)); - - return $int['int']; - } - - /** - * Read a 16-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt16Signed() - { - - // Read the data into a string - $string = $this->read(2); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $int = unpack('sint', $string); - - unset($string); - - return $int['int']; - } - - /** - * Read a 32-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt32() - { - - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'Nint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'Vint'; - break; - - default: - $type = 'Lint'; - } - - // Unpack the number - $int = unpack($type, $this->read(4)); - - return $int['int']; - } - - /** - * Read a 32-bit signed integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt32Signed() - { - - // Read the data into a string - $string = $this->read(4); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $int = unpack('lint', $string); - - unset($string); - - return $int['int']; - } - - /** - * Read a 64-bit unsigned integer - * - * @return int - * @throws \GameQ\Exception\Protocol - */ - public function readInt64() - { - - // We have the pack 64-bit codes available. See: http://php.net/manual/en/function.pack.php - if (version_compare(PHP_VERSION, '5.6.3') >= 0 && PHP_INT_SIZE == 8) { - // Change the integer type we are looking up - switch ($this->number_type) { - case self::NUMBER_TYPE_BIGENDIAN: - $type = 'Jint'; - break; - - case self::NUMBER_TYPE_LITTLEENDIAN: - $type = 'Pint'; - break; - - default: - $type = 'Qint'; - } - - $int64 = unpack($type, $this->read(8)); - - $int = $int64['int']; - - unset($int64); - } else { - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $high = $this->readInt32(); - $low = $this->readInt32(); - } else { - $low = $this->readInt32(); - $high = $this->readInt32(); - } - - // We have to determine the number via bitwise - $int = ($high << 32) | $low; - - unset($low, $high); - } - - return $int; - } - - /** - * Read a 32-bit float - * - * @return float - * @throws \GameQ\Exception\Protocol - */ - public function readFloat32() - { - - // Read the data into a string - $string = $this->read(4); - - // For big endian we need to reverse the bytes - if ($this->number_type == self::NUMBER_TYPE_BIGENDIAN) { - $string = strrev($string); - } - - $float = unpack('ffloat', $string); - - unset($string); - - return $float['float']; - } -} diff --git a/gameq/src/GameQ/Exception/Protocol.php b/gameq/src/GameQ/Exception/Protocol.php deleted file mode 100644 index 035fc6d..0000000 --- a/gameq/src/GameQ/Exception/Protocol.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Protocol extends \Exception -{ -} diff --git a/gameq/src/GameQ/Exception/Query.php b/gameq/src/GameQ/Exception/Query.php deleted file mode 100644 index cc69f39..0000000 --- a/gameq/src/GameQ/Exception/Query.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Query extends \Exception -{ -} diff --git a/gameq/src/GameQ/Exception/Server.php b/gameq/src/GameQ/Exception/Server.php deleted file mode 100644 index 4024551..0000000 --- a/gameq/src/GameQ/Exception/Server.php +++ /dev/null @@ -1,30 +0,0 @@ -. - * - * - */ - -namespace GameQ\Exception; - -/** - * Exception - * - * @author Austin Bischoff - */ -class Server extends \Exception -{ -} diff --git a/gameq/src/GameQ/Filters/Base.php b/gameq/src/GameQ/Filters/Base.php deleted file mode 100644 index 1a3f4e5..0000000 --- a/gameq/src/GameQ/Filters/Base.php +++ /dev/null @@ -1,58 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Abstract base class which all filters must inherit - * - * @author Austin Bischoff - */ -abstract class Base -{ - - /** - * Holds the options for this instance of the filter - * - * @type array - */ - protected $options = []; - - /** - * Construct - * - * @param array $options - */ - public function __construct(array $options = []) - { - - $this->options = $options; - } - - /** - * Apply the filter to the data - * - * @param array $result - * @param \GameQ\Server $server - * - * @return mixed - */ - abstract public function apply(array $result, Server $server); -} diff --git a/gameq/src/GameQ/Filters/Normalize.php b/gameq/src/GameQ/Filters/Normalize.php deleted file mode 100644 index 5771c92..0000000 --- a/gameq/src/GameQ/Filters/Normalize.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Normalize - * - * @package GameQ\Filters - */ -class Normalize extends Base -{ - - /** - * Holds the protocol specific normalize information - * - * @type array - */ - protected $normalize = []; - - /** - * Apply this filter - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - // No result passed so just return - if (empty($result)) { - return $result; - } - - //$data = [ ]; - //$data['raw'][$server->id()] = $result; - - // Grab the normalize for this protocol for the specific server - $this->normalize = $server->protocol()->getNormalize(); - - // Do general information - $result = array_merge($result, $this->check('general', $result)); - - // Do player information - if (isset($result['players']) && count($result['players']) > 0) { - // Iterate - foreach ($result['players'] as $key => $player) { - $result['players'][$key] = array_merge($player, $this->check('player', $player)); - } - } else { - $result['players'] = []; - } - - // Do team information - if (isset($result['teams']) && count($result['teams']) > 0) { - // Iterate - foreach ($result['teams'] as $key => $team) { - $result['teams'][$key] = array_merge($team, $this->check('team', $team)); - } - } else { - $result['teams'] = []; - } - - //$data['filtered'][$server->id()] = $result; - /*file_put_contents( - sprintf('%s/../../../tests/Filters/Providers/Normalize/%s_1.json', __DIR__, $server->protocol()->getProtocol()), - json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) - );*/ - - // Return the normalized result - return $result; - } - - /** - * Check a section for normalization - * - * @param $section - * @param $data - * - * @return array - */ - protected function check($section, $data) - { - - // Normalized return array - $normalized = []; - - if (isset($this->normalize[$section]) && !empty($this->normalize[$section])) { - foreach ($this->normalize[$section] as $property => $raw) { - // Default the value for the new key as null - $value = null; - - if (is_array($raw)) { - // Iterate over the raw property we want to use - foreach ($raw as $check) { - if (array_key_exists($check, $data)) { - $value = $data[$check]; - break; - } - } - } else { - // String - if (array_key_exists($raw, $data)) { - $value = $data[$raw]; - } - } - - $normalized['gq_' . $property] = $value; - } - } - - return $normalized; - } -} diff --git a/gameq/src/GameQ/Filters/Secondstohuman.php b/gameq/src/GameQ/Filters/Secondstohuman.php deleted file mode 100644 index 5de7269..0000000 --- a/gameq/src/GameQ/Filters/Secondstohuman.php +++ /dev/null @@ -1,119 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Secondstohuman - * - * This class converts seconds into a human readable time string 'hh:mm:ss'. This is mainly for converting - * a player's connected time into a readable string. Note that most game servers DO NOT return a player's connected - * time. Source (A2S) based games generally do but not always. This class can also be used to convert other time - * responses into readable time - * - * @package GameQ\Filters - * @author Austin Bischoff - */ -class Secondstohuman extends Base -{ - - /** - * The options key for setting the data key(s) to look for to convert - */ - const OPTION_TIMEKEYS = 'timekeys'; - - /** - * The result key added when applying this filter to a result - */ - const RESULT_KEY = 'gq_%s_human'; - - /** - * Holds the default 'time' keys from the response array. This is key is usually 'time' from A2S responses - * - * @var array - */ - protected $timeKeysDefault = ['time']; - - /** - * Secondstohuman constructor. - * - * @param array $options - */ - public function __construct(array $options = []) - { - // Check for passed keys - if (!array_key_exists(self::OPTION_TIMEKEYS, $options)) { - // Use default - $options[self::OPTION_TIMEKEYS] = $this->timeKeysDefault; - } else { - // Used passed key(s) and make sure it is an array - $options[self::OPTION_TIMEKEYS] = (!is_array($options[self::OPTION_TIMEKEYS])) ? - [$options[self::OPTION_TIMEKEYS]] : $options[self::OPTION_TIMEKEYS]; - } - - parent::__construct($options); - } - - /** - * Apply this filter to the result data - * - * @param array $result - * @param Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - // Send the results off to be iterated and return the updated result - return $this->iterate($result); - } - - /** - * Home grown iterate function. Would like to replace this with an internal PHP method(s) but could not find a way - * to make the iterate classes add new keys to the response. They all seemed to be read-only. - * - * @todo: See if there is a more internal way of handling this instead of foreach looping and recursive calling - * - * @param array $result - * - * @return array - */ - protected function iterate(array &$result) - { - // Iterate over the results - foreach ($result as $key => $value) { - // Offload to itself if we have another array - if (is_array($value)) { - // Iterate and update the result - $result[$key] = $this->iterate($value); - } elseif (in_array($key, $this->options[self::OPTION_TIMEKEYS])) { - // We match one of the keys we are wanting to convert so add it and move on - $result[sprintf(self::RESULT_KEY, $key)] = sprintf( - "%02d:%02d:%02d", - floor($value / 3600), - ($value / 60) % 60, - $value % 60 - ); - } - } - - return $result; - } -} diff --git a/gameq/src/GameQ/Filters/Stripcolors.php b/gameq/src/GameQ/Filters/Stripcolors.php deleted file mode 100644 index 7efb97a..0000000 --- a/gameq/src/GameQ/Filters/Stripcolors.php +++ /dev/null @@ -1,101 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Strip Colors - * - * Strip color codes from UT and Quake based games - * - * @package GameQ\Filters - */ -class Stripcolors extends Base -{ - - /** - * Apply this filter - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - // No result passed so just return - if (empty($result)) { - return $result; - } - - //$data = []; - //$data['raw'][ $server->id() ] = $result; - - // Switch based on the base (not game) protocol - switch ($server->protocol()->getProtocol()) { - case 'quake2': - case 'quake3': - case 'doom3': - array_walk_recursive($result, [$this, 'stripQuake']); - break; - case 'unreal2': - case 'ut3': - case 'gamespy3': //not sure if gamespy3 supports ut colors but won't hurt - case 'gamespy2': - array_walk_recursive($result, [$this, 'stripUnreal']); - break; - } - - /*$data['filtered'][ $server->id() ] = $result; - file_put_contents( - sprintf( - '%s/../../../tests/Filters/Providers/Stripcolors\%s_1.json', - __DIR__, - $server->protocol()->getProtocol() - ), - json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR) - );*/ - - // Return the stripped result - return $result; - } - - /** - * Strip color codes from quake based games - * - * @param string $string - */ - protected function stripQuake(&$string) - { - $string = preg_replace('#(\^.)#', '', $string); - } - - /** - * Strip color codes from Unreal based games - * - * @param string $string - */ - protected function stripUnreal(&$string) - { -/* $string = preg_replace('/\x1b.../', '', $string);*/ - $string = utf8_encode(preg_replace('/\x1b.../', '', utf8_decode($string))); - } -} diff --git a/gameq/src/GameQ/Filters/Test.php b/gameq/src/GameQ/Filters/Test.php deleted file mode 100644 index 836ddf3..0000000 --- a/gameq/src/GameQ/Filters/Test.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -namespace GameQ\Filters; - -use GameQ\Server; - -/** - * Class Test - * - * This is a test filter to be used for testing purposes only. - * - * @package GameQ\Filters - */ -class Test extends Base -{ - /** - * Apply the filter. For this we just return whatever is sent - * - * @SuppressWarnings(PHPMD) - * - * @param array $result - * @param \GameQ\Server $server - * - * @return array - */ - public function apply(array $result, Server $server) - { - - return $result; - } -} diff --git a/gameq/src/GameQ/GameQ.php b/gameq/src/GameQ/GameQ.php deleted file mode 100644 index 0165dab..0000000 --- a/gameq/src/GameQ/GameQ.php +++ /dev/null @@ -1,672 +0,0 @@ -. - */ -namespace GameQ; - -use GameQ\Exception\Protocol as ProtocolException; -use GameQ\Exception\Query as QueryException; - -/** - * Base GameQ Class - * - * This class should be the only one that is included when you use GameQ to query - * any games servers. - * - * Requirements: See wiki or README for more information on the requirements - * - PHP 5.4.14+ - * * Bzip2 - http://www.php.net/manual/en/book.bzip2.php - * - * @author Austin Bischoff - * - * @property bool $debug - * @property string $capture_packets_file - * @property int $stream_timeout - * @property int $timeout - * @property int $write_wait - */ -class GameQ -{ - /* - * Constants - */ - - /* Static Section */ - - /** - * Holds the instance of itself - * - * @type self - */ - protected static $instance = null; - - /** - * Create a new instance of this class - * - * @return \GameQ\GameQ - */ - public static function factory() - { - - // Create a new instance - self::$instance = new self(); - - // Return this new instance - return self::$instance; - } - - /* Dynamic Section */ - - /** - * Default options - * - * @type array - */ - protected $options = [ - 'debug' => false, - 'timeout' => 3, // Seconds - 'filters' => [ - // Default normalize - 'normalize_d751713988987e9331980363e24189ce' => [ - 'filter' => 'normalize', - 'options' => [], - ], - ], - // Advanced settings - 'stream_timeout' => 200000, // See http://www.php.net/manual/en/function.stream-select.php for more info - 'write_wait' => 500, - // How long (in micro-seconds) to pause between writing to server sockets, helps cpu usage - - // Used for generating protocol test data - 'capture_packets_file' => null, - ]; - - /** - * Array of servers being queried - * - * @type array - */ - protected $servers = []; - - /** - * The query library to use. Default is Native - * - * @type string - */ - protected $queryLibrary = 'GameQ\\Query\\Native'; - - /** - * Holds the instance of the queryLibrary - * - * @type \GameQ\Query\Core|null - */ - protected $query = null; - - /** - * GameQ constructor. - * - * Do some checks as needed so this will operate - */ - public function __construct() - { - // Check for missing utf8_encode function - if (!function_exists('utf8_encode')) { - throw new \Exception("PHP's utf8_encode() function is required - " - . "http://php.net/manual/en/function.utf8-encode.php. Check your php installation."); - } - } - - /** - * Get an option's value - * - * @param mixed $option - * - * @return mixed|null - */ - public function __get($option) - { - - return isset($this->options[$option]) ? $this->options[$option] : null; - } - - /** - * Set an option's value - * - * @param mixed $option - * @param mixed $value - * - * @return bool - */ - public function __set($option, $value) - { - - $this->options[$option] = $value; - - return true; - } - - /** - * Chainable call to __set, uses set as the actual setter - * - * @param mixed $var - * @param mixed $value - * - * @return $this - */ - public function setOption($var, $value) - { - - // Use magic - $this->{$var} = $value; - - return $this; // Make chainable - } - - /** - * Add a single server - * - * @param array $server_info - * - * @return $this - */ - public function addServer(array $server_info = []) - { - - // Add and validate the server - $this->servers[uniqid()] = new Server($server_info); - - return $this; // Make calls chainable - } - - /** - * Add multiple servers in a single call - * - * @param array $servers - * - * @return $this - */ - public function addServers(array $servers = []) - { - - // Loop through all the servers and add them - foreach ($servers as $server_info) { - $this->addServer($server_info); - } - - return $this; // Make calls chainable - } - - /** - * Add a set of servers from a file or an array of files. - * Supported formats: - * JSON - * - * @param array $files - * - * @return $this - * @throws \Exception - */ - public function addServersFromFiles($files = []) - { - - // Since we expect an array let us turn a string (i.e. single file) into an array - if (!is_array($files)) { - $files = [$files]; - } - - // Iterate over the file(s) and add them - foreach ($files as $file) { - // Check to make sure the file exists and we can read it - if (!file_exists($file) || !is_readable($file)) { - continue; - } - - // See if this file is JSON - if (($servers = json_decode(file_get_contents($file), true)) === null - && json_last_error() !== JSON_ERROR_NONE - ) { - // Type not supported - continue; - } - - // Add this list of servers - $this->addServers($servers); - } - - return $this; - } - - /** - * Clear all of the defined servers - * - * @return $this - */ - public function clearServers() - { - - // Reset all the servers - $this->servers = []; - - return $this; // Make Chainable - } - - /** - * Add a filter to the processing list - * - * @param string $filterName - * @param array $options - * - * @return $this - */ - -public function isCsServerOnline($server, $port = 7117) -{ - $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); - - // timeout 1.5 seconds - $timeout = array('sec' => 1, 'usec' => 500000); - socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout); - socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout); - - @socket_connect($socket, $server, $port); - @socket_write($socket, "\xFF\xFF\xFF\xFF\x69"); - - $isOnline = @socket_read($socket, 5) == "\xFF\xFF\xFF\xFF\x6A"; - @socket_close($socket); - - return $isOnline; -} - - - - - public function addFilter($filterName, $options = []) - { - // Create the filter hash so we can run multiple versions of the same filter - $filterHash = sprintf('%s_%s', strtolower($filterName), md5(json_encode($options))); - - // Add the filter - $this->options['filters'][$filterHash] = [ - 'filter' => strtolower($filterName), - 'options' => $options, - ]; - - unset($filterHash); - - return $this; - } - - /** - * Remove an added filter - * - * @param string $filterHash - * - * @return $this - */ - public function removeFilter($filterHash) - { - // Make lower case - $filterHash = strtolower($filterHash); - - // Remove this filter if it has been defined - if (array_key_exists($filterHash, $this->options['filters'])) { - unset($this->options['filters'][$filterHash]); - } - - unset($filterHash); - - return $this; - } - - /** - * Return the list of applied filters - * - * @return array - */ - public function listFilters() - { - return $this->options['filters']; - } - - /** - * Main method used to actually process all of the added servers and return the information - * - * @return array - * @throws \Exception - */ - public function process() - { - - // Initialize the query library we are using - $class = new \ReflectionClass($this->queryLibrary); - - // Set the query pointer to the new instance of the library - $this->query = $class->newInstance(); - - unset($class); - - // Define the return - $results = []; - - // @todo: Add break up into loop to split large arrays into smaller chunks - - // Do server challenge(s) first, if any - $this->doChallenges(); - - // Do packets for server(s) and get query responses - $this->doQueries(); - - // Now we should have some information to process for each server - foreach ($this->servers as $server) { - /* @var $server \GameQ\Server */ - - // Parse the responses for this server - $result = $this->doParseResponse($server); - - // Apply the filters - $result = array_merge($result, $this->doApplyFilters($result, $server)); - - // Sort the keys so they are alphabetical and nicer to look at - ksort($result); - - // Add the result to the results array - $results[$server->id()] = $result; - } - - return $results; - } - - /** - * Do server challenges, where required - */ - protected function doChallenges() - { - - // Initialize the sockets for reading - $sockets = []; - - // By default we don't have any challenges to process - $server_challenge = false; - - // Do challenge packets - foreach ($this->servers as $server_id => $server) { - /* @var $server \GameQ\Server */ - - // This protocol has a challenge packet that needs to be sent - if ($server->protocol()->hasChallenge()) { - // We have a challenge, set the flag - $server_challenge = true; - - // Let's make a clone of the query class - $socket = clone $this->query; - - // Set the information for this query socket - $socket->set( - $server->protocol()->transport(), - $server->ip, - $server->port_query, - $this->timeout - ); - - try { - // Now write the challenge packet to the socket. - $socket->write($server->protocol()->getPacket(Protocol::PACKET_CHALLENGE)); - - // Add the socket information so we can reference it easily - $sockets[(int)$socket->get()] = [ - 'server_id' => $server_id, - 'socket' => $socket, - ]; - } catch (QueryException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - } - - unset($socket); - - // Let's sleep shortly so we are not hammering out calls rapid fire style hogging cpu - usleep($this->write_wait); - } - } - - // We have at least one server with a challenge, we need to listen for responses - if ($server_challenge) { - // Now we need to listen for and grab challenge response(s) - $responses = call_user_func_array( - [$this->query, 'getResponses'], - [$sockets, $this->timeout, $this->stream_timeout] - ); - - // Iterate over the challenge responses - foreach ($responses as $socket_id => $response) { - // Back out the server_id we need to update the challenge response for - $server_id = $sockets[$socket_id]['server_id']; - - // Make this into a buffer so it is easier to manipulate - $challenge = new Buffer(implode('', $response)); - - // Grab the server instance - /* @var $server \GameQ\Server */ - $server = $this->servers[$server_id]; - - // Apply the challenge - $server->protocol()->challengeParseAndApply($challenge); - - // Add this socket to be reused, has to be reused in GameSpy3 for example - $server->socketAdd($sockets[$socket_id]['socket']); - - // Clear - unset($server); - } - } - } - - /** - * Run the actual queries and get the response(s) - */ - protected function doQueries() - { - - // Initialize the array of sockets - $sockets = []; - - // Iterate over the server list - foreach ($this->servers as $server_id => $server) { - /* @var $server \GameQ\Server */ - - // Invoke the beforeSend method - $server->protocol()->beforeSend($server); - - // Get all the non-challenge packets we need to send - $packets = $server->protocol()->getPacket('!' . Protocol::PACKET_CHALLENGE); - - if (count($packets) == 0) { - // Skip nothing else to do for some reason. - continue; - } - - // Try to use an existing socket - if (($socket = $server->socketGet()) === null) { - // Let's make a clone of the query class - $socket = clone $this->query; - - // Set the information for this query socket - $socket->set( - $server->protocol()->transport(), - $server->ip, - $server->port_query, - $this->timeout - ); - } - - try { - // Iterate over all the packets we need to send - foreach ($packets as $packet_data) { - // Now write the packet to the socket. - $socket->write($packet_data); - - // Let's sleep shortly so we are not hammering out calls rapid fire style - usleep($this->write_wait); - } - - unset($packets); - - // Add the socket information so we can reference it easily - $sockets[(int)$socket->get()] = [ - 'server_id' => $server_id, - 'socket' => $socket, - ]; - } catch (QueryException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - - break; - } - - // Clean up the sockets, if any left over - $server->socketCleanse(); - } - - // Now we need to listen for and grab response(s) - $responses = call_user_func_array( - [$this->query, 'getResponses'], - [$sockets, $this->timeout, $this->stream_timeout] - ); - - // Iterate over the responses - foreach ($responses as $socket_id => $response) { - // Back out the server_id - $server_id = $sockets[$socket_id]['server_id']; - - // Grab the server instance - /* @var $server \GameQ\Server */ - $server = $this->servers[$server_id]; - - // Save the response from this packet - $server->protocol()->packetResponse($response); - - unset($server); - } - - // Now we need to close all of the sockets - foreach ($sockets as $socketInfo) { - /* @var $socket \GameQ\Query\Core */ - $socket = $socketInfo['socket']; - - // Close the socket - $socket->close(); - - unset($socket); - } - - unset($sockets); - } - - /** - * Parse the response for a specific server - * - * @param \GameQ\Server $server - * - * @return array - * @throws \Exception - */ - protected function doParseResponse(Server $server) - { - - try { - // @codeCoverageIgnoreStart - // We want to save this server's response to a file (useful for unit testing) - if (!is_null($this->capture_packets_file)) { - file_put_contents( - $this->capture_packets_file, - implode(PHP_EOL . '||' . PHP_EOL, $server->protocol()->packetResponse()) - ); - } - // @codeCoverageIgnoreEnd - - // Get the server response - $results = $server->protocol()->processResponse(); - - // Check for online before we do anything else - $results['gq_online'] = (count($results) > 0); - } catch (ProtocolException $e) { - // Check to see if we are in debug, if so bubble up the exception - if ($this->debug) { - throw new \Exception($e->getMessage(), $e->getCode(), $e); - } - - // We ignore this server - $results = [ - 'gq_online' => false, - ]; - } - - // Now add some default stuff - $results['gq_address'] = (isset($results['gq_address'])) ? $results['gq_address'] : $server->ip(); - $results['gq_port_client'] = $server->portClient(); - $results['gq_port_query'] = (isset($results['gq_port_query'])) ? $results['gq_port_query'] : $server->portQuery(); - $results['gq_protocol'] = $server->protocol()->getProtocol(); - $results['gq_type'] = (string)$server->protocol(); - $results['gq_name'] = $server->protocol()->nameLong(); - $results['gq_transport'] = $server->protocol()->transport(); - - // Process the join link - if (!isset($results['gq_joinlink']) || empty($results['gq_joinlink'])) { - $results['gq_joinlink'] = $server->getJoinLink(); - } - - return $results; - } - - /** - * Apply any filters to the results - * - * @param array $results - * @param \GameQ\Server $server - * - * @return array - */ - - - - protected function doApplyFilters(array $results, Server $server) - { - - // Loop over the filters - foreach ($this->options['filters'] as $filterOptions) { - // Try to do this filter - try { - // Make a new reflection class - $class = new \ReflectionClass(sprintf('GameQ\\Filters\\%s', ucfirst($filterOptions['filter']))); - - // Create a new instance of the filter class specified - $filter = $class->newInstanceArgs([$filterOptions['options']]); - - // Apply the filter to the data - $results = $filter->apply($results, $server); - } catch (\ReflectionException $e) { - // Invalid, skip it - continue; - } - } - - return $results; - } -} diff --git a/gameq/src/GameQ/Protocol.php b/gameq/src/GameQ/Protocol.php deleted file mode 100644 index 6d94a45..0000000 --- a/gameq/src/GameQ/Protocol.php +++ /dev/null @@ -1,500 +0,0 @@ -. - * - * - */ - -namespace GameQ; - -/** - * Handles the core functionality for the protocols - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - * - * @author Austin Bischoff - */ -abstract class Protocol -{ - - /** - * Constants for class states - */ - const STATE_TESTING = 1; - - const STATE_BETA = 2; - - const STATE_STABLE = 3; - - const STATE_DEPRECATED = 4; - - /** - * Constants for packet keys - */ - const PACKET_ALL = 'all'; // Some protocols allow all data to be sent back in one call. - - const PACKET_BASIC = 'basic'; - - const PACKET_CHALLENGE = 'challenge'; - - const PACKET_CHANNELS = 'channels'; // Voice servers - - const PACKET_DETAILS = 'details'; - - const PACKET_INFO = 'info'; - - const PACKET_PLAYERS = 'players'; - - const PACKET_STATUS = 'status'; - - const PACKET_RULES = 'rules'; - - const PACKET_VERSION = 'version'; - - /** - * Transport constants - */ - const TRANSPORT_UDP = 'udp'; - - const TRANSPORT_TCP = 'tcp'; - - const TRANSPORT_SSL = 'ssl'; - - const TRANSPORT_TLS = 'tls'; - - /** - * Short name of the protocol - * - * @type string - */ - protected $name = 'unknown'; - - /** - * The longer, fancier name for the protocol - * - * @type string - */ - protected $name_long = 'unknown'; - - /** - * The difference between the client port and query port - * - * @type int - */ - protected $port_diff = 0; - - /** - * The transport method to use to actually send the data - * Default is UDP - * - * @type string - */ - protected $transport = self::TRANSPORT_UDP; - - /** - * The protocol type used when querying the server - * - * @type string - */ - protected $protocol = 'unknown'; - - /** - * Holds the valid packet types this protocol has available. - * - * @type array - */ - protected $packets = []; - - /** - * Holds the response headers and the method to use to process them. - * - * @type array - */ - protected $responses = []; - - /** - * Holds the list of methods to run when parsing the packet response(s) data. These - * methods should provide all the return information. - * - * @type array - */ - protected $process_methods = []; - - /** - * The packet responses received - * - * @type array - */ - protected $packets_response = []; - - /** - * Holds the instance of the result class - * - * @type null - */ - protected $result = null; - - /** - * Options for this protocol - * - * @type array - */ - protected $options = []; - - /** - * Define the state of this class - * - * @type int - */ - protected $state = self::STATE_STABLE; - - /** - * Holds specific normalize settings - * - * @todo: Remove this ugly bulk by moving specific ones to their specific game(s) - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => [ - 'listenserver', - 'dedic', - 'bf2dedicated', - 'netserverdedicated', - 'bf2142dedicated', - 'dedicated', - ], - 'gametype' => ['ggametype', 'sigametype', 'matchtype'], - 'hostname' => ['svhostname', 'servername', 'siname', 'name'], - 'mapname' => ['map', 'simap'], - 'maxplayers' => ['svmaxclients', 'simaxplayers', 'maxclients', 'max_players'], - 'mod' => ['game', 'gamedir', 'gamevariant'], - 'numplayers' => ['clients', 'sinumplayers', 'num_players'], - 'password' => ['protected', 'siusepass', 'sineedpass', 'pswrd', 'gneedpass', 'auth', 'passsord'], - ], - // Indvidual - 'player' => [ - 'name' => ['nick', 'player', 'playername', 'name'], - 'kills' => ['kills'], - 'deaths' => ['deaths'], - 'score' => ['kills', 'frags', 'skill', 'score'], - 'ping' => ['ping'], - ], - // Team - 'team' => [ - 'name' => ['name', 'teamname', 'team_t'], - 'score' => ['score', 'score_t'], - ], - ]; - - /** - * Quick join link - * - * @type string - */ - protected $join_link = ''; - - /** - * @param array $options - */ - public function __construct(array $options = []) - { - - // Set the options for this specific instance of the class - $this->options = $options; - } - - /** - * String name of this class - * - * @return string - */ - public function __toString() - { - - return $this->name; - } - - /** - * Get the port difference between the server's client (game) and query ports - * - * @return int - */ - public function portDiff() - { - - return $this->port_diff; - } - - /** - * "Find" the query port based off of the client port and port_diff - * - * This method is meant to be overloaded for more complex maths or lookup tables - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - - return $clientPort + $this->port_diff; - } - - /** - * Return the join_link as defined by the protocol class - * - * @return string - */ - public function joinLink() - { - - return $this->join_link; - } - - /** - * Short (callable) name of this class - * - * @return string - */ - public function name() - { - - return $this->name; - } - - /** - * Long name of this class - * - * @return string - */ - public function nameLong() - { - - return $this->name_long; - } - - /** - * Return the status of this Protocol Class - * - * @return int - */ - public function state() - { - - return $this->state; - } - - /** - * Return the protocol property - * - * @return string - */ - public function getProtocol() - { - - return $this->protocol; - } - - /** - * Get/set the transport type for this protocol - * - * @param string|null $type - * - * @return string - */ - public function transport($type = null) - { - - // Act as setter - if (!is_null($type)) { - $this->transport = $type; - } - - return $this->transport; - } - - /** - * Set the options for the protocol call - * - * @param array $options - * - * @return array - */ - public function options($options = []) - { - - // Act as setter - if (!empty($options)) { - $this->options = $options; - } - - return $this->options; - } - - - /* - * Packet Section - */ - - /** - * Return specific packet(s) - * - * @param array $type - * - * @return array - */ - public function getPacket($type = []) - { - - $packets = []; - - - // We want an array of packets back - if (is_array($type) && !empty($type)) { - // Loop the packets - foreach ($this->packets as $packet_type => $packet_data) { - // We want this packet - if (in_array($packet_type, $type)) { - $packets[$packet_type] = $packet_data; - } - } - } elseif ($type == '!challenge') { - // Loop the packets - foreach ($this->packets as $packet_type => $packet_data) { - // Dont want challenge packets - if ($packet_type != self::PACKET_CHALLENGE) { - $packets[$packet_type] = $packet_data; - } - } - } elseif (is_string($type)) { - // Return specific packet type - $packets = $this->packets[$type]; - } else { - // Return all packets - $packets = $this->packets; - } - - // Return the packets - return $packets; - } - - /** - * Get/set the packet response - * - * @param array|null $response - * - * @return array - */ - public function packetResponse(array $response = null) - { - - // Act as setter - if (!empty($response)) { - $this->packets_response = $response; - } - - return $this->packets_response; - } - - - /* - * Challenge section - */ - - /** - * Determine whether or not this protocol has a challenge needed before querying - * - * @return bool - */ - public function hasChallenge() - { - - return (isset($this->packets[self::PACKET_CHALLENGE]) && !empty($this->packets[self::PACKET_CHALLENGE])); - } - - /** - * Parse the challenge response and add it to the buffer items that need it. - * This should be overloaded by extending class - * - * @codeCoverageIgnore - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - - return true; - } - - /** - * Apply the challenge string to all the packets that need it. - * - * @param string $challenge_string - * - * @return bool - */ - protected function challengeApply($challenge_string) - { - - // Let's loop through all the packets and append the challenge where it is needed - foreach ($this->packets as $packet_type => $packet) { - $this->packets[$packet_type] = sprintf($packet, $challenge_string); - } - - return true; - } - - /** - * Get the normalize settings for the protocol - * - * @return array - */ - public function getNormalize() - { - - return $this->normalize; - } - - /* - * General - */ - - /** - * Generic method to allow protocol classes to do work right before the query is sent - * - * @codeCoverageIgnore - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param \GameQ\Server $server - */ - public function beforeSend(Server $server) - { - } - - /** - * Method called to process query response data. Each extending class has to have one of these functions. - * - * @return mixed - */ - abstract public function processResponse(); -} diff --git a/gameq/src/GameQ/Protocols/Aa3.php b/gameq/src/GameQ/Protocols/Aa3.php deleted file mode 100644 index 6ffd412..0000000 --- a/gameq/src/GameQ/Protocols/Aa3.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Aa3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Aa3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'aa3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "America's Army 3"; - - /** - * Query port = client_port + 18243 - * - * client_port default 8777 - * query_port default 27020 - * - * @type int - */ - protected $port_diff = 18243; -} diff --git a/gameq/src/GameQ/Protocols/Aapg.php b/gameq/src/GameQ/Protocols/Aapg.php deleted file mode 100644 index a207d4f..0000000 --- a/gameq/src/GameQ/Protocols/Aapg.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Aapg - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Aapg extends Aa3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'aapg'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "America's Army: Proving Grounds"; -} diff --git a/gameq/src/GameQ/Protocols/Arkse.php b/gameq/src/GameQ/Protocols/Arkse.php deleted file mode 100644 index 3193c5a..0000000 --- a/gameq/src/GameQ/Protocols/Arkse.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class ARK: Survival Evolved - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Arkse extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arkse'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "ARK: Survival Evolved"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/gameq/src/GameQ/Protocols/Arma3.php b/gameq/src/GameQ/Protocols/Arma3.php deleted file mode 100644 index a272be8..0000000 --- a/gameq/src/GameQ/Protocols/Arma3.php +++ /dev/null @@ -1,176 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Armed Assault 3 - * - * Rules protocol reference: https://community.bistudio.com/wiki/Arma_3_ServerBrowserProtocol2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - * @author Memphis017 - */ -class Arma3 extends Source -{ - /** - * Defines the names for the specific game DLCs - * - * @var array - */ - protected $dlcNames = [ - 'Karts', - 'Marksmen', - 'Helicopters', - 'Apex', - 'Jets', - 'Laws of War', - 'Tac-Ops', - 'Tanks', - ]; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'arma3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Arma3"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Process the rules since Arma3 changed their response for rules - * - * @param Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processRules(Buffer $buffer) - { - // Total number of packets, burn it - $buffer->readInt16(); - - // Will hold the data string - $data = ''; - - // Loop until we run out of strings - while ($buffer->getLength()) { - // Burn the delimiters (i.e. \x01\x04\x00) - $buffer->readString(); - - // Add the data to the string, we are reassembling it - $data .= $buffer->readString(); - } - - // Restore escaped sequences - $data = str_replace(["\x01\x01", "\x01\x02", "\x01\x03"], ["\x01", "\x00", "\xFF"], $data); - - // Make a new buffer with the reassembled data - $responseBuffer = new Buffer($data); - - // Kill the old buffer, should be empty - unset($buffer, $data); - - // Set the result to a new result instance - $result = new Result(); - - // Get results - $result->add('rules_protocol_version', $responseBuffer->readInt8()); - $result->add('overflow', $responseBuffer->readInt8()); - $dlcBit = decbin($responseBuffer->readInt8()); // Grab DLC bit 1 and use it later - $dlcBit2 = decbin($responseBuffer->readInt8()); // Grab DLC bit 2 and use it later - $dlcCount = substr_count($dlcBit, '1') + substr_count($dlcBit2, '1'); // Count the DLCs - // Grab difficulty so we can man handle it... - $difficulty = $responseBuffer->readInt8(); - - // Process difficulty - $result->add('3rd_person', $difficulty >> 7); - $result->add('advanced_flight_mode', ($difficulty >> 6) & 1); - $result->add('difficulty_ai', ($difficulty >> 3) & 3); - $result->add('difficulty_level', $difficulty & 3); - - unset($difficulty); - - // Crosshair - $result->add('crosshair', $responseBuffer->readInt8()); - - // Loop over the DLC bit so we can pull in the infor for the DLC (if enabled) - for ($x = 0; $x < $dlcCount; $x++) { - $result->addSub('dlcs', 'name', $this->dlcNames[$x]); - $result->addSub('dlcs', 'hash', dechex($responseBuffer->readInt32())); - } - - // No longer needed - unset($dlcBit, $dlcBit2, $dlcCount); - - // Grab the mod count - $modCount = $responseBuffer->readInt8(); - - // Add mod count - $result->add('mod_count', $modCount); - - // Loop the mod count and add them - for ($x = 0; $x < $modCount; $x++) { - // Add the mod to the list - $result->addSub('mods', 'hash', dechex($responseBuffer->readInt32())); - $result->addSub('mods', 'steam_id', hexdec($responseBuffer->readPascalString(0, true))); - $result->addSub('mods', 'name', $responseBuffer->readPascalString(0, true)); - } - - unset($modCount, $x); - - // Burn the signatures count, we will just loop until we run out of strings - $responseBuffer->read(); - - // Make signatures array - $signatures = []; - - // Loop until we run out of strings - while ($responseBuffer->getLength()) { - //$result->addSub('signatures', 0, $responseBuffer->readPascalString(0, true)); - $signatures[] = $responseBuffer->readPascalString(0, true); - } - - // Add as a simple array - $result->add('signatures', $signatures); - - // Add signatures count - $result->add('signature_count', count($signatures)); - - unset($responseBuffer, $signatures); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Armedassault2oa.php b/gameq/src/GameQ/Protocols/Armedassault2oa.php deleted file mode 100644 index e527a38..0000000 --- a/gameq/src/GameQ/Protocols/Armedassault2oa.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Armedassault2oa - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Armedassault2oa extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = "armedassault2oa"; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Armed Assault 2: Operation Arrowhead"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/gameq/src/GameQ/Protocols/Armedassault3.php b/gameq/src/GameQ/Protocols/Armedassault3.php deleted file mode 100644 index 5bbca42..0000000 --- a/gameq/src/GameQ/Protocols/Armedassault3.php +++ /dev/null @@ -1,32 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Armed assault 3 dummy Protocol Class - * - * Added for backward compatibility, please update to class arma3 - * - * @deprecated v3.0.10 - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Armedassault3 extends Arma3 -{ -} diff --git a/gameq/src/GameQ/Protocols/Ase.php b/gameq/src/GameQ/Protocols/Ase.php deleted file mode 100644 index cb5c6a4..0000000 --- a/gameq/src/GameQ/Protocols/Ase.php +++ /dev/null @@ -1,208 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * All-Seeing Eye Protocol class - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Ase extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "s", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ase'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ase'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "All-Seeing Eye"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'servername', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'team' => 'team', - 'ping' => 'ping', - 'time' => 'time', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Create a new buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Burn the header - $buffer->skip(4); - - // Create a new result - $result = new Result(); - - // Variables - $result->add('gamename', $buffer->readPascalString(1, true)); - $result->add('port', $buffer->readPascalString(1, true)); - $result->add('servername', $buffer->readPascalString(1, true)); - $result->add('gametype', $buffer->readPascalString(1, true)); - $result->add('map', $buffer->readPascalString(1, true)); - $result->add('version', $buffer->readPascalString(1, true)); - $result->add('password', $buffer->readPascalString(1, true)); - $result->add('num_players', $buffer->readPascalString(1, true)); - $result->add('max_players', $buffer->readPascalString(1, true)); - $result->add('dedicated', 1); - - // Offload the key/value pair processing - $this->processKeyValuePairs($buffer, $result); - - // Offload processing player and team info - $this->processPlayersAndTeams($buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles processing the extra key/value pairs for server settings - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processKeyValuePairs(Buffer &$buffer, Result &$result) - { - - // Key / value pairs - while ($buffer->getLength()) { - $key = $buffer->readPascalString(1, true); - - // If we have an empty key, we've reached the end - if (empty($key)) { - break; - } - - // Otherwise, add the pair - $result->add( - $key, - $buffer->readPascalString(1, true) - ); - } - - unset($key); - } - - /** - * Handles processing the player and team data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - - // Players and team info - while ($buffer->getLength()) { - // Get the flags - $flags = $buffer->readInt8(); - - // Get data according to the flags - if ($flags & 1) { - $result->addPlayer('name', $buffer->readPascalString(1, true)); - } - if ($flags & 2) { - $result->addPlayer('team', $buffer->readPascalString(1, true)); - } - if ($flags & 4) { - $result->addPlayer('skin', $buffer->readPascalString(1, true)); - } - if ($flags & 8) { - $result->addPlayer('score', $buffer->readPascalString(1, true)); - } - if ($flags & 16) { - $result->addPlayer('ping', $buffer->readPascalString(1, true)); - } - if ($flags & 32) { - $result->addPlayer('time', $buffer->readPascalString(1, true)); - } - } - } -} diff --git a/gameq/src/GameQ/Protocols/Batt1944.php b/gameq/src/GameQ/Protocols/Batt1944.php deleted file mode 100644 index f0ff38e..0000000 --- a/gameq/src/GameQ/Protocols/Batt1944.php +++ /dev/null @@ -1,68 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battalion 1944 - * - * @package GameQ\Protocols - * @author TacTicToe66 - */ -class Batt1944 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'batt1944'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battalion 1944"; - - /** - * query_port = client_port + 3 - * - * @type int - */ - protected $port_diff = 3; - - /** - * Normalize main fields - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'bat_gamemode_s', - 'hostname' => 'bat_name_s', - 'mapname' => 'bat_map_s', - 'maxplayers' => 'bat_max_players_i', - 'numplayers' => 'bat_player_count_s', - 'password' => 'bat_has_password_s', - ], - ]; -} diff --git a/gameq/src/GameQ/Protocols/Bf1942.php b/gameq/src/GameQ/Protocols/Bf1942.php deleted file mode 100644 index 4cf06c5..0000000 --- a/gameq/src/GameQ/Protocols/Bf1942.php +++ /dev/null @@ -1,88 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battlefield 1942 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf1942 extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf1942'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 1942"; - - /** - * query_port = client_port + 8433 - * 23000 = 14567 + 8433 - * - * @type int - */ - protected $port_diff = 8433; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "bf1942://%s:%d"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'playername', - 'kills' => 'kills', - 'deaths' => 'deaths', - 'ping' => 'ping', - 'score' => 'score', - ], - 'team' => [ - 'name' => 'teamname', - ], - ]; -} diff --git a/gameq/src/GameQ/Protocols/Bf2.php b/gameq/src/GameQ/Protocols/Bf2.php deleted file mode 100644 index 0610f9d..0000000 --- a/gameq/src/GameQ/Protocols/Bf2.php +++ /dev/null @@ -1,98 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Battlefield 2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf2 extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 2"; - - /** - * query_port = client_port + 8433 - * 29900 = 16567 + 13333 - * - * @type int - */ - protected $port_diff = 13333; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "bf2://%s:%d"; - - /** - * BF2 has a different query packet to send than "normal" Gamespy 3 - * - * @var array - */ - protected $packets = [ - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40\xFF\xFF\xFF\x01", - ]; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'kills' => 'score', - 'deaths' => 'deaths', - 'ping' => 'ping', - 'score' => 'score', - ], - 'team' => [ - 'name' => 'team', - 'score' => 'score', - ], - ]; -} diff --git a/gameq/src/GameQ/Protocols/Bf3.php b/gameq/src/GameQ/Protocols/Bf3.php deleted file mode 100644 index 9084515..0000000 --- a/gameq/src/GameQ/Protocols/Bf3.php +++ /dev/null @@ -1,348 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Battlefield 3 Protocol Class - * - * Good place for doc status and info is http://www.fpsadmin.com/forum/showthread.php?t=24134 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf3 extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x00\x00\x00\x21\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - self::PACKET_VERSION => "\x00\x00\x00\x22\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - self::PACKET_PLAYERS => - "\x00\x00\x00\x23\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - 1627389952 => "processDetails", // a - 1644167168 => "processVersion", // b - 1660944384 => "processPlayers", // c - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'bf3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 3"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 22000 - * 47200 = 25200 + 22000 - * - * @type int - */ - protected $port_diff = 22000; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - 'team' => [ - 'score' => 'tickets', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Holds the results sent back - $results = []; - - // Holds the processed packets after having been reassembled - $processed = []; - - // Start up the index for the processed - $sequence_id_last = 0; - - foreach ($this->packets_response as $packet) { - // Create a new buffer - $buffer = new Buffer($packet); - - // Each "good" packet begins with sequence_id (32-bit) - $sequence_id = $buffer->readInt32(); - - // Sequence id is a response - if (array_key_exists($sequence_id, $this->responses)) { - $processed[$sequence_id] = $buffer->getBuffer(); - $sequence_id_last = $sequence_id; - } else { - // This is a continuation of the previous packet, reset the buffer and append - $buffer->jumpto(0); - - // Append - $processed[$sequence_id_last] .= $buffer->getBuffer(); - } - } - - unset($buffer, $sequence_id_last, $sequence_id); - - // Iterate over the combined packets and do some work - foreach ($processed as $sequence_id => $data) { - // Create a new buffer - $buffer = new Buffer($data); - - // Get the length of the packet - $packetLength = $buffer->getLength(); - - // Check to make sure the expected length matches the real length - // Subtract 4 for the sequence_id pulled out earlier - if ($packetLength != ($buffer->readInt32() - 4)) { - throw new Exception(__METHOD__ . " packet length does not match expected length!"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$sequence_id]], [$buffer]) - ); - } - - return $results; - } - - /* - * Internal Methods - */ - - /** - * Decode the buffer into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function decode(Buffer $buffer) - { - - $items = []; - - // Get the number of words in this buffer - $itemCount = $buffer->readInt32(); - - // Loop over the number of items - for ($i = 0; $i < $itemCount; $i++) { - // Length of the string - $buffer->readInt32(); - - // Just read the string - $items[$i] = $buffer->readString(); - } - - return $items; - } - - /** - * Process the server details - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int)$items[2]); - $result->add('max_players', (int)$items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int)$items[6]); - $result->add('roundstotal', (int)$items[7]); - $result->add('num_teams', (int)$items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int)$items[$index_current]); - $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty - $result->add('ranked', (int)$items[$index_current + 2]); - $result->add('punkbuster', (int)$items[$index_current + 3]); - $result->add('password', (int)$items[$index_current + 4]); - $result->add('uptime', (int)$items[$index_current + 5]); - $result->add('roundtime', (int)$items[$index_current + 6]); - // Added in R9 - $result->add('ip_port', $items[$index_current + 7]); - $result->add('punkbuster_version', $items[$index_current + 8]); - $result->add('join_queue', (int)$items[$index_current + 9]); - $result->add('region', $items[$index_current + 10]); - $result->add('pingsite', $items[$index_current + 11]); - $result->add('country', $items[$index_current + 12]); - // Added in R29, No docs as of yet - $result->add('quickmatch', (int)$items[$index_current + 13]); // Guessed from research - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } - - /** - * Process the server version - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processVersion(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - $result->add('version', $items[2]); - - unset($buffer, $items); - - return $result->fetch(); - } - - /** - * Process the players - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Number of data points per player - $numTags = $items[1]; - - // Grab the tags for each player - $tags = array_slice($items, 2, $numTags); - - // Get the player count - $playerCount = $items[$numTags + 2]; - - // Iterate over the index until we run out of players - for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { - // Loop over the player tags and extract the info for that tag - foreach ($tags as $index => $tag) { - $result->addPlayer($tag, $items[($x + $index)]); - } - } - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Bf4.php b/gameq/src/GameQ/Protocols/Bf4.php deleted file mode 100644 index 6951752..0000000 --- a/gameq/src/GameQ/Protocols/Bf4.php +++ /dev/null @@ -1,114 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Battlefield 4 Protocol class - * - * Good place for doc status and info is http://battlelog.battlefield.com/bf4/forum/view/2955064768683911198/ - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bf4 extends Bf3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bf4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield 4"; - - /** - * Handle processing details since they are different than BF3 - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int) $items[2]); - $result->add('max_players', (int) $items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int) $items[6]); - $result->add('roundstotal', (int) $items[7]); - $result->add('num_teams', (int) $items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int) $items[$index_current]); - $result->add('online', 1); // Forced true, it seems $words[$index_current + 1] is always empty - $result->add('ranked', (int) $items[$index_current + 2]); - $result->add('punkbuster', (int) $items[$index_current + 3]); - $result->add('password', (int) $items[$index_current + 4]); - $result->add('uptime', (int) $items[$index_current + 5]); - $result->add('roundtime', (int) $items[$index_current + 6]); - $result->add('ip_port', $items[$index_current + 7]); - $result->add('punkbuster_version', $items[$index_current + 8]); - $result->add('join_queue', (int) $items[$index_current + 9]); - $result->add('region', $items[$index_current + 10]); - $result->add('pingsite', $items[$index_current + 11]); - $result->add('country', $items[$index_current + 12]); - //$result->add('quickmatch', (int) $items[$index_current + 13]); Supposed to be here according to R42 but is not - $result->add('blaze_player_count', (int) $items[$index_current + 13]); - $result->add('blaze_game_state', (int) $items[$index_current + 14]); - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Bfbc2.php b/gameq/src/GameQ/Protocols/Bfbc2.php deleted file mode 100644 index b7167a0..0000000 --- a/gameq/src/GameQ/Protocols/Bfbc2.php +++ /dev/null @@ -1,326 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Battlefield Bad Company 2 Protocol Class - * - * NOTE: There are no qualifiers to the response packets sent back from the server as to which response packet - * belongs to which query request. For now this class assumes the responses are in the same order as the order in - * which the packets were sent to the server. If this assumption turns out to be wrong there is easy way to tell which - * response belongs to which query. Hopefully this assumption will hold true as it has in my testing. - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bfbc2 extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_VERSION => "\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - self::PACKET_STATUS => "\x00\x00\x00\x00\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - self::PACKET_PLAYERS => "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "processVersion", - "processDetails", - "processPlayers", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'bfbc2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bfbc2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield Bad Company 2"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 29321 - * 48888 = 19567 + 29321 - * - * @type int - */ - protected $port_diff = 29321; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - 'team' => [ - 'score' => 'tickets', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - //print_r($this->packets_response); - - // Holds the results sent back - $results = []; - - // Iterate over the response packets - // @todo: This protocol has no packet ordering, ids or anyway to identify which packet coming back belongs to which initial call. - foreach ($this->packets_response as $i => $packet) { - // Create a new buffer - $buffer = new Buffer($packet); - - // Burn first 4 bytes, same across all packets - $buffer->skip(4); - - // Get the packet length - $packetLength = $buffer->getLength(); - - // Check to make sure the expected length matches the real length - // Subtract 4 for the header burn - if ($packetLength != ($buffer->readInt32() - 4)) { - throw new Exception(__METHOD__ . " packet length does not match expected length!"); - } - - // We assume the packets are coming back in the same order as sent, this maybe incorrect... - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$i]], [$buffer]) - ); - } - - unset($buffer, $packetLength); - - return $results; - } - - /* - * Internal Methods - */ - - /** - * Decode the buffer into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function decode(Buffer $buffer) - { - - $items = []; - - // Get the number of words in this buffer - $itemCount = $buffer->readInt32(); - - // Loop over the number of items - for ($i = 0; $i < $itemCount; $i++) { - // Length of the string - $buffer->readInt32(); - - // Just read the string - $items[$i] = $buffer->readString(); - } - - return $items; - } - - /** - * Process the server details - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // These are the same no matter what mode the server is in - $result->add('hostname', $items[1]); - $result->add('num_players', (int)$items[2]); - $result->add('max_players', (int)$items[3]); - $result->add('gametype', $items[4]); - $result->add('map', $items[5]); - $result->add('roundsplayed', (int)$items[6]); - $result->add('roundstotal', (int)$items[7]); - $result->add('num_teams', (int)$items[8]); - - // Set the current index - $index_current = 9; - - // Pull the team count - $teamCount = $result->get('num_teams'); - - // Loop for the number of teams found, increment along the way - for ($id = 1; $id <= $teamCount; $id++, $index_current++) { - // Shows the tickets - $result->addTeam('tickets', $items[$index_current]); - // We add an id so we know which team this is - $result->addTeam('id', $id); - } - - // Get and set the rest of the data points. - $result->add('targetscore', (int)$items[$index_current]); - $result->add('online', 1); // Forced true, shows accepting players - $result->add('ranked', (($items[$index_current + 2] == 'true') ? 1 : 0)); - $result->add('punkbuster', (($items[$index_current + 3] == 'true') ? 1 : 0)); - $result->add('password', (($items[$index_current + 4] == 'true') ? 1 : 0)); - $result->add('uptime', (int)$items[$index_current + 5]); - $result->add('roundtime', (int)$items[$index_current + 6]); - $result->add('mod', $items[$index_current + 7]); - - $result->add('ip_port', $items[$index_current + 9]); - $result->add('punkbuster_version', $items[$index_current + 10]); - $result->add('join_queue', (($items[$index_current + 11] == 'true') ? 1 : 0)); - $result->add('region', $items[$index_current + 12]); - - unset($items, $index_current, $teamCount, $buffer); - - return $result->fetch(); - } - - /** - * Process the server version - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processVersion(Buffer $buffer) - { - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - $result->add('version', $items[2]); - - unset($buffer, $items); - - return $result->fetch(); - } - - /** - * Process the players - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Decode into items - $items = $this->decode($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Number of data points per player - $numTags = $items[1]; - - // Grab the tags for each player - $tags = array_slice($items, 2, $numTags); - - // Get the player count - $playerCount = $items[$numTags + 2]; - - // Iterate over the index until we run out of players - for ($i = 0, $x = $numTags + 3; $i < $playerCount; $i++, $x += $numTags) { - // Loop over the player tags and extract the info for that tag - foreach ($tags as $index => $tag) { - $result->addPlayer($tag, $items[($x + $index)]); - } - } - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Bfh.php b/gameq/src/GameQ/Protocols/Bfh.php deleted file mode 100644 index 067d77f..0000000 --- a/gameq/src/GameQ/Protocols/Bfh.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Battlefield Hardline Protocol class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Bfh extends Bf4 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'bfh'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Battlefield Hardline"; -} diff --git a/gameq/src/GameQ/Protocols/Cod2.php b/gameq/src/GameQ/Protocols/Cod2.php deleted file mode 100644 index 79be7ca..0000000 --- a/gameq/src/GameQ/Protocols/Cod2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty 2 Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cod2 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty 2"; -} diff --git a/gameq/src/GameQ/Protocols/Cod4.php b/gameq/src/GameQ/Protocols/Cod4.php deleted file mode 100644 index 9838d9c..0000000 --- a/gameq/src/GameQ/Protocols/Cod4.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Call of Duty 4 Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cod4 extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cod4'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty 4"; -} diff --git a/gameq/src/GameQ/Protocols/Codmw3.php b/gameq/src/GameQ/Protocols/Codmw3.php deleted file mode 100644 index 1049b60..0000000 --- a/gameq/src/GameQ/Protocols/Codmw3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Codmw3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Codmw3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'codmw3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Call of Duty: Modern Warfare 3"; - - /** - * query_port = client_port + 2 - * - * @type int - */ - protected $port_diff = 2; -} diff --git a/gameq/src/GameQ/Protocols/Conanexiles.php b/gameq/src/GameQ/Protocols/Conanexiles.php deleted file mode 100644 index a097e1d..0000000 --- a/gameq/src/GameQ/Protocols/Conanexiles.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Conanexiles - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Conanexiles extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'conanexiles'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Conan Exiles"; -} diff --git a/gameq/src/GameQ/Protocols/Crysiswars.php b/gameq/src/GameQ/Protocols/Crysiswars.php deleted file mode 100644 index 44dcdcf..0000000 --- a/gameq/src/GameQ/Protocols/Crysiswars.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Crysiswars - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Crysiswars extends Gamespy3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'crysiswars'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Crysis Wars"; -} diff --git a/gameq/src/GameQ/Protocols/Cs15.php b/gameq/src/GameQ/Protocols/Cs15.php deleted file mode 100644 index ba37524..0000000 --- a/gameq/src/GameQ/Protocols/Cs15.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Counter-Strike 1.5 Protocol Class - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - * - * @package GameQ\Protocols - */ -class Cs15 extends Won -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs15'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 1.5"; -} diff --git a/gameq/src/GameQ/Protocols/Cs16.php b/gameq/src/GameQ/Protocols/Cs16.php deleted file mode 100644 index 25a6602..0000000 --- a/gameq/src/GameQ/Protocols/Cs16.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Cs16 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cs16 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cs16'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike 1.6"; - - /** - * In the case of cs 1.6 we offload split packets here because the split packet response for rules is in - * the old gold source format - * - * @param $packet_id - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function processPackets($packet_id, array $packets = []) - { - - // The response is gold source if the packets are split - $this->source_engine = self::GOLDSOURCE_ENGINE; - - // Offload to the parent - $packs = parent::processPackets($packet_id, $packets); - - // Reset the engine - $this->source_engine = self::SOURCE_ENGINE; - - // Return the result - return $packs; - } -} diff --git a/gameq/src/GameQ/Protocols/Cscz.php b/gameq/src/GameQ/Protocols/Cscz.php deleted file mode 100644 index b539128..0000000 --- a/gameq/src/GameQ/Protocols/Cscz.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Cscz - * - * Based off of CS 1.6 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Cscz extends Cs16 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'cscz'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Condition Zero"; -} diff --git a/gameq/src/GameQ/Protocols/Csgo.php b/gameq/src/GameQ/Protocols/Csgo.php deleted file mode 100644 index 41af735..0000000 --- a/gameq/src/GameQ/Protocols/Csgo.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Csgo - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Csgo extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'csgo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Global Offensive"; -} diff --git a/gameq/src/GameQ/Protocols/Css.php b/gameq/src/GameQ/Protocols/Css.php deleted file mode 100644 index be75da3..0000000 --- a/gameq/src/GameQ/Protocols/Css.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Css - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Css extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'css'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Counter-Strike: Source"; -} diff --git a/gameq/src/GameQ/Protocols/Dayz.php b/gameq/src/GameQ/Protocols/Dayz.php deleted file mode 100644 index 521eb58..0000000 --- a/gameq/src/GameQ/Protocols/Dayz.php +++ /dev/null @@ -1,68 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dayz - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dayz extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dayz'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "DayZ Standalone"; - - /** - * Overload the math used to guess at the Query Port - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - - - /* - * Port layout: - * 2302 - 27016 - * 2402 - 27017 - * 2502 - 27018 - * 2602 - 27019 - * 2702 - 27020 - * ... - */ - -/* return 27016 + (($clientPort - 2302) / 100);*/ - return 27016 + (($clientPort - 7218) / 100); - } -} diff --git a/gameq/src/GameQ/Protocols/Dayzmod.php b/gameq/src/GameQ/Protocols/Dayzmod.php deleted file mode 100644 index 2ce1076..0000000 --- a/gameq/src/GameQ/Protocols/Dayzmod.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dayzmod - * - * @package GameQ\Protocols - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Dayzmod extends Armedassault2oa -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dayzmod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "DayZ Mod"; -} diff --git a/gameq/src/GameQ/Protocols/Dod.php b/gameq/src/GameQ/Protocols/Dod.php deleted file mode 100644 index 0c7baf6..0000000 --- a/gameq/src/GameQ/Protocols/Dod.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dod - * - * Based off of CS 1.6 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dod extends Cs16 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Day of Defeat"; -} diff --git a/gameq/src/GameQ/Protocols/Dods.php b/gameq/src/GameQ/Protocols/Dods.php deleted file mode 100644 index 898d75b..0000000 --- a/gameq/src/GameQ/Protocols/Dods.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Dods - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dods extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dods'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Day of Defeat: Source"; -} diff --git a/gameq/src/GameQ/Protocols/Dow.php b/gameq/src/GameQ/Protocols/Dow.php deleted file mode 100644 index b66512a..0000000 --- a/gameq/src/GameQ/Protocols/Dow.php +++ /dev/null @@ -1,69 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; - -/** - * Class Dow - * - * Apparently the player response is incomplete as there is no information being returned for that packet - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Dow extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'dow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Days of War"; - - /** - * Normalize main fields - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'G_s', - 'hostname' => 'ONM_s', - 'mapname' => 'MPN_s', - 'maxplayers' => 'P_i', - 'numplayers' => 'N_i', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; -} diff --git a/gameq/src/GameQ/Protocols/Eco.php b/gameq/src/GameQ/Protocols/Eco.php deleted file mode 100644 index a2292e9..0000000 --- a/gameq/src/GameQ/Protocols/Eco.php +++ /dev/null @@ -1,123 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; - -/** - * ECO Global Survival Protocol Class - * - * @author Austin Bischoff - */ -class Eco extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - self::PACKET_STATUS => "GET /frontpage HTTP/1.0\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Http protocol is SSL - * - * @var string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'eco'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'eco'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "ECO Global Survival"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'description', - 'maxplayers' => 'totalplayers', - 'numplayers' => 'onlineplayers', - 'password' => 'haspassword', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - if (empty($this->packets_response)) { - return []; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Eco server is invalid."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - foreach ($json->Info as $info => $setting) { - $result->add(strtolower($info), $setting); - } - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Egs.php b/gameq/src/GameQ/Protocols/Egs.php deleted file mode 100644 index 4f82aa8..0000000 --- a/gameq/src/GameQ/Protocols/Egs.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Empyrion - Galactic Survival - * - * @package GameQ\Protocols - * @author Austin Bischoff - * @author TacTicToe66 - */ -class EgS extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'egs'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Empyrion - Galactic Survival"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/gameq/src/GameQ/Protocols/Etqw.php b/gameq/src/GameQ/Protocols/Etqw.php deleted file mode 100644 index 1f3a446..0000000 --- a/gameq/src/GameQ/Protocols/Etqw.php +++ /dev/null @@ -1,234 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * Enemy Territory Quake Wars Protocol Class - * - * @author Austin Bischoff - */ -class Etqw extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\xFF\xFFgetInfoEx\x00\x00\x00\x00", - //self::PACKET_STATUS => "\xFF\xFFgetInfo\x00\x00\x00\x00\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFFinfoExResponse" => "processStatus", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'etqw'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'etqw'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Enemy Territory Quake Wars"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'campaign', - 'hostname' => 'name', - 'mapname' => 'map', - 'maxplayers' => 'maxPlayers', - 'mod' => 'gamename', - 'numplayers' => 'numplayers', - 'password' => 'privateClients', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // In case it comes back as multiple packets (it shouldn't) - $buffer = new Buffer(implode('', $this->packets_response)); - - // Figure out what packet response this is for - $response_type = $buffer->readString(); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Offload the call - $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handle processing the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Defaults - $result->add('dedicated', 1); - - // Now burn the challenge, version and size - $buffer->skip(16); - - // Key / value pairs - while ($buffer->getLength()) { - $var = str_replace('si_', '', $buffer->readString()); - $val = $buffer->readString(); - if (empty($var) && empty($val)) { - break; - } - // Add the server prop - $result->add($var, $val); - } - // Now let's do the basic player info - $this->parsePlayers($buffer, $result); - - // Now grab the rest of the server info - $result->add('osmask', $buffer->readInt32()); - $result->add('ranked', $buffer->readInt8()); - $result->add('timeleft', $buffer->readInt32()); - $result->add('gamestate', $buffer->readInt8()); - $result->add('servertype', $buffer->readInt8()); - - // 0: regular server - if ($result->get('servertype') == 0) { - $result->add('interested_clients', $buffer->readInt8()); - } else { - // 1: tv server - $result->add('connected_clients', $buffer->readInt32()); - $result->add('max_clients', $buffer->readInt32()); - } - - // Now let's parse the extended player info - $this->parsePlayersExtra($buffer, $result); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Parse players out of the status ex response - * - * @param Buffer $buffer - * @param Result $result - */ - protected function parsePlayers(Buffer &$buffer, Result &$result) - { - // By default there are 0 players - $players = 0; - - // Iterate over the players until we run out - while (($id = $buffer->readInt8()) != 32) { - $result->addPlayer('id', $id); - $result->addPlayer('ping', $buffer->readInt16()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('clantag_pos', $buffer->readInt8()); - $result->addPlayer('clantag', $buffer->readString()); - $result->addPlayer('bot', $buffer->readInt8()); - $players++; - } - - // Let's add in the current players as a result - $result->add('numplayers', $players); - - // Free some memory - unset($id); - } - - /** - * Handle parsing extra player data - * - * @param Buffer $buffer - * @param Result $result - */ - protected function parsePlayersExtra(Buffer &$buffer, Result &$result) - { - // Iterate over the extra player info - while (($id = $buffer->readInt8()) != 32) { - $result->addPlayer('total_xp', $buffer->readFloat32()); - $result->addPlayer('teamname', $buffer->readString()); - $result->addPlayer('total_kills', $buffer->readInt32()); - $result->addPlayer('total_deaths', $buffer->readInt32()); - } - - // @todo: Add team stuff - - // Free some memory - unset($id); - } -} diff --git a/gameq/src/GameQ/Protocols/Ffe.php b/gameq/src/GameQ/Protocols/Ffe.php deleted file mode 100644 index c0947bd..0000000 --- a/gameq/src/GameQ/Protocols/Ffe.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Ffe - Fortress Forever - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Ffe extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ffe'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Fortress Forever"; -} diff --git a/gameq/src/GameQ/Protocols/Ffow.php b/gameq/src/GameQ/Protocols/Ffow.php deleted file mode 100644 index 00c33d4..0000000 --- a/gameq/src/GameQ/Protocols/Ffow.php +++ /dev/null @@ -1,243 +0,0 @@ - "\xFF\xFF\xFF\xFF\x57", - self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - self::PACKET_INFO => "\xFF\xFF\xFF\xFF\x46\x4C\x53\x51", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFF\x49\x02" => 'processInfo', // I - "\xFF\xFF\xFF\xFF\x45\x00" => 'processRules', // E - "\xFF\xFF\xFF\xFF\x44\x00" => 'processPlayers', // D - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ffow'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ffow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Frontlines Fuel of War"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * query_port = client_port + 2 - * - * @type int - */ - protected $port_diff = 2; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamemode', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'mod' => 'modname', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - // Burn padding - $challenge_buffer->skip(5); - - // Apply the challenge and return - return $this->challengeApply($challenge_buffer->read(4)); - } - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Init results - $results = []; - - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Figure out what packet response this is for - $response_type = $buffer->read(6); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($response_type) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - $result->add('servername', $buffer->readString()); - $result->add('mapname', $buffer->readString()); - $result->add('modname', $buffer->readString()); - $result->add('gamemode', $buffer->readString()); - $result->add('description', $buffer->readString()); - $result->add('version', $buffer->readString()); - $result->add('port', $buffer->readInt16()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('dedicated', $buffer->readInt8()); - $result->add('os', $buffer->readInt8()); - $result->add('password', $buffer->readInt8()); - $result->add('anticheat', $buffer->readInt8()); - $result->add('average_fps', $buffer->readInt8()); - $result->add('round', $buffer->readInt8()); - $result->add('max_rounds', $buffer->readInt8()); - $result->add('time_left', $buffer->readInt16()); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing the server rules - * - * @param Buffer $buffer - * - * @return array - */ - protected function processRules(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn extra header - $buffer->skip(1); - - // Read rules until we run out of buffer - while ($buffer->getLength()) { - $key = $buffer->readString(); - // Check for map - if (strstr($key, "Map:")) { - $result->addSub("maplist", "name", $buffer->readString()); - } else // Regular rule - { - $result->add($key, $buffer->readString()); - } - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @todo: Build this out when there is a server with players to test against - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Gamespy.php b/gameq/src/GameQ/Protocols/Gamespy.php deleted file mode 100644 index 37a951e..0000000 --- a/gameq/src/GameQ/Protocols/Gamespy.php +++ /dev/null @@ -1,178 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use \GameQ\Exception\Protocol as Exception; - -/** - * GameSpy Protocol class - * - * @author Austin Bischoff - */ -class Gamespy extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x5C\x73\x74\x61\x74\x75\x73\x5C", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Process the response for this protocol - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // Holds the processed packets so we can sort them in case they come in an unordered - $processed = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Check to see if we had a preg_match error - if (($match = preg_match("#^(.*)\\\\queryid\\\\([^\\\\]+)(\\\\|$)#", $response, $matches)) === false - || $match != 1 - ) { - throw new Exception(__METHOD__ . " An error occurred while parsing the packets for 'queryid'"); - } - - // Multiply so we move the decimal point out of the way, if there is one - $key = (int)(floatval($matches[2]) * 1000); - - // Add this packet to the processed - $processed[$key] = $matches[1]; - } - - // Sort the new array to make sure the keys (query ids) are in the proper order - ksort($processed, SORT_NUMERIC); - - // Create buffer and offload processing - return $this->processStatus(new Buffer(implode('', $processed))); - } - - /* - * Internal methods - */ - - /** - * Handle processing the status buffer - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // By default dedicted - $result->add('dedicated', 1); - - // Lets peek and see if the data starts with a \ - if ($buffer->lookAhead(1) == '\\') { - // Burn the first one - $buffer->skip(1); - } - - // Explode the data - $data = explode('\\', $buffer->getBuffer()); - - // No longer needed - unset($buffer); - - // Init some vars - $numPlayers = 0; - $numTeams = 0; - - $itemCount = count($data); - - // Now lets loop the array - for ($x = 0; $x < $itemCount; $x += 2) { - // Set some local vars - $key = $data[$x]; - $val = $data[$x + 1]; - - // Check for _ variable (i.e players) - if (($suffix = strrpos($key, '_')) !== false && is_numeric(substr($key, $suffix + 1))) { - // See if this is a team designation - if (substr($key, 0, $suffix) == 'teamname') { - $result->addTeam('teamname', $val); - $numTeams++; - } else { - // Its a player - if (substr($key, 0, $suffix) == 'playername') { - $numPlayers++; - } - $result->addPlayer(substr($key, 0, $suffix), utf8_encode($val)); - } - } else { - // Regular variable so just add the value. - $result->add($key, $val); - } - } - - // Add the player and team count - $result->add('num_players', $numPlayers); - $result->add('num_teams', $numTeams); - - // Unset some stuff to free up memory - unset($data, $key, $val, $suffix, $x, $itemCount); - - // Return the result - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Gamespy3.php b/gameq/src/GameQ/Protocols/Gamespy3.php deleted file mode 100644 index ab74206..0000000 --- a/gameq/src/GameQ/Protocols/Gamespy3.php +++ /dev/null @@ -1,335 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; - -/** - * GameSpy3 Protocol class - * - * Given the ability for non utf-8 characters to be used as hostnames, player names, etc... this - * version returns all strings utf-8 encoded (utf8_encode). To access the proper version of a - * string response you must use utf8_decode() on the specific response. - * - * @author Austin Bischoff - */ -class Gamespy3 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x01", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gamespy3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gamespy3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GameSpy3 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * This defines the split between the server info and player/team info. - * This value can vary by game. This value is the default split. - * - * @var string - */ - protected $packetSplit = "/\\x00\\x00\\x01/m"; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - // Pull out the challenge - $challenge = substr(preg_replace("/[^0-9\-]/si", "", $challenge_buffer->getBuffer()), 1); - - // By default, no challenge result (see #197) - $challenge_result = ''; - - // Check for valid challenge (see #197) - if ($challenge) { - // Encode chellenge result - $challenge_result = sprintf( - "%c%c%c%c", - ($challenge >> 24), - ($challenge >> 16), - ($challenge >> 8), - ($challenge >> 0) - ); - } - - // Apply the challenge and return - return $this->challengeApply($challenge_result); - } - - /** - * Process the response - * - * @return array - */ - public function processResponse() - { - - // Holds the processed packets - $processed = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Make a buffer - $buffer = new Buffer($response, Buffer::NUMBER_TYPE_BIGENDIAN); - - // Packet type = 0 - $buffer->readInt8(); - - // Session Id - $buffer->readInt32(); - - // We need to burn the splitnum\0 because it is not used - $buffer->skip(9); - - // Get the id - $id = $buffer->readInt8(); - - // Burn next byte not sure what it is used for - $buffer->skip(1); - - // Add this packet to the processed - $processed[$id] = $buffer->getBuffer(); - - unset($buffer, $id); - } - - // Sort packets, reset index - ksort($processed); - - // Offload cleaning up the packets if they happen to be split - $packets = $this->cleanPackets(array_values($processed)); - - // Split the packets by type general and the rest (i.e. players & teams) - $split = preg_split($this->packetSplit, implode('', $packets)); - - // Create a new result - $result = new Result(); - - // Assign variable due to pass by reference in PHP 7+ - $buffer = new Buffer($split[0], Buffer::NUMBER_TYPE_BIGENDIAN); - - // First key should be server details and rules - $this->processDetails($buffer, $result); - - // The rest should be the player and team information, if it exists - if (array_key_exists(1, $split)) { - $buffer = new Buffer($split[1], Buffer::NUMBER_TYPE_BIGENDIAN); - $this->processPlayersAndTeams($buffer, $result); - } - - unset($buffer); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles cleaning up packets since the responses can be a bit "dirty" - * - * @param array $packets - * - * @return array - */ - protected function cleanPackets(array $packets = []) - { - - // Get the number of packets - $packetCount = count($packets); - - // Compare last var of current packet with first var of next packet - // On a partial match, remove last var from current packet, - // variable header from next packet - for ($i = 0, $x = $packetCount; $i < $x - 1; $i++) { - // First packet - $fst = substr($packets[$i], 0, -1); - // Second packet - $snd = $packets[$i + 1]; - // Get last variable from first packet - $fstvar = substr($fst, strrpos($fst, "\x00") + 1); - // Get first variable from last packet - $snd = substr($snd, strpos($snd, "\x00") + 2); - $sndvar = substr($snd, 0, strpos($snd, "\x00")); - // Check if fstvar is a substring of sndvar - // If so, remove it from the first string - if (!empty($fstvar) && strpos($sndvar, $fstvar) !== false) { - $packets[$i] = preg_replace("#(\\x00[^\\x00]+\\x00)$#", "\x00", $packets[$i]); - } - } - - // Now let's loop the return and remove any dupe prefixes - for ($x = 1; $x < $packetCount; $x++) { - $buffer = new Buffer($packets[$x], Buffer::NUMBER_TYPE_BIGENDIAN); - - $prefix = $buffer->readString(); - - // Check to see if the return before has the same prefix present - if ($prefix != null && strstr($packets[($x - 1)], $prefix)) { - // Update the return by removing the prefix plus 2 chars - $packets[$x] = substr(str_replace($prefix, '', $packets[$x]), 2); - } - - unset($buffer); - } - - unset($x, $i, $snd, $sndvar, $fst, $fstvar); - - // Return cleaned packets - return $packets; - } - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processDetails(Buffer &$buffer, Result &$result) - { - - // We go until we hit an empty key - while ($buffer->getLength()) { - $key = $buffer->readString(); - if (strlen($key) == 0) { - break; - } - $result->add($key, utf8_encode($buffer->readString())); - } - } - - /** - * Handles processing the player and team data into a usable format - * - * @param \GameQ\Buffer $buffer - * @param \GameQ\Result $result - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - - /* - * Explode the data into groups. First is player, next is team (item_t) - * Each group should be as follows: - * - * [0] => item_ - * [1] => information for item_ - * ... - */ - $data = explode("\x00\x00", $buffer->getBuffer()); - - // By default item_group is blank, this will be set for each loop thru the data - $item_group = ''; - // By default the item_type is blank, this will be set on each loop - $item_type = ''; - // Loop through all of the $data for information and pull it out into the result - for ($x = 0; $x < count($data) - 1; $x++) { - // Pull out the item - $item = $data[$x]; - // If this is an empty item, move on - if ($item == '' || $item == "\x00") { - continue; - } - /* - * Left as reference: - * - * Each block of player_ and team_t have preceding junk chars - * - * player_ is actually \x01player_ - * team_t is actually \x00\x02team_t - * - * Probably a by-product of the change to exploding the data from the original. - * - * For now we just strip out these characters - */ - // Check to see if $item has a _ at the end, this is player info - if (substr($item, -1) == '_') { - // Set the item group - $item_group = 'players'; - // Set the item type, rip off any trailing stuff and bad chars - $item_type = rtrim(str_replace("\x01", '', $item), '_'); - } elseif (substr($item, -2) == '_t') { - // Check to see if $item has a _t at the end, this is team info - // Set the item group - $item_group = 'teams'; - // Set the item type, rip off any trailing stuff and bad chars - $item_type = rtrim(str_replace(["\x00", "\x02"], '', $item), '_t'); - } else { - // We can assume it is data belonging to a previously defined item - - // Make a temp buffer so we have easier access to the data - $buf_temp = new Buffer($item, Buffer::NUMBER_TYPE_BIGENDIAN); - // Get the values - while ($buf_temp->getLength()) { - // No value so break the loop, end of string - if (($val = $buf_temp->readString()) === '') { - break; - } - // Add the value to the proper item in the correct group - $result->addSub($item_group, $item_type, utf8_encode(trim($val))); - } - // Unset our buffer - unset($buf_temp); - } - } - // Free up some memory - unset($data, $item, $item_group, $item_type, $val); - } -} diff --git a/gameq/src/GameQ/Protocols/Gamespy4.php b/gameq/src/GameQ/Protocols/Gamespy4.php deleted file mode 100644 index e28755f..0000000 --- a/gameq/src/GameQ/Protocols/Gamespy4.php +++ /dev/null @@ -1,34 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * GameSpy4 Protocol Class - * - * By all accounts GameSpy 4 seems to be GameSpy 3. - * - * References: - * http://www.deletedscreen.com/?p=951 - * http://pastebin.com/2zZFDuTd - * - * @author Austin Bischoff - */ -class Gamespy4 extends Gamespy3 -{ -} diff --git a/gameq/src/GameQ/Protocols/Gmod.php b/gameq/src/GameQ/Protocols/Gmod.php deleted file mode 100644 index 6596724..0000000 --- a/gameq/src/GameQ/Protocols/Gmod.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Gmod - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Gmod extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gmod'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Garry's Mod"; -} diff --git a/gameq/src/GameQ/Protocols/Grav.php b/gameq/src/GameQ/Protocols/Grav.php deleted file mode 100644 index e025075..0000000 --- a/gameq/src/GameQ/Protocols/Grav.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Grav Online Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Grav extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'grav'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GRAV Online"; -} diff --git a/gameq/src/GameQ/Protocols/Gta5m.php b/gameq/src/GameQ/Protocols/Gta5m.php deleted file mode 100644 index 0f0c50a..0000000 --- a/gameq/src/GameQ/Protocols/Gta5m.php +++ /dev/null @@ -1,173 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * GTA Five M Protocol Class - * - * Server base can be found at https://fivem.net/ - * - * Based on code found at https://github.com/LiquidObsidian/fivereborn-query - * - * @author Austin Bischoff - */ -class Gta5m extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\xFF\xFF\xFF\xFFgetinfo xxx", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFFinfoResponse" => "processStatus", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'gta5m'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'gta5m'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "GTA Five M"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'sv_maxclients', - 'mod' => 'gamename', - 'numplayers' => 'clients', - 'password' => 'privateClients', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // In case it comes back as multiple packets (it shouldn't) - $buffer = new Buffer(implode('', $this->packets_response)); - - // Figure out what packet response this is for - $response_type = $buffer->readString(PHP_EOL); - - // Figure out which packet response this is - if (empty($response_type) || !array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Offload the call - $results = call_user_func_array([$this, $this->responses[$response_type]], [$buffer]); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handle processing the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Lets peek and see if the data starts with a \ - if ($buffer->lookAhead(1) == '\\') { - // Burn the first one - $buffer->skip(1); - } - - // Explode the data - $data = explode('\\', $buffer->getBuffer()); - - // No longer needed - unset($buffer); - - $itemCount = count($data); - - // Now lets loop the array - for ($x = 0; $x < $itemCount; $x += 2) { - // Set some local vars - $key = $data[$x]; - $val = $data[$x + 1]; - - if (in_array($key, ['challenge'])) { - continue; // skip - } - - // Regular variable so just add the value. - $result->add($key, $val); - } - - /*var_dump($data); - var_dump($result->fetch()); - - exit;*/ - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Gtan.php b/gameq/src/GameQ/Protocols/Gtan.php deleted file mode 100644 index f7b531e..0000000 --- a/gameq/src/GameQ/Protocols/Gtan.php +++ /dev/null @@ -1,163 +0,0 @@ -. - */ -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; -use GameQ\Server; - -/** - * Grand Theft Auto Network Protocol Class - * https://stats.gtanet.work/ - * - * Result from this call should be a header + JSON response - * - * References: - * - https://master.gtanet.work/apiservers - * - * @author Austin Bischoff - */ -class Gtan extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - //self::PACKET_STATUS => "GET /apiservers HTTP/1.0\r\nHost: master.gtanet.work\r\nAccept: */*\r\n\r\n", - self::PACKET_STATUS => "GET /gtan/api.php?ip=%s&raw HTTP/1.0\r\nHost: multiplayerhosting.info\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Http protocol is SSL - * - * @var string - */ - protected $transport = self::TRANSPORT_SSL; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'gtan'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'gtan'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "Grand Theft Auto Network"; - - /** - * Holds the real ip so we can overwrite it back - * - * @var string - */ - protected $realIp = null; - - protected $realPortQuery = null; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'mod' => 'mod', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - ]; - - public function beforeSend(Server $server) - { - // Loop over the packets and update them - foreach ($this->packets as $packetType => $packet) { - // Fill out the packet with the server info - $this->packets[$packetType] = sprintf($packet, $server->ip . ':' . $server->port_query); - } - - $this->realIp = $server->ip; - $this->realPortQuery = $server->port_query; - - // Override the existing settings - //$server->ip = 'master.gtanet.work'; - $server->ip = 'multiplayerhosting.info'; - $server->port_query = 443; - } - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // No response, assume offline - if (empty($this->packets_response)) { - return [ - 'gq_address' => $this->realIp, - 'gq_port_query' => $this->realPortQuery, - ]; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Gtan protocol is invalid."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - $result->add('gq_address', $this->realIp); - $result->add('gq_port_query', $this->realPortQuery); - - // Add server items - $result->add('hostname', $json->ServerName); - $result->add('serverversion', $json->ServerVersion); - $result->add('map', ((!empty($json->Map)) ? $json->Map : 'Los Santos/Blaine Country')); - $result->add('mod', $json->Gamemode); - $result->add('password', (int)$json->Passworded); - $result->add('numplayers', $json->CurrentPlayers); - $result->add('maxplayers', $json->MaxPlayers); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Hl2dm.php b/gameq/src/GameQ/Protocols/Hl2dm.php deleted file mode 100644 index 15f881a..0000000 --- a/gameq/src/GameQ/Protocols/Hl2dm.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Hl2dm - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Hl2dm extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'hl2dm'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Half Life 2: Deathmatch"; -} diff --git a/gameq/src/GameQ/Protocols/Http.php b/gameq/src/GameQ/Protocols/Http.php deleted file mode 100644 index 2a86d8d..0000000 --- a/gameq/src/GameQ/Protocols/Http.php +++ /dev/null @@ -1,67 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; - -/** - * Class Http - * - * Generic HTTP protocol class. Useful for making http based requests - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -abstract class Http extends Protocol -{ - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'http'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'http'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Generic HTTP protocol"; - - /** - * Http protocol is TCP - * - * @var string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; -} diff --git a/gameq/src/GameQ/Protocols/Insurgency.php b/gameq/src/GameQ/Protocols/Insurgency.php deleted file mode 100644 index 77b8329..0000000 --- a/gameq/src/GameQ/Protocols/Insurgency.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Insurgency - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Insurgency extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'insurgency'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Insurgency"; -} diff --git a/gameq/src/GameQ/Protocols/Jediacademy.php b/gameq/src/GameQ/Protocols/Jediacademy.php deleted file mode 100644 index a051a3a..0000000 --- a/gameq/src/GameQ/Protocols/Jediacademy.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Jedi Academy Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Jediacademy extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'jediacademy'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Star Wars Jedi Knight: Jedi Academy"; -} diff --git a/gameq/src/GameQ/Protocols/Jedioutcast.php b/gameq/src/GameQ/Protocols/Jedioutcast.php deleted file mode 100644 index 1afd9af..0000000 --- a/gameq/src/GameQ/Protocols/Jedioutcast.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Jedi Outcast Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Jedioutcast extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'jedioutcast'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Star Wars Jedi Knight II: Jedi Outcast"; -} diff --git a/gameq/src/GameQ/Protocols/Justcause2.php b/gameq/src/GameQ/Protocols/Justcause2.php deleted file mode 100644 index 648cb6d..0000000 --- a/gameq/src/GameQ/Protocols/Justcause2.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Just Cause 2 Multiplayer Protocol Class - * - * Special thanks to Woet for some insight on packing - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Justcause2 extends Gamespy4 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'justcause2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Just Cause 2 Multiplayer"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Change the packets used - * - * @var array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", - self::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x02", - ]; - - /** - * Override the packet split - * - * @var string - */ - protected $packetSplit = "/\\x00\\x00\\x00/m"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - ], - ]; - - /** - * Overload so we can add in some static data points - * - * @param Buffer $buffer - * @param Result $result - */ - protected function processDetails(Buffer &$buffer, Result &$result) - { - parent::processDetails($buffer, $result); - - // Add in map - $result->add('mapname', 'Panau'); - $result->add('dedicated', 'true'); - } - - /** - * Override the parent, this protocol is returned differently - * - * @param Buffer $buffer - * @param Result $result - * - * @see Gamespy3::processPlayersAndTeams() - */ - protected function processPlayersAndTeams(Buffer &$buffer, Result &$result) - { - // Loop until we run out of data - while ($buffer->getLength()) { - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('steamid', $buffer->readString()); - $result->addPlayer('ping', $buffer->readInt16()); - } - } -} diff --git a/gameq/src/GameQ/Protocols/Justcause3.php b/gameq/src/GameQ/Protocols/Justcause3.php deleted file mode 100644 index c4e901d..0000000 --- a/gameq/src/GameQ/Protocols/Justcause3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Just Cause 3 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Justcause3 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'justcause3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Just Cause 3"; - - /** - * Query port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/gameq/src/GameQ/Protocols/Killingfloor.php b/gameq/src/GameQ/Protocols/Killingfloor.php deleted file mode 100644 index 9cc1964..0000000 --- a/gameq/src/GameQ/Protocols/Killingfloor.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Killing floor - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Killingfloor extends Unreal2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'killing floor'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Killing Floor"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Overload the default detail process since this version is different - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('serverid', $buffer->readInt32()); // 0 - $result->add('serverip', $buffer->readPascalString(1)); // empty - $result->add('gameport', $buffer->readInt32()); - $result->add('queryport', $buffer->readInt32()); // 0 - - // We burn the first char since it is not always correct with the hostname - $buffer->skip(1); - - // Read as a regular string since the length is incorrect (what we skipped earlier) - $result->add('servername', utf8_encode($buffer->readString())); - - // The rest is read as normal - $result->add('mapname', utf8_encode($buffer->readPascalString(1))); - $result->add('gametype', $buffer->readPascalString(1)); - $result->add('numplayers', $buffer->readInt32()); - $result->add('maxplayers', $buffer->readInt32()); - $result->add('currentwave', $buffer->readInt32()); - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Killingfloor2.php b/gameq/src/GameQ/Protocols/Killingfloor2.php deleted file mode 100644 index a134f25..0000000 --- a/gameq/src/GameQ/Protocols/Killingfloor2.php +++ /dev/null @@ -1,51 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Killing floor - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Killingfloor2 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'killing floor 2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Killing Floor 2"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/gameq/src/GameQ/Protocols/L4d.php b/gameq/src/GameQ/Protocols/L4d.php deleted file mode 100644 index 596452a..0000000 --- a/gameq/src/GameQ/Protocols/L4d.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class L4d - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class L4d extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'l4d'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Left 4 Dead"; -} diff --git a/gameq/src/GameQ/Protocols/L4d2.php b/gameq/src/GameQ/Protocols/L4d2.php deleted file mode 100644 index 475514c..0000000 --- a/gameq/src/GameQ/Protocols/L4d2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class L4d2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class L4d2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'l4d2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Left 4 Dead 2"; -} diff --git a/gameq/src/GameQ/Protocols/Lhmp.php b/gameq/src/GameQ/Protocols/Lhmp.php deleted file mode 100644 index 3d5e81f..0000000 --- a/gameq/src/GameQ/Protocols/Lhmp.php +++ /dev/null @@ -1,214 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Lost Heaven Protocol class - * - * Reference: http://lh-mp.eu/wiki/index.php/Query_System - * - * @author Austin Bischoff - */ -class Lhmp extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "LHMPo", - self::PACKET_PLAYERS => "LHMPp", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "LHMPo" => "processDetails", - "LHMPp" => "processPlayers", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'lhmp'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'lhmp'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Lost Heaven"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamemode', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$header}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param Buffer $buffer - * - * @return array - * @throws Exception - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('protocol', $buffer->readString()); - $result->add('password', $buffer->readString()); - $result->add('numplayers', $buffer->readInt16()); - $result->add('maxplayers', $buffer->readInt16()); - $result->add('servername', utf8_encode($buffer->readPascalString())); - $result->add('gamemode', $buffer->readPascalString()); - $result->add('website', utf8_encode($buffer->readPascalString())); - $result->add('mapname', utf8_encode($buffer->readPascalString())); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Get the number of players - $result->add('numplayers', $buffer->readInt16()); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt16()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString())); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Minecraft.php b/gameq/src/GameQ/Protocols/Minecraft.php deleted file mode 100644 index a895cb8..0000000 --- a/gameq/src/GameQ/Protocols/Minecraft.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Minecraft Protocol Class - * - * Thanks to https://github.com/xPaw/PHP-Minecraft-Query for helping me realize this is - * Gamespy 3 Protocol. Make sure you enable the items below for it to work. - * - * Information from original author: - * Instructions - * - * Before using this class, you need to make sure that your server is running GS4 status listener. - * - * Look for those settings in server.properties: - * - * enable-query=true - * query.port=25565 - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Minecraft extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'minecraft'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Minecraft"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "minecraft://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_id', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - ], - ]; -} diff --git a/gameq/src/GameQ/Protocols/Minecraftpe.php b/gameq/src/GameQ/Protocols/Minecraftpe.php deleted file mode 100644 index 21d1186..0000000 --- a/gameq/src/GameQ/Protocols/Minecraftpe.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Minecraft PE (BE) Protocol Class - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Minecraftpe extends Minecraft -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'minecraftpe'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "MinecraftPE"; -} diff --git a/gameq/src/GameQ/Protocols/Mohaa.php b/gameq/src/GameQ/Protocols/Mohaa.php deleted file mode 100644 index d4ebb5a..0000000 --- a/gameq/src/GameQ/Protocols/Mohaa.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Medal of honor: Allied Assault Protocol Class - * - * @package GameQ\Protocols - * @author Bram - * @author Austin Bischoff - */ -class Mohaa extends Gamespy -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mohaa'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Medal of honor: Allied Assault"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'player', - 'score' => 'frags', - 'ping' => 'ping', - ], - ]; - - /** - * Query port is always the client port + 97 in MOHAA - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - return $clientPort+97; - } -} diff --git a/gameq/src/GameQ/Protocols/Mta.php b/gameq/src/GameQ/Protocols/Mta.php deleted file mode 100644 index b95dc4c..0000000 --- a/gameq/src/GameQ/Protocols/Mta.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Multi Theft Auto - * - * @package GameQ\Protocols - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Mta extends Ase -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mta'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Multi Theft Auto"; - - /** - * query_port = client_port + 123 - * - * @type int - */ - protected $port_diff = 123; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "mtasa://%s:%d/"; -} diff --git a/gameq/src/GameQ/Protocols/Mumble.php b/gameq/src/GameQ/Protocols/Mumble.php deleted file mode 100644 index 299389c..0000000 --- a/gameq/src/GameQ/Protocols/Mumble.php +++ /dev/null @@ -1,194 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Mumble Protocol class - * - * References: - * https://github.com/edmundask/MurmurQuery - Thanks to skylord123 - * - * @author Austin Bischoff - */ -class Mumble extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "\x6A\x73\x6F\x6E", // JSON packet - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'mumble'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'mumble'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Mumble Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "mumble://%s:%d/"; - - /** - * 27800 = 64738 - 36938 - * - * @type int - */ - protected $port_diff = -36938; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'name', - 'numplayers' => 'numplayers', - 'maxplayers' => 'x_gtmurmur_max_users', - ], - // Player - 'player' => [ - 'name' => 'name', - 'ping' => 'tcpPing', - 'team' => 'channel', - 'time' => 'onlinesecs', - ], - // Team - 'team' => [ - 'name' => 'name', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Try to json_decode, make it into an array - if (($data = json_decode(implode('', $this->packets_response), true)) === null) { - throw new Exception(__METHOD__ . " Unable to decode JSON data."); - } - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Let's iterate over the response items, there are a lot - foreach ($data as $key => $value) { - // Ignore root for now, that is where all of the channel/player info is housed - if (in_array($key, ['root'])) { - continue; - } - - // Add them as is - $result->add($key, $value); - } - - // Offload the channel and user parsing - $this->processChannelsAndUsers($data['root'], $result); - - unset($data); - - // Manually set the number of players - $result->add('numplayers', count($result->get('players'))); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Handles processing the the channels and user info - * - * @param array $data - * @param \GameQ\Result $result - */ - protected function processChannelsAndUsers(array $data, Result &$result) - { - - // Let's add all of the channel information - foreach ($data as $key => $value) { - // We will handle these later - if (in_array($key, ['channels', 'users'])) { - // skip - continue; - } - - // Add the channel property as a team - $result->addTeam($key, $value); - } - - // Itereate over the users in this channel - foreach ($data['users'] as $user) { - foreach ($user as $key => $value) { - $result->addPlayer($key, $value); - } - } - - // Offload more channels to parse - foreach ($data['channels'] as $channel) { - $this->processChannelsAndUsers($channel, $result); - } - } -} diff --git a/gameq/src/GameQ/Protocols/Ns2.php b/gameq/src/GameQ/Protocols/Ns2.php deleted file mode 100644 index 4c32392..0000000 --- a/gameq/src/GameQ/Protocols/Ns2.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Ns2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Ns2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ns2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Natural Selection 2"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/gameq/src/GameQ/Protocols/Projectrealitybf2.php b/gameq/src/GameQ/Protocols/Projectrealitybf2.php deleted file mode 100644 index 6f4b5ce..0000000 --- a/gameq/src/GameQ/Protocols/Projectrealitybf2.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Projectrealitybf2 - * - * Based off of BF2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Projectrealitybf2 extends Bf2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'projectrealitybf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Project Reality: Battlefield 2"; -} diff --git a/gameq/src/GameQ/Protocols/Quake2.php b/gameq/src/GameQ/Protocols/Quake2.php deleted file mode 100644 index f0366c2..0000000 --- a/gameq/src/GameQ/Protocols/Quake2.php +++ /dev/null @@ -1,219 +0,0 @@ - "\xFF\xFF\xFF\xFFstatus\x00", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFF\x70\x72\x69\x6e\x74" => 'processStatus', - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'quake2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quake2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake 2 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamename', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxclients', - 'mod' => 'g_gametype', - 'numplayers' => 'clients', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Make a buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Grab the header - $header = $buffer->readString("\x0A"); - - // Figure out which packet response this is - if (empty($header) || !array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - return call_user_func_array([$this, $this->responses[$header]], [$buffer]); - } - - /** - * Process the status response - * - * @param Buffer $buffer - * - * @return array - */ - protected function processStatus(Buffer $buffer) - { - // We need to split the data and offload - $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); - - $results = array_merge_recursive( - $results, - $this->processPlayers(new Buffer($buffer->getBuffer())) - ); - - unset($buffer); - - // Return results - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processServerInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn leading \ if one exists - $buffer->readString('\\'); - - // Key / value pairs - while ($buffer->getLength()) { - // Add result - $result->add( - trim($buffer->readString('\\')), - utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) - ); - } - - $result->add('password', 0); - $result->add('mod', 0); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - // Some games do not have a number of current players - $playerCount = 0; - - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Make a new buffer with this block - $playerInfo = new Buffer($buffer->readString("\x0A")); - - // Add player info - $result->addPlayer('frags', $playerInfo->readString("\x20")); - $result->addPlayer('ping', $playerInfo->readString("\x20")); - - // Skip first " - $playerInfo->skip(1); - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); - - // Skip first " - $playerInfo->skip(2); - - // Add address - $result->addPlayer('address', trim($playerInfo->readString('"'))); - - // Increment - $playerCount++; - - // Clear - unset($playerInfo); - } - - $result->add('clients', $playerCount); - - // Clear - unset($buffer, $playerCount); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Quake3.php b/gameq/src/GameQ/Protocols/Quake3.php deleted file mode 100644 index 3ed177b..0000000 --- a/gameq/src/GameQ/Protocols/Quake3.php +++ /dev/null @@ -1,203 +0,0 @@ - "\xFF\xFF\xFF\xFF\x67\x65\x74\x73\x74\x61\x74\x75\x73\x0A", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xFF\xFF\xFF\xFFstatusResponse" => 'processStatus', - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'quake3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quake3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake 3 Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'gametype' => 'gamename', - 'hostname' => 'sv_hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'sv_maxclients', - 'mod' => 'g_gametype', - 'numplayers' => 'clients', - 'password' => ['g_needpass', 'pswrd'], - ], - // Individual - 'player' => [ - 'name' => 'name', - 'ping' => 'ping', - 'score' => 'frags', - ], - ]; - - /** - * Handle response from the server - * - * @return mixed - * @throws Exception - */ - public function processResponse() - { - // Make a buffer - $buffer = new Buffer(implode('', $this->packets_response)); - - // Grab the header - $header = $buffer->readString("\x0A"); - - // Figure out which packet response this is - if (empty($header) || !array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - return call_user_func_array([$this, $this->responses[$header]], [$buffer]); - } - - protected function processStatus(Buffer $buffer) - { - // We need to split the data and offload - $results = $this->processServerInfo(new Buffer($buffer->readString("\x0A"))); - - $results = array_merge_recursive( - $results, - $this->processPlayers(new Buffer($buffer->getBuffer())) - ); - - unset($buffer); - - // Return results - return $results; - } - - /** - * Handle processing the server information - * - * @param Buffer $buffer - * - * @return array - */ - protected function processServerInfo(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Burn leading \ if one exists - $buffer->readString('\\'); - - // Key / value pairs - while ($buffer->getLength()) { - // Add result - $result->add( - trim($buffer->readString('\\')), - utf8_encode(trim($buffer->readStringMulti(['\\', "\x0a"]))) - ); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handle processing of player data - * - * @param Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - // Some games do not have a number of current players - $playerCount = 0; - - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Make a new buffer with this block - $playerInfo = new Buffer($buffer->readString("\x0A")); - - // Add player info - $result->addPlayer('frags', $playerInfo->readString("\x20")); - $result->addPlayer('ping', $playerInfo->readString("\x20")); - - // Skip first " - $playerInfo->skip(1); - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); - - // Increment - $playerCount++; - - // Clear - unset($playerInfo); - } - - $result->add('clients', $playerCount); - - // Clear - unset($buffer, $playerCount); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Quakelive.php b/gameq/src/GameQ/Protocols/Quakelive.php deleted file mode 100644 index d5df350..0000000 --- a/gameq/src/GameQ/Protocols/Quakelive.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Quake Live - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Quakelive extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'quakelive'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Quake Live"; -} diff --git a/gameq/src/GameQ/Protocols/Redorchestra2.php b/gameq/src/GameQ/Protocols/Redorchestra2.php deleted file mode 100644 index 6733016..0000000 --- a/gameq/src/GameQ/Protocols/Redorchestra2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Redorchestra2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Redorchestra2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'redorchestra2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Red Orchestra 2"; - - /** - * query_port = client_port + 19238 - * 27015 = 7777 + 19238 - * - * @type int - */ - protected $port_diff = 19238; -} diff --git a/gameq/src/GameQ/Protocols/Risingstorm2.php b/gameq/src/GameQ/Protocols/Risingstorm2.php deleted file mode 100644 index ddb82a5..0000000 --- a/gameq/src/GameQ/Protocols/Risingstorm2.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Rising Storm 2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Risingstorm2 extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'rising storm 2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Rising Storm 2"; - - /** - * Query port is always 27015 - * - * @param int $clientPort - * - * @return int - */ - public function findQueryPort($clientPort) - { - return 27015; - } -} diff --git a/gameq/src/GameQ/Protocols/Rust.php b/gameq/src/GameQ/Protocols/Rust.php deleted file mode 100644 index 81b0cce..0000000 --- a/gameq/src/GameQ/Protocols/Rust.php +++ /dev/null @@ -1,43 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Rust - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Rust extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'rust'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Rust"; -} diff --git a/gameq/src/GameQ/Protocols/Samp.php b/gameq/src/GameQ/Protocols/Samp.php deleted file mode 100644 index e96358a..0000000 --- a/gameq/src/GameQ/Protocols/Samp.php +++ /dev/null @@ -1,272 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * San Andreas Multiplayer Protocol Class (samp) - * - * Note: - * Player information will not be returned if player count is over 256 - * - * @author Austin Bischoff - */ -class Samp extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "SAMP%si", - self::PACKET_PLAYERS => "SAMP%sd", - self::PACKET_RULES => "SAMP%sr", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x69" => "processStatus", // i - "\x64" => "processPlayers", // d - "\x72" => "processRules", // r - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'samp'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'samp'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "San Andreas Multiplayer"; - - /** - * Holds the calculated server code that is passed when querying for information - * - * @type string - */ - protected $server_code = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => ['hostname', 'servername'], - 'mapname' => 'mapname', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'ping' => 'ping', - ], - ]; - - /** - * Handle some work before sending the packets out to the server - * - * @param \GameQ\Server $server - */ - public function beforeSend(Server $server) - { - - // Build the server code - $this->server_code = implode('', array_map('chr', explode('.', $server->ip()))) . - pack("S", $server->portClient()); - - // Loop over the packets and update them - foreach ($this->packets as $packetType => $packet) { - // Fill out the packet with the server info - $this->packets[$packetType] = sprintf($packet, $this->server_code); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Results that will be returned - $results = [ ]; - - // Get the length of the server code so we can figure out how much to read later - $serverCodeLength = strlen($this->server_code); - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - // Make new buffer - $buffer = new Buffer($response); - - // Check the header, should be SAMP - if (($header = $buffer->read(4)) !== 'SAMP') { - throw new Exception(__METHOD__ . " header response '{$header}' is not valid"); - } - - // Check to make sure the server response code matches what we sent - if ($buffer->read($serverCodeLength) !== $this->server_code) { - throw new Exception(__METHOD__ . " code check failed."); - } - - // Figure out what packet response this is for - $response_type = $buffer->read(1); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([ $this, $this->responses[$response_type] ], [ $buffer ]) - ); - - unset($buffer); - } - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the server status data - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processStatus(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Pull out the server information - $result->add('password', $buffer->readInt8()); - $result->add('num_players', $buffer->readInt16()); - $result->add('max_players', $buffer->readInt16()); - - // These are read differently for these last 3 - $result->add('servername', $buffer->read($buffer->readInt32())); - $result->add('gametype', $buffer->read($buffer->readInt32())); - $result->add('language', $buffer->read($buffer->readInt32())); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Number of players - $result->add('num_players', $buffer->readInt16()); - - // Run until we run out of buffer - while ($buffer->getLength()) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', $buffer->readPascalString()); - $result->addPlayer('score', $buffer->readInt32()); - $result->addPlayer('ping', $buffer->readInt32()); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Number of rules - $result->add('num_rules', $buffer->readInt16()); - - // Run until we run out of buffer - while ($buffer->getLength()) { - $result->add($buffer->readPascalString(), $buffer->readPascalString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Sevendaystodie.php b/gameq/src/GameQ/Protocols/Sevendaystodie.php deleted file mode 100644 index a5ddbf2..0000000 --- a/gameq/src/GameQ/Protocols/Sevendaystodie.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class 7 Days to Die - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Sevendaystodie extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'sevendaystodie'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "7 Days to Die"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/gameq/src/GameQ/Protocols/Ship.php b/gameq/src/GameQ/Protocols/Ship.php deleted file mode 100644 index 9c3bee9..0000000 --- a/gameq/src/GameQ/Protocols/Ship.php +++ /dev/null @@ -1,95 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Class Ship - * - * @package GameQ\Protocols - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - */ -class Ship extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ship'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "The Ship"; - - /** - * Specific player parse for The Ship - * - * Player response has unknown data after the last real player - * - * @param \GameQ\Buffer $buffer - * - * @return array - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // We need to read the number of players because this response has other data at the end usually - $num_players = $buffer->readInt8(); - - // Player count - $result->add('num_players', $num_players); - - // No players, no work - if ($num_players == 0) { - return $result->fetch(); - } - - // Players list - for ($player = 0; $player < $num_players; $player++) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('score', $buffer->readInt32Signed()); - $result->addPlayer('time', $buffer->readFloat32()); - } - - // Extra data - if ($buffer->getLength() > 0) { - for ($player = 0; $player < $num_players; $player++) { - $result->addPlayer('deaths', $buffer->readInt32Signed()); - $result->addPlayer('money', $buffer->readInt32Signed()); - } - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Soldat.php b/gameq/src/GameQ/Protocols/Soldat.php deleted file mode 100644 index a9dbbc4..0000000 --- a/gameq/src/GameQ/Protocols/Soldat.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Soldat - * - * @package GameQ\Protocols - * - * @author Marcel Bößendörfer - * @author Austin Bischoff - */ -class Soldat extends Ase -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'soldat'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Soldat"; - - /** - * query_port = client_port + 123 - * - * @type int - */ - protected $port_diff = 123; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "soldat://%s:%d/"; -} diff --git a/gameq/src/GameQ/Protocols/Source.php b/gameq/src/GameQ/Protocols/Source.php deleted file mode 100644 index 9e4cb5d..0000000 --- a/gameq/src/GameQ/Protocols/Source.php +++ /dev/null @@ -1,522 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Exception\Protocol as Exception; -use GameQ\Protocol; -use GameQ\Result; - -/** - * Valve Source Engine Protocol Class (A2S) - * - * This class is used as the basis for all other source based servers - * that rely on the source protocol for game querying. - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - * - * @author Austin Bischoff - */ -class Source extends Protocol -{ - - /* - * Source engine type constants - */ - const SOURCE_ENGINE = 0, - GOLDSOURCE_ENGINE = 1; - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x56\x00\x00\x00\x00", - self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFTSource Engine Query\x00", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - self::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x49" => "processDetails", // I - "\x6d" => "processDetailsGoldSource", // m, goldsource - "\x44" => "processPlayers", // D - "\x45" => "processRules", // E - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'source'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'source'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Source Server"; - - /** - * Define the Source engine type. By default it is assumed to be Source - * - * @type int - */ - protected $source_engine = self::SOURCE_ENGINE; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'game_descr', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'max_players', - 'mod' => 'game_dir', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - 'time' => 'time', - ], - ]; - - /** - * Parse the challenge response and apply it to all the packet types - * - * @param \GameQ\Buffer $challenge_buffer - * - * @return bool - * @throws \GameQ\Exception\Protocol - */ - public function challengeParseAndApply(Buffer $challenge_buffer) - { - - // Skip the header - $challenge_buffer->skip(5); - - // Apply the challenge and return - return $this->challengeApply($challenge_buffer->read(4)); - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Will hold the results when complete - $results = []; - - // Holds sorted response packets - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Get the header of packet (long) - $header = $buffer->readInt32Signed(); - - // Single packet - if ($header == -1) { - // We need to peek and see what kind of engine this is for later processing - if ($buffer->lookAhead(1) == "\x6d") { - $this->source_engine = self::GOLDSOURCE_ENGINE; - } - - $packets[] = $buffer->getBuffer(); - continue; - } else { - // Split packet - - // Packet Id (long) - $packet_id = $buffer->readInt32Signed() + 10; - - // Add the buffer to the packet as another array - $packets[$packet_id][] = $buffer->getBuffer(); - } - } - - // Free up memory - unset($response, $packet_id, $buffer, $header); - - // Now that we have the packets sorted we need to iterate and process them - foreach ($packets as $packet_id => $packet) { - // We first need to off load split packets to combine them - if (is_array($packet)) { - $buffer = new Buffer($this->processPackets($packet_id, $packet)); - } else { - $buffer = new Buffer($packet); - } - - // Figure out what packet response this is for - $response_type = $buffer->read(1); - - // Figure out which packet response this is - if (!array_key_exists($response_type, $this->responses)) { - throw new Exception(__METHOD__ . " response type '{$response_type}' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$response_type]], [$buffer]) - ); - - unset($buffer); - } - - // Free up memory - unset($packets, $packet, $packet_id, $response_type); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Process the split packets and decompress if necessary - * - * @SuppressWarnings(PHPMD.UnusedLocalVariable) - * - * @param $packet_id - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function processPackets($packet_id, array $packets = []) - { - - // Init array so we can order - $packs = []; - - // We have multiple packets so we need to get them and order them - foreach ($packets as $i => $packet) { - // Make a buffer so we can read this info - $buffer = new Buffer($packet); - - // Gold source - if ($this->source_engine == self::GOLDSOURCE_ENGINE) { - // Grab the packet number (byte) - $packet_number = $buffer->readInt8(); - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $buffer->read(4); - } - - // Now add the rest of the packet to the new array with the packet_number as the id so we can order it - $packs[$packet_number] = $buffer->getBuffer(); - } else { - // Number of packets in this set (byte) - $buffer->readInt8(); - - // The current packet number (byte) - $packet_number = $buffer->readInt8(); - - // Check to see if this is compressed - // @todo: Check to make sure these decompress correctly, new changes may affect this loop. - if ($packet_id & 0x80000000) { - // Check to see if we have Bzip2 installed - if (!function_exists('bzdecompress')) { - // @codeCoverageIgnoreStart - throw new Exception( - 'Bzip2 is not installed. See http://www.php.net/manual/en/book.bzip2.php for more info.', - 0 - ); - // @codeCoverageIgnoreEnd - } - - // Get the length of the packet (long) - $packet_length = $buffer->readInt32Signed(); - - // Checksum for the decompressed packet (long), burn it - doesnt work in split responses - $buffer->readInt32Signed(); - - // Try to decompress - $result = bzdecompress($buffer->getBuffer()); - - // Now verify the length - if (strlen($result) != $packet_length) { - // @codeCoverageIgnoreStart - throw new Exception( - "Checksum for compressed packet failed! Length expected: {$packet_length}, length - returned: " . strlen($result) - ); - // @codeCoverageIgnoreEnd - } - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $result = substr($result, 4); - } - } else { - // Get the packet length (short), burn it - $buffer->readInt16Signed(); - - // We need to burn the extra header (\xFF\xFF\xFF\xFF) on first loop - if ($i == 0) { - $buffer->read(4); - } - - // Grab the rest of the buffer as a result - $result = $buffer->getBuffer(); - } - - // Add this packet to the list - $packs[$packet_number] = $result; - } - - unset($buffer); - } - - // Free some memory - unset($packets, $packet); - - // Sort the packets by packet number - ksort($packs); - - // Now combine the packs into one and return - return implode("", $packs); - } - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - * @throws \GameQ\Exception\Protocol - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('protocol', $buffer->readInt8()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_dir', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('steamappid', $buffer->readInt16()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('num_bots', $buffer->readInt8()); - $result->add('dedicated', $buffer->read()); - $result->add('os', $buffer->read()); - $result->add('password', $buffer->readInt8()); - $result->add('secure', $buffer->readInt8()); - - // Special result for The Ship only (appid=2400) - if ($result->get('steamappid') == 2400) { - $result->add('game_mode', $buffer->readInt8()); - $result->add('witness_count', $buffer->readInt8()); - $result->add('witness_time', $buffer->readInt8()); - } - - $result->add('version', $buffer->readString()); - - // Because of php 5.4... - $edfCheck = $buffer->lookAhead(1); - - // Extra data flag - if (!empty($edfCheck)) { - $edf = $buffer->readInt8(); - - if ($edf & 0x80) { - $result->add('port', $buffer->readInt16Signed()); - } - - if ($edf & 0x10) { - $result->add('steam_id', $buffer->readInt64()); - } - - if ($edf & 0x40) { - $result->add('sourcetv_port', $buffer->readInt16Signed()); - $result->add('sourcetv_name', $buffer->readString()); - } - - if ($edf & 0x20) { - $result->add('keywords', $buffer->readString()); - } - - if ($edf & 0x01) { - $result->add('game_id', $buffer->readInt64()); - } - - unset($edf); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the server details from goldsource response - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processDetailsGoldSource(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('address', $buffer->readString()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_dir', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('num_players', $buffer->readInt8()); - $result->add('max_players', $buffer->readInt8()); - $result->add('version', $buffer->readInt8()); - $result->add('dedicated', $buffer->read()); - $result->add('os', $buffer->read()); - $result->add('password', $buffer->readInt8()); - - // Mod section - $result->add('ismod', $buffer->readInt8()); - - // We only run these if ismod is 1 (true) - if ($result->get('ismod') == 1) { - $result->add('mod_urlinfo', $buffer->readString()); - $result->add('mod_urldl', $buffer->readString()); - $buffer->skip(); - $result->add('mod_version', $buffer->readInt32Signed()); - $result->add('mod_size', $buffer->readInt32Signed()); - $result->add('mod_type', $buffer->readInt8()); - $result->add('mod_cldll', $buffer->readInt8()); - } - - $result->add('secure', $buffer->readInt8()); - $result->add('num_bots', $buffer->readInt8()); - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Pull out the number of players - $num_players = $buffer->readInt8(); - - // Player count - $result->add('num_players', $num_players); - - // No players so no need to look any further - if ($num_players == 0) { - return $result->fetch(); - } - - // Players list - while ($buffer->getLength()) { - $result->addPlayer('id', $buffer->readInt8()); - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('score', $buffer->readInt32Signed()); - $result->addPlayer('time', $buffer->readFloat32()); - } - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Count the number of rules - $num_rules = $buffer->readInt16Signed(); - - // Add the count of the number of rules this server has - $result->add('num_rules', $num_rules); - - // Rules - while ($buffer->getLength()) { - $result->add($buffer->readString(), $buffer->readString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Spaceengineers.php b/gameq/src/GameQ/Protocols/Spaceengineers.php deleted file mode 100644 index ddf8567..0000000 --- a/gameq/src/GameQ/Protocols/Spaceengineers.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Space Engineers Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Spaceengineers extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'spaceengineers'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Space Engineers"; -} diff --git a/gameq/src/GameQ/Protocols/Squad.php b/gameq/src/GameQ/Protocols/Squad.php deleted file mode 100644 index 3c02188..0000000 --- a/gameq/src/GameQ/Protocols/Squad.php +++ /dev/null @@ -1,53 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Squad - * - * Port reference: http://forums.joinsquad.com/topic/9559-query-ports/ - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Squad extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'squad'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Squad"; - - /** - * query_port = client_port + 19378 - * 27165 = 7787 + 19378 - * - * @type int - */ - protected $port_diff = 19378; -} diff --git a/gameq/src/GameQ/Protocols/Starmade.php b/gameq/src/GameQ/Protocols/Starmade.php deleted file mode 100644 index 09a033f..0000000 --- a/gameq/src/GameQ/Protocols/Starmade.php +++ /dev/null @@ -1,226 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * StarMade Protocol Class - * - * StarMade server query protocol class - * - * Credit to Robin Promesberger for providing Java based querying as a roadmap - * - * @author Austin Bischoff - */ -class Starmade extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x00\x00\x00\x09\x2a\xff\xff\x01\x6f\x00\x00\x00\x00", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'starmade'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'starmade'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "StarMade"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = null; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'maxplayers' => 'max_players', - 'numplayers' => 'num_players', - 'password' => 'password', - ], - ]; - - /** - * Process the response for the StarMade server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Implode the packets, not sure if there is any split logic for multiple packets - $buffer = new Buffer(implode('', $this->packets_response), Buffer::NUMBER_TYPE_BIGENDIAN); - - // Get the passed length in the data side of the packet - $buffer->readInt32Signed(); - - // Read off the timestamp (in milliseconds) - $buffer->readInt64(); - - // Burn the check id == 42 - $buffer->readInt8(); - - // Read packetId, unused - $buffer->readInt16Signed(); - - // Read commandId, unused - $buffer->readInt8Signed(); - - // Read type, unused - $buffer->readInt8Signed(); - - $parsed = $this->parseServerParameters($buffer); - - // Set the result to a new result instance - $result = new Result(); - - // Best guess info version is the type of response to expect. As of this commit the version is "2". - $result->add('info_version', $parsed[0]); - $result->add('version', $parsed[1]); - $result->add('hostname', $parsed[2]); - $result->add('game_descr', $parsed[3]); - $result->add('start_time', $parsed[4]); - $result->add('num_players', $parsed[5]); - $result->add('max_players', $parsed[6]); - $result->add('dedicated', 1); // All servers are dedicated as far as I can tell - $result->add('password', 0); // Unsure if you can password servers, cant read that value - //$result->add('map', 'Unknown'); - - unset($parsed); - - return $result->fetch(); - } - - /** - * Parse the server response parameters - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * - * @param \GameQ\Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function parseServerParameters(Buffer &$buffer) - { - - // Init the parsed data array - $parsed = []; - - // Read the number of parameters to parse - $parameterSize = $buffer->readInt32Signed(); - - // Iterate over the parameter size - for ($i = 0; $i < $parameterSize; $i++) { - // Read the type of return this is - $dataType = $buffer->readInt8Signed(); - - switch ($dataType) { - // 32-bit int - case 1: - $parsed[$i] = $buffer->readInt32Signed(); - break; - - // 64-bit int - case 2: - $parsed[$i] = $buffer->readInt64(); - break; - - // Float - case 3: - $parsed[$i] = $buffer->readFloat32(); - break; - - // String - case 4: - // The first 2 bytes are the string length - $strLength = $buffer->readInt16Signed(); - - // Read the above length from the buffer - $parsed[$i] = $buffer->read($strLength); - - unset($strLength); - break; - - // Boolean - case 5: - $parsed[$i] = (bool)$buffer->readInt8Signed(); - break; - - // 8-bit int - case 6: - $parsed[$i] = $buffer->readInt8Signed(); - break; - - // 16-bit int - case 7: - $parsed[$i] = $buffer->readInt16Signed(); - break; - - // Array - case 8: - // Not implemented - throw new Exception("StarMade array parsing is not implemented!"); - } - } - - return $parsed; - } -} diff --git a/gameq/src/GameQ/Protocols/Teamspeak2.php b/gameq/src/GameQ/Protocols/Teamspeak2.php deleted file mode 100644 index df0d59a..0000000 --- a/gameq/src/GameQ/Protocols/Teamspeak2.php +++ /dev/null @@ -1,290 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * Teamspeak 2 Protocol Class - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Teamspeak2 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "sel %d\x0asi\x0a", - self::PACKET_CHANNELS => "sel %d\x0acl\x0a", - self::PACKET_PLAYERS => "sel %d\x0apl\x0a", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teamspeak2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teamspeak2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teamspeak 2"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "teamspeak://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'hostname' => 'server_name', - 'password' => 'server_password', - 'numplayers' => 'server_currentusers', - 'maxplayers' => 'server_maxusers', - ], - // Player - 'player' => [ - 'id' => 'p_id', - 'team' => 'c_id', - 'name' => 'nick', - ], - // Team - 'team' => [ - 'id' => 'id', - 'name' => 'name', - ], - ]; - - /** - * Before we send off the queries we need to update the packets - * - * @param \GameQ\Server $server - * - * @throws \GameQ\Exception\Protocol - */ - public function beforeSend(Server $server) - { - - // Check to make sure we have a query_port because it is required - if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - ) { - throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); - } - - // Let's loop the packets and set the proper pieces - foreach ($this->packets as $packet_type => $packet) { - // Update with the client port for the server - $this->packets[$packet_type] = sprintf($packet, $server->portClient()); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Make a new buffer out of all of the packets - $buffer = new Buffer(implode('', $this->packets_response)); - - // Check the header [TS] - if (($header = trim($buffer->readString("\n"))) !== '[TS]') { - throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected '[TS]'."); - } - - // Split this buffer as the data blocks are bound by "OK" and drop any empty values - $sections = array_filter(explode("OK", $buffer->getBuffer()), function ($value) { - - $value = trim($value); - - return !empty($value); - }); - - // Trim up the values to remove extra whitespace - $sections = array_map('trim', $sections); - - // Set the result to a new result instance - $result = new Result(); - - // Now we need to iterate over the sections and off load the processing - foreach ($sections as $section) { - // Grab a snip of the data so we can figure out what it is - $check = substr($section, 0, 7); - - // Offload to the proper method - if ($check == 'server_') { - // Server settings and info - $this->processDetails($section, $result); - } elseif ($check == "id\tcode") { - // Channel info - $this->processChannels($section, $result); - } elseif ($check == "p_id\tc_") { - // Player info - $this->processPlayers($section, $result); - } - } - - unset($buffer, $sections, $section, $check); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - - /** - * Handles processing the details data into a usable format - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processDetails($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // Always dedicated - $result->add('dedicated', 1); - - // Let's loop until we run out of data - while ($buffer->getLength()) { - // Grab the row, which is an item - $row = trim($buffer->readString("\n")); - - // Split out the information - list($key, $value) = explode('=', $row, 2); - - // Add this to the result - $result->add($key, utf8_encode($value)); - } - - unset($data, $buffer, $row, $key, $value); - } - - /** - * Process the channel listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processChannels($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // The first line holds the column names, data returned is in column/row format - $columns = explode("\t", trim($buffer->readString("\n")), 9); - - // Loop through the rows until we run out of information - while ($buffer->getLength()) { - // Grab the row, which is a tabbed list of items - $row = trim($buffer->readString("\n")); - - // Explode and merge the data with the columns, then parse - $data = array_combine($columns, explode("\t", $row, 9)); - - foreach ($data as $key => $value) { - // Now add the data to the result - $result->addTeam($key, utf8_encode($value)); - } - } - - unset($data, $buffer, $row, $columns, $key, $value); - } - - /** - * Process the user listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processPlayers($data, Result &$result) - { - - // Create a buffer - $buffer = new Buffer($data); - - // The first line holds the column names, data returned is in column/row format - $columns = explode("\t", trim($buffer->readString("\n")), 16); - - // Loop through the rows until we run out of information - while ($buffer->getLength()) { - // Grab the row, which is a tabbed list of items - $row = trim($buffer->readString("\n")); - - // Explode and merge the data with the columns, then parse - $data = array_combine($columns, explode("\t", $row, 16)); - - foreach ($data as $key => $value) { - // Now add the data to the result - $result->addPlayer($key, utf8_encode($value)); - } - } - - unset($data, $buffer, $row, $columns, $key, $value); - } -} diff --git a/gameq/src/GameQ/Protocols/Teamspeak3.php b/gameq/src/GameQ/Protocols/Teamspeak3.php deleted file mode 100644 index c66f6a4..0000000 --- a/gameq/src/GameQ/Protocols/Teamspeak3.php +++ /dev/null @@ -1,328 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Server; -use GameQ\Exception\Protocol as Exception; - -/** - * Teamspeak 3 Protocol Class - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Teamspeak3 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "use port=%d\x0Aserverinfo\x0A", - self::PACKET_PLAYERS => "use port=%d\x0Aclientlist\x0A", - self::PACKET_CHANNELS => "use port=%d\x0Achannellist -topic\x0A", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teamspeak3'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teamspeak3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teamspeak 3"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "ts3server://%s?port=%d"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'hostname' => 'virtualserver_name', - 'password' => 'virtualserver_flag_password', - 'numplayers' => 'numplayers', - 'maxplayers' => 'virtualserver_maxclients', - ], - // Player - 'player' => [ - 'id' => 'clid', - 'team' => 'cid', - 'name' => 'client_nickname', - ], - // Team - 'team' => [ - 'id' => 'cid', - 'name' => 'channel_name', - ], - ]; - - /** - * Before we send off the queries we need to update the packets - * - * @param \GameQ\Server $server - * - * @throws \GameQ\Exception\Protocol - */ - public function beforeSend(Server $server) - { - - // Check to make sure we have a query_port because it is required - if (!isset($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - || empty($this->options[Server::SERVER_OPTIONS_QUERY_PORT]) - ) { - throw new Exception(__METHOD__ . " Missing required setting '" . Server::SERVER_OPTIONS_QUERY_PORT . "'."); - } - - // Let's loop the packets and set the proper pieces - foreach ($this->packets as $packet_type => $packet) { - // Update with the client port for the server - $this->packets[$packet_type] = sprintf($packet, $server->portClient()); - } - } - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Make a new buffer out of all of the packets - $buffer = new Buffer(implode('', $this->packets_response)); - - // Check the header TS3 - if (($header = trim($buffer->readString("\n"))) !== 'TS3') { - throw new Exception(__METHOD__ . " Expected header '{$header}' does not match expected 'TS3'."); - } - - // Convert all the escaped characters - $raw = str_replace( - [ - '\\\\', // Translate escaped \ - '\\/', // Translate escaped / - ], - [ - '\\', - '/', - ], - $buffer->getBuffer() - ); - - // Explode the sections and filter to remove empty, junk ones - $sections = array_filter(explode("\n", $raw), function ($value) { - - $value = trim($value); - - // Not empty string or a message response for "error id=\d" - return !empty($value) && substr($value, 0, 5) !== 'error'; - }); - - // Trim up the values to remove extra whitespace - $sections = array_map('trim', $sections); - - // Set the result to a new result instance - $result = new Result(); - - // Iterate over the sections and offload the parsing - foreach ($sections as $section) { - // Grab a snip of the data so we can figure out what it is - $check = substr(trim($section), 0, 4); - - // Use the first part of the response to figure out where we need to go - if ($check == 'virt') { - // Server info - $this->processDetails($section, $result); - } elseif ($check == 'cid=') { - // Channels - $this->processChannels($section, $result); - } elseif ($check == 'clid') { - // Clients (players) - $this->processPlayers($section, $result); - } - } - - unset($buffer, $sections, $section, $check); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Process the properties of the data. - * - * Takes data in "key1=value1 key2=value2 ..." and processes it into a usable format - * - * @param $data - * - * @return array - */ - protected function processProperties($data) - { - - // Will hold the properties we are sending back - $properties = []; - - // All of these are split on space - $items = explode(' ', $data); - - // Iterate over the items - foreach ($items as $item) { - // Explode and make sure we always have 2 items in the array - list($key, $value) = array_pad(explode('=', $item, 2), 2, ''); - - // Convert spaces and other character changes - $properties[$key] = utf8_encode(str_replace( - [ - '\\s', // Translate spaces - ], - [ - ' ', - ], - $value - )); - } - - return $properties; - } - - /** - * Handles processing the details data into a usable format - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processDetails($data, Result &$result) - { - - // Offload the parsing for these values - $properties = $this->processProperties($data); - - // Always dedicated - $result->add('dedicated', 1); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->add($key, $value); - } - - // We need to manually figure out the number of players - $result->add( - 'numplayers', - ($properties['virtualserver_clientsonline'] - $properties['virtualserver_queryclientsonline']) - ); - - unset($data, $properties, $key, $value); - } - - /** - * Process the channel listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processChannels($data, Result &$result) - { - - // We need to split the data at the pipe - $channels = explode('|', $data); - - // Iterate over the channels - foreach ($channels as $channel) { - // Offload the parsing for these values - $properties = $this->processProperties($channel); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->addTeam($key, $value); - } - } - - unset($data, $channel, $channels, $properties, $key, $value); - } - - /** - * Process the user listing - * - * @param string $data - * @param \GameQ\Result $result - */ - protected function processPlayers($data, Result &$result) - { - - // We need to split the data at the pipe - $players = explode('|', $data); - - // Iterate over the channels - foreach ($players as $player) { - // Offload the parsing for these values - $properties = $this->processProperties($player); - - // Iterate over the properties - foreach ($properties as $key => $value) { - $result->addPlayer($key, $value); - } - } - - unset($data, $player, $players, $properties, $key, $value); - } -} diff --git a/gameq/src/GameQ/Protocols/Teeworlds.php b/gameq/src/GameQ/Protocols/Teeworlds.php deleted file mode 100644 index 1bdaa47..0000000 --- a/gameq/src/GameQ/Protocols/Teeworlds.php +++ /dev/null @@ -1,181 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Teeworlds Protocol class - * - * Only supports versions > 0.5 - * - * @author Austin Bischoff - * @author Marcel Bößendörfer - */ -class Teeworlds extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x69\x65\x33\x05", - // 0.5 Packet (not compatible, maybe some wants to implement "Teeworldsold") - //self::PACKET_STATUS => "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFFgief", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35" => "processAll", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'teeworlds'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'teeworlds'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Teeworlds Server"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'map', - 'maxplayers' => 'num_players_total', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - // Holds the results - $results = []; - - // Iterate over the packets - foreach ($this->packets_response as $response) { - // Make a buffer - $buffer = new Buffer($response); - - // Grab the header - $header = $buffer->readString(); - - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [$buffer]) - ); - } - - unset($buffer); - - return $results; - } - - /** - * Handle processing all of the data returned - * - * @param Buffer $buffer - * - * @return array - */ - protected function processAll(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - $result->add('version', $buffer->readString()); - $result->add('hostname', $buffer->readString()); - $result->add('map', $buffer->readString()); - $result->add('game_descr', $buffer->readString()); - $result->add('flags', $buffer->readString()); // not sure about that - $result->add('num_players', $buffer->readString()); - $result->add('maxplayers', $buffer->readString()); - $result->add('num_players_total', $buffer->readString()); - $result->add('maxplayers_total', $buffer->readString()); - - // Players - while ($buffer->getLength()) { - $result->addPlayer('name', $buffer->readString()); - $result->addPlayer('clan', $buffer->readString()); - $result->addPlayer('flag', $buffer->readString()); - $result->addPlayer('score', $buffer->readString()); - $result->addPlayer('team', $buffer->readString()); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Terraria.php b/gameq/src/GameQ/Protocols/Terraria.php deleted file mode 100644 index d9455ef..0000000 --- a/gameq/src/GameQ/Protocols/Terraria.php +++ /dev/null @@ -1,59 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Terraria - * - * @package GameQ\Protocols - * - * @author Austin Bischoff - */ -class Terraria extends Tshock -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'terraria'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Terraria"; - - /** - * query_port = client_port + 101 - * 7878 = 7777 + 101 - * - * @type int - */ - protected $port_diff = 101; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "steam://connect/%s:%d/"; -} diff --git a/gameq/src/GameQ/Protocols/Tf2.php b/gameq/src/GameQ/Protocols/Tf2.php deleted file mode 100644 index e08411b..0000000 --- a/gameq/src/GameQ/Protocols/Tf2.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Tf2 - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Tf2 extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'tf2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Team Fortress 2"; -} diff --git a/gameq/src/GameQ/Protocols/Theforrest.php b/gameq/src/GameQ/Protocols/Theforrest.php deleted file mode 100644 index 975c3f6..0000000 --- a/gameq/src/GameQ/Protocols/Theforrest.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Class Theforrest - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Theforrest extends Source -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'theforrest'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "The Forrest"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/gameq/src/GameQ/Protocols/Tibia.php b/gameq/src/GameQ/Protocols/Tibia.php deleted file mode 100644 index 8702bfa..0000000 --- a/gameq/src/GameQ/Protocols/Tibia.php +++ /dev/null @@ -1,142 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Tibia Protocol Class - * - * Tibia server query protocol class - * - * Credit to Ahmad Fatoum for providing Perl based querying as a roadmap - * - * @author Yive - * @author Austin Bischoff - */ -class Tibia extends Protocol -{ - - /** - * Array of packets we want to query. - * - * @type array - */ - protected $packets = [ - self::PACKET_STATUS => "\x06\x00\xFF\xFF\x69\x6E\x66\x6F", - ]; - - /** - * The transport mode for this protocol is TCP - * - * @type string - */ - protected $transport = self::TRANSPORT_TCP; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'tibia'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'tibia'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Tibia"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "otserv://%s/%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'server', - 'hostname' => 'servername', - 'motd' => 'motd', - 'maxplayers' => 'players_max', - 'numplayers' => 'players_online', - 'map' => 'map_name', - ], - ]; - - /** - * Process the response for the Tibia server - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - // Merge the response packets - $xmlString = implode('', $this->packets_response); - - // Check to make sure this is will decode into a valid XML Document - if (($xmlDoc = @simplexml_load_string($xmlString)) === false) { - throw new Exception(__METHOD__ . " Unable to load XML string."); - } - - // Set the result to a new result instance - $result = new Result(); - - // All servers are dedicated as far as I can tell - $result->add('dedicated', 1); - - // Iterate over the info - foreach (['serverinfo', 'owner', 'map', 'npcs', 'monsters', 'players'] as $property) { - foreach ($xmlDoc->{$property}->attributes() as $key => $value) { - if (!in_array($property, ['serverinfo'])) { - $key = $property . '_' . $key; - } - - // Add the result - $result->add($key, (string)$value); - } - } - - $result->add("motd", (string)$xmlDoc->motd); - - unset($xmlDoc, $xmlDoc); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Tshock.php b/gameq/src/GameQ/Protocols/Tshock.php deleted file mode 100644 index 551a09e..0000000 --- a/gameq/src/GameQ/Protocols/Tshock.php +++ /dev/null @@ -1,157 +0,0 @@ -. - */ -namespace GameQ\Protocols; - -use GameQ\Exception\Protocol as Exception; -use GameQ\Result; - -/** - * Tshock Protocol Class - * - * Result from this call should be a header + JSON response - * - * References: - * - https://tshock.atlassian.net/wiki/display/TSHOCKPLUGINS/REST+API+Endpoints#RESTAPIEndpoints-/status - * - http://tshock.co/xf/index.php?threads/rest-tshock-server-status-image.430/ - * - * Special thanks to intradox and Ruok2bu for game & protocol references - * - * @author Austin Bischoff - */ -class Tshock extends Http -{ - /** - * Packets to send - * - * @var array - */ - protected $packets = [ - self::PACKET_STATUS => "GET /v2/server/status?players=true&rules=true HTTP/1.0\r\nAccept: */*\r\n\r\n", - ]; - - /** - * The protocol being used - * - * @var string - */ - protected $protocol = 'tshock'; - - /** - * String name of this protocol class - * - * @var string - */ - protected $name = 'tshock'; - - /** - * Longer string name of this protocol class - * - * @var string - */ - protected $name_long = "Tshock"; - - /** - * Normalize some items - * - * @var array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'hostname' => 'hostname', - 'mapname' => 'world', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'nickname', - 'team' => 'team', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws Exception - */ - public function processResponse() - { - if (empty($this->packets_response)) { - return []; - } - - // Implode and rip out the JSON - preg_match('/\{(.*)\}/ms', implode('', $this->packets_response), $matches); - - // Return should be JSON, let's validate - if (!isset($matches[0]) || ($json = json_decode($matches[0])) === null) { - throw new Exception("JSON response from Tshock protocol is invalid."); - } - - // Check the status response - if ($json->status != 200) { - throw new Exception("JSON status from Tshock protocol response was '{$json->status}', expected '200'."); - } - - $result = new Result(); - - // Server is always dedicated - $result->add('dedicated', 1); - - // Add server items - $result->add('hostname', $json->name); - $result->add('game_port', $json->port); - $result->add('serverversion', $json->serverversion); - $result->add('world', $json->world); - $result->add('uptime', $json->uptime); - $result->add('password', (int)$json->serverpassword); - $result->add('numplayers', $json->playercount); - $result->add('maxplayers', $json->maxplayers); - - // Parse players - foreach ($json->players as $player) { - $result->addPlayer('nickname', $player->nickname); - $result->addPlayer('username', $player->username); - $result->addPlayer('group', $player->group); - $result->addPlayer('active', (int)$player->active); - $result->addPlayer('state', $player->state); - $result->addPlayer('team', $player->team); - } - - // Make rules into simple array - $rules = []; - - // Parse rules - foreach ($json->rules as $rule => $value) { - // Add rule but convert boolean into int (0|1) - $rules[$rule] = (is_bool($value)) ? (int)$value : $value; - } - - // Add rules - $result->add('rules', $rules); - - unset($rules, $rule, $player, $value); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Unreal2.php b/gameq/src/GameQ/Protocols/Unreal2.php deleted file mode 100644 index 0ef0675..0000000 --- a/gameq/src/GameQ/Protocols/Unreal2.php +++ /dev/null @@ -1,246 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Buffer; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Unreal 2 Protocol class - * - * @author Austin Bischoff - */ -class Unreal2 extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\x79\x00\x00\x00\x00", - self::PACKET_RULES => "\x79\x00\x00\x00\x01", - self::PACKET_PLAYERS => "\x79\x00\x00\x00\x02", - ]; - - /** - * Use the response flag to figure out what method to run - * - * @type array - */ - protected $responses = [ - "\x80\x00\x00\x00\x00" => "processDetails", // 0 - "\x80\x00\x00\x00\x01" => "processRules", // 1 - "\x80\x00\x00\x00\x02" => "processPlayers", // 2 - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'unreal2'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'unreal2'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal 2"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'ServerMode', - 'gametype' => 'gametype', - 'hostname' => 'servername', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'score', - ], - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // Will hold the packets after sorting - $packets = []; - - // We need to pre-sort these for split packets so we can do extra work where needed - foreach ($this->packets_response as $response) { - $buffer = new Buffer($response); - - // Pull out the header - $header = $buffer->read(5); - - // Add the packet to the proper section, we will combine later - $packets[$header][] = $buffer->getBuffer(); - } - - unset($buffer); - - $results = []; - - // Now let's iterate and process - foreach ($packets as $header => $packetGroup) { - // Figure out which packet response this is - if (!array_key_exists($header, $this->responses)) { - throw new Exception(__METHOD__ . " response type '" . bin2hex($header) . "' is not valid"); - } - - // Now we need to call the proper method - $results = array_merge( - $results, - call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]) - ); - } - - unset($packets); - - return $results; - } - - /* - * Internal methods - */ - - /** - * Handles processing the details data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - * @throws \GameQ\Exception\Protocol - */ - protected function processDetails(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - $result->add('serverid', $buffer->readInt32()); // 0 - $result->add('serverip', $buffer->readPascalString(1)); // empty - $result->add('gameport', $buffer->readInt32()); - $result->add('queryport', $buffer->readInt32()); // 0 - $result->add('servername', utf8_encode($buffer->readPascalString(1))); - $result->add('mapname', utf8_encode($buffer->readPascalString(1))); - $result->add('gametype', $buffer->readPascalString(1)); - $result->add('numplayers', $buffer->readInt32()); - $result->add('maxplayers', $buffer->readInt32()); - $result->add('ping', $buffer->readInt32()); // 0 - - unset($buffer); - - return $result->fetch(); - } - - /** - * Handles processing the player data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processPlayers(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Parse players - while ($buffer->getLength()) { - // Player id - if (($id = $buffer->readInt32()) !== 0) { - // Add the results - $result->addPlayer('id', $id); - $result->addPlayer('name', utf8_encode($buffer->readPascalString(1))); - $result->addPlayer('ping', $buffer->readInt32()); - $result->addPlayer('score', $buffer->readInt32()); - - // Skip the next 4, unsure what they are for - $buffer->skip(4); - } - } - - unset($buffer, $id); - - return $result->fetch(); - } - - /** - * Handles processing the rules data into a usable format - * - * @param \GameQ\Buffer $buffer - * - * @return mixed - */ - protected function processRules(Buffer $buffer) - { - - // Set the result to a new result instance - $result = new Result(); - - // Named values - $inc = -1; - while ($buffer->getLength()) { - // Grab the key - $key = $buffer->readPascalString(1); - - // Make sure mutators don't overwrite each other - if ($key === 'Mutator') { - $key .= ++$inc; - } - - $result->add(strtolower($key), utf8_encode($buffer->readPascalString(1))); - } - - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Unturned.php b/gameq/src/GameQ/Protocols/Unturned.php deleted file mode 100644 index 4829b37..0000000 --- a/gameq/src/GameQ/Protocols/Unturned.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unturned Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Unturned extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'unturned'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unturned"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; -} diff --git a/gameq/src/GameQ/Protocols/Ut.php b/gameq/src/GameQ/Protocols/Ut.php deleted file mode 100644 index 75722ce..0000000 --- a/gameq/src/GameQ/Protocols/Ut.php +++ /dev/null @@ -1,73 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament Protocol Class - * - * @author Austin Bischoff - */ -class Ut extends Gamespy -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament"; - - /** - * query_port = client_port + 1 - * - * @type int - */ - protected $port_diff = 1; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - // target => source - 'dedicated' => 'dedicated', - 'gametype' => 'gametype', - 'hostname' => 'hostname', - 'mapname' => 'mapname', - 'maxplayers' => 'maxplayers', - 'numplayers' => 'numplayers', - 'password' => 'password', - ], - // Individual - 'player' => [ - 'name' => 'name', - 'score' => 'frags', - ], - ]; -} diff --git a/gameq/src/GameQ/Protocols/Ut2004.php b/gameq/src/GameQ/Protocols/Ut2004.php deleted file mode 100644 index 953089f..0000000 --- a/gameq/src/GameQ/Protocols/Ut2004.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament 2004 Protocol Class - * - * @author Austin Bischoff - */ -class Ut2004 extends Unreal2 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut2004'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament 2004"; -} diff --git a/gameq/src/GameQ/Protocols/Ut3.php b/gameq/src/GameQ/Protocols/Ut3.php deleted file mode 100644 index b55cc34..0000000 --- a/gameq/src/GameQ/Protocols/Ut3.php +++ /dev/null @@ -1,133 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Unreal Tournament 3 Protocol Class - * - * Note: The response from UT3 appears to not be consistent. Many times packets are incomplete or there are extra - * "echoes" in the responses. This may cause issues like odd characters showing up in the keys for the player and team - * array responses. Not sure much can be done about it. - * - * @author Austin Bischoff - */ -class Ut3 extends Gamespy3 -{ - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ut3'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Unreal Tournament 3"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'bIsDedicated', - 'hostname' => 'hostname', - 'numplayers' => 'numplayers', - ], - ]; - - /** - * Overload the response process so we can make some changes - * - * @return array - */ - public function processResponse() - { - - // Grab the result from the parent - /** @type array $result */ - $result = parent::processResponse(); - - // Move some stuff around - $this->renameResult($result, 'OwningPlayerName', 'hostname'); - $this->renameResult($result, 'p1073741825', 'mapname'); - $this->renameResult($result, 'p1073741826', 'gametype'); - $this->renameResult($result, 'p1073741827', 'servername'); - $this->renameResult($result, 'p1073741828', 'custom_mutators'); - $this->renameResult($result, 'gamemode', 'open'); - $this->renameResult($result, 's32779', 'gamemode'); - $this->renameResult($result, 's0', 'bot_skill'); - $this->renameResult($result, 's6', 'pure_server'); - $this->renameResult($result, 's7', 'password'); - $this->renameResult($result, 's8', 'vs_bots'); - $this->renameResult($result, 's10', 'force_respawn'); - $this->renameResult($result, 'p268435704', 'frag_limit'); - $this->renameResult($result, 'p268435705', 'time_limit'); - $this->renameResult($result, 'p268435703', 'numbots'); - $this->renameResult($result, 'p268435717', 'stock_mutators'); - - // Put custom mutators into an array - if (isset($result['custom_mutators'])) { - $result['custom_mutators'] = explode("\x1c", $result['custom_mutators']); - } - - // Delete some unknown stuff - $this->deleteResult($result, ['s1', 's9', 's11', 's12', 's13', 's14']); - - // Return the result - return $result; - } - - /** - * Dirty hack to rename result entries into something more useful - * - * @param array $result - * @param string $old - * @param string $new - */ - protected function renameResult(array &$result, $old, $new) - { - - // Check to see if the old item is there - if (isset($result[$old])) { - $result[$new] = $result[$old]; - unset($result[$old]); - } - } - - /** - * Dirty hack to delete result items - * - * @param array $result - * @param array $array - */ - protected function deleteResult(array &$result, array $array) - { - - foreach ($array as $key) { - unset($result[$key]); - } - } -} diff --git a/gameq/src/GameQ/Protocols/Ventrilo.php b/gameq/src/GameQ/Protocols/Ventrilo.php deleted file mode 100644 index 8a1e0e8..0000000 --- a/gameq/src/GameQ/Protocols/Ventrilo.php +++ /dev/null @@ -1,877 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Protocol; -use GameQ\Result; -use GameQ\Exception\Protocol as Exception; - -/** - * Ventrilo Protocol Class - * - * Note that a password is not required for versions >= 3.0.3 - * - * All values are utf8 encoded upon processing - * - * This code ported from GameQ v1/v2. Credit to original author(s) as I just updated it to - * work within this new system. - * - * @author Austin Bischoff - */ -class Ventrilo extends Protocol -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_ALL => - "V\xc8\xf4\xf9`\xa2\x1e\xa5M\xfb\x03\xccQN\xa1\x10\x95\xaf\xb2g\x17g\x812\xfbW\xfd\x8e\xd2\x22r\x034z\xbb\x98", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'ventrilo'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'ventrilo'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Ventrilo"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "ventrilo://%s:%d/"; - - /** - * Normalize settings for this protocol - * - * @type array - */ - protected $normalize = [ - // General - 'general' => [ - 'dedicated' => 'dedicated', - 'password' => 'auth', - 'hostname' => 'name', - 'numplayers' => 'clientcount', - 'maxplayers' => 'maxclients', - ], - // Player - 'player' => [ - 'team' => 'cid', - 'name' => 'name', - ], - // Team - 'team' => [ - 'id' => 'cid', - 'name' => 'name', - ], - ]; - - /** - * Encryption table for the header - * - * @type array - */ - private $head_encrypt_table = [ - 0x80, - 0xe5, - 0x0e, - 0x38, - 0xba, - 0x63, - 0x4c, - 0x99, - 0x88, - 0x63, - 0x4c, - 0xd6, - 0x54, - 0xb8, - 0x65, - 0x7e, - 0xbf, - 0x8a, - 0xf0, - 0x17, - 0x8a, - 0xaa, - 0x4d, - 0x0f, - 0xb7, - 0x23, - 0x27, - 0xf6, - 0xeb, - 0x12, - 0xf8, - 0xea, - 0x17, - 0xb7, - 0xcf, - 0x52, - 0x57, - 0xcb, - 0x51, - 0xcf, - 0x1b, - 0x14, - 0xfd, - 0x6f, - 0x84, - 0x38, - 0xb5, - 0x24, - 0x11, - 0xcf, - 0x7a, - 0x75, - 0x7a, - 0xbb, - 0x78, - 0x74, - 0xdc, - 0xbc, - 0x42, - 0xf0, - 0x17, - 0x3f, - 0x5e, - 0xeb, - 0x74, - 0x77, - 0x04, - 0x4e, - 0x8c, - 0xaf, - 0x23, - 0xdc, - 0x65, - 0xdf, - 0xa5, - 0x65, - 0xdd, - 0x7d, - 0xf4, - 0x3c, - 0x4c, - 0x95, - 0xbd, - 0xeb, - 0x65, - 0x1c, - 0xf4, - 0x24, - 0x5d, - 0x82, - 0x18, - 0xfb, - 0x50, - 0x86, - 0xb8, - 0x53, - 0xe0, - 0x4e, - 0x36, - 0x96, - 0x1f, - 0xb7, - 0xcb, - 0xaa, - 0xaf, - 0xea, - 0xcb, - 0x20, - 0x27, - 0x30, - 0x2a, - 0xae, - 0xb9, - 0x07, - 0x40, - 0xdf, - 0x12, - 0x75, - 0xc9, - 0x09, - 0x82, - 0x9c, - 0x30, - 0x80, - 0x5d, - 0x8f, - 0x0d, - 0x09, - 0xa1, - 0x64, - 0xec, - 0x91, - 0xd8, - 0x8a, - 0x50, - 0x1f, - 0x40, - 0x5d, - 0xf7, - 0x08, - 0x2a, - 0xf8, - 0x60, - 0x62, - 0xa0, - 0x4a, - 0x8b, - 0xba, - 0x4a, - 0x6d, - 0x00, - 0x0a, - 0x93, - 0x32, - 0x12, - 0xe5, - 0x07, - 0x01, - 0x65, - 0xf5, - 0xff, - 0xe0, - 0xae, - 0xa7, - 0x81, - 0xd1, - 0xba, - 0x25, - 0x62, - 0x61, - 0xb2, - 0x85, - 0xad, - 0x7e, - 0x9d, - 0x3f, - 0x49, - 0x89, - 0x26, - 0xe5, - 0xd5, - 0xac, - 0x9f, - 0x0e, - 0xd7, - 0x6e, - 0x47, - 0x94, - 0x16, - 0x84, - 0xc8, - 0xff, - 0x44, - 0xea, - 0x04, - 0x40, - 0xe0, - 0x33, - 0x11, - 0xa3, - 0x5b, - 0x1e, - 0x82, - 0xff, - 0x7a, - 0x69, - 0xe9, - 0x2f, - 0xfb, - 0xea, - 0x9a, - 0xc6, - 0x7b, - 0xdb, - 0xb1, - 0xff, - 0x97, - 0x76, - 0x56, - 0xf3, - 0x52, - 0xc2, - 0x3f, - 0x0f, - 0xb6, - 0xac, - 0x77, - 0xc4, - 0xbf, - 0x59, - 0x5e, - 0x80, - 0x74, - 0xbb, - 0xf2, - 0xde, - 0x57, - 0x62, - 0x4c, - 0x1a, - 0xff, - 0x95, - 0x6d, - 0xc7, - 0x04, - 0xa2, - 0x3b, - 0xc4, - 0x1b, - 0x72, - 0xc7, - 0x6c, - 0x82, - 0x60, - 0xd1, - 0x0d, - ]; - - /** - * Encryption table for the data - * - * @type array - */ - private $data_encrypt_table = [ - 0x82, - 0x8b, - 0x7f, - 0x68, - 0x90, - 0xe0, - 0x44, - 0x09, - 0x19, - 0x3b, - 0x8e, - 0x5f, - 0xc2, - 0x82, - 0x38, - 0x23, - 0x6d, - 0xdb, - 0x62, - 0x49, - 0x52, - 0x6e, - 0x21, - 0xdf, - 0x51, - 0x6c, - 0x76, - 0x37, - 0x86, - 0x50, - 0x7d, - 0x48, - 0x1f, - 0x65, - 0xe7, - 0x52, - 0x6a, - 0x88, - 0xaa, - 0xc1, - 0x32, - 0x2f, - 0xf7, - 0x54, - 0x4c, - 0xaa, - 0x6d, - 0x7e, - 0x6d, - 0xa9, - 0x8c, - 0x0d, - 0x3f, - 0xff, - 0x6c, - 0x09, - 0xb3, - 0xa5, - 0xaf, - 0xdf, - 0x98, - 0x02, - 0xb4, - 0xbe, - 0x6d, - 0x69, - 0x0d, - 0x42, - 0x73, - 0xe4, - 0x34, - 0x50, - 0x07, - 0x30, - 0x79, - 0x41, - 0x2f, - 0x08, - 0x3f, - 0x42, - 0x73, - 0xa7, - 0x68, - 0xfa, - 0xee, - 0x88, - 0x0e, - 0x6e, - 0xa4, - 0x70, - 0x74, - 0x22, - 0x16, - 0xae, - 0x3c, - 0x81, - 0x14, - 0xa1, - 0xda, - 0x7f, - 0xd3, - 0x7c, - 0x48, - 0x7d, - 0x3f, - 0x46, - 0xfb, - 0x6d, - 0x92, - 0x25, - 0x17, - 0x36, - 0x26, - 0xdb, - 0xdf, - 0x5a, - 0x87, - 0x91, - 0x6f, - 0xd6, - 0xcd, - 0xd4, - 0xad, - 0x4a, - 0x29, - 0xdd, - 0x7d, - 0x59, - 0xbd, - 0x15, - 0x34, - 0x53, - 0xb1, - 0xd8, - 0x50, - 0x11, - 0x83, - 0x79, - 0x66, - 0x21, - 0x9e, - 0x87, - 0x5b, - 0x24, - 0x2f, - 0x4f, - 0xd7, - 0x73, - 0x34, - 0xa2, - 0xf7, - 0x09, - 0xd5, - 0xd9, - 0x42, - 0x9d, - 0xf8, - 0x15, - 0xdf, - 0x0e, - 0x10, - 0xcc, - 0x05, - 0x04, - 0x35, - 0x81, - 0xb2, - 0xd5, - 0x7a, - 0xd2, - 0xa0, - 0xa5, - 0x7b, - 0xb8, - 0x75, - 0xd2, - 0x35, - 0x0b, - 0x39, - 0x8f, - 0x1b, - 0x44, - 0x0e, - 0xce, - 0x66, - 0x87, - 0x1b, - 0x64, - 0xac, - 0xe1, - 0xca, - 0x67, - 0xb4, - 0xce, - 0x33, - 0xdb, - 0x89, - 0xfe, - 0xd8, - 0x8e, - 0xcd, - 0x58, - 0x92, - 0x41, - 0x50, - 0x40, - 0xcb, - 0x08, - 0xe1, - 0x15, - 0xee, - 0xf4, - 0x64, - 0xfe, - 0x1c, - 0xee, - 0x25, - 0xe7, - 0x21, - 0xe6, - 0x6c, - 0xc6, - 0xa6, - 0x2e, - 0x52, - 0x23, - 0xa7, - 0x20, - 0xd2, - 0xd7, - 0x28, - 0x07, - 0x23, - 0x14, - 0x24, - 0x3d, - 0x45, - 0xa5, - 0xc7, - 0x90, - 0xdb, - 0x77, - 0xdd, - 0xea, - 0x38, - 0x59, - 0x89, - 0x32, - 0xbc, - 0x00, - 0x3a, - 0x6d, - 0x61, - 0x4e, - 0xdb, - 0x29, - ]; - - /** - * Process the response - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - public function processResponse() - { - - // We need to decrypt the packets - $decrypted = $this->decryptPackets($this->packets_response); - - // Now let us convert special characters from hex to ascii all at once - $decrypted = preg_replace_callback( - '|%([0-9A-F]{2})|', - function ($matches) { - - // Pack this into ascii - return pack('H*', $matches[1]); - }, - $decrypted - ); - - // Explode into lines - $lines = explode("\n", $decrypted); - - // Set the result to a new result instance - $result = new Result(); - - // Always dedicated - $result->add('dedicated', 1); - - // Defaults - $channelFields = 5; - $playerFields = 7; - - // Iterate over the lines - foreach ($lines as $line) { - // Trim all the outlying space - $line = trim($line); - - // We dont have anything in this line - if (strlen($line) == 0) { - continue; - } - - /** - * Everything is in this format: ITEM: VALUE - * - * Example: - * ... - * MAXCLIENTS: 175 - * VOICECODEC: 3,Speex - * VOICEFORMAT: 31,32 KHz%2C 16 bit%2C 9 Qlty - * UPTIME: 9167971 - * PLATFORM: Linux-i386 - * VERSION: 3.0.6 - * ... - */ - - // Check to see if we have a colon, every line should - if (($colon_pos = strpos($line, ":")) !== false && $colon_pos > 0) { - // Split the line into key/value pairs - list($key, $value) = explode(':', $line, 2); - - // Lower the font of the key - $key = strtolower($key); - - // Trim the value of extra space - $value = trim($value); - - // Switch and offload items as needed - switch ($key) { - case 'client': - $this->processPlayer($value, $playerFields, $result); - break; - - case 'channel': - $this->processChannel($value, $channelFields, $result); - break; - - // Find the number of fields for the channels - case 'channelfields': - $channelFields = count(explode(',', $value)); - break; - - // Find the number of fields for the players - case 'clientfields': - $playerFields = count(explode(',', $value)); - break; - - // By default we just add they key as an item - default: - $result->add($key, utf8_encode($value)); - break; - } - } - } - - unset($decrypted, $line, $lines, $colon_pos, $key, $value); - - return $result->fetch(); - } - - /* - * Internal methods - */ - - /** - * Decrypt the incoming packets - * - * @codeCoverageIgnore - * - * @param array $packets - * - * @return string - * @throws \GameQ\Exception\Protocol - */ - protected function decryptPackets(array $packets = []) - { - - // This will be returned - $decrypted = []; - - foreach ($packets as $packet) { - # Header : - $header = substr($packet, 0, 20); - - $header_items = []; - - $header_key = unpack("n1", $header); - - $key = array_shift($header_key); - - $chars = unpack("C*", substr($header, 2)); - - $a1 = $key & 0xFF; - $a2 = $key >> 8; - - if ($a1 == 0) { - throw new Exception(__METHOD__ . ": Header key is invalid"); - } - - $table = $this->head_encrypt_table; - - $characterCount = count($chars); - - $key = 0; - for ($i = 1; $i <= $characterCount; $i++) { - $chars[$i] -= ($table[$a2] + (($i - 1) % 5)) & 0xFF; - $a2 = ($a2 + $a1) & 0xFF; - if (($i % 2) == 0) { - $short_array = unpack("n1", pack("C2", $chars[$i - 1], $chars[$i])); - $header_items[$key] = $short_array[1]; - ++$key; - } - } - - $header_items = array_combine([ - 'zero', - 'cmd', - 'id', - 'totlen', - 'len', - 'totpck', - 'pck', - 'datakey', - 'crc', - ], $header_items); - - // Check to make sure the number of packets match - if ($header_items['totpck'] != count($packets)) { - throw new Exception(__METHOD__ . ": Too few packets received"); - } - - # Data : - $table = $this->data_encrypt_table; - $a1 = $header_items['datakey'] & 0xFF; - $a2 = $header_items['datakey'] >> 8; - - if ($a1 == 0) { - throw new Exception(__METHOD__ . ": Data key is invalid"); - } - - $chars = unpack("C*", substr($packet, 20)); - $data = ""; - $characterCount = count($chars); - - for ($i = 1; $i <= $characterCount; $i++) { - $chars[$i] -= ($table[$a2] + (($i - 1) % 72)) & 0xFF; - $a2 = ($a2 + $a1) & 0xFF; - $data .= chr($chars[$i]); - } - //@todo: Check CRC ??? - $decrypted[$header_items['pck']] = $data; - } - - // Return the decrypted packets as one string - return implode('', $decrypted); - } - - /** - * Process the channel listing - * - * @param string $data - * @param int $fieldCount - * @param \GameQ\Result $result - */ - protected function processChannel($data, $fieldCount, Result &$result) - { - - // Split the items on the comma - $items = explode(",", $data, $fieldCount); - - // Iterate over the items for this channel - foreach ($items as $item) { - // Split the key=value pair - list($key, $value) = explode("=", $item, 2); - - $result->addTeam(strtolower($key), utf8_encode($value)); - } - } - - /** - * Process the user listing - * - * @param string $data - * @param int $fieldCount - * @param \GameQ\Result $result - */ - protected function processPlayer($data, $fieldCount, Result &$result) - { - - // Split the items on the comma - $items = explode(",", $data, $fieldCount); - - // Iterate over the items for this player - foreach ($items as $item) { - // Split the key=value pair - list($key, $value) = explode("=", $item, 2); - - $result->addPlayer(strtolower($key), utf8_encode($value)); - } - } -} diff --git a/gameq/src/GameQ/Protocols/Warsow.php b/gameq/src/GameQ/Protocols/Warsow.php deleted file mode 100644 index f1d629a..0000000 --- a/gameq/src/GameQ/Protocols/Warsow.php +++ /dev/null @@ -1,96 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -use GameQ\Buffer; -use GameQ\Result; - -/** - * Warsow Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Warsow extends Quake3 -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'warsow'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Warsow"; - - /** - * The client join link - * - * @type string - */ - protected $join_link = "warsow://%s:%d/"; - - /** - * Handle player info, different than quake3 base - * - * @param Buffer $buffer - * - * @return array - * @throws \GameQ\Exception\Protocol - */ - protected function processPlayers(Buffer $buffer) - { - // Set the result to a new result instance - $result = new Result(); - - // Loop until we are out of data - while ($buffer->getLength()) { - // Make a new buffer with this block - $playerInfo = new Buffer($buffer->readString("\x0A")); - - // Add player info - $result->addPlayer('frags', $playerInfo->readString("\x20")); - $result->addPlayer('ping', $playerInfo->readString("\x20")); - - // Skip first " - $playerInfo->skip(1); - - // Add player name, encoded - $result->addPlayer('name', utf8_encode(trim(($playerInfo->readString('"'))))); - - // Skip space - $playerInfo->skip(1); - - // Add team - $result->addPlayer('team', $playerInfo->read()); - - // Clear - unset($playerInfo); - } - - // Clear - unset($buffer); - - return $result->fetch(); - } -} diff --git a/gameq/src/GameQ/Protocols/Won.php b/gameq/src/GameQ/Protocols/Won.php deleted file mode 100644 index bef0984..0000000 --- a/gameq/src/GameQ/Protocols/Won.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * World Opponent Network (WON) class - * - * Pre-cursor to the A2S (source) protocol system - * - * @author Nikolay Ipanyuk - * @author Austin Bischoff - * - * @package GameQ\Protocols - */ -class Won extends Source -{ - - /** - * Array of packets we want to look up. - * Each key should correspond to a defined method in this or a parent class - * - * @type array - */ - protected $packets = [ - self::PACKET_DETAILS => "\xFF\xFF\xFF\xFFdetails\x00", - self::PACKET_PLAYERS => "\xFF\xFF\xFF\xFFplayers", - self::PACKET_RULES => "\xFF\xFF\xFF\xFFrules", - ]; - - /** - * The query protocol used to make the call - * - * @type string - */ - protected $protocol = 'won'; - - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'won'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "World Opponent Network"; -} diff --git a/gameq/src/GameQ/Protocols/Wurm.php b/gameq/src/GameQ/Protocols/Wurm.php deleted file mode 100644 index c593652..0000000 --- a/gameq/src/GameQ/Protocols/Wurm.php +++ /dev/null @@ -1,42 +0,0 @@ -. - */ - -namespace GameQ\Protocols; - -/** - * Wurm Unlimited Protocol Class - * - * @package GameQ\Protocols - * @author Austin Bischoff - */ -class Wurm extends Source -{ - /** - * String name of this protocol class - * - * @type string - */ - protected $name = 'wurm'; - - /** - * Longer string name of this protocol class - * - * @type string - */ - protected $name_long = "Wurm Unlimited"; -} diff --git a/gameq/src/GameQ/Query/Core.php b/gameq/src/GameQ/Query/Core.php deleted file mode 100644 index 5eb08ad..0000000 --- a/gameq/src/GameQ/Query/Core.php +++ /dev/null @@ -1,164 +0,0 @@ -. - */ - -namespace GameQ\Query; - -/** - * Core for the query mechanisms - * - * @author Austin Bischoff - */ -abstract class Core -{ - - /** - * The socket used by this resource - * - * @type null|resource - */ - public $socket = null; - - /** - * The transport type (udp, tcp, etc...) - * See http://php.net/manual/en/transports.php for the supported list - * - * @type string - */ - protected $transport = null; - - /** - * Connection IP address - * - * @type string - */ - protected $ip = null; - - /** - * Connection port - * - * @type int - */ - protected $port = null; - - /** - * The time in seconds to wait before timing out while connecting to the socket - * - * @type int - */ - protected $timeout = 3; // Seconds - - /** - * Socket is blocking? - * - * @type bool - */ - protected $blocking = false; - - /** - * Called when the class is cloned - */ - public function __clone() - { - - // Reset the properties for this class when cloned - $this->reset(); - } - - /** - * Set the connection information for the socket - * - * @param string $transport - * @param string $ip - * @param int $port - * @param int $timeout seconds - * @param bool $blocking - */ - public function set($transport, $ip, $port, $timeout = 3, $blocking = false) - { - - $this->transport = $transport; - - $this->ip = $ip; - - $this->port = $port; - - $this->timeout = $timeout; - - $this->blocking = $blocking; - } - - /** - * Reset this instance's properties - */ - public function reset() - { - - $this->transport = null; - - $this->ip = null; - - $this->port = null; - - $this->timeout = 3; - - $this->blocking = false; - } - - /** - * Create a new socket - * - * @return void - */ - abstract protected function create(); - - /** - * Get the socket - * - * @return mixed - */ - abstract public function get(); - - /** - * Write data to the socket - * - * @param string $data - * - * @return int The number of bytes written - */ - abstract public function write($data); - - /** - * Close the socket - * - * @return void - */ - abstract public function close(); - - /** - * Read the responses from the socket(s) - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param array $sockets - * @param int $timeout - * @param int $stream_timeout - * - * @return array - */ - abstract public function getResponses(array $sockets, $timeout, $stream_timeout); -} diff --git a/gameq/src/GameQ/Query/Native.php b/gameq/src/GameQ/Query/Native.php deleted file mode 100644 index b078c9c..0000000 --- a/gameq/src/GameQ/Query/Native.php +++ /dev/null @@ -1,221 +0,0 @@ -. - */ - -namespace GameQ\Query; - -use GameQ\Exception\Query as Exception; - -/** - * Native way of querying servers - * - * @author Austin Bischoff - */ -class Native extends Core -{ - /** - * Get the current socket or create one and return - * - * @return resource|null - * @throws \GameQ\Exception\Query - */ - public function get() - { - - // No socket for this server, make one - if (is_null($this->socket)) { - $this->create(); - } - - return $this->socket; - } - - /** - * Write data to the socket - * - * @param string $data - * - * @return int The number of bytes written - * @throws \GameQ\Exception\Query - */ - public function write($data) - { - - try { - // No socket for this server, make one - if (is_null($this->socket)) { - $this->create(); - } - - // Send the packet - return fwrite($this->socket, $data); - } catch (\Exception $e) { - throw new Exception($e->getMessage(), $e->getCode(), $e); - } - } - - /** - * Close the current socket - */ - public function close() - { - - if ($this->socket) { - fclose($this->socket); - $this->socket = null; - } - } - - /** - * Create a new socket for this query - * - * @throws \GameQ\Exception\Query - */ - protected function create() - { - - // Create the remote address - $remote_addr = sprintf("%s://%s:%d", $this->transport, $this->ip, $this->port); - - // Create context - $context = stream_context_create([ - 'socket' => [ - 'bindto' => '0:0', // Bind to any available IP and OS decided port - ], - ]); - - // Define these first - $errno = null; - $errstr = null; - - // Create the socket - if (($this->socket = - @stream_socket_client($remote_addr, $errno, $errstr, $this->timeout, STREAM_CLIENT_CONNECT, $context)) - !== false - ) { - // Set the read timeout on the streams - stream_set_timeout($this->socket, $this->timeout); - - // Set blocking mode - stream_set_blocking($this->socket, $this->blocking); - } else { - // Reset socket - $this->socket = null; - - // Something bad happened, throw query exception - throw new Exception( - __METHOD__ . " - Error creating socket to server {$this->ip}:{$this->port}. Error: " . $errstr, - $errno - ); - } - } - - /** - * Pull the responses out of the stream - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) - * - * @param array $sockets - * @param int $timeout - * @param int $stream_timeout - * - * @return array Raw responses - */ - public function getResponses(array $sockets, $timeout, $stream_timeout) - { - - // Set the loop to active - $loop_active = true; - - // Will hold the responses read from the sockets - $responses = []; - - // To store the sockets - $sockets_tmp = []; - - // Loop and pull out all the actual sockets we need to listen on - foreach ($sockets as $socket_id => $socket_data) { - // Get the socket - /* @var $socket \GameQ\Query\Core */ - $socket = $socket_data['socket']; - - // Append the actual socket we are listening to - $sockets_tmp[$socket_id] = $socket->get(); - - unset($socket); - } - - // Init some variables - $read = $sockets_tmp; - $write = null; - $except = null; - - // Check to see if $read is empty, if so stream_select() will throw a warning - if (empty($read)) { - return $responses; - } - - // This is when it should stop - $time_stop = microtime(true) + $timeout; - - // Let's loop until we break something. - while ($loop_active && microtime(true) < $time_stop) { - // Check to make sure $read is not empty, if so we are done - if (empty($read)) { - break; - } - - // Now lets listen for some streams, but do not cross the streams! - $streams = stream_select($read, $write, $except, 0, $stream_timeout); - - // We had error or no streams left, kill the loop - if ($streams === false || ($streams <= 0)) { - break; - } - - // Loop the sockets that received data back - foreach ($read as $socket) { - /* @var $socket resource */ - - // See if we have a response - if (($response = fread($socket, 8192)) === false) { - continue; // No response yet so lets continue. - } - - // Check to see if the response is empty, if so we are done with this server - if (strlen($response) == 0) { - // Remove this server from any future read loops - unset($sockets_tmp[(int)$socket]); - continue; - } - - // Add the response we got back - $responses[(int)$socket][] = $response; - } - - // Because stream_select modifies read we need to reset it each time to the original array of sockets - $read = $sockets_tmp; - } - - // Free up some memory - unset($streams, $read, $write, $except, $sockets_tmp, $time_stop, $response); - - // Return all of the responses, may be empty if something went wrong - return $responses; - } -} diff --git a/gameq/src/GameQ/Result.php b/gameq/src/GameQ/Result.php deleted file mode 100644 index 1fe33d8..0000000 --- a/gameq/src/GameQ/Result.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace GameQ; - -/** - * Provide an interface for easy storage of a parsed server response - * - * @author Aidan Lister - * @author Tom Buskens - */ -class Result -{ - - /** - * Formatted server response - * - * @var array - */ - protected $result = []; - - /** - * Adds variable to results - * - * @param string $name Variable name - * @param string $value Variable value - */ - public function add($name, $value) - { - - $this->result[$name] = $value; - } - - /** - * Adds player variable to output - * - * @param string $name Variable name - * @param string $value Variable value - */ - public function addPlayer($name, $value) - { - - $this->addSub('players', $name, $value); - } - - /** - * Adds player variable to output - * - * @param string $name Variable name - * @param string $value Variable value - */ - public function addTeam($name, $value) - { - - $this->addSub('teams', $name, $value); - } - - /** - * Add a variable to a category - * - * @param $sub string The category - * @param $key string The variable name - * @param $value string The variable value - */ - public function addSub($sub, $key, $value) - { - - // Nothing of this type yet, set an empty array - if (!isset($this->result[$sub]) or !is_array($this->result[$sub])) { - $this->result[$sub] = []; - } - - // Find the first entry that doesn't have this variable - $found = false; - for ($i = 0; $i != count($this->result[$sub]); $i++) { - if (!isset($this->result[$sub][$i][$key])) { - $this->result[$sub][$i][$key] = $value; - $found = true; - break; - } - } - - // Not found, create a new entry - if (!$found) { - $this->result[$sub][][$key] = $value; - } - } - - /** - * Return all stored results - * - * @return array All results - */ - public function fetch() - { - - return $this->result; - } - - /** - * Return a single variable - * - * @param string $var The variable name - * - * @return mixed The variable value - */ - public function get($var) - { - - return isset($this->result[$var]) ? $this->result[$var] : null; - } -} diff --git a/gameq/src/GameQ/Server.php b/gameq/src/GameQ/Server.php deleted file mode 100644 index dff8f77..0000000 --- a/gameq/src/GameQ/Server.php +++ /dev/null @@ -1,380 +0,0 @@ -. - */ - -namespace GameQ; - -use GameQ\Exception\Server as Exception; - -/** - * Server class to represent each server entity - * - * @author Austin Bischoff - */ -class Server -{ - - /* - * Server array keys - */ - const SERVER_TYPE = 'type'; - - const SERVER_HOST = 'host'; - - const SERVER_ID = 'id'; - - const SERVER_OPTIONS = 'options'; - - /* - * Server options keys - */ - - /* - * Use this option when the query_port and client connect ports are different - */ - const SERVER_OPTIONS_QUERY_PORT = 'query_port'; - - /** - * The protocol class for this server - * - * @type \GameQ\Protocol - */ - protected $protocol = null; - - /** - * Id of this server - * - * @type string - */ - public $id = null; - - /** - * IP Address of this server - * - * @type string - */ - public $ip = null; - - /** - * The server's client port (connect port) - * - * @type int - */ - public $port_client = null; - - /** - * The server's query port - * - * @type int - */ - public $port_query = null; - - /** - * Holds other server specific options - * - * @type array - */ - protected $options = []; - - /** - * Holds the sockets already open for this server - * - * @type array - */ - protected $sockets = []; - - /** - * Construct the class with the passed options - * - * @param array $server_info - * - * @throws \GameQ\Exception\Server - */ - public function __construct(array $server_info = []) - { - - // Check for server type - if (!array_key_exists(self::SERVER_TYPE, $server_info) || empty($server_info[self::SERVER_TYPE])) { - throw new Exception("Missing server info key '" . self::SERVER_TYPE . "'!"); - } - - // Check for server host - if (!array_key_exists(self::SERVER_HOST, $server_info) || empty($server_info[self::SERVER_HOST])) { - throw new Exception("Missing server info key '" . self::SERVER_HOST . "'!"); - } - - // IP address and port check - $this->checkAndSetIpPort($server_info[self::SERVER_HOST]); - - // Check for server id - if (array_key_exists(self::SERVER_ID, $server_info) && !empty($server_info[self::SERVER_ID])) { - // Set the server id - $this->id = $server_info[self::SERVER_ID]; - } else { - // Make an id so each server has an id when returned - $this->id = sprintf('%s:%d', $this->ip, $this->port_client); - } - - // Check and set server options - if (array_key_exists(self::SERVER_OPTIONS, $server_info)) { - // Set the options - $this->options = $server_info[self::SERVER_OPTIONS]; - } - - try { - // Make the protocol class for this type - $class = new \ReflectionClass( - sprintf('GameQ\\Protocols\\%s', ucfirst(strtolower($server_info[self::SERVER_TYPE]))) - ); - - $this->protocol = $class->newInstanceArgs([$this->options]); - } catch (\ReflectionException $e) { - throw new Exception("Unable to locate Protocols class for '{$server_info[self::SERVER_TYPE]}'!"); - } - - // Check and set any server options - $this->checkAndSetServerOptions(); - - unset($server_info, $class); - } - - /** - * Check and set the ip address for this server - * - * @param $ip_address - * - * @throws \GameQ\Exception\Server - */ - protected function checkAndSetIpPort($ip_address) - { - - // Test for IPv6 - if (substr_count($ip_address, ':') > 1) { - // See if we have a port, input should be in the format [::1]:27015 or similar - if (strstr($ip_address, ']:')) { - // Explode to get port - $server_addr = explode(':', $ip_address); - - // Port is the last item in the array, remove it and save - $this->port_client = (int)array_pop($server_addr); - - // The rest is the address, recombine - $this->ip = implode(':', $server_addr); - - unset($server_addr); - } else { - // Just the IPv6 address, no port defined, fail - throw new Exception( - "The host address '{$ip_address}' is missing the port. All " - . "servers must have a port defined!" - ); - } - - // Now let's validate the IPv6 value sent, remove the square brackets ([]) first - if (!filter_var(trim($this->ip, '[]'), FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV6,])) { - throw new Exception("The IPv6 address '{$this->ip}' is invalid."); - } - } else { - // We have IPv4 with a port defined - if (strstr($ip_address, ':')) { - list($this->ip, $this->port_client) = explode(':', $ip_address); - - // Type case the port - $this->port_client = (int)$this->port_client; - } else { - // No port, fail - throw new Exception( - "The host address '{$ip_address}' is missing the port. All " - . "servers must have a port defined!" - ); - } - - // Validate the IPv4 value, if FALSE is not a valid IP, maybe a hostname. Try to resolve - if (!filter_var($this->ip, FILTER_VALIDATE_IP, ['flags' => FILTER_FLAG_IPV4,]) - && $this->ip === gethostbyname($this->ip) - ) { - // When gethostbyname() fails it returns the original string - // so if ip and the result from gethostbyname() are equal this failed. - throw new Exception("Unable to resolve the host '{$this->ip}' to an IP address."); - } - } - } - - /** - * Check and set any server specific options - */ - protected function checkAndSetServerOptions() - { - - // Specific query port defined - if (array_key_exists(self::SERVER_OPTIONS_QUERY_PORT, $this->options)) { - $this->port_query = (int)$this->options[self::SERVER_OPTIONS_QUERY_PORT]; - } else { - // Do math based on the protocol class - $this->port_query = $this->protocol->findQueryPort($this->port_client); - } - } - - /** - * Set an option for this server - * - * @param $key - * @param $value - * - * @return $this - */ - public function setOption($key, $value) - { - - $this->options[$key] = $value; - - return $this; // Make chainable - } - - /** - * Return set option value - * - * @param mixed $key - * - * @return mixed - */ - public function getOption($key) - { - - return (array_key_exists($key, $this->options)) ? $this->options[$key] : null; - } - - /** - * Get the ID for this server - * - * @return string - */ - public function id() - { - - return $this->id; - } - - /** - * Get the IP address for this server - * - * @return string - */ - public function ip() - { - - return $this->ip; - } - - /** - * Get the client port for this server - * - * @return int - */ - public function portClient() - { - - return $this->port_client; - } - - /** - * Get the query port for this server - * - * @return int - */ - public function portQuery() - { - - return $this->port_query; - } - - /** - * Return the protocol class for this server - * - * @return \GameQ\Protocol - */ - public function protocol() - { - - return $this->protocol; - } - - /** - * Get the join link for this server - * - * @return string - */ - public function getJoinLink() - { - - return sprintf($this->protocol->joinLink(), $this->ip, $this->portClient()); - } - - /* - * Socket holding - */ - - /** - * Add a socket for this server to be reused - * - * @codeCoverageIgnore - * - * @param \GameQ\Query\Core $socket - */ - public function socketAdd(Query\Core $socket) - { - - $this->sockets[] = $socket; - } - - /** - * Get a socket from the list to reuse, if any are available - * - * @codeCoverageIgnore - * - * @return \GameQ\Query\Core|null - */ - public function socketGet() - { - - $socket = null; - - if (count($this->sockets) > 0) { - $socket = array_pop($this->sockets); - } - - return $socket; - } - - /** - * Clear any sockets still listed and attempt to close them - * - * @codeCoverageIgnore - */ - public function socketCleanse() - { - - // Close all of the sockets available - foreach ($this->sockets as $socket) { - /* @var $socket \GameQ\Query\Core */ - $socket->close(); - } - - // Reset the sockets list - $this->sockets = []; - } -} diff --git a/gameq/stat.php b/gameq/stat.php deleted file mode 100644 index bbd13a0..0000000 --- a/gameq/stat.php +++ /dev/null @@ -1,157 +0,0 @@ - // echo "; -// echo $readjson
"; - //$data1 = json_decode("$readjson", true); -//echo "

//Print data1

" ; - //print_r($data1); -///echo "
"; - -$data = json_decode($readjson); -// class -$name = $data->{'name'}; -$map = $data->{'map'}; -$password = $data->{'password'}; -$game = $data->{'raw'}->{'game'}; -$secure = $data->{'raw'}->{'secure'}; -$numplayers = $data->{'raw'}->{'numplayers'}; -$numplayersText = "☠ $numplayers "; -$version = $data->{'raw'}->{'version'}; -$tags = $data->{'raw'}->{'tags'}; -$dedicated = $data->{'raw'}->{'rules'}->{'dedicated'}; -$island = $data->{'raw'}->{'rules'}->{'island'}; -$connect = $data->{'connect'}; -$ping = $data->{'ping'}; -$time = "$tags[38]$tags[39]:$tags[41]$tags[42]"; -$battleye = substr($tags,0,8); -$batlecheck = "ACTIF"; -$hive = substr($tags,18,8); -$players = $data->{'players'}; - - -//if(empty($players)) -// $players = "0"; -//if (empty($players)) { "0"; } -//$players = $data->{'array_filter($players)'}; - -?> - - - - - Dayz ToX Server: <?php echo"${name}"; ?> - - - - - - - - - - - - - - - - - - - - - -
- Server Name IP server Ping Time Player Info Joueurs Version Battleye
-
-
- - - - - - - - - - - -
Players Info Debug
Nameprint_r ";print_r($players); - -?> -
- - - - - diff --git a/gameq/tests/Buffer.php b/gameq/tests/Buffer.php deleted file mode 100644 index 8dd7ff9..0000000 --- a/gameq/tests/Buffer.php +++ /dev/null @@ -1,257 +0,0 @@ -. - */ - -namespace GameQ\Tests; - -/** - * Buffer test class - * - * @package GameQ\Tests - */ -class Buffer extends TestBase -{ - /** - * Build a mock Buffer - * - * @param string $data - * @param string $number_type - * - * @return \GameQ\Buffer - */ - protected function buildBuffer($data, $number_type = 'm') - { - - return new \GameQ\Buffer($data, $number_type); - } - - /** - * Data provider for all of the integer testing. Loads external files since the file format has to be in - * ascii format for the tests to work correctly - * - * @return array - */ - public function integerDataProvider() - { - - // Make the base path for the data to test since it has to be in ascii form - $basePath = sprintf('%s/Providers/Buffer', __DIR__); - - // Build the result array - $dataSet = [ - [ 'readInt8', 'm', sprintf('%s/8bitunsigned_1.txt', $basePath), 214 ], - [ 'readInt8', 'm', sprintf('%s/8bitunsigned_2.txt', $basePath), 14 ], - [ 'readInt8', 'le', sprintf('%s/8bitunsigned_1.txt', $basePath), 214 ], - [ 'readInt8', 'le', sprintf('%s/8bitunsigned_2.txt', $basePath), 14 ], - [ 'readInt8Signed', 'm', sprintf('%s/8bitsigned_1.txt', $basePath), 56 ], - [ 'readInt8Signed', 'm', sprintf('%s/8bitsigned_2.txt', $basePath), -47 ], - [ 'readInt8Signed', 'le', sprintf('%s/8bitsigned_1.txt', $basePath), 56 ], - [ 'readInt8Signed', 'le', sprintf('%s/8bitsigned_2.txt', $basePath), -47 ], - [ 'readInt16', 'm', sprintf('%s/16bitunsigned_1.txt', $basePath), 54844 ], - [ 'readInt16', 'm', sprintf('%s/16bitunsigned_2.txt', $basePath), 1474 ], - [ 'readInt16', 'le', sprintf('%s/16bitunsigned_1.txt', $basePath), 54844 ], - [ 'readInt16', 'le', sprintf('%s/16bitunsigned_2.txt', $basePath), 1474 ], - [ 'readInt16', 'be', sprintf('%s/16bitunsigned_be_1.txt', $basePath), 54844 ], - [ 'readInt16', 'be', sprintf('%s/16bitunsigned_be_2.txt', $basePath), 1474 ], - [ 'readInt16Signed', 'm', sprintf('%s/16bitsigned_1.txt', $basePath), 24574 ], - [ 'readInt16Signed', 'm', sprintf('%s/16bitsigned_2.txt', $basePath), -5478 ], - [ 'readInt16Signed', 'le', sprintf('%s/16bitsigned_1.txt', $basePath), 24574 ], - [ 'readInt16Signed', 'le', sprintf('%s/16bitsigned_2.txt', $basePath), -5478 ], - [ 'readInt16Signed', 'be', sprintf('%s/16bitsigned_be_1.txt', $basePath), 24574 ], - [ 'readInt16Signed', 'be', sprintf('%s/16bitsigned_be_2.txt', $basePath), -5478 ], - [ 'readInt32', 'm', sprintf('%s/32bitunsigned_1.txt', $basePath), 3248547147 ], - [ 'readInt32', 'm', sprintf('%s/32bitunsigned_2.txt', $basePath), 1247612474 ], - [ 'readInt32', 'le', sprintf('%s/32bitunsigned_1.txt', $basePath), 3248547147 ], - [ 'readInt32', 'le', sprintf('%s/32bitunsigned_2.txt', $basePath), 1247612474 ], - [ 'readInt32', 'be', sprintf('%s/32bitunsigned_be_1.txt', $basePath), 3248547147 ], - [ 'readInt32', 'be', sprintf('%s/32bitunsigned_be_2.txt', $basePath), 1247612474 ], - [ 'readInt32Signed', 'm', sprintf('%s/32bitsigned_1.txt', $basePath), 1247965816 ], - [ 'readInt32Signed', 'm', sprintf('%s/32bitsigned_2.txt', $basePath), -1547872147 ], - [ 'readInt32Signed', 'le', sprintf('%s/32bitsigned_1.txt', $basePath), 1247965816 ], - [ 'readInt32Signed', 'le', sprintf('%s/32bitsigned_2.txt', $basePath), -1547872147 ], - [ 'readInt32Signed', 'be', sprintf('%s/32bitsigned_be_1.txt', $basePath), 1247965816 ], - [ 'readInt32Signed', 'be', sprintf('%s/32bitsigned_be_2.txt', $basePath), -1547872147 ], - [ 'readFloat32', 'm', sprintf('%s/32float_1.txt', $basePath), 0.15474000573158264 ], - [ 'readFloat32', 'm', sprintf('%s/32float_2.txt', $basePath), -254.01409912109375 ], - [ 'readFloat32', 'le', sprintf('%s/32float_1.txt', $basePath), 0.15474000573158264 ], - [ 'readFloat32', 'le', sprintf('%s/32float_2.txt', $basePath), -254.01409912109375 ], - [ 'readFloat32', 'be', sprintf('%s/32float_be_1.txt', $basePath), 0.15474000573158264 ], - [ 'readFloat32', 'be', sprintf('%s/32float_be_2.txt', $basePath), -254.01409912109375 ], - ]; - - // We are on 64-bit os - if (PHP_INT_SIZE == 8) { - // Add 64-bit tests - $dataSet[] = [ 'readInt64', 'm', sprintf('%s/64bitunsigned_1.txt', $basePath), 90094348778156039 ]; - $dataSet[] = [ 'readInt64', 'm', sprintf('%s/64bitunsigned_2.txt', $basePath), 240 ]; - $dataSet[] = [ 'readInt64', 'le', sprintf('%s/64bitunsigned_1.txt', $basePath), 90094348778156039 ]; - $dataSet[] = [ 'readInt64', 'le', sprintf('%s/64bitunsigned_2.txt', $basePath), 240 ]; - $dataSet[] = [ 'readInt64', 'be', sprintf('%s/64bitunsigned_be_1.txt', $basePath), 90094348778156039 ]; - $dataSet[] = [ 'readInt64', 'be', sprintf('%s/64bitunsigned_be_2.txt', $basePath), 240 ]; - } - - return $dataSet; - } - - /** - * Test general methods for the Buffer class - */ - public function testGeneral() - { - - $data = "Some Kind of buffer"; - - $buffer = $this->buildBuffer($data); - - // Test buffer and string are equal - $this->assertEquals($data, $buffer->getData(), 'Test string and buffer are not the same'); - - // Test length is set correctly - $this->assertEquals(strlen($data), $buffer->getLength(), 'Test string and buffer length do not match'); - } - - /** - * Test various buffer reads - * - * @depends testGeneral - */ - public function testRead() - { - - $data = "Buffer of data"; - - $buffer = $this->buildBuffer($data); - - // Test look ahead default - $this->assertEquals(substr($data, 0, 1), $buffer->lookAhead()); - - // Test longer look ahead - $this->assertEquals(substr($data, 0, 4), $buffer->lookAhead(4)); - - // Test default is one character - $this->assertEquals(substr($data, 0, 1), $buffer->read()); - - // Test multiple character read - $this->assertEquals(substr($data, 1, 5), $buffer->read(5)); - - // Read last character out of the buffer - $this->assertEquals(substr($data, -1, 1), $buffer->readLast()); - - // Get the remainder of the buffer - $this->assertEquals(substr($data, 6, -1), $buffer->getBuffer()); - } - - /** - * Test for index positions - * - * @depends testRead - */ - public function testPosition() - { - - $data = "Some like My Strings..."; - - $buffer = $this->buildBuffer($data); - - // Test basic index position - $this->assertEquals(0, $buffer->getPosition()); - - // Jump in the index - $buffer->jumpto(8); - - // Make sure the index is correct returned - $this->assertEquals(8, $buffer->getPosition()); - - // Reset - $buffer->jumpto(0); - - // Test skip default - $buffer->skip(); - - $this->assertEquals(substr($data, 1), $buffer->getBuffer()); - - // Skip multiple - $buffer->skip(3); - - $this->assertEquals(substr($data, 4), $buffer->getBuffer()); - } - - /** - * Test for proper read exception - * - * @depends testRead - * - * @expectedException \Exception - * @expectedExceptionMessage Unable to read length=6 from buffer. Bad protocol format or return? - */ - public function testReadException() - { - - $buffer = $this->buildBuffer("12345"); - - // Try to read a longer length than the buffer has in it - $buffer->read(6); - } - - /** - * Test reading some strings - * - * @depends testRead - */ - public function testReadString() - { - - $data = "This is string 1\x00This is string 2\x00"; - - $buffer = $this->buildBuffer($data); - - // Read first - $this->assertEquals('This is string 1', $buffer->readString()); - - // Read again - $this->assertEquals('This is string 2', $buffer->readString()); - - // Reset the index - $buffer->jumpto(0); - - // Test the read using non-default, this should return the whole string - $this->assertEquals($data, $buffer->readString("\xFF")); - } - - /** - * Test number reads reads - * - * @depends testRead - * @dataProvider integerDataProvider - * - * @param $method - * @param $number_type - * @param $file - * @param $expected - */ - public function testNumberReads($method, $number_type, $file, $expected) - { - - // Make the buffer - $buffer = $this->buildBuffer(file_get_contents($file), $number_type); - - // Run the test - $this->assertEquals($expected, call_user_func_array([ $buffer, $method ], [ ])); - - unset($buffer); - } -} diff --git a/gameq/tests/Filters/Base.php b/gameq/tests/Filters/Base.php deleted file mode 100644 index 999d247..0000000 --- a/gameq/tests/Filters/Base.php +++ /dev/null @@ -1,104 +0,0 @@ -. - */ - -namespace GameQ\Tests\Filters; - -use GameQ\Tests\TestBase; - -/** - * Class for testing Filters Base - * - * @package GameQ\Tests\Filters - */ -class Base extends TestBase -{ - - /** - * Load up the provider data for the specific filter type - * - * @return array - */ - public function loadData() - { - - // Explode the class that called to avoid strict error - $class = explode('\\', get_called_class()); - - // Determine the folder to grab the provider files and results from - $providersLookup = sprintf('%s/Providers/%s/', __DIR__, array_pop($class)); - - // Init the return array - $providers = [ ]; - - // Grab all of the test files for this filter - $files = new \DirectoryIterator($providersLookup); - - // Iterate over the files in this path - foreach ($files as $fileinfo) { - // Skip if we can't read or is dotfile - if (!$fileinfo->isReadable() || !$fileinfo->isFile()) { - continue; - } - - // Split the filename - list($protocol, $index) = explode('_', $fileinfo->getFilename()); - - unset($index); - - // Get the data - if (($data = json_decode(file_get_contents($fileinfo->getRealPath()), true)) === null - && json_last_error() !== JSON_ERROR_NONE - ) { - // Skip - continue; - } - - // Add the provider - $providers[] = [ - $protocol, - $data['raw'], - $data['filtered'] - ]; - } - - // Clear some memory - unset($files, $fileinfo, $providersLookup); - - return $providers; - } - - /* - * Real Base tests here - */ - - /** - * Test options setting on construct - */ - public function testOptions() - { - - $options = [ - 'option1' => 'value1', - 'option2' => 'value2', - ]; - - $mock = $this->getMockForAbstractClass('\GameQ\Filters\Base', [ $options ]); - - $this->assertEquals($options, \PHPUnit\Framework\Assert::readAttribute($mock, 'options')); - } -} diff --git a/gameq/tests/Filters/Normalize.php b/gameq/tests/Filters/Normalize.php deleted file mode 100644 index ee884cd..0000000 --- a/gameq/tests/Filters/Normalize.php +++ /dev/null @@ -1,87 +0,0 @@ -. - */ - -namespace GameQ\Tests\Filters; - -/** - * Class for testing Normalize filter - * - * @package GameQ\Tests\Filters - */ -class Normalize extends Base -{ - - /** - * Test the filter for Normalize - * - * @dataProvider loadData - * - * @param $protocol - * @param $raw - * @param $filtered - */ - public function testFiltered($protocol, $raw, $filtered) - { - - // Pop the key from the raw response - $host = key($raw); - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => $host, - \GameQ\Server::SERVER_TYPE => $protocol, - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Create a mock filter - $filter = $this->getMockBuilder('\GameQ\Filters\Normalize') - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($filtered[$host], $filter->apply($raw[$host], $server)); - } - - /** - * Test for empty data pass to filter - */ - public function testEmpty() - { - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'css', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Create a mock filter - $filter = $this->getMockBuilder('\GameQ\Filters\Normalize') - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEmpty($filter->apply([], $server)); - } -} diff --git a/gameq/tests/Filters/Providers/Normalize/css_1.json b/gameq/tests/Filters/Providers/Normalize/css_1.json deleted file mode 100644 index c8e0d5d..0000000 --- a/gameq/tests/Filters/Providers/Normalize/css_1.json +++ /dev/null @@ -1 +0,0 @@ -{"raw":{"64.74.97.72:27017":{"protocol":17,"hostname":"[GFLClan.com]24\/7 ZOMBIE ESCAPE |Rank|NoBlock|FastDL|Chicago","map":"ze_random_v9","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":64,"max_players":64,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27017,"steam_id":90094317945771013,"keywords":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","game_id":240,"players":[{"id":0,"name":"Dream","score":0,"time":10867.557617188},{"id":0,"name":"CrystallizedSilver_Pleb","score":0,"time":10491.5234375},{"id":0,"name":"apple199644","score":0,"time":7855.0639648438},{"id":0,"name":"ANGRY SOCCER MOM","score":0,"time":6247.0698242188},{"id":0,"name":"Bossy","score":0,"time":5925.1157226562},{"id":0,"name":"Blue Ribbon","score":0,"time":5687.9028320312},{"id":0,"name":"Noriega","score":0,"time":5406.3828125},{"id":0,"name":"I LOVE MY PENIS","score":0,"time":5237.578125},{"id":0,"name":"down autism tourettes syndrome","score":0,"time":5232.1577148438},{"id":0,"name":"Big Cheese","score":0,"time":5043.2509765625},{"id":0,"name":"kaz","score":0,"time":5002.6684570312},{"id":0,"name":"[SCP] Virgil","score":0,"time":4821.17578125},{"id":0,"name":"Peaches the Disgruntled Mailman","score":-1,"time":4622.4829101562},{"id":0,"name":"MAX::PAIN","score":0,"time":4519.4067382812},{"id":0,"name":"Vigy Le Buns","score":0,"time":3683.5932617188},{"id":0,"name":"Jake, from State Farm","score":0,"time":2863.3615722656},{"id":0,"name":"Bassroyt","score":0,"time":2858.7358398438},{"id":0,"name":"nature born 12","score":0,"time":2857.3688964844},{"id":0,"name":"RA1NFIRE","score":0,"time":2804.4636230469},{"id":0,"name":"GFL's Human Resources Dept.","score":4,"time":2771.5388183594},{"id":0,"name":"xXLADIESMANXx","score":0,"time":2752.7136230469},{"id":0,"name":"Ice","score":0,"time":2671.4287109375},{"id":0,"name":"BaronAmbrosia","score":0,"time":2487.18359375},{"id":0,"name":"\u8ad6 jovem. \u604b\u6b21","score":0,"time":2314.0942382812},{"id":0,"name":"Oreo","score":0,"time":2239.8923339844},{"id":0,"name":"Mu Alpha Theta","score":0,"time":2224.9987792969},{"id":0,"name":"KBz | ClockTic","score":0,"time":2057.365234375},{"id":0,"name":"secnoc","score":0,"time":2026.4367675781},{"id":0,"name":"Joey Jay twitch.tv\/kaceytron","score":0,"time":1938.3646240234},{"id":0,"name":"GemsZ","score":0,"time":1938.1203613281},{"id":0,"name":"\u011e\u03a3\u0160 | Backstab","score":0,"time":1916.6658935547},{"id":0,"name":"I 8 PP","score":0,"time":1915.6157226562},{"id":0,"name":"\u1d3e\u1d3f\u1d3c\u1d34\u1d47\u1d35\u1d3e\u2668","score":0,"time":1890.4490966797},{"id":0,"name":"Big Lebowski","score":0,"time":1839.5908203125},{"id":0,"name":"Jayhowz","score":0,"time":1837.4183349609},{"id":0,"name":"konkution114","score":0,"time":1440.4700927734},{"id":0,"name":"dot","score":0,"time":1335.9624023438},{"id":0,"name":"rainmaker","score":0,"time":1288.1291503906},{"id":0,"name":"Lightning","score":-1,"time":1093.7681884766},{"id":0,"name":"burritoe","score":0,"time":967.53167724609},{"id":0,"name":"Ackhome","score":0,"time":938.69952392578},{"id":0,"name":"(\u0332\u0305\u03b6 \u25e3\u0332\u0305o\u0332\u0305\u25e2 (\u0332\u0305\u03b6","score":5,"time":867.86059570312},{"id":0,"name":"miggisworld","score":0,"time":864.10357666016},{"id":0,"name":"r\u00e4v","score":0,"time":738.83343505859},{"id":0,"name":"","score":0,"time":733.31182861328},{"id":0,"name":"Chucky BigBucks","score":0,"time":701.44464111328},{"id":0,"name":"muphin58","score":0,"time":694.20233154297},{"id":0,"name":"odb as u kan c","score":0,"time":693.70538330078},{"id":0,"name":"eZ Mode","score":0,"time":670.27862548828},{"id":0,"name":"Mobile Lawnmower","score":0,"time":586.36859130859},{"id":0,"name":"A$AP","score":0,"time":549.76513671875},{"id":0,"name":":)","score":1,"time":537.99011230469},{"id":0,"name":"QUE RICAS TETAS QUE ELA TENHE E","score":0,"time":515.41882324219},{"id":0,"name":"Primora","score":0,"time":440.26904296875},{"id":0,"name":"Reimu Hakurei","score":0,"time":429.22897338867},{"id":0,"name":"\u010e\u03a6\u1e85\u0418_Hi\u0141L","score":0,"time":340.4348449707},{"id":0,"name":"Horny Fish Sword","score":0,"time":241.94573974609},{"id":0,"name":"Nylocke!","score":0,"time":232.70875549316},{"id":0,"name":"N\u00c9oKar\u00a5\u00e5PPle","score":0,"time":221.02757263184},{"id":0,"name":"Wu-Tang Dynasty","score":0,"time":162.3059387207},{"id":0,"name":"Red Apophis","score":0,"time":147.11943054199},{"id":0,"name":"pLatinUm tw3nty 0n3s","score":0,"time":135.58245849609},{"id":0,"name":"Billy Ruben","score":0,"time":76.073677062988},{"id":0,"name":"","score":0,"time":4.4352440834045}],"num_rules":130,"ban_disconnected_ver":"1.04","bot_quota":"0","cd_announcer_version":"2.3","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"10","entwatch_version":"3.0.3","forlix_floodcheck_version":"1.71","gs_zombiereloaded_version":"3.1.1","hlxce_plugin_version":"1.6.19","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/stats.gflclan.com\/","infinite-jumping_version":"3.0","mce_version":"1.9.3","metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"0","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"5","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"9","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"16000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"0","mp_timelimit":"40","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","ne_version":"1.9.2","rtve_version":"1.9.2","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11.TOG_EDIT_g","scc_version":"2.0.0","sc_core_version":"1.0.1","sm_advertisements_version":"0.5.5","sm_afkm_version":"3.5.0","sm_allchat_version":"1.1.1","sm_countrytags_version":"1.2.0","sm_downloader_version":"1.4","sm_extendedcomm_version":"3.0.8b_togedit_c","sm_extend_version":"1.3","sm_grenplayer_noblock_version":"2.0","sm_irs_version":"2.0.8","sm_napalmlagfix_version":"1.0.2","sm_nextmap":"ze_shroomforest_v3","sm_selfmute_version":"1.0","sm_show_damage_version":"1.0.7","sm_spawntools7_version":"0.9","sm_spray_version":"5.8a TOGEDIT_nomenu","sm_stopsound_version":"1.0.0","sm_tracker_version":"1.6","sm_updateradar_version":"fix","sourcemod_version":"1.5.3","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"1","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"500","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"8","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tal_version":"1.5","tbc_version":"1.0","teamswitch_version":"1.3 togedit","tfc_version":"4.0","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tjs_version":"1.7","togadmintargeting_version":"1.0","togreload_version":"1.0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","zombiereloaded_revision":"733:d57da587271c+","zr_greneffect_version":"2.0","zr_repeatkill_version":"1.0.2","gq_joinlink":"steam:\/\/connect\/64.74.97.72:27017\/"}},"filtered":{"64.74.97.72:27017":{"protocol":17,"hostname":"[GFLClan.com]24\/7 ZOMBIE ESCAPE |Rank|NoBlock|FastDL|Chicago","map":"ze_random_v9","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":64,"max_players":64,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27017,"steam_id":90094317945771013,"keywords":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","game_id":240,"players":[{"id":0,"name":"Dream","score":0,"time":10867.557617188,"gq_name":"Dream","gq_score":0,"gq_time":10867.557617188},{"id":0,"name":"CrystallizedSilver_Pleb","score":0,"time":10491.5234375,"gq_name":"CrystallizedSilver_Pleb","gq_score":0,"gq_time":10491.5234375},{"id":0,"name":"apple199644","score":0,"time":7855.0639648438,"gq_name":"apple199644","gq_score":0,"gq_time":7855.0639648438},{"id":0,"name":"ANGRY SOCCER MOM","score":0,"time":6247.0698242188,"gq_name":"ANGRY SOCCER MOM","gq_score":0,"gq_time":6247.0698242188},{"id":0,"name":"Bossy","score":0,"time":5925.1157226562,"gq_name":"Bossy","gq_score":0,"gq_time":5925.1157226562},{"id":0,"name":"Blue Ribbon","score":0,"time":5687.9028320312,"gq_name":"Blue Ribbon","gq_score":0,"gq_time":5687.9028320312},{"id":0,"name":"Noriega","score":0,"time":5406.3828125,"gq_name":"Noriega","gq_score":0,"gq_time":5406.3828125},{"id":0,"name":"I LOVE MY PENIS","score":0,"time":5237.578125,"gq_name":"I LOVE MY PENIS","gq_score":0,"gq_time":5237.578125},{"id":0,"name":"down autism tourettes syndrome","score":0,"time":5232.1577148438,"gq_name":"down autism tourettes syndrome","gq_score":0,"gq_time":5232.1577148438},{"id":0,"name":"Big Cheese","score":0,"time":5043.2509765625,"gq_name":"Big Cheese","gq_score":0,"gq_time":5043.2509765625},{"id":0,"name":"kaz","score":0,"time":5002.6684570312,"gq_name":"kaz","gq_score":0,"gq_time":5002.6684570312},{"id":0,"name":"[SCP] Virgil","score":0,"time":4821.17578125,"gq_name":"[SCP] Virgil","gq_score":0,"gq_time":4821.17578125},{"id":0,"name":"Peaches the Disgruntled Mailman","score":-1,"time":4622.4829101562,"gq_name":"Peaches the Disgruntled Mailman","gq_score":-1,"gq_time":4622.4829101562},{"id":0,"name":"MAX::PAIN","score":0,"time":4519.4067382812,"gq_name":"MAX::PAIN","gq_score":0,"gq_time":4519.4067382812},{"id":0,"name":"Vigy Le Buns","score":0,"time":3683.5932617188,"gq_name":"Vigy Le Buns","gq_score":0,"gq_time":3683.5932617188},{"id":0,"name":"Jake, from State Farm","score":0,"time":2863.3615722656,"gq_name":"Jake, from State Farm","gq_score":0,"gq_time":2863.3615722656},{"id":0,"name":"Bassroyt","score":0,"time":2858.7358398438,"gq_name":"Bassroyt","gq_score":0,"gq_time":2858.7358398438},{"id":0,"name":"nature born 12","score":0,"time":2857.3688964844,"gq_name":"nature born 12","gq_score":0,"gq_time":2857.3688964844},{"id":0,"name":"RA1NFIRE","score":0,"time":2804.4636230469,"gq_name":"RA1NFIRE","gq_score":0,"gq_time":2804.4636230469},{"id":0,"name":"GFL's Human Resources Dept.","score":4,"time":2771.5388183594,"gq_name":"GFL's Human Resources Dept.","gq_score":4,"gq_time":2771.5388183594},{"id":0,"name":"xXLADIESMANXx","score":0,"time":2752.7136230469,"gq_name":"xXLADIESMANXx","gq_score":0,"gq_time":2752.7136230469},{"id":0,"name":"Ice","score":0,"time":2671.4287109375,"gq_name":"Ice","gq_score":0,"gq_time":2671.4287109375},{"id":0,"name":"BaronAmbrosia","score":0,"time":2487.18359375,"gq_name":"BaronAmbrosia","gq_score":0,"gq_time":2487.18359375},{"id":0,"name":"\u8ad6 jovem. \u604b\u6b21","score":0,"time":2314.0942382812,"gq_name":"\u8ad6 jovem. \u604b\u6b21","gq_score":0,"gq_time":2314.0942382812},{"id":0,"name":"Oreo","score":0,"time":2239.8923339844,"gq_name":"Oreo","gq_score":0,"gq_time":2239.8923339844},{"id":0,"name":"Mu Alpha Theta","score":0,"time":2224.9987792969,"gq_name":"Mu Alpha Theta","gq_score":0,"gq_time":2224.9987792969},{"id":0,"name":"KBz | ClockTic","score":0,"time":2057.365234375,"gq_name":"KBz | ClockTic","gq_score":0,"gq_time":2057.365234375},{"id":0,"name":"secnoc","score":0,"time":2026.4367675781,"gq_name":"secnoc","gq_score":0,"gq_time":2026.4367675781},{"id":0,"name":"Joey Jay twitch.tv\/kaceytron","score":0,"time":1938.3646240234,"gq_name":"Joey Jay twitch.tv\/kaceytron","gq_score":0,"gq_time":1938.3646240234},{"id":0,"name":"GemsZ","score":0,"time":1938.1203613281,"gq_name":"GemsZ","gq_score":0,"gq_time":1938.1203613281},{"id":0,"name":"\u011e\u03a3\u0160 | Backstab","score":0,"time":1916.6658935547,"gq_name":"\u011e\u03a3\u0160 | Backstab","gq_score":0,"gq_time":1916.6658935547},{"id":0,"name":"I 8 PP","score":0,"time":1915.6157226562,"gq_name":"I 8 PP","gq_score":0,"gq_time":1915.6157226562},{"id":0,"name":"\u1d3e\u1d3f\u1d3c\u1d34\u1d47\u1d35\u1d3e\u2668","score":0,"time":1890.4490966797,"gq_name":"\u1d3e\u1d3f\u1d3c\u1d34\u1d47\u1d35\u1d3e\u2668","gq_score":0,"gq_time":1890.4490966797},{"id":0,"name":"Big Lebowski","score":0,"time":1839.5908203125,"gq_name":"Big Lebowski","gq_score":0,"gq_time":1839.5908203125},{"id":0,"name":"Jayhowz","score":0,"time":1837.4183349609,"gq_name":"Jayhowz","gq_score":0,"gq_time":1837.4183349609},{"id":0,"name":"konkution114","score":0,"time":1440.4700927734,"gq_name":"konkution114","gq_score":0,"gq_time":1440.4700927734},{"id":0,"name":"dot","score":0,"time":1335.9624023438,"gq_name":"dot","gq_score":0,"gq_time":1335.9624023438},{"id":0,"name":"rainmaker","score":0,"time":1288.1291503906,"gq_name":"rainmaker","gq_score":0,"gq_time":1288.1291503906},{"id":0,"name":"Lightning","score":-1,"time":1093.7681884766,"gq_name":"Lightning","gq_score":-1,"gq_time":1093.7681884766},{"id":0,"name":"burritoe","score":0,"time":967.53167724609,"gq_name":"burritoe","gq_score":0,"gq_time":967.53167724609},{"id":0,"name":"Ackhome","score":0,"time":938.69952392578,"gq_name":"Ackhome","gq_score":0,"gq_time":938.69952392578},{"id":0,"name":"(\u0332\u0305\u03b6 \u25e3\u0332\u0305o\u0332\u0305\u25e2 (\u0332\u0305\u03b6","score":5,"time":867.86059570312,"gq_name":"(\u0332\u0305\u03b6 \u25e3\u0332\u0305o\u0332\u0305\u25e2 (\u0332\u0305\u03b6","gq_score":5,"gq_time":867.86059570312},{"id":0,"name":"miggisworld","score":0,"time":864.10357666016,"gq_name":"miggisworld","gq_score":0,"gq_time":864.10357666016},{"id":0,"name":"r\u00e4v","score":0,"time":738.83343505859,"gq_name":"r\u00e4v","gq_score":0,"gq_time":738.83343505859},{"id":0,"name":"","score":0,"time":733.31182861328,"gq_name":"","gq_score":0,"gq_time":733.31182861328},{"id":0,"name":"Chucky BigBucks","score":0,"time":701.44464111328,"gq_name":"Chucky BigBucks","gq_score":0,"gq_time":701.44464111328},{"id":0,"name":"muphin58","score":0,"time":694.20233154297,"gq_name":"muphin58","gq_score":0,"gq_time":694.20233154297},{"id":0,"name":"odb as u kan c","score":0,"time":693.70538330078,"gq_name":"odb as u kan c","gq_score":0,"gq_time":693.70538330078},{"id":0,"name":"eZ Mode","score":0,"time":670.27862548828,"gq_name":"eZ Mode","gq_score":0,"gq_time":670.27862548828},{"id":0,"name":"Mobile Lawnmower","score":0,"time":586.36859130859,"gq_name":"Mobile Lawnmower","gq_score":0,"gq_time":586.36859130859},{"id":0,"name":"A$AP","score":0,"time":549.76513671875,"gq_name":"A$AP","gq_score":0,"gq_time":549.76513671875},{"id":0,"name":":)","score":1,"time":537.99011230469,"gq_name":":)","gq_score":1,"gq_time":537.99011230469},{"id":0,"name":"QUE RICAS TETAS QUE ELA TENHE E","score":0,"time":515.41882324219,"gq_name":"QUE RICAS TETAS QUE ELA TENHE E","gq_score":0,"gq_time":515.41882324219},{"id":0,"name":"Primora","score":0,"time":440.26904296875,"gq_name":"Primora","gq_score":0,"gq_time":440.26904296875},{"id":0,"name":"Reimu Hakurei","score":0,"time":429.22897338867,"gq_name":"Reimu Hakurei","gq_score":0,"gq_time":429.22897338867},{"id":0,"name":"\u010e\u03a6\u1e85\u0418_Hi\u0141L","score":0,"time":340.4348449707,"gq_name":"\u010e\u03a6\u1e85\u0418_Hi\u0141L","gq_score":0,"gq_time":340.4348449707},{"id":0,"name":"Horny Fish Sword","score":0,"time":241.94573974609,"gq_name":"Horny Fish Sword","gq_score":0,"gq_time":241.94573974609},{"id":0,"name":"Nylocke!","score":0,"time":232.70875549316,"gq_name":"Nylocke!","gq_score":0,"gq_time":232.70875549316},{"id":0,"name":"N\u00c9oKar\u00a5\u00e5PPle","score":0,"time":221.02757263184,"gq_name":"N\u00c9oKar\u00a5\u00e5PPle","gq_score":0,"gq_time":221.02757263184},{"id":0,"name":"Wu-Tang Dynasty","score":0,"time":162.3059387207,"gq_name":"Wu-Tang Dynasty","gq_score":0,"gq_time":162.3059387207},{"id":0,"name":"Red Apophis","score":0,"time":147.11943054199,"gq_name":"Red Apophis","gq_score":0,"gq_time":147.11943054199},{"id":0,"name":"pLatinUm tw3nty 0n3s","score":0,"time":135.58245849609,"gq_name":"pLatinUm tw3nty 0n3s","gq_score":0,"gq_time":135.58245849609},{"id":0,"name":"Billy Ruben","score":0,"time":76.073677062988,"gq_name":"Billy Ruben","gq_score":0,"gq_time":76.073677062988},{"id":0,"name":"","score":0,"time":4.4352440834045,"gq_name":"","gq_score":0,"gq_time":4.4352440834045}],"num_rules":130,"ban_disconnected_ver":"1.04","bot_quota":"0","cd_announcer_version":"2.3","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"10","entwatch_version":"3.0.3","forlix_floodcheck_version":"1.71","gs_zombiereloaded_version":"3.1.1","hlxce_plugin_version":"1.6.19","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/stats.gflclan.com\/","infinite-jumping_version":"3.0","mce_version":"1.9.3","metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"0","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"5","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"9","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"16000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"0","mp_timelimit":"40","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","ne_version":"1.9.2","rtve_version":"1.9.2","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11.TOG_EDIT_g","scc_version":"2.0.0","sc_core_version":"1.0.1","sm_advertisements_version":"0.5.5","sm_afkm_version":"3.5.0","sm_allchat_version":"1.1.1","sm_countrytags_version":"1.2.0","sm_downloader_version":"1.4","sm_extendedcomm_version":"3.0.8b_togedit_c","sm_extend_version":"1.3","sm_grenplayer_noblock_version":"2.0","sm_irs_version":"2.0.8","sm_napalmlagfix_version":"1.0.2","sm_nextmap":"ze_shroomforest_v3","sm_selfmute_version":"1.0","sm_show_damage_version":"1.0.7","sm_spawntools7_version":"0.9","sm_spray_version":"5.8a TOGEDIT_nomenu","sm_stopsound_version":"1.0.0","sm_tracker_version":"1.6","sm_updateradar_version":"fix","sourcemod_version":"1.5.3","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"1","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"500","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"8","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"alltalk,awesome,bunnyhopping,escape,games,gfl,gl,increased_maxplayers,life,startmoney,ze,zm,zombie,zombie escape","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tal_version":"1.5","tbc_version":"1.0","teamswitch_version":"1.3 togedit","tfc_version":"4.0","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tjs_version":"1.7","togadmintargeting_version":"1.0","togreload_version":"1.0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","zombiereloaded_revision":"733:d57da587271c+","zr_greneffect_version":"2.0","zr_repeatkill_version":"1.0.2","gq_joinlink":"steam:\/\/connect\/64.74.97.72:27017\/","gq_dedicated":"d","gq_gametype":"Counter-Strike: Source","gq_hostname":"[GFLClan.com]24\/7 ZOMBIE ESCAPE |Rank|NoBlock|FastDL|Chicago","gq_mapname":"ze_random_v9","gq_maxplayers":64,"gq_mod":"cstrike","gq_numplayers":64,"gq_password":0,"teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Normalize/css_2.json b/gameq/tests/Filters/Providers/Normalize/css_2.json deleted file mode 100644 index 1264050..0000000 --- a/gameq/tests/Filters/Providers/Normalize/css_2.json +++ /dev/null @@ -1 +0,0 @@ -{"raw":{"204.11.234.116:27015":{"protocol":17,"hostname":"Multiplay :: Match Server","map":"aim_scoutzknivez","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":0,"max_players":10,"num_bots":0,"dedicated":"d","os":"w","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":90094348778156039,"sourcetv_port":27025,"sourcetv_name":"Multiplay :: Match Server TV","keywords":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","game_id":240,"num_rules":88,"bot_quota":"0","decalfrequency":"60","esl_active":"1","esl_allowwebserver":"1","esl_cashback":"1","esl_gasearch":"1","esl_version":"3.0.4","host_framerate":"0","metamod_version":"1.11.0-devV","mp_autocrosshair":"0","mp_autoteambalance":"0","mp_buytime":".25","mp_c4timer":"35","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcecamera":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"10","mp_friendlyfire":"1","mp_holiday_nogifts":"0","mp_hostagepenalty":"0","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"1.75","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"800","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"1","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxcmdrate":"66","sv_maxrate":"30000","sv_maxspeed":"320","sv_maxupdaterate":"66","sv_maxusrcmdprocessticks":"24","sv_mincmdrate":"66","sv_minrate":"15000","sv_minupdaterate":"66","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"1","sv_password":"0","sv_pausable":"1","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_use_queue":"1","tv_delay":"90","tv_enable":"1","tv_password":"0","tv_relaypassword":"0","zb_status":"1","zb_version":"4.72","gq_online":true,"gq_address":"204.11.234.116","gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_name":"Counter-Strike: Source","gq_transport":"udp","gq_joinlink":"steam:\/\/connect\/204.11.234.116:27015\/"}},"filtered":{"204.11.234.116:27015":{"protocol":17,"hostname":"Multiplay :: Match Server","map":"aim_scoutzknivez","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":0,"max_players":10,"num_bots":0,"dedicated":"d","os":"w","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":90094348778156039,"sourcetv_port":27025,"sourcetv_name":"Multiplay :: Match Server TV","keywords":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","game_id":240,"num_rules":88,"bot_quota":"0","decalfrequency":"60","esl_active":"1","esl_allowwebserver":"1","esl_cashback":"1","esl_gasearch":"1","esl_version":"3.0.4","host_framerate":"0","metamod_version":"1.11.0-devV","mp_autocrosshair":"0","mp_autoteambalance":"0","mp_buytime":".25","mp_c4timer":"35","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcecamera":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"10","mp_friendlyfire":"1","mp_holiday_nogifts":"0","mp_hostagepenalty":"0","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"1.75","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"800","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"1","sv_contact":"","sv_enableboost":"0","sv_enablebunnyhopping":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxcmdrate":"66","sv_maxrate":"30000","sv_maxspeed":"320","sv_maxupdaterate":"66","sv_maxusrcmdprocessticks":"24","sv_mincmdrate":"66","sv_minrate":"15000","sv_minupdaterate":"66","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"1","sv_password":"0","sv_pausable":"1","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"compspec,friendlyfire,nostats,sv_pure1,zb_warmode,zblock","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_use_queue":"1","tv_delay":"90","tv_enable":"1","tv_password":"0","tv_relaypassword":"0","zb_status":"1","zb_version":"4.72","gq_online":true,"gq_address":"204.11.234.116","gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_name":"Counter-Strike: Source","gq_transport":"udp","gq_joinlink":"steam:\/\/connect\/204.11.234.116:27015\/","gq_dedicated":"d","gq_gametype":"Counter-Strike: Source","gq_hostname":"Multiplay :: Match Server","gq_mapname":"aim_scoutzknivez","gq_maxplayers":10,"gq_mod":"cstrike","gq_numplayers":0,"gq_password":0,"players":[],"teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Normalize/mumble_1.json b/gameq/tests/Filters/Providers/Normalize/mumble_1.json deleted file mode 100644 index 909f927..0000000 --- a/gameq/tests/Filters/Providers/Normalize/mumble_1.json +++ /dev/null @@ -1 +0,0 @@ -{"raw":{"95.130.64.232:64738":{"dedicated":1,"id":1,"name":"Skyttegrav & SweClockers Mumble","x_connecturl":"mumble:\/\/mumble.skyttegrav.se\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_max_users":"250","x_gtmurmur_server_version":"1.2.8","x_gtmurmur_doclen":224093,"teams":[{"description":"Welcome! <\/b>\n

This server requires registration<\/span> in order to move from Root.Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.<\/b><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false},{"description":"","id":1,"name":"AFK","parent":0,"position":0,"temporary":false},{"description":"","id":8,"name":"Utl\u00e5nade Kanaler","parent":0,"position":100,"temporary":false},{"description":"Endast F\u00f6r Skyttegrav admins!<\/b>","id":9,"name":"Admins Corner (private)","parent":0,"position":200,"temporary":false},{"description":"","id":38,"name":"Admins","parent":9,"position":11,"temporary":false},{"description":"","id":43,"name":"Headadmins Corner","parent":9,"position":60,"temporary":false},{"description":"","id":44,"name":"Supervisors Corner - Polska Riksdagen","parent":9,"position":70,"temporary":false},{"description":"Spelf\u00f6reningen bakom Skyttegrav.se","id":150,"name":"United Gaming","parent":9,"position":0,"temporary":false},{"description":"","id":151,"name":"M\u00f6te","parent":150,"position":0,"temporary":false},{"description":"","id":152,"name":"Styrelsem\u00f6te","parent":150,"position":0,"temporary":false},{"description":"Endast F\u00f6r SweClockers.com admins!<\/b>","id":187,"name":"Sweclockers","parent":9,"position":0,"temporary":false},{"description":"","id":188,"name":"Allm\u00e4n Admin","parent":187,"position":0,"temporary":false},{"description":"","id":189,"name":"Privat Admin (Endast inbjudan)","parent":187,"position":0,"temporary":false},{"description":"","id":214,"name":"Allm\u00e4n Admin (Delad)","parent":9,"position":10,"temporary":false},{"description":"","id":183,"name":"SweClockers","parent":0,"position":10,"temporary":false},{"description":"H\u00e4r kommer v\u00e5ra stream och webtv att s\u00e4ndas! \n

\n

Bes\u00f6k www.swec.tv och avnjut s\u00e4ndningen, vill du deltaga s\u00e5 skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig l\u00f6senordet. Vi kommer att b\u00e5de casta och spela olika spel l\u00f6pande.<\/p>\n

\n

I kanalen g\u00e4ller strikt ljud och informationskontroll, akta er allts\u00e5 f\u00f6r att inte s\u00e4ga f\u00f6r mycket.<\/p>","id":358,"name":"SweC TV Studio (private)","parent":183,"position":100,"temporary":false},{"description":"Vill ni deltaga i SweC TV? \n

\n

S\u00e4tt er i detta rummet s\u00e5 kommer vi att dra in er i cast rummet vid tillf\u00e4lle, ni \u00e4r varmt v\u00e4lkomna att titta p\u00e5 www.swec.tv<\/a> medan ni v\u00e4ntar! <\/p>\n

\n

N\u00e4r ni kommer in i cast kanalen \u00e4r ni automatiskt satta till "mute", vi kommer att \u00e4ndra det n\u00e4r ni kommer in.<\/p>\n

\n

\n

","id":402,"name":"SweC TV lobby (wait for invite to cast room)","parent":183,"position":200,"temporary":false},{"description":"Hj\u00e4lp med Mumble? L\u00e4s h\u00e4r -> Mumble tr\u00e5d p\u00e5 SweClockers<\/a>","id":421,"name":"Spelkv\u00e4llar","parent":183,"position":300,"temporary":false},{"description":"H\u00e4r har ni nyttig information om spelkv\u00e4llarna! \n

SpelClockers<\/a> Spelkv\u00e4llar<\/p>\n

Sweclockers Steam chat grupp<\/a><\/p>\n

<\/p>","id":426,"name":"Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning","parent":421,"position":0,"temporary":false},{"description":"","id":427,"name":"Reserv #2","parent":421,"position":20,"temporary":false},{"description":"","id":429,"name":"Grupp 1","parent":427,"position":10,"temporary":false},{"description":"","id":430,"name":"Grupp 2","parent":427,"position":20,"temporary":false},{"description":"","id":449,"name":"Grupp 3","parent":427,"position":30,"temporary":false},{"description":"","id":450,"name":"Grupp 4","parent":427,"position":40,"temporary":false},{"description":"","id":453,"name":"Rematch och rekryt Lobby","parent":427,"position":0,"temporary":false},{"description":"","id":455,"name":"Grupp 5","parent":427,"position":50,"temporary":false},{"description":"","id":456,"name":"Grupp 6","parent":427,"position":60,"temporary":false},{"description":"","id":428,"name":"12h stream med SpelClockers - L\u00f6rdag 28 feb","parent":421,"position":10,"temporary":false},{"description":"","id":432,"name":"MechWarrior Online","parent":428,"position":10,"temporary":false},{"description":"","id":433,"name":"Grupp 2","parent":428,"position":20,"temporary":false},{"description":"","id":434,"name":"Grupp 3","parent":428,"position":30,"temporary":false},{"description":"","id":443,"name":"Grupp 4","parent":428,"position":40,"temporary":false},{"description":"","id":444,"name":"Grupp 5","parent":428,"position":50,"temporary":false},{"description":"","id":451,"name":"Samlingsal","parent":428,"position":0,"temporary":false},{"description":"","id":459,"name":"Grupp 6","parent":428,"position":60,"temporary":false},{"description":"","id":436,"name":"Reserv #3","parent":421,"position":30,"temporary":false},{"description":"","id":437,"name":"Grupp 1","parent":436,"position":10,"temporary":false},{"description":"","id":438,"name":"Grupp 2","parent":436,"position":20,"temporary":false},{"description":"","id":439,"name":"Grupp 3","parent":436,"position":30,"temporary":false},{"description":"","id":440,"name":"Grupp 4","parent":436,"position":40,"temporary":false},{"description":"","id":441,"name":"Grupp 5","parent":436,"position":50,"temporary":false},{"description":"","id":442,"name":"Grupp 6","parent":436,"position":60,"temporary":false},{"description":"","id":452,"name":"Rematch och rekryt Lobby","parent":436,"position":0,"temporary":false},{"description":"","id":190,"name":"Snack-kanaler","parent":0,"position":20,"temporary":false},{"description":"","id":2,"name":"Allm\u00e4nt Snack","parent":190,"position":100,"temporary":false},{"description":"","id":10,"name":"Allm\u00e4nt Snack - Rum #1","parent":2,"position":0,"temporary":false},{"description":"","id":11,"name":"Allm\u00e4nt Snack - Rum #2","parent":2,"position":0,"temporary":false},{"description":"","id":12,"name":"Allm\u00e4nt Snack - Rum #3","parent":2,"position":0,"temporary":false},{"description":"","id":13,"name":"Allm\u00e4nt Snack - Rum #4","parent":2,"position":0,"temporary":false},{"description":"","id":14,"name":"Utvisningsb\u00e5set","parent":2,"position":1000,"temporary":false},{"description":"","id":84,"name":"Allm\u00e4nt Snack - Rum #5","parent":2,"position":0,"temporary":false},{"description":"","id":85,"name":"Allm\u00e4nt Snack - Rum #6","parent":2,"position":0,"temporary":false},{"description":"","id":86,"name":"Allm\u00e4nt Snack - Vuxenkanal #1","parent":2,"position":0,"temporary":false},{"description":"","id":87,"name":"Allm\u00e4nt Snack - Vuxenkanal #2","parent":2,"position":0,"temporary":false},{"description":"","id":88,"name":"Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus","parent":2,"position":0,"temporary":false},{"description":"","id":205,"name":"V\u00e4lkommen in - Allm\u00e4n samlingskanal","parent":190,"position":0,"temporary":false},{"description":"","id":193,"name":"Startbanan (registrera er sj\u00e4lva)","parent":0,"position":999,"temporary":false},{"description":"","id":542,"name":"Spelkanaler","parent":0,"position":30,"temporary":false},{"description":"H\u00e4r spelar vi Battlefield och Project Reality.<\/span>\n

Foruml\u00e4nk: http:\/\/www.skyttegrav.se\/viewforum.php?f=8<\/a><\/p>","id":3,"name":"Battlefield","parent":542,"position":10,"temporary":false},{"description":"","id":119,"name":"Battlefield 3","parent":3,"position":0,"temporary":false},{"description":"","id":479,"name":"Grupp 1","parent":119,"position":0,"temporary":false},{"description":"","id":480,"name":"Grupp 2","parent":119,"position":0,"temporary":false},{"description":"","id":122,"name":"Battlefield 2","parent":3,"position":0,"temporary":false},{"description":"","id":16,"name":"Skyttegrav #2 Project Reality Coop","parent":122,"position":0,"temporary":false},{"description":"","id":47,"name":"Team #1","parent":16,"position":10,"temporary":false},{"description":"","id":54,"name":"Team #2","parent":16,"position":20,"temporary":false},{"description":"","id":17,"name":"Skyttegrav #1 BF2 Ranked","parent":122,"position":0,"temporary":false},{"description":"","id":384,"name":"Skyttegrav #3 Project Reality","parent":122,"position":0,"temporary":false},{"description":"","id":385,"name":"Team #1","parent":384,"position":0,"temporary":false},{"description":"","id":386,"name":"Team #2","parent":384,"position":0,"temporary":false},{"description":"SweClockers.com 64 HC Conquest:<\/b> \n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5\/SweClockers-com-64-HC-Conquest\/<\/a><\/a>SweClockers.com 32 Custom Rush\/Obliteration:<\/span><\/b> <\/p>\n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/b7c21efd-25ab-4306-a2ff-4342f41850bc\/SweClockers-com-32-Custom-Rush-Obliteration\/<\/a><\/p>","id":389,"name":"Battlefield 4","parent":3,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":148,"name":"SweClockers 64 HC Conquest","parent":389,"position":10,"temporary":false},{"description":"","id":149,"name":"Team #1","parent":148,"position":0,"temporary":false},{"description":"","id":198,"name":"Squad #1","parent":149,"position":0,"temporary":false},{"description":"","id":199,"name":"Squad #2","parent":149,"position":0,"temporary":false},{"description":"","id":202,"name":"Squad #3","parent":149,"position":0,"temporary":false},{"description":"","id":194,"name":"Team #2","parent":148,"position":10,"temporary":false},{"description":"","id":200,"name":"Squad #1","parent":194,"position":0,"temporary":false},{"description":"","id":201,"name":"Squad #2","parent":194,"position":0,"temporary":false},{"description":"","id":203,"name":"Squad #3","parent":194,"position":0,"temporary":false},{"description":"","id":390,"name":"Grupp 1","parent":389,"position":110,"temporary":false},{"description":"","id":391,"name":"Grupp 2","parent":389,"position":120,"temporary":false},{"description":"","id":392,"name":"Grupp 3","parent":389,"position":130,"temporary":false},{"description":"","id":393,"name":"S\u00f6ker spelare","parent":389,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":472,"name":"SweClockers 32 Vanilla maps","parent":389,"position":20,"temporary":false},{"description":"","id":473,"name":"Team #1","parent":472,"position":0,"temporary":false},{"description":"","id":475,"name":"Squad #1","parent":473,"position":0,"temporary":false},{"description":"","id":476,"name":"Squad #2","parent":473,"position":0,"temporary":false},{"description":"","id":474,"name":"Team #2","parent":472,"position":0,"temporary":false},{"description":"","id":477,"name":"Squad #1","parent":474,"position":0,"temporary":false},{"description":"","id":478,"name":"Squad #2","parent":474,"position":0,"temporary":false},{"description":"","id":560,"name":"Battlefield Hardline Beta","parent":3,"position":4,"temporary":false},{"description":"","id":561,"name":"Grupp 1","parent":560,"position":1,"temporary":false},{"description":"","id":562,"name":"Grupp 2","parent":560,"position":2,"temporary":false},{"description":"","id":563,"name":"Grupp 3","parent":560,"position":3,"temporary":false},{"description":"","id":564,"name":"S\u00f6ker spelare","parent":560,"position":0,"temporary":false},{"description":"","id":569,"name":"Bad Company 2","parent":3,"position":0,"temporary":false},{"description":"","id":570,"name":"Grupp 1","parent":569,"position":1,"temporary":false},{"description":"","id":571,"name":"Grupp 2","parent":569,"position":2,"temporary":false},{"description":"","id":4,"name":"Call of Duty","parent":542,"position":20,"temporary":false},{"description":"","id":23,"name":"Call of Duty 4","parent":4,"position":30,"temporary":false},{"description":"","id":25,"name":"Call of Duty - Modern Warfare 2","parent":4,"position":50,"temporary":false},{"description":"","id":95,"name":"Party 1","parent":25,"position":100,"temporary":false},{"description":"","id":96,"name":"Party 2","parent":25,"position":200,"temporary":false},{"description":"","id":139,"name":"Call of Duty - Modern Warfare 3","parent":4,"position":0,"temporary":false},{"description":"","id":140,"name":"Party 1","parent":139,"position":0,"temporary":false},{"description":"","id":212,"name":"Party 2","parent":139,"position":0,"temporary":false},{"description":"","id":246,"name":"Call of Duty - Black Ops 2","parent":4,"position":0,"temporary":false},{"description":"","id":254,"name":"Party 1","parent":246,"position":0,"temporary":false},{"description":"","id":255,"name":"Party 2","parent":246,"position":0,"temporary":false},{"description":"","id":395,"name":"Call of Duty - Ghosts","parent":4,"position":0,"temporary":false},{"description":"","id":396,"name":"Hardcore","parent":395,"position":0,"temporary":false},{"description":"","id":398,"name":"Party 1","parent":396,"position":0,"temporary":false},{"description":"","id":399,"name":"Party 2","parent":396,"position":0,"temporary":false},{"description":"","id":397,"name":"Softcore","parent":395,"position":0,"temporary":false},{"description":"","id":554,"name":"Call of Duty - Advance Warfare","parent":4,"position":0,"temporary":false},{"description":"","id":555,"name":"Party 1","parent":554,"position":0,"temporary":false},{"description":"","id":556,"name":"Party 2","parent":554,"position":0,"temporary":false},{"description":"","id":5,"name":"Counter-Strike","parent":542,"position":30,"temporary":false},{"description":"","id":28,"name":"Skyttegrav #1 - D2 INF Nuke","parent":5,"position":10,"temporary":false},{"description":"","id":30,"name":"Skyttegrav #3 - WC3FT ","parent":5,"position":30,"temporary":false},{"description":"","id":178,"name":"Global Offensive","parent":5,"position":0,"temporary":false},{"description":"","id":179,"name":"Competitive","parent":178,"position":20,"temporary":false},{"description":"","id":483,"name":"Rum #1","parent":179,"position":10,"temporary":false},{"description":"","id":484,"name":"Rum #2","parent":179,"position":20,"temporary":false},{"description":"","id":180,"name":"Rum #2","parent":178,"position":200,"temporary":false},{"description":"","id":181,"name":"Skyttegrav #3 Classic Competitive","parent":178,"position":0,"temporary":false},{"description":"","id":527,"name":"Rum #1","parent":178,"position":100,"temporary":false},{"description":"","id":7,"name":"\u00d6vriga spel","parent":542,"position":60,"temporary":false},{"description":"","id":345,"name":"Bilspel och racingsims (F1 Dirt ETS mm)","parent":7,"position":0,"temporary":false},{"description":"","id":537,"name":"Euro Truck Sim","parent":345,"position":0,"temporary":false},{"description":"","id":485,"name":"Voxel Spel","parent":7,"position":0,"temporary":false},{"description":"","id":486,"name":"7 days to die ","parent":485,"position":0,"temporary":false},{"description":"","id":487,"name":"Space Engineers","parent":485,"position":0,"temporary":false},{"description":"","id":536,"name":"Everquest landmark","parent":485,"position":0,"temporary":false},{"description":"","id":488,"name":"MMO","parent":7,"position":0,"temporary":false},{"description":"","id":394,"name":"Final Fantasy XIV - A Realm Reborn","parent":488,"position":0,"temporary":false},{"description":"","id":418,"name":"Rum #1","parent":394,"position":0,"temporary":false},{"description":"","id":419,"name":"Rum #2","parent":394,"position":0,"temporary":false},{"description":"","id":489,"name":"Mortal Online","parent":488,"position":0,"temporary":false},{"description":"","id":490,"name":"World of Warcraft","parent":488,"position":0,"temporary":false},{"description":"","id":491,"name":"Party 1","parent":490,"position":0,"temporary":false},{"description":"","id":492,"name":"Party 2","parent":490,"position":0,"temporary":false},{"description":"","id":495,"name":"Guild Wars 2","parent":488,"position":0,"temporary":false},{"description":"","id":513,"name":"Planetside 2","parent":488,"position":0,"temporary":false},{"description":"","id":529,"name":"Aion","parent":488,"position":0,"temporary":false},{"description":"First-person shooter & Third-person shooter","id":498,"name":"FPS och TPS","parent":7,"position":0,"temporary":false},{"description":"","id":207,"name":"Borderlands 2","parent":498,"position":0,"temporary":false},{"description":"","id":218,"name":"Portal 2","parent":498,"position":0,"temporary":false},{"description":"","id":232,"name":"Infestation Survivor Stories","parent":498,"position":0,"temporary":false},{"description":"Clanen vi har till Wipe heter \n

SKYTTEGRAV<\/p>\n

\n

Joina denna f\u00f6r att teama up.<\/p>","id":240,"name":"Grupp 1","parent":232,"position":0,"temporary":false},{"description":"","id":241,"name":"Grupp 2","parent":232,"position":1,"temporary":false},{"description":"","id":376,"name":"Skyttegrav KLAN SPEL","parent":232,"position":1,"temporary":false},{"description":"","id":499,"name":"ArmA","parent":498,"position":0,"temporary":false},{"description":"","id":500,"name":"Natural Selection 2","parent":498,"position":0,"temporary":false},{"description":"","id":502,"name":"Left 4 Dead","parent":498,"position":0,"temporary":false},{"description":"","id":514,"name":"Red Orchestra 2","parent":498,"position":0,"temporary":false},{"description":"","id":515,"name":"Allies","parent":514,"position":0,"temporary":false},{"description":"","id":516,"name":"Axis","parent":514,"position":0,"temporary":false},{"description":"","id":518,"name":"Mount and Blade - Warband","parent":498,"position":0,"temporary":false},{"description":"","id":519,"name":"Persistent World","parent":518,"position":0,"temporary":false},{"description":"","id":520,"name":"Mount and blade Vanilla","parent":518,"position":0,"temporary":false},{"description":"","id":541,"name":"Insurgency","parent":498,"position":0,"temporary":false},{"description":"","id":567,"name":"Evolve","parent":498,"position":0,"temporary":false},{"description":"","id":504,"name":"RTS och grand strategy","parent":7,"position":0,"temporary":false},{"description":"","id":356,"name":"Starcraft","parent":504,"position":0,"temporary":false},{"description":"","id":505,"name":"Company of Heroes","parent":504,"position":0,"temporary":false},{"description":"","id":506,"name":"Europa Universalis ","parent":504,"position":0,"temporary":false},{"description":"","id":534,"name":"Rum #1","parent":506,"position":0,"temporary":false},{"description":"","id":535,"name":"Rum #2","parent":506,"position":0,"temporary":false},{"description":"","id":523,"name":"Age of Empires","parent":504,"position":0,"temporary":false},{"description":"h\u00e4r spelar man Civilization<\/span><\/b> V<\/span><\/a>","id":533,"name":"Civilization V","parent":504,"position":0,"temporary":false},{"description":"Spel som \u00e4r gratis att k\u00f6ra.","id":510,"name":"Free to play","parent":7,"position":0,"temporary":false},{"description":"","id":375,"name":"Mechwarrior Online","parent":510,"position":0,"temporary":false},{"description":"","id":511,"name":"War Thunder","parent":510,"position":0,"temporary":false},{"description":"","id":526,"name":"Tank","parent":511,"position":0,"temporary":false},{"description":"","id":538,"name":"Flyg","parent":511,"position":0,"temporary":false},{"description":"","id":512,"name":"World of Tanks","parent":510,"position":0,"temporary":false},{"description":"","id":530,"name":"Town of salem","parent":510,"position":0,"temporary":false},{"description":"","id":521,"name":"Hack and slash","parent":7,"position":0,"temporary":false},{"description":"","id":167,"name":"Diablo 3","parent":521,"position":0,"temporary":false},{"description":"","id":336,"name":"Path of Exile","parent":521,"position":0,"temporary":false},{"description":"","id":383,"name":"Torchlight II","parent":521,"position":0,"temporary":false},{"description":"","id":522,"name":"MOBA","parent":7,"position":0,"temporary":false},{"description":"","id":6,"name":"League of Legends","parent":522,"position":0,"temporary":false},{"description":"","id":565,"name":"Grupp 1","parent":6,"position":5,"temporary":false},{"description":"","id":566,"name":"Grupp 2","parent":6,"position":10,"temporary":false},{"description":"","id":153,"name":"Dota 2","parent":522,"position":0,"temporary":false},{"description":"","id":236,"name":"Grupp 1","parent":153,"position":0,"temporary":false},{"description":"","id":237,"name":"Grupp 2","parent":153,"position":0,"temporary":false},{"description":"","id":532,"name":"Smite","parent":522,"position":0,"temporary":false},{"description":"","id":528,"name":"Tabletop Simulator","parent":7,"position":0,"temporary":false},{"description":"","id":559,"name":"Kerbal Space Program","parent":7,"position":0,"temporary":false},{"description":"","id":156,"name":"Minecraft","parent":542,"position":50,"temporary":false},{"description":"Serverip: mc.hemligastugan.com Dynmap \/ Regler: http:\/\/www.hemligastugan.com\/minecraft\/# <\/a>","id":157,"name":"Hemligastugan","parent":156,"position":0,"temporary":false},{"description":"L\u00e5st till admins f\u00f6r Hemligastugan.","id":388,"name":"Admin","parent":157,"position":2,"temporary":false},{"description":"","id":416,"name":"Grupp 1","parent":157,"position":0,"temporary":false},{"description":"","id":417,"name":"Grupp 2","parent":157,"position":0,"temporary":false},{"description":"Inte bara en samling moddar.. \u00c4ven med egenutvecklade MODS!<\/b> \n

MC Version 1.7.10 \/ Skyttegrav Modpack 2.0<\/p>\n

Hemsida: http:\/\/mc.skyttegrav.se<\/a><\/p>\n

Info & registrering: http:\/\/www.skyttegrav.se\/index.php?\/topic\/5-skyttegravse-custom-modpack<\/a><\/p>\n

Server IP: mc.skyttegrav.se<\/p>\n

Dynmap: http:\/\/mc.skyttegrav.se\/dynmap<\/a><\/p>","id":158,"name":"Skyttegrav Modpack","parent":156,"position":0,"temporary":false},{"description":"","id":539,"name":"Rum 1","parent":158,"position":0,"temporary":false},{"description":"","id":540,"name":"Rum 2","parent":158,"position":0,"temporary":false},{"description":"","id":170,"name":"Day Z","parent":542,"position":40,"temporary":false},{"description":"","id":176,"name":"Grupp 1","parent":170,"position":10,"temporary":false},{"description":"","id":177,"name":"Grupp 2","parent":170,"position":20,"temporary":false},{"description":"","id":196,"name":"Grupp 3","parent":170,"position":30,"temporary":false},{"description":"","id":197,"name":"Grupp 4","parent":170,"position":40,"temporary":false},{"description":"H\u00e4r s\u00f6ker ni spelare f\u00f6r ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.<\/p>","id":192,"name":"S\u00f6ker spelare","parent":542,"position":0,"temporary":false},{"description":"H\u00e4r kan man sitta och titta p\u00e5 streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du f\u00e5r g\u00e4rna tipsa om ett evenemang.","id":543,"name":"Event-kanaler","parent":0,"position":11,"temporary":false},{"description":"","id":544,"name":"MS Presskonferens","parent":543,"position":10,"temporary":false},{"description":"","id":546,"name":"Titta och diskutera","parent":544,"position":5,"temporary":false},{"description":"","id":547,"name":"Tysta rummet","parent":544,"position":10,"temporary":false},{"description":"","id":548,"name":"Skyttegrav Free-2-Play Spelkv\u00e4llar","parent":543,"position":50,"temporary":false},{"description":"","id":553,"name":"Trackmania 29 Okt","parent":548,"position":0,"temporary":false},{"description":"","id":549,"name":"Rum #1","parent":553,"position":0,"temporary":false},{"description":"","id":550,"name":"Rum #2","parent":553,"position":0,"temporary":false},{"description":"","id":558,"name":"DreamHack","parent":543,"position":100,"temporary":false}],"players":[{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":24306,"mute":false,"name":"pyootr","onlinesecs":24306,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":96,"suppress":true,"tcponly":false,"userid":66,"version":66053,"udpPing":51.1,"tcpPing":62.3},{"bytespersec":0,"channel":1,"comment":"Serveransvarig & Admin<\/b> f\u00f6r Skyttegrav.se\/Sweclockers.com spelservrar. \n

Supervisor<\/b> hos Skyttegrav.se<\/a>.<\/p>","context":"","deaf":false,"identity":"","idlesecs":29126,"mute":false,"name":"[SG-SUP]Gix","onlinesecs":29154,"os":"X11","osversion":"Linux Mint 17 Qiana","release":"1.2.8-1~ppa1~trusty1","selfDeaf":false,"selfMute":false,"session":124,"suppress":true,"tcponly":false,"userid":47,"version":66056,"udpPing":29.21,"tcpPing":28.47},{"bytespersec":0,"channel":1,"comment":"JAG TROR DIG URKEL!\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":22621,"mute":false,"name":"Eyem-_-","onlinesecs":24847,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":176,"suppress":true,"tcponly":false,"userid":1001,"version":66052,"udpPing":17.33,"tcpPing":20.11},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1721,"mute":false,"name":"[SG-HA]Relemy","onlinesecs":29128,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":232,"suppress":true,"tcponly":false,"userid":1926,"version":66056,"udpPing":37.94,"tcpPing":42.24},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28863,"mute":false,"name":"TheLikus","onlinesecs":29008,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":269,"suppress":true,"tcponly":false,"userid":4120,"version":66056,"udpPing":11.01,"tcpPing":13.72},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":29137,"mute":false,"name":"Legoo","onlinesecs":29139,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":473,"suppress":true,"tcponly":false,"userid":1657,"version":66053,"udpPing":8.45,"tcpPing":23.04},{"bytespersec":0,"channel":432,"comment":"http:\/\/www.twitch.tv\/tobbbe__<\/a>","context":"","deaf":false,"identity":"","idlesecs":841,"mute":false,"name":"[SweC]Tobbbe__","onlinesecs":29138,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":5,"suppress":false,"tcponly":false,"userid":3769,"version":66056,"udpPing":22.64,"tcpPing":24.04},{"bytespersec":6870,"channel":432,"comment":"

<\/p>","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Vilse(SWE)","onlinesecs":16399,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":110,"suppress":false,"tcponly":false,"userid":4124,"version":66056,"udpPing":13.83,"tcpPing":16.21},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":23,"mute":false,"name":"Th3MadPanda","onlinesecs":29137,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":236,"suppress":false,"tcponly":false,"userid":2099,"version":66056,"udpPing":8.86,"tcpPing":11.72},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":12,"mute":false,"name":"Mumin","onlinesecs":9347,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":306,"suppress":false,"tcponly":false,"userid":4125,"version":66056,"udpPing":19.05,"tcpPing":22.56},{"bytespersec":0,"channel":432,"comment":"Greetinx Programs!<\/a> \n

\n

V\u00e4lkommen till SweClockers och Skyttegravs gemensamma Mumble!<\/p>\n

\n

Ni kan fr\u00e5ga mig om administrativa saker p\u00e5 servers eller mumble, jag \u00e4r huvudadmin f\u00f6r SweC g\u00e4nget och dessutom forumledare f\u00f6r SweClockers.com. H\u00e4r \u00e4r reglerna f\u00f6r mumble och SweC forum.<\/a><\/p>\n

<\/p>\n

Vi satsar p\u00e5 en trevlig st\u00e4mning online! :)<\/p>\n

","context":"","deaf":false,"identity":"","idlesecs":127,"mute":false,"name":"[SweC-H]Lan","onlinesecs":29132,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":353,"suppress":false,"tcponly":false,"userid":56,"version":66053,"udpPing":15.76,"tcpPing":35.22},{"bytespersec":6865,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Gson","onlinesecs":4023,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":146,"suppress":false,"tcponly":false,"userid":4123,"version":66056,"udpPing":51.51,"tcpPing":57.29},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":15,"mute":false,"name":"lampan","onlinesecs":19196,"os":"Win","osversion":"6.2.9200.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":463,"suppress":false,"tcponly":false,"userid":3404,"version":66053,"udpPing":13.6,"tcpPing":16.66},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":773,"mute":false,"name":"[SweC-T]Grabbengr\u00e5","onlinesecs":28304,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":53,"suppress":false,"tcponly":false,"userid":1952,"version":66056,"udpPing":20.4,"tcpPing":22.68},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1299,"mute":false,"name":"[SweC-H]Kinekin","onlinesecs":29134,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":180,"suppress":false,"tcponly":false,"userid":2426,"version":66056,"udpPing":49.78,"tcpPing":52.22},{"bytespersec":0,"channel":451,"comment":"Det h\u00e4nder att jag spelar spel ibland.\n

<\/p>\n

<\/p>\n

<\/p>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":13,"mute":false,"name":"[SweC-T]DavidtheDoom","onlinesecs":29086,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":203,"suppress":false,"tcponly":false,"userid":3030,"version":66056,"udpPing":3.96,"tcpPing":5.61},{"bytespersec":0,"channel":451,"comment":"SweC spelservrar finns ocks\u00e5 p\u00e5 Facebook<\/a>","context":"","deaf":false,"identity":"","idlesecs":155,"mute":false,"name":"[SweC-H]Raven_cc","onlinesecs":21915,"os":"Win","osversion":"6.1.7600.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":264,"suppress":false,"tcponly":true,"userid":78,"version":66055,"udpPing":19.73,"tcpPing":25.93},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1628,"mute":false,"name":"OskarWallin","onlinesecs":12269,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":272,"suppress":false,"tcponly":false,"userid":3783,"version":66056,"udpPing":11.97,"tcpPing":31.09},{"bytespersec":6658,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-A]Hitman","onlinesecs":29130,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":485,"suppress":false,"tcponly":true,"userid":76,"version":66056,"udpPing":21.36,"tcpPing":28},{"bytespersec":7223,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SG-A]bl0m1","onlinesecs":29107,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":488,"suppress":false,"tcponly":false,"userid":3447,"version":66056,"udpPing":40.3,"tcpPing":43.52},{"bytespersec":0,"channel":390,"comment":"","context":"","deaf":false,"identity":"","idlesecs":385,"mute":false,"name":"shifted","onlinesecs":385,"os":"Win","osversion":"6.2.9200.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":294,"suppress":false,"tcponly":false,"userid":4065,"version":66055,"udpPing":21.16,"tcpPing":21.38},{"bytespersec":0,"channel":391,"comment":"","context":"","deaf":false,"identity":"","idlesecs":10201,"mute":false,"name":"Tennethe","onlinesecs":19638,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":152,"suppress":false,"tcponly":false,"userid":4081,"version":66056,"udpPing":28.6,"tcpPing":32.91},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":97,"mute":false,"name":"Figge86","onlinesecs":4319,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":259,"suppress":false,"tcponly":false,"userid":3459,"version":66056,"udpPing":15.4,"tcpPing":17.42},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":99,"mute":false,"name":"sterner007","onlinesecs":9667,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":312,"suppress":false,"tcponly":false,"userid":3836,"version":66056,"udpPing":33.4,"tcpPing":36.36},{"bytespersec":0,"channel":555,"comment":"","context":"","deaf":false,"identity":"","idlesecs":183,"mute":false,"name":"[SG]K\u00e5Be","onlinesecs":29128,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":12,"suppress":false,"tcponly":false,"userid":27,"version":66056,"udpPing":20.87,"tcpPing":24.01},{"bytespersec":0,"channel":555,"comment":"beh\u00f6ver ni mig kalla\n

","context":"","deaf":false,"identity":"","idlesecs":188,"mute":false,"name":"[SG-SUP]strike","onlinesecs":5637,"os":"Win","osversion":"5.1.2600.1","release":"1.2.3","selfDeaf":false,"selfMute":false,"session":314,"suppress":false,"tcponly":false,"userid":19,"version":66051,"udpPing":21.27,"tcpPing":26.18},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":35,"mute":false,"name":"Widoxz","onlinesecs":28334,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":24,"suppress":false,"tcponly":false,"userid":4058,"version":66056,"udpPing":35.75,"tcpPing":55.55},{"bytespersec":6890,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"FourO","onlinesecs":3421,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":131,"suppress":false,"tcponly":false,"userid":4111,"version":66056,"udpPing":9.7,"tcpPing":15.63},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3444,"mute":false,"name":"lemurtacos","onlinesecs":3445,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":185,"suppress":false,"tcponly":false,"userid":3827,"version":66056,"udpPing":9.85,"tcpPing":13.46},{"bytespersec":8833,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"kaviar","onlinesecs":23142,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":349,"suppress":false,"tcponly":false,"userid":3759,"version":66056,"udpPing":11.66,"tcpPing":14.67},{"bytespersec":9083,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"LillaEmma","onlinesecs":3957,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":419,"suppress":false,"tcponly":false,"userid":3758,"version":66056,"udpPing":10.31,"tcpPing":13.45},{"bytespersec":0,"channel":218,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1698,"mute":false,"name":"Maichopalami","onlinesecs":4899,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":157,"suppress":false,"tcponly":false,"userid":1563,"version":66056,"udpPing":12.86,"tcpPing":15.14},{"bytespersec":0,"channel":512,"comment":"","context":"","deaf":false,"identity":"","idlesecs":2640,"mute":false,"name":"[SG]Binge","onlinesecs":11586,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":333,"suppress":false,"tcponly":false,"userid":1837,"version":66056,"udpPing":22.69,"tcpPing":26},{"bytespersec":9014,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"shimmerghost","onlinesecs":17161,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":2347,"version":66052,"udpPing":30.95,"tcpPing":33.04},{"bytespersec":8874,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Lankfisher","onlinesecs":17163,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":186,"suppress":false,"tcponly":false,"userid":4106,"version":66056,"udpPing":21.28,"tcpPing":23.3},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1,"mute":false,"name":"AndreasLindgren","onlinesecs":5267,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":235,"suppress":false,"tcponly":false,"userid":2439,"version":66056,"udpPing":31.59,"tcpPing":17.07},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":5210,"mute":false,"name":"Emmag","onlinesecs":5229,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":true,"session":300,"suppress":false,"tcponly":false,"userid":2438,"version":66052,"udpPing":24.04,"tcpPing":25.43},{"bytespersec":0,"channel":383,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3961,"mute":false,"name":"Tobias","onlinesecs":8817,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":325,"suppress":false,"tcponly":false,"userid":3788,"version":66056,"udpPing":15.74,"tcpPing":22.28}],"numplayers":38,"gq_online":true,"gq_address":"95.130.64.232","gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_type":"mumble","gq_name":"Mumble Server","gq_transport":"tcp","gq_joinlink":"mumble:\/\/95.130.64.232:64738\/"}},"filtered":{"95.130.64.232:64738":{"dedicated":1,"id":1,"name":"Skyttegrav & SweClockers Mumble","x_connecturl":"mumble:\/\/mumble.skyttegrav.se\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_max_users":"250","x_gtmurmur_server_version":"1.2.8","x_gtmurmur_doclen":224093,"teams":[{"description":"Welcome! <\/b>\n

This server requires registration<\/span> in order to move from Root.Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.<\/b><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false,"gq_name":"Root"},{"description":"","id":1,"name":"AFK","parent":0,"position":0,"temporary":false,"gq_name":"AFK"},{"description":"","id":8,"name":"Utl\u00e5nade Kanaler","parent":0,"position":100,"temporary":false,"gq_name":"Utl\u00e5nade Kanaler"},{"description":"Endast F\u00f6r Skyttegrav admins!<\/b>","id":9,"name":"Admins Corner (private)","parent":0,"position":200,"temporary":false,"gq_name":"Admins Corner (private)"},{"description":"","id":38,"name":"Admins","parent":9,"position":11,"temporary":false,"gq_name":"Admins"},{"description":"","id":43,"name":"Headadmins Corner","parent":9,"position":60,"temporary":false,"gq_name":"Headadmins Corner"},{"description":"","id":44,"name":"Supervisors Corner - Polska Riksdagen","parent":9,"position":70,"temporary":false,"gq_name":"Supervisors Corner - Polska Riksdagen"},{"description":"Spelf\u00f6reningen bakom Skyttegrav.se","id":150,"name":"United Gaming","parent":9,"position":0,"temporary":false,"gq_name":"United Gaming"},{"description":"","id":151,"name":"M\u00f6te","parent":150,"position":0,"temporary":false,"gq_name":"M\u00f6te"},{"description":"","id":152,"name":"Styrelsem\u00f6te","parent":150,"position":0,"temporary":false,"gq_name":"Styrelsem\u00f6te"},{"description":"Endast F\u00f6r SweClockers.com admins!<\/b>","id":187,"name":"Sweclockers","parent":9,"position":0,"temporary":false,"gq_name":"Sweclockers"},{"description":"","id":188,"name":"Allm\u00e4n Admin","parent":187,"position":0,"temporary":false,"gq_name":"Allm\u00e4n Admin"},{"description":"","id":189,"name":"Privat Admin (Endast inbjudan)","parent":187,"position":0,"temporary":false,"gq_name":"Privat Admin (Endast inbjudan)"},{"description":"","id":214,"name":"Allm\u00e4n Admin (Delad)","parent":9,"position":10,"temporary":false,"gq_name":"Allm\u00e4n Admin (Delad)"},{"description":"","id":183,"name":"SweClockers","parent":0,"position":10,"temporary":false,"gq_name":"SweClockers"},{"description":"H\u00e4r kommer v\u00e5ra stream och webtv att s\u00e4ndas! \n

\n

Bes\u00f6k www.swec.tv och avnjut s\u00e4ndningen, vill du deltaga s\u00e5 skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig l\u00f6senordet. Vi kommer att b\u00e5de casta och spela olika spel l\u00f6pande.<\/p>\n

\n

I kanalen g\u00e4ller strikt ljud och informationskontroll, akta er allts\u00e5 f\u00f6r att inte s\u00e4ga f\u00f6r mycket.<\/p>","id":358,"name":"SweC TV Studio (private)","parent":183,"position":100,"temporary":false,"gq_name":"SweC TV Studio (private)"},{"description":"Vill ni deltaga i SweC TV? \n

\n

S\u00e4tt er i detta rummet s\u00e5 kommer vi att dra in er i cast rummet vid tillf\u00e4lle, ni \u00e4r varmt v\u00e4lkomna att titta p\u00e5 www.swec.tv<\/a> medan ni v\u00e4ntar! <\/p>\n

\n

N\u00e4r ni kommer in i cast kanalen \u00e4r ni automatiskt satta till "mute", vi kommer att \u00e4ndra det n\u00e4r ni kommer in.<\/p>\n

\n

\n

","id":402,"name":"SweC TV lobby (wait for invite to cast room)","parent":183,"position":200,"temporary":false,"gq_name":"SweC TV lobby (wait for invite to cast room)"},{"description":"Hj\u00e4lp med Mumble? L\u00e4s h\u00e4r -> Mumble tr\u00e5d p\u00e5 SweClockers<\/a>","id":421,"name":"Spelkv\u00e4llar","parent":183,"position":300,"temporary":false,"gq_name":"Spelkv\u00e4llar"},{"description":"H\u00e4r har ni nyttig information om spelkv\u00e4llarna! \n

SpelClockers<\/a> Spelkv\u00e4llar<\/p>\n

Sweclockers Steam chat grupp<\/a><\/p>\n

<\/p>","id":426,"name":"Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning","parent":421,"position":0,"temporary":false,"gq_name":"Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning"},{"description":"","id":427,"name":"Reserv #2","parent":421,"position":20,"temporary":false,"gq_name":"Reserv #2"},{"description":"","id":429,"name":"Grupp 1","parent":427,"position":10,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":430,"name":"Grupp 2","parent":427,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":449,"name":"Grupp 3","parent":427,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":450,"name":"Grupp 4","parent":427,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"","id":453,"name":"Rematch och rekryt Lobby","parent":427,"position":0,"temporary":false,"gq_name":"Rematch och rekryt Lobby"},{"description":"","id":455,"name":"Grupp 5","parent":427,"position":50,"temporary":false,"gq_name":"Grupp 5"},{"description":"","id":456,"name":"Grupp 6","parent":427,"position":60,"temporary":false,"gq_name":"Grupp 6"},{"description":"","id":428,"name":"12h stream med SpelClockers - L\u00f6rdag 28 feb","parent":421,"position":10,"temporary":false,"gq_name":"12h stream med SpelClockers - L\u00f6rdag 28 feb"},{"description":"","id":432,"name":"MechWarrior Online","parent":428,"position":10,"temporary":false,"gq_name":"MechWarrior Online"},{"description":"","id":433,"name":"Grupp 2","parent":428,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":434,"name":"Grupp 3","parent":428,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":443,"name":"Grupp 4","parent":428,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"","id":444,"name":"Grupp 5","parent":428,"position":50,"temporary":false,"gq_name":"Grupp 5"},{"description":"","id":451,"name":"Samlingsal","parent":428,"position":0,"temporary":false,"gq_name":"Samlingsal"},{"description":"","id":459,"name":"Grupp 6","parent":428,"position":60,"temporary":false,"gq_name":"Grupp 6"},{"description":"","id":436,"name":"Reserv #3","parent":421,"position":30,"temporary":false,"gq_name":"Reserv #3"},{"description":"","id":437,"name":"Grupp 1","parent":436,"position":10,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":438,"name":"Grupp 2","parent":436,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":439,"name":"Grupp 3","parent":436,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":440,"name":"Grupp 4","parent":436,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"","id":441,"name":"Grupp 5","parent":436,"position":50,"temporary":false,"gq_name":"Grupp 5"},{"description":"","id":442,"name":"Grupp 6","parent":436,"position":60,"temporary":false,"gq_name":"Grupp 6"},{"description":"","id":452,"name":"Rematch och rekryt Lobby","parent":436,"position":0,"temporary":false,"gq_name":"Rematch och rekryt Lobby"},{"description":"","id":190,"name":"Snack-kanaler","parent":0,"position":20,"temporary":false,"gq_name":"Snack-kanaler"},{"description":"","id":2,"name":"Allm\u00e4nt Snack","parent":190,"position":100,"temporary":false,"gq_name":"Allm\u00e4nt Snack"},{"description":"","id":10,"name":"Allm\u00e4nt Snack - Rum #1","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #1"},{"description":"","id":11,"name":"Allm\u00e4nt Snack - Rum #2","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #2"},{"description":"","id":12,"name":"Allm\u00e4nt Snack - Rum #3","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #3"},{"description":"","id":13,"name":"Allm\u00e4nt Snack - Rum #4","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #4"},{"description":"","id":14,"name":"Utvisningsb\u00e5set","parent":2,"position":1000,"temporary":false,"gq_name":"Utvisningsb\u00e5set"},{"description":"","id":84,"name":"Allm\u00e4nt Snack - Rum #5","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #5"},{"description":"","id":85,"name":"Allm\u00e4nt Snack - Rum #6","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Rum #6"},{"description":"","id":86,"name":"Allm\u00e4nt Snack - Vuxenkanal #1","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Vuxenkanal #1"},{"description":"","id":87,"name":"Allm\u00e4nt Snack - Vuxenkanal #2","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Vuxenkanal #2"},{"description":"","id":88,"name":"Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus","parent":2,"position":0,"temporary":false,"gq_name":"Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus"},{"description":"","id":205,"name":"V\u00e4lkommen in - Allm\u00e4n samlingskanal","parent":190,"position":0,"temporary":false,"gq_name":"V\u00e4lkommen in - Allm\u00e4n samlingskanal"},{"description":"","id":193,"name":"Startbanan (registrera er sj\u00e4lva)","parent":0,"position":999,"temporary":false,"gq_name":"Startbanan (registrera er sj\u00e4lva)"},{"description":"","id":542,"name":"Spelkanaler","parent":0,"position":30,"temporary":false,"gq_name":"Spelkanaler"},{"description":"H\u00e4r spelar vi Battlefield och Project Reality.<\/span>\n

Foruml\u00e4nk: http:\/\/www.skyttegrav.se\/viewforum.php?f=8<\/a><\/p>","id":3,"name":"Battlefield","parent":542,"position":10,"temporary":false,"gq_name":"Battlefield"},{"description":"","id":119,"name":"Battlefield 3","parent":3,"position":0,"temporary":false,"gq_name":"Battlefield 3"},{"description":"","id":479,"name":"Grupp 1","parent":119,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":480,"name":"Grupp 2","parent":119,"position":0,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":122,"name":"Battlefield 2","parent":3,"position":0,"temporary":false,"gq_name":"Battlefield 2"},{"description":"","id":16,"name":"Skyttegrav #2 Project Reality Coop","parent":122,"position":0,"temporary":false,"gq_name":"Skyttegrav #2 Project Reality Coop"},{"description":"","id":47,"name":"Team #1","parent":16,"position":10,"temporary":false,"gq_name":"Team #1"},{"description":"","id":54,"name":"Team #2","parent":16,"position":20,"temporary":false,"gq_name":"Team #2"},{"description":"","id":17,"name":"Skyttegrav #1 BF2 Ranked","parent":122,"position":0,"temporary":false,"gq_name":"Skyttegrav #1 BF2 Ranked"},{"description":"","id":384,"name":"Skyttegrav #3 Project Reality","parent":122,"position":0,"temporary":false,"gq_name":"Skyttegrav #3 Project Reality"},{"description":"","id":385,"name":"Team #1","parent":384,"position":0,"temporary":false,"gq_name":"Team #1"},{"description":"","id":386,"name":"Team #2","parent":384,"position":0,"temporary":false,"gq_name":"Team #2"},{"description":"SweClockers.com 64 HC Conquest:<\/b> \n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5\/SweClockers-com-64-HC-Conquest\/<\/a><\/a>SweClockers.com 32 Custom Rush\/Obliteration:<\/span><\/b> <\/p>\n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/b7c21efd-25ab-4306-a2ff-4342f41850bc\/SweClockers-com-32-Custom-Rush-Obliteration\/<\/a><\/p>","id":389,"name":"Battlefield 4","parent":3,"position":0,"temporary":false,"gq_name":"Battlefield 4"},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":148,"name":"SweClockers 64 HC Conquest","parent":389,"position":10,"temporary":false,"gq_name":"SweClockers 64 HC Conquest"},{"description":"","id":149,"name":"Team #1","parent":148,"position":0,"temporary":false,"gq_name":"Team #1"},{"description":"","id":198,"name":"Squad #1","parent":149,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":199,"name":"Squad #2","parent":149,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":202,"name":"Squad #3","parent":149,"position":0,"temporary":false,"gq_name":"Squad #3"},{"description":"","id":194,"name":"Team #2","parent":148,"position":10,"temporary":false,"gq_name":"Team #2"},{"description":"","id":200,"name":"Squad #1","parent":194,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":201,"name":"Squad #2","parent":194,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":203,"name":"Squad #3","parent":194,"position":0,"temporary":false,"gq_name":"Squad #3"},{"description":"","id":390,"name":"Grupp 1","parent":389,"position":110,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":391,"name":"Grupp 2","parent":389,"position":120,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":392,"name":"Grupp 3","parent":389,"position":130,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":393,"name":"S\u00f6ker spelare","parent":389,"position":0,"temporary":false,"gq_name":"S\u00f6ker spelare"},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":472,"name":"SweClockers 32 Vanilla maps","parent":389,"position":20,"temporary":false,"gq_name":"SweClockers 32 Vanilla maps"},{"description":"","id":473,"name":"Team #1","parent":472,"position":0,"temporary":false,"gq_name":"Team #1"},{"description":"","id":475,"name":"Squad #1","parent":473,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":476,"name":"Squad #2","parent":473,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":474,"name":"Team #2","parent":472,"position":0,"temporary":false,"gq_name":"Team #2"},{"description":"","id":477,"name":"Squad #1","parent":474,"position":0,"temporary":false,"gq_name":"Squad #1"},{"description":"","id":478,"name":"Squad #2","parent":474,"position":0,"temporary":false,"gq_name":"Squad #2"},{"description":"","id":560,"name":"Battlefield Hardline Beta","parent":3,"position":4,"temporary":false,"gq_name":"Battlefield Hardline Beta"},{"description":"","id":561,"name":"Grupp 1","parent":560,"position":1,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":562,"name":"Grupp 2","parent":560,"position":2,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":563,"name":"Grupp 3","parent":560,"position":3,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":564,"name":"S\u00f6ker spelare","parent":560,"position":0,"temporary":false,"gq_name":"S\u00f6ker spelare"},{"description":"","id":569,"name":"Bad Company 2","parent":3,"position":0,"temporary":false,"gq_name":"Bad Company 2"},{"description":"","id":570,"name":"Grupp 1","parent":569,"position":1,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":571,"name":"Grupp 2","parent":569,"position":2,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":4,"name":"Call of Duty","parent":542,"position":20,"temporary":false,"gq_name":"Call of Duty"},{"description":"","id":23,"name":"Call of Duty 4","parent":4,"position":30,"temporary":false,"gq_name":"Call of Duty 4"},{"description":"","id":25,"name":"Call of Duty - Modern Warfare 2","parent":4,"position":50,"temporary":false,"gq_name":"Call of Duty - Modern Warfare 2"},{"description":"","id":95,"name":"Party 1","parent":25,"position":100,"temporary":false,"gq_name":"Party 1"},{"description":"","id":96,"name":"Party 2","parent":25,"position":200,"temporary":false,"gq_name":"Party 2"},{"description":"","id":139,"name":"Call of Duty - Modern Warfare 3","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Modern Warfare 3"},{"description":"","id":140,"name":"Party 1","parent":139,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":212,"name":"Party 2","parent":139,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":246,"name":"Call of Duty - Black Ops 2","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Black Ops 2"},{"description":"","id":254,"name":"Party 1","parent":246,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":255,"name":"Party 2","parent":246,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":395,"name":"Call of Duty - Ghosts","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Ghosts"},{"description":"","id":396,"name":"Hardcore","parent":395,"position":0,"temporary":false,"gq_name":"Hardcore"},{"description":"","id":398,"name":"Party 1","parent":396,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":399,"name":"Party 2","parent":396,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":397,"name":"Softcore","parent":395,"position":0,"temporary":false,"gq_name":"Softcore"},{"description":"","id":554,"name":"Call of Duty - Advance Warfare","parent":4,"position":0,"temporary":false,"gq_name":"Call of Duty - Advance Warfare"},{"description":"","id":555,"name":"Party 1","parent":554,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":556,"name":"Party 2","parent":554,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":5,"name":"Counter-Strike","parent":542,"position":30,"temporary":false,"gq_name":"Counter-Strike"},{"description":"","id":28,"name":"Skyttegrav #1 - D2 INF Nuke","parent":5,"position":10,"temporary":false,"gq_name":"Skyttegrav #1 - D2 INF Nuke"},{"description":"","id":30,"name":"Skyttegrav #3 - WC3FT ","parent":5,"position":30,"temporary":false,"gq_name":"Skyttegrav #3 - WC3FT "},{"description":"","id":178,"name":"Global Offensive","parent":5,"position":0,"temporary":false,"gq_name":"Global Offensive"},{"description":"","id":179,"name":"Competitive","parent":178,"position":20,"temporary":false,"gq_name":"Competitive"},{"description":"","id":483,"name":"Rum #1","parent":179,"position":10,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":484,"name":"Rum #2","parent":179,"position":20,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":180,"name":"Rum #2","parent":178,"position":200,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":181,"name":"Skyttegrav #3 Classic Competitive","parent":178,"position":0,"temporary":false,"gq_name":"Skyttegrav #3 Classic Competitive"},{"description":"","id":527,"name":"Rum #1","parent":178,"position":100,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":7,"name":"\u00d6vriga spel","parent":542,"position":60,"temporary":false,"gq_name":"\u00d6vriga spel"},{"description":"","id":345,"name":"Bilspel och racingsims (F1 Dirt ETS mm)","parent":7,"position":0,"temporary":false,"gq_name":"Bilspel och racingsims (F1 Dirt ETS mm)"},{"description":"","id":537,"name":"Euro Truck Sim","parent":345,"position":0,"temporary":false,"gq_name":"Euro Truck Sim"},{"description":"","id":485,"name":"Voxel Spel","parent":7,"position":0,"temporary":false,"gq_name":"Voxel Spel"},{"description":"","id":486,"name":"7 days to die ","parent":485,"position":0,"temporary":false,"gq_name":"7 days to die "},{"description":"","id":487,"name":"Space Engineers","parent":485,"position":0,"temporary":false,"gq_name":"Space Engineers"},{"description":"","id":536,"name":"Everquest landmark","parent":485,"position":0,"temporary":false,"gq_name":"Everquest landmark"},{"description":"","id":488,"name":"MMO","parent":7,"position":0,"temporary":false,"gq_name":"MMO"},{"description":"","id":394,"name":"Final Fantasy XIV - A Realm Reborn","parent":488,"position":0,"temporary":false,"gq_name":"Final Fantasy XIV - A Realm Reborn"},{"description":"","id":418,"name":"Rum #1","parent":394,"position":0,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":419,"name":"Rum #2","parent":394,"position":0,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":489,"name":"Mortal Online","parent":488,"position":0,"temporary":false,"gq_name":"Mortal Online"},{"description":"","id":490,"name":"World of Warcraft","parent":488,"position":0,"temporary":false,"gq_name":"World of Warcraft"},{"description":"","id":491,"name":"Party 1","parent":490,"position":0,"temporary":false,"gq_name":"Party 1"},{"description":"","id":492,"name":"Party 2","parent":490,"position":0,"temporary":false,"gq_name":"Party 2"},{"description":"","id":495,"name":"Guild Wars 2","parent":488,"position":0,"temporary":false,"gq_name":"Guild Wars 2"},{"description":"","id":513,"name":"Planetside 2","parent":488,"position":0,"temporary":false,"gq_name":"Planetside 2"},{"description":"","id":529,"name":"Aion","parent":488,"position":0,"temporary":false,"gq_name":"Aion"},{"description":"First-person shooter & Third-person shooter","id":498,"name":"FPS och TPS","parent":7,"position":0,"temporary":false,"gq_name":"FPS och TPS"},{"description":"","id":207,"name":"Borderlands 2","parent":498,"position":0,"temporary":false,"gq_name":"Borderlands 2"},{"description":"","id":218,"name":"Portal 2","parent":498,"position":0,"temporary":false,"gq_name":"Portal 2"},{"description":"","id":232,"name":"Infestation Survivor Stories","parent":498,"position":0,"temporary":false,"gq_name":"Infestation Survivor Stories"},{"description":"Clanen vi har till Wipe heter \n

SKYTTEGRAV<\/p>\n

\n

Joina denna f\u00f6r att teama up.<\/p>","id":240,"name":"Grupp 1","parent":232,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":241,"name":"Grupp 2","parent":232,"position":1,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":376,"name":"Skyttegrav KLAN SPEL","parent":232,"position":1,"temporary":false,"gq_name":"Skyttegrav KLAN SPEL"},{"description":"","id":499,"name":"ArmA","parent":498,"position":0,"temporary":false,"gq_name":"ArmA"},{"description":"","id":500,"name":"Natural Selection 2","parent":498,"position":0,"temporary":false,"gq_name":"Natural Selection 2"},{"description":"","id":502,"name":"Left 4 Dead","parent":498,"position":0,"temporary":false,"gq_name":"Left 4 Dead"},{"description":"","id":514,"name":"Red Orchestra 2","parent":498,"position":0,"temporary":false,"gq_name":"Red Orchestra 2"},{"description":"","id":515,"name":"Allies","parent":514,"position":0,"temporary":false,"gq_name":"Allies"},{"description":"","id":516,"name":"Axis","parent":514,"position":0,"temporary":false,"gq_name":"Axis"},{"description":"","id":518,"name":"Mount and Blade - Warband","parent":498,"position":0,"temporary":false,"gq_name":"Mount and Blade - Warband"},{"description":"","id":519,"name":"Persistent World","parent":518,"position":0,"temporary":false,"gq_name":"Persistent World"},{"description":"","id":520,"name":"Mount and blade Vanilla","parent":518,"position":0,"temporary":false,"gq_name":"Mount and blade Vanilla"},{"description":"","id":541,"name":"Insurgency","parent":498,"position":0,"temporary":false,"gq_name":"Insurgency"},{"description":"","id":567,"name":"Evolve","parent":498,"position":0,"temporary":false,"gq_name":"Evolve"},{"description":"","id":504,"name":"RTS och grand strategy","parent":7,"position":0,"temporary":false,"gq_name":"RTS och grand strategy"},{"description":"","id":356,"name":"Starcraft","parent":504,"position":0,"temporary":false,"gq_name":"Starcraft"},{"description":"","id":505,"name":"Company of Heroes","parent":504,"position":0,"temporary":false,"gq_name":"Company of Heroes"},{"description":"","id":506,"name":"Europa Universalis ","parent":504,"position":0,"temporary":false,"gq_name":"Europa Universalis "},{"description":"","id":534,"name":"Rum #1","parent":506,"position":0,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":535,"name":"Rum #2","parent":506,"position":0,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":523,"name":"Age of Empires","parent":504,"position":0,"temporary":false,"gq_name":"Age of Empires"},{"description":"h\u00e4r spelar man Civilization<\/span><\/b> V<\/span><\/a>","id":533,"name":"Civilization V","parent":504,"position":0,"temporary":false,"gq_name":"Civilization V"},{"description":"Spel som \u00e4r gratis att k\u00f6ra.","id":510,"name":"Free to play","parent":7,"position":0,"temporary":false,"gq_name":"Free to play"},{"description":"","id":375,"name":"Mechwarrior Online","parent":510,"position":0,"temporary":false,"gq_name":"Mechwarrior Online"},{"description":"","id":511,"name":"War Thunder","parent":510,"position":0,"temporary":false,"gq_name":"War Thunder"},{"description":"","id":526,"name":"Tank","parent":511,"position":0,"temporary":false,"gq_name":"Tank"},{"description":"","id":538,"name":"Flyg","parent":511,"position":0,"temporary":false,"gq_name":"Flyg"},{"description":"","id":512,"name":"World of Tanks","parent":510,"position":0,"temporary":false,"gq_name":"World of Tanks"},{"description":"","id":530,"name":"Town of salem","parent":510,"position":0,"temporary":false,"gq_name":"Town of salem"},{"description":"","id":521,"name":"Hack and slash","parent":7,"position":0,"temporary":false,"gq_name":"Hack and slash"},{"description":"","id":167,"name":"Diablo 3","parent":521,"position":0,"temporary":false,"gq_name":"Diablo 3"},{"description":"","id":336,"name":"Path of Exile","parent":521,"position":0,"temporary":false,"gq_name":"Path of Exile"},{"description":"","id":383,"name":"Torchlight II","parent":521,"position":0,"temporary":false,"gq_name":"Torchlight II"},{"description":"","id":522,"name":"MOBA","parent":7,"position":0,"temporary":false,"gq_name":"MOBA"},{"description":"","id":6,"name":"League of Legends","parent":522,"position":0,"temporary":false,"gq_name":"League of Legends"},{"description":"","id":565,"name":"Grupp 1","parent":6,"position":5,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":566,"name":"Grupp 2","parent":6,"position":10,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":153,"name":"Dota 2","parent":522,"position":0,"temporary":false,"gq_name":"Dota 2"},{"description":"","id":236,"name":"Grupp 1","parent":153,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":237,"name":"Grupp 2","parent":153,"position":0,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":532,"name":"Smite","parent":522,"position":0,"temporary":false,"gq_name":"Smite"},{"description":"","id":528,"name":"Tabletop Simulator","parent":7,"position":0,"temporary":false,"gq_name":"Tabletop Simulator"},{"description":"","id":559,"name":"Kerbal Space Program","parent":7,"position":0,"temporary":false,"gq_name":"Kerbal Space Program"},{"description":"","id":156,"name":"Minecraft","parent":542,"position":50,"temporary":false,"gq_name":"Minecraft"},{"description":"Serverip: mc.hemligastugan.com Dynmap \/ Regler: http:\/\/www.hemligastugan.com\/minecraft\/# <\/a>","id":157,"name":"Hemligastugan","parent":156,"position":0,"temporary":false,"gq_name":"Hemligastugan"},{"description":"L\u00e5st till admins f\u00f6r Hemligastugan.","id":388,"name":"Admin","parent":157,"position":2,"temporary":false,"gq_name":"Admin"},{"description":"","id":416,"name":"Grupp 1","parent":157,"position":0,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":417,"name":"Grupp 2","parent":157,"position":0,"temporary":false,"gq_name":"Grupp 2"},{"description":"Inte bara en samling moddar.. \u00c4ven med egenutvecklade MODS!<\/b> \n

MC Version 1.7.10 \/ Skyttegrav Modpack 2.0<\/p>\n

Hemsida: http:\/\/mc.skyttegrav.se<\/a><\/p>\n

Info & registrering: http:\/\/www.skyttegrav.se\/index.php?\/topic\/5-skyttegravse-custom-modpack<\/a><\/p>\n

Server IP: mc.skyttegrav.se<\/p>\n

Dynmap: http:\/\/mc.skyttegrav.se\/dynmap<\/a><\/p>","id":158,"name":"Skyttegrav Modpack","parent":156,"position":0,"temporary":false,"gq_name":"Skyttegrav Modpack"},{"description":"","id":539,"name":"Rum 1","parent":158,"position":0,"temporary":false,"gq_name":"Rum 1"},{"description":"","id":540,"name":"Rum 2","parent":158,"position":0,"temporary":false,"gq_name":"Rum 2"},{"description":"","id":170,"name":"Day Z","parent":542,"position":40,"temporary":false,"gq_name":"Day Z"},{"description":"","id":176,"name":"Grupp 1","parent":170,"position":10,"temporary":false,"gq_name":"Grupp 1"},{"description":"","id":177,"name":"Grupp 2","parent":170,"position":20,"temporary":false,"gq_name":"Grupp 2"},{"description":"","id":196,"name":"Grupp 3","parent":170,"position":30,"temporary":false,"gq_name":"Grupp 3"},{"description":"","id":197,"name":"Grupp 4","parent":170,"position":40,"temporary":false,"gq_name":"Grupp 4"},{"description":"H\u00e4r s\u00f6ker ni spelare f\u00f6r ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.<\/p>","id":192,"name":"S\u00f6ker spelare","parent":542,"position":0,"temporary":false,"gq_name":"S\u00f6ker spelare"},{"description":"H\u00e4r kan man sitta och titta p\u00e5 streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du f\u00e5r g\u00e4rna tipsa om ett evenemang.","id":543,"name":"Event-kanaler","parent":0,"position":11,"temporary":false,"gq_name":"Event-kanaler"},{"description":"","id":544,"name":"MS Presskonferens","parent":543,"position":10,"temporary":false,"gq_name":"MS Presskonferens"},{"description":"","id":546,"name":"Titta och diskutera","parent":544,"position":5,"temporary":false,"gq_name":"Titta och diskutera"},{"description":"","id":547,"name":"Tysta rummet","parent":544,"position":10,"temporary":false,"gq_name":"Tysta rummet"},{"description":"","id":548,"name":"Skyttegrav Free-2-Play Spelkv\u00e4llar","parent":543,"position":50,"temporary":false,"gq_name":"Skyttegrav Free-2-Play Spelkv\u00e4llar"},{"description":"","id":553,"name":"Trackmania 29 Okt","parent":548,"position":0,"temporary":false,"gq_name":"Trackmania 29 Okt"},{"description":"","id":549,"name":"Rum #1","parent":553,"position":0,"temporary":false,"gq_name":"Rum #1"},{"description":"","id":550,"name":"Rum #2","parent":553,"position":0,"temporary":false,"gq_name":"Rum #2"},{"description":"","id":558,"name":"DreamHack","parent":543,"position":100,"temporary":false,"gq_name":"DreamHack"}],"players":[{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":24306,"mute":false,"name":"pyootr","onlinesecs":24306,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":96,"suppress":true,"tcponly":false,"userid":66,"version":66053,"udpPing":51.1,"tcpPing":62.3,"gq_name":"pyootr","gq_ping":62.3,"gq_team":1,"gq_time":24306},{"bytespersec":0,"channel":1,"comment":"Serveransvarig & Admin<\/b> f\u00f6r Skyttegrav.se\/Sweclockers.com spelservrar. \n

Supervisor<\/b> hos Skyttegrav.se<\/a>.<\/p>","context":"","deaf":false,"identity":"","idlesecs":29126,"mute":false,"name":"[SG-SUP]Gix","onlinesecs":29154,"os":"X11","osversion":"Linux Mint 17 Qiana","release":"1.2.8-1~ppa1~trusty1","selfDeaf":false,"selfMute":false,"session":124,"suppress":true,"tcponly":false,"userid":47,"version":66056,"udpPing":29.21,"tcpPing":28.47,"gq_name":"[SG-SUP]Gix","gq_ping":28.47,"gq_team":1,"gq_time":29154},{"bytespersec":0,"channel":1,"comment":"JAG TROR DIG URKEL!\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":22621,"mute":false,"name":"Eyem-_-","onlinesecs":24847,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":176,"suppress":true,"tcponly":false,"userid":1001,"version":66052,"udpPing":17.33,"tcpPing":20.11,"gq_name":"Eyem-_-","gq_ping":20.11,"gq_team":1,"gq_time":24847},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1721,"mute":false,"name":"[SG-HA]Relemy","onlinesecs":29128,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":232,"suppress":true,"tcponly":false,"userid":1926,"version":66056,"udpPing":37.94,"tcpPing":42.24,"gq_name":"[SG-HA]Relemy","gq_ping":42.24,"gq_team":1,"gq_time":29128},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28863,"mute":false,"name":"TheLikus","onlinesecs":29008,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":269,"suppress":true,"tcponly":false,"userid":4120,"version":66056,"udpPing":11.01,"tcpPing":13.72,"gq_name":"TheLikus","gq_ping":13.72,"gq_team":1,"gq_time":29008},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":29137,"mute":false,"name":"Legoo","onlinesecs":29139,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":473,"suppress":true,"tcponly":false,"userid":1657,"version":66053,"udpPing":8.45,"tcpPing":23.04,"gq_name":"Legoo","gq_ping":23.04,"gq_team":1,"gq_time":29139},{"bytespersec":0,"channel":432,"comment":"http:\/\/www.twitch.tv\/tobbbe__<\/a>","context":"","deaf":false,"identity":"","idlesecs":841,"mute":false,"name":"[SweC]Tobbbe__","onlinesecs":29138,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":5,"suppress":false,"tcponly":false,"userid":3769,"version":66056,"udpPing":22.64,"tcpPing":24.04,"gq_name":"[SweC]Tobbbe__","gq_ping":24.04,"gq_team":432,"gq_time":29138},{"bytespersec":6870,"channel":432,"comment":"

<\/p>","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Vilse(SWE)","onlinesecs":16399,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":110,"suppress":false,"tcponly":false,"userid":4124,"version":66056,"udpPing":13.83,"tcpPing":16.21,"gq_name":"Vilse(SWE)","gq_ping":16.21,"gq_team":432,"gq_time":16399},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":23,"mute":false,"name":"Th3MadPanda","onlinesecs":29137,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":236,"suppress":false,"tcponly":false,"userid":2099,"version":66056,"udpPing":8.86,"tcpPing":11.72,"gq_name":"Th3MadPanda","gq_ping":11.72,"gq_team":432,"gq_time":29137},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":12,"mute":false,"name":"Mumin","onlinesecs":9347,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":306,"suppress":false,"tcponly":false,"userid":4125,"version":66056,"udpPing":19.05,"tcpPing":22.56,"gq_name":"Mumin","gq_ping":22.56,"gq_team":432,"gq_time":9347},{"bytespersec":0,"channel":432,"comment":"Greetinx Programs!<\/a> \n

\n

V\u00e4lkommen till SweClockers och Skyttegravs gemensamma Mumble!<\/p>\n

\n

Ni kan fr\u00e5ga mig om administrativa saker p\u00e5 servers eller mumble, jag \u00e4r huvudadmin f\u00f6r SweC g\u00e4nget och dessutom forumledare f\u00f6r SweClockers.com. H\u00e4r \u00e4r reglerna f\u00f6r mumble och SweC forum.<\/a><\/p>\n

<\/p>\n

Vi satsar p\u00e5 en trevlig st\u00e4mning online! :)<\/p>\n

","context":"","deaf":false,"identity":"","idlesecs":127,"mute":false,"name":"[SweC-H]Lan","onlinesecs":29132,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":353,"suppress":false,"tcponly":false,"userid":56,"version":66053,"udpPing":15.76,"tcpPing":35.22,"gq_name":"[SweC-H]Lan","gq_ping":35.22,"gq_team":432,"gq_time":29132},{"bytespersec":6865,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Gson","onlinesecs":4023,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":146,"suppress":false,"tcponly":false,"userid":4123,"version":66056,"udpPing":51.51,"tcpPing":57.29,"gq_name":"Gson","gq_ping":57.29,"gq_team":433,"gq_time":4023},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":15,"mute":false,"name":"lampan","onlinesecs":19196,"os":"Win","osversion":"6.2.9200.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":463,"suppress":false,"tcponly":false,"userid":3404,"version":66053,"udpPing":13.6,"tcpPing":16.66,"gq_name":"lampan","gq_ping":16.66,"gq_team":433,"gq_time":19196},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":773,"mute":false,"name":"[SweC-T]Grabbengr\u00e5","onlinesecs":28304,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":53,"suppress":false,"tcponly":false,"userid":1952,"version":66056,"udpPing":20.4,"tcpPing":22.68,"gq_name":"[SweC-T]Grabbengr\u00e5","gq_ping":22.68,"gq_team":451,"gq_time":28304},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1299,"mute":false,"name":"[SweC-H]Kinekin","onlinesecs":29134,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":180,"suppress":false,"tcponly":false,"userid":2426,"version":66056,"udpPing":49.78,"tcpPing":52.22,"gq_name":"[SweC-H]Kinekin","gq_ping":52.22,"gq_team":451,"gq_time":29134},{"bytespersec":0,"channel":451,"comment":"Det h\u00e4nder att jag spelar spel ibland.\n

<\/p>\n

<\/p>\n

<\/p>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":13,"mute":false,"name":"[SweC-T]DavidtheDoom","onlinesecs":29086,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":203,"suppress":false,"tcponly":false,"userid":3030,"version":66056,"udpPing":3.96,"tcpPing":5.61,"gq_name":"[SweC-T]DavidtheDoom","gq_ping":5.61,"gq_team":451,"gq_time":29086},{"bytespersec":0,"channel":451,"comment":"SweC spelservrar finns ocks\u00e5 p\u00e5 Facebook<\/a>","context":"","deaf":false,"identity":"","idlesecs":155,"mute":false,"name":"[SweC-H]Raven_cc","onlinesecs":21915,"os":"Win","osversion":"6.1.7600.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":264,"suppress":false,"tcponly":true,"userid":78,"version":66055,"udpPing":19.73,"tcpPing":25.93,"gq_name":"[SweC-H]Raven_cc","gq_ping":25.93,"gq_team":451,"gq_time":21915},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1628,"mute":false,"name":"OskarWallin","onlinesecs":12269,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":272,"suppress":false,"tcponly":false,"userid":3783,"version":66056,"udpPing":11.97,"tcpPing":31.09,"gq_name":"OskarWallin","gq_ping":31.09,"gq_team":451,"gq_time":12269},{"bytespersec":6658,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-A]Hitman","onlinesecs":29130,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":485,"suppress":false,"tcponly":true,"userid":76,"version":66056,"udpPing":21.36,"tcpPing":28,"gq_name":"[SweC-A]Hitman","gq_ping":28,"gq_team":451,"gq_time":29130},{"bytespersec":7223,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SG-A]bl0m1","onlinesecs":29107,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":488,"suppress":false,"tcponly":false,"userid":3447,"version":66056,"udpPing":40.3,"tcpPing":43.52,"gq_name":"[SG-A]bl0m1","gq_ping":43.52,"gq_team":451,"gq_time":29107},{"bytespersec":0,"channel":390,"comment":"","context":"","deaf":false,"identity":"","idlesecs":385,"mute":false,"name":"shifted","onlinesecs":385,"os":"Win","osversion":"6.2.9200.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":294,"suppress":false,"tcponly":false,"userid":4065,"version":66055,"udpPing":21.16,"tcpPing":21.38,"gq_name":"shifted","gq_ping":21.38,"gq_team":390,"gq_time":385},{"bytespersec":0,"channel":391,"comment":"","context":"","deaf":false,"identity":"","idlesecs":10201,"mute":false,"name":"Tennethe","onlinesecs":19638,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":152,"suppress":false,"tcponly":false,"userid":4081,"version":66056,"udpPing":28.6,"tcpPing":32.91,"gq_name":"Tennethe","gq_ping":32.91,"gq_team":391,"gq_time":19638},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":97,"mute":false,"name":"Figge86","onlinesecs":4319,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":259,"suppress":false,"tcponly":false,"userid":3459,"version":66056,"udpPing":15.4,"tcpPing":17.42,"gq_name":"Figge86","gq_ping":17.42,"gq_team":95,"gq_time":4319},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":99,"mute":false,"name":"sterner007","onlinesecs":9667,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":312,"suppress":false,"tcponly":false,"userid":3836,"version":66056,"udpPing":33.4,"tcpPing":36.36,"gq_name":"sterner007","gq_ping":36.36,"gq_team":95,"gq_time":9667},{"bytespersec":0,"channel":555,"comment":"","context":"","deaf":false,"identity":"","idlesecs":183,"mute":false,"name":"[SG]K\u00e5Be","onlinesecs":29128,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":12,"suppress":false,"tcponly":false,"userid":27,"version":66056,"udpPing":20.87,"tcpPing":24.01,"gq_name":"[SG]K\u00e5Be","gq_ping":24.01,"gq_team":555,"gq_time":29128},{"bytespersec":0,"channel":555,"comment":"beh\u00f6ver ni mig kalla\n

","context":"","deaf":false,"identity":"","idlesecs":188,"mute":false,"name":"[SG-SUP]strike","onlinesecs":5637,"os":"Win","osversion":"5.1.2600.1","release":"1.2.3","selfDeaf":false,"selfMute":false,"session":314,"suppress":false,"tcponly":false,"userid":19,"version":66051,"udpPing":21.27,"tcpPing":26.18,"gq_name":"[SG-SUP]strike","gq_ping":26.18,"gq_team":555,"gq_time":5637},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":35,"mute":false,"name":"Widoxz","onlinesecs":28334,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":24,"suppress":false,"tcponly":false,"userid":4058,"version":66056,"udpPing":35.75,"tcpPing":55.55,"gq_name":"Widoxz","gq_ping":55.55,"gq_team":492,"gq_time":28334},{"bytespersec":6890,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"FourO","onlinesecs":3421,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":131,"suppress":false,"tcponly":false,"userid":4111,"version":66056,"udpPing":9.7,"tcpPing":15.63,"gq_name":"FourO","gq_ping":15.63,"gq_team":492,"gq_time":3421},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3444,"mute":false,"name":"lemurtacos","onlinesecs":3445,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":185,"suppress":false,"tcponly":false,"userid":3827,"version":66056,"udpPing":9.85,"tcpPing":13.46,"gq_name":"lemurtacos","gq_ping":13.46,"gq_team":492,"gq_time":3445},{"bytespersec":8833,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"kaviar","onlinesecs":23142,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":349,"suppress":false,"tcponly":false,"userid":3759,"version":66056,"udpPing":11.66,"tcpPing":14.67,"gq_name":"kaviar","gq_ping":14.67,"gq_team":492,"gq_time":23142},{"bytespersec":9083,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"LillaEmma","onlinesecs":3957,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":419,"suppress":false,"tcponly":false,"userid":3758,"version":66056,"udpPing":10.31,"tcpPing":13.45,"gq_name":"LillaEmma","gq_ping":13.45,"gq_team":492,"gq_time":3957},{"bytespersec":0,"channel":218,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1698,"mute":false,"name":"Maichopalami","onlinesecs":4899,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":157,"suppress":false,"tcponly":false,"userid":1563,"version":66056,"udpPing":12.86,"tcpPing":15.14,"gq_name":"Maichopalami","gq_ping":15.14,"gq_team":218,"gq_time":4899},{"bytespersec":0,"channel":512,"comment":"","context":"","deaf":false,"identity":"","idlesecs":2640,"mute":false,"name":"[SG]Binge","onlinesecs":11586,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":333,"suppress":false,"tcponly":false,"userid":1837,"version":66056,"udpPing":22.69,"tcpPing":26,"gq_name":"[SG]Binge","gq_ping":26,"gq_team":512,"gq_time":11586},{"bytespersec":9014,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"shimmerghost","onlinesecs":17161,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":2347,"version":66052,"udpPing":30.95,"tcpPing":33.04,"gq_name":"shimmerghost","gq_ping":33.04,"gq_team":167,"gq_time":17161},{"bytespersec":8874,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Lankfisher","onlinesecs":17163,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":186,"suppress":false,"tcponly":false,"userid":4106,"version":66056,"udpPing":21.28,"tcpPing":23.3,"gq_name":"Lankfisher","gq_ping":23.3,"gq_team":167,"gq_time":17163},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1,"mute":false,"name":"AndreasLindgren","onlinesecs":5267,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":235,"suppress":false,"tcponly":false,"userid":2439,"version":66056,"udpPing":31.59,"tcpPing":17.07,"gq_name":"AndreasLindgren","gq_ping":17.07,"gq_team":167,"gq_time":5267},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":5210,"mute":false,"name":"Emmag","onlinesecs":5229,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":true,"session":300,"suppress":false,"tcponly":false,"userid":2438,"version":66052,"udpPing":24.04,"tcpPing":25.43,"gq_name":"Emmag","gq_ping":25.43,"gq_team":167,"gq_time":5229},{"bytespersec":0,"channel":383,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3961,"mute":false,"name":"Tobias","onlinesecs":8817,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":325,"suppress":false,"tcponly":false,"userid":3788,"version":66056,"udpPing":15.74,"tcpPing":22.28,"gq_name":"Tobias","gq_ping":22.28,"gq_team":383,"gq_time":8817}],"numplayers":38,"gq_online":true,"gq_address":"95.130.64.232","gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_type":"mumble","gq_name":"Mumble Server","gq_transport":"tcp","gq_joinlink":"mumble:\/\/95.130.64.232:64738\/","gq_dedicated":1,"gq_gametype":null,"gq_hostname":"Skyttegrav & SweClockers Mumble","gq_numplayers":38,"gq_maxplayers":"250"}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Stripcolors/cod4_1.json b/gameq/tests/Filters/Providers/Stripcolors/cod4_1.json deleted file mode 100644 index d0a5bc8..0000000 --- a/gameq/tests/Filters/Providers/Stripcolors/cod4_1.json +++ /dev/null @@ -1 +0,0 @@ -{"raw":{"66.150.121.164:28931":{"type":"0","sv_maxclients":"50","version":"CoD4 X 1.7a win_mingw-x86-testing build 3325 Jan 3 2015","shortversion":"1.7a","build":"3325","sv_floodprotect":"1","sv_maxRate":"25000","sv_voice":"0","sv_maxPing":"0","sv_minPing":"0","sv_hostname":"=^5|h4x|^7=^2War ^724\/7 ^2Server COD4","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_privateClients":"0","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:32:12 2016","uptime":"7 hours","g_gametype":"war","mapname":"mp_farm","sv_pure":"1","_Admin":"Admin","_admins_xfire":"= ghash1985,somal007","_Apply_Clan":"http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Email":"clanh4x@yahoo.com","_Website":"http:\/\/www.clanh4x.tk","_clanh4x_forums":"http:\/\/forum.clanh4x.tk","_clanh4x_facebook":"www.facebook.com\/clanh4x","_Recruiting":"_On http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Location":"U.S.","_Mod":"N\/A","_ModVer":"N\/A","g_compassShowEnemies":"0","gamename":"Call of Duty 4","players":[{"frags":"144","ping":"152","name":"theozsz","gq_name":"theozsz","gq_ping":"152","gq_score":"144"},{"frags":"30","ping":"150","name":"BeReKeTDeDe","gq_name":"BeReKeTDeDe","gq_ping":"150","gq_score":"30"},{"frags":"70","ping":"109","name":"ALFHA SNIPER","gq_name":"ALFHA SNIPER","gq_ping":"109","gq_score":"70"},{"frags":"20","ping":"172","name":"RODRIGOVI18C3","gq_name":"RODRIGOVI18C3","gq_ping":"172","gq_score":"20"},{"frags":"40","ping":"16","name":"Chazzzz","gq_name":"Chazzzz","gq_ping":"16","gq_score":"40"},{"frags":"102","ping":"111","name":"my name is jef","gq_name":"my name is jef","gq_ping":"111","gq_score":"102"},{"frags":"20","ping":"31","name":"Coolguy","gq_name":"Coolguy","gq_ping":"31","gq_score":"20"},{"frags":"12","ping":"74","name":"OhRobbie","gq_name":"OhRobbie","gq_ping":"74","gq_score":"12"},{"frags":"10","ping":"529","name":"david","gq_name":"david","gq_ping":"529","gq_score":"10"},{"frags":"70","ping":"343","name":"julian( CARP)","gq_name":"julian( CARP)","gq_ping":"343","gq_score":"70"},{"frags":"40","ping":"146","name":"Reuspect","gq_name":"Reuspect","gq_ping":"146","gq_score":"40"},{"frags":"150","ping":"161","name":"jirimun","gq_name":"jirimun","gq_ping":"161","gq_score":"150"},{"frags":"0","ping":"-1","name":"Nader","gq_name":"Nader","gq_ping":"-1","gq_score":"0"},{"frags":"40","ping":"243","name":"AdenPartin","gq_name":"AdenPartin","gq_ping":"243","gq_score":"40"},{"frags":"10","ping":"328","name":"bardzero","gq_name":"bardzero","gq_ping":"328","gq_score":"10"},{"frags":"70","ping":"140","name":"{h4x} Browly","gq_name":"{h4x} Browly","gq_ping":"140","gq_score":"70"},{"frags":"20","ping":"179","name":"PC07","gq_name":"PC07","gq_ping":"179","gq_score":"20"},{"frags":"54","ping":"30","name":"Killowatt","gq_name":"Killowatt","gq_ping":"30","gq_score":"54"},{"frags":"114","ping":"77","name":"DeChosenWon","gq_name":"DeChosenWon","gq_ping":"77","gq_score":"114"},{"frags":"150","ping":"31","name":"PatrickStar","gq_name":"PatrickStar","gq_ping":"31","gq_score":"150"},{"frags":"0","ping":"261","name":"patrik","gq_name":"patrik","gq_ping":"261","gq_score":"0"},{"frags":"0","ping":"119","name":"=|h4x|=essekiel","gq_name":"=|h4x|=essekiel","gq_ping":"119","gq_score":"0"},{"frags":"0","ping":"155","name":"uchache","gq_name":"uchache","gq_ping":"155","gq_score":"0"},{"frags":"10","ping":"114","name":"ANONYMOUS","gq_name":"ANONYMOUS","gq_ping":"114","gq_score":"10"},{"frags":"32","ping":"91","name":"la calabera","gq_name":"la calabera","gq_ping":"91","gq_score":"32"},{"frags":"0","ping":"54","name":"^4=|h4x|=Pred","gq_name":"^4=|h4x|=Pred","gq_ping":"54","gq_score":"0"},{"frags":"132","ping":"204","name":"Dead_shoot","gq_name":"Dead_shoot","gq_ping":"204","gq_score":"132"},{"frags":"26","ping":"99","name":"KRATOS","gq_name":"KRATOS","gq_ping":"99","gq_score":"26"},{"frags":"72","ping":"117","name":"Fuhrer","gq_name":"Fuhrer","gq_ping":"117","gq_score":"72"}],"clients":29,"gq_online":true,"gq_address":"66.150.121.164","gq_port_client":28931,"gq_port_query":28931,"gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"=^5|h4x|^7=^2War ^724\/7 ^2Server COD4","gq_mapname":"mp_farm","gq_maxplayers":"50","gq_mod":"war","gq_numplayers":29,"gq_password":null,"teams":[]}},"filtered":{"66.150.121.164:28931":{"type":"0","sv_maxclients":"50","version":"CoD4 X 1.7a win_mingw-x86-testing build 3325 Jan 3 2015","shortversion":"1.7a","build":"3325","sv_floodprotect":"1","sv_maxRate":"25000","sv_voice":"0","sv_maxPing":"0","sv_minPing":"0","sv_hostname":"=|h4x|=War 24\/7 Server COD4","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_privateClients":"0","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:32:12 2016","uptime":"7 hours","g_gametype":"war","mapname":"mp_farm","sv_pure":"1","_Admin":"Admin","_admins_xfire":"= ghash1985,somal007","_Apply_Clan":"http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Email":"clanh4x@yahoo.com","_Website":"http:\/\/www.clanh4x.tk","_clanh4x_forums":"http:\/\/forum.clanh4x.tk","_clanh4x_facebook":"www.facebook.com\/clanh4x","_Recruiting":"_On http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Location":"U.S.","_Mod":"N\/A","_ModVer":"N\/A","g_compassShowEnemies":"0","gamename":"Call of Duty 4","players":[{"frags":"144","ping":"152","name":"theozsz","gq_name":"theozsz","gq_ping":"152","gq_score":"144"},{"frags":"30","ping":"150","name":"BeReKeTDeDe","gq_name":"BeReKeTDeDe","gq_ping":"150","gq_score":"30"},{"frags":"70","ping":"109","name":"ALFHA SNIPER","gq_name":"ALFHA SNIPER","gq_ping":"109","gq_score":"70"},{"frags":"20","ping":"172","name":"RODRIGOVI18C3","gq_name":"RODRIGOVI18C3","gq_ping":"172","gq_score":"20"},{"frags":"40","ping":"16","name":"Chazzzz","gq_name":"Chazzzz","gq_ping":"16","gq_score":"40"},{"frags":"102","ping":"111","name":"my name is jef","gq_name":"my name is jef","gq_ping":"111","gq_score":"102"},{"frags":"20","ping":"31","name":"Coolguy","gq_name":"Coolguy","gq_ping":"31","gq_score":"20"},{"frags":"12","ping":"74","name":"OhRobbie","gq_name":"OhRobbie","gq_ping":"74","gq_score":"12"},{"frags":"10","ping":"529","name":"david","gq_name":"david","gq_ping":"529","gq_score":"10"},{"frags":"70","ping":"343","name":"julian( CARP)","gq_name":"julian( CARP)","gq_ping":"343","gq_score":"70"},{"frags":"40","ping":"146","name":"Reuspect","gq_name":"Reuspect","gq_ping":"146","gq_score":"40"},{"frags":"150","ping":"161","name":"jirimun","gq_name":"jirimun","gq_ping":"161","gq_score":"150"},{"frags":"0","ping":"-1","name":"Nader","gq_name":"Nader","gq_ping":"-1","gq_score":"0"},{"frags":"40","ping":"243","name":"AdenPartin","gq_name":"AdenPartin","gq_ping":"243","gq_score":"40"},{"frags":"10","ping":"328","name":"bardzero","gq_name":"bardzero","gq_ping":"328","gq_score":"10"},{"frags":"70","ping":"140","name":"{h4x} Browly","gq_name":"{h4x} Browly","gq_ping":"140","gq_score":"70"},{"frags":"20","ping":"179","name":"PC07","gq_name":"PC07","gq_ping":"179","gq_score":"20"},{"frags":"54","ping":"30","name":"Killowatt","gq_name":"Killowatt","gq_ping":"30","gq_score":"54"},{"frags":"114","ping":"77","name":"DeChosenWon","gq_name":"DeChosenWon","gq_ping":"77","gq_score":"114"},{"frags":"150","ping":"31","name":"PatrickStar","gq_name":"PatrickStar","gq_ping":"31","gq_score":"150"},{"frags":"0","ping":"261","name":"patrik","gq_name":"patrik","gq_ping":"261","gq_score":"0"},{"frags":"0","ping":"119","name":"=|h4x|=essekiel","gq_name":"=|h4x|=essekiel","gq_ping":"119","gq_score":"0"},{"frags":"0","ping":"155","name":"uchache","gq_name":"uchache","gq_ping":"155","gq_score":"0"},{"frags":"10","ping":"114","name":"ANONYMOUS","gq_name":"ANONYMOUS","gq_ping":"114","gq_score":"10"},{"frags":"32","ping":"91","name":"la calabera","gq_name":"la calabera","gq_ping":"91","gq_score":"32"},{"frags":"0","ping":"54","name":"=|h4x|=Pred","gq_name":"=|h4x|=Pred","gq_ping":"54","gq_score":"0"},{"frags":"132","ping":"204","name":"Dead_shoot","gq_name":"Dead_shoot","gq_ping":"204","gq_score":"132"},{"frags":"26","ping":"99","name":"KRATOS","gq_name":"KRATOS","gq_ping":"99","gq_score":"26"},{"frags":"72","ping":"117","name":"Fuhrer","gq_name":"Fuhrer","gq_ping":"117","gq_score":"72"}],"clients":"29","gq_online":"1","gq_address":"66.150.121.164","gq_port_client":"28931","gq_port_query":"28931","gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"=|h4x|=War 24\/7 Server COD4","gq_mapname":"mp_farm","gq_maxplayers":"50","gq_mod":"war","gq_numplayers":"29","gq_password":"","teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Stripcolors/cod4_2.json b/gameq/tests/Filters/Providers/Stripcolors/cod4_2.json deleted file mode 100644 index 4f63375..0000000 --- a/gameq/tests/Filters/Providers/Stripcolors/cod4_2.json +++ /dev/null @@ -1 +0,0 @@ -{"raw":{"192.99.12.215:28960":{"type":"0","sv_maxclients":"52","sv_privateclients":"4","sv_punkbuster":"0","version":"CoD4 X 1.7a linux-i386-custom_debug-gauth build 3483 Jan 26 2016","shortversion":"1.7a","build":"3483","sv_hostname":"^2N^1i^2NJA|^5HighJump ^3TDM","sv_minPing":"0","sv_maxPing":"0","sv_voice":"0","g_gametype":"war","sv_maxRate":"100000","sv_floodprotect":"1","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:27:13 2016","uptime":"4 hours","mapname":"mp_backlot","sv_pure":"1","_Admin":"i-G.Admin Team","_Website":"www.NiNJA-Gaming.org","_Location":"Canada","gamename":"Call of Duty 4","g_compassShowEnemies":"0","_ModVer":"6.7","_ModBuild":"1530","_ModBuildTime":"02-17-2016 07:35 PM","_MapInfo":"Showdown,Backlot,Broadcast","players":[{"frags":"282","ping":"33","name":"crazychick","gq_name":"crazychick","gq_ping":"33","gq_score":"282"},{"frags":"110","ping":"106","name":"JLG-NoWar","gq_name":"JLG-NoWar","gq_ping":"106","gq_score":"110"},{"frags":"20","ping":"170","name":"Cav92","gq_name":"Cav92","gq_ping":"170","gq_score":"20"},{"frags":"90","ping":"161","name":"EL-PANADERO","gq_name":"EL-PANADERO","gq_ping":"161","gq_score":"90"},{"frags":"64","ping":"29","name":"grayson","gq_name":"grayson","gq_ping":"29","gq_score":"64"},{"frags":"0","ping":"0","name":"Yourself","gq_name":"Yourself","gq_ping":"0","gq_score":"0"},{"frags":"20","ping":"47","name":"Blake","gq_name":"Blake","gq_ping":"47","gq_score":"20"},{"frags":"0","ping":"0","name":"A Baby","gq_name":"A Baby","gq_ping":"0","gq_score":"0"},{"frags":"0","ping":"0","name":"LOL!!!","gq_name":"LOL!!!","gq_ping":"0","gq_score":"0"},{"frags":"312","ping":"44","name":"Red-Rider","gq_name":"Red-Rider","gq_ping":"44","gq_score":"312"},{"frags":"82","ping":"129","name":"Mylloca","gq_name":"Mylloca","gq_ping":"129","gq_score":"82"},{"frags":"0","ping":"91","name":"Brannn","gq_name":"Brannn","gq_ping":"91","gq_score":"0"},{"frags":"20","ping":"33","name":"OldMan","gq_name":"OldMan","gq_ping":"33","gq_score":"20"},{"frags":"296","ping":"146","name":"GATITOBROSXD","gq_name":"GATITOBROSXD","gq_ping":"146","gq_score":"296"},{"frags":"150","ping":"32","name":"THENOOB","gq_name":"THENOOB","gq_ping":"32","gq_score":"150"},{"frags":"180","ping":"30","name":"Megatron","gq_name":"Megatron","gq_ping":"30","gq_score":"180"},{"frags":"60","ping":"90","name":"USS_MY_DICK","gq_name":"USS_MY_DICK","gq_ping":"90","gq_score":"60"},{"frags":"0","ping":"47","name":"Bellmore","gq_name":"Bellmore","gq_ping":"47","gq_score":"0"},{"frags":"292","ping":"91","name":"redwhite","gq_name":"redwhite","gq_ping":"91","gq_score":"292"},{"frags":"50","ping":"114","name":"Rambo_DZ","gq_name":"Rambo_DZ","gq_ping":"114","gq_score":"50"},{"frags":"770","ping":"106","name":"^3^1^3^4Vkk.","gq_name":"^3^1^3^4Vkk.","gq_ping":"106","gq_score":"770"},{"frags":"0","ping":"212","name":"Tal3aT Ghosts","gq_name":"Tal3aT Ghosts","gq_ping":"212","gq_score":"0"},{"frags":"560","ping":"88","name":"La Barbie","gq_name":"La Barbie","gq_ping":"88","gq_score":"560"},{"frags":"120","ping":"51","name":"JOHN","gq_name":"JOHN","gq_ping":"51","gq_score":"120"},{"frags":"200","ping":"86","name":"Donkanyar","gq_name":"Donkanyar","gq_ping":"86","gq_score":"200"},{"frags":"380","ping":"119","name":"**[FY]**Danny..","gq_name":"**[FY]**Danny..","gq_ping":"119","gq_score":"380"},{"frags":"240","ping":"170","name":"kyo","gq_name":"kyo","gq_ping":"170","gq_score":"240"},{"frags":"82","ping":"138","name":"Agar__DZ","gq_name":"Agar__DZ","gq_ping":"138","gq_score":"82"},{"frags":"664","ping":"44","name":"DigitalKaos","gq_name":"DigitalKaos","gq_ping":"44","gq_score":"664"}],"clients":29,"gq_online":true,"gq_address":"192.99.12.215","gq_port_client":28960,"gq_port_query":28960,"gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"^2N^1i^2NJA|^5HighJump ^3TDM","gq_mapname":"mp_backlot","gq_maxplayers":"52","gq_mod":"war","gq_numplayers":29,"gq_password":null,"teams":[]}},"filtered":{"192.99.12.215:28960":{"type":"0","sv_maxclients":"52","sv_privateclients":"4","sv_punkbuster":"0","version":"CoD4 X 1.7a linux-i386-custom_debug-gauth build 3483 Jan 26 2016","shortversion":"1.7a","build":"3483","sv_hostname":"NiNJA|HighJump TDM","sv_minPing":"0","sv_maxPing":"0","sv_voice":"0","g_gametype":"war","sv_maxRate":"100000","sv_floodprotect":"1","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","protocol":"6","sv_disableClientConsole":"0","g_mapStartTime":"Sat Feb 20 18:27:13 2016","uptime":"4 hours","mapname":"mp_backlot","sv_pure":"1","_Admin":"i-G.Admin Team","_Website":"www.NiNJA-Gaming.org","_Location":"Canada","gamename":"Call of Duty 4","g_compassShowEnemies":"0","_ModVer":"6.7","_ModBuild":"1530","_ModBuildTime":"02-17-2016 07:35 PM","_MapInfo":"Showdown,Backlot,Broadcast","players":[{"frags":"282","ping":"33","name":"crazychick","gq_name":"crazychick","gq_ping":"33","gq_score":"282"},{"frags":"110","ping":"106","name":"JLG-NoWar","gq_name":"JLG-NoWar","gq_ping":"106","gq_score":"110"},{"frags":"20","ping":"170","name":"Cav92","gq_name":"Cav92","gq_ping":"170","gq_score":"20"},{"frags":"90","ping":"161","name":"EL-PANADERO","gq_name":"EL-PANADERO","gq_ping":"161","gq_score":"90"},{"frags":"64","ping":"29","name":"grayson","gq_name":"grayson","gq_ping":"29","gq_score":"64"},{"frags":"0","ping":"0","name":"Yourself","gq_name":"Yourself","gq_ping":"0","gq_score":"0"},{"frags":"20","ping":"47","name":"Blake","gq_name":"Blake","gq_ping":"47","gq_score":"20"},{"frags":"0","ping":"0","name":"A Baby","gq_name":"A Baby","gq_ping":"0","gq_score":"0"},{"frags":"0","ping":"0","name":"LOL!!!","gq_name":"LOL!!!","gq_ping":"0","gq_score":"0"},{"frags":"312","ping":"44","name":"Red-Rider","gq_name":"Red-Rider","gq_ping":"44","gq_score":"312"},{"frags":"82","ping":"129","name":"Mylloca","gq_name":"Mylloca","gq_ping":"129","gq_score":"82"},{"frags":"0","ping":"91","name":"Brannn","gq_name":"Brannn","gq_ping":"91","gq_score":"0"},{"frags":"20","ping":"33","name":"OldMan","gq_name":"OldMan","gq_ping":"33","gq_score":"20"},{"frags":"296","ping":"146","name":"GATITOBROSXD","gq_name":"GATITOBROSXD","gq_ping":"146","gq_score":"296"},{"frags":"150","ping":"32","name":"THENOOB","gq_name":"THENOOB","gq_ping":"32","gq_score":"150"},{"frags":"180","ping":"30","name":"Megatron","gq_name":"Megatron","gq_ping":"30","gq_score":"180"},{"frags":"60","ping":"90","name":"USS_MY_DICK","gq_name":"USS_MY_DICK","gq_ping":"90","gq_score":"60"},{"frags":"0","ping":"47","name":"Bellmore","gq_name":"Bellmore","gq_ping":"47","gq_score":"0"},{"frags":"292","ping":"91","name":"redwhite","gq_name":"redwhite","gq_ping":"91","gq_score":"292"},{"frags":"50","ping":"114","name":"Rambo_DZ","gq_name":"Rambo_DZ","gq_ping":"114","gq_score":"50"},{"frags":"770","ping":"106","name":"Vkk.","gq_name":"Vkk.","gq_ping":"106","gq_score":"770"},{"frags":"0","ping":"212","name":"Tal3aT Ghosts","gq_name":"Tal3aT Ghosts","gq_ping":"212","gq_score":"0"},{"frags":"560","ping":"88","name":"La Barbie","gq_name":"La Barbie","gq_ping":"88","gq_score":"560"},{"frags":"120","ping":"51","name":"JOHN","gq_name":"JOHN","gq_ping":"51","gq_score":"120"},{"frags":"200","ping":"86","name":"Donkanyar","gq_name":"Donkanyar","gq_ping":"86","gq_score":"200"},{"frags":"380","ping":"119","name":"**[FY]**Danny..","gq_name":"**[FY]**Danny..","gq_ping":"119","gq_score":"380"},{"frags":"240","ping":"170","name":"kyo","gq_name":"kyo","gq_ping":"170","gq_score":"240"},{"frags":"82","ping":"138","name":"Agar__DZ","gq_name":"Agar__DZ","gq_ping":"138","gq_score":"82"},{"frags":"664","ping":"44","name":"DigitalKaos","gq_name":"DigitalKaos","gq_ping":"44","gq_score":"664"}],"clients":"29","gq_online":"1","gq_address":"192.99.12.215","gq_port_client":"28960","gq_port_query":"28960","gq_protocol":"quake3","gq_type":"cod4","gq_name":"Call of Duty 4","gq_transport":"udp","gq_joinlink":"","gq_gametype":"Call of Duty 4","gq_hostname":"NiNJA|HighJump TDM","gq_mapname":"mp_backlot","gq_maxplayers":"52","gq_mod":"war","gq_numplayers":"29","gq_password":"","teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Providers/Stripcolors/minecraft_1.json b/gameq/tests/Filters/Providers/Stripcolors/minecraft_1.json deleted file mode 100644 index a528673..0000000 --- a/gameq/tests/Filters/Providers/Stripcolors/minecraft_1.json +++ /dev/null @@ -1 +0,0 @@ -{"raw":{"64.34.190.101:28965":{"hostname":"TotalFreedom - for Minecraft 1.8.3","gametype":"SMP","game_id":"MINECRAFT","version":"1.8.8","plugins":"CraftBukkit on Bukkit 1.8.8-R0.1-SNAPSHOT: Chairs 4.6; WorldEdit 6.0.2-TF,no_git_id; BookExploitFix 0.6; PlayerParticles 2.7; PortalGun 3.0.1; BukkitTelnet 4.1; ProtocolLib 3.6.3-SNAPSHOT; AcidFreedom 1.6.1; EchoPet 2.8.1-SNAPSHOT-b70; Lift 51; Essentials TeamCity; EssentialsSpawn TeamCity; SkinsRestorer 10.2; Movecraft 4.0.1; TotalFreedomMod 4.3","map":"TsuchiIwa","numplayers":"34","maxplayers":"45","hostport":"28965","hostip":"64.34.190.101","players":[{"player":"BerserkCreepah","gq_name":"BerserkCreepah"},{"player":"TheBigProBG","gq_name":"TheBigProBG"},{"player":"Musebrat2","gq_name":"Musebrat2"},{"player":"SansLeSk3leton","gq_name":"SansLeSk3leton"},{"player":"xXBrownieXx","gq_name":"xXBrownieXx"},{"player":"rovertdude","gq_name":"rovertdude"},{"player":"xXElectricMCXx","gq_name":"xXElectricMCXx"},{"player":"TaahThePhoenix","gq_name":"TaahThePhoenix"},{"player":"xXSpiritAnimalXx","gq_name":"xXSpiritAnimalXx"},{"player":"slyfox13","gq_name":"slyfox13"},{"player":"ElementalDreamer","gq_name":"ElementalDreamer"},{"player":"mirandacosgrove","gq_name":"mirandacosgrove"},{"player":"xNotCreater","gq_name":"xNotCreater"},{"player":"CodFish48","gq_name":"CodFish48"},{"player":"camron315","gq_name":"camron315"},{"player":"looky556","gq_name":"looky556"},{"player":"MC_SparkieGaming","gq_name":"MC_SparkieGaming"},{"player":"NebelCan_","gq_name":"NebelCan_"},{"player":"monkeyaom","gq_name":"monkeyaom"},{"player":"InsideOutMcJr","gq_name":"InsideOutMcJr"},{"player":"Codanator_1","gq_name":"Codanator_1"},{"player":"Player","gq_name":"Player"},{"player":"HoneydewHolt","gq_name":"HoneydewHolt"},{"player":"XGreenPlayz12","gq_name":"XGreenPlayz12"},{"player":"Error","gq_name":"Error"},{"player":"PolarShotgun","gq_name":"PolarShotgun"},{"player":"CmanX312","gq_name":"CmanX312"},{"player":"Bloody_Zombie23","gq_name":"Bloody_Zombie23"},{"player":"CheerioCrumpets","gq_name":"CheerioCrumpets"},{"player":"PikasX","gq_name":"PikasX"},{"player":"Dakota7413","gq_name":"Dakota7413"},{"player":"GalaxyGirl2203","gq_name":"GalaxyGirl2203"},{"player":"DanTDM","gq_name":"DanTDM"},{"player":"zCyberrr","gq_name":"zCyberrr"}],"dedicated":1,"password":0,"gq_online":true,"gq_address":"64.34.190.101","gq_port_client":28965,"gq_port_query":28965,"gq_protocol":"gamespy3","gq_type":"minecraft","gq_name":"Minecraft","gq_transport":"udp","gq_joinlink":"minecraft:\/\/64.34.190.101:28965\/","gq_dedicated":1,"gq_gametype":"MINECRAFT","gq_hostname":"TotalFreedom - for Minecraft 1.8.3","gq_mapname":"TsuchiIwa","gq_maxplayers":"45","gq_numplayers":"34","gq_password":0,"teams":[]}},"filtered":{"64.34.190.101:28965":{"hostname":"TotalFreedom - for Minecraft 1.8.3","gametype":"SMP","game_id":"MINECRAFT","version":"1.8.8","plugins":"CraftBukkit on Bukkit 1.8.8-R0.1-SNAPSHOT: Chairs 4.6; WorldEdit 6.0.2-TF,no_git_id; BookExploitFix 0.6; PlayerParticles 2.7; PortalGun 3.0.1; BukkitTelnet 4.1; ProtocolLib 3.6.3-SNAPSHOT; AcidFreedom 1.6.1; EchoPet 2.8.1-SNAPSHOT-b70; Lift 51; Essentials TeamCity; EssentialsSpawn TeamCity; SkinsRestorer 10.2; Movecraft 4.0.1; TotalFreedomMod 4.3","map":"TsuchiIwa","numplayers":"34","maxplayers":"45","hostport":"28965","hostip":"64.34.190.101","players":[{"player":"BerserkCreepah","gq_name":"BerserkCreepah"},{"player":"TheBigProBG","gq_name":"TheBigProBG"},{"player":"Musebrat2","gq_name":"Musebrat2"},{"player":"SansLeSk3leton","gq_name":"SansLeSk3leton"},{"player":"xXBrownieXx","gq_name":"xXBrownieXx"},{"player":"rovertdude","gq_name":"rovertdude"},{"player":"xXElectricMCXx","gq_name":"xXElectricMCXx"},{"player":"TaahThePhoenix","gq_name":"TaahThePhoenix"},{"player":"xXSpiritAnimalXx","gq_name":"xXSpiritAnimalXx"},{"player":"slyfox13","gq_name":"slyfox13"},{"player":"ElementalDreamer","gq_name":"ElementalDreamer"},{"player":"mirandacosgrove","gq_name":"mirandacosgrove"},{"player":"xNotCreater","gq_name":"xNotCreater"},{"player":"CodFish48","gq_name":"CodFish48"},{"player":"camron315","gq_name":"camron315"},{"player":"looky556","gq_name":"looky556"},{"player":"MC_SparkieGaming","gq_name":"MC_SparkieGaming"},{"player":"NebelCan_","gq_name":"NebelCan_"},{"player":"monkeyaom","gq_name":"monkeyaom"},{"player":"InsideOutMcJr","gq_name":"InsideOutMcJr"},{"player":"Codanator_1","gq_name":"Codanator_1"},{"player":"Player","gq_name":"Player"},{"player":"HoneydewHolt","gq_name":"HoneydewHolt"},{"player":"XGreenPlayz12","gq_name":"XGreenPlayz12"},{"player":"Error","gq_name":"Error"},{"player":"PolarShotgun","gq_name":"PolarShotgun"},{"player":"CmanX312","gq_name":"CmanX312"},{"player":"Bloody_Zombie23","gq_name":"Bloody_Zombie23"},{"player":"CheerioCrumpets","gq_name":"CheerioCrumpets"},{"player":"PikasX","gq_name":"PikasX"},{"player":"Dakota7413","gq_name":"Dakota7413"},{"player":"GalaxyGirl2203","gq_name":"GalaxyGirl2203"},{"player":"DanTDM","gq_name":"DanTDM"},{"player":"zCyberrr","gq_name":"zCyberrr"}],"dedicated":"1","password":"0","gq_online":"1","gq_address":"64.34.190.101","gq_port_client":"28965","gq_port_query":"28965","gq_protocol":"gamespy3","gq_type":"minecraft","gq_name":"Minecraft","gq_transport":"udp","gq_joinlink":"minecraft:\/\/64.34.190.101:28965\/","gq_dedicated":"1","gq_gametype":"MINECRAFT","gq_hostname":"TotalFreedom - for Minecraft 1.8.3","gq_mapname":"TsuchiIwa","gq_maxplayers":"45","gq_numplayers":"34","gq_password":"0","teams":[]}}} \ No newline at end of file diff --git a/gameq/tests/Filters/Secondstohuman.php b/gameq/tests/Filters/Secondstohuman.php deleted file mode 100644 index 36b171c..0000000 --- a/gameq/tests/Filters/Secondstohuman.php +++ /dev/null @@ -1,142 +0,0 @@ -. - */ - -namespace GameQ\Tests\Filters; - -/** - * Class for testing Secondstohuman filter - * - * @package GameQ\Tests\Filters - */ -class Secondstohuman extends Base -{ - - /** - * Test default filter settings - */ - public function testFilteredDefault() - { - $data = [ - 'time' => 8634.0791015625, //02:23:54 - 'players' => [ - [ - 'name' => 'fake_player1', - 'time' => 7650.4604492188 //02:07:30 - ], - [ - 'name' => 'fake_player2', - 'time_conn' => 1333.1260986328 //00:22:13 - ], - ], - ]; - - $dataAfter = [ - 'time' => 8634.0791015625, //02:23:54 - 'gq_time_human' => '02:23:54', - 'players' => [ - [ - 'name' => 'fake_player1', - 'time' => 7650.4604492188, //02:07:30 - 'gq_time_human' => '02:07:30', - ], - [ - 'name' => 'fake_player2', - 'time_conn' => 1333.1260986328, //00:22:13 - ], - ], - ]; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'css', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Create a mock filter - $filter = $this->getMockBuilder('\GameQ\Filters\Secondstohuman') - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($dataAfter, $filter->apply($data, $server)); - } - - /** - * Test the filter for Seconds to human using custom keys - */ - public function testFilteredCustom() - { - $data = [ - 'time' => 8634.0791015625, //02:23:54 - 'players' => [ - [ - 'name' => 'fake_player1', - 'time' => 7650.4604492188 //02:07:30 - ], - [ - 'name' => 'fake_player2', - 'time_conn' => 1333.1260986328 //00:22:13 - ], - ], - ]; - - $dataAfter = [ - 'time' => 8634.0791015625, //02:23:54 - 'gq_time_human' => '02:23:54', - 'players' => [ - [ - 'name' => 'fake_player1', - 'time' => 7650.4604492188, //02:07:30 - 'gq_time_human' => '02:07:30', - ], - [ - 'name' => 'fake_player2', - 'time_conn' => 1333.1260986328, //00:22:13 - 'gq_time_conn_human' => '00:22:13', - ], - ], - ]; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'css', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Create a mock filter - $filter = $this->getMockBuilder('\GameQ\Filters\Secondstohuman') - ->setConstructorArgs([ - [ - \GameQ\Filters\Secondstohuman::OPTION_TIMEKEYS => ['time', 'time_conn'], - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($dataAfter, $filter->apply($data, $server)); - } -} diff --git a/gameq/tests/Filters/Stripcolors.php b/gameq/tests/Filters/Stripcolors.php deleted file mode 100644 index 54c93c9..0000000 --- a/gameq/tests/Filters/Stripcolors.php +++ /dev/null @@ -1,86 +0,0 @@ -. - */ - -namespace GameQ\Tests\Filters; - -/** - * Class for testing Stripcolors filter - * - * @package GameQ\Tests\Filters - */ -class Stripcolors extends Base -{ - - /** - * Test the filter for Stripcolors - * - * @dataProvider loadData - * - * @param $protocol - * @param $raw - * @param $filtered - */ - public function testFiltered($protocol, $raw, $filtered) - { - - // Pop the key from the raw response - $host = key($raw); - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => $host, - \GameQ\Server::SERVER_TYPE => $protocol, - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Create a mock filter - $filter = $this->getMockBuilder('\GameQ\Filters\Stripcolors') - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($filtered[$host], $filter->apply($raw[$host], $server)); - } - - /** - * Test for empty data pass to filter - */ - public function testEmpty() - { - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:28960', - \GameQ\Server::SERVER_TYPE => 'quake3', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Create a mock filter - $filter = $this->getMockBuilder('\GameQ\Filters\Stripcolors') - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEmpty($filter->apply([], $server)); - } -} diff --git a/gameq/tests/GameQ.php b/gameq/tests/GameQ.php deleted file mode 100644 index f69b272..0000000 --- a/gameq/tests/GameQ.php +++ /dev/null @@ -1,280 +0,0 @@ -. - */ - -namespace GameQ\Tests; - -/** - * GameQ tests class - * - * @package GameQ\Tests - */ -class GameQ extends TestBase -{ - - /** - * Holds stub on setup - * - * @type \GameQ\GameQ - */ - protected $stub; - - /** - * Setup to create our stub - */ - public function setUp() - { - $this->stub = $this->getMockBuilder('\GameQ\GameQ') - ->enableProxyingToOriginalMethods() - ->setMethods(['__get', '__set']) - ->getMock(); - } - - /** - * Test factory - */ - public function testFactory() - { - - $this->assertInstanceOf('\GameQ\GameQ', \GameQ\GameQ::factory()); - } - - /** - * Test getters and setters - */ - public function testGetSetOptions() - { - // Test null return for missing option - $this->assertNull($this->stub->invalidoption); - - $this->stub->option1 = 'value1'; - - // Verify the pull is correct - $this->assertEquals('value1', $this->stub->option1); - - // Use set option chainable - $this->stub->setOption('option1', 'value2'); - - // Verify the pull is correct - $this->assertEquals('value2', $this->stub->option1); - } - - /** - * Test adding/removing servers - */ - public function testAddServer() - { - - // Define some servers - $servers = [ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'css', - ], - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27016', - \GameQ\Server::SERVER_TYPE => 'css', - ], - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27017', - \GameQ\Server::SERVER_TYPE => 'css', - ], - ]; - - // Test single add server - $this->stub->addServer($servers[0]); - - $this->assertCount(1, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); - - // Clear the servers - $this->stub->clearServers(); - - $this->assertCount(0, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); - - // Add multiple servers - $this->stub->addServers($servers); - - $this->assertCount(3, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); - - $this->stub->clearServers(); - } - - /** - * Test adding servers from files - * - * @depends testAddServer - */ - public function testAddServersFromFiles() - { - - // Test single file - $this->stub->addServersFromFiles(__DIR__ . '/Protocols/Providers/server_list1.json'); - - $this->assertCount(2, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); - - $this->stub->clearServers(); - - // Test adding from json array of files - $this->stub->addServersFromFiles([ - __DIR__ . '/Protocols/Providers/server_list1.json', - ]); - - $this->assertCount(2, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); - - $this->stub->clearServers(); - - // Test adding bad file - $this->stub->addServersFromFiles([ - __DIR__ . '/Protocols/Providers/server_list_bad.json', - ]); - - // No servers should exist - $this->assertCount(0, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); - - $this->stub->clearServers(); - - // Test inaccessible file - $this->stub->addServersFromFiles(__DIR__ . '/Protocols/Providers/server_listDoesnotexist.json'); - - // No servers should exist - $this->assertCount(0, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'servers')); - - $this->stub->clearServers(); - } - - /** - * Test adding/removing filters - */ - public function testFiltersAddRemove() - { - - // Add filter - $this->stub->addFilter('test_filter'); - - $this->assertArrayHasKey( - 'test_filter_d751713988987e9331980363e24189ce', - \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] - ); - - // Remove filter - $this->stub->removeFilter('test_filter_d751713988987e9331980363e24189ce'); - - $this->assertArrayNotHasKey( - 'test_filter_d751713988987e9331980363e24189ce', - \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] - ); - - // Test for lower case always - $this->stub->addFilter('tEst_fiLTEr'); - - $this->assertArrayHasKey( - 'test_filter_d751713988987e9331980363e24189ce', - \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] - ); - - // Remove filter always lower case - $this->stub->removeFilter('tEst_fiLTEr_d751713988987e9331980363e24189ce'); - - $this->assertArrayNotHasKey( - 'test_filter_d751713988987e9331980363e24189ce', - \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')['filters'] - ); - } - - /** - * Test filter application - */ - public function testFilterApply() - { - - // Define some fake results - $fakeResults = [ - 'key1' => 'val1', - 'key2' => 'val2', - ]; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'css', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->stub->setOption('debug', false); - $this->stub->removeFilter('normalize_d751713988987e9331980363e24189ce'); - $this->stub->addFilter('test'); - - // Reflect on GameQ class so we can parse - $gameq = new \ReflectionClass($this->stub); - - // Get the parse method so we can call it - $method = $gameq->getMethod('doApplyFilters'); - - // Set the method to accessible - $method->setAccessible(true); - - $testResult = $method->invoke($this->stub, $fakeResults, $server); - - $this->assertEquals($fakeResults, $testResult); - } - - /** - * Test for bad filter and no exception is thrown - */ - public function testBadFilterException() - { - - // Define some fake results - $fakeResults = [ - 'key1' => 'val1', - 'key2' => 'val2', - ]; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'css', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->stub->setOption('debug', false); - $this->stub->removeFilter('normalize_d751713988987e9331980363e24189ce'); - $this->stub->addFilter('some_bad_filter'); - - // Reflect on GameQ class so we can parse - $gameq = new \ReflectionClass($this->stub); - - // Get the parse method so we can call it - $method = $gameq->getMethod('doApplyFilters'); - - // Set the method to accessible - $method->setAccessible(true); - - // No changes should be made - $testResult = $method->invoke($this->stub, $fakeResults, $server); - - $this->assertEquals($fakeResults, $testResult); - } -} diff --git a/gameq/tests/Issues/Issue307.php b/gameq/tests/Issues/Issue307.php deleted file mode 100644 index 3ef2bc6..0000000 --- a/gameq/tests/Issues/Issue307.php +++ /dev/null @@ -1,80 +0,0 @@ -. - */ - -namespace GameQ\Tests\Issues; - -use GameQ\Tests\TestBase; - -/** - * Class Issue307 - * - * Test for issue #307 - https://github.com/Austinb/GameQ/issues/307 - * Thanks to @vimishor for the testable response - * - * @package GameQ\Tests\Issues - */ -class Issue307 extends TestBase -{ - /** - * Test for issue with colliding packet ids in Source Protocol - * - * PHP Fatal error: [] operator not supported for strings in ./src/GameQ/Protocols/Source.php on line 185 - */ - public function test1() - { - - $filePath = sprintf('%s/Providers/307.txt', __DIR__); - - // Create a mock server - $server = // Create a mock server - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'csgo', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Invoke beforeSend function - $server->protocol()->beforeSend($server); - - // Set the packet response as if we have really queried it - $server->protocol()->packetResponse(explode(PHP_EOL . '||' . PHP_EOL, file_get_contents($filePath))); - - // Create a mock GameQ - $gq_mock = $this->getMockBuilder('\GameQ\GameQ') - ->enableProxyingToOriginalMethods() - ->getMock(); - $gq_mock->setOption('debug', false); - - // Reflect on GameQ class so we can parse - $gameq = new \ReflectionClass($gq_mock); - - // Get the parse method so we can call it - $method = $gameq->getMethod('doParseResponse'); - - // Set the method to accessible - $method->setAccessible(true); - - $testResult = $method->invoke($gq_mock, $server); - - $this->assertEquals($testResult['gq_online'], 1); - } -} diff --git a/gameq/tests/Issues/Issue382.php b/gameq/tests/Issues/Issue382.php deleted file mode 100644 index b801543..0000000 --- a/gameq/tests/Issues/Issue382.php +++ /dev/null @@ -1,83 +0,0 @@ -. - */ - -namespace GameQ\Tests\Issues; - -use GameQ\Tests\TestBase; - -/** - * Class Issue382 - * - * Test for issue #382 - https://github.com/Austinb/GameQ/issues/382 - * [ARMA 3] New Jets DLC Support - * - * @package GameQ\Tests\Issues - */ -class Issue382 extends TestBase -{ - /** - * Test for issue where if a server has the jets DLC, GameQ would throw exception: - * - * ErrorException (E_NOTICE) - * Undefined offset: 32 - */ - public function test1() - { - /** - * Test Response Data provided by AAF - https://australianarmedforces.org/ - */ - $filePath = sprintf('%s/Providers/382.txt', __DIR__); - - // Create a mock server - $server = - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '58.162.184.102:2302', - \GameQ\Server::SERVER_TYPE => 'arma3', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Invoke beforeSend function - $server->protocol()->beforeSend($server); - - // Set the packet response as if we have really queried it - $server->protocol()->packetResponse(explode(PHP_EOL . '||' . PHP_EOL, file_get_contents($filePath))); - - // Create a mock GameQ - $gq_mock = $this->getMockBuilder('\GameQ\GameQ') - ->enableProxyingToOriginalMethods() - ->getMock(); - $gq_mock->setOption('debug', false); - - // Reflect on GameQ class so we can parse - $gameq = new \ReflectionClass($gq_mock); - - // Get the parse method so we can call it - $method = $gameq->getMethod('doParseResponse'); - - // Set the method to accessible - $method->setAccessible(true); - - $testResult = $method->invoke($gq_mock, $server); - - $this->assertEquals($testResult['gq_online'], true); - } -} diff --git a/gameq/tests/Issues/Providers/307.txt b/gameq/tests/Issues/Providers/307.txt deleted file mode 100644 index 127f702374dcec32a0a11e32fbe15a83f1fc44eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4483 zcmcIn&5k5F5%w&7TI~gKM(PnaR9jP3T{Y9YT=svLJ?x?d4H5`h&P->fr=01;c2;(^ z_Kvvn40GDs2*HIbPr*Cz3N&BX`P<#Yjp+|C{graQR7V z#qsjnb6aQP@{6{<{B>KmY3tg{pT#ecS?Sa|H5GHM&AB@&zT;nh%TiYuHkY~l$~dp2 zd-kXcUFB`PQtmA3%cq@-U+F*Jj2~Lq)hnD8euV>9uaZ?&teQ5_DqWGiD{oi6wa4&F zxpH+|t!_<~C<)_W2L8SK{rB%8Aa|c##Pv^p`j?O6*T3KU+eh*1ANgPVukFp7k7&n# zu;U4s7wq)~?f(1+CX!m(q%;jbN$ZrU8QhLkE?RGh#kM_Ru|SBWcd4;*wspsXu2QO^ z^lTGXP3ua0r^1!I(c&yEPv8#EWZpWNvEAkoCIoB$2s0CvC?qd&Z}`jJzgq4sq~}Ma zHFho;3finlJ@1q+$L&}5j*eTotYvj3`$Vh#1N#<2IdmG!HtWN}!Cq!GbGv!`Brio( z2~UpPw*>)CTbYfvK2QOHMszh7m1%2=c8D-()3ApHWp7!?PS_|9KbF7&fMah zK5e4YN$VdbS@7t7Z0Am(1W%;BXoby`sCg&g%oP2g0Lf&HRgUs0hWLJX13e^B>r`C? zi{2tL1SeX>5d674y&|tFc-+=CDKqelYUnKrAISD6P%1;UK~3Wi5Q~?NtExc`qwe=C zlfsus$FxMv7ow6lve9h;7YBIQulIn&p4Z8wp(-rBZ$5nXtn0dU~G>b7@aVcBhTU{jWEyO8Ek_p1i&oY}l^x!>Vki982j@2n*U~{rn}X z8ZNXp-8aAb)WIuS0@qS&oGXR06N&CM5rCbPQWtVbd*-4(ccrv5O4eGs0aaCPt^7HP zrh5vxW&5x(Q%)orx78OY@hDB9Glwk^!uquaD(Zli!M5DMe=nQf)ZEwStcEi}yChHXIuIqZ;aYa|8b1=LmIW-KZ!`;(~v z!Vz1@l30)ll;_KJUvBJbAvHqSj>rIREeZ3u@SK#)+?jYV7a@#Jk)ay3#>xT(;D6y# zIO&N1b;KlXjtjIRLT>c)X&*J5Y2|oZ_jim;q$q}{PgWd)Ki;&qM*0U-#TlIx4RFT~ zs!)=H(Y3tsTArk4%p|X@tj46I)ZVf0WMxjWSHP*iGRr?!HZj7#RI>X_RJa=YjSAd6 z#{0s`Ke8A1dB6Lr@3DdLwUo`H+Lnx&s(~@+30G_ROIfN^%SjjPb?JOM*rL<9ii->l zhS0cj#lq#QiR%JBk6b_iW{a>Fm5loXywu)}eDu)ui=ICtZm$DPYgOkHp6mh!Kv`nW zVw5Ia04-Iwg_;qsa1liINN8^rrho}bkoi;qf!{iBDvWqJE-jOKG7W}D&6(+HZA6Av zHL2Ls<~&yN0<+$EeStY>CV7S1BH89tP4?}ExReqlS^_;NX~$jg6xbYsj{N6^6$#Qj zR7Y@@h@~;d2SjTcDu|`zWHkXkY$1F=#mtVwfyAK9rm+DfXV3^G&oNQxz%hw7>5)>S z;*G#qRkkx!-^C1Rq^(3XXAsoWjxYndlcA!uGHY+f!>LQ$mzXR*#OPU(DZ_z@xO}o> zwwv$?`*F?vY#MEx);!MHBRLFE(+MFWwua8sHsB2EPt@(a=E4bRwyreRWB75QcTZ-Auy&2WbTz-o>-Fw3 z`g=LZq9oB#mVNRX#~(g8!1oguX(}}aWlW?8y2d#L;GVPvJe6U(Uh*)>_b}NDz$R=~ zNRClsm_CTAby^C--nc+R2+0J_^yDBGt=cp2-2lQt=pP{T1!xI<8s91I1VclRz?-i@ zuL|QK01CFI@t8Tog7O)y7datISS+lIiR*Tzs@?SdTEaZ3j~TyRJp*cAHBYa*FVU_W1=CnCn^Du zM-?2=rzwh-)QbxY2Mycr_uIn`=^v<#Q@0qQ0pzqaO;m9m%)m3wu}9w3KQCX`%vU4b}`~Tkm_y2gm zWHy`4&X+W83tkQ}L9r9~5da$TkaDm>1<=t5z#jepHu-iY?b_yj|u^NvM|jaLQwezb^4( zi3c}tF=zg-He)IQF-%VF; ze9$Yf@4a;K^n#{uL+!lM-uvht`zF^vwbr<#>xO1|j&HPRbAgN7cQ4#y7$$e3HR!=U zCImTt1O?a%ywJrlhO(%L(wW~kOWCQ_feyPM#{tK6VnkBd4Xn2|_kUx5`RdP?&-76= zhFbwKG1LeNrX!3jxQ#3)pe%wcO7N_OCmRT@4wC9wG6(BM~>;@IWFy7`SFK?f-`8~ zJMp1E`8a=zUH|#v3&&}LUP6HsHWAIMSyo0qQE0pJ=Hitm%dWo8FEsHO$HC;UFCW}s zcbC;y&T7^K`6jj?U^zfJhA4&|f8vn9_pndxUD{Cu6|pQzH$TkXX7^9se(~f{)c-`# zd{jwk`R!k`f|nXpf5rjJMh+<}nqpkGZO3$wOJ|+ewC*}G@vf0200lY)u_DyfvaFty zrDGJKKt?B)WkDU*sW3p11IM1krf3d58RDTZn)_F?Uu!Xz5S0Tn4J&OM85OmxScV6t*#8BJa5aMl?6KDN^3cIqQNNPMeoNV$$)*ust< zKMgnzT#ra(L>c4-R-vo4jefC*kvU4aFbLc*@yAb*q=#I?3&%Lk>-e>T-s`j~OHrIS x2E8${{A_F^LQUG0B+!3_Wh!Q6F}9~9`-q}^5_t<(=_oGZlzRhN*cb*T_!m4udMy9| diff --git a/gameq/tests/Protocol.php b/gameq/tests/Protocol.php deleted file mode 100644 index fcceb50..0000000 --- a/gameq/tests/Protocol.php +++ /dev/null @@ -1,162 +0,0 @@ -. - */ - -namespace GameQ\Tests; - -/** - * Protocol test class - * - * @package GameQ\Tests - */ -class Protocol extends TestBase -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocol - */ - protected $stub; - - /** - * Some dummy options - * - * @type array - */ - protected $options = [ - 'key1' => 'var1', - ]; - - /** - * Setup to create our stub - */ - public function setUp() - { - - $this->stub = $this->getMockForAbstractClass('\GameQ\Protocol', [ $this->options ]); - } - - /** - * Random assortment of general tests for completeness - */ - public function testGeneral() - { - - $name = 'Test name'; - $nameLong = 'Test name bigger, longer'; - $portDiff = 5454; - - $reflection = new \ReflectionClass($this->stub); - $reflection_property_name = $reflection->getProperty('name'); - $reflection_property_name->setAccessible(true); - - $reflection_property_name->setValue($this->stub, $name); - - $this->assertEquals($name, $this->stub->name()); - - $reflection_property_namelong = $reflection->getProperty('name_long'); - $reflection_property_namelong->setAccessible(true); - - $reflection_property_namelong->setValue($this->stub, $nameLong); - - $this->assertEquals($nameLong, $this->stub->nameLong()); - - // Test transport - $this->assertEquals(\GameQ\Protocol::TRANSPORT_UDP, $this->stub->transport()); - - // Test transport setting - $this->stub->transport(\GameQ\Protocol::TRANSPORT_TCP); - $this->assertEquals(\GameQ\Protocol::TRANSPORT_TCP, $this->stub->transport()); - - // Test protocol state - $this->assertEquals(\GameQ\Protocol::STATE_STABLE, $this->stub->state()); - - // Test port diff - $reflection_property_portdiff = $reflection->getProperty('port_diff'); - $reflection_property_portdiff->setAccessible(true); - - $reflection_property_portdiff->setValue($this->stub, $portDiff); - - $this->assertEquals($portDiff, $this->stub->portDiff()); - } - - /** - * Test packet setter/getter and some other packet methods - */ - public function testPackets() - { - - $packets = [ - \GameQ\Protocol::PACKET_CHALLENGE => 'Do you even lift?', - \GameQ\Protocol::PACKET_RULES => 'There are no rules!!', - ]; - - $reflection = new \ReflectionClass($this->stub); - $reflection_property = $reflection->getProperty('packets'); - $reflection_property->setAccessible(true); - - $reflection_property->setValue($this->stub, $packets); - - // Test all return - $this->assertEquals($packets, $this->stub->getPacket()); - - // Test multiple selected - $this->assertEquals($packets, $this->stub->getPacket([ - \GameQ\Protocol::PACKET_CHALLENGE, - \GameQ\Protocol::PACKET_RULES, - ])); - - // Test single selected - $this->assertEquals( - $packets[\GameQ\Protocol::PACKET_CHALLENGE], - $this->stub->getPacket(\GameQ\Protocol::PACKET_CHALLENGE) - ); - - // Drop challenge and test for !challenge - unset($packets[\GameQ\Protocol::PACKET_CHALLENGE]); - - $reflection_property->setValue($this->stub, $packets); - - $this->assertEquals($packets, $this->stub->getPacket('!challenge')); - - // test hasChallenge - $this->assertFalse($this->stub->hasChallenge()); - } - - /** - * Test options methods - */ - public function testOptions() - { - - // Test the options attribute - $this->assertEquals($this->options, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'options')); - - // Check the options getter - $this->assertEquals($this->options, $this->stub->options()); - - // Set new options and then check - $new_options = [ - 'key2' => 'value2', - ]; - - $this->stub->options($new_options); - - $this->assertEquals($new_options, $this->stub->options()); - } -} diff --git a/gameq/tests/Protocols/Aa3.php b/gameq/tests/Protocols/Aa3.php deleted file mode 100644 index 04b9496..0000000 --- a/gameq/tests/Protocols/Aa3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for America's Army 3 - * - * @package GameQ\Tests\Protocols - */ -class Aa3 extends Base -{ - /** - * Test responses for Aa3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'aa3', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Aapg.php b/gameq/tests/Protocols/Aapg.php deleted file mode 100644 index 61524f5..0000000 --- a/gameq/tests/Protocols/Aapg.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for America's Army: Proving Grounds - * - * @package GameQ\Tests\Protocols - */ -class Aapg extends Base -{ - /** - * Test responses for Aapg - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'aapg', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Arkse.php b/gameq/tests/Protocols/Arkse.php deleted file mode 100644 index b465f62..0000000 --- a/gameq/tests/Protocols/Arkse.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for ARK: Survival Evolved - * - * @package GameQ\Tests\Protocols - */ -class Arkse extends Base -{ - /** - * Test responses for ARK: Survival Evolved - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'arkse', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.00000001); - } -} diff --git a/gameq/tests/Protocols/Arma3.php b/gameq/tests/Protocols/Arma3.php deleted file mode 100644 index a8b1d42..0000000 --- a/gameq/tests/Protocols/Arma3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Armed Assault 3 - * - * @package GameQ\Tests\Protocols - */ -class Arma3 extends Base -{ - /** - * Test responses for Arma 3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'arma3', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.0000001); - } -} diff --git a/gameq/tests/Protocols/Armedassault2oa.php b/gameq/tests/Protocols/Armedassault2oa.php deleted file mode 100644 index 8b746b4..0000000 --- a/gameq/tests/Protocols/Armedassault2oa.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Armed Assault 2: Operation Arrowhead - * - * @package GameQ\Tests\Protocols - */ -class Armedassault2oa extends Base -{ - /** - * Test responses for Armedassault2oa - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'armedassault2oa', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.0000001); - } -} diff --git a/gameq/tests/Protocols/Ase.php b/gameq/tests/Protocols/Ase.php deleted file mode 100644 index 9ab4d1c..0000000 --- a/gameq/tests/Protocols/Ase.php +++ /dev/null @@ -1,61 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Ase extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Ase - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_ALL => "s", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Ase') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } -} diff --git a/gameq/tests/Protocols/Base.php b/gameq/tests/Protocols/Base.php deleted file mode 100644 index 4b0bb71..0000000 --- a/gameq/tests/Protocols/Base.php +++ /dev/null @@ -1,130 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -use GameQ\Tests\TestBase; - -/** - * Class Base for protocol tests - * - * @SuppressWarnings(PHPMD.NumberOfChildren) - * - * @package GameQ\Tests\Protocols - */ -abstract class Base extends TestBase -{ - - /** - * Shared provider to give protocols the data to test with - * - * @return array - */ - public function loadData() - { - - // Explode the class that called to avoid strict error - $class = explode('\\', get_called_class()); - - // Determine the folder to grab the provider files and results from - $providersLookup = sprintf('%s/Providers/%s/', __DIR__, array_pop($class)); - - // Init the return array - $providers = []; - - // Do a glob lookup just for the responses - $files = new \GlobIterator($providersLookup . '*_response.txt'); - - // Iterate over the list of response files that exists - foreach ($files as $fileinfo) { - if (!$fileinfo->isReadable() || !$fileinfo->isFile()) { - continue; - } - - list($index, $type) = explode('_', $fileinfo->getFilename()); - - unset($type); - - // Append this data to the providers return - $providers[] = [ - explode(PHP_EOL . '||' . PHP_EOL, file_get_contents($fileinfo->getRealPath())), - json_decode(file_get_contents(sprintf('%s%d_result.json', $providersLookup, $index)), true), - ]; - } - - // Clear some memory - unset($files, $fileinfo, $providersLookup); - - return $providers; - } - - /** - * Generic query test function to simulate testing of protocol classes - * - * @param string $host - * @param string $protocol - * @param array $responses - * @param bool $debug - * @param array $server_options - * - * @return mixed - */ - protected function queryTest($host, $protocol, $responses, $debug = false, $server_options = []) - { - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => $host, - \GameQ\Server::SERVER_TYPE => $protocol, - \GameQ\Server::SERVER_OPTIONS => $server_options, - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Invoke beforeSend function - $server->protocol()->beforeSend($server); - - // Set the packet response as if we have really queried it - $server->protocol()->packetResponse($responses); - - // Create a mock GameQ - $gq_mock = $this->getMockBuilder('\GameQ\GameQ') - ->enableProxyingToOriginalMethods() - ->getMock(); - $gq_mock->setOption('debug', $debug); - $gq_mock->removeFilter('normalize'); - - // Reflect on GameQ class so we can parse - $gameq = new \ReflectionClass($gq_mock); - - // Get the parse method so we can call it - $method = $gameq->getMethod('doParseResponse'); - - // Set the method to accessible - $method->setAccessible(true); - - $testResult = $method->invoke($gq_mock, $server); - - unset($server, $gq_mock, $gameq, $method); - - return $testResult; - } -} diff --git a/gameq/tests/Protocols/Batt1944.php b/gameq/tests/Protocols/Batt1944.php deleted file mode 100644 index 6273162..0000000 --- a/gameq/tests/Protocols/Batt1944.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Battalion 1944 - * - * @package GameQ\Tests\Protocols - */ -class Batt1944 extends Base -{ - /** - * Test responses for Battalion 1944l - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'batt1944', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Bf1942.php b/gameq/tests/Protocols/Bf1942.php deleted file mode 100644 index 73c4709..0000000 --- a/gameq/tests/Protocols/Bf1942.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Bf1942 extends Base -{ - - /** - * Test responses for Battlefield 1942 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'bf1942', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Bf2.php b/gameq/tests/Protocols/Bf2.php deleted file mode 100644 index dda1225..0000000 --- a/gameq/tests/Protocols/Bf2.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Bf2 extends Base -{ - - /** - * Test responses for Battlefield 2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'bf2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Bf3.php b/gameq/tests/Protocols/Bf3.php deleted file mode 100644 index 6699fa5..0000000 --- a/gameq/tests/Protocols/Bf3.php +++ /dev/null @@ -1,106 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Bf3 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Bf3 - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\x00\x00\x00\x21\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - \GameQ\Protocol::PACKET_VERSION => "\x00\x00\x00\x22\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - \GameQ\Protocol::PACKET_PLAYERS => - "\x00\x00\x00\x23\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Bf3') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test for invalid packet length - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Bf3::processResponse packet length does not match expected length! - */ - public function testInvalidPacketLengthDebug() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Bf3/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\x00\x00\x00a%", "\x00\x00\x00a!", $source); - - // Should fail out - $this->queryTest('127.0.0.1:27015', 'bf3', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Battlefield 3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'bf3', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Bf4.php b/gameq/tests/Protocols/Bf4.php deleted file mode 100644 index 6c91687..0000000 --- a/gameq/tests/Protocols/Bf4.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Bf4 extends Base -{ - - /** - * Test responses for Battlefield 4 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'bf4', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Bfbc2.php b/gameq/tests/Protocols/Bfbc2.php deleted file mode 100644 index af4dfbb..0000000 --- a/gameq/tests/Protocols/Bfbc2.php +++ /dev/null @@ -1,106 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Bfbc2 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Bfbc2 - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_VERSION => "\x00\x00\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00version\x00", - \GameQ\Protocol::PACKET_STATUS => "\x00\x00\x00\x00\x1b\x00\x00\x00\x01\x00\x00\x00\x0a\x00\x00\x00serverInfo\x00", - \GameQ\Protocol::PACKET_PLAYERS => - "\x00\x00\x00\x00\x24\x00\x00\x00\x02\x00\x00\x00\x0b\x00\x00\x00listPlayers\x00\x03\x00\x00\x00\x61ll\x00", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Bfbc2') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test for invalid packet length - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Bfbc2::processResponse packet length does not match expected length! - */ - public function testInvalidPacketLengthDebug() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Bfbc2/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\x00\x00\x00\x40\x28", "\x00\x00\x00\x40\x29", $source); - - // Should fail out - $this->queryTest('127.0.0.1:27015', 'bfbc2', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Battlefield Bad Company 2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'bfbc2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Bfh.php b/gameq/tests/Protocols/Bfh.php deleted file mode 100644 index e099f47..0000000 --- a/gameq/tests/Protocols/Bfh.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Bfh extends Base -{ - - /** - * Test responses for Battlefield Hardline - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'bfh', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Cod2.php b/gameq/tests/Protocols/Cod2.php deleted file mode 100644 index eff4258..0000000 --- a/gameq/tests/Protocols/Cod2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Call of Duty 2 - * - * @package GameQ\Tests\Protocols - */ -class Cod2 extends Base -{ - /** - * Test responses for Call of Duty 2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'cod2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Cod4.php b/gameq/tests/Protocols/Cod4.php deleted file mode 100644 index 7b0050e..0000000 --- a/gameq/tests/Protocols/Cod4.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Call of Duty 4 - * - * @package GameQ\Tests\Protocols - */ -class Cod4 extends Base -{ - /** - * Test responses for Call of Duty 4 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'cod4', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Codmw3.php b/gameq/tests/Protocols/Codmw3.php deleted file mode 100644 index 63ec075..0000000 --- a/gameq/tests/Protocols/Codmw3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Call of Duty: Modern Warfare 3 - * - * @package GameQ\Tests\Protocols - */ -class Codmw3 extends Base -{ - /** - * Test responses for Codmw3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'codmw3', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Conanexiles.php b/gameq/tests/Protocols/Conanexiles.php deleted file mode 100644 index 28a50c0..0000000 --- a/gameq/tests/Protocols/Conanexiles.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Conanexiles - * - * @package GameQ\Tests\Protocols - */ -class Conanexiles extends Base -{ - /** - * Test responses for Dods - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'conanexiles', - $responses, - false, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[ $server ]['gq_port_query'], - ] - ); - - $this->assertEquals($result[$server], $testResult, '', 0.00000001); - } -} diff --git a/gameq/tests/Protocols/Crysiswars.php b/gameq/tests/Protocols/Crysiswars.php deleted file mode 100644 index fbba3ef..0000000 --- a/gameq/tests/Protocols/Crysiswars.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Crysis wars - * - * @package GameQ\Tests\Protocols - */ -class Crysiswars extends Base -{ - /** - * Test responses for Crysis wars - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'crysiswars', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Cs15.php b/gameq/tests/Protocols/Cs15.php deleted file mode 100644 index 723dcea..0000000 --- a/gameq/tests/Protocols/Cs15.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for CS 1.5 - * - * @package GameQ\Tests\Protocols - */ -class Cs15 extends Base -{ - /** - * Test server responses for Cs 1.5 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'cs15', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Cs16.php b/gameq/tests/Protocols/Cs16.php deleted file mode 100644 index a87525a..0000000 --- a/gameq/tests/Protocols/Cs16.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for CS 1.6 - * - * @package GameQ\Tests\Protocols - */ -class Cs16 extends Base -{ - /** - * Test responses for Cs 1.6 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'cs16', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Cscz.php b/gameq/tests/Protocols/Cscz.php deleted file mode 100644 index 76b12d9..0000000 --- a/gameq/tests/Protocols/Cscz.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for CS Condition Zero - * - * @package GameQ\Tests\Protocols - */ -class Cscz extends Base -{ - /** - * Test responses for Cscz - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'cscz', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Csgo.php b/gameq/tests/Protocols/Csgo.php deleted file mode 100644 index 93344db..0000000 --- a/gameq/tests/Protocols/Csgo.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for CS Source - * - * @package GameQ\Tests\Protocols - */ -class Csgo extends Base -{ - /** - * Test responses for Csgo - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'csgo', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Css.php b/gameq/tests/Protocols/Css.php deleted file mode 100644 index d232e0b..0000000 --- a/gameq/tests/Protocols/Css.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for CS Source - * - * @package GameQ\Tests\Protocols - */ -class Css extends Base -{ - /** - * Test responses for Css - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'css', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Dayz.php b/gameq/tests/Protocols/Dayz.php deleted file mode 100644 index 861141d..0000000 --- a/gameq/tests/Protocols/Dayz.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for DayZ Standalone - * - * @package GameQ\Tests\Protocols - */ -class Dayz extends Base -{ - /** - * Test responses for Dayz - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'dayz', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Dayzmod.php b/gameq/tests/Protocols/Dayzmod.php deleted file mode 100644 index a2c8f77..0000000 --- a/gameq/tests/Protocols/Dayzmod.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Dayz Mod - * - * @package GameQ\Tests\Protocols - */ -class Dayzmod extends Base -{ - /** - * Test responses for Dayzmod - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'dayzmod', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.0000001); - } -} diff --git a/gameq/tests/Protocols/Dod.php b/gameq/tests/Protocols/Dod.php deleted file mode 100644 index ac2104f..0000000 --- a/gameq/tests/Protocols/Dod.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Dod - * - * @package GameQ\Tests\Protocols - */ -class Dod extends Base -{ - /** - * Test responses for Dod - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'dod', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Dods.php b/gameq/tests/Protocols/Dods.php deleted file mode 100644 index e2e0298..0000000 --- a/gameq/tests/Protocols/Dods.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Dods - * - * @package GameQ\Tests\Protocols - */ -class Dods extends Base -{ - /** - * Test responses for Dods - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'dods', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Dow.php b/gameq/tests/Protocols/Dow.php deleted file mode 100644 index b160387..0000000 --- a/gameq/tests/Protocols/Dow.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Days of War - * - * @package GameQ\Tests\Protocols - */ -class Dow extends Base -{ - /** - * Test responses for Dow - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'dow', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Eco.php b/gameq/tests/Protocols/Eco.php deleted file mode 100644 index c0ad10b..0000000 --- a/gameq/tests/Protocols/Eco.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Eco extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Eco - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "GET /frontpage HTTP/1.0\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Eco') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test responses for Grand Theft Auto Network - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'eco', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.000001); - } -} diff --git a/gameq/tests/Protocols/Egs.php b/gameq/tests/Protocols/Egs.php deleted file mode 100644 index ba125ad..0000000 --- a/gameq/tests/Protocols/Egs.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Empyrion - Galactic Survival - * - * @package GameQ\Tests\Protocols - */ -class Egs extends Base -{ - /** - * Test responses for Empyrion - Galactic Survival - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'egs', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Etqw.php b/gameq/tests/Protocols/Etqw.php deleted file mode 100644 index 2113e6b..0000000 --- a/gameq/tests/Protocols/Etqw.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Etqw extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Etqw - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\xFF\xFFgetInfoEx\x00\x00\x00\x00", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Etqw') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Etqw/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFFinfoExResponses", "\xFF\xFFinfoExResponses", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:27733', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Etqw/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFFinfoExResponses", "\xFF\xFFinfoExResponses", $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:27733', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Etqw - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'etqw', - $responses - ); - - $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); - } -} diff --git a/gameq/tests/Protocols/Ffe.php b/gameq/tests/Protocols/Ffe.php deleted file mode 100644 index f1653c5..0000000 --- a/gameq/tests/Protocols/Ffe.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Fortress Forever - * - * @package GameQ\Tests\Protocols - */ -class Ffe extends Base -{ - /** - * Test responses for Ffe - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ffe', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Ffow.php b/gameq/tests/Protocols/Ffow.php deleted file mode 100644 index 49c9eeb..0000000 --- a/gameq/tests/Protocols/Ffow.php +++ /dev/null @@ -1,153 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Ffow extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Ffow - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x57", - \GameQ\Protocol::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - \GameQ\Protocol::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - \GameQ\Protocol::PACKET_INFO => "\xFF\xFF\xFF\xFF\x46\x4C\x53\x51", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Ffow') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test the challenge application - */ - public function testChallengeapply() - { - - $packets = $this->packets; - - // Set what the packets should look like - $packets[\GameQ\Protocol::PACKET_PLAYERS] = "\xFF\xFF\xFF\xFF\x55test"; - $packets[\GameQ\Protocol::PACKET_RULES] = "\xFF\xFF\xFF\xFF\x56test"; - - // Create a fake buffer - $challenge_buffer = new \GameQ\Buffer("\xFF\xFF\xFF\xFF\xFFtest"); - - // Apply the challenge - $this->stub->challengeParseAndApply($challenge_buffer); - - // Build reflection to access changed data - $reflectionClass = new \ReflectionClass($this->stub); - $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); - $reflectionProperty->setAccessible(true); - - $this->assertEquals( - $packets, - \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($this->stub), 'packets') - ); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a ffow source file - $source = file_get_contents(sprintf('%s/Providers/Ffow/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFF\x49\x02", "\xFF\xFF\xFF\xFF\x48\x02", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:5476', 'ffow', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Ffow::processResponse response type 'ffffffff4802' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a ffow source file - $source = file_get_contents(sprintf('%s/Providers/Ffow/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFF\x49\x02", "\xFF\xFF\xFF\xFF\x48\x02", $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:5476', 'ffow', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Ffow - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ffow', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Gamespy.php b/gameq/tests/Protocols/Gamespy.php deleted file mode 100644 index a6ba2c3..0000000 --- a/gameq/tests/Protocols/Gamespy.php +++ /dev/null @@ -1,99 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Gamespy extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Gamespy - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\x5C\x73\x74\x61\x74\x75\x73\x5C", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Gamespy') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Ut/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace('queryid\\20.1', '', $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:7777', 'ut', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Gamespy::processResponse An error occurred while parsing the packets - * for 'queryid' - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Ut/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace('queryid\\20.1', '', $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:7777', 'ut', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } -} diff --git a/gameq/tests/Protocols/Gmod.php b/gameq/tests/Protocols/Gmod.php deleted file mode 100644 index 2fbde74..0000000 --- a/gameq/tests/Protocols/Gmod.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Garry's Mod - * - * @package GameQ\Tests\Protocols - */ -class Gmod extends Base -{ - /** - * Test responses for Gmod - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'gmod', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Grav.php b/gameq/tests/Protocols/Grav.php deleted file mode 100644 index dd80ec0..0000000 --- a/gameq/tests/Protocols/Grav.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for GRAV Online - * - * @package GameQ\Tests\Protocols - */ -class Grav extends Base -{ - /** - * Test responses for Grav - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'grav', - $responses - ); - - $this->assertEquals($result[ $server ], $testResult); - } -} diff --git a/gameq/tests/Protocols/Gta5m.php b/gameq/tests/Protocols/Gta5m.php deleted file mode 100644 index 0fdc925..0000000 --- a/gameq/tests/Protocols/Gta5m.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Gta5m extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Gta5m - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\xFF\xFF\xFF\xFFgetinfo xxx", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Gta5m') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Gta5m/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFinfoResponse", "\xFF\xFF\xFF\xFFinfoResponses", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:30120', 'gta5m', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Gta5m/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFinfoResponse", "\xFF\xFF\xFF\xFFinfoResponses", $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:30210', 'gta5m', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for GTA Five M - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'gta5m', - $responses - ); - - $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); - } -} diff --git a/gameq/tests/Protocols/Gtan.php b/gameq/tests/Protocols/Gtan.php deleted file mode 100644 index bbb617b..0000000 --- a/gameq/tests/Protocols/Gtan.php +++ /dev/null @@ -1,84 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Gtan extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Gtan - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "GET /gtan/api.php?ip=%s&raw HTTP/1.0\r\nHost: multiplayerhosting.info\r\nAccept: */*\r\n\r\n", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Gtan') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test responses for Grand Theft Auto Network - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'gtan', - $responses - ); - - $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); - } -} diff --git a/gameq/tests/Protocols/Hl2dm.php b/gameq/tests/Protocols/Hl2dm.php deleted file mode 100644 index ccc3413..0000000 --- a/gameq/tests/Protocols/Hl2dm.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Half Life 2 DM - * - * @package GameQ\Tests\Protocols - */ -class Hl2dm extends Base -{ - /** - * Test responses for Hl2dm - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'hl2dm', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Insurgency.php b/gameq/tests/Protocols/Insurgency.php deleted file mode 100644 index 7789116..0000000 --- a/gameq/tests/Protocols/Insurgency.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Insurgency - * - * @package GameQ\Tests\Protocols - */ -class Insurgency extends Base -{ - /** - * Test responses for Insurgency - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'insurgency', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Jediacademy.php b/gameq/tests/Protocols/Jediacademy.php deleted file mode 100644 index d5ee0ee..0000000 --- a/gameq/tests/Protocols/Jediacademy.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Jedi Academy - * - * @package GameQ\Tests\Protocols - */ -class Jediacademy extends Base -{ - /** - * Test responses for Jedi Academy - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'jediacademy', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Jedioutcast.php b/gameq/tests/Protocols/Jedioutcast.php deleted file mode 100644 index bef6a5a..0000000 --- a/gameq/tests/Protocols/Jedioutcast.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Jedi Outcast - * - * @package GameQ\Tests\Protocols - */ -class Jedioutcast extends Base -{ - /** - * Test responses for Jedi Outcast - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'jedioutcast', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Justcause2.php b/gameq/tests/Protocols/Justcause2.php deleted file mode 100644 index 55e92dc..0000000 --- a/gameq/tests/Protocols/Justcause2.php +++ /dev/null @@ -1,85 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Justcause2 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Gamespy - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_CHALLENGE => "\xFE\xFD\x09\x10\x20\x30\x40", - \GameQ\Protocol::PACKET_ALL => "\xFE\xFD\x00\x10\x20\x30\x40%s\xFF\xFF\xFF\x02", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Justcause2') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test responses for Just cause 2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'justcause2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Justcause3.php b/gameq/tests/Protocols/Justcause3.php deleted file mode 100644 index 2bbb362..0000000 --- a/gameq/tests/Protocols/Justcause3.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Just Cause 3 - * - * @package GameQ\Tests\Protocols - */ -class Justcause3 extends Base -{ - /** - * Test responses for Justcause3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'justcause3', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Killingfloor.php b/gameq/tests/Protocols/Killingfloor.php deleted file mode 100644 index 84c1efb..0000000 --- a/gameq/tests/Protocols/Killingfloor.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Killing Floor - * - * @package GameQ\Tests\Protocols - */ -class Killingfloor extends Base -{ - /** - * Test responses for Killingfloor - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'killingfloor', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Killingfloor2.php b/gameq/tests/Protocols/Killingfloor2.php deleted file mode 100644 index 51f35b9..0000000 --- a/gameq/tests/Protocols/Killingfloor2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Killing Floor 2 - * - * @package GameQ\Tests\Protocols - */ -class Killingfloor2 extends Base -{ - /** - * Test responses for Killing floor 2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'killingfloor2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/L4d.php b/gameq/tests/Protocols/L4d.php deleted file mode 100644 index 649f249..0000000 --- a/gameq/tests/Protocols/L4d.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Left 4 Dead - * - * @package GameQ\Tests\Protocols - */ -class L4d extends Base -{ - /** - * Test responses for L4d - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'l4d', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/L4d2.php b/gameq/tests/Protocols/L4d2.php deleted file mode 100644 index a72f034..0000000 --- a/gameq/tests/Protocols/L4d2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Left 4 Dead 2 - * - * @package GameQ\Tests\Protocols - */ -class L4d2 extends Base -{ - /** - * Test responses for L4d2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'l4d2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Lhmp.php b/gameq/tests/Protocols/Lhmp.php deleted file mode 100644 index a66cf04..0000000 --- a/gameq/tests/Protocols/Lhmp.php +++ /dev/null @@ -1,99 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Lhmp extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Lhmp - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_DETAILS => "LHMPo", - \GameQ\Protocol::PACKET_PLAYERS => "LHMPp", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Lhmp') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a lhmp source file - $source = file_get_contents(sprintf('%s/Providers/Lhmp/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("LHMPo", "LHMPz", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:270015', 'lhmp', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Lhmp::processResponse response type 'LHMPz' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a lhmp source file - $source = file_get_contents(sprintf('%s/Providers/Lhmp/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("LHMPo", "LHMPz", $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:27015', 'lhmp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } -} diff --git a/gameq/tests/Protocols/Minecraft.php b/gameq/tests/Protocols/Minecraft.php deleted file mode 100644 index 74714c5..0000000 --- a/gameq/tests/Protocols/Minecraft.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Minecraft - * - * @package GameQ\Tests\Protocols - */ -class Minecraft extends Base -{ - /** - * Test responses for Minecraft - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'minecraft', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Minecraftpe.php b/gameq/tests/Protocols/Minecraftpe.php deleted file mode 100644 index 84049e4..0000000 --- a/gameq/tests/Protocols/Minecraftpe.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Minecraft PE - * - * @package GameQ\Tests\Protocols - */ -class Minecraftpe extends Base -{ - /** - * Test responses for Minecraft PE - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'minecraftpe', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Mohaa.php b/gameq/tests/Protocols/Mohaa.php deleted file mode 100644 index f270bb7..0000000 --- a/gameq/tests/Protocols/Mohaa.php +++ /dev/null @@ -1,79 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Medal of honor: Allied Assault - * - * @package GameQ\Tests\Protocols - */ -class Mohaa extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Mohaa - */ - protected $stub; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Mohaa') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test to make sure the query port has not changed. May have to come back and change this if it turns out - * that the mohaa query port can be different by some kind of predictable interval. - */ - public function testQueryPort() - { - $this->assertEquals($this->stub->findQueryPort(12203), 12203+97); - } - - /** - * Test responses for Medal of honor: Allied Assault - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'mohaa', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Mta.php b/gameq/tests/Protocols/Mta.php deleted file mode 100644 index 326a03e..0000000 --- a/gameq/tests/Protocols/Mta.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Multi Theft Auto - * - * @package GameQ\Tests\Protocols - */ -class Mta extends Base -{ - /** - * Test responses for Mta - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'mta', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Mumble.php b/gameq/tests/Protocols/Mumble.php deleted file mode 100644 index d093c21..0000000 --- a/gameq/tests/Protocols/Mumble.php +++ /dev/null @@ -1,102 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Mumble - * - * @package GameQ\Tests\Protocols - */ -class Mumble extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Mumble - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_ALL => "\x6A\x73\x6F\x6E", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Mumble') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test non-JSON formatted response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Mumble::processResponse Unable to decode JSON data. - */ - public function testBadResponseFormat() - { - - // Should fail out - $this->queryTest('127.0.0.1:27015', 'mumble', [ '{"key1": "val", "key2" :}' ], true); - } - - /** - * Test responses for Mumble - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'mumble', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Ns2.php b/gameq/tests/Protocols/Ns2.php deleted file mode 100644 index b5874a8..0000000 --- a/gameq/tests/Protocols/Ns2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Natural Selection 2 - * - * @package GameQ\Tests\Protocols - */ -class Ns2 extends Base -{ - /** - * Test responses for Ns2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ns2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Projectrealitybf2.php b/gameq/tests/Protocols/Projectrealitybf2.php deleted file mode 100644 index a904bb2..0000000 --- a/gameq/tests/Protocols/Projectrealitybf2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Projectrealitybf2 - * - * @package GameQ\Tests\Protocols - */ -class Projectrealitybf2 extends Base -{ - /** - * Test responses for Projectrealitybf2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'projectrealitybf2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Providers/Aa3/1_response.txt b/gameq/tests/Protocols/Providers/Aa3/1_response.txt deleted file mode 100644 index 7afbab622499260d0471a55ef13c384474cf2411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 528 zcmW-d!D|yi6vn?|Y%!n`>P4Zjcu+ia&30pGSf+H7-I_(Cp-Ee`?P0r_Zidb7EVJ9R zDLoX5py)P^Eiv`jb)&|>^VK}n7tmlucHY-~VI_VBGtf3U?6iHnr0Yi#p;wibqF9 zGC6i;kp+E`rd(BOxOxHDE^WE6liXK4!|^n*ba&H5++Q@yxH1F0_`ZH#=W2joMPSEj zxHOFnqWLFs4+o^!Fy~w_wj#oQE|O|3@9T_#k@))G%P!U)tlHiqSNA&lwp&=Z2*mFTF4|Hgd41p~L4>mcaFTv@Fp`q&VxJ@@AKy8MMZ^cGJnTUc z`ci!EphbwA)f#@#wClSq2X!7q*)VHzk?@Eo_)Skgyt*?{XSq6*h-e$7(_0Sx84mnm zA|lL_*nD}(L0781P#U$x8om)T-u`UB9`J)|rCLFg$iLG!4LnWBD9%yOB4dN8# IduPl40X=G*`Tzg` diff --git a/gameq/tests/Protocols/Providers/Aa3/1_result.json b/gameq/tests/Protocols/Providers/Aa3/1_result.json deleted file mode 100644 index 75a1613..0000000 --- a/gameq/tests/Protocols/Providers/Aa3/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.55.149.86:8777":{"dedicated":"d","game_descr":"America's Army 3.3","game_dir":"aa3game","game_id":13140,"gq_address":"66.55.149.86","gq_joinlink":"steam:\/\/connect\/66.55.149.86:8777\/","gq_name":"America's Army 3","gq_online":true,"gq_port_client":"8777","gq_port_query":27020,"gq_protocol":"source","gq_transport":"udp","gq_type":"aa3","hostname":"[Honor Server] Fort Apache I","keywords":"M=coai;W=foggy;T=day;P=0;C=0;pb=1;voip=1;ver=AA3.3.1;","map":"Bridge AI","max_players":26,"num_bots":0,"num_players":19,"os":"w","password":0,"players":[{"id":0,"name":"schipper49","score":783,"time":3521.0852050781},{"id":0,"name":"Antares","score":1664,"time":3506.9526367188},{"id":0,"name":"mh830","score":1806,"time":3436.7834472656},{"id":0,"name":"Anterl","score":2781,"time":3123.7114257812},{"id":0,"name":"Brock-You","score":1656,"time":2515.2087402344},{"id":0,"name":"==Fightin69th.==","score":1853,"time":2271.1311035156},{"id":0,"name":"UKRAINE.IS.OLD.USSR","score":384,"time":2150.2229003906},{"id":0,"name":"GPAM","score":1330,"time":2122.1516113281},{"id":0,"name":"PointBlanck","score":1209,"time":1451.5159912109},{"id":0,"name":"yooper","score":375,"time":1261.2972412109},{"id":0,"name":"mikelpozd","score":370,"time":1088.3349609375},{"id":0,"name":"Mikee369","score":212,"time":821.59899902344},{"id":0,"name":"BecksvsHeineken","score":479,"time":678.19763183594},{"id":0,"name":"mistrzo","score":-149,"time":666.46978759766},{"id":0,"name":"Poglavnik","score":45,"time":550.17498779297},{"id":0,"name":"Torugo1989","score":203,"time":429.21243286133},{"id":0,"name":"Alex6464","score":72,"time":305.24179077148},{"id":0,"name":"Zplanet","score":-1,"time":267.80621337891},{"id":0,"name":"","score":0,"time":5.7877426147461}],"port":8777,"protocol":17,"secure":0,"steam_id":90094381178881031,"steamappid":13140,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Aa3/2_response.txt b/gameq/tests/Protocols/Providers/Aa3/2_response.txt deleted file mode 100644 index 85a0732fda1d7293fcdda264aa8e5740d6910a23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmezW|Nnna!Dx^Cy!;}C;MAhB)S_4gjUe4%O@$&?*D_ay;J{Ev7Y3)I%#`$0hQvhU z^u*j$2FKjgqRiw(^2*{H&o(Rm1rvgE~=mi+}dd=(8!{WowlixIJoH#4Q_Nzj^q^Em)<35 zgF+YBy09a$u^~|;#DEw;Y)ptE1PeP7f(=lYa84}iZ25cM_r1ICuHA086DMVDT#eMq znk>r_Q=%C$3{8zz*Tt(rNmYEfr;Xp3 zjLunU%ND;dICxM@4A9$Z^@`oL%>l?|RY$M$8u4?Hs|nMAyO#lW9v_Z($Z*y2hpC;< z-7*|Fe-2>iQHLnbcAAvRHEYw|hSw^O@^%jfKSaZYk4Veq6UUT zg8;8sC~w8*jFy~2K5;SZ_5+O2P;Qhl=2$GOP=N~)zz;99n6zLA2o9VAcwP$SxkWwZ z$dN4eM`svDl^CO(!{8aw;FVA^L+dPqHaYwfarS&z%`|GG3#ft^seADGG{6TvoQR=& z$fE_H!l&Z^Uv7rwB}$8w5?+I6M**G;g*mwx8x4-yi7~{9OAx#jVK2{w*wF3RqOF^j zJrDaL?%m#@Zi@@ls|LqfA+C!Vd>5M<+YK2ajMKX{g;!8bu)aQkZKEgfDULyDrI{^b zvo0F6D#+f(AG1r!s4C3-S@39u_y*lvr_GK! z_wiL%Eo-Uej3%duPjG{{MJnRfjsRqyt_A{Gb?kW7wqkmEHW_6eO2?78B diff --git a/gameq/tests/Protocols/Providers/Aapg/1_result.json b/gameq/tests/Protocols/Providers/Aapg/1_result.json deleted file mode 100644 index 379d545..0000000 --- a/gameq/tests/Protocols/Providers/Aapg/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"104.200.142.52:8777":{"dedicated":"d","game_descr":"America's Army: Proving Grounds","game_dir":"aa4game","game_id":203290,"gq_address":"104.200.142.52","gq_joinlink":"steam:\/\/connect\/104.200.142.52:8777\/","gq_name":"America's Army: Proving Grounds","gq_online":true,"gq_port_client":"8777","gq_port_query":27020,"gq_protocol":"source","gq_transport":"udp","gq_type":"aapg","hostname":"-=312th=- \/ Dallas I - INNER HOSPITAL ONLY","keywords":"qp=27020;M=;ver=148023;T=Round In Progress 1:46;VM=0;P=0;C=1;pb=1;voip=1;sm=396;HONOR=1;","map":"FLO_InnerHospital_EX","max_players":24,"num_bots":0,"num_players":25,"os":"w","password":0,"players":[{"id":0,"name":"[T1]Austin[25ID]","score":11110,"time":2137.7214355469},{"id":0,"name":"[T1]$pOn$oR_[QC]","score":7970,"time":2137.0080566406},{"id":0,"name":"[T0]~NightOwl~","score":12730,"time":2135.8583984375},{"id":0,"name":"[T0]-^Un-TaMeD^-","score":6520,"time":2135.6137695312},{"id":0,"name":"[T1]WV_Dave","score":6660,"time":2135.1694335938},{"id":0,"name":"[T0]|EHC|-Manile","score":6320,"time":2134.947265625},{"id":0,"name":"[T1]Cheesestick","score":8230,"time":2134.8693847656},{"id":0,"name":"[T0]DocReese","score":4610,"time":2134.4802246094},{"id":0,"name":"[T1][UAB]-2Ten.FreakBross","score":7450,"time":2133.5119628906},{"id":0,"name":"[T1]FourPaws","score":8430,"time":2132.6450195312},{"id":0,"name":"[T1]Pvt.Sakarium","score":6100,"time":2132.1118164062},{"id":0,"name":"[T0]razamocno","score":4050,"time":2131.9897460938},{"id":0,"name":"[T0]Voodooist","score":3500,"time":2130.1010742188},{"id":0,"name":"[T1][Br.Army]Brasilia","score":6080,"time":2129.8564453125},{"id":0,"name":"[T1]CARBURADORJ","score":4090,"time":2125.2346191406},{"id":0,"name":"[T1]compoundkiller","score":4830,"time":2123.0114746094},{"id":0,"name":"[T1]airsoft0skater","score":5140,"time":2068.2182617188},{"id":0,"name":"[T0]CookyTheDuck","score":5210,"time":1971.5570068359},{"id":0,"name":"[T0]ChapterMaster","score":5240,"time":1895.8389892578},{"id":0,"name":"[T0]i_Ryan","score":4140,"time":1561.7036132812},{"id":0,"name":"[T1]SmokinCowboy","score":5240,"time":1462.5111083984},{"id":0,"name":"[T0]-=MWP=-Minievildoer","score":1630,"time":874.5830078125},{"id":0,"name":"[T-1]RETROBANGBANG","score":0,"time":595.38348388672},{"id":0,"name":"[T0]|Leonhard","score":0,"time":231.25021362305},{"id":0,"name":"[T0](-n00b-)EVERCLIPS","score":0,"time":123.75677490234}],"port":7778,"protocol":17,"secure":0,"steam_id":90094379593627649,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Aapg/2_response.txt b/gameq/tests/Protocols/Providers/Aapg/2_response.txt deleted file mode 100644 index 765018bb2a2f48ffa1184a9a67ed3351dd1899c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmW+v&uhXk6n-Lt6fc9FJVr@&~cYMVtgL&|7pstSsy$iTnU;%vf{FbzId-+<1{i zOW-`Xa+yOYb1hE%rT*`jqm8awQC`tXS50}Y!OjTIcL2}D-NNs2GK>d0eO~mw74@gs z$7D@On``O?Gwi>TEls(WjY3IRLH28k$;RTHdPE&9wUtm-YDoi(Nz6W3Vk3;l{q7z7 E0Z>vz&j0`b diff --git a/gameq/tests/Protocols/Providers/Aapg/2_result.json b/gameq/tests/Protocols/Providers/Aapg/2_result.json deleted file mode 100644 index e2ff5f5..0000000 --- a/gameq/tests/Protocols/Providers/Aapg/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"208.100.40.101:8777":{"dedicated":"d","game_descr":"America's Army: Proving Grounds","game_dir":"aa4game","game_id":203290,"gq_address":"208.100.40.101","gq_joinlink":"steam:\/\/connect\/208.100.40.101:8777\/","gq_name":"America's Army: Proving Grounds","gq_online":true,"gq_port_client":"8777","gq_port_query":27020,"gq_protocol":"source","gq_transport":"udp","gq_type":"aapg","hostname":"U.S. Army Official BDX Only ORD24","keywords":"qp=27020;M=;ver=148023;T=Warmup Round;VM=0;P=0;C=1;pb=1;voip=1;sm=400;HONOR=1;","map":"BDX_OuterHospital_DE","max_players":12,"num_bots":0,"num_players":0,"os":"w","password":0,"port":7778,"protocol":17,"secure":0,"steam_id":90094358355068936,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Arkse/1_response.txt b/gameq/tests/Protocols/Providers/Arkse/1_response.txt deleted file mode 100644 index 0e4bcd4e7499dc7b51f4467b73900c5aef5c8d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 598 zcmZvaK~IA)7>2(kdfCCmi$}vvP3BTCV;d(C*w$=NLcwJxg3`@JCWdb8vOnby@UMww z!xDFDoEr!vGQI_Q_U;AGLMpwRRvX&quW-E=ma)#EyoQW4B|Li2en+q)lJi@@e0Kyp09O9YuRax z<1o<>d<{=UG=S!A*Axs2^Ek53zzC>MY-)LrmRCjyd0DcQq}z9aXdw{sUqoQ)Gav6w zNY<1tlnBK|OziR*UmvFi*t&0wN-qiga1OE}fb1Jo!2rSE+Mt7g353K*5nUWZp?#uuE zm-GMMe`%-F>7>_9XH~s0BNU6pXj0K5DKVGMr=l_zBEpvW{*i%bY%40%Xxg=iZ6M;* zORn$CoAbmf(RpUgQv-=wCL!n{D&P=BNHdVpLaX|tvF;x_PM%!z*B+(5e)p zaaAiMw!_z#V@BF2S&10Blj=d;ueaUq1qM2JEs`emf|}E@Hi@%lgjTB+ zEzi1%cWqh>uEKwWW|(@hK2|45-Dp)A+~4MIlams zSV7I2X}QE|aHMk?kOpxqyJk8ZIdBP(DdsSfi=$m}k~(!3>*v7Da{wg8f|gcw4y-=g z4dKwHSt&cjw6|2Lvo#uxa^)+hL1{Ro!fcb+9D4UCKo!Syxpd|*NGayhImYE?yX!y- zWPyvf7C~H)>AY#_-l9bhaCBq=(44A`kKqZu<;`;N?fn3%1wr<`O07ZQy`box7~ol8 zOGx^bMLlkOay5X|idd||A|CNP7Ce9TPf0;V8)Qec(=a8T*NJ4vP6F^9N0;s)8=eqc8k5}=%L$5+?wQjl0>ITA!Z zxVTe6kx^M2jR@CXIC}RdBrV@tVb##UC<~Jz=wqU+7I~y*X%teg(bggt_a;D89N+Y^ zj5Rs5Fu6lPnwnH2lA7blne&NmHnzdSbkOz@h)kJ5Y|1T8y))dka2rg>m_{`K2d>6p z2B53;Xpva~{qh%p6>7e1P{(F_x$~x}0R`;=GhsS~wHc0`>xqQzNJB(uh$E!A0&Um~ zOq3015~)Q+YmPK(!3?(EdO|^E->Qc4_tTFk$Thpfa?eO_FHE3Wff1&)V6J~ZbU$Qh z!P7}%`P@o3ZsTr?G`iph&2E^tFe*E&PVG{e872)za((nVMrxTlvt}@aXX{rm%9(cH zwW)OxBbhV;>G=L-j6`FO*g-BAk9-ZU5bA}K^3btU7+rhsGx!O(;RXfueRC4SV0aFx z!&V5-3KDVLmFAvbvjp+Ys#zde&37|_%jZ9Sj8TQbhVfz^-1ZShO@}S`?qF8cp%DW-@wTA-P$6vEi)XGpZ6W&TEWc&*)=4Ku^ZdXCg@&W+-p$$Vm1bRtemi-~J;b-KOB> z65kQ3jJm=~U;cjmii|Qgv8-?`M!x)2M!B4tl7zM(+J-}kJGf%~$&M2;9M($R_JfHO z?^}{llfkWFb1Yb+)1&Xn$n>ftC}a7j12Qt;{}my2u){C2q>OA64(cqahL`K+`ln^2 z!9j$J0O2`3YreZ7AuDNR)jd8_>%sC0cdOOS=;J}i9SVHYFQNryct<*yv JE<9Y2{sj~|Prv{G diff --git a/gameq/tests/Protocols/Providers/Arkse/2_result.json b/gameq/tests/Protocols/Providers/Arkse/2_result.json deleted file mode 100644 index 9e6a672..0000000 --- a/gameq/tests/Protocols/Providers/Arkse/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"79.133.51.105:7777":{"CUSTOMSERVERNAME_s":"[lost] www.bfs-gaming.de","DAYTIME_s":"14:43","GameMode_s":"TestGameMode_C","MATCHTIMEOUT_f":"120.000000","ModId_l":"0","NUMOPENPUBCONN":"18","OFFICIALSERVER_i":"0","OWNINGID":"90096642544037896","OWNINGNAME":"90096642544037896","P2PADDR":"90096642544037896","P2PPORT":"7777","SEARCHKEYWORDS_s":"Custom","SESSIONFLAGS":"683","ServerPassword_b":"false","dedicated":"d","game_descr":"ARK: Survival Evolved","game_dir":"ark_survival_evolved","game_id":346110,"gq_address":"79.133.51.105","gq_joinlink":"steam:\/\/connect\/79.133.51.105:7777\/","gq_name":"ARK: Survival Evolved","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"arkse","hostname":"[LOST] WWW.BFS-GAMING.DE - (v192.0)","keywords":",OWNINGID:90096642544037896,OWNINGNAME:90096642544037896,NUMOPENPUBCONN:18,P2PADDR:90096642544037896,P2PPORT:7777,ModId_l:0","map":"TheIsland","max_players":100,"num_bots":0,"num_players":82,"num_rules":14,"os":"w","password":0,"players":[{"id":0,"name":"Fantik","score":0,"time":12665.318359375},{"id":0,"name":"philsalm","score":0,"time":12659.999023438},{"id":0,"name":"marlnhir","score":0,"time":12658.619140625},{"id":0,"name":"Yoroi","score":0,"time":12658.559570312},{"id":0,"name":"Verko01","score":0,"time":12656.486328125},{"id":0,"name":"BATRIOS","score":0,"time":12655.251953125},{"id":0,"name":"mrepicbrain(ger)...","score":0,"time":12654.37890625},{"id":0,"name":"draconian","score":0,"time":12648.14453125},{"id":0,"name":"cris","score":0,"time":12645.431640625},{"id":0,"name":"Gosejo","score":0,"time":12639.109375},{"id":0,"name":"daTax","score":0,"time":12638.491210938},{"id":0,"name":"xDevilStylez","score":0,"time":12638.055664062},{"id":0,"name":"MORPHEUSwtf","score":0,"time":12632.141601562},{"id":0,"name":"OT Dutchmaniak","score":0,"time":12620.004882812},{"id":0,"name":"Lord Bullet","score":0,"time":12608.674804688},{"id":0,"name":"el-loco-tattoo","score":0,"time":12538.715820312},{"id":0,"name":"Crystopal","score":0,"time":12531.876953125},{"id":0,"name":"^SuBbE.Ger","score":0,"time":12512.310546875},{"id":0,"name":"| Max |","score":0,"time":12498.650390625},{"id":0,"name":"The old Man","score":0,"time":12479.622070312},{"id":0,"name":"SerrasMask","score":0,"time":12290.9921875},{"id":0,"name":"Tamara","score":0,"time":12228.379882812},{"id":0,"name":"AgoMar","score":0,"time":12190.372070312},{"id":0,"name":"-=DR=- †††† Blut...","score":0,"time":12180.59765625},{"id":0,"name":"LORD SHADOW","score":0,"time":12119.859375},{"id":0,"name":"Chewy","score":0,"time":12110.5859375},{"id":0,"name":"FruitLoop","score":0,"time":12053.6171875},{"id":0,"name":"ROBO-COM","score":0,"time":11953.431640625},{"id":0,"name":"Tandora","score":0,"time":11853.75},{"id":0,"name":"Leodane","score":0,"time":11812.677734375},{"id":0,"name":"Tasmo Kidge","score":0,"time":11575.298828125},{"id":0,"name":"Brack.Wolf","score":0,"time":11563.56640625},{"id":0,"name":"ThundernoX","score":0,"time":11414.286132812},{"id":0,"name":"Jack [GER]","score":0,"time":11073.438476562},{"id":0,"name":"Lord I Killer I","score":0,"time":10629.75},{"id":0,"name":"Abdullah.Aljamhi","score":0,"time":10084.116210938},{"id":0,"name":"bulghi","score":0,"time":9430.9365234375},{"id":0,"name":"sierra","score":0,"time":8834.5439453125},{"id":0,"name":"michirehm","score":0,"time":8802.7197265625},{"id":0,"name":"BlackBalu","score":0,"time":7948.5405273438},{"id":0,"name":"TheRexso","score":0,"time":7917.1782226562},{"id":0,"name":"broken_bodies","score":0,"time":7301.7607421875},{"id":0,"name":"Oberfix","score":0,"time":6957.4672851562},{"id":0,"name":"Mino","score":0,"time":6446.8930664062},{"id":0,"name":"Damo","score":0,"time":6252.0864257812},{"id":0,"name":"Adjana","score":0,"time":5907.3481445312},{"id":0,"name":"Taeter","score":0,"time":5844.5063476562},{"id":0,"name":"✪✪ Emsi","score":0,"time":5751.396484375},{"id":0,"name":"Setrakian \/ Cars...","score":0,"time":5505.0961914062},{"id":0,"name":"DigiTaLRusKi","score":0,"time":5368.5844726562},{"id":0,"name":"cobra","score":0,"time":5286.630859375},{"id":0,"name":"proxus303","score":0,"time":5280.2807617188},{"id":0,"name":"[DE]BerSerKer","score":0,"time":5276.060546875},{"id":0,"name":"BlueMonk","score":0,"time":5215.9912109375},{"id":0,"name":"Anoobis","score":0,"time":5145.3325195312},{"id":0,"name":"Kraex","score":0,"time":5085.7788085938},{"id":0,"name":"Kilib","score":0,"time":4950.2924804688},{"id":0,"name":"Vampir","score":0,"time":4471.6728515625},{"id":0,"name":"sushyonline","score":0,"time":4427.8520507812},{"id":0,"name":"The_Ripper","score":0,"time":4093.3427734375},{"id":0,"name":"Leeloo","score":0,"time":3826.1840820312},{"id":0,"name":"Ragnar_Liten","score":0,"time":3657.9858398438},{"id":0,"name":"Lord Of War","score":0,"time":3392.6599121094},{"id":0,"name":"Æc'ô","score":0,"time":2709.1723632812},{"id":0,"name":"R4nku","score":0,"time":2502.9467773438},{"id":0,"name":"Netos","score":0,"time":2446.2551269531},{"id":0,"name":"Blueweek","score":0,"time":2282.7768554688},{"id":0,"name":"Korsakoff","score":0,"time":2129.6362304688},{"id":0,"name":"[KdS]-Beer","score":0,"time":2040.7583007812},{"id":0,"name":"Durock","score":0,"time":2005.888671875},{"id":0,"name":"Sneakosaur goes ...","score":0,"time":1740.3111572266},{"id":0,"name":"Knallix","score":0,"time":1725.4757080078},{"id":0,"name":"MMOGC | Andreas3...","score":0,"time":1425.8955078125},{"id":0,"name":"macknum","score":0,"time":1376.1329345703},{"id":0,"name":"potatojoe","score":0,"time":1249.9288330078},{"id":0,"name":"itgas","score":0,"time":1003.1369018555},{"id":0,"name":"destaany","score":0,"time":777.74237060547},{"id":0,"name":"nigerfaget","score":0,"time":652.35852050781},{"id":0,"name":"Revi Black","score":0,"time":477.48461914062},{"id":0,"name":"lBlL4cKIDlE4TlH","score":0,"time":386.5866394043},{"id":0,"name":"andros2","score":0,"time":298.91931152344},{"id":0,"name":"|HACE|Becker","score":0,"time":212.06161499023}],"port":7777,"protocol":17,"secure":1,"steam_id":90096642544037896,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Arkse/3_response.txt b/gameq/tests/Protocols/Providers/Arkse/3_response.txt deleted file mode 100644 index ccdda9479cd3af9dcc7838e1ecbd354990e27299..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2393 zcmZuyeT*B$6@Le+KtKt!s6rH?1&T=9oa^)D?tB-5u=m5~-1#G3=W+?D%-B1&H(t+} z*)XG1mxU}57Elk1Q>ULeb!SurVbNc@wI`P?n581* zas9vJ7L?}m()hx&w^&dh!ew;akjT1U+ZNaZukUscmC*iOTP&D!>1w|3eptjr$UvR= z@lW%(q3sGDQ0BMY^t9YmZds8N+okSeZqcxyjpVwlmGFtLO8RgOqH|%#m0QFcSqtV} zPp$s@{w9n|TGV!x4l0kNE%1BEWOJbT9qQ3QrT5o=O|c&dcge&_2^@*Wuyp)GK)L6kN&J8nX?P3L)+EGte9PCajeP8}XHs;=Xb zKOHk+V~8s5QfH$~X5Z2g6K>XXKh*G=hC`1wL#LHUB&2cSpFc5y`W@Fx#oBAHIcS0( zpcwrPs^vD_cEE&E5OB@za51DzQT^7)e$3BpG*r$1f9+ut1Z@l&9u+FMefmKxm-JQf z|27^#{}5%O6*wwIo7Yc@p^j-d`ACdITF;u2b;10a?x*Y@qK+9Y`s}eu;^V@Ye zdGKd*l=TR9D89-_&pp3I$AL;6N9mbPuhSueUk|3))NLs_!t8&t$TWi4lXpF)-H=OV z5)Iy6jeX>3F)M??C4amkd%^DA7vT47C4Z@nmAaf2QAeA~Zi{l(XcM0bKiWK6AVDao zrt@w$WNt7REiaTui(D%;o1V+GQ7x(^?|XzffZw^AABw))Cti*Ax!1>Wkg3egXm*Th zW{d*tTn1+eM#d7!=m$s0+VfsHe!%_KO(W||+lu*OE^o|CCzI2Ylj9TP6BDTkWOX_= z6*C3%EXLy2LaA&P%UiR0saTvzrPr5J<&0re&f<%fa;Z|CnZjp%fjfDp=FKGGv)tDt zN2~Oh7lXdlu9gb6Sy?bE(ZMwzd_`F_xHk2^LRnW)hU~?Z_4>V0#!-e5Wng5sSMxGV zGCh+Ti&}_c0ua&q=X=}CCgs~J7B_D_rh9rEsW=N%>WLbGVpP5$~ z*Iaa3B^16wXl#n=I*T!;@9dU{K8WZ8+sst-**SCjwo=8gu?{`NHtd2;MW2c?enOYH ZaB6jE63?gTZrk}%(VEZXY?w@s!{aNo","score":0,"time":41250.14453125},{"id":0,"name":"Grex","score":0,"time":38126.9140625},{"id":0,"name":"Ron82","score":0,"time":35613.19140625},{"id":0,"name":"ISparky XzamQle","score":0,"time":34711.5078125},{"id":0,"name":"Dragaro","score":0,"time":28635.552734375},{"id":0,"name":"Allahu AQbar","score":0,"time":28067.171875},{"id":0,"name":"☆ M.M.O`7 ☆","score":0,"time":26475.2265625},{"id":0,"name":"jennaboyd","score":0,"time":24227.453125},{"id":0,"name":"NorthW3st","score":0,"time":23272.337890625},{"id":0,"name":"FX","score":0,"time":19290.029296875},{"id":0,"name":"apelsinsaft","score":0,"time":19206.09375},{"id":0,"name":"oddimannen","score":0,"time":18606.23046875},{"id":0,"name":"xenom","score":0,"time":18555.31640625},{"id":0,"name":"Xiran","score":0,"time":17472.615234375},{"id":0,"name":"Davrick00","score":0,"time":17452.341796875},{"id":0,"name":"dermarquis","score":0,"time":17391.859375},{"id":0,"name":"Frosty","score":0,"time":16905.75},{"id":0,"name":"Grantelbart","score":0,"time":16755.435546875},{"id":0,"name":"jeanjean","score":0,"time":15885.6015625},{"id":0,"name":"Heruor","score":0,"time":15346.0859375},{"id":0,"name":"OLI","score":0,"time":14381.934570312},{"id":0,"name":"Marine3D","score":0,"time":13550.5390625},{"id":0,"name":"Sylvikrin","score":0,"time":13402.6484375},{"id":0,"name":"Kieran","score":0,"time":13244.47265625},{"id":0,"name":"Fayt","score":0,"time":12905.744140625},{"id":0,"name":"Shirotenshi89","score":0,"time":12697.828125},{"id":0,"name":"Fanjo","score":0,"time":12566.073242188},{"id":0,"name":"henning.sass","score":0,"time":12547.985351562},{"id":0,"name":"Kuki","score":0,"time":12469.111328125},{"id":0,"name":"Lili","score":0,"time":12155.489257812},{"id":0,"name":"SageSix","score":0,"time":11815.330078125},{"id":0,"name":"sp00fy skeletn","score":0,"time":11772.211914062},{"id":0,"name":"Joey","score":0,"time":11200.1484375},{"id":0,"name":"warchild ","score":0,"time":10827.177734375},{"id":0,"name":"snapdragon","score":0,"time":10695.493164062},{"id":0,"name":"D-Baggins696","score":0,"time":9872.9091796875},{"id":0,"name":"rossaert","score":0,"time":9784.1650390625},{"id":0,"name":"edufac","score":0,"time":9520.0869140625},{"id":0,"name":"sakura","score":0,"time":9315.751953125},{"id":0,"name":"King_Flauschi","score":0,"time":9033.029296875},{"id":0,"name":"Salazar Volcae","score":0,"time":8105.6591796875},{"id":0,"name":"Draquo","score":0,"time":7516.8959960938},{"id":0,"name":"Zephr","score":0,"time":7251.64453125},{"id":0,"name":"Noar","score":0,"time":6652.0693359375},{"id":0,"name":"Rawked","score":0,"time":6596.1123046875},{"id":0,"name":"TheLomaxx","score":0,"time":6022.951171875},{"id":0,"name":"Cedounet","score":0,"time":5817.6328125},{"id":0,"name":";unnamed;","score":0,"time":5678.9458007812},{"id":0,"name":"[CG] Shizzlefudg...","score":0,"time":5276.1669921875},{"id":0,"name":"eskil200","score":0,"time":4993.92578125},{"id":0,"name":"sticks42","score":0,"time":4911.9047851562},{"id":0,"name":"Otto Skorzeny","score":0,"time":4864.2299804688},{"id":0,"name":"Ricci","score":0,"time":4858.1206054688},{"id":0,"name":"recycler.","score":0,"time":4796.9155273438},{"id":0,"name":"Dave","score":0,"time":4680.6186523438},{"id":0,"name":"Ruten Moshi","score":0,"time":4534.4008789062},{"id":0,"name":"nasreth","score":0,"time":4475.291015625},{"id":0,"name":"zhitaothomas","score":0,"time":3994.5817871094},{"id":0,"name":"Ikkeikke402","score":0,"time":3656.4899902344},{"id":0,"name":"butterball88","score":0,"time":3518.1877441406},{"id":0,"name":"kylerproprietor","score":0,"time":3237.6066894531},{"id":0,"name":"kabooodle","score":0,"time":2891.3498535156},{"id":0,"name":"Zagatore","score":0,"time":2528.1953125},{"id":0,"name":"Cramer2409","score":0,"time":2341.9938964844},{"id":0,"name":"Enulax","score":0,"time":2189.921875},{"id":0,"name":"Reznor","score":0,"time":2066.9270019531},{"id":0,"name":"TeKilla","score":0,"time":1876.4300537109},{"id":0,"name":"°Abu°","score":0,"time":1697.7952880859},{"id":0,"name":"Forsaken Reason","score":0,"time":1691.4118652344},{"id":0,"name":"zerlis","score":0,"time":1661.7938232422},{"id":0,"name":"Gamblah HD","score":0,"time":1627.1444091797},{"id":0,"name":"b0sz_nAsz","score":0,"time":1446.6735839844},{"id":0,"name":"Lindell","score":0,"time":1380.4309082031},{"id":0,"name":"Elaine","score":0,"time":1304.0061035156},{"id":0,"name":"Bondage*","score":0,"time":1280.0219726562},{"id":0,"name":"Wollering","score":0,"time":1206.5477294922},{"id":0,"name":"TE | Doxl","score":0,"time":1163.6446533203},{"id":0,"name":"Ivan","score":0,"time":1160.3547363281},{"id":0,"name":"Keystone","score":0,"time":733.13677978516},{"id":0,"name":"Lady of Ravens","score":0,"time":718.33026123047},{"id":0,"name":"The Bearded Zerg...","score":0,"time":650.97283935547},{"id":0,"name":"Progressblocker","score":0,"time":626.72271728516},{"id":0,"name":"Venemox","score":0,"time":504.53610229492},{"id":0,"name":"IxJack","score":0,"time":381.25302124023},{"id":0,"name":"belly_171","score":0,"time":338.23446655273},{"id":0,"name":"Burnt Toast","score":0,"time":319.94873046875},{"id":0,"name":"The Peruvian Jaj...","score":0,"time":257.34295654297},{"id":0,"name":"✪Kenpachi✪","score":0,"time":209.73718261719},{"id":0,"name":"Freddy","score":0,"time":168.2241973877},{"id":0,"name":"Aaron Seigh","score":0,"time":122.140625},{"id":0,"name":"LironBâ„¢ GwT)kUDqCK)?xulHfmP`vZ-?mD|Rws$wgxZ7*bwLLrI zx$d2rwY`aGBDH}42_mHh`at5Ls0|fuDiwtSMWs-QR~u+6S`ihANRcX46iR@mK$kPu zOU3-L@11kL^PSf>>+9?5GuNuzWCjmJnl>%BP9h`|{$y*U*kEMZavU<_)~M@?E?Fp$ zk0eMWp4c}*G}?uf<69o2M3at!^x`$*|Ie$^B?TIpqrRYIcr_ODndeU`?}F_HfMpZR zHb5*onTW;`iDY~f&b>3RO*uI@u=f*v6<-mt$%NvLDBgr(jVjHW;?$H?Uom~fx4GX? z>f>W$i7}-yQAyD8$z)uqjVRTT$XHxywG|c{Q&vV4dqjcL-|oY30E0)43}VvjdLQ)l zL4RL=d(-`W{r@U__V2frp8xUj%lf59uS~v@ZcJ}Kaq8UV-)3 z@=0kbai9#F(1CyYGX^X=)P#`fwntVB$aEbh-wof1CzYakW~NyDR2ep-$^4#M4VV(t z>`I%TUr-HLvRt1DkCe1xS>kMd^%esT6b+R)*6o315}&r1q<8b_qyc|A`Ymz@D7JK-RN_<;7xg>9PCZRUJMVSj=x(t__me9=w_ggs^-rVNQSZO&vupYT|QYY^gr%YW8EOgN>5p z$Z$tqY3b0SZWSBY+*qjO)rby0qs^MbIvt4YzS_ycY_C7_(6KqZqEq zWsl0R6W=_0Y_ksOVo`9%k?p-k|Az)sMncxScK;h1q?)+uv|Wb*v{!C=O@o|;WhW)n zvoc8upP=F`Q6b$c@CyxPP}tqx0)|_9W9w-R6Kna)Dz;df{j+jjgE{W9-kiTwcpSZ` z)n=5G4yBCV;-<5B8wzlqRambCbN0g+-s>_KMHjVTbaJ#eWp}^$5HfXI4N8`{Q`(Q4Ksz7W4J*eog}e zWhYN9$CFnJ>Kz(bUZYCokeygPj4Y{xGZ)ToW}u5lLA?ekrBXd|SN3)=JzQGfqAn@e zp&*(vUh6k4EY0*xj+6?yR6c{c7Cv9P*U}(wRZ%WD$uXaDIlrBU81_bRI+>JakKJ+` zCT$8t-PPmvm#;1$f6GQ03Iy&i4$=Dcc18oASGXfVcE2%&N7`ZDc#@Q+Gnq^;=I76T zOoQPlyePvK3}-w%tf3q>nI~h5y+a!APV^89P-}7LdniYDeHgE+ z92GfyjKeo-aKLgpIjdgpO+>h@f4yyc*e%vm!u`Q!Jb5i<`vj$!6dbz7qOzJVz5JF6 zk^Oo!wLj7$Bw-KuudAWL`5c8z&uXL?>xJKu_?-$R)EbmwRPHu@#ihd+U;BXyMf{cs zQVd*%vmVlDzxo{&H0Jnp{Qpw8bN@YRSbV#e!jF!91&_SKFdA;p>PG&@|NR9-oYoyy zXRaBaAf;#Sx^SLfINu}klk1MDu*f|W+d#B&sx#UAV((RQOAEj6%<}H^`j7>=1d!D==8DbX9^K9C{Y!^2Q{k>;E1&7vg@51Ng6E9CeA*V()l#42l XYNRxwrZyt}@@LCa(h4rV??URozRsB> diff --git a/gameq/tests/Protocols/Providers/Arma3/1_result.json b/gameq/tests/Protocols/Providers/Arma3/1_result.json deleted file mode 100644 index 54b307f..0000000 --- a/gameq/tests/Protocols/Providers/Arma3/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"172.93.103.90:2302":{"3rd_person":1,"advanced_flight_mode":0,"crosshair":0,"dedicated":"d","difficulty_ai":3,"difficulty_level":3,"dlcs":[{"name":"Karts","hash":"f58753fb"},{"name":"Marksmen","hash":"bdcf5b5e"},{"name":"Helicopters","hash":"e345e686"},{"name":"Apex","hash":"d938f4af"},{"name":"Jets","hash":"b486847"},{"name":"Laws of War","hash":"e6b18e89"},{"name":"Tac-Ops","hash":"80a05d1"},{"name":"Tanks","hash":"3c916866"}],"game_descr":"King of the Hill by Sa-Matra (v11test8, Infantry)","game_dir":"Arma3","game_id":107410,"gq_address":"172.93.103.90","gq_joinlink":"steam:\/\/connect\/172.93.103.90:2302\/","gq_name":"Arma3","gq_online":true,"gq_port_client":2302,"gq_port_query":2303,"gq_protocol":"source","gq_transport":"udp","gq_type":"arma3","hostname":"CodeFourGaming - King Of The Hill Infantry US #4 -24\/7 Day","keywords":"bt,r184,n0,s7,i3,mf,lf,vt,dt,tkoth,g65545,h7b4a6892,f0,c0-52,pw,e15,j0,k0,","map":"Altis","max_players":100,"mod_count":0,"num_bots":0,"num_players":95,"os":"w","overflow":0,"password":0,"players":[{"id":0,"name":"Steeven Davidson","score":0,"time":20269.57421875},{"id":0,"name":"Donovan","score":0,"time":16407.515625},{"id":0,"name":"Charles Rabbit [B4L]","score":3,"time":16279.108398438},{"id":0,"name":"Vlad","score":1,"time":15019.006835938},{"id":0,"name":"Kyle","score":3,"time":15009.0390625},{"id":0,"name":"Cat [KITTY]","score":4,"time":14218.576171875},{"id":0,"name":"Brady","score":3,"time":12532.192382812},{"id":0,"name":"Winters [DT]","score":1,"time":12279.50390625},{"id":0,"name":"LTFC liquid tape","score":0,"time":11876.55859375},{"id":0,"name":"• | SakhaDaJKiller","score":4,"time":10987.994140625},{"id":0,"name":"Jack Nightshade [B4L]","score":7,"time":10031.512695312},{"id":0,"name":"Royal","score":4,"time":10023.130859375},{"id":0,"name":"Joe Blow","score":1,"time":9987.6533203125},{"id":0,"name":"xX_420BootyWizzard_Xx","score":0,"time":8984.255859375},{"id":0,"name":"Michael (2)","score":0,"time":8627.787109375},{"id":0,"name":"jerzy","score":1,"time":8428.44921875},{"id":0,"name":"Madcat","score":-1,"time":8347.9921875},{"id":0,"name":"Osiris112","score":0,"time":7979.0200195312},{"id":0,"name":"Quietpink","score":7,"time":7973.2563476562},{"id":0,"name":"Burrito","score":1,"time":7764.1962890625},{"id":0,"name":"[DMG] Forsaken [DM]","score":9,"time":7644.826171875},{"id":0,"name":"Cobra","score":2,"time":7291.9780273438},{"id":0,"name":"Stebbins","score":3,"time":7017.232421875},{"id":0,"name":"alanj","score":2,"time":6882.4936523438},{"id":0,"name":"yuuki2926","score":1,"time":6522.4140625},{"id":0,"name":"Chop Up [C4G Admin]","score":0,"time":6081.9560546875},{"id":0,"name":"[TGS]Geezuz [TGS]","score":1,"time":5837.265625},{"id":0,"name":"InternetGroper","score":1,"time":5700.8681640625},{"id":0,"name":"WhiskeyDick","score":4,"time":5647.2133789062},{"id":0,"name":"dude","score":1,"time":5527.3862304688},{"id":0,"name":"Kyuper","score":-2,"time":5443.2255859375},{"id":0,"name":"RabidDragon","score":11,"time":5315.8505859375},{"id":0,"name":"Ol Red","score":3,"time":4951.3330078125},{"id":0,"name":"xTitle","score":0,"time":4724.78515625},{"id":0,"name":"Dr 2Gunz OD","score":6,"time":4574.517578125},{"id":0,"name":"[TGS]Chiparu [TGS]","score":6,"time":4526.2465820312},{"id":0,"name":"ADMIN","score":0,"time":4260.76171875},{"id":0,"name":"Pak Connor [FoC]","score":9,"time":4155.5947265625},{"id":0,"name":"[TGG] JorDaddyTTV","score":-6,"time":4086.6291503906},{"id":0,"name":"Squirrel's Nest","score":1,"time":4025.6577148438},{"id":0,"name":"CameronJ","score":-3,"time":3977.1733398438},{"id":0,"name":"kamil","score":0,"time":3853.5927734375},{"id":0,"name":"pancakeman","score":0,"time":2783.5764160156},{"id":0,"name":"teamflexx","score":1,"time":2299.0910644531},{"id":0,"name":"-OD- Clay","score":6,"time":2213.2082519531},{"id":0,"name":"SSgt. Nemo [C4G]","score":15,"time":2120.1108398438},{"id":0,"name":"GTTroll","score":2,"time":1970.1573486328},{"id":0,"name":"BF4","score":4,"time":1916.8562011719},{"id":0,"name":"Ammodawg","score":8,"time":1864.9428710938},{"id":0,"name":"Piper [v11] Art of War","score":2,"time":1608.0119628906},{"id":0,"name":"Kirky [DT]","score":4,"time":1547.5035400391},{"id":0,"name":"Capt_Cope","score":2,"time":1475.0926513672},{"id":0,"name":"Money","score":1,"time":1426.6197509766},{"id":0,"name":"Kaiwea [ZAF]","score":1,"time":1426.4774169922},{"id":0,"name":"The Rebel","score":0,"time":1355.3531494141},{"id":0,"name":"Psyentist [383]","score":0,"time":1350.6429443359},{"id":0,"name":"Alpha Wolf","score":2,"time":1256.8471679688},{"id":0,"name":"chajaso","score":-1,"time":1230.0571289062},{"id":0,"name":"ZeRuela","score":0,"time":1137.0084228516},{"id":0,"name":"sentaro","score":0,"time":1100.7557373047},{"id":0,"name":"MarcusD","score":1,"time":1093.3725585938},{"id":0,"name":"Fat Rails","score":1,"time":1021.0520629883},{"id":0,"name":"ishca","score":11,"time":1005.8521118164},{"id":0,"name":"Talon","score":1,"time":996.12957763672},{"id":0,"name":"Trash [AA]","score":0,"time":992.68676757812},{"id":0,"name":"Kristian Skonovd","score":0,"time":963.2099609375},{"id":0,"name":"CHIP [SPARKY]","score":0,"time":934.35247802734},{"id":0,"name":"Ricardo Petao","score":3,"time":918.63232421875},{"id":0,"name":"Broa89","score":0,"time":896.9951171875},{"id":0,"name":"Adrian's","score":1,"time":854.3740234375},{"id":0,"name":"Mike Burns","score":-1,"time":813.67346191406},{"id":0,"name":"tobol","score":3,"time":779.73687744141},{"id":0,"name":"taxes69 [HKKK]","score":0,"time":750.66467285156},{"id":0,"name":"(SOS) Col. Paulo [SOS]","score":5,"time":674.64489746094},{"id":0,"name":"James","score":0,"time":664.67883300781},{"id":0,"name":"Dr.Zeus [C4G]","score":0,"time":644.6171875},{"id":0,"name":"Dcody","score":0,"time":629.92614746094},{"id":0,"name":"LilxPigg [DT]","score":-2,"time":557.51470947266},{"id":0,"name":"Alex","score":0,"time":529.83184814453},{"id":0,"name":"Aspekt | Slaze.","score":1,"time":497.69400024414},{"id":0,"name":"-=E.A=-Paulo ","score":0,"time":472.90856933594},{"id":0,"name":"Burton [EOD T1]","score":0,"time":420.40664672852},{"id":0,"name":"[GS] Blackwing","score":0,"time":371.82458496094},{"id":0,"name":"Tyler Tunell","score":-2,"time":329.7380065918},{"id":0,"name":"Delta6 [C4G]","score":0,"time":298.48059082031},{"id":0,"name":"Ricky","score":0,"time":297.01354980469},{"id":0,"name":"Roberto Neves","score":0,"time":279.97283935547},{"id":0,"name":"THElegend27 [Åиoи]","score":0,"time":258.15426635742},{"id":0,"name":"Vossakurwa [KORV]","score":0,"time":185.02040100098},{"id":0,"name":"TickleToots [B4L]","score":0,"time":180.24565124512},{"id":0,"name":"Nino757","score":0,"time":154.72720336914},{"id":0,"name":"Dingesskahn [VG]","score":0,"time":128.7643737793},{"id":0,"name":"lagar","score":0,"time":108.35459136963},{"id":0,"name":"SPC.Damico.D [7CAV]","score":0,"time":55.942176818848},{"id":0,"name":"","score":0,"time":26.011161804199}],"port":2302,"protocol":17,"rules_protocol_version":2,"secure":0,"signature_count":2,"signatures":["a3","jsrs_soundmod"],"steam_id":90119306084166663,"steamappid":0,"version":"1.84.144923"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Arma3/2_response.txt b/gameq/tests/Protocols/Providers/Arma3/2_response.txt deleted file mode 100644 index 8913b9c889869c0ef518f401e994e096678f16f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 460 zcmYk1J8#rL6oqHTD368kkU%IQ#fT2++VXh(*zItf5G7)zC_y9=LaSMiH@n%jy_#{H ztdt@}nzRxB0HsX9U!Z{o6p5Y!(ef8C-V_nHIQojCbI+-&s@iz;Zhd$2z1bGJpC}q` zw?oQll$-gO?j)*A6hfg&1;0_sQGE?0k1%4E?^}$wyrz#n{hdSo>t_#Myu{rC6!U$^ zY|sn_CWEvGqaKt6$O86#&vQNK$1RTqt$;ynI?N5+CimT@`5!~ihVc<3HXPV6v;kdw z#M9rXadOhAdsnNsv_=pnh+y&*lXHw;fBt&8zAE=%;qh?c$A>S*l>y%|#$+kv5jAPO zW;(Gg#&k=>Ls~M+eO~-Jn_BL+qloT^Om_3*w|`E*-Ffo+=hAYNr|DrfC?<48=!Aw+ z=9#7?w;YSzCxYJ-JVk_{aYu~gp&G<9LMt)g^D85vi#S)w!&`czM4TwS7gf(dB3yNz zBcT{K8|2DC4$i;tqv-%TmzFwdXH6jpDT^oy1J6BvMTE`Q-djQwW)-%m+5Y3Q2n9YP zOi@TLF|V!lcSR6K(tMs5##`K+KjGAW2F?X5X)wky(wzR6RKm)A`H6oB!yUwyhPvu&Gy7k z7e!b*ty=U{3VE}xNmIw7|2nm8EwZWqA*H4M=q=+$Z5vjaWU@$`AQS5j`!J7@5v1Z#u*ICr>ftm*oJVQ0J)FfWGUcb8+XC4h%QI&%EqL?Ql_?ZRXo^b{V5~!*PK%Jn z5>sAT?iS(8k5CdD24;x<#X%9uS#5!7pM2dZ0x!!NEdiyal!YCY8J_x#8f;p~Fs5x) z(6DA~x6$wXDnKsz|GNE$?+U;h3eim#eCFB@f}1t0YKlj9ZJHwPB#>r51m8GxM}UnL zeEaOiDpuV4l4Qq}a|qE1LX2zVw>1G0c&5>h>500Zw)i^&Ox6qq4dF)B8|Bg?XDL6q zwR&rn`7DOV1#b_KKq|C1psUclI++k)OeQuC^+Y4gG5+220t{kMjN3!fpt{i zUmWvROxsuq3gK7GXAx(m4rfO z&gq(>)k|8ipI28(|1`Ju(vGVj0O^YyK5{5W0s=JVI@ ziJRB&$G=ah1G|^sx^eGzYiD~&J@lH%Z2~lWfF>hWCH(_v&Ad zsv3{S<3sybn}^ppA_%t0&2z1l*7J>(24^R6)T4Qn^fq@+qEA`v3$aQ^<@J@)l|*XCZBYUg}P zREh5ie5Ub{$j2ey4f$cn2RWbTXv`l~6-6byFA`ak%aST<^Z$i>e}hL8n0(X6k5A)7 zWBVXfy&7y`@~Qo2U060+MjfX98IS+E`@Rcao5s}Y#0i{6;*Z~|E;I*i;^U~RO=qdK z26r)kU~9nzH#rt3y)0+xZs{JDN+sEaTGY#7i0VY^Nf+vg-{~cr@Chd3Gt(|CMcpoI zLKpRi7x%cZ=rs*6P&JN%3sr{8!doc+ocqy%(a^ zohYsp7mCZHch`#x>&3-lyZE-)hVPLY{&dduDFE%cQca(uZ&I?mnY!k2;TYn3mcXW)n9~NB{BCw1%fImD?+>y!GvOFvt%Oy7vIiM;vpDGR(-&1-r`mOP^C;w1gc)S?B& z2gRqwnTh`4oxjc9qjw&I4sIP}LsKQqD7&&tEKxBf&60G%)@`B~vSw;3(aVbDS`a6} zOW44&1!10mX}H|5#F3I9RT?$xVJub@MPj<_i&XU$g{m|Z6)o@sxm*^7P-s(K)0F@( zcZK?4D9aiv<29vfn+kzI7?TP01)oY{n}!l&RMILt#&sG$^fmBBapD4JrcoYc9S$`M zI5$asmT@!HC}*>kU8a#nLz*+L7ImYXrkk9V#C_V^{6F^y_xdb-@Q#h07u#Vps6d~l UG$tTC2t*9>C}vd_=0Ftq7ue`i^8f$< diff --git a/gameq/tests/Protocols/Providers/Armedassault2oa/1_result.json b/gameq/tests/Protocols/Providers/Armedassault2oa/1_result.json deleted file mode 100644 index 17042f0..0000000 --- a/gameq/tests/Protocols/Providers/Armedassault2oa/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"85.234.175.75:2302":{"dedicated":"d","game_descr":"TVT40Domi_2CO!Chernarus[2.71]","game_dir":"arma2arrowpc","game_id":33930,"gq_address":"85.234.175.75","gq_joinlink":"steam:\/\/connect\/85.234.175.75:2302\/","gq_name":"Armed Assault 2: Operation Arrowhead","gq_online":true,"gq_port_client":2302,"gq_port_query":2303,"gq_protocol":"source","gq_transport":"udp","gq_type":"armedassault2oa","hash":"4A7637A8F4F1C25B37C390D9D15A47B7619853FC","hostname":"[RU] 100DB - TVT\/PVP Domination 2Teams","keywords":"bt,r163,n0,s7,i2,mf,lf,vf,dt,tteam,g65561,c2147483647-2147483647,pw,","map":"Chernarus","max_players":41,"modHashes:0-1":"BAF v. 1.03;PMC v. 1.02;553e94c2a6c55a6af257dcd48820f0ba9795d311;acff447e8647a6ba0d01ee41ac0ca32baf3eea37;","modNames:0-1":"Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite);Arma 2;Arma 2: Operation Arrowhead;","num_bots":0,"num_players":25,"num_rules":6,"os":"w","param1":"0","param2":"0","password":0,"players":[{"id":0,"name":"LOM","score":131,"time":20616.556640625},{"id":0,"name":"SATAN","score":-1279,"time":18169.466796875},{"id":0,"name":"ObamaChmo","score":137,"time":13109.461914062},{"id":0,"name":"Rub1con [REKT]","score":242,"time":11936.7734375},{"id":0,"name":"Foxmonster [REKT]","score":253,"time":11531.544921875},{"id":0,"name":"Mint","score":118,"time":9877.125},{"id":0,"name":"Nochnoy","score":155,"time":8872.1064453125},{"id":0,"name":"KilleR","score":108,"time":8365.14453125},{"id":0,"name":"JORA","score":65,"time":8217.828125},{"id":0,"name":"Lemon","score":125,"time":6277.4897460938},{"id":0,"name":"Sumathbrod [REKT]","score":79,"time":5467.0600585938},{"id":0,"name":"ExZent","score":36,"time":4927.8588867188},{"id":0,"name":"Juliory","score":46,"time":4203.5278320312},{"id":0,"name":"ABDUL","score":8,"time":2686.5056152344},{"id":0,"name":"Your_Boss","score":219,"time":2540.9252929688},{"id":0,"name":"Петрович_в_деле","score":194,"time":2030.1706542969},{"id":0,"name":"огурец(Ovashi 228)","score":24,"time":1379.5769042969},{"id":0,"name":"баклажан(овощи228)","score":18,"time":1373.8096923828},{"id":0,"name":"KING","score":152,"time":1058.9633789062},{"id":0,"name":"Levsha","score":0,"time":918.52954101562},{"id":0,"name":"Versace","score":-31,"time":685.51391601562},{"id":0,"name":"KaBaN","score":0,"time":399.42230224609},{"id":0,"name":"Sakis","score":0,"time":268.63967895508},{"id":0,"name":"OTMOROZKO1992","score":0,"time":202.0071105957},{"id":0,"name":"ГОР","score":0,"time":122.26125335693}],"port":2302,"protocol":17,"secure":0,"steam_id":90120212394624002,"steamappid":33930,"timeLeft":"15","version":"1.63.131129"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Armedassault2oa/2_response.txt b/gameq/tests/Protocols/Providers/Armedassault2oa/2_response.txt deleted file mode 100644 index 05f25d49f6dbae21cbafa4c826c373d1c8ecb447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1247 zcmZ`(F^t?q6dgp6NDxARBBDczra=VZoIDzuvb zjJFB7^&>}%e6Q!a>LPA0mASftFK@SoI1@$uPy;TB&DXjT_-v96Y@t?n3E|)v6 z9}W8lquY1saG_{FOOa}ep3}qVK!1ZpRhI=Fl(Je`SppL1PL;zR!^g38(@r zP^vtgC*&X5o(rHKFhL%Dd{q*8N(kF__%`E=SswZF(&ZO#;BSAu-+m#k4aFR8%=Cc} z!l+y$V@8o0d1{>0hOCXcT&P@&H71S_wlETl*{}M0qX#@%; z>oT9bdOsw0K%L;afa5<0I@`MJ-Eums%2~tm^3hgE_ReyoA2#+!-@g))IV|$>6lay` z>EF@#zv=(cBL`)?Q6V4y+#|ayxy|vXZ+_P!!FWJ}DO5-shWdgcdHb^-IYgz_O0NCB z*W3J<@G{Z(DQO8a;DPIM5prRMEa1ZFS#H;6q3H!(&tV?xbXtrQrM#m9u)1a5v`DuT z(UWb;woUGj2EoPN@*S26*Abp4ZQW)Vw}7E=0PWaLQag28E{juSp05|<(nOvnf-~FZ z%(cPhoH>q6C6_Es1+;7scI->w9&ki~PHe}fpaIW<^(v5XVF}OZjEd=H{mXMNZQLdYE(_E?9hvMRD zI{IZ&>lW>*OgGR}H*JBEMx{!yqBr_kjqmvz%t&P?Q0ut5Gyk5MLBWW*-dK85Ws^;1jKtXn?Z=trlR7J~k7-Txl=&MFZE4B? diff --git a/gameq/tests/Protocols/Providers/Armedassault2oa/2_result.json b/gameq/tests/Protocols/Providers/Armedassault2oa/2_result.json deleted file mode 100644 index 63bdde0..0000000 --- a/gameq/tests/Protocols/Providers/Armedassault2oa/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"198.148.93.196:2308":{"dedicated":"d","game_descr":"Our Life RPG Island Life V15","game_dir":"arma2arrowpc","game_id":33930,"gq_address":"198.148.93.196","gq_joinlink":"steam:\/\/connect\/198.148.93.196:2308\/","gq_name":"Armed Assault 2: Operation Arrowhead","gq_online":true,"gq_port_client":2308,"gq_port_query":2309,"gq_protocol":"source","gq_transport":"udp","gq_type":"armedassault2oa","hash":"850C3C7735E350E1C356D27B41E09CB96191AA81","hostname":"[OLRPG] Our Life RPG | TFR | Custom Mods | Cicada Island Life","keywords":"bt,r163,n112555,s7,i1,mf,lf,vt,dt,tourlife,g65545,c2147483647-2147483647,pw,","map":"cmr_cicada","max_players":100,"modHashes:0-2":"BAF v. 1.03;PMC v. 1.02;61f576599d4129eb8a1e56ae4b4cf4f6871bfe19;;;;13d0e3fc531443174a433166dfd3d1ff5a84a54b;da39a3ee5e6b4b0d32","modHashes:1-2":"55bfef95601890afd80709;da39a3ee5e6b4b0d3255bfef95601890afd80709;020bc5504e73c437e69d3b29c333fc6d7b659ba7;e28ea19625dd139a77f300","modNames:0-2":"Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite);Arma 2: Operation Arrowhead;Arma 2;beta;Expansion;@","modNames:1-2":"A2;@Arma2NET;@extDB;@Server_Files;OurLifeRPG;","num_bots":0,"num_players":21,"num_rules":9,"os":"w","param1":"0","param2":"0","password":0,"players":[{"id":0,"name":"Jake","score":0,"time":10701.799804688},{"id":0,"name":"Kasper Saagaard","score":0,"time":10567.5},{"id":0,"name":"PIOTR","score":0,"time":10158.611328125},{"id":0,"name":"andy","score":0,"time":9718.607421875},{"id":0,"name":"Silver Aris","score":-1,"time":9372.447265625},{"id":0,"name":"Irish","score":0,"time":6988.724609375},{"id":0,"name":"OneShot","score":0,"time":6961.9672851562},{"id":0,"name":"jared","score":0,"time":6561.88671875},{"id":0,"name":"[Mod] Daeron Decker","score":0,"time":6267.826171875},{"id":0,"name":"George M","score":0,"time":5411.265625},{"id":0,"name":"Curtis Calvert","score":0,"time":5248.7084960938},{"id":0,"name":"Polish","score":0,"time":3905.6586914062},{"id":0,"name":"Nigel Farage","score":0,"time":3744.8542480469},{"id":0,"name":"Harvey","score":0,"time":3295.0886230469},{"id":0,"name":"Casper Johnson","score":0,"time":2469.689453125},{"id":0,"name":"Kyle W","score":0,"time":2236.5930175781},{"id":0,"name":"paulowens09112","score":0,"time":1898.3984375},{"id":0,"name":"Robert","score":0,"time":1677.2934570312},{"id":0,"name":"Jorge","score":0,"time":1576.6123046875},{"id":0,"name":"CSM Chase Johnston","score":0,"time":1240.8558349609},{"id":0,"name":"Terry","score":0,"time":815.65771484375}],"port":2308,"protocol":17,"secure":0,"sigNames:0-1":"bi;OurLife;bi2;","steam_id":90120327730112515,"steamappid":33930,"timeLeft":"15","version":"1.63.131129"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Armedassault2oa/3_response.txt b/gameq/tests/Protocols/Providers/Armedassault2oa/3_response.txt deleted file mode 100644 index 8421a92d502d6944f6ec3dea042754a2563c6247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 814 zcmYLHyHDFd9R8sS2_agEsuJsst?F1lpI^ZXc{xGi5e51{h~aFXlM``loe!cQh7Rda zP{$7KA5pbZH---7f9cSnQpXNWF9E_W_kG{}9`}1pCX>nL>S541LOU#%Cj*9FQISx= zP;D3O(_>ypI)FK#BBdr3A{*ur9NJFFJeoUH8|bB}8!pia+TwB+p;ber`!E;d6$J4R z0P7CXF~Qg@!`I2uQfu|<_w$W~P-+4@L>m}d;cDE}(nRYg+NsoHsmVxkt?SsfWowa% zE!XmhW4Wb!sO3WqF2*oB%jf6Is<=sg1$vCeeO44R{RzHmLQQ089%U(9F97I&#{pFO zArmr#GbQ{PKAs93HFY>peDTY}0JiCm&r-GJAd4xiDK-4`s{yU%9;~aluivdSV6V|> zZoYs;#V^a(b?DGh9hMb)bosFkBbp5vhX;zk{rRB|hwVYBJvhpZn>aZ_( zx64F}=J{x*{(JMS3hhkIp^xe(F`J3+kH^)!3L8rhWhVnEMi6wMM~fb~u4OwlTr-GW zZ4l23T-p_~uE#<(9b)$sAr%{qvmdiZVSn7n-hz-n`g=u6& zl$aq+2xFAEezg*yQypR5Abxwhc8g6vrld@jjm@0U3XPbUwjCxcDcg>Ly|O`**fU(C z>`ycA(DXKOMXePw{hMnY?dD8S$+H2fOjm6>zxi8LaLJ3FdP!M~f=ooLKu@Rp_H1s` z7W|Z|1>EL+E~yxyni@A9jPC34W4c+hU0XY{P%) Cv+wx; diff --git a/gameq/tests/Protocols/Providers/Armedassault2oa/3_result.json b/gameq/tests/Protocols/Providers/Armedassault2oa/3_result.json deleted file mode 100644 index f13a626..0000000 --- a/gameq/tests/Protocols/Providers/Armedassault2oa/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"176.31.74.236:2303":{"country":"FR","dedicated":"d","game_descr":"[56-2] Warfare BE V2.073.3 Lite CO HC - Takistan","game_dir":"arma2arrowpc","game_id":33930,"gq_address":"176.31.74.236","gq_joinlink":"steam:\/\/connect\/176.31.74.236:2303\/","gq_name":"Armed Assault 2: Operation Arrowhead","gq_online":true,"gq_port_client":2303,"gq_port_query":2304,"gq_protocol":"source","gq_transport":"udp","gq_type":"armedassault2oa","hash":"77456C1C035BE388F71E74183A1053FA38C6E478","hostname":"[FR] Neptune Warfare CO Takistan","keywords":"bt,r163,n0,s7,i2,mf,lf,vt,dt,tcti,g65545,c2147483647-2147483647,pw,","map":"Takistan","max_players":32,"modHashes:0-1":";acff447e8647a6ba0d01ee41ac0ca32baf3eea37;BAF v. 1.03;PMC v. 1.02;da39a3ee5e6b4b0d3255bfef95601890afd80709;","modNames:0-1":"Arma 2;Arma 2: Operation Arrowhead;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite);@ac;","num_bots":0,"num_players":12,"num_rules":8,"os":"w","param1":"0","param2":"0","password":0,"players":[{"id":0,"name":"headless","score":0,"time":95842.15625},{"id":0,"name":"Crompcom","score":452,"time":17021.08984375},{"id":0,"name":"Alberto","score":378,"time":9373.986328125},{"id":0,"name":"Ali G.","score":345,"time":9068.0048828125},{"id":0,"name":"Maître Yoda","score":279,"time":7539.2978515625},{"id":0,"name":"HGS","score":58,"time":2248.583984375},{"id":0,"name":"SERGIU","score":5,"time":1569.7982177734},{"id":0,"name":"RayD","score":10,"time":1228.3454589844},{"id":0,"name":"yaowei","score":3,"time":1199.2349853516},{"id":0,"name":"[Pn-Pn]popoti","score":0,"time":1000.3710327148},{"id":0,"name":"TriggerHappy","score":0,"time":90.251937866211},{"id":0,"name":"Postal Dude","score":0,"time":66.210060119629}],"port":2303,"protocol":17,"secure":0,"sigNames:0-1":"bi;bi2;","steam_id":90120301183059976,"steamappid":33930,"timeLeft":"15","version":"1.63.131129"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Batt1944/1_response.txt b/gameq/tests/Protocols/Providers/Batt1944/1_response.txt deleted file mode 100644 index 0158ff88217c48e0b89441b7fe720ea45fd51ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmZvYQA)!=5Qe8O3iZhgNPG|!RJsX`NuNyEv;@*5G%Y@egsoXLkR~C!qJ>_sbLr@ctR wzi6v}+vCULC70Mm2>bzoJs_Rc0O>J1ApK4Q1X>`G6Gd*|Pd#fEfo^E<1De!`>Hq)$ diff --git a/gameq/tests/Protocols/Providers/Batt1944/1_result.json b/gameq/tests/Protocols/Providers/Batt1944/1_result.json deleted file mode 100644 index 11a3498..0000000 --- a/gameq/tests/Protocols/Providers/Batt1944/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"139.99.168.223:7777":{"OWNINGID":"90113301119333382","OWNINGNAME":"90113301119333382","P2PADDR":"90113301119333382","P2PPORT":"7777","SESSIONFLAGS":"683","bat_gamemode_s":"BOMB","bat_has_password_s":"N","bat_map_s":"Derailed","bat_max_players_i":"10","bat_name_s":"[NF]AU BoltSnipers (RELEASE-11126)","bat_player_count_s":"11","dedicated":"d","game_descr":"Unreal Test!","game_dir":"TDM","game_id":489940,"gq_address":"139.99.168.223","gq_joinlink":"steam:\/\/connect\/139.99.168.223:7777\/","gq_name":"Battalion 1944","gq_online":true,"gq_port_client":7777,"gq_port_query":7780,"gq_protocol":"source","gq_transport":"udp","gq_type":"batt1944","hostname":"90113301119333382","keywords":"BUILDID:558161692,OWNINGID:90113301119333382,OWNINGNAME:90113301119333382,P2PADDR:90113301119333382,P2PPORT:7777","map":"Liberation","max_players":100,"num_bots":0,"num_players":0,"num_rules":11,"os":"l","password":0,"port":7777,"protocol":17,"secure":1,"steam_id":90113301119333382,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Batt1944/2_response.txt b/gameq/tests/Protocols/Providers/Batt1944/2_response.txt deleted file mode 100644 index 1cccb703178ec26de0c8a0323a5c1c0ac48c161f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmZvY+e*Vg5Qe8$N>xzsTH=MEpprwo?e@yV#1P1dY>O8nVKqU8oXAGB(3kQJdMqPDI<(!j3#J=6$H0AWfe_8^BfHpSsBwrn8&O-1s;bG zB`}b##pb~mJ=r}z*!w=a8E6a3)-8QD9#17CAuL~d_pardytMVjT5?s#=n;L{S9Lw; zS9~v+&n7(JXSvfX1jE&8$Sy|dibK|&($rol3k%BFM_xv}?zYC1 z7Chga-Plt485Rj$#w82iKtio8-(DI~W0?BmYJTPoSCB_x!s7xF=wrUbUQw4qjZa|6a diff --git a/gameq/tests/Protocols/Providers/Batt1944/2_result.json b/gameq/tests/Protocols/Providers/Batt1944/2_result.json deleted file mode 100644 index 2593597..0000000 --- a/gameq/tests/Protocols/Providers/Batt1944/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"108.61.238.62:7777":{"GameMode_s":"BOMB","OWNINGID":"90113499296764936","OWNINGNAME":"90113499296764936","P2PADDR":"90113499296764936","P2PPORT":"7777","SESSIONFLAGS":"683","bat_gamemode_s":"BOMB","bat_has_password_s":"N","bat_map_s":"Coastal","bat_max_players_i":"16","bat_name_s":"[SoS] Bolts SnD (RELEASE-11338)","bat_player_count_s":"0","dedicated":"d","game_descr":"Unreal Test!","game_dir":"BOMB","game_id":489940,"gq_address":"108.61.238.62","gq_joinlink":"steam:\/\/connect\/108.61.238.62:7777\/","gq_name":"Battalion 1944","gq_online":true,"gq_port_client":7777,"gq_port_query":7780,"gq_protocol":"source","gq_transport":"udp","gq_type":"batt1944","hostname":"90113499296764936","keywords":"BUILDID:558161692,OWNINGID:90113499296764936,OWNINGNAME:90113499296764936,P2PADDR:90113499296764936,P2PPORT:7777","map":"Coastal","max_players":16,"num_bots":0,"num_players":0,"num_rules":12,"os":"l","password":0,"port":7777,"protocol":17,"secure":1,"steam_id":90113499296764936,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf1942/1_response.txt b/gameq/tests/Protocols/Providers/Bf1942/1_response.txt deleted file mode 100644 index 5ea9770..0000000 --- a/gameq/tests/Protocols/Providers/Bf1942/1_response.txt +++ /dev/null @@ -1,5 +0,0 @@ -\gamename\bfield1942\gamever\v1.612\averageFPS\0\content_check\1\dedicated\2\gameId\bf1942\gamemode\openplaying\gametype\conquest\hostname\SiMPLE | BF1942 [USA]\hostport\14567\mapId\BF1942\mapname\berlin\maxplayers\36\numplayers\17\password\0\reservedslots\0\roundTime\2040\roundTimeRemain\694\status\4\sv_punkbuster\0\tickets1\534\tickets2\239\unpure_mods\\version\v1.612\active_mods\bf1942\allied_team_ratio\1\allow_nose_cam\yes\auto_balance_teams\off\axis_team_ratio\1\bandwidth_choke_limit\0\content_check\1\cpu\3499\external_view\on\free_camera\off\game_start_delay\45s\hit_indicator\on\kickback\0%\kickback_on_splash\0%\name_tag_distance\600\name_tag_distance_scope\600\number_of_rounds\1\soldier_friendly_fire\100%\soldier_friendly_fire_on_splash\100%\spawn_delay\6s\spawn_wave_time\6s\sv_punkbuster\0\ticket_ratio\267%\time_limit\34\tk_mode\punish\unpure_mods\\vehicle_friendly_fire\100%\vehicle_friendly_fire_on_splash\100%\queryid\1142.1 -|| -\deaths_0\8\kills_0\13\ping_0\187\playername_0\FEDIYMAX\score_0\7\team_0\2\deaths_1\23\kills_1\87\ping_1\124\playername_1\[OYZ]Fake_Katczinsky\score_1\87\team_1\1\deaths_2\9\kills_2\57\ping_2\49\playername_2\Åiôñ\score_2\39\team_2\2\deaths_3\28\kills_3\88\ping_3\216\playername_3\xXx TRexBrazil xXx\score_3\91\team_3\1\deaths_4\32\kills_4\30\ping_4\216\playername_4\MITOMANIACO_BR\score_4\24\team_4\2\deaths_5\19\kills_5\38\ping_5\120\playername_5\tanaka\score_5\32\team_5\1\deaths_6\23\kills_6\19\ping_6\83\playername_6\Legomanmd\score_6\10\team_6\2\deaths_7\13\kills_7\69\ping_7\232\playername_7\dark side of the moon\score_7\66\team_7\1\deaths_8\13\kills_8\42\ping_8\111\playername_8\DREAMS\score_8\54\team_8\1\deaths_9\25\kills_9\30\ping_9\216\playername_9\Skrym\score_9\30\team_9\2\deaths_10\9\kills_10\50\ping_10\231\playername_10\Turk\score_10\47\team_10\1\deaths_11\22\kills_11\18\ping_11\277\playername_11\Pocket Edition\score_11\12\team_11\2\deaths_12\14\kills_12\28\ping_12\205\playername_12\ Zong\score_12\22\team_12\2\deaths_13\4\kills_13\13\ping_13\93\playername_13\Nurse Kevorkian\score_13\10\team_13\1\deaths_14\1\kills_14\6\ping_14\207\playername_14\Calvin\score_14\9\team_14\2\deaths_15\0\kills_15\0\ping_15\260\playername_15\JLucas\score_15\0\team_15\1\deaths_16\0\kills_16\0\ping_16\0\playername_16\zDiogozCraftz\queryid\1142.2 -|| -\score_16\0\team_16\1\deaths_17\0\kills_17\0\ping_17\0\playername_17\Taxman\score_17\0\team_17\1\teamname_0\axis\teamname_1\allied\final\\queryid\1142.3 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf1942/1_result.json b/gameq/tests/Protocols/Providers/Bf1942/1_result.json deleted file mode 100644 index fb0f3ad..0000000 --- a/gameq/tests/Protocols/Providers/Bf1942/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"168.235.75.198:14567":{"active_mods":"bf1942","allied_team_ratio":"1","allow_nose_cam":"yes","auto_balance_teams":"off","averageFPS":"0","axis_team_ratio":"1","bandwidth_choke_limit":"0","content_check":"1","cpu":"3499","dedicated":"2","external_view":"on","final":"","free_camera":"off","gameId":"bf1942","game_start_delay":"45s","gamemode":"openplaying","gamename":"bfield1942","gametype":"conquest","gamever":"v1.612","gq_address":"168.235.75.198","gq_joinlink":"bf1942:\/\/168.235.75.198:14567","gq_name":"Battlefield 1942","gq_online":true,"gq_port_client":14567,"gq_port_query":23000,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"bf1942","hit_indicator":"on","hostname":"SiMPLE | BF1942 [USA]","hostport":"14567","kickback":"0%","kickback_on_splash":"0%","mapId":"BF1942","mapname":"berlin","maxplayers":"36","name_tag_distance":"600","name_tag_distance_scope":"600","num_players":18,"num_teams":2,"number_of_rounds":"1","numplayers":"17","password":"0","players":[{"deaths":"8","kills":"13","ping":"187","playername":"FEDIYMAX","score":"7","team":"2"},{"deaths":"23","kills":"87","ping":"124","playername":"[OYZ]Fake_Katczinsky","score":"87","team":"1"},{"deaths":"9","kills":"57","ping":"49","playername":"Ã…iôñ","score":"39","team":"2"},{"deaths":"28","kills":"88","ping":"216","playername":"xXx TRexBrazil xXx","score":"91","team":"1"},{"deaths":"32","kills":"30","ping":"216","playername":"MITOMANIACO_BR","score":"24","team":"2"},{"deaths":"19","kills":"38","ping":"120","playername":"tanaka","score":"32","team":"1"},{"deaths":"23","kills":"19","ping":"83","playername":"Legomanmd","score":"10","team":"2"},{"deaths":"13","kills":"69","ping":"232","playername":"dark side of the moon","score":"66","team":"1"},{"deaths":"13","kills":"42","ping":"111","playername":"DREAMS","score":"54","team":"1"},{"deaths":"25","kills":"30","ping":"216","playername":"Skrym","score":"30","team":"2"},{"deaths":"9","kills":"50","ping":"231","playername":"Turk","score":"47","team":"1"},{"deaths":"22","kills":"18","ping":"277","playername":"Pocket Edition","score":"12","team":"2"},{"deaths":"14","kills":"28","ping":"205","playername":" Zong","score":"22","team":"2"},{"deaths":"4","kills":"13","ping":"93","playername":"Nurse Kevorkian","score":"10","team":"1"},{"deaths":"1","kills":"6","ping":"207","playername":"Calvin","score":"9","team":"2"},{"deaths":"0","kills":"0","ping":"260","playername":"JLucas","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"0","playername":"zDiogozCraftz","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"0","playername":"Taxman","score":"0","team":"1"}],"reservedslots":"0","roundTime":"2040","roundTimeRemain":"694","soldier_friendly_fire":"100%","soldier_friendly_fire_on_splash":"100%","spawn_delay":"6s","spawn_wave_time":"6s","status":"4","sv_punkbuster":"0","teams":[{"teamname":"axis"},{"teamname":"allied"}],"ticket_ratio":"267%","tickets1":"534","tickets2":"239","time_limit":"34","tk_mode":"punish","unpure_mods":"","vehicle_friendly_fire":"100%","vehicle_friendly_fire_on_splash":"100%","version":"v1.612"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf1942/2_response.txt b/gameq/tests/Protocols/Providers/Bf1942/2_response.txt deleted file mode 100644 index 76c4322..0000000 --- a/gameq/tests/Protocols/Providers/Bf1942/2_response.txt +++ /dev/null @@ -1 +0,0 @@ -\gamename\bfield1942\gamever\v1.612\language\English\location\1033\averageFPS\0\content_check\0\dedicated\1\gameId\bf1942\gamemode\openplaying\gametype\ctf\hostname\HKHP CTF Guadal Canal CD&ORIGIN\hostport\14567\mapId\BF1942\mapname\guadalcanal\maxplayers\50\numplayers\0\password\0\reservedslots\0\roundTime\3600\roundTimeRemain\2512\status\4\sv_punkbuster\0\tickets1\0\tickets2\0\unpure_mods\dcfinal, desertcombat, pirates\version\v1.612\active_mods\bf1942\allied_team_ratio\1\allow_nose_cam\yes\auto_balance_teams\off\axis_team_ratio\1\bandwidth_choke_limit\0\content_check\0\cpu\2960\external_view\on\free_camera\off\game_start_delay\20s\hit_indicator\on\kickback\0%\kickback_on_splash\0%\name_tag_distance\100\name_tag_distance_scope\300\number_of_rounds\1\soldier_friendly_fire\0%\soldier_friendly_fire_on_splash\0%\spawn_delay\2s\spawn_wave_time\3s\sv_punkbuster\0\ticket_ratio\100%\time_limit\60\tk_mode\forgive\unpure_mods\dcfinal, desertcombat, pirates\vehicle_friendly_fire\0%\vehicle_friendly_fire_on_splash\0%\teamname_0\axis\teamname_1\allied\final\\queryid\542.1 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf1942/2_result.json b/gameq/tests/Protocols/Providers/Bf1942/2_result.json deleted file mode 100644 index 8e8dbe7..0000000 --- a/gameq/tests/Protocols/Providers/Bf1942/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"173.236.29.178:14567":{"active_mods":"bf1942","allied_team_ratio":"1","allow_nose_cam":"yes","auto_balance_teams":"off","averageFPS":"0","axis_team_ratio":"1","bandwidth_choke_limit":"0","content_check":"0","cpu":"2960","dedicated":"1","external_view":"on","final":"","free_camera":"off","gameId":"bf1942","game_start_delay":"20s","gamemode":"openplaying","gamename":"bfield1942","gametype":"ctf","gamever":"v1.612","gq_address":"173.236.29.178","gq_joinlink":"bf1942:\/\/173.236.29.178:14567","gq_name":"Battlefield 1942","gq_online":true,"gq_port_client":14567,"gq_port_query":23000,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"bf1942","hit_indicator":"on","hostname":"HKHP CTF Guadal Canal CD&ORIGIN","hostport":"14567","kickback":"0%","kickback_on_splash":"0%","language":"English","location":"1033","mapId":"BF1942","mapname":"guadalcanal","maxplayers":"50","name_tag_distance":"100","name_tag_distance_scope":"300","num_players":0,"num_teams":2,"number_of_rounds":"1","numplayers":"0","password":"0","reservedslots":"0","roundTime":"3600","roundTimeRemain":"2512","soldier_friendly_fire":"0%","soldier_friendly_fire_on_splash":"0%","spawn_delay":"2s","spawn_wave_time":"3s","status":"4","sv_punkbuster":"0","teams":[{"teamname":"axis"},{"teamname":"allied"}],"ticket_ratio":"100%","tickets1":"0","tickets2":"0","time_limit":"60","tk_mode":"forgive","unpure_mods":"dcfinal, desertcombat, pirates","vehicle_friendly_fire":"0%","vehicle_friendly_fire_on_splash":"0%","version":"v1.612"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf1942/3_response.txt b/gameq/tests/Protocols/Providers/Bf1942/3_response.txt deleted file mode 100644 index 26abd26..0000000 --- a/gameq/tests/Protocols/Providers/Bf1942/3_response.txt +++ /dev/null @@ -1,3 +0,0 @@ -\gamename\bfield1942\gamever\v1.61\active_mods\,\averageFPS\0\content_check\1\dedicated\2\gameId\xpack2\gamemode\pre\gametype\conquest\hostname\SiMPLE | RtR+SW [FRA]\hostport\14568\mapId\XPack2\mapname\telemark\maxplayers\36\numplayers\14\password\0\reservedslots\0\roundTime\2520\roundTimeRemain\2520\status\4\sv_punkbuster\0\tickets1\720\tickets2\720\unpure_mods\\version\v1.61\active_mods\xpack1, xpack2\allied_team_ratio\1\allow_nose_cam\yes\auto_balance_teams\off\axis_team_ratio\1\bandwidth_choke_limit\0\content_check\1\cpu\2993\external_view\on\free_camera\off\game_start_delay\60s\hit_indicator\on\kickback\0%\kickback_on_splash\0%\name_tag_distance\600\name_tag_distance_scope\600\number_of_rounds\1\soldier_friendly_fire\100%\soldier_friendly_fire_on_splash\100%\spawn_delay\6s\spawn_wave_time\6s\sv_punkbuster\0\ticket_ratio\320%\time_limit\42\tk_mode\punish\unpure_mods\\vehicle_friendly_fire\100%\vehicle_friendly_fire_on_splash\100%\queryid\32.1 -|| -\deaths_0\0\kills_0\0\ping_0\51\playername_0\John Gult\score_0\0\team_0\2\deaths_1\0\kills_1\0\ping_1\19\playername_1\Dr-Duke\score_1\0\team_1\1\deaths_2\0\kills_2\0\ping_2\163\playername_2\Lt Joe\score_2\0\team_2\2\deaths_3\0\kills_3\0\ping_3\45\playername_3\ICEKILLER\score_3\0\team_3\1\deaths_4\0\kills_4\0\ping_4\51\playername_4\TURPIN \score_4\0\team_4\1\deaths_5\0\kills_5\0\ping_5\50\playername_5\BFSoldier\score_5\0\team_5\2\deaths_6\0\kills_6\0\ping_6\86\playername_6\Sarg.Richardista Waffen\score_6\0\team_6\2\deaths_7\0\kills_7\0\ping_7\27\playername_7\Maersk Pembroke\score_7\0\team_7\1\deaths_8\0\kills_8\0\ping_8\67\playername_8\Satana\score_8\0\team_8\1\deaths_9\0\kills_9\0\ping_9\42\playername_9\IBOOxD\score_9\0\team_9\2\deaths_10\0\kills_10\0\ping_10\50\playername_10\WaRRior:3\score_10\0\team_10\1\deaths_11\0\kills_11\0\ping_11\39\playername_11\ROGER THAT\score_11\0\team_11\2\deaths_12\0\kills_12\0\ping_12\0\playername_12\krieg\score_12\0\team_12\1\deaths_13\0\kills_13\0\ping_13\0\playername_13\Bear Cat \score_13\0\team_13\2\teamname_0\axis\teamname_1\allied\final\\queryid\32.2 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf1942/3_result.json b/gameq/tests/Protocols/Providers/Bf1942/3_result.json deleted file mode 100644 index 3d1bd5c..0000000 --- a/gameq/tests/Protocols/Providers/Bf1942/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"188.165.220.115:14568":{"active_mods":"xpack1, xpack2","allied_team_ratio":"1","allow_nose_cam":"yes","auto_balance_teams":"off","averageFPS":"0","axis_team_ratio":"1","bandwidth_choke_limit":"0","content_check":"1","cpu":"2993","dedicated":"2","external_view":"on","final":"","free_camera":"off","gameId":"xpack2","game_start_delay":"60s","gamemode":"pre","gamename":"bfield1942","gametype":"conquest","gamever":"v1.61","gq_address":"188.165.220.115","gq_joinlink":"bf1942:\/\/188.165.220.115:14568","gq_name":"Battlefield 1942","gq_online":true,"gq_port_client":14568,"gq_port_query":23001,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"bf1942","hit_indicator":"on","hostname":"SiMPLE | RtR+SW [FRA]","hostport":"14568","kickback":"0%","kickback_on_splash":"0%","mapId":"XPack2","mapname":"telemark","maxplayers":"36","name_tag_distance":"600","name_tag_distance_scope":"600","num_players":14,"num_teams":2,"number_of_rounds":"1","numplayers":"14","password":"0","players":[{"deaths":"0","kills":"0","ping":"51","playername":"John Gult","score":"0","team":"2"},{"deaths":"0","kills":"0","ping":"19","playername":"Dr-Duke","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"163","playername":"Lt Joe","score":"0","team":"2"},{"deaths":"0","kills":"0","ping":"45","playername":"ICEKILLER","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"51","playername":"TURPIN ","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"50","playername":"BFSoldier","score":"0","team":"2"},{"deaths":"0","kills":"0","ping":"86","playername":"Sarg.Richardista Waffen","score":"0","team":"2"},{"deaths":"0","kills":"0","ping":"27","playername":"Maersk Pembroke","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"67","playername":"Satana","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"42","playername":"IBOOxD","score":"0","team":"2"},{"deaths":"0","kills":"0","ping":"50","playername":"WaRRior:3","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"39","playername":"ROGER THAT","score":"0","team":"2"},{"deaths":"0","kills":"0","ping":"0","playername":"krieg","score":"0","team":"1"},{"deaths":"0","kills":"0","ping":"0","playername":"Bear Cat ","score":"0","team":"2"}],"reservedslots":"0","roundTime":"2520","roundTimeRemain":"2520","soldier_friendly_fire":"100%","soldier_friendly_fire_on_splash":"100%","spawn_delay":"6s","spawn_wave_time":"6s","status":"4","sv_punkbuster":"0","teams":[{"teamname":"axis"},{"teamname":"allied"}],"ticket_ratio":"320%","tickets1":"720","tickets2":"720","time_limit":"42","tk_mode":"punish","unpure_mods":"","vehicle_friendly_fire":"100%","vehicle_friendly_fire_on_splash":"100%","version":"v1.61"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf2/1_response.txt b/gameq/tests/Protocols/Providers/Bf2/1_response.txt deleted file mode 100644 index fd258651ef58b49644b4e03e9a453ef98f5bbff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3124 zcmcImNpB>#6@HVWPdVmDz%bw()FN5C0VAVj7C{u1k*EeSDrk04d){UKNH7#$i-`u=r2W%A_JF!_VW>ERBP1Yb#B**PWM}?v8rp z+=Cq|;xw98H>Ncs-UmB%l^0M^go1lJj3m+|&3v3yr7KgaQCB3wd{ABeJV7$1+-e1b zuxK4MrkfrQkc2l@(`W}>?pLdosUB%Nj{SFshy8ltrd|(b4_?`*Zc*Cy(CGm{xkK0= zI8n8Sa~i9v`IDyi*7W-fd_HT1Nab@0o5AR=YIYklXu#pK9_s+!rDfMsXWTXj-Kd7K z(g2f0GD~{(fck-)NESSN_Hx@ffT$lwdU$yF{W4!_Hulc0rs281KQ!`~9131UQO=9( zAm9hl;^+P@_yc?`G9GvTGmoxB|DLE4urXz=$3cz8lHhy1v}&IvFOe9rAn3!JlaQUC zNxEHz$=Z%?4|hKS`I$f14$geiw5QKq{NHAwyWL@jUSKAdtx7k z#Vt+%Rcf_vG_f1q>UOP%R{w+8zbt*kr^J4=Z8@k-MQk<}F@24*hP~h2E3NdZSK5R(V%Yztot(gj*qymY{GFYK zwRR%}*ZNMmRgw&oBQ`Znvs<0ob*~ox@jd*8UFb*Cn5kW@&DMwQR8y@^2b?e~S&Nju zU%vaEy}kWmtB~ih;i%!;cm8lZH`U*XT}EE4FVxNL@<0@Mj=Jp7t=w*ydSXg#yHBWD zwR}55u~B7xj4Yyv*jCrmNMC*a{1yG`?0xkN_}^w7Yppkp%lfC~)X~M+$v@xRu#>9~ zN0&S!e-xuD?&Rd;8frJ^R~J_o2-#b^(SwA-r&j$8a2x=*)@`rrYt^7d3I`*5hZB2n zi=)nVyVe4usG zbb#TcZEW)q(QK=_<4a<2w6(2Q{!z6fHX2+l5vu}F=ew)=*1b2Ei>qVvbbGynb6jnD zIqJ=3B^O`~4sYeKlPT22?Vlt(F-bw9Ad!bB!_`6{GM=0=eAE3GuJIMv#xK9rv8zSuE0E`l}Pe7C=q_5gal4=6eXeQOT{lLhex=` zP$hI=hPVKrz`^4sGWQ7};G6@@1ePVB$cg+Z=MzRL2>N1tl6dL7_O$NjUUSxdviYL( zfmPbCF7s0cKo@d7c(tB4UBg37+vdj7by~o=+LZ z0-(pa%%VI2;%HnEd-UNg%TcO;1qWv$p2XmwkQtX5isU>?xz8}oWQuhOSGYH@E(;Ep z#_*8GpreRHmU+)S&PA|9vwaqjrzu9fA7*{9eJTJr^rx>Kex{Uq) zKqhe!EJX~$qV~AJenKWN@p>7D$m?+l5(1+*#lD5-i2KOCFtFTXAwkS%O~KR|HXa_zt9FBXO_)7;N>yk-|6V=*p5i!w+sKzIniIjhQ_}H Q|2GDIUiL>N1R*K<1uoGMEC2ui diff --git a/gameq/tests/Protocols/Providers/Bf2/1_result.json b/gameq/tests/Protocols/Providers/Bf2/1_result.json deleted file mode 100644 index b06960f..0000000 --- a/gameq/tests/Protocols/Providers/Bf2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"31.186.250.205:16567":{"bf2_anticheat":"1","bf2_autobalanced":"1","bf2_autorec":"1","bf2_bots":"0","bf2_communitylogo_url":"http:\/\/www.superinfantryclan.com\/bf2\/109338097-superbf2.jpg","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/pb.superinfantryclan.com\/servers\/bf2-s1dm\/","bf2_d_idx":"http:\/\/pb.superinfantryclan.com\/servers\/bf2-s1dm\/","bf2_dedicated":"1","bf2_fps":"36.000000","bf2_friendlyfire":"0","bf2_globalunlocks":"1","bf2_mapsize":"64","bf2_novehicles":"1","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"1","bf2_ranked":"1","bf2_reservedslots":"0","bf2_scorelimit":"0","bf2_spawntime":"15.000000","bf2_sponsorlogo_url":"http:\/\/www.superinfantryclan.com\/bf2\/109338097-superbf2.jpg","bf2_sponsortext":"www.superinfantryclan.com","bf2_startdelay":"15","bf2_team1":"MEC","bf2_team2":"US","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"1","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_cq","gamevariant":"bf2","gamever":"1.5.3153-802.0","gq_address":"31.186.250.205","gq_joinlink":"bf2:\/\/31.186.250.205:16567","gq_name":"Battlefield 2","gq_online":true,"gq_port_client":16567,"gq_port_query":29900,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"bf2","hostname":"SUPER@ - S1 Strike at Karkand Infantry Only","hostport":"16567","mapname":"Strike At Karkand","maxplayers":"64","numplayers":"54","password":"0","players":[{"player":"Deniko_pirliko_BiH","score":"90","ping":"26","team":"2","deaths":"5","pid":"1164362","skill":"21","AIBot":"0"},{"player":"Mr.Untraceable","score":"70","ping":"38","team":"1","deaths":"5","pid":"1162172","skill":"23","AIBot":"0"},{"player":"Rememberme?","score":"68","ping":"42","team":"1","deaths":"4","pid":"500088692","skill":"20","AIBot":"0"},{"player":"[LRRP]Snipersonic","score":"65","ping":"30","team":"2","deaths":"13","pid":"1114130","skill":"22","AIBot":"0"},{"player":"snake4u","score":"59","ping":"53","team":"2","deaths":"11","pid":"1070430","skill":"19","AIBot":"0"},{"player":"canptainx","score":"57","ping":"26","team":"1","deaths":"6","pid":"1053398","skill":"14","AIBot":"0"},{"player":"beyonD|willibalD","score":"53","ping":"27","team":"1","deaths":"7","pid":"447339954","skill":"26","AIBot":"0"},{"player":"Tomcrafd","score":"50","ping":"42","team":"2","deaths":"10","pid":"482738578","skill":"11","AIBot":"0"},{"player":"Sniper14","score":"49","ping":"151","team":"2","deaths":"13","pid":"1229457","skill":"12","AIBot":"0"},{"player":"#Inf Hyvaeae_paeivaeae","score":"48","ping":"40","team":"2","deaths":"6","pid":"1164781","skill":"11","AIBot":"0"},{"player":"maximus1111","score":"44","ping":"59","team":"1","deaths":"9","pid":"1143006","skill":"6","AIBot":"0"},{"player":"givemeyourbest1","score":"43","ping":"86","team":"1","deaths":"7","pid":"1305448","skill":"18","AIBot":"0"},{"player":"Pegas_55rus","score":"40","ping":"86","team":"2","deaths":"12","pid":"1270274","skill":"11","AIBot":"0"},{"player":"ullly_Dobpa.~","score":"38","ping":"87","team":"1","deaths":"4","pid":"1007608","skill":"4","AIBot":"0"},{"player":"100% Lexilium_bih","score":"38","ping":"55","team":"2","deaths":"0","pid":"1067266","skill":"0","AIBot":"0"},{"player":"Tonald_Drump_2k16","score":"36","ping":"77","team":"1","deaths":"8","pid":"1233964","skill":"14","AIBot":"0"},{"player":"=SG= FUQhax","score":"34","ping":"122","team":"1","deaths":"12","pid":"1272903","skill":"13","AIBot":"0"},{"player":"Bi0nic(GhostKid)","score":"33","ping":"62","team":"2","deaths":"2","pid":"441168429","skill":"16","AIBot":"0"},{"player":"N3x","score":"33","ping":"14","team":"1","deaths":"8","pid":"1317778","skill":"5","AIBot":"0"},{"player":"BeLaRUS-1988","score":"32","ping":"62","team":"2","deaths":"8","pid":"1048174","skill":"5","AIBot":"0"},{"player":"corn_syrup","score":"31","ping":"111","team":"2","deaths":"3","pid":"1021430","skill":"11","AIBot":"0"},{"player":"aahnz","score":"30","ping":"22","team":"1","deaths":"7","pid":"1317660","skill":"2","AIBot":"0"},{"player":"sam0ht","score":"29","ping":"7","team":"2","deaths":"2","pid":"1131805","skill":"15","AIBot":"0"},{"player":"BlackBull33","score":"27","ping":"27","team":"1","deaths":"4","pid":"1289858","skill":"8","AIBot":"0"},{"player":"hekutooo","score":"27","ping":"52","team":"2","deaths":"8","pid":"1269541","skill":"7","AIBot":"0"},{"player":"Bl4ck^Sun","score":"25","ping":"51","team":"2","deaths":"9","pid":"1261912","skill":"11","AIBot":"0"},{"player":"LICZER COMAN07","score":"25","ping":"468","team":"2","deaths":"14","pid":"1273269","skill":"8","AIBot":"0"},{"player":"KarniksCCCP","score":"24","ping":"53","team":"2","deaths":"8","pid":"1172761","skill":"6","AIBot":"0"},{"player":"BRKOLOL","score":"21","ping":"35","team":"1","deaths":"13","pid":"1178284","skill":"6","AIBot":"0"},{"player":"spoofer27","score":"19","ping":"115","team":"2","deaths":"7","pid":"1259397","skill":"5","AIBot":"0"},{"player":"zmaj111ss","score":"18","ping":"43","team":"2","deaths":"8","pid":"1318624","skill":"9","AIBot":"0"},{"player":"PempekPalembang","score":"18","ping":"214","team":"1","deaths":"15","pid":"1316864","skill":"6","AIBot":"0"},{"player":"Gamers.Anonymous","score":"17","ping":"53","team":"1","deaths":"6","pid":"1318165","skill":"5","AIBot":"0"},{"player":"BL@cK boky1122","score":"16","ping":"54","team":"1","deaths":"8","pid":"1288033","skill":"4","AIBot":"0"},{"player":"KOFF94","score":"14","ping":"55","team":"1","deaths":"5","pid":"1295618","skill":"5","AIBot":"0"},{"player":"slakic slakicar","score":"14","ping":"50","team":"2","deaths":"8","pid":"1312593","skill":"5","AIBot":"0"},{"player":"Arca","score":"8","ping":"57","team":"1","deaths":"10","pid":"1267400","skill":"4","AIBot":"0"},{"player":"Raptor25","score":"7","ping":"178","team":"2","deaths":"2","pid":"1310891","skill":"3","AIBot":"0"},{"player":"#Inf Revive|Mawr","score":"7","ping":"33","team":"1","deaths":"0","pid":"500088450","skill":"1","AIBot":"0"},{"player":"II_Bratishka_II","score":"6","ping":"37","team":"1","deaths":"0","pid":"1252416","skill":"3","AIBot":"0"},{"player":"tenik","score":"6","ping":"22","team":"2","deaths":"3","pid":"1289493","skill":"3","AIBot":"0"},{"player":"chrissel123","score":"6","ping":"39","team":"2","deaths":"2","pid":"1291452","skill":"2","AIBot":"0"},{"player":"kvk8550","score":"6","ping":"49","team":"2","deaths":"2","pid":"1304925","skill":"2","AIBot":"0"},{"player":"SekerEnes","score":"4","ping":"36","team":"1","deaths":"4","pid":"1271080","skill":"2","AIBot":"0"},{"player":"ardvw","score":"4","ping":"33","team":"1","deaths":"7","pid":"1270304","skill":"2","AIBot":"0"},{"player":"Kecske16","score":"4","ping":"28","team":"1","deaths":"8","pid":"1280227","skill":"1","AIBot":"0"},{"player":"antlolq","score":"1","ping":"26","team":"1","deaths":"1","pid":"1144670","skill":"0","AIBot":"0"},{"player":"RomanBN","score":"0","ping":"86","team":"1","deaths":"0","pid":"1263065","skill":"0","AIBot":"0"},{"player":"nikhomes","score":"0","ping":"27","team":"2","deaths":"0","pid":"1176651","skill":"0","AIBot":"0"},{"player":"Tamtam13","score":"0","ping":"42","team":"2","deaths":"0","pid":"1272249","skill":"0","AIBot":"0"},{"player":"Satido","score":"0","ping":"53","team":"1","deaths":"0","pid":"63902872","skill":"0","AIBot":"0"},{"player":"KyOkUsHiN.OBi","score":"0","ping":"139","team":"2","deaths":"0","pid":"1247612","skill":"0","AIBot":"0"},{"player":"SUPER@ GerEliteSteff_2.","score":"0","ping":"24","team":"2","deaths":"0","pid":"479665451","skill":"0","AIBot":"0"},{"player":"michasio","score":"0","ping":"38","team":"1","deaths":"0","pid":"1293319","skill":"0","AIBot":"0"}],"roundtime":"99","teams":[{"team":"MEC","score":"0"},{"team":"US","score":"0"}],"timelimit":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf2/2_response.txt b/gameq/tests/Protocols/Providers/Bf2/2_response.txt deleted file mode 100644 index 35a7ad75e7b5633da173948c8b94d14885499ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 zcma)5>u%F96h80-JVIWeZjxSTD@~$d>=l=OS@Ggo!I3tBuRSCbK(9SDba(KL7M7xCa$e6@W(bd!K<5hG!U3~iZZE+KQ zncmIjU!qQw&gRQ*I-M@@KA%F4k#+Q%dN27#aLLjd-Ej*E8IWEw=ygVMN@6IfseM0F zDXV8%L=W8g+SwlshuoAapk^?D zKM+%xrt*r(|M%W$VP3kzs%t8#%Fc~$tl)~t<3`vpXBfn9YnJ9Zy04UQMGZPnt!Err zgEVPobcXJ6Oys8*$0V*#<7>2XNESbMcvT^%==8wXPIx|v_WM04sAU=QfjYrIA=>7r z@5|mK^6nMWWHcVfr$r^X`&V?=af`~b!RK`9L{k}EQ)f|2v$Jv#^q1XAo$FO)&%_EM z%Dl29(`C2%S|)?rA$c}=9fDYi)cE7yL9Y+fZR&&xTYVu{HHISDa&M^@8j=@`)AEd5 z((2KWz}?Nu3{Cq1P2tC~&bQXywSR3Y{LrQfZj=*0Ikei#We`E7q|UZsO~RjVjDueP zvKlUkD`}g-@|scRY*CZYSgmLkn0x;aJ!r>hg8Nq6YpusdAU^pg{jcq!+*1oyI T+d3SZyJQi$Ys;Y_4(Z@Gh*X!q diff --git a/gameq/tests/Protocols/Providers/Bf2/2_result.json b/gameq/tests/Protocols/Providers/Bf2/2_result.json deleted file mode 100644 index b420ee3..0000000 --- a/gameq/tests/Protocols/Providers/Bf2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"108.61.88.95:16567":{"bf2_anticheat":"0","bf2_autobalanced":"0","bf2_autorec":"1","bf2_bots":"0","bf2_communitylogo_url":"http:\/\/www.hardcoregaming.org\/","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/108.61.88.96\/demos\/.index.php","bf2_d_idx":"http:\/\/108.61.88.96\/demos\/.index.php","bf2_dedicated":"1","bf2_fps":"34.000000","bf2_friendlyfire":"1","bf2_globalunlocks":"1","bf2_mapsize":"64","bf2_novehicles":"0","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"0","bf2_ranked":"0","bf2_reservedslots":"0","bf2_scorelimit":"1000","bf2_spawntime":"300.000000","bf2_sponsorlogo_url":"http:\/\/i.imgur.com\/uLm15H6.jpg","bf2_sponsortext":"=]H[= HARDCORE GAMING| |Website: www.hardcoregaming.org|TS3: ts.hardcoregaming.org:8990|Rules: www.hardcoregaming.org\/serverrules||- Al Basrah Insurgency Alt","bf2_startdelay":"210","bf2_team1":"MEInsurgent","bf2_team2":"US","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"0","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_insurgency","gamevariant":"pr","gamever":"1.5.3153-802.0","gq_address":"108.61.88.95","gq_joinlink":"bf2:\/\/108.61.88.95:16567","gq_name":"Battlefield 2","gq_online":true,"gq_port_client":16567,"gq_port_query":29900,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"bf2","hostname":"[PR v1.3.9.0] =]H[= HARDCORE GAMING - 2INS\/2AAS - NA","hostport":"16567","mapname":"Fallujah West","maxplayers":"100","numplayers":"1","password":"0","players":[{"player":"=]H[= Eskil_swe","score":"99","ping":"106","team":"2","deaths":"0","pid":"100000205","skill":"0","AIBot":"0"}],"roundtime":"1","teams":[{"team":"MEInsurgent","score":"0"},{"team":"US","score":"0"}],"timelimit":"14400"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf2/3_response.txt b/gameq/tests/Protocols/Providers/Bf2/3_response.txt deleted file mode 100644 index 33d27d54a595cdc61dc42a43c5170cbf3a04b040..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3176 zcmcguO>^5u5^e7>r~L_Yj8i2UGlS36s%mM;vK@U`Ys!he7u5(Dk`n?L1Rs>>$|=7* zuZNT@Z6((=K!fO+?tcCH^-%Or5&e7UYB#o1Lqsb-jIC)b9bKOuABpRg6{o$kZB=i@ zacx?m;#ZmY#jLG(Kj6KhC3XjoTQiQeT{v4;Dp)tRCwZ70YMJPRJW_`dHKq%Dp9Byp zin6eO+;*0hU2{|Zw(~c=Gwn#X3q?TJ)n;q^fzlXZ?w`Cdg2q>td}mv>yLL&P8HPLG zR}|6c8e6-@jriXCsjb*RT7_ae-;X5IB+WR_O=T-rn$cDy!+USq_2Ub`xN>C;9Kxa> zsCMmie*j4AY^KrownUl`>c&;~v>M0m$5*fRma2Yc*m&3NW3lh80i)$(y2YOOh3oA; z=C}@pUV3pgwQg92u)}Ejv9c(fWU{k#<_=gHJaT~`V{OOYjLwscc14fYG>?|2sd+)t@wij3vE!rl8@qC4Z5bxL*eUOZNObe}{7lc?-sq@#<=voA;Do!Q=@#aTh(r>Qbqv`u`Oosf9#{l=Ic z;p})}-&s?C@e_T2_WttiOJO%#gT||bj()j5Jrb|$$u4^&ja5YA?ZMIqcnt)N$rh)s zJ@_w%06FY14YPi2Y-LC|=xsC@7%`ZBU_)CDBu?y!y_wb|p!en0*aozUS#3<7sYqrd zKF{YC<5{1Dl6cLH=EPq4y7s9|Ni;xL`Cb;N_8Ma}ocPAI1`|T!^24>MJ=!A`nCWlt zOy4_RIQO^y3a1K!BHxFTlh?EJ^Y1^+XD>-?5Dv&xGCP}b71pd)B<5!0xAULRNUSID zzcie0WtQ$1r;oTYYd5mj`_WvO{%`=bb6=aj^gy-JZ&%SUk^pPA$r<-KMF|&gex7}t z&pw^KxqdVMfJ`eiWaa6*-+%v(o}Ilf9)+bIb}hC{PwDHaxm}z6k^FXQ+wFWg{`3)W z&D2lB+|@X0r9_n*(;nR4f0jiK4V)XyO1WwrGx4Dxq2Z|x{Ga1sJTu*dlY@>vABnH` zzxp-rLRWA=c=Ww7LyKZjLhFFQm_dS{MQ`n*-eTA(90!smzBb|g>^XaQ4>4;QJmy8HZaFGD{V1NhtH#9Z^9Uu9Orm zEMi9g_d1A)Zv>_e5&`HWM^I!_DaFXBGE%T0u!0ICuu6^h7y#0oG^a=8Bn4ni8NSBw z)c}k#l){toV_8P1z1tr+Xk+Bj!Xobx2Nzg4maZxvR1eTa9W^4C(VD8(K_wBA7 zr@NgGmYwa}%JW#f>%qd$Zx>bg?OYAO0bhltp*qNd1pvr7_YlrN3^8Gi`C}9b8p=KA zM)MPIxZx4L^G;|8&IL!|cp)rWvdhfD5fk?8nKIyw9gyNaBD7I4w7ifq20;GVL=P2C zyu3gF87C@3Xj#Nb!6~vRL+@1{r5Sn*^{AA4AIUUBE6~h5LSvPV@|cyy0W+>C$s*`Z zrC1GBs7z)cA&-j)lO&anV}6g5R703jCaPe)MM|eZS4oj&5KEEk6q5lzm8N(W5^=#q z4y4GVbtV&xqDHb55>Tm%3LK6cJ!eVF6d9OHz=u?n!VgCQt;SIibNxD38Rk_%wTiVZ z^C&@+P-YyltfD-N5J$;8&LK>#l;rWyGF54gsfn{V#_VIe(%=t8q#8N~UwO_V20J<9 z0jVi)%BWBg4+ZweIQIfh=%1Z)%pCA5=39ccxIjB&R1K*k8R|p4SjUpe(3L7uz(@YSID7wi5qkeGG+L*8M!^^5085sDUL1D(%MEcb9|!@~b{b>a!Yk{8 zmCA|09gl0c^-jA%vUw095JHIH3!-G5!-w*qVQ>*H9Gv?nBEg?y{M|*f_pkj3WPi8e b|6?cmM>t{dClvm~!yk70p9j1%0HQwus$}TI diff --git a/gameq/tests/Protocols/Providers/Bf2/3_result.json b/gameq/tests/Protocols/Providers/Bf2/3_result.json deleted file mode 100644 index a7f0754..0000000 --- a/gameq/tests/Protocols/Providers/Bf2/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"108.61.232.59:16567":{"bf2_anticheat":"1","bf2_autobalanced":"1","bf2_autorec":"0","bf2_bots":"0","bf2_communitylogo_url":"","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/","bf2_d_idx":"http:\/\/","bf2_dedicated":"1","bf2_fps":"36.000000","bf2_friendlyfire":"0","bf2_globalunlocks":"1","bf2_mapsize":"64","bf2_novehicles":"0","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"1","bf2_ranked":"1","bf2_reservedslots":"0","bf2_scorelimit":"0","bf2_spawntime":"15.000000","bf2_sponsorlogo_url":"","bf2_sponsortext":"","bf2_startdelay":"15","bf2_team1":"CH","bf2_team2":"US","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"1","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_cq","gamevariant":"bf2","gamever":"1.5.3153-802.0","gq_address":"108.61.232.59","gq_joinlink":"bf2:\/\/108.61.232.59:16567","gq_name":"Battlefield 2","gq_online":true,"gq_port_client":16567,"gq_port_query":29900,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"bf2","hostname":"=TFC= The Friendly Clan 24\/7 Wake Island","hostport":"16567","mapname":"Wake Island 2007","maxplayers":"64","numplayers":"64","password":"0","players":[{"player":"powerpsi","score":"75","ping":"58","team":"1","deaths":"2","pid":"2891142","skill":"35","AIBot":"0"},{"player":"Pinheirinhobf2","score":"62","ping":"137","team":"1","deaths":"12","pid":"1000037","skill":"28","AIBot":"0"},{"player":"LynCassady","score":"57","ping":"126","team":"2","deaths":"7","pid":"2872895","skill":"20","AIBot":"0"},{"player":"3RD*2","score":"57","ping":"46","team":"1","deaths":"4","pid":"1145274","skill":"14","AIBot":"0"},{"player":"juankiller23","score":"56","ping":"127","team":"2","deaths":"10","pid":"1194594","skill":"10","AIBot":"0"},{"player":"deft","score":"55","ping":"28","team":"2","deaths":"3","pid":"1070729","skill":"25","AIBot":"0"},{"player":"=MNKY= Haywire79","score":"53","ping":"111","team":"2","deaths":"23","pid":"2806779","skill":"22","AIBot":"0"},{"player":"Judayme","score":"52","ping":"283","team":"1","deaths":"9","pid":"1112692","skill":"20","AIBot":"0"},{"player":"YAD","score":"52","ping":"140","team":"2","deaths":"18","pid":"1016751","skill":"15","AIBot":"0"},{"player":"Boovaar","score":"52","ping":"138","team":"1","deaths":"6","pid":"2768041","skill":"11","AIBot":"0"},{"player":"LetMeHealYou","score":"49","ping":"144","team":"2","deaths":"21","pid":"2308411","skill":"15","AIBot":"0"},{"player":"(KING) evyatar25","score":"45","ping":"168","team":"2","deaths":"15","pid":"2100077","skill":"21","AIBot":"0"},{"player":"=WTF= Bluegrass420","score":"43","ping":"33","team":"2","deaths":"17","pid":"1057026","skill":"22","AIBot":"0"},{"player":"G-gopowermedium","score":"40","ping":"121","team":"1","deaths":"5","pid":"2604119","skill":"18","AIBot":"0"},{"player":"Fin-Zimi","score":"37","ping":"156","team":"1","deaths":"4","pid":"1127173","skill":"15","AIBot":"0"},{"player":"JesusArkaeda","score":"35","ping":"303","team":"2","deaths":"7","pid":"2849062","skill":"15","AIBot":"0"},{"player":"icedtang","score":"35","ping":"71","team":"2","deaths":"10","pid":"1234473","skill":"13","AIBot":"0"},{"player":"sarsa","score":"33","ping":"147","team":"1","deaths":"1","pid":"2456327","skill":"0","AIBot":"0"},{"player":"incs","score":"32","ping":"139","team":"1","deaths":"15","pid":"1152947","skill":"11","AIBot":"0"},{"player":"DeDe_uk","score":"31","ping":"132","team":"2","deaths":"0","pid":"1023654","skill":"0","AIBot":"0"},{"player":"chegyaemma","score":"30","ping":"229","team":"1","deaths":"11","pid":"1359778","skill":"10","AIBot":"0"},{"player":"Alaa872017","score":"24","ping":"120","team":"1","deaths":"19","pid":"2983613","skill":"8","AIBot":"0"},{"player":"XSSerialKiller","score":"23","ping":"156","team":"1","deaths":"7","pid":"2842663","skill":"9","AIBot":"0"},{"player":"AlitaDePollo616","score":"20","ping":"108","team":"1","deaths":"11","pid":"2917024","skill":"5","AIBot":"0"},{"player":"matador193","score":"19","ping":"192","team":"1","deaths":"10","pid":"2811477","skill":"7","AIBot":"0"},{"player":"TransDominator","score":"17","ping":"154","team":"2","deaths":"10","pid":"3371553","skill":"3","AIBot":"0"},{"player":"NOTaloser122","score":"16","ping":"137","team":"1","deaths":"19","pid":"3026650","skill":"7","AIBot":"0"},{"player":"rbwarrior","score":"16","ping":"103","team":"1","deaths":"11","pid":"2620993","skill":"6","AIBot":"0"},{"player":"LoboPandilla","score":"16","ping":"279","team":"1","deaths":"10","pid":"3447833","skill":"3","AIBot":"0"},{"player":"ODDBALL(USA)","score":"15","ping":"38","team":"2","deaths":"5","pid":"1164560","skill":"5","AIBot":"0"},{"player":"vados","score":"14","ping":"145","team":"1","deaths":"4","pid":"1067755","skill":"7","AIBot":"0"},{"player":"25AKA","score":"14","ping":"166","team":"1","deaths":"4","pid":"2242099","skill":"5","AIBot":"0"},{"player":"Jeeahh","score":"13","ping":"138","team":"1","deaths":"2","pid":"3409442","skill":"5","AIBot":"0"},{"player":"SavoySVK","score":"13","ping":"160","team":"1","deaths":"6","pid":"1382735","skill":"2","AIBot":"0"},{"player":"kuringa93","score":"12","ping":"189","team":"2","deaths":"9","pid":"2166256","skill":"8","AIBot":"0"},{"player":"hagiber","score":"12","ping":"131","team":"2","deaths":"9","pid":"1180518","skill":"4","AIBot":"0"},{"player":"Pakitos","score":"11","ping":"108","team":"1","deaths":"10","pid":"1124085","skill":"4","AIBot":"0"},{"player":"ItaMar.se","score":"11","ping":"141","team":"1","deaths":"3","pid":"1087033","skill":"3","AIBot":"0"},{"player":"Solarco","score":"11","ping":"118","team":"2","deaths":"4","pid":"2184866","skill":"3","AIBot":"0"},{"player":"Th3Gh0st","score":"11","ping":"276","team":"1","deaths":"10","pid":"3221303","skill":"3","AIBot":"0"},{"player":"assem83","score":"11","ping":"140","team":"1","deaths":"20","pid":"3162688","skill":"3","AIBot":"0"},{"player":"TheEpicFace","score":"11","ping":"49","team":"1","deaths":"2","pid":"3474445","skill":"2","AIBot":"0"},{"player":"Kazyr","score":"10","ping":"70","team":"2","deaths":"2","pid":"1242395","skill":"5","AIBot":"0"},{"player":"2000Always","score":"9","ping":"133","team":"2","deaths":"2","pid":"2946338","skill":"3","AIBot":"0"},{"player":"CanadianMenNSQC","score":"7","ping":"44","team":"2","deaths":"3","pid":"2808857","skill":"3","AIBot":"0"},{"player":"Nemisys","score":"7","ping":"121","team":"1","deaths":"9","pid":"2804893","skill":"2","AIBot":"0"},{"player":"softmc","score":"6","ping":"138","team":"2","deaths":"5","pid":"3274653","skill":"2","AIBot":"0"},{"player":"oddi","score":"2","ping":"159","team":"1","deaths":"1","pid":"1092089","skill":"1","AIBot":"0"},{"player":"Marinna","score":"2","ping":"66","team":"2","deaths":"3","pid":"1242422","skill":"0","AIBot":"0"},{"player":"MEVARSAUKETESO","score":"1","ping":"157","team":"2","deaths":"7","pid":"3447844","skill":"3","AIBot":"0"},{"player":"ahmedhofy22","score":"1","ping":"228","team":"1","deaths":"0","pid":"2395871","skill":"0","AIBot":"0"},{"player":"columbka","score":"0","ping":"169","team":"1","deaths":"0","pid":"2622729","skill":"0","AIBot":"0"},{"player":"=TFC= GunnySgtJR","score":"0","ping":"45","team":"2","deaths":"0","pid":"1041491","skill":"0","AIBot":"0"},{"player":"TaurusSilver11","score":"0","ping":"138","team":"2","deaths":"0","pid":"3466369","skill":"0","AIBot":"0"},{"player":"Ivan-xxX1980","score":"0","ping":"144","team":"1","deaths":"0","pid":"2686657","skill":"0","AIBot":"0"},{"player":"Lackschmier","score":"0","ping":"109","team":"2","deaths":"0","pid":"2434177","skill":"0","AIBot":"0"},{"player":"Orthicultor","score":"0","ping":"51","team":"2","deaths":"1","pid":"3469949","skill":"0","AIBot":"0"},{"player":"LordKapusta","score":"0","ping":"160","team":"2","deaths":"1","pid":"3474384","skill":"0","AIBot":"0"},{"player":"=X= zxjoker","score":"0","ping":"169","team":"2","deaths":"2","pid":"2209021","skill":"0","AIBot":"0"},{"player":"alonsook","score":"0","ping":"169","team":"2","deaths":"3","pid":"2965188","skill":"0","AIBot":"0"},{"player":"masnanaa","score":"-4","ping":"155","team":"2","deaths":"3","pid":"2893635","skill":"0","AIBot":"0"},{"player":"nicolaas13","score":"-4","ping":"185","team":"2","deaths":"10","pid":"3474221","skill":"0","AIBot":"0"},{"player":"freefly00","score":"-16","ping":"150","team":"2","deaths":"10","pid":"1275842","skill":"0","AIBot":"0"}],"roundtime":"32","teams":[{"team":"CH","score":"0"},{"team":"US","score":"0"}],"timelimit":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf2/4_response.txt b/gameq/tests/Protocols/Providers/Bf2/4_response.txt deleted file mode 100644 index 7d1ee4e45c1bc13eb6948738122725c96210d3f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1010 zcmb7C!E)0u5MB5JKEXdw$4+tD;Y46E;F(fdQU-1w#ai2{Wl2bKnsDONS;=n5vG^kG z+tt3e&kJvo?7cHmcr_022RiM%Vgtg>=2Q9gHn~|pl(*|-U4BcxtnaqaQZD9q%zKHA zK*^U8-J^v(Ez--pxV*T|mT3k9GqLsu>oF;vWQr%tEW3*J{%8W8DG$45 z38ckHc0}tSbU8c+MIK8B%@MRg6>ysh`RqIJJ0=H6$G7OwDD@cAX}N9QzYkO(eXX`@Bzb`{tiF5 zxJeW~4iA<12JTV@X$lcEOK1OmFT}qPakCU-=QvAUa7@>$Y)+BXMi<9(vQoWU={Y~sfhV5A?Z&MS?9|yJb3?GP-Zp_=L}ZjLNH3LSAz{Z~ z$~;$Y6wDT~RNHXmQtY`R&*Ru<4*(BI7P+zIz*kt$&lcF>LpY}DO1Y% z@r8C-ecUl`V7t;OnS^92^2E2Wex&Ck{dQ@$p@>N-=9Ec22m#wg1|gBYh52!J{x*^v z<|$!+WfJ>D>U-ilSU(t_4F~&Wtvf8&hgZp5RT~$;Fw=!$wylMZgNt3ZA{nI*@K~SLbCO+|ur)wqyofSRrfF}OxKNGT%mv;fS_Ux> z7qmAvr!)G-xXX82O2R2-Vjg3u;)vXiI9JC9|2Ws{N-hxN_?f#Y04hve7|rA^Tx+L1P;8w2|c?B5{O1SlZK* zEv0CTw+8|0!2q1ZAR$pm8OQO_%B?mjdB0*xE{jBcqq4-*e&yv>H!xqisx@e11luuPn^?BMuHwNHSwU3skfb7S@XC&7_Qq6~qm!e~ zKnp@+JQ56qVWbQOBsY`A>iQ(RGKcnk2W7u`f?Fu&H&m>v5F_qEhlfXFkXX7pm;11$ zEU<*rjpPy0wKavwPS( ep1^VM5k>68PBw|{gLCkWKIJ48z5&`NNt?B@`dF3ZZ0vHmwuZ!zoCS!HX8`R= zwg1sSD3|o~8we0tizyK##K_JpU1i?2!5PU*^ug-$+>ElxCg`K@>oBMBP z=Tew<*6G<*BkpG(W-o;8X4lf*igzu2y%udfI}x|^_{&Xw{wr^j$M{HtXSCaOZ#U<{ ztYsK{Mqe+k-h^Qk5Nm*Y%+G*iY4At)Ly{EyHl#0fxp$rE<@oR?db1LZmAq$`mT8s; zpVG@D%Yv`zGY-qcC=3tN>@Z4`@8T>D!{8tE!(DV(&J(itC`!tFb`l>ZDOj1o?Qwau z<-L@s*pdI-1S8+G4V?aJg01Ek|Jm6!#R0odizitQBU&+>jxBENrSG4%dh~C;auXX$8RQJ@- z9yge>51w#~OQ2VVZu48OYP(*JIIJD?cBc5M33KEH6@Uxw@#S@rJ~0^>)G3}bHn}WA zBvj6oBi}ETC3e0>SEqFfSJMJGYU_^hQr`-zSF2qhsGyXu94athPA)z##j^fcSHjX6 zG>z|IqqAY|vxVb3&mj>N-e2gqS~hZF1f?clqsh>NdeB6rEcMu&u}7v;dRr8GwKJ8; zr(_0qX#>~OZZ@Kl?afjcvDhbejIbYFCQESydXry@_6JIgTJ0hs)01or=LLs{LgILj zWh*OHcSj9n8egNsK%D}5(~v~=Jtl$=!Wv~J-y zj=Lx+AaxS6?@O%~yH^T0l{lyG{QACS7F zR_>sbCaz^&>xJIXUqtOtw&%BB`07QDDmu~8nuVQSHi zxX7*#u8dxZR*zt)H3Zn1;v-d3>a*-6t92>wq**jtZ=-xfgA_Fg&Ais(P>E^qB`wzv zVk>4k{zox;^OBB-Q{bwgK`S?2WjlJru24Q@5bomLoMc$CIAq);IbbXlCi_P zPJQ0rDO=AcGEJq$Gul>6bFLGZ4sXZ#TpKE-hQ9H&o6$%wHx~~RQtq|Fgmj^5d7^c# zx$vZs5{ZggHvgYs01sRtIAqAbm(6=akNHNv@c>1qnQB`NEszxky0U2WJ^FJd)eW!BvUMTwi z$GldJ-IEr?hy}JAo?UN!_wL%uQD{=So>V}>rLBtqs?GOY=$hvHrx`? SUM>|)Rnx9CrQJu7#Qz6h{j{n8 diff --git a/gameq/tests/Protocols/Providers/Bf3/2_result.json b/gameq/tests/Protocols/Providers/Bf3/2_result.json deleted file mode 100644 index a7db361..0000000 --- a/gameq/tests/Protocols/Providers/Bf3/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"208.100.45.143:25200":{"country":"US","dedicated":1,"gametype":"RushLarge0","gq_address":"208.100.45.143","gq_joinlink":"","gq_name":"Battlefield 3","gq_online":true,"gq_port_client":25200,"gq_port_query":47200,"gq_protocol":"bf3","gq_transport":"tcp","gq_type":"bf3","hostname":"Noobs Only! Learn to Play | Fast Respawn | Rank Cap | [SkL]","ip_port":"208.100.45.143:25200","join_queue":0,"map":"MP_001","max_players":64,"num_players":62,"num_teams":2,"online":1,"password":0,"pingsite":"iad","players":[{"name":"solitarysteam","guid":"","teamId":"1","squadId":"1","kills":"8","deaths":"6","score":"2276","rank":"58"},{"name":"satann_sss","guid":"","teamId":"2","squadId":"7","kills":"2","deaths":"3","score":"418","rank":"4"},{"name":"bujny89","guid":"","teamId":"1","squadId":"8","kills":"4","deaths":"1","score":"1038","rank":"10"},{"name":"bennegantser","guid":"","teamId":"2","squadId":"6","kills":"3","deaths":"5","score":"1531","rank":"7"},{"name":"dextera","guid":"","teamId":"2","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"29"},{"name":"ColdSpy","guid":"","teamId":"1","squadId":"6","kills":"2","deaths":"0","score":"471","rank":"27"},{"name":"andy2984","guid":"","teamId":"1","squadId":"5","kills":"6","deaths":"1","score":"1408","rank":"45"},{"name":"Collarmobia","guid":"","teamId":"2","squadId":"2","kills":"5","deaths":"3","score":"1283","rank":"91"},{"name":"bolla234","guid":"","teamId":"1","squadId":"5","kills":"7","deaths":"4","score":"2434","rank":"37"},{"name":"JaKeCrAzY14","guid":"","teamId":"2","squadId":"0","kills":"1","deaths":"2","score":"518","rank":"4"},{"name":"Thimbo84","guid":"","teamId":"1","squadId":"8","kills":"1","deaths":"2","score":"1018","rank":"19"},{"name":"Boy2838","guid":"","teamId":"2","squadId":"8","kills":"12","deaths":"3","score":"2313","rank":"17"},{"name":"Jx-PL","guid":"","teamId":"1","squadId":"6","kills":"1","deaths":"4","score":"346","rank":"46"},{"name":"Kruszkraker","guid":"","teamId":"1","squadId":"1","kills":"4","deaths":"1","score":"1669","rank":"22"},{"name":"PrakticaFalcon","guid":"","teamId":"2","squadId":"1","kills":"5","deaths":"4","score":"1376","rank":"50"},{"name":"pitbull7500","guid":"","teamId":"1","squadId":"7","kills":"2","deaths":"1","score":"365","rank":"13"},{"name":"Krauss_Von_House","guid":"","teamId":"2","squadId":"1","kills":"1","deaths":"1","score":"333","rank":"53"},{"name":"quiksgc","guid":"","teamId":"1","squadId":"2","kills":"8","deaths":"5","score":"1064","rank":"29"},{"name":"BNR34500","guid":"","teamId":"2","squadId":"4","kills":"2","deaths":"5","score":"880","rank":"36"},{"name":"excis53","guid":"","teamId":"1","squadId":"6","kills":"3","deaths":"1","score":"470","rank":"54"},{"name":"Nopasoff","guid":"","teamId":"1","squadId":"2","kills":"7","deaths":"1","score":"1298","rank":"6"},{"name":"JackYodaslayer","guid":"","teamId":"2","squadId":"5","kills":"9","deaths":"1","score":"1963","rank":"45"},{"name":"kelebra19","guid":"","teamId":"1","squadId":"4","kills":"10","deaths":"5","score":"1543","rank":"46"},{"name":"Artiom774","guid":"","teamId":"2","squadId":"4","kills":"2","deaths":"4","score":"350","rank":"43"},{"name":"ShadenScarab","guid":"","teamId":"1","squadId":"4","kills":"2","deaths":"0","score":"542","rank":"45"},{"name":"JanGauski","guid":"","teamId":"1","squadId":"7","kills":"5","deaths":"4","score":"1097","rank":"53"},{"name":"BenediktAl65","guid":"","teamId":"1","squadId":"7","kills":"3","deaths":"1","score":"400","rank":"6"},{"name":"kubakot23","guid":"","teamId":"1","squadId":"2","kills":"3","deaths":"1","score":"842","rank":"34"},{"name":"spartacuss44","guid":"","teamId":"2","squadId":"6","kills":"5","deaths":"2","score":"1100","rank":"32"},{"name":"Hilfemeins","guid":"","teamId":"2","squadId":"7","kills":"0","deaths":"0","score":"40","rank":"19"},{"name":"todovaaestarbien","guid":"","teamId":"1","squadId":"5","kills":"7","deaths":"6","score":"1372","rank":"32"},{"name":"MachinedFace","guid":"","teamId":"2","squadId":"5","kills":"3","deaths":"3","score":"823","rank":"39"},{"name":"hal2000mhz","guid":"","teamId":"2","squadId":"4","kills":"2","deaths":"1","score":"891","rank":"50"},{"name":"Robohobo113","guid":"","teamId":"1","squadId":"3","kills":"8","deaths":"2","score":"2008","rank":"47"},{"name":"dzionselka","guid":"","teamId":"2","squadId":"2","kills":"8","deaths":"2","score":"1612","rank":"18"},{"name":"75R-Profano","guid":"","teamId":"1","squadId":"3","kills":"1","deaths":"2","score":"1874","rank":"48"},{"name":"Neverbloom16","guid":"","teamId":"2","squadId":"9","kills":"5","deaths":"6","score":"1063","rank":"44"},{"name":"ozamaheisenberg","guid":"","teamId":"2","squadId":"2","kills":"5","deaths":"3","score":"1030","rank":"46"},{"name":"ma-dragon-tin","guid":"","teamId":"2","squadId":"1","kills":"3","deaths":"2","score":"455","rank":"32"},{"name":"cakemix09","guid":"","teamId":"2","squadId":"7","kills":"2","deaths":"1","score":"300","rank":"20"},{"name":"AfroNick","guid":"","teamId":"1","squadId":"1","kills":"4","deaths":"1","score":"1288","rank":"11"},{"name":"Harrysorangesuck","guid":"","teamId":"2","squadId":"8","kills":"5","deaths":"3","score":"984","rank":"5"},{"name":"MGLOC86","guid":"","teamId":"1","squadId":"2","kills":"8","deaths":"3","score":"2263","rank":"72"},{"name":"Sroczka95","guid":"","teamId":"2","squadId":"5","kills":"7","deaths":"4","score":"2380","rank":"36"},{"name":"Luvisk99","guid":"","teamId":"1","squadId":"3","kills":"1","deaths":"0","score":"277","rank":"17"},{"name":"Dorinel17","guid":"","teamId":"1","squadId":"3","kills":"3","deaths":"1","score":"1468","rank":"15"},{"name":"MikeCookie3","guid":"","teamId":"2","squadId":"8","kills":"7","deaths":"2","score":"1602","rank":"11"},{"name":"srb2ioka","guid":"","teamId":"2","squadId":"8","kills":"1","deaths":"4","score":"1057","rank":"5"},{"name":"PunkDulce","guid":"","teamId":"2","squadId":"4","kills":"0","deaths":"3","score":"630","rank":"46"},{"name":"ninjacookies00","guid":"","teamId":"1","squadId":"6","kills":"0","deaths":"0","score":"240","rank":"5"},{"name":"Private-Herrada","guid":"","teamId":"1","squadId":"1","kills":"2","deaths":"5","score":"617","rank":"40"},{"name":"NoVid1","guid":"","teamId":"2","squadId":"5","kills":"1","deaths":"2","score":"548","rank":"15"},{"name":"Srapeh","guid":"","teamId":"2","squadId":"9","kills":"9","deaths":"1","score":"1480","rank":"54"},{"name":"fernandog5n","guid":"","teamId":"2","squadId":"3","kills":"5","deaths":"3","score":"796","rank":"4"},{"name":"Xsniff2","guid":"","teamId":"2","squadId":"7","kills":"4","deaths":"3","score":"782","rank":"16"},{"name":"THEBaddKidd","guid":"","teamId":"1","squadId":"5","kills":"8","deaths":"3","score":"2554","rank":"48"},{"name":"MisterVilsa","guid":"","teamId":"1","squadId":"7","kills":"0","deaths":"1","score":"0","rank":"1"},{"name":"wwwjasonnl","guid":"","teamId":"1","squadId":"9","kills":"1","deaths":"1","score":"455","rank":"34"},{"name":"pikifoo60","guid":"","teamId":"2","squadId":"6","kills":"0","deaths":"2","score":"49","rank":"2"},{"name":"48Alcatraz","guid":"","teamId":"1","squadId":"9","kills":"2","deaths":"0","score":"577","rank":"48"},{"name":"WirelessDoughnut","guid":"","teamId":"2","squadId":"3","kills":"0","deaths":"0","score":"0","rank":"35"},{"name":"Nislack","guid":"","teamId":"1","squadId":"9","kills":"0","deaths":"0","score":"0","rank":"54"}],"punkbuster":0,"punkbuster_version":"v1.893 | A1386 C2.344","quickmatch":0,"ranked":0,"region":"NAm","roundsplayed":1,"roundstotal":2,"roundtime":355,"targetscore":0,"teams":[{"tickets":"54","id":1},{"tickets":"1337","id":2}],"uptime":548456,"version":"1149977"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf3/3_response.txt b/gameq/tests/Protocols/Providers/Bf3/3_response.txt deleted file mode 100644 index f53a715e181608a92237ab2c9114a9f5af57a3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3458 zcmZ`+OLN;c5N6+P+G%@er_-BmJ;^1&cV}{tt%;qwQc_!K(q1$W1zWI4!X+ucCjX*; zxcdMt+KMp~5~A^8cfb91fq0&$(vLjvXV3FKhJUY)y%b*0N8{t?0~!9B3})lWU}~F{ zss{(EQbjX(KX@@ZoefS#(_@&!%0pG^y4lNZNqdADz2eaO4z`+URgSf4R}&77)B9cV(EK7 zz#pZb?g`)Di~T(zlHX(`ec$^L{%|Gs(kwvtMUcjW1GyK3;dW!RKOL2{mr+ZK=gq0N zwfF4(`)9Cb@e4d~vEvS>`!53T3wR3=W?7PWZfXA0H=g$&gzT1L@F`iWfIga>Z_JV+ zX@RqsOWLLRccYdtN7HLl6b&s{BB2d^Y;s#OyjInkc83If3Cjyx>9y7^Okr%v7PLr8 zdI_IQ%Pfg05aFjDIO^@|!l>d@*XnXb_}vY7A0cUjAc;9$B8^+$-$UO(+gF}aEt8pg(UFYX$<6m+knI{ z=;Om-eqk@H$YS|na7F+doKLv!i6&)0Nt)aig|4HXuUrwK z3x|SaXS3MFoKRt1>Abb|TGf~K3b@|d*XPx87mGx7 z-twGi3dr(On=8}U>dsWATJ<9CTMk%XQjk1CALK!ng@=W+w%4l2BHLVVZF6EmcG#&i zA+$(S{v7y({yWdto6Wpwubx122ND@;JArJXZD=Up!s|rcma00dZ3zM`p4fryfrhZz z$gq>Na~~1Ph0moe;)LCSV6ZTAqpKSnAI7rqm^tA?D?vB7p&Z+l z-Lz`G3#90r)SSzy&w+sAP-+vk+_#IQ7j5S-VxbwK8RiQ*adux=SeBzAS8c8CPT!7Z z@Dm0uX1p`%2C7dMaLX;2%2kNp_rkaoDN9wvq!2>6{Zb!uy!=XuiRc562 z8oHaRmse%4PxTq-dNP7V6a);0&W`jQ+No+=-M-!_bQgbDF=QI^N501depQ=uW2$%K zG3*3mD?8@iH7QP*%$Q1<5cT4PDOPr@-feEwV>IWeJAs|*WqMCN7R*Ww({!kMeVt?G zbM9ex<^GRmR_I9scZeo)9V%nJ-hZMe%y(ho5{!NChVt`UzIo zKSysy)5GEZ%jw}`Y_|g`l37aK2^1!DW;WOA{BGxp@BkO{5gE-vBTL1U{3 zmT=d#G2+yfq9mH8CSO}!53PElkl8X{DKeiE90t^~$F{P~Vz__&*eJ)$1;CvrfviyR zKxe{k-!=sp&itLc_QMqfNkPEfeFo#ri}1Fzb+8si5$yCo#^L^sHQdN zwpVyv%SP51&$k2NL$5_B9CKK-O##j3%+~o%(_)s{DtjHkU8eII|G!}twOX0-c2jI} zEduxg0}XZ{oO7Bw=g~4;$570pdj5J9!dYW0_yuE&>>TDVWYXOpfojA~C$r&Lm%3_u OZa*xyt!<}C>HQDQIeB*g diff --git a/gameq/tests/Protocols/Providers/Bf3/3_result.json b/gameq/tests/Protocols/Providers/Bf3/3_result.json deleted file mode 100644 index be0a676..0000000 --- a/gameq/tests/Protocols/Providers/Bf3/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"208.100.60.117:25200":{"country":"US","dedicated":1,"gametype":"TeamDeathMatch0","gq_address":"208.100.60.117","gq_joinlink":"","gq_name":"Battlefield 3","gq_online":true,"gq_port_client":25200,"gq_port_query":47200,"gq_protocol":"bf3","gq_transport":"tcp","gq_type":"bf3","hostname":"=ADK= 24\/7 TDM Noshar Canals | FAST RANK | ADKGamers.com","ip_port":"208.100.60.117:25200","join_queue":0,"map":"MP_017","max_players":64,"num_players":49,"num_teams":2,"online":1,"password":0,"pingsite":"iad","players":[{"name":"lonekeet","guid":"","teamId":"1","squadId":"1","kills":"22","deaths":"10","score":"2976","rank":"108"},{"name":"BelialSeraph","guid":"","teamId":"1","squadId":"1","kills":"21","deaths":"12","score":"3768","rank":"145"},{"name":"michelgb9","guid":"","teamId":"1","squadId":"1","kills":"20","deaths":"10","score":"3837","rank":"59"},{"name":"zMyJVGamer95","guid":"","teamId":"1","squadId":"1","kills":"10","deaths":"12","score":"1728","rank":"6"},{"name":"seban24","guid":"","teamId":"2","squadId":"2","kills":"2","deaths":"0","score":"200","rank":"50"},{"name":"KG-cjojo1962","guid":"","teamId":"2","squadId":"2","kills":"6","deaths":"7","score":"828","rank":"145"},{"name":"DucHTa","guid":"","teamId":"2","squadId":"2","kills":"0","deaths":"0","score":"0","rank":"23"},{"name":"Myller54","guid":"","teamId":"1","squadId":"4","kills":"6","deaths":"10","score":"960","rank":"17"},{"name":"vectorkarpovich","guid":"","teamId":"1","squadId":"3","kills":"16","deaths":"14","score":"2750","rank":"60"},{"name":"undergnd","guid":"","teamId":"1","squadId":"3","kills":"0","deaths":"0","score":"0","rank":"53"},{"name":"deivisonzininha","guid":"","teamId":"1","squadId":"3","kills":"32","deaths":"21","score":"4068","rank":"61"},{"name":"kowal95osw","guid":"","teamId":"2","squadId":"4","kills":"12","deaths":"17","score":"1884","rank":"30"},{"name":"Ycckuu_stv","guid":"","teamId":"2","squadId":"4","kills":"19","deaths":"19","score":"2762","rank":"48"},{"name":"Raymanfromhell","guid":"","teamId":"2","squadId":"4","kills":"14","deaths":"24","score":"2410","rank":"10"},{"name":"nactaclive","guid":"","teamId":"2","squadId":"4","kills":"13","deaths":"18","score":"2330","rank":"15"},{"name":"ConkusMaximus28","guid":"","teamId":"2","squadId":"5","kills":"20","deaths":"5","score":"2746","rank":"42"},{"name":"StrikeerCL","guid":"","teamId":"1","squadId":"5","kills":"9","deaths":"10","score":"1673","rank":"24"},{"name":"cienxxxxx","guid":"","teamId":"1","squadId":"5","kills":"4","deaths":"9","score":"1049","rank":"9"},{"name":"Kohoutak","guid":"","teamId":"1","squadId":"5","kills":"16","deaths":"15","score":"2805","rank":"50"},{"name":"MadBob78","guid":"","teamId":"1","squadId":"5","kills":"22","deaths":"8","score":"3449","rank":"145"},{"name":"AlcatrazSWAT","guid":"","teamId":"1","squadId":"6","kills":"10","deaths":"14","score":"1307","rank":"19"},{"name":"Tupixwoid98","guid":"","teamId":"2","squadId":"6","kills":"0","deaths":"0","score":"0","rank":"54"},{"name":"iRaaZor","guid":"","teamId":"2","squadId":"6","kills":"39","deaths":"14","score":"5065","rank":"145"},{"name":"Admiral_C_Kirk","guid":"","teamId":"2","squadId":"6","kills":"15","deaths":"10","score":"2772","rank":"145"},{"name":"ReQ_Reflex","guid":"","teamId":"2","squadId":"7","kills":"9","deaths":"12","score":"1348","rank":"13"},{"name":"mrnightblade","guid":"","teamId":"1","squadId":"7","kills":"10","deaths":"10","score":"1997","rank":"53"},{"name":"WT_NasciillHack-","guid":"","teamId":"2","squadId":"6","kills":"30","deaths":"8","score":"4276","rank":"57"},{"name":"Captain_A_Hawk","guid":"","teamId":"1","squadId":"7","kills":"14","deaths":"6","score":"2677","rank":"129"},{"name":"richardvmd","guid":"","teamId":"2","squadId":"7","kills":"6","deaths":"7","score":"1533","rank":"100"},{"name":"GoNattetPl","guid":"","teamId":"2","squadId":"7","kills":"15","deaths":"9","score":"2065","rank":"56"},{"name":"OrigiinXDD","guid":"","teamId":"1","squadId":"7","kills":"2","deaths":"12","score":"290","rank":"27"},{"name":"1FilhoDaXuxa","guid":"","teamId":"1","squadId":"8","kills":"22","deaths":"18","score":"3287","rank":"53"},{"name":"ha-88-ah","guid":"","teamId":"2","squadId":"8","kills":"9","deaths":"10","score":"1495","rank":"33"},{"name":"kndbkjs","guid":"","teamId":"1","squadId":"2","kills":"0","deaths":"0","score":"0","rank":"57"},{"name":"9190281","guid":"","teamId":"2","squadId":"5","kills":"5","deaths":"6","score":"816","rank":"24"},{"name":"ZHUANG-BING","guid":"","teamId":"2","squadId":"2","kills":"5","deaths":"12","score":"850","rank":"47"},{"name":"swagz9","guid":"","teamId":"1","squadId":"2","kills":"5","deaths":"16","score":"1248","rank":"14"},{"name":"ckmcjb25","guid":"","teamId":"2","squadId":"5","kills":"3","deaths":"6","score":"480","rank":"14"},{"name":"zRaDi4Te_","guid":"","teamId":"1","squadId":"8","kills":"5","deaths":"7","score":"832","rank":"49"},{"name":"pankartofelp12","guid":"","teamId":"1","squadId":"4","kills":"0","deaths":"5","score":"88","rank":"12"},{"name":"Nickoer-oax","guid":"","teamId":"2","squadId":"7","kills":"5","deaths":"8","score":"909","rank":"43"},{"name":"Donosb-BK","guid":"","teamId":"1","squadId":"2","kills":"6","deaths":"5","score":"724","rank":"139"},{"name":"tslick901","guid":"","teamId":"2","squadId":"8","kills":"5","deaths":"1","score":"890","rank":"145"},{"name":"cl4ymor3k1ll3r","guid":"","teamId":"2","squadId":"8","kills":"2","deaths":"0","score":"424","rank":"31"},{"name":"elastigol","guid":"","teamId":"1","squadId":"6","kills":"8","deaths":"1","score":"1054","rank":"46"},{"name":"slackforce","guid":"","teamId":"1","squadId":"4","kills":"2","deaths":"1","score":"360","rank":"145"},{"name":"ibrahimyuluce13","guid":"","teamId":"2","squadId":"1","kills":"0","deaths":"2","score":"0","rank":"23"},{"name":"Ar_Ph4razon","guid":"","teamId":"2","squadId":"8","kills":"1","deaths":"2","score":"100","rank":"39"},{"name":"NMT-Demente","guid":"","teamId":"0","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"12"}],"punkbuster":0,"punkbuster_version":"v1.893 | A1386 C2.344","quickmatch":0,"ranked":0,"region":"NAm","roundsplayed":1,"roundstotal":2,"roundtime":620,"targetscore":250,"teams":[{"tickets":"250","id":1},{"tickets":"248","id":2}],"uptime":224455,"version":"1149977"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf4/1_response.txt b/gameq/tests/Protocols/Providers/Bf4/1_response.txt deleted file mode 100644 index d1954793edf619b215f675a1aa24e417a05f13e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5181 zcmZu#+iv5?5oIo$Y&Mq-g3U{w3TGEOly}Wqr zVE!w=m#RM15@n}ht3|STy6RNb>27(Rm)-or^Zw>}-Y@BY^4@zx-J8Ma{hO1&$0uJ; zOz_Y6Wb%;LS-Yvqlk2>#tCR8ME!y$)lYL~i8bzkl((XBs9Wxzox{T@s`A%c|Qf?W=8`?XH#{PuTq2WlQ?bo^Cfq z(bxgYJZsmDz1b|P8n4$`xwSYCn{oxGo*!~pZ!Fk!a%m!R$TkiK0^#>UW9*B55E|>3 z)}aLmT}b{&Z*V$sw9Y0c<0A9xKSAT zE?uplJv9$XZJ$29Gz^21KA4Hqa1SQ*gZJ<0?e|pARI1lqv#u-BQ`_LEHOR%0Z>30m z6-la+i!3&p@)3Y++BVxf7u7%51wS<0R@~ z!5*mtT!>jIDKJA5B6k!}7{zt;WAGBU*3DVfQ-27gCQZ7NZE(&gR66 z85`B}NnJemae9UkH}(pK#Y)A(ndp~8;?%k$%9^qd#5U{|PEdIR5%`XKEis^2@?b0) zSLe+-&mVd=9i>+w(S$Uo%&ILuw{DP*9k8Yyg>g20_tGrk2}2P>t6LU{WZCvdNY~l2 z+Ge_^fbL~s$aVr1y@((M7&dV_%(6Obs_v)f?xj`Y*}h}4d>tdToX+o+fx~y56>VO& z2OvxY1Q{v8Grp@sdFm>fm;Kv!SF<_&O@o_@0~o>!C2~s7Hfa;dqC*r}suGt84EED< zk*!HijUpOsW9J>1Bm&Of+a~2h zn+9erRLP4}C51*>uyyx!)~(h}dzAMejy-Xum;lR=?twEHPihS)wr;j;PtS{Nu`Tmm z-fVh%9A_Pm#qvxgXhWK&Qj5YI6#)P_2uq44Z+K~|XdBGpPt-SSHD#L(EewoPm#?xJ zGs*$-L1UTK+q}4c6;lu*k;NW>){g^iJi~qiz{~dSdecnG{Hl3d)t{?Z73BzKQxV5h zw!K=z-pCQh8uqr%R->M%9+@NQA*vctO+zJsLqP^#ynGD0)sD(CuUEZjf_q7-eaGYn zCUEs6dg+#rZ|G_HsAcUsa=Sd9(-M0VrL3LJR|{BuQ1wNEHew7O)~;c2D`yb_-70 zoCjsdgHY{BLL_M04;-$ZWmfWTi-Kw!F!)mlb$qdRCUJt}_PowH&Vlz`SuT5F1K&cA zh{^fu!s2!++a=IP3obM9nk{%mVMDiCkGU~F9XFS*+j&2E<{cs>ta_oY|>(#m(R2lq|?*^4E~|`5ON$6wIO%d zA_^6EVc)r@A(6CLYaKrwkeplWs4TF^R6{@TSPUONlWu@@c5aki=K1|gl)gOx(NT)G zrT+Gcz#z>RI!GU#2zUZv7%>JxI+owNG5GfY diff --git a/gameq/tests/Protocols/Providers/Bf4/1_result.json b/gameq/tests/Protocols/Providers/Bf4/1_result.json deleted file mode 100644 index 160ea97..0000000 --- a/gameq/tests/Protocols/Providers/Bf4/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"192.223.30.161:25200":{"blaze_game_state":0,"blaze_player_count":64,"country":"US","dedicated":1,"gametype":"ConquestLarge0","gq_address":"192.223.30.161","gq_joinlink":"","gq_name":"Battlefield 4","gq_online":true,"gq_port_client":25200,"gq_port_query":47200,"gq_protocol":"bf3","gq_transport":"tcp","gq_type":"bf4","hostname":"=ADK= #7 | 24\/7 Operation Metro NO EXPLOSIVES | ADKGamers.com","ip_port":"192.223.30.161:25200","join_queue":0,"map":"XP0_Metro","max_players":64,"num_players":62,"num_teams":2,"online":1,"password":0,"pingsite":"iad","players":[{"name":"ROG26US","guid":"","teamId":"1","squadId":"3","kills":"0","deaths":"2","score":"3452","rank":"115","ping":"59","type":"0"},{"name":"new_landscape","guid":"","teamId":"2","squadId":"9","kills":"23","deaths":"17","score":"7153","rank":"90","ping":"205","type":"0"},{"name":"ANRGYPEASANT","guid":"","teamId":"1","squadId":"1","kills":"26","deaths":"11","score":"4273","rank":"101","ping":"22","type":"0"},{"name":"bumbuck1","guid":"","teamId":"2","squadId":"9","kills":"9","deaths":"4","score":"3156","rank":"140","ping":"186","type":"0"},{"name":"letzgo","guid":"","teamId":"1","squadId":"10","kills":"46","deaths":"13","score":"10124","rank":"140","ping":"40","type":"0"},{"name":"General-Bit-Ches","guid":"","teamId":"1","squadId":"6","kills":"14","deaths":"14","score":"5216","rank":"120","ping":"62","type":"0"},{"name":"Divine_Noodles","guid":"","teamId":"1","squadId":"1","kills":"4","deaths":"10","score":"4119","rank":"29","ping":"17","type":"0"},{"name":"D0MINlC2004","guid":"","teamId":"2","squadId":"1","kills":"22","deaths":"17","score":"5388","rank":"140","ping":"71","type":"0"},{"name":"EDinATL","guid":"","teamId":"1","squadId":"3","kills":"4","deaths":"13","score":"3731","rank":"66","ping":"76","type":"0"},{"name":"thomthom01","guid":"","teamId":"2","squadId":"3","kills":"9","deaths":"16","score":"3147","rank":"67","ping":"34","type":"0"},{"name":"D3viantS4ge","guid":"","teamId":"1","squadId":"2","kills":"24","deaths":"13","score":"8479","rank":"137","ping":"65535","type":"0"},{"name":"Xxsp00kxX","guid":"","teamId":"2","squadId":"5","kills":"8","deaths":"13","score":"2795","rank":"137","ping":"29","type":"0"},{"name":"KillingMushroom","guid":"","teamId":"2","squadId":"11","kills":"4","deaths":"9","score":"4060","rank":"134","ping":"110","type":"0"},{"name":"kaipeng79","guid":"","teamId":"2","squadId":"6","kills":"40","deaths":"15","score":"7891","rank":"135","ping":"33","type":"0"},{"name":"Anakin7869","guid":"","teamId":"1","squadId":"1","kills":"11","deaths":"9","score":"4906","rank":"91","ping":"66","type":"0"},{"name":"Jawhuh","guid":"","teamId":"2","squadId":"5","kills":"4","deaths":"13","score":"1655","rank":"80","ping":"27","type":"0"},{"name":"J0eB1ue","guid":"","teamId":"1","squadId":"10","kills":"16","deaths":"10","score":"5650","rank":"130","ping":"29","type":"0"},{"name":"eck053o","guid":"","teamId":"1","squadId":"10","kills":"26","deaths":"16","score":"10085","rank":"140","ping":"64","type":"0"},{"name":"CESCAN0","guid":"","teamId":"1","squadId":"3","kills":"10","deaths":"2","score":"3252","rank":"125","ping":"130","type":"0"},{"name":"fingers-tfl","guid":"","teamId":"1","squadId":"1","kills":"23","deaths":"15","score":"5302","rank":"65","ping":"128","type":"0"},{"name":"Nebula2359","guid":"","teamId":"2","squadId":"11","kills":"41","deaths":"19","score":"9414","rank":"140","ping":"36","type":"0"},{"name":"GruntCommander","guid":"","teamId":"2","squadId":"4","kills":"10","deaths":"6","score":"3075","rank":"114","ping":"42","type":"0"},{"name":"Dr_Orly","guid":"","teamId":"2","squadId":"11","kills":"25","deaths":"19","score":"7007","rank":"129","ping":"22","type":"0"},{"name":"bingsn","guid":"","teamId":"2","squadId":"9","kills":"17","deaths":"11","score":"4352","rank":"112","ping":"140","type":"0"},{"name":"IBsheepy","guid":"","teamId":"1","squadId":"10","kills":"43","deaths":"14","score":"9359","rank":"140","ping":"131","type":"0"},{"name":"RugerSRH","guid":"","teamId":"2","squadId":"4","kills":"11","deaths":"5","score":"3147","rank":"129","ping":"131","type":"0"},{"name":"Madoka11","guid":"","teamId":"1","squadId":"5","kills":"19","deaths":"15","score":"3614","rank":"140","ping":"41","type":"0"},{"name":"Sarasoujyu","guid":"","teamId":"2","squadId":"3","kills":"13","deaths":"13","score":"3172","rank":"88","ping":"133","type":"0"},{"name":"Maltent","guid":"","teamId":"1","squadId":"3","kills":"33","deaths":"9","score":"7230","rank":"133","ping":"37","type":"0"},{"name":"THIS_IS_R4PE","guid":"","teamId":"2","squadId":"3","kills":"3","deaths":"9","score":"1268","rank":"131","ping":"182","type":"0"},{"name":"jdcahill2014","guid":"","teamId":"2","squadId":"3","kills":"11","deaths":"9","score":"4204","rank":"125","ping":"44","type":"0"},{"name":"Mr_Fishay1","guid":"","teamId":"2","squadId":"6","kills":"18","deaths":"16","score":"4158","rank":"34","ping":"77","type":"0"},{"name":"llXubeRll","guid":"","teamId":"1","squadId":"3","kills":"14","deaths":"14","score":"4821","rank":"15","ping":"147","type":"0"},{"name":"HANDERSON_SURDOS","guid":"","teamId":"2","squadId":"6","kills":"25","deaths":"20","score":"5089","rank":"140","ping":"191","type":"0"},{"name":"fraughsty","guid":"","teamId":"1","squadId":"2","kills":"25","deaths":"18","score":"5264","rank":"123","ping":"55","type":"0"},{"name":"Sdt-Blacknemesis","guid":"","teamId":"2","squadId":"6","kills":"7","deaths":"12","score":"1992","rank":"134","ping":"29","type":"0"},{"name":"dillkill05","guid":"","teamId":"2","squadId":"9","kills":"33","deaths":"18","score":"7988","rank":"124","ping":"209","type":"0"},{"name":"darkelf1","guid":"","teamId":"2","squadId":"1","kills":"6","deaths":"13","score":"6509","rank":"140","ping":"35","type":"0"},{"name":"ThisOneIsForYou","guid":"","teamId":"2","squadId":"1","kills":"0","deaths":"5","score":"990","rank":"113","ping":"65","type":"0"},{"name":"FragDr","guid":"","teamId":"1","squadId":"6","kills":"14","deaths":"16","score":"3641","rank":"133","ping":"20","type":"0"},{"name":"Augmentergy","guid":"","teamId":"2","squadId":"1","kills":"11","deaths":"11","score":"4248","rank":"139","ping":"18","type":"0"},{"name":"nv185","guid":"","teamId":"1","squadId":"5","kills":"8","deaths":"11","score":"3032","rank":"114","ping":"70","type":"0"},{"name":"emulatin","guid":"","teamId":"1","squadId":"10","kills":"22","deaths":"11","score":"6607","rank":"140","ping":"153","type":"0"},{"name":"SgtLegoDude","guid":"","teamId":"1","squadId":"4","kills":"4","deaths":"5","score":"4482","rank":"121","ping":"58","type":"0"},{"name":"leduxem","guid":"","teamId":"2","squadId":"1","kills":"22","deaths":"3","score":"5048","rank":"134","ping":"46","type":"0"},{"name":"danpeng13","guid":"","teamId":"1","squadId":"9","kills":"15","deaths":"8","score":"2804","rank":"131","ping":"63","type":"0"},{"name":"Kunndy","guid":"","teamId":"1","squadId":"2","kills":"13","deaths":"10","score":"3258","rank":"101","ping":"170","type":"0"},{"name":"sbtheboss","guid":"","teamId":"1","squadId":"8","kills":"6","deaths":"4","score":"5167","rank":"112","ping":"35","type":"0"},{"name":"spoontactics","guid":"","teamId":"1","squadId":"2","kills":"14","deaths":"13","score":"4166","rank":"133","ping":"63","type":"0"},{"name":"BarkusGame","guid":"","teamId":"1","squadId":"8","kills":"24","deaths":"11","score":"4858","rank":"140","ping":"153","type":"0"},{"name":"JCS596","guid":"","teamId":"1","squadId":"6","kills":"24","deaths":"13","score":"4871","rank":"107","ping":"41","type":"0"},{"name":"Toma_Chinelada","guid":"","teamId":"2","squadId":"4","kills":"12","deaths":"8","score":"2881","rank":"136","ping":"150","type":"0"},{"name":"RicardoShura","guid":"","teamId":"1","squadId":"1","kills":"17","deaths":"12","score":"4343","rank":"40","ping":"197","type":"0"},{"name":"spinner1955","guid":"","teamId":"1","squadId":"2","kills":"9","deaths":"17","score":"2770","rank":"45","ping":"16","type":"0"},{"name":"aw1218","guid":"","teamId":"2","squadId":"5","kills":"17","deaths":"15","score":"3717","rank":"113","ping":"78","type":"0"},{"name":"chenyuntian","guid":"","teamId":"1","squadId":"4","kills":"3","deaths":"7","score":"1297","rank":"96","ping":"57","type":"0"},{"name":"xChurch117x","guid":"","teamId":"2","squadId":"9","kills":"8","deaths":"14","score":"2260","rank":"39","ping":"22","type":"0"},{"name":"DaGeef","guid":"","teamId":"2","squadId":"4","kills":"3","deaths":"4","score":"1699","rank":"31","ping":"58","type":"0"},{"name":"swoodo","guid":"","teamId":"1","squadId":"9","kills":"10","deaths":"5","score":"1762","rank":"80","ping":"74","type":"0"},{"name":"Average_07","guid":"","teamId":"2","squadId":"3","kills":"8","deaths":"9","score":"1804","rank":"110","ping":"161","type":"0"},{"name":"MARA-YAROU","guid":"","teamId":"2","squadId":"11","kills":"11","deaths":"9","score":"2050","rank":"125","ping":"189","type":"0"},{"name":"CaBo0sS","guid":"","teamId":"2","squadId":"4","kills":"2","deaths":"1","score":"440","rank":"99","ping":"60","type":"0"}],"punkbuster":0,"punkbuster_version":"v1.902 | A1390 C2.347","ranked":0,"region":"NAm","roundsplayed":0,"roundstotal":1,"roundtime":1027,"targetscore":0,"teams":[{"tickets":"389.3932","id":1},{"tickets":"461.1919","id":2}],"uptime":32606,"version":"157186"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bf4/2_response.txt b/gameq/tests/Protocols/Providers/Bf4/2_response.txt deleted file mode 100644 index 8edb1ac8b71719f7d477e13d883fac0f5cd46de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4931 zcma)A*>2lL6lM1|-GTP44+0AG%?1~(1@a(EwPRSaUCU|nCXA$sNRu8aB;{B}{;j{( zyUdkFk{x)0P+W#*?m73&ouNI?Q|F&}-fy1geG30C&b$`AH)CtiB`x1VGMk{DHrRVg& zpFJ;!Znh`>1U?OIKvg=KFOwO)T7i_OGa9gbw^TDYN1|zxWhHf(q0S}UET?(FuNROt z!dWC{&ZJfg&Cv(mw*b(~R9TKMOrbSgLBo`AGTbBUAAn{UWwXuNHapbarvQ?3ttTZy zFi1$xnzqLV)-R7p+h2p>@%LHO4zMX6h5gf64g?d;GkN<&6q!P1>B|TkwWC4z0r7F zqPxAUiF0=$>Z~;woS%FH5M}_iY+gXoq_&ZVXR| zTVR_O66)BR2+P)%w{iA|l{T<4QQHkk*rCh~3CV8~NLwDF&WSl54^@%m!>|s|cfh#k zHa{B?%wGyn_@R+*a`kSR7{A@vGm=Y9@bLY5(^_2g{u*vhi)Cq&G^J=rKQ<4CBSu1Q zxZaYLLKdhg;~-3`$|U#w;Bgokkkf;)1hz`9YwS;Ov!@o-c$my)nSKlY-djQ*k!W4o z*h-C-GuQg6sN!o#T<##TAk2%yawQ5vQW_Q$4i(GD+aj4S%MK{LA-9hr6iH|nDCDB< z)0#h2H-0fX+l3GfdAN-}&4>a4dVCKpJ&M(PGw8)dQaUr9LwO1(;-w7Md&a>jb`s}h z<#(En1wYOQY9rEWiYl0^p{`Um9)W!(2R`h(;1)C-#Kqe3Pp8BFu?reh+6}j%GO8+< zux(15YQ4`*-XRY$x4Ll0)oeCV6K!U?(8bJ|ul$$EykaYrq<}1LKBcrVg=lh6-t$GQ!A7g>336gX zeh*dZ*wsUnL#z>QMz2(ol^0-cx8`#%aUG*2<}3|mwB|O;OcEQryJA1DoxBuq34A0@ytQ}M43YC z08R>Th|5{&!(NFR2Ex4Dv~9Zx79fOzImeu_F#5{C+M%5Ju}?=*!wa=IN(iB?53bZh zUL3*tJlmgYk12xz@a783Hitu-tKvK{H|jFavK+cV+Yobcwn75yA}=Ty8(vqc&}Sx} z5XKWAGBD}OSzm9^a8(_kHcpOQWrRJgJnJfNx5O=(Uq}hcd`hHz<4g({i^*7B;d6y_ zj<~|YcAZI~%pmYIeWl)~{rCAt{VXq$EX-{E<$<-Mn<;Zss!Th@j3bgM&4cohP}s)n zJq)h#XDYw%FDDNVFz={gcNa#8AwZkwdB;X03Sl&-r{i9Ca5_FcB@`!H(#ws8)RB)4 zA&ORx)gn!9)t)eqQ6dmnQTu&M2b;NBrVTrnCht?qr2oAJec4y`y4b_|cV%!@9o#5HjWc#|cEjxz2m@X#p zcZNzAEhs0?4GT;};jQNwnh|!u@IkI#U%h@dj%+;F-x@eqPe3TxgN#hF(9Zr&Y7T3J S={k^H+Y1aS1aYxP;QbGNncFG= diff --git a/gameq/tests/Protocols/Providers/Bf4/2_result.json b/gameq/tests/Protocols/Providers/Bf4/2_result.json deleted file mode 100644 index cd2ec17..0000000 --- a/gameq/tests/Protocols/Providers/Bf4/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"192.223.30.204:25200":{"blaze_game_state":0,"blaze_player_count":62,"country":"US","dedicated":1,"gametype":"TeamDeathMatch0","gq_address":"192.223.30.204","gq_joinlink":"","gq_name":"Battlefield 4","gq_online":true,"gq_port_client":25200,"gq_port_query":47200,"gq_protocol":"bf3","gq_transport":"tcp","gq_type":"bf4","hostname":"=ADK= #5 | TDM Fast Rank | 300 Tickets | ADKGamers.com","ip_port":"192.223.30.204:25200","join_queue":0,"map":"MP_Abandoned","max_players":64,"num_players":60,"num_teams":4,"online":1,"password":0,"pingsite":"lax","players":[{"name":"Class_Onree","guid":"","teamId":"1","squadId":"1","kills":"1","deaths":"0","score":"100","rank":"68","ping":"169","type":"0"},{"name":"iNeebs","guid":"","teamId":"2","squadId":"6","kills":"0","deaths":"1","score":"0","rank":"140","ping":"270","type":"0"},{"name":"Xul_Aethyr","guid":"","teamId":"2","squadId":"1","kills":"0","deaths":"0","score":"0","rank":"121","ping":"90","type":"0"},{"name":"Agent_Hank","guid":"","teamId":"1","squadId":"1","kills":"0","deaths":"1","score":"0","rank":"47","ping":"30","type":"0"},{"name":"MexConMachete","guid":"","teamId":"1","squadId":"1","kills":"1","deaths":"0","score":"125","rank":"109","ping":"74","type":"0"},{"name":"Gabbhy","guid":"","teamId":"2","squadId":"1","kills":"2","deaths":"0","score":"361","rank":"130","ping":"66","type":"0"},{"name":"Draccon149","guid":"","teamId":"1","squadId":"8","kills":"2","deaths":"1","score":"234","rank":"140","ping":"73","type":"0"},{"name":"shikiiiiiii","guid":"","teamId":"1","squadId":"1","kills":"2","deaths":"0","score":"225","rank":"113","ping":"171","type":"0"},{"name":"Paco_Pancho69","guid":"","teamId":"2","squadId":"5","kills":"0","deaths":"0","score":"0","rank":"73","ping":"52","type":"0"},{"name":"MikeGross10","guid":"","teamId":"2","squadId":"2","kills":"0","deaths":"0","score":"0","rank":"35","ping":"134","type":"0"},{"name":"MoyashiPilav","guid":"","teamId":"2","squadId":"2","kills":"0","deaths":"0","score":"0","rank":"20","ping":"162","type":"0"},{"name":"LeadStylus","guid":"","teamId":"2","squadId":"2","kills":"2","deaths":"0","score":"227","rank":"131","ping":"26","type":"0"},{"name":"AppleSauce5000","guid":"","teamId":"2","squadId":"2","kills":"0","deaths":"0","score":"0","rank":"127","ping":"20","type":"0"},{"name":"bshaney6190","guid":"","teamId":"2","squadId":"5","kills":"0","deaths":"0","score":"0","rank":"117","ping":"30","type":"0"},{"name":"Kingx_xBelmont","guid":"","teamId":"2","squadId":"2","kills":"1","deaths":"0","score":"100","rank":"21","ping":"54","type":"0"},{"name":"CrazyMFVillain","guid":"","teamId":"2","squadId":"4","kills":"0","deaths":"0","score":"0","rank":"77","ping":"79","type":"0"},{"name":"Lcy13vv","guid":"","teamId":"2","squadId":"3","kills":"0","deaths":"0","score":"0","rank":"41","ping":"40","type":"0"},{"name":"nL_Ongrid","guid":"","teamId":"2","squadId":"4","kills":"1","deaths":"0","score":"135","rank":"137","ping":"49","type":"0"},{"name":"BlgNotorlous","guid":"","teamId":"2","squadId":"4","kills":"0","deaths":"0","score":"98","rank":"114","ping":"52","type":"0"},{"name":"2tense","guid":"","teamId":"2","squadId":"4","kills":"3","deaths":"0","score":"535","rank":"106","ping":"83","type":"0"},{"name":"inF_MarioM2406","guid":"","teamId":"2","squadId":"3","kills":"1","deaths":"0","score":"138","rank":"125","ping":"99","type":"0"},{"name":"joaquin0850","guid":"","teamId":"2","squadId":"4","kills":"0","deaths":"1","score":"0","rank":"46","ping":"130","type":"0"},{"name":"crusnikk","guid":"","teamId":"2","squadId":"3","kills":"2","deaths":"1","score":"200","rank":"124","ping":"64","type":"0"},{"name":"kasio001","guid":"","teamId":"2","squadId":"3","kills":"0","deaths":"0","score":"0","rank":"11","ping":"174","type":"0"},{"name":"Capt_Middlefingr","guid":"","teamId":"2","squadId":"3","kills":"1","deaths":"0","score":"125","rank":"111","ping":"57","type":"0"},{"name":"DarthTensor","guid":"","teamId":"1","squadId":"2","kills":"0","deaths":"1","score":"0","rank":"12","ping":"47","type":"0"},{"name":"frigus9085","guid":"","teamId":"1","squadId":"2","kills":"0","deaths":"0","score":"0","rank":"44","ping":"28","type":"0"},{"name":"Maj0rSK","guid":"","teamId":"1","squadId":"4","kills":"0","deaths":"0","score":"0","rank":"63","ping":"25","type":"0"},{"name":"ShawnLChrist","guid":"","teamId":"1","squadId":"4","kills":"0","deaths":"0","score":"0","rank":"39","ping":"68","type":"0"},{"name":"Ghost0966","guid":"","teamId":"1","squadId":"2","kills":"0","deaths":"0","score":"0","rank":"27","ping":"67","type":"0"},{"name":"Metal_Scrub-0390","guid":"","teamId":"1","squadId":"2","kills":"2","deaths":"1","score":"299","rank":"140","ping":"31","type":"0"},{"name":"Manatsunamis","guid":"","teamId":"1","squadId":"4","kills":"0","deaths":"1","score":"0","rank":"19","ping":"44","type":"0"},{"name":"dbabendererde","guid":"","teamId":"1","squadId":"3","kills":"1","deaths":"1","score":"100","rank":"19","ping":"64","type":"0"},{"name":"PelicanSam","guid":"","teamId":"1","squadId":"5","kills":"1","deaths":"1","score":"147","rank":"51","ping":"58","type":"0"},{"name":"hybyby534","guid":"","teamId":"1","squadId":"3","kills":"1","deaths":"0","score":"100","rank":"20","ping":"27","type":"0"},{"name":"ChristopherSKyle","guid":"","teamId":"1","squadId":"3","kills":"0","deaths":"0","score":"0","rank":"97","ping":"31","type":"0"},{"name":"SteamRailsOrigin","guid":"","teamId":"1","squadId":"5","kills":"0","deaths":"0","score":"0","rank":"14","ping":"72","type":"0"},{"name":"slv-raven","guid":"","teamId":"1","squadId":"6","kills":"0","deaths":"0","score":"0","rank":"81","ping":"75","type":"0"},{"name":"QueenRatchet123","guid":"","teamId":"2","squadId":"6","kills":"0","deaths":"0","score":"0","rank":"48","ping":"62","type":"0"},{"name":"WakinGreg","guid":"","teamId":"1","squadId":"5","kills":"1","deaths":"1","score":"150","rank":"29","ping":"63","type":"0"},{"name":"sds071","guid":"","teamId":"1","squadId":"3","kills":"1","deaths":"1","score":"100","rank":"49","ping":"39","type":"0"},{"name":"0antena0","guid":"","teamId":"2","squadId":"6","kills":"0","deaths":"1","score":"0","rank":"101","ping":"142","type":"0"},{"name":"-RazorBlaid90","guid":"","teamId":"1","squadId":"6","kills":"0","deaths":"0","score":"0","rank":"5","ping":"200","type":"0"},{"name":"MrNinjaPollo","guid":"","teamId":"1","squadId":"6","kills":"0","deaths":"1","score":"0","rank":"134","ping":"66","type":"0"},{"name":"RareKnob","guid":"","teamId":"1","squadId":"6","kills":"0","deaths":"0","score":"0","rank":"21","ping":"62","type":"0"},{"name":"Lanteg","guid":"","teamId":"2","squadId":"6","kills":"2","deaths":"0","score":"225","rank":"114","ping":"178","type":"0"},{"name":"DarkNinja0ne","guid":"","teamId":"2","squadId":"6","kills":"1","deaths":"1","score":"170","rank":"133","ping":"61","type":"0"},{"name":"BlackHawkDwon","guid":"","teamId":"1","squadId":"6","kills":"0","deaths":"1","score":"0","rank":"61","ping":"30","type":"0"},{"name":"Alanjsales","guid":"","teamId":"2","squadId":"7","kills":"0","deaths":"0","score":"0","rank":"68","ping":"49","type":"0"},{"name":"KaoxDubzz14","guid":"","teamId":"2","squadId":"7","kills":"1","deaths":"1","score":"87","rank":"91","ping":"38","type":"0"},{"name":"II_CALI_II","guid":"","teamId":"1","squadId":"8","kills":"0","deaths":"0","score":"0","rank":"140","ping":"71","type":"0"},{"name":"hapkiman","guid":"","teamId":"1","squadId":"7","kills":"0","deaths":"0","score":"0","rank":"111","ping":"28","type":"0"},{"name":"NT-Sidorenko","guid":"","teamId":"2","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"137","ping":"178","type":"0"},{"name":"Skeleknights","guid":"","teamId":"1","squadId":"7","kills":"0","deaths":"0","score":"0","rank":"133","ping":"51","type":"0"},{"name":"hlaks878","guid":"","teamId":"0","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"20","ping":"58","type":"0"},{"name":"Axion_OLD_DB","guid":"","teamId":"1","squadId":"1","kills":"0","deaths":"0","score":"0","rank":"133","ping":"45","type":"0"},{"name":"hallimasch07","guid":"","teamId":"0","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"112","ping":"125","type":"0"},{"name":"MaXoO_CL1918","guid":"","teamId":"0","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"35","ping":"174","type":"0"},{"name":"Fingerblaster700","guid":"","teamId":"0","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"140","ping":"161","type":"0"},{"name":"MarachaURU","guid":"","teamId":"0","squadId":"0","kills":"0","deaths":"0","score":"0","rank":"100","ping":"179","type":"0"},{"name":"GalletaSniper","guid":"","teamId":"0","squadId":"0","kills":"0","deaths":"-1","score":"0","rank":"-1","ping":"207","type":"1"}],"punkbuster":0,"punkbuster_version":"v1.902 | A1390 C2.347","ranked":0,"region":"NAm","roundsplayed":0,"roundstotal":1,"roundtime":104,"targetscore":300,"teams":[{"tickets":"9","id":1},{"tickets":"14","id":2},{"tickets":"0","id":3},{"tickets":"0","id":4}],"uptime":33771,"version":"157186"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bfbc2/1_response.txt b/gameq/tests/Protocols/Providers/Bfbc2/1_response.txt deleted file mode 100644 index ea127b2df812b352bcab2ed228d1ad95ffaf9af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2653 zcmZ`*+iu%N5Z&I>^!ieuPla9z6mX+*xgAT6xWiKN-~K~aD3bW$e;tt1exovrvzRp-b-$!0n7yk}<;Cemw9jxE- zu5Wvt`%a$=9}={?!g8AjXhn|Cw?aJu;y(kN5lRCG>@)Zb6PYgMB?hK)O%yMyI6`8j zlIxQQHx@UQjNn=`U&TpM;D$)a@~XhaBFu6MzlPLng<&_toncmR*TdVEq8#^eDu`{7 z1g@}90uE<9G||)9>G0ybzYib~%q5r}#XF9P_X1@0=U{d|VBbLKRL;x(#ZsoLi*cMM z4H!olfiO@@Et4$}&30-w+{1;bn%!YW)2y7m-n<9HCk$dFEGUikG#7&QYvD&TG7T@>-9%w-Z`C(X0BMeM@&cr++J z*2dcT)CCGW44ZDsH!@!zV4s}DX?EE0IvXXS@AiO55yvP(&EmKYna?ABd6lBw<)um^ z7y(;|dJgC(3zL#>Gy&u4W#6IgU&84(=%r#TH%XR9w5kE6&dqGtE%>N>>YX!(-q z0XLD+=DJGb;;O-*Xot!gkj+fv_!ceq4DYWYD$mw3jb%sotjZghM@$07*EP0b9Fbdl zt^WHXD`i?e(9|*gr?Vq#IUq24-J$_`lHSTBjyg=w&hFt{7T57%%dNFlw1UR1HqAoe zdDPf};h_=cDk`qB(lu?+sA|eea3o^@iC|%T2!sQBCYSFvG?<;1VRx)bQQSc}_*M=< z^&XEFb4=zahw=FK{lzg;$;=TUNFTfBqHnjl=oTDRr3|aqK-%GBrX-bzTQ2bnY)lHN zNT}^PyS+3^jVflAnPFnyF|Jn^m|AE{MGyDa-D!70$Qq_y9vDVwe}b_+@R_~`BKkCk z*A1L*sw^#YnT85(;AprIiMszx^Yq|7iXf&KUqHy|X!vYVsyJ;MwoRn=iBZHciuCpz zr_-5^2b0!_-O-h1N?m5?Vw%w{w;U-MO|v|E$6a_YhRNhk{nr*Yy2wbgtiQDkfQ8KO$O$%}Zs zjvsb1fl)s@_;k0PYeo=l)H^3XvBK3p2MQwyj=?t6gyh^SiZ1X(#>Fa@P~dbQshtzi d5dN;;waFrxufnVB-?$Y|<=A~s=wj6?{{w^YA#MNw diff --git a/gameq/tests/Protocols/Providers/Bfbc2/1_result.json b/gameq/tests/Protocols/Providers/Bfbc2/1_result.json deleted file mode 100644 index af9d937..0000000 --- a/gameq/tests/Protocols/Providers/Bfbc2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"85.195.114.186:19567":{"dedicated":1,"gametype":"CONQUEST","gq_address":"85.195.114.186","gq_joinlink":"","gq_name":"Battlefield Bad Company 2","gq_online":true,"gq_port_client":19567,"gq_port_query":48888,"gq_protocol":"bfbc2","gq_transport":"tcp","gq_type":"bfbc2","hostname":"=]RC[= STRATEGO - BC2 Conquest","ip_port":"0.0.0.0:19567","join_queue":1,"map":"Levels\/MP_007","max_players":32,"mod":"BC2","num_players":32,"num_teams":2,"online":1,"password":0,"players":[{"clanTag":"","name":"cos156","guid":"","teamId":"2","squadId":"1","kills":"12","deaths":"20","score":"1530","ping":"130"},{"clanTag":"","name":"KOKC_UA","guid":"","teamId":"2","squadId":"3","kills":"5","deaths":"17","score":"1440","ping":"169"},{"clanTag":"ZBOUB","name":"MaRtA_Tank_Girl","guid":"","teamId":"1","squadId":"3","kills":"26","deaths":"23","score":"2430","ping":"116"},{"clanTag":"MeOw","name":"MotOXy","guid":"","teamId":"1","squadId":"3","kills":"28","deaths":"27","score":"3005","ping":"133"},{"clanTag":"","name":"welluFIN","guid":"","teamId":"1","squadId":"3","kills":"11","deaths":"27","score":"1705","ping":"131"},{"clanTag":"","name":"Corvus Corax.","guid":"","teamId":"2","squadId":"3","kills":"17","deaths":"17","score":"1445","ping":"115"},{"clanTag":"","name":"TOLSSTY","guid":"","teamId":"2","squadId":"3","kills":"37","deaths":"32","score":"3000","ping":"116"},{"clanTag":"","name":"Gericke5","guid":"","teamId":"1","squadId":"2","kills":"6","deaths":"13","score":"600","ping":"115"},{"clanTag":"Harald","name":"Robsi500","guid":"","teamId":"1","squadId":"8","kills":"0","deaths":"0","score":"0","ping":"96"},{"clanTag":"MytYarm+","name":"Nino: 6 years","guid":"","teamId":"1","squadId":"3","kills":"47","deaths":"15","score":"4542","ping":"63"},{"clanTag":"run","name":"agend07","guid":"","teamId":"2","squadId":"2","kills":"36","deaths":"18","score":"3020","ping":"84"},{"clanTag":"","name":"JamesGaylord","guid":"","teamId":"2","squadId":"1","kills":"8","deaths":"6","score":"605","ping":"143"},{"clanTag":"DTH","name":"Ladypunish","guid":"","teamId":"1","squadId":"4","kills":"19","deaths":"20","score":"1804","ping":"77"},{"clanTag":"","name":"romania killer","guid":"","teamId":"2","squadId":"3","kills":"17","deaths":"26","score":"2110","ping":"170"},{"clanTag":"","name":"Wotanus","guid":"","teamId":"1","squadId":"4","kills":"5","deaths":"5","score":"447","ping":"101"},{"clanTag":"Invalid ","name":".:Raspi:.","guid":"","teamId":"1","squadId":"2","kills":"17","deaths":"21","score":"3665","ping":"90"},{"clanTag":"","name":"Redshot51","guid":"","teamId":"2","squadId":"7","kills":"11","deaths":"3","score":"910","ping":"88"},{"clanTag":"","name":"CrazyPlayer45","guid":"","teamId":"2","squadId":"6","kills":"10","deaths":"14","score":"1110","ping":"138"},{"clanTag":"GFSR","name":"Dreambish","guid":"","teamId":"1","squadId":"4","kills":"15","deaths":"13","score":"2335","ping":"275"},{"clanTag":"Invalid ","name":"Futacul","guid":"","teamId":"2","squadId":"6","kills":"11","deaths":"16","score":"1050","ping":"92"},{"clanTag":"","name":"alermovg2","guid":"","teamId":"2","squadId":"6","kills":"21","deaths":"21","score":"1560","ping":"176"},{"clanTag":"Invalid ","name":"X.M.S","guid":"","teamId":"1","squadId":"2","kills":"27","deaths":"31","score":"2677","ping":"92"},{"clanTag":"RU","name":"quontrance","guid":"","teamId":"2","squadId":"1","kills":"47","deaths":"18","score":"3761","ping":"95"},{"clanTag":"","name":"KFC-Steiner","guid":"","teamId":"1","squadId":"2","kills":"17","deaths":"26","score":"1450","ping":"71"},{"clanTag":"Invalid ","name":"MGBLN","guid":"","teamId":"2","squadId":"6","kills":"10","deaths":"4","score":"1120","ping":"138"},{"clanTag":"","name":"DeadMoroz1506","guid":"","teamId":"2","squadId":"2","kills":"6","deaths":"17","score":"1565","ping":"162"},{"clanTag":"Invalid ","name":"couse62","guid":"","teamId":"2","squadId":"7","kills":"5","deaths":"5","score":"370","ping":"110"},{"clanTag":"<3","name":"+Ryan+","guid":"","teamId":"1","squadId":"0","kills":"5","deaths":"6","score":"595","ping":"278"},{"clanTag":"somerset","name":"rsimmius","guid":"","teamId":"1","squadId":"1","kills":"4","deaths":"4","score":"520","ping":"88"},{"clanTag":"","name":"w4rI0ck","guid":"","teamId":"1","squadId":"4","kills":"1","deaths":"1","score":"250","ping":"131"},{"clanTag":"Invalid ","name":"Laiskiainen","guid":"","teamId":"1","squadId":"1","kills":"0","deaths":"4","score":"380","ping":"92"},{"clanTag":"","name":"darkchojin","guid":"","teamId":"2","squadId":"0","kills":"0","deaths":"0","score":"0","ping":"0"}],"punkbuster":1,"punkbuster_version":"v1.826 | A1382 C2.305","ranked":1,"region":"EU","roundsplayed":2,"roundstotal":2,"roundtime":1206,"targetscore":0,"teams":[{"tickets":"11.921661","id":1},{"tickets":"28.91926","id":2}],"uptime":110141,"version":"851434"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bfbc2/2_response.txt b/gameq/tests/Protocols/Providers/Bfbc2/2_response.txt deleted file mode 100644 index 92b72b41f7286b50921ee7f815c1643f20ba96cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2619 zcmZ`*+iu%N5Z&I>phb%U1@fpz2WS=Uk`&1T0Yck~<3^HG%XX5YfU%|+X(L`-UYywQ zkN2%}S(>t)tf1v`wR1Rg=FCt+h-X_uh_B%LC43KFif`bu{d{{ziEm*Q`qFbf@$mZk zA>2LteO+h z03@+FEAc(-C^__0=th$6ykHo5DscInBYuVxagwCxjVYF|GJTm=wfGt~o2pIw1%~iW zXLU-!xUP~B{U{?ppinV7e11rNIYavV0Y8rd@hj|K$YH2PgX=*o-B1m7)X;VO9v|77 z#rX{@|3Rp~0iIgre&^IaGFD`Uu76S_9tX!qJ(Zxz9>l(0Npf?tORhjAXE<~pX1m&o@8B=pSjY&Omm1~oo9>={o6TuQyjN;Mrq!+R@ zBv3*F6+6>QbEccOXXZjTpGE;`AsfnNn8>qnfP&GxYw-ij)3i!3t)5X%55p&zIO*Hu zpqiEEFbWD6(Z?SNX1;8Od#kc;2I@%y5`j?j0PxpiADBn%(PEjNS9)ABa7qPd|@woI@MKTigo$4M__tbbTTBCZCom32&ux`>PM&({dPW| zZ?*by55>;77K4hwM&&^MkZIQmsB*W)C;OAfoV2oSR=av#Hd^*jn@Iy(!r~62d|(Lg zqu{nzNYEtJZ(isRZ+f6l_++IhEkiD3p9VIUG*33^z2%1G$YCW*TaiiyY>uykKxSof zuN*ngBjSat$g|X{k$pB+!EPmWJ~(WPBCQy*7v8Nbd92#Nsu!*_(1Cce?~O*Evqrpt z$b&*4<%5PXY$yB&SVn;DHv5onv^0J&&o&Q=OnqC)%C|l3C$OICwlaw+2UDGxG=m)& z_|(pSTr&|Y(~%X1^6$tU3v@o7{0$cvJrOrrz%46O*}2lC0^9SSZQY!ht1E-{n@(_p zXD1>KrE>zB5)G8nSy`0}-Q3FrCzA_h#O7U{ME-3>;w$cGmF`~|k8yh@y0;ATfvG@Q zQ;9%_r-2PNYxDEV^RlYUVwv)GPX%MJCz5QtP9!^7VIaFYH_iKU!<>`Bt&qdvl)BJ; z(FN&Sf6)a9;PkmpTA0@Qt_xgUokqykzA|0-Q$hnpwWsS`7rpVO8hFi;mf!%Ec4!rh zw!86c*1b0S*x79kq3eP8cm@BjP&)B!`&eL~nrf4j#p%v?0yi)af*;8W=w6Jt->r$Y Yc=mESo{kA5&eD&%Xv*SVVSFCse*^p)Jpcdz diff --git a/gameq/tests/Protocols/Providers/Bfbc2/2_result.json b/gameq/tests/Protocols/Providers/Bfbc2/2_result.json deleted file mode 100644 index 62f428f..0000000 --- a/gameq/tests/Protocols/Providers/Bfbc2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.74.97.211:19567":{"dedicated":1,"gametype":"CONQUEST","gq_address":"64.74.97.211","gq_joinlink":"","gq_name":"Battlefield Bad Company 2","gq_online":true,"gq_port_client":19567,"gq_port_query":48888,"gq_protocol":"bfbc2","gq_transport":"tcp","gq_type":"bfbc2","hostname":"AWOLGAMERS","ip_port":"0.0.0.0:19567","join_queue":1,"map":"Levels\/MP_001","max_players":32,"mod":"BC2","num_players":32,"num_teams":2,"online":1,"password":0,"players":[{"clanTag":"Invalid ","name":"bohemianhacks","guid":"","teamId":"2","squadId":"0","kills":"4","deaths":"5","score":"285","ping":"139"},{"clanTag":"Invalid ","name":"Sarg-Louy","guid":"","teamId":"1","squadId":"1","kills":"11","deaths":"5","score":"751","ping":"98"},{"clanTag":"","name":"IamAWimp","guid":"","teamId":"1","squadId":"3","kills":"24","deaths":"38","score":"3350","ping":"172"},{"clanTag":"S1T2","name":"rolao","guid":"","teamId":"1","squadId":"1","kills":"0","deaths":"0","score":"0","ping":"0"},{"clanTag":"UMA","name":"Armail_UA","guid":"","teamId":"2","squadId":"2","kills":"21","deaths":"4","score":"1487","ping":"185"},{"clanTag":"","name":"NagibatYbivat","guid":"","teamId":"2","squadId":"2","kills":"19","deaths":"23","score":"1940","ping":"191"},{"clanTag":"|","name":"Merckill4i20","guid":"","teamId":"1","squadId":"1","kills":"15","deaths":"4","score":"2400","ping":"219"},{"clanTag":"Ex","name":"Sgt.Ghost 2\/","guid":"","teamId":"2","squadId":"1","kills":"30","deaths":"4","score":"3005","ping":"252"},{"clanTag":"ARSA","name":"Simo ARSA","guid":"","teamId":"1","squadId":"3","kills":"21","deaths":"29","score":"1470","ping":"243"},{"clanTag":"GOTH","name":"CounterfeitNinja","guid":"","teamId":"2","squadId":"5","kills":"9","deaths":"24","score":"1910","ping":"279"},{"clanTag":"Invalid ","name":"Globasek","guid":"","teamId":"1","squadId":"0","kills":"5","deaths":"13","score":"390","ping":"255"},{"clanTag":"","name":"=Marcinko=","guid":"","teamId":"2","squadId":"3","kills":"18","deaths":"9","score":"1280","ping":"128"},{"clanTag":"Invalid ","name":"VaYSSS(ua)","guid":"","teamId":"1","squadId":"3","kills":"9","deaths":"14","score":"1015","ping":"307"},{"clanTag":"(EVIL)","name":"SouthDakota1","guid":"","teamId":"2","squadId":"1","kills":"15","deaths":"15","score":"2510","ping":"97"},{"clanTag":"Invalid ","name":"LeaXHawX","guid":"","teamId":"1","squadId":"3","kills":"9","deaths":"13","score":"1190","ping":"352"},{"clanTag":"","name":"emcek","guid":"","teamId":"2","squadId":"1","kills":"13","deaths":"10","score":"1150","ping":"227"},{"clanTag":"","name":"71loco","guid":"","teamId":"1","squadId":"5","kills":"6","deaths":"7","score":"480","ping":"262"},{"clanTag":"","name":"Dr1am Runner","guid":"","teamId":"1","squadId":"2","kills":"3","deaths":"14","score":"275","ping":"275"},{"clanTag":"","name":"ALI466","guid":"","teamId":"1","squadId":"2","kills":"3","deaths":"7","score":"30","ping":"229"},{"clanTag":"08\\15","name":"Bulwey","guid":"","teamId":"2","squadId":"2","kills":"5","deaths":"12","score":"540","ping":"258"},{"clanTag":"","name":"Mauricio Maciel","guid":"","teamId":"2","squadId":"3","kills":"6","deaths":"3","score":"615","ping":"259"},{"clanTag":"Invalid ","name":"SELZ","guid":"","teamId":"1","squadId":"5","kills":"15","deaths":"9","score":"1140","ping":"227"},{"clanTag":"","name":"JustVizzi","guid":"","teamId":"2","squadId":"4","kills":"6","deaths":"9","score":"515","ping":"291"},{"clanTag":"","name":"borodatr","guid":"","teamId":"1","squadId":"5","kills":"8","deaths":"6","score":"580","ping":"195"},{"clanTag":"Invalid ","name":"TheIzi4","guid":"","teamId":"2","squadId":"4","kills":"5","deaths":"6","score":"510","ping":"372"},{"clanTag":"","name":"lumpyporridge","guid":"","teamId":"1","squadId":"4","kills":"8","deaths":"1","score":"470","ping":"162"},{"clanTag":"","name":"Damitjoe","guid":"","teamId":"2","squadId":"0","kills":"5","deaths":"2","score":"320","ping":"154"},{"clanTag":"","name":"The_Facu_Faka","guid":"","teamId":"1","squadId":"1","kills":"2","deaths":"2","score":"185","ping":"331"},{"clanTag":"","name":"Gasman","guid":"","teamId":"2","squadId":"3","kills":"2","deaths":"4","score":"120","ping":"86"},{"clanTag":"","name":"DANN98","guid":"","teamId":"1","squadId":"5","kills":"0","deaths":"1","score":"0","ping":"232"},{"clanTag":"ANBU","name":"Maicon_CEL","guid":"","teamId":"2","squadId":"6","kills":"0","deaths":"0","score":"0","ping":"0"},{"clanTag":"DANKMEME","name":"Alexantony","guid":"","teamId":"2","squadId":"6","kills":"0","deaths":"0","score":"0","ping":"0"}],"punkbuster":1,"punkbuster_version":"v1.826 | A1382 C2.305","ranked":1,"region":"NAm","roundsplayed":1,"roundstotal":1,"roundtime":1957,"targetscore":0,"teams":[{"tickets":"21.428391","id":1},{"tickets":"47.842731","id":2}],"uptime":33219,"version":"851434"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Bfbc2/3_response.txt b/gameq/tests/Protocols/Providers/Bfbc2/3_response.txt deleted file mode 100644 index 70f0d2177042f3186872ececa2dd18b4d9a74d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmYjNOH0E*5FX!B6uk&uggtsnlg-;xlb~4CrcJ9C5m}NomL_fOCIuls-pMAUvdru^ zuaB7z00y@JaDcXt7Cylde*S|WP&h{9n3|y*(5tE*MuVF@fNKP8FG2V|UA=t}FB%3O zdGsPbj0iRQHVMMf(-N zf3El514OhnDP}}KBye!*GZgjrT6!J&)xTea6d_Y^do-oHy5SYzLaIG^)5sIl^X;~B^}5W9jfk@YdUpd;Vlx@wWFb(KT{BJbfj%xR+dNn21nphVcs zbx0AXpDmYqt@C+Bdq`tGKuQ{@;Ny|cSUEq2S?va&r$zREi*b(#gS3D$=OMaC?q5|MsPCF!7p$&luG zmXBxIXjV*D`Ie6rk5Q2@Ce9<^0?4->{`Q--<7(zKYyopj5_dWVg=CvqDw9XN~%3C#YS z<{fqqdS2H%d)B>p2xJZ7$vy(v=o}kb7U)Zw(WCq;$7PXIMQFIJX_QryT^1z3unJ)_ z*I`aQ%E5G~vgxX#f7F-(j6q z3(;MadNQYy{D25-N3ccWvBV~6B7do#8yL>gbp5oLXXO?JQZ(t9f?>>wkrt#RxNs3& zDzfKQ6NAe-f48$RW_kV4$O4;49pG>Yt7ln}FE;AtX0cOz;3!Z>Bqr8FK%yfONPI$4 zSx*<6bgA;Pn9O%V$O?%C+b2Aq*!W>ir|PCwIzKJaU6l~~-~^Qt3KuDe=ptKIIa_aU zf1Pbcd9kK3HQp6s+wJ&`H9|me=u^UhA=4QVmpV%?sFXD%0uJZ^0W~OykQgRE=pT?c z2CwR}sC2!dAvJyvS75yj1IbfU$xIwkg$2r2v}WKldaF-ACJR{Q5wuHdi(h|!e zLkL>a4FoXk{o^7pN>y&os9Nvd7f{E51ria7&8y9I!P5PPUJbgvgYm`L&^F<WTcghXvULlP??8+UApL|=^%u!@BgsrP}t#Un?s7bx5c1{k|5a?wJ zk~zrCQB5~KP~vPm$n%Y+pAa${@K@{yjZ6gDa&2N8%yCm3W_PNp-xZIL0EQT|Y!o%k zdNM0@RTmUYbcdz;khy|4NP&)hN;sP=q1%v%Zexi{(ttAdYOTsr7mcvACb5wy128W% z%#4+x^&1O5rhB)}uTSdhuBsYRL4x~LKv)ro^q!H<#jdVg_>Wdq?YcWL05DtSczIxq pqbnL4*R~)WmO6h@ueY+r%EN_^+ znH>fI=*Hy~aDrGWpI^32DV>wunSM q3;$67D(#= diff --git a/gameq/tests/Protocols/Providers/Bfh/2_result.json b/gameq/tests/Protocols/Providers/Bfh/2_result.json deleted file mode 100644 index 772a8ab..0000000 --- a/gameq/tests/Protocols/Providers/Bfh/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"192.223.29.191:25200":{"blaze_game_state":0,"blaze_player_count":0,"country":"US","dedicated":1,"gametype":"TurfWarLarge0","gq_address":"192.223.29.191","gq_joinlink":"","gq_name":"Battlefield Hardline","gq_online":true,"gq_port_client":25200,"gq_port_query":47200,"gq_protocol":"bf3","gq_transport":"tcp","gq_type":"bfh","hostname":"THE THUNDERDOME | CONQUEST | www.RageGamez.com","ip_port":"192.223.29.191:25200","join_queue":0,"map":"MP_Bank","max_players":64,"num_players":0,"num_teams":2,"online":1,"password":0,"pingsite":"iad","punkbuster":0,"punkbuster_version":"","ranked":0,"region":"NAm","roundsplayed":0,"roundstotal":1,"roundtime":67792,"targetscore":0,"teams":[{"tickets":"300","id":1},{"tickets":"300","id":2}],"uptime":67793,"version":"525698"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cod2/1_response.txt b/gameq/tests/Protocols/Providers/Cod2/1_response.txt deleted file mode 100644 index cc77626..0000000 --- a/gameq/tests/Protocols/Providers/Cod2/1_response.txt +++ /dev/null @@ -1,26 +0,0 @@ -ÿÿÿÿstatusResponse -\_Admin_1\IAF SDS\_Admin_2\IAF LostCom\_Admin_3\IAF KILLINGMACHINE\_Clan\IAF\_Location\International\_Maps\Custom\_Mod\IAF Custom eXtreme+\_ModUpdate\January 2015\_ModVer\v2.9+ custom\_TeamSpeak3_IP\216.52.148.11:9810\_Website\www.IAOFF.com\fs_game\IAF_SDS29v7\g_antilag\0\g_gametype\tdm\gamename\Call of Duty 2\mapname\mp_coastal_guns\protocol\118\shortversion\1.3\sv_allowAnonymous\0\sv_floodProtect\1\sv_hostname\^5IAF ^3Custom^7#1 ^3e^1X^3treme^2+ ^7v2.9+ ^3[www.IAOFF.com]\sv_maxclients\40\sv_maxPing\400\sv_maxRate\25000\sv_minPing\0\sv_privateClients\0\sv_punkbuster\0\sv_pure\1\sv_voice\0\pswrd\0\mod\1 -60 33 "Tater Tot" -30 36 "^2I^3A^2F ^7Je^2$^7ter" -0 999 "SchnappDich" -30 165 "^1IAF ^9shake^1[JPN]" -20 200 "Trident" -0 143 "sandiegoghosts" -0 999 "L^2a^7yuier Dango" -75 48 "LoneWolf McBride" -0 999 "dreasdr" -65 36 "BETEPAH " -40 67 "Oldilocks" -50 89 "^4IAF^7^1 TheRiddick" -0 999 "HALSAN-711" -40 46 "pura" -0 33 "^5IAF ^4Bob" -70 34 "^4I^3A^4F OLDMAN" -0 999 "Z3R0 K1LL$" -0 66 "Grasshopper" -85 85 "gPAPA" -40 68 "ironwolfgang" -0 334 "BIGMACK" -0 999 "SURLY" -40 45 "Grampy" -0 999 "^3yasu^90^7shoot" diff --git a/gameq/tests/Protocols/Providers/Cod2/1_result.json b/gameq/tests/Protocols/Providers/Cod2/1_result.json deleted file mode 100644 index c7a5d42..0000000 --- a/gameq/tests/Protocols/Providers/Cod2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.150.214.131:28960":{"_Admin_1":"IAF SDS","_Admin_2":"IAF LostCom","_Admin_3":"IAF KILLINGMACHINE","_Clan":"IAF","_Location":"International","_Maps":"Custom","_Mod":"IAF Custom eXtreme+","_ModUpdate":"January 2015","_ModVer":"v2.9+ custom","_TeamSpeak3_IP":"216.52.148.11:9810","_Website":"www.IAOFF.com","clients":24,"fs_game":"IAF_SDS29v7","g_antilag":"0","g_gametype":"tdm","gamename":"Call of Duty 2","gq_address":"66.150.214.131","gq_joinlink":"","gq_name":"Call of Duty 2","gq_online":true,"gq_port_client":28960,"gq_port_query":28960,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"cod2","mapname":"mp_coastal_guns","mod":"1","players":[{"frags":"60","ping":"33","name":"Tater Tot"},{"frags":"30","ping":"36","name":"^2I^3A^2F ^7Je^2$^7ter"},{"frags":"0","ping":"999","name":"SchnappDich"},{"frags":"30","ping":"165","name":"^1IAF ^9shake^1[JPN]"},{"frags":"20","ping":"200","name":"Trident"},{"frags":"0","ping":"143","name":"sandiegoghosts"},{"frags":"0","ping":"999","name":"L^2a^7yuier Dango"},{"frags":"75","ping":"48","name":"LoneWolf McBride"},{"frags":"0","ping":"999","name":"dreasdr"},{"frags":"65","ping":"36","name":"BETEPAH"},{"frags":"40","ping":"67","name":"Oldilocks"},{"frags":"50","ping":"89","name":"^4IAF^7^1 TheRiddick"},{"frags":"0","ping":"999","name":"HALSAN-711"},{"frags":"40","ping":"46","name":"pura"},{"frags":"0","ping":"33","name":"^5IAF ^4Bob"},{"frags":"70","ping":"34","name":"^4I^3A^4F OLDMAN"},{"frags":"0","ping":"999","name":"Z3R0 K1LL$"},{"frags":"0","ping":"66","name":"Grasshopper"},{"frags":"85","ping":"85","name":"gPAPA"},{"frags":"40","ping":"68","name":"ironwolfgang"},{"frags":"0","ping":"334","name":"BIGMACK"},{"frags":"0","ping":"999","name":"SURLY"},{"frags":"40","ping":"45","name":"Grampy"},{"frags":"0","ping":"999","name":"^3yasu^90^7shoot"}],"protocol":"118","pswrd":"0","shortversion":"1.3","sv_allowAnonymous":"0","sv_floodProtect":"1","sv_hostname":"^5IAF ^3Custom^7#1 ^3e^1X^3treme^2+ ^7v2.9+ ^3[www.IAOFF.com]","sv_maxPing":"400","sv_maxRate":"25000","sv_maxclients":"40","sv_minPing":"0","sv_privateClients":"0","sv_punkbuster":"0","sv_pure":"1","sv_voice":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cod2/2_response.txt b/gameq/tests/Protocols/Providers/Cod2/2_response.txt deleted file mode 100644 index e841714..0000000 --- a/gameq/tests/Protocols/Providers/Cod2/2_response.txt +++ /dev/null @@ -1,40 +0,0 @@ -ÿÿÿÿstatusResponse -\_Admin\[OUTLAW]\_Email\gooutlawclan.com\_Location\US\_Maps\COD2 Stock & Custom\_Mod\^3e^1X^3treme^2+^8\_ModUpdate\Now\_ModVer\v2.8\_Website\www.gooutlawclan.com.com\fs_game\outlawz28\g_antilag\0\g_gametype\ctfb\gamename\Call of Duty 2\mapname\mp_draguignan_lib\protocol\118\shortversion\1.3\sv_allowAnonymous\0\sv_floodProtect\1\sv_hostname\^9[^1OUT^9LAW^1]^9e^1X^9treme^1+ ^9v2.8\sv_maxclients\40\sv_maxPing\350\sv_maxRate\25000\sv_minPing\0\sv_privateClients\0\sv_punkbuster\0\sv_pure\1\sv_voice\0\pswrd\0\mod\1 -0 95 "SwICK" -37 57 "^9[^1OUT^9LAW^1]^9Ms^1Storm^7" -28 56 "Mo Cheeze" -22 64 "^3Bubba^4Gump" -0 57 "^1{^3DD^1}^2Blaze66" -28 63 "^4HeadKnocker" -16 33 "Dawgface" -0 60 "falcon" -34 57 "^1Lt^7Lucci^262" -27 66 "Barbo-X" -15 63 "^1R^7e^4t^1z" -0 34 "^1R^2i^3c^5o" -23 31 "^1Hanz" -4 34 " HaShMoNeY" -19 33 "^9[^1OUT^9LAW^1]^9Death^1nail" -0 47 "TORONTO" -21 39 "^1(OUT^9LAW)^1BOO^9GER" -24 132 "^0Col. ^2Sanders" -58 34 "^9[^1OUT^9LAW^1]^9Capt^1Squawk" -1 52 "SexWax" -9 27 "^3Feisty^6Dawg" -0 100 "California Daisy Cutter !" -27 46 "^9[^1OUT^9LAW^1]^9The^1Duke" -44 66 "^9[^1OUT^9LAW^1]^9Billy^1_Mays" -37 27 "Reb Ralston" -48 63 "OrionHntr" -7 54 "NEO" -0 66 "^9[^1OUT^9LAW^1]^9Silver^1hawk" -9 57 "h1n1" -69 16 "^9[^1OUT^9LAW^1]^9Ice^1Man" -29 57 "^9[^1OUT^9LAW^1]^9colt^1 .45" -4 52 "^9[^1OUT^9LAW^1]^9Mental^1Wound" -5 36 "MarcusI" -19 138 "MASTER_KEY" -17 56 "^9[^1OUT^9LAW^1]^9SSJ^1adman" -24 55 "^9[^1OUT^9LAW^1]^9Nat^1ure" -8 67 "^2spacedawg" -14 259 "ATILA" diff --git a/gameq/tests/Protocols/Providers/Cod2/2_result.json b/gameq/tests/Protocols/Providers/Cod2/2_result.json deleted file mode 100644 index ac6949a..0000000 --- a/gameq/tests/Protocols/Providers/Cod2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.94.238.161:28960":{"_Admin":"[OUTLAW]","_Email":"gooutlawclan.com","_Location":"US","_Maps":"COD2 Stock & Custom","_Mod":"^3e^1X^3treme^2+^8","_ModUpdate":"Now","_ModVer":"v2.8","_Website":"www.gooutlawclan.com.com","clients":38,"fs_game":"outlawz28","g_antilag":"0","g_gametype":"ctfb","gamename":"Call of Duty 2","gq_address":"64.94.238.161","gq_joinlink":"","gq_name":"Call of Duty 2","gq_online":true,"gq_port_client":28960,"gq_port_query":28960,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"cod2","mapname":"mp_draguignan_lib","mod":"1","players":[{"frags":"0","ping":"95","name":"SwICK"},{"frags":"37","ping":"57","name":"^9[^1OUT^9LAW^1]^9Ms^1Storm^7"},{"frags":"28","ping":"56","name":"Mo Cheeze"},{"frags":"22","ping":"64","name":"^3Bubba^4Gump"},{"frags":"0","ping":"57","name":"^1{^3DD^1}^2Blaze66"},{"frags":"28","ping":"63","name":"^4HeadKnocker"},{"frags":"16","ping":"33","name":"Dawgface"},{"frags":"0","ping":"60","name":"falcon"},{"frags":"34","ping":"57","name":"^1Lt^7Lucci^262"},{"frags":"27","ping":"66","name":"Barbo-X"},{"frags":"15","ping":"63","name":"^1R^7e^4t^1z"},{"frags":"0","ping":"34","name":"^1R^2i^3c^5o"},{"frags":"23","ping":"31","name":"^1Hanz"},{"frags":"4","ping":"34","name":"HaShMoNeY"},{"frags":"19","ping":"33","name":"^9[^1OUT^9LAW^1]^9Death^1nail"},{"frags":"0","ping":"47","name":"TORONTO"},{"frags":"21","ping":"39","name":"^1(OUT^9LAW)^1BOO^9GER"},{"frags":"24","ping":"132","name":"^0Col. ^2Sanders"},{"frags":"58","ping":"34","name":"^9[^1OUT^9LAW^1]^9Capt^1Squawk"},{"frags":"1","ping":"52","name":"SexWax"},{"frags":"9","ping":"27","name":"^3Feisty^6Dawg"},{"frags":"0","ping":"100","name":"California Daisy Cutter !"},{"frags":"27","ping":"46","name":"^9[^1OUT^9LAW^1]^9The^1Duke"},{"frags":"44","ping":"66","name":"^9[^1OUT^9LAW^1]^9Billy^1_Mays"},{"frags":"37","ping":"27","name":"Reb Ralston"},{"frags":"48","ping":"63","name":"OrionHntr"},{"frags":"7","ping":"54","name":"NEO"},{"frags":"0","ping":"66","name":"^9[^1OUT^9LAW^1]^9Silver^1hawk"},{"frags":"9","ping":"57","name":"h1n1"},{"frags":"69","ping":"16","name":"^9[^1OUT^9LAW^1]^9Ice^1Man"},{"frags":"29","ping":"57","name":"^9[^1OUT^9LAW^1]^9colt^1 .45"},{"frags":"4","ping":"52","name":"^9[^1OUT^9LAW^1]^9Mental^1Wound"},{"frags":"5","ping":"36","name":"MarcusI"},{"frags":"19","ping":"138","name":"MASTER_KEY"},{"frags":"17","ping":"56","name":"^9[^1OUT^9LAW^1]^9SSJ^1adman"},{"frags":"24","ping":"55","name":"^9[^1OUT^9LAW^1]^9Nat^1ure"},{"frags":"8","ping":"67","name":"^2spacedawg"},{"frags":"14","ping":"259","name":"ATILA"}],"protocol":"118","pswrd":"0","shortversion":"1.3","sv_allowAnonymous":"0","sv_floodProtect":"1","sv_hostname":"^9[^1OUT^9LAW^1]^9e^1X^9treme^1+ ^9v2.8","sv_maxPing":"350","sv_maxRate":"25000","sv_maxclients":"40","sv_minPing":"0","sv_privateClients":"0","sv_punkbuster":"0","sv_pure":"1","sv_voice":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cod4/1_response.txt b/gameq/tests/Protocols/Providers/Cod4/1_response.txt deleted file mode 100644 index 06d3b37..0000000 --- a/gameq/tests/Protocols/Providers/Cod4/1_response.txt +++ /dev/null @@ -1,16 +0,0 @@ -ÿÿÿÿstatusResponse -\type\0\sv_maxclients\50\version\CoD4 X 1.7a win_mingw-x86-testing build 3325 Jan 3 2015\shortversion\1.7a\build\3325\sv_hostname\=^5|h4x|^7=^2War ^724/7 ^2Server COD4\sv_minPing\0\sv_maxPing\0\sv_voice\0\sv_maxRate\25000\sv_floodprotect\1\_CoD4 X Creator\Ninjaman, TheKelm @ http://iceops.in\protocol\6\sv_privateClients\0\sv_disableClientConsole\0\g_mapStartTime\Tue Feb 16 20:35:26 2016\uptime\6 minutes\g_gametype\war\mapname\mp_crash\sv_pure\1\_Admin\Admin\_admins_xfire\= ghash1985,somal007\_Apply_Clan\http://classic.xfire.com/communities/cod4h4x/\_Email\clanh4x@yahoo.com\_Website\http://www.clanh4x.tk\_clanh4x_forums\http://forum.clanh4x.tk\_clanh4x_facebook\www.facebook.com/clanh4x\_Recruiting\_On http://classic.xfire.com/communities/cod4h4x/\_Location\U.S.\_Mod\N/A\_ModVer\N/A\g_compassShowEnemies\0\gamename\Call of Duty 4 -150 47 "holy_buckets" -30 233 "fede" -40 229 "dany" -160 30 "Orange Vest 2.0" -222 108 "carlos" -120 116 "ArleyBernal" -70 202 "Mandrake" -0 35 "DUMPST3R B4BY" -30 119 "edge" -70 181 "engelblue" -40 56 "CHECLAVISICH" -70 216 "VANE" -30 87 "Deltron" -30 180 "(PIDNA)ALF" diff --git a/gameq/tests/Protocols/Providers/Cod4/1_result.json b/gameq/tests/Protocols/Providers/Cod4/1_result.json deleted file mode 100644 index c07fe28..0000000 --- a/gameq/tests/Protocols/Providers/Cod4/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.150.121.164:28931":{"_Admin":"Admin","_Apply_Clan":"http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","_Email":"clanh4x@yahoo.com","_Location":"U.S.","_Mod":"N\/A","_ModVer":"N\/A","_Recruiting":"_On http:\/\/classic.xfire.com\/communities\/cod4h4x\/","_Website":"http:\/\/www.clanh4x.tk","_admins_xfire":"= ghash1985,somal007","_clanh4x_facebook":"www.facebook.com\/clanh4x","_clanh4x_forums":"http:\/\/forum.clanh4x.tk","build":"3325","clients":14,"g_compassShowEnemies":"0","g_gametype":"war","g_mapStartTime":"Tue Feb 16 20:35:26 2016","gamename":"Call of Duty 4","gq_address":"66.150.121.164","gq_joinlink":"","gq_name":"Call of Duty 4","gq_online":true,"gq_port_client":28931,"gq_port_query":28931,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"cod4","mapname":"mp_crash","players":[{"frags":"150","ping":"47","name":"holy_buckets"},{"frags":"30","ping":"233","name":"fede"},{"frags":"40","ping":"229","name":"dany"},{"frags":"160","ping":"30","name":"Orange Vest 2.0"},{"frags":"222","ping":"108","name":"carlos"},{"frags":"120","ping":"116","name":"ArleyBernal"},{"frags":"70","ping":"202","name":"Mandrake"},{"frags":"0","ping":"35","name":"DUMPST3R B4BY"},{"frags":"30","ping":"119","name":"edge"},{"frags":"70","ping":"181","name":"engelblue"},{"frags":"40","ping":"56","name":"CHECLAVISICH"},{"frags":"70","ping":"216","name":"VANE"},{"frags":"30","ping":"87","name":"Deltron"},{"frags":"30","ping":"180","name":"(PIDNA)ALF"}],"protocol":"6","shortversion":"1.7a","sv_disableClientConsole":"0","sv_floodprotect":"1","sv_hostname":"=^5|h4x|^7=^2War ^724\/7 ^2Server COD4","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"50","sv_minPing":"0","sv_privateClients":"0","sv_pure":"1","sv_voice":"0","type":"0","uptime":"6 minutes","version":"CoD4 X 1.7a win_mingw-x86-testing build 3325 Jan 3 2015"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cod4/2_response.txt b/gameq/tests/Protocols/Providers/Cod4/2_response.txt deleted file mode 100644 index c3a5fc3..0000000 --- a/gameq/tests/Protocols/Providers/Cod4/2_response.txt +++ /dev/null @@ -1,29 +0,0 @@ -ÿÿÿÿstatusResponse -\type\0\sv_maxclients\48\version\CoD4 X 1.7a win_mingw-x86-custom_debug build 3232 Nov 22 2014\shortversion\1.7a\build\3232\sv_floodprotect\1\sv_maxRate\25000\sv_voice\1\sv_maxPing\0\sv_minPing\0\sv_hostname\^2ZA DOMINATION^0!!!!!! ^2www^0.^2zeroalphagaming^0.^2us\_CoD4 X Creator\Ninjaman, TheKelm @ http://iceops.in\protocol\6\sv_privateClients\0\sv_disableClientConsole\0\g_mapStartTime\Tue Feb 16 19:33:31 2016\uptime\3 days\g_gametype\dom\mapname\mp_overgrown\sv_pure\1\_Website\www.zeroalphagaming.us\_Location\New York,NY\gamename\Call of Duty 4\g_compassShowEnemies\0\HighXPBy\^2i.^7NiNJA -22 108 "MAHONEY" -21 129 "(MEX)Taco$/Puto" -92 35 "Demosiris" -10 252 "|24|MikeEcho" -146 122 "Dab" -42 244 "VenomSnake" -57 195 "Daniel" -51 72 "DazedSpartan" -70 25 "FreightLiner" -55 71 "DrNadoGuzman" -72 57 "Bubz" -20 57 "Bubba" -21 172 "Silva" -180 190 "PANZER VOR!" -58 93 "Fathom" -57 34 "Jason" -138 256 "metalexz" -75 29 "Comrade PoohTin" -0 131 "Static" -0 43 "James" -97 189 "Mazard" -0 64 "-^1R^7S^5N^7-" -7 60 "grimm" -0 42 "mauroarroyo" -21 194 "Willy" -29 95 "JOhn" -177 93 "=PichusnakE=" diff --git a/gameq/tests/Protocols/Providers/Cod4/2_result.json b/gameq/tests/Protocols/Providers/Cod4/2_result.json deleted file mode 100644 index dd9bc6e..0000000 --- a/gameq/tests/Protocols/Providers/Cod4/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"192.95.16.76:1337":{"HighXPBy":"^2i.^7NiNJA","_CoD4 X Creator":"Ninjaman, TheKelm @ http:\/\/iceops.in","_Location":"New York,NY","_Website":"www.zeroalphagaming.us","build":"3232","clients":27,"g_compassShowEnemies":"0","g_gametype":"dom","g_mapStartTime":"Tue Feb 16 19:33:31 2016","gamename":"Call of Duty 4","gq_address":"192.95.16.76","gq_joinlink":"","gq_name":"Call of Duty 4","gq_online":true,"gq_port_client":1337,"gq_port_query":1337,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"cod4","mapname":"mp_overgrown","players":[{"frags":"22","ping":"108","name":"MAHONEY"},{"frags":"21","ping":"129","name":"(MEX)Taco$\/Puto"},{"frags":"92","ping":"35","name":"Demosiris"},{"frags":"10","ping":"252","name":"|24|MikeEcho"},{"frags":"146","ping":"122","name":"Dab"},{"frags":"42","ping":"244","name":"VenomSnake"},{"frags":"57","ping":"195","name":"Daniel"},{"frags":"51","ping":"72","name":"DazedSpartan"},{"frags":"70","ping":"25","name":"FreightLiner"},{"frags":"55","ping":"71","name":"DrNadoGuzman"},{"frags":"72","ping":"57","name":"Bubz"},{"frags":"20","ping":"57","name":"Bubba"},{"frags":"21","ping":"172","name":"Silva"},{"frags":"180","ping":"190","name":"PANZER VOR!"},{"frags":"58","ping":"93","name":"Fathom"},{"frags":"57","ping":"34","name":"Jason"},{"frags":"138","ping":"256","name":"metalexz"},{"frags":"75","ping":"29","name":"Comrade PoohTin"},{"frags":"0","ping":"131","name":"Static"},{"frags":"0","ping":"43","name":"James"},{"frags":"97","ping":"189","name":"Mazard"},{"frags":"0","ping":"64","name":"-^1R^7S^5N^7-"},{"frags":"7","ping":"60","name":"grimm"},{"frags":"0","ping":"42","name":"mauroarroyo"},{"frags":"21","ping":"194","name":"Willy"},{"frags":"29","ping":"95","name":"JOhn"},{"frags":"177","ping":"93","name":"=PichusnakE="}],"protocol":"6","shortversion":"1.7a","sv_disableClientConsole":"0","sv_floodprotect":"1","sv_hostname":"^2ZA DOMINATION^0!!!!!! ^2www^0.^2zeroalphagaming^0.^2us","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"48","sv_minPing":"0","sv_privateClients":"0","sv_pure":"1","sv_voice":"1","type":"0","uptime":"3 days","version":"CoD4 X 1.7a win_mingw-x86-custom_debug build 3232 Nov 22 2014"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Codmw3/1_response.txt b/gameq/tests/Protocols/Providers/Codmw3/1_response.txt deleted file mode 100644 index 92aee2c6e681a7936e79c2978df3bd4431f63ffd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmW-cJ4*vW6oqfrE}fRaVk=AChmuy4jUk0Xgs_O$$S{v}2=mBn)>wqK^iNpZ+gb*D zf6_SXz3^Q)=fL55@BQp>dEQ>%U)_${c$v)`Nmn&Bmd6j1#o2Un_Xvei9F$?)=`C@B zIG)2zna5M2cwF$BI%zl3XxM*7N5HnwOHY%qDSW-lgOByw_u#TuX`Gc8SZ$Cge5RP7 zZ2}Z3`@}*4+E+xY5tR$K^M&Y81%)B5D5gj{FwAgmF&if75MNACLNEMJf4A$0k9-k9 d-3XC8IEett-=8sz8ppU+L`VWGgpb?B_z$rJR>lAT diff --git a/gameq/tests/Protocols/Providers/Codmw3/1_result.json b/gameq/tests/Protocols/Providers/Codmw3/1_result.json deleted file mode 100644 index 3dd8e9f..0000000 --- a/gameq/tests/Protocols/Providers/Codmw3/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"95.172.92.122:27015":{"dedicated":"d","game_descr":"MW3 Game Description","game_dir":"modernwarfare3","game_id":42690,"gq_address":"95.172.92.122","gq_joinlink":"steam:\/\/connect\/95.172.92.122:27015\/","gq_name":"Call of Duty: Modern Warfare 3","gq_online":true,"gq_port_client":27015,"gq_port_query":27017,"gq_protocol":"source","gq_transport":"udp","gq_type":"codmw3","hostname":"^4~FYANB~ ^2Quickscope [EU\/GER]","keywords":"gn\\IW5\\gt\\dm\\hc\\0\\pu\\0\\m\\mp_dome\\px\\\\pn\\\\mr\\\\pc\\0\\ff\\0\\fg\\\\md\\\\kc\\1\\ac\\1\\d\\2\\qp\\27017\\vo\\1\\","map":"Dome","max_players":18,"num_bots":0,"num_players":2,"os":"w","password":0,"players":[{"id":0,"name":"suff3r","score":550,"time":393.6198425293},{"id":0,"name":"Burdenmafia","score":100,"time":213.49261474609}],"port":27015,"protocol":17,"secure":1,"steam_id":90101380851801091,"steamappid":42690,"version":"1.0.0.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Codmw3/2_response.txt b/gameq/tests/Protocols/Providers/Codmw3/2_response.txt deleted file mode 100644 index 7c5d31f761601cddc71b8825de072b19331f8d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 557 zcmW+z&ubGw6#n8bXiup}y(|_Hib^)62BDEQJDVn$x|*#-=v1BT?2j?~tCQWdCGl7U zPkIydT)|U4cxq4LAK*zu!HWnUd+?%{ILW-j<9*+}@4fkEJRXmmbJcpisu?oLoj|kV za8KJH>)N~y%kwllNTiD>;jWB#nDm%*7qQ-1)Ye$!YQ*h3QlyzkVthO(o(JDSLBC#7 zq2v8CQ8@gDqYEnqKc>yj67@5xG-%*Zou)Z0(TGOrBQ@9$V%O=>beGaJrZkc&JBs%_ zb<^_|!YS=d5H{)Mv`n{CTCSAz3LPY>QqwU#v!l_hdeoQ{VYFB6#uU8RFVs;BMa=E( zTuAALI6ehb|9vnKbB9STViw{>0f-;JGqI_cmbPw-Fuc|h-7d7#z^{idO)S*w3mqm6 zDWYk^Z$*gjPfc`1=1T0I1!jhsi3W3e_xrBww_C|1O_hg#yCy8<@l`DgSf&NJ%_V>I> cxs1;WIJr4T&}Lbt*=)dk7k`v3m%lcQ|1;9Du>b%7 diff --git a/gameq/tests/Protocols/Providers/Codmw3/2_result.json b/gameq/tests/Protocols/Providers/Codmw3/2_result.json deleted file mode 100644 index 9ac8531..0000000 --- a/gameq/tests/Protocols/Providers/Codmw3/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"72.5.195.144:27015":{"dedicated":"d","game_descr":"MW3 Game Description","game_dir":"modernwarfare3","game_id":42690,"gq_address":"72.5.195.144","gq_joinlink":"steam:\/\/connect\/72.5.195.144:27015\/","gq_name":"Call of Duty: Modern Warfare 3","gq_online":true,"gq_port_client":27015,"gq_port_query":27017,"gq_protocol":"source","gq_transport":"udp","gq_type":"codmw3","hostname":"=FF= Crouch Only TDM #1","keywords":"gn\\IW5\\gt\\war\\hc\\1\\pu\\0\\m\\mp_roughneck\\px\\\\pn\\\\mr\\\\pc\\0\\ff\\1\\fg\\\\md\\\\kc\\0\\ac\\1\\d\\2\\qp\\27017\\vo\\2\\","map":"Off Shore","max_players":18,"num_bots":0,"num_players":16,"os":"w","password":0,"players":[{"id":0,"name":"CRASH","score":0,"time":8284.7763671875},{"id":0,"name":"BlindSquirrel","score":700,"time":5823.2797851562},{"id":0,"name":"ndcardinal","score":400,"time":5452.0537109375},{"id":0,"name":"[105]Kill-Libb","score":800,"time":4651.8618164062},{"id":0,"name":"*FF*WarCriminal","score":1000,"time":4061.7131347656},{"id":0,"name":"biter","score":1400,"time":3911.6896972656},{"id":0,"name":"HackUsersRLosers","score":400,"time":3631.5925292969},{"id":0,"name":"Ouch, that hurt","score":920,"time":2621.4086914062},{"id":0,"name":"StickyDoo","score":1200,"time":1921.2337646484},{"id":0,"name":"=FF=CAPTIONBLOOD","score":1220,"time":1821.2313232422},{"id":0,"name":"ib|nevra","score":1600,"time":1781.2037353516},{"id":0,"name":"<|DSC|>ts","score":840,"time":1500.8879394531},{"id":0,"name":"Giddyup01","score":2320,"time":1241.0709228516},{"id":0,"name":"[BB]QaddafiDuck","score":600,"time":730.94561767578},{"id":0,"name":"biff722","score":720,"time":580.9052734375},{"id":0,"name":"Ratt Savage","score":500,"time":200.8443145752}],"port":27015,"protocol":17,"secure":1,"steam_id":90101383022948353,"steamappid":42690,"version":"1.0.0.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Conanexiles/1_response.txt b/gameq/tests/Protocols/Providers/Conanexiles/1_response.txt deleted file mode 100644 index 580cab2fc3c3326177ebf19732e1e1bb5322122f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1065 zcmbVLJ#W)M7=Am1p$no2gb*N$fzMLePMnWUP2+PDDIZoYfS^jlCAkt4$A^69Hmxca zc19+KihqE_0umEU3@nHrz|7JahHyTo?f_HIl6}v|y?S-;ArDnN-R!`sfvTM3-tKC^G$OZPtGqOK`#e;)Ic_TA>2^ya7 z(@?Q%n_CVvSinbn3ctP3b)XY^T#!H!ce_;wsw8?YCL{Q4tURT3Uy)A^Ed=XwA_~3yaR-4fM$9J)8}H8}s7HhGUY$iU1d7Zw zj%;}(?30lCbK~#tUu?i$*sIck(8Hc7=NGTTUvF%9L?`4~QgG|j&x*=~%?5%c*SDL= zRE{qeU4aUAdLHOdZQ)MM1tXWuS_SzkDJGr?sF@rm0RBk;BvPCJIDG;@CZKHF?f=xD zXCvtY>sGH1B8(_tJ>3~GxlMd7S)-WJ<_VkcZG*mI=D z#0cYBtLfCs8yGAz3!EyqHJ7(zcWNFh%~T?AUm`i6xs%0CQ$ML3#zZWpmPigH2Y4qI OQgSLu!vwsiru7$C*&r+c diff --git a/gameq/tests/Protocols/Providers/Conanexiles/1_result.json b/gameq/tests/Protocols/Providers/Conanexiles/1_result.json deleted file mode 100644 index c7967e4..0000000 --- a/gameq/tests/Protocols/Providers/Conanexiles/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"85.114.155.195:27015":{"CSF_i":"0","HOSTIP":"1433574339","HOSTPORT":"7777","OWNINGID":"90109545464288261","OWNINGNAME":"[GER] Blood & Sand [PvP(RP)HVx2] Admins, Rules, No Avatars","P2PADDR":"90109545464288261","P2PPORT":"7777","S05_b":"true","S0_b":"true","S15_b":"false","S18_b":"true","S2_b":"false","S6_f":"0.100000","S7_b":"true","SESSIONFLAGS":"523","Sa_b":"true","Sb_f":"0.800000","Sf_f":"1.000000","Sk_f":"0.250000","So_f":"1200.000000","Sr_f":"10000.000000","Su_i":"4","Sv_f":"1.000000","Sx_i":"12","Sy_i":"0","dedicated":"d","game_descr":"Conan Exiles","game_dir":"conanexiles","game_id":440900,"gq_address":"85.114.155.195","gq_joinlink":"steam:\/\/connect\/85.114.155.195:27015\/","gq_name":"Conan Exiles","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"conanexiles","hostname":"[GER] Blood & Sand [PvP(RP)HVx2] Admins, Rules, No Avatars","keywords":"BUILDID:256536549,OWNINGID:90109545464288261,OWNINGNAME:[GER] Blood & Sand [PvP(RP)HVx2] Admins, Rules, No Avatars,P2PPORT:7777","map":"The Exiled Lands","max_players":70,"num_bots":0,"num_players":18,"num_rules":28,"os":"w","password":0,"players":[{"id":0,"name":"Miller","score":0,"time":14230.8125},{"id":0,"name":"Monshy","score":0,"time":14149.408203125},{"id":0,"name":"Tristan","score":0,"time":12823.291992188},{"id":0,"name":"Hauptmann Stahl","score":0,"time":10072.771484375},{"id":0,"name":"Memo","score":0,"time":9202.734375},{"id":0,"name":"Mat-Thorne","score":0,"time":8856.5234375},{"id":0,"name":"zumhieressen","score":0,"time":6606.5903320312},{"id":0,"name":"Maroner","score":0,"time":6271.3994140625},{"id":0,"name":"El Fiero","score":0,"time":4555.3115234375},{"id":0,"name":"Akatsuki","score":0,"time":3905.6616210938},{"id":0,"name":"martin.geez","score":0,"time":2906.0234375},{"id":0,"name":"Bane","score":0,"time":2733.3444824219},{"id":0,"name":"lthola","score":0,"time":2363.2619628906},{"id":0,"name":"LuckyLouGER","score":0,"time":1922.4068603516},{"id":0,"name":"Barbarella","score":0,"time":1574.6242675781},{"id":0,"name":"Sir_Hect0r_2.0","score":0,"time":1255.36328125},{"id":0,"name":"Yemaja","score":0,"time":451.47943115234},{"id":0,"name":"The Doctor","score":0,"time":133.0213470459}],"port":7777,"protocol":17,"sc_f":"10.000000","se_f":"0.500000","secure":1,"sl_f":"2.000000","steam_id":90109545464288261,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Conanexiles/2_response.txt b/gameq/tests/Protocols/Providers/Conanexiles/2_response.txt deleted file mode 100644 index 2fe3da67e28a4440906278538145a5392eff82ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcmb7@J#5oJ6vtnsilIxz(g}eT1Y#(u?Zj@<3CF&qR-HJ?r5{p>qDyi~+&DI}lYXf) zEG$Sc&;f}7SXe3+1V|uNLP&H$2z5k)k%5IhoG)$K3YMOi_y4_nANG453ZX0R?reEl<`c#&e?{rFrU-%W+4~X?fBvXl-pE5n~qBxfK8gsIuDhX9drl;-Y z0xQB$T9m}Jk`!e%rKo9DOdh!kS{}`vzv1b58<)-EoRW|e$yrtoj5ilpZvYcJI}_|H z42&trkuD8|tl#$xZWpwIfL2Tk;TY$)fA1rxlfd=ERC}&=%kqN;X9vlWzHNvwai;S#VwFzQe z5u*cPohga^N<)be#-?4!T3QZ+A}1iEr*GpXQ|jn)>ul^=B;$#rOr6t#p?fB<%alAy c<1>{OPkQLHG01>77?$J{yvcA1@D?A^Us#ndPyhe` diff --git a/gameq/tests/Protocols/Providers/Conanexiles/2_result.json b/gameq/tests/Protocols/Providers/Conanexiles/2_result.json deleted file mode 100644 index b71ed32..0000000 --- a/gameq/tests/Protocols/Providers/Conanexiles/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"31.186.250.173:7777":{"CSF_i":"0","HOSTIP":"532347565","HOSTPORT":"7777","OWNINGID":"90109540268569604","OWNINGNAME":"KH#1[UK\/EU]ALLx6[24\/06]EVENTS\/NOGOD KHGAMING.CO.UK","P2PADDR":"90109540268569604","P2PPORT":"7777","S05_b":"true","S0_b":"true","S15_b":"false","S18_b":"true","S7_b":"true","SESSIONFLAGS":"523","Sa_b":"true","Sb_f":"0.500000","Sf_f":"6.000000","Sg_f":"10.000000","Sj_f":"1.300000","Sk_f":"0.500000","Sm_f":"2.000000","So_f":"900.000000","Su_i":"2","Sw_f":"120.000000","Sx_i":"8","Sy_i":"0","dedicated":"d","game_descr":"Conan Exiles","game_dir":"conanexiles","game_id":440900,"gq_address":"31.186.250.173","gq_joinlink":"steam:\/\/connect\/31.186.250.173:7777\/","gq_name":"Conan Exiles","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"conanexiles","hostname":"KH#1[UK\/EU]ALLx6[24\/06]EVENTS\/NOGOD KHGAMING.CO.UK","keywords":"BUILDID:256536549,OWNINGID:90109540268569604,OWNINGNAME:KH#1[UK\/EU]ALLx6[24\/06]EVENTS\/NOGOD KHGAMING.CO.UK,HOSTIP:532347565","map":"The Exiled Lands","max_players":70,"num_bots":0,"num_players":22,"num_rules":28,"os":"w","password":0,"players":[{"id":0,"name":"Games Foundry","score":0,"time":24031.859375},{"id":0,"name":"Stanislav Rink","score":0,"time":12920.913085938},{"id":0,"name":"Rastafreaak","score":0,"time":9190.6064453125},{"id":0,"name":"Igas","score":0,"time":6897.5263671875},{"id":0,"name":"\"CONAN EXILES\"","score":0,"time":6269.919921875},{"id":0,"name":"carlos89j","score":0,"time":5068.6474609375},{"id":0,"name":"VikingLord","score":0,"time":4934.224609375},{"id":0,"name":"Moraiz92","score":0,"time":3930.3786621094},{"id":0,"name":"Ashen-Shugar","score":0,"time":3794.3669433594},{"id":0,"name":"Claire","score":0,"time":3778.5329589844},{"id":0,"name":"Badbonez","score":0,"time":3544.4113769531},{"id":0,"name":"♥ Cyria |I| Dana ♥","score":0,"time":3197.2294921875},{"id":0,"name":"C4","score":0,"time":2557.4655761719},{"id":0,"name":"kisbye1","score":0,"time":1639.34765625},{"id":0,"name":"Matthi","score":0,"time":1590.5541992188},{"id":0,"name":"kosete83","score":0,"time":1562.9281005859},{"id":0,"name":"Depravao","score":0,"time":971.13580322266},{"id":0,"name":"BitsnPieces","score":0,"time":867.36468505859},{"id":0,"name":"dat_Shane","score":0,"time":650.52447509766},{"id":0,"name":"Palczi","score":0,"time":426.59994506836},{"id":0,"name":"GAbrieL","score":0,"time":215.14616394043},{"id":0,"name":"Silverman","score":0,"time":193.0185546875}],"port":7777,"protocol":17,"sc_f":"10.000000","se_f":"0.500000","secure":1,"sl_f":"6.000000","steam_id":90109540268569604,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Conanexiles/3_response.txt b/gameq/tests/Protocols/Providers/Conanexiles/3_response.txt deleted file mode 100644 index aaa6f092255cfe7e6717415960a32eb0c6ff88d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmZuv&2F1O7~DvSROQxFPmQdeY$-pxu>35iF1w43VtxcTZqx%Jg(OxSI|A&uQeL1^ zr9MlZqz}+*pQG-AowiZ4NU+T8ppThZuh(n$bvKAYrPm!#?uxvF)Dyke&u)vdii*W- zQWyCVf~#)7*W8nyw(5Qed!3_Bcd2OPSk-zUxh~vln$2>Ml{aa%D3_CEHcgA=e7Y=h zK%-Nu6K~Ou*rEXJDj>fHJLniT7kJDL_P!?H-oAUka~O<$*YCUBA`n5MK}9~XY3f+p zQa<&>3#32tf>8M3$Yz1>TbLY%N=P}6UN|e6Fo+V%kn7N!=Wd=(EeL+~_dv7uA0GCl zJ8SU<(BUu`b2-y6pqve86sHpapTlkToBy!3INQ$cd^SY`(m6O)}lmU+>Y>>E~2u4YI z36LU!zuh8n!UiC~^?P#4$~b6%L`TA{o4aIWmw`Y=V;Z`$c^}FK;HZt2T}2(F06C z;5aUG>2MQ8d+4cG;J;ph4b=qp0=aF`%S_WE(6k7|f<|m`D$d72#AEqmY*E$oTM!rJ zvM9r>s^r9ZdI2u8X;sMMO-Dwth;5oALvb!7RhNr~iDNhLogwYVKsVJVz>UK*(f-L( lJ^60iR&YRH4K}-tCU$dBnq=QkUg5wQRO diff --git a/gameq/tests/Protocols/Providers/Conanexiles/3_result.json b/gameq/tests/Protocols/Providers/Conanexiles/3_result.json deleted file mode 100644 index 154e486..0000000 --- a/gameq/tests/Protocols/Providers/Conanexiles/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"193.111.186.177:7777":{"ALLOWDOWNLOADCHARS_i":"0","ALLOWDOWNLOADITEMS_i":"0","CUSTOMSERVERNAME_s":"(orp2)(wiped 13\/6)gamersreunited-10x(g)10x(t)5x(xp)","DayTime_s":"11:41","GameMode_s":"TestGameMode_xtcrisland_C","MATCHTIMEOUT_f":"120.000000","MOD0_s":"599476919:80B7AFED4294E3805C8C079C70A1AF74","MOD1_s":"731604991:8E24D60643B4AD865ADCCDB6BD0EC89A","MOD2_s":"609425335:AB0E60CF432B2C7019771399AEDA5F4A","MOD3_s":"566885854:4A5A1F1C49F88442D00B3186474D171A","ModId_l":"0","NUMOPENPUBCONN":"49","Networking_i":"0","OFFICIALSERVER_i":"0","OWNINGID":"90109502901488645","OWNINGNAME":"90109502901488645","P2PADDR":"90109502901488645","P2PPORT":"7777","SEARCHKEYWORDS_s":"Custom","SERVERUSESBATTLEYE_b":"true","SESSIONFLAGS":"683","SESSIONISPVE_i":"0","ServerPassword_b":"false","dedicated":"d","game_descr":"ARK: Survival Evolved","game_dir":"ark_survival_evolved","game_id":346110,"gq_address":"193.111.186.177","gq_joinlink":"steam:\/\/connect\/193.111.186.177:7777\/","gq_name":"Conan Exiles","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"conanexiles","hostname":"(ORP2)(Wiped 13\/6)GamersReunited-10x(G)10x(T)5x(XP) - (v259.35)","keywords":",OWNINGID:90109502901488645,OWNINGNAME:90109502901488645,NUMOPENPUBCONN:49,P2PADDR:90109502901488645,P2PPORT:7777,ModId_l:0","map":"TheIsland","max_players":50,"num_bots":0,"num_players":4,"num_rules":23,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":139524.46875},{"id":0,"name":"","score":0,"time":90719.78125},{"id":0,"name":"","score":0,"time":70353.6171875},{"id":0,"name":"banther","score":0,"time":14043.213867188}],"port":7777,"protocol":17,"secure":1,"steam_id":90109502901488645,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Crysiswars/1_response.txt b/gameq/tests/Protocols/Providers/Crysiswars/1_response.txt deleted file mode 100644 index 0e147fee6c3f816a86c617c3e21c74b9da0f4129..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 868 zcmY*X+iu%14CVF(`vkx3se$d>fpu8pE*aWn8JeIO78C_%Gqzw^G9;ymi#_bqM=8L7 zf{;ZX@f?zp;X@REv8@zN9UJ%ym9|b{LvWql?XKrX^;_q)y^(E&e;RS7B5JU;P;yF0 z%S~s6J)yZ^FJvI;c^i$>X;5pmaWEPraSTiiq;2+mBOP`@#&s>hmW)B6GOe7^61bOE zVn?i+4w-iTA58+M(FFwuoM=djMmQJ`p+##?+7u82Dkt)a(6O%%2ayYu?7nD`Q?8qa z{euyt3fUcmAxNO0LgeVE@cuc8Im1ucVqvwC9fw>sw7=Rdmp-rj8xfXoyOuv-$5OZQazw)iIm-6P9@67KE1`BL>5B~tw-st%N diff --git a/gameq/tests/Protocols/Providers/Crysiswars/1_result.json b/gameq/tests/Protocols/Providers/Crysiswars/1_result.json deleted file mode 100644 index 1ec97f2..0000000 --- a/gameq/tests/Protocols/Providers/Crysiswars/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"138.201.128.96:64100":{"anticheat":"0","dedicated":"1","dx10":"0","friendlyfire":"1","gamemode":"game","gamename":"crysiswars","gamepadsonly":"0","gametype":"TerrainControl","gamever":"1.1.1.6729","gq_address":"138.201.128.96","gq_joinlink":"","gq_name":"Crysis Wars","gq_online":true,"gq_port_client":64100,"gq_port_query":64100,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"crysiswars","hostname":"=CJW=FunbocksAlpha|mixed maps","hostport":"64100","mapname":"TC_Altay","maxplayers":"28","modname":"MWLL","modversion":"0.8.6","numplayers":"25","official":"0","password":"0","players":[{"player":"Sergei","team":"2","deaths":"5","rank":"11","kills":"6"},{"player":"BOZOH","team":"2","deaths":"2","rank":"3","kills":""},{"player":"GuppyFish","team":"2","deaths":"7","rank":"10","kills":"7"},{"player":"Fred104 [BPL]","team":"1","deaths":"6","rank":"4","kills":""},{"player":"CloneSarge","team":"0","deaths":"","rank":"1","kills":""},{"player":"MR_TEX","team":"1","deaths":"7","rank":"9","kills":"4"},{"player":"Domkek [CSF]","team":"1","deaths":"6","rank":"11","kills":"10"},{"player":"Michaellsland","team":"2","deaths":"6","rank":"8","kills":"3"},{"player":"[BPL] Greg","team":"1","deaths":"3","rank":"5","kills":"-1"},{"player":"DarthVisari","team":"2","deaths":"5","rank":"4","kills":""},{"player":"123456789","team":"1","deaths":"","rank":"12","kills":"10"},{"player":"Vancer2","team":"2","deaths":"3","rank":"3","kills":"2"},{"player":"Canadian Commando","team":"1","deaths":"8","rank":"3","kills":""},{"player":"grog","team":"2","deaths":"1","rank":"9","kills":"2"},{"player":"Nytmare","team":"2","deaths":"2","rank":"5","kills":""},{"player":"[W-R].GnKnG","team":"1","deaths":"2","rank":"7","kills":"5"},{"player":"WindowsVista","team":"2","deaths":"1","rank":"2","kills":"2"},{"player":"BrutaLShag","team":"1","deaths":"2","rank":"7","kills":"2"},{"player":"One Bucket o' KFC","team":"2","deaths":"4","rank":"4","kills":""},{"player":"Dr.Gonzo","team":"1","deaths":"7","rank":"4","kills":""},{"player":"Gyph","team":"2","deaths":"3","rank":"6","kills":"1"},{"player":"Jasper","team":"1","deaths":"2","rank":"3","kills":"1"},{"player":"Mechwarrior","team":"1","deaths":"1","rank":"6","kills":"1"},{"player":"","team":"","deaths":"","rank":"","kills":""},{"player":"","team":"","deaths":"","rank":"","kills":""}],"timeleft":"1719","timelimit":"75","voicecomm":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs15/1_response.txt b/gameq/tests/Protocols/Providers/Cs15/1_response.txt deleted file mode 100644 index 2d83c3e899fd0b6033a75a89bb940a684a3b083c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1933 zcmZWpOK&7K5O(%KP{aWt&ZrR=5YU>QN0QAVP<9i6w7Xma5?s>pxND}p`t$cg^7_FGhpB80N#H{z0!8iQ6BoayBUKtQ^0l z+sufHN^K|PtrIFluV*A)y19+y&pK=Oqr5U=XSrPFs&jnV#pRZw5Ml?P_~WlV{@J^^ z*+b>Klii)$<5`s9i;K^X-!{*`xya7X#d`>R_3Mk1N5@sARisM159Ik*Pfs7$QrmJ& zl@pIR=+EKFlbdXk9cMpeZ?o*XEIay5JZ8^}uTP#{WWBo4XCY)Ci#>pYzpqcv`eK6!F>${qfL4nKTXh)3M&>A5J&a7nr>_Q!2I(`qJq z|A9j7mRm^Lr~`PYM6r&N%X;E`MY6gVmN2sMArwhATTIo`PRVl7O*&;_xgakJ$hR(` zSr98tsavteJpD4)9xQI6g7QSRY-OxBQ7bIS1#L0ENEM#t`}rX6uM=K3+I#1PkW~XY zq%qn$OB@=oF=CJpvX^Jsr^j!8%HFu@Gl2-VEJI5w%IJJRC$hOLv0_oGh_!Oa1)y=& z+)xmMWLdh5jcmo_s?>^>&YLRXQ8#305=DP>)Eg#fUAf;YdLVCQK1obtU$Df~qM^Job)9>5EsVr{9*}%ZA3%ie5g|XVo$$Z_37(Tq8S=p3Y8i6`~s(nYJ6J zCq{z2j9E$xO6_7Wn?;`}-VcbfY7a5}+R2Zi<Nu$oQGLo(xl5T*$ k#(0N(G(^{Sr4ACO3x@{_d&XvBi|Li7o!$2Ya1ppC^IsgCw diff --git a/gameq/tests/Protocols/Providers/Cs15/1_result.json b/gameq/tests/Protocols/Providers/Cs15/1_result.json deleted file mode 100644 index 656b094..0000000 --- a/gameq/tests/Protocols/Providers/Cs15/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"85.153.14.4:27015":{"KEEG_Nameban":"0.4.5","SpecList":"1.2b","__sxei_16bppkick":"0","__sxei_16bppshow":"0","__sxei_antisound":"1","__sxei_awhfordead":"0","__sxei_awhforent":"0","__sxei_awhforteam":"0","__sxei_changenick":"1","__sxei_clt_ver":"15.1","__sxei_internal_ip":"","__sxei_required":"1","__sxei_screen_path":"","__sxei_screen_save":"","__sxei_srv_ver":"9.6.3.2","__sxei_zmirror":"","address":"85.153.14.4:27015","admin_allinone_version":"3.3 CS (AMX Mod)","allow_spectators":"1","amx_contactinfo":"","amx_modules":"3","amx_nextmap":"fy_iceworld","amx_timeleft":"25:04","amx_version":"2010.1","antidlfile_version":"1.4","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"CounterStrike","game_dir":"cstrike","gq_address":"85.153.14.4","gq_joinlink":"steam:\/\/connect\/85.153.14.4:27015\/","gq_name":"Counter-Strike 1.5","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"won","gq_transport":"udp","gq_type":"cs15","hostname":"~UnconscionabLe~ l","ismod":1,"kg_ver":"2012.2","map":"de_inferno","max_players":30,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.19p32","mod_cldll":1,"mod_size":184000000,"mod_type":0,"mod_urldl":"","mod_urlinfo":"www.counter-strike.net","mod_version":1,"mp_allowmonsters":"0","mp_autokick":"0","mp_autoteambalance":"1","mp_buytime":"1.5","mp_c4timer":"35","mp_chattime":"0","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"0","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"0","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"2.45","mp_slaylosers":"1","mp_startmoney":"1000","mp_timeleft":"0","mp_timelimit":"40","mp_tkpunish":"0","mp_winlimit":"0","num_bots":0,"num_players":7,"num_rules":94,"os":"l","password":0,"pausable":"0","players":[{"id":1,"name":"~Aktas,`+Ajm;?` ^^","score":12,"time":777.92645263672},{"id":2,"name":"Addicted","score":16,"time":2131.7644042969},{"id":3,"name":"hain_bedo","score":2,"time":722.48895263672},{"id":4,"name":"| f A T j H :}","score":3,"time":761.03582763672},{"id":5,"name":"` 0hmiSss !","score":10,"time":4015.8249511719},{"id":6,"name":"corumluu","score":10,"time":870.42840576172},{"id":7,"name":"~sadeceiz|e.","score":0,"time":3376.2585449219}],"secure":0,"statsme_version":"2.7.1","sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"10","sv_airmove":"1","sv_allowupload":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_clipmode":"0","sv_contact":"","sv_friction":"4","sv_friendlyfire":"0","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"25000","sv_maxspeed":"2000","sv_minrate":"3500","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":46}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs15/2_response.txt b/gameq/tests/Protocols/Providers/Cs15/2_response.txt deleted file mode 100644 index b5b7d674e31383bbfea0631f614e649998d62001..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1919 zcmZWq%Wfk@6s-ipB1@Cv3b(m5{ZuI%C3ltEQ3-&8+m&UNq9)$8o0FPF>frXbi2!FD|8L zjP2l`{qom7eeAz`w~x{fCwn{hm)CFZqt;+zKRH`O$9H#k*YIjLx}5S1@xDQ?9|3DJ4ZZ1#-G^HyU0F!v~;W+q*C7af>(^!RXXC{YZ=sD6;jKwXPw@0rx#SK z!ku=~1~k~73P=KXpBLPV9Q86OxE>QSvJ?w;&}K55$gx$ZkCr>^<>~2{>DRoFBVMw0 z+>85cItgGPYX`#?{3b=TRnnzS3gmpGNhjKjxPD})RheN;;4MAJfNPYJIC)lek+&iQ zO2;fkaqa^09p40yCi|z?QeN z=`f@Ka%H9$W2|PAW0D)^H=Gc4NJC0Kk(I<&`$gkPNK_In(AmTX2jr(!p*(@&z#hqF zf|i)yX(YZ$J}Cn>eeq2~QRx zMgSx%9KJ=4iz0C7TZ2vSk!~3YMTPaIF3H@SHly$Lk@c3+_8P!GvD{YGt6Pu`Gqa qX`>0-kKYTH98swArfNzZ22AG$KaSW@A|^mrqp|;^8?-1Q814i_34#bJN2ZD@m6Q%M8%!c)m27rH2#JtlH&O*f4LvixGtKr)4?VqK zR1Tc!sug?03prtQW=6NJ#5ifg8m69a2R=m&1)EYWuiCpm(Q$ZF&KlB^^ z+KrA*xggd?Xz5PRx_1NWM_k%GTgtPwU)Mp z7}Q*r-b0!sQkEoy;P>n2HqYIA(AhLvgzR2!z3-|kn9gPT%yM5n{kMI-n=`MtnR@qv z{>rp~Gws%eCr>t-8%=NHZgZ#m^r^SHy6Wvbe9*qT-L+A-!AIZR<$B z)cUB|>3X%MJ*iToNJxI6_3_E<_LH3F)Z5k+f1J|o-k$LxQ{*6eo;;o@x0rEyXHEbxr2= znwA(FmyTIdLQ{+rnW$*UlmVkHnX2+ z0o*`f*)y83($Xax>w;Eh_qC$jF-?aB>!HNpmPw@;$F!{HaaaAoL@vgKOviI>=&$qTFo1BYWKJ@06JC(X<}Sekd^n z3N&F!oJWjV$w8S;CsS~xaPDXUm^q(jr-6&qQC8R1XX68oN@KQcLe>Kt)yR(eVJVZd zv)27;Q1aSf9oZW2@E+b#jA)uOShhr{S9DOD>xaKDj#jFHtyL^VI}?2bHiEaixx2e3 z1{pTfY_?hSSZV~ShY=npE|eu62u*UWs~b1oe1c&;-|?F!YNqIr0|x83DIhWASjeP5 z^=>9+O0hB!D3zt;YkWo-ht*2WZFJ@pt?Q9_!mL513?1sT|j3x%QN2?K=9)NJEN$n)){TJF5!kaU6PsKW}5z8xKHOd4~1 Pgl2CID6+>9$JzWJH&iCL diff --git a/gameq/tests/Protocols/Providers/Cs16/1_result.json b/gameq/tests/Protocols/Providers/Cs16/1_result.json deleted file mode 100644 index 575587c..0000000 --- a/gameq/tests/Protocols/Providers/Cs16/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"63.251.20.37:27015":{"SgKALLPlugin":"1.0","Team_Semiclip_version":"2.0.0","WalkGuard":"1.3.2","_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","admanager_version":"0.5","aesp_version":"1.3","allow_spectators":"1.0","amx_client_languages":"1","amx_language":"en","amx_nextmap":"de_train","amx_timeleft":"00:00","amxbans_version":"6.0.3","amxmodx_version":"1.8.2","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","edgefriction":"2","game_descr":"|SgK| Clan","game_dir":"cstrike","game_id":10,"gq_address":"63.251.20.37","gq_joinlink":"steam:\/\/connect\/63.251.20.37:27015\/","gq_name":"Counter-Strike 1.6","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cs16","hostage_debug":"0","hostage_stop":"0","hostname":"|SgK| CLASSIC 1000 FPS #1USA sgkclan.org ","humans_join_team":"any","jtp10181":"gore","map":"de_inferno","map_spawns":"T(20) CT(20)","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21p37","mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":"1.","mp_c4timer":"30","mp_chattime":"10","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"5","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"2","mp_startmoney":"801","mp_timeleft":"0","mp_timelimit":"0","mp_tkpunish":"1","mp_windifference":"1","mp_winlimit":"0","num_bots":2,"num_players":23,"num_rules":98,"os":"l","password":0,"pausable":"0","players":[{"id":1,"name":"|SgK| Vicking **PT**","score":10,"time":917.609375},{"id":2,"name":"|SGK| WarGod Shield","score":2,"time":102516.2421875},{"id":3,"name":"Player","score":0,"time":178.5703125},{"id":4,"name":"E.U.A","score":1,"time":653.5390625},{"id":5,"name":"DIMON","score":2,"time":219.0625},{"id":6,"name":"www.sgkclan.org","score":0,"time":102516.2421875},{"id":7,"name":"BUBU","score":0,"time":32591.5859375},{"id":8,"name":"NiGGaZ","score":9,"time":636.984375},{"id":9,"name":"iliesergyoSB","score":3,"time":224.8984375},{"id":10,"name":"Illusion Raccoon","score":49,"time":2226.609375},{"id":11,"name":"JOSE","score":0,"time":147.296875},{"id":12,"name":"|SgK| method`","score":0,"time":1882.921875},{"id":13,"name":"The m4d J0k3r","score":0,"time":196.0234375},{"id":14,"name":"[[BABA BHAKT]] 666 KRODHIT","score":0,"time":36.9921875},{"id":15,"name":"|SgK| Sparki","score":11,"time":908.84375},{"id":16,"name":"name","score":3,"time":636.59375},{"id":17,"name":"Spades","score":9,"time":814.671875},{"id":18,"name":"|SgK| Pacman #DeT","score":13,"time":755.25},{"id":19,"name":"Neko Tamo :)","score":1,"time":138.40625},{"id":20,"name":"AST staford","score":0,"time":142.40625},{"id":21,"name":"[[BABA BHAKT]]Uchiha Itachi","score":0,"time":21.53125},{"id":22,"name":"bob'sbitch","score":0,"time":17204.75},{"id":23,"name":"Ze Alves","score":4,"time":1849.59375}],"port":27015,"protocol":48,"qs_version":"2.0","redirect_version":"1","secure":1,"specbot":"1","steam_id":90071992547409920,"steamappid":10,"sv_accelerate":"5","sv_aim":"1","sv_airaccelerate":"10","sv_allowupload":"1","sv_alltalk":"1","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_contact":"http\/\/www.sgkclan.org","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"0","sv_maxspeed":"9999","sv_minrate":"100000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.1.2.7\/Stdio"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs16/2_response.txt b/gameq/tests/Protocols/Providers/Cs16/2_response.txt deleted file mode 100644 index 719a142fd7ab420ff86902446d57932d0b4f19e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3078 zcmeHJ%a0UA7%yI;tDvGn;=y#H31Bk4)5AUh4Z1tCvV`4P0*hcao2I6_rl*+duC}^* z9)tro;!SU!JZR!kV>Dij35kCIH_!edhV}PV&kQVgPdb}T_xGsp{r$T3_V)JDpt0=N z@fTcdEZ2iYc3os5;j!>mOgi@Nv~|07!wSB6$J;SH;i=3LUz=pt+X?FR`X|?J?6O#d zaaq^~iwbLGU$EhD=s&B>PI>e3kR4#m{o{e>0XBF4{v1NsYn?i9T?~a{?~tVVaP8nK zH&!d67~A-M_0Y!p$LA{Q>&vT$b7_Ss`tmM2NX*U`ts`sA7CVCXM_(Rqy>LzOu`rdZ zZ->pJEz#tDb^NclS6_@*x@FY&roYqdFv&jnwe?bB*4DC0ar5uyTv6umqg5=0X)Lm% zB>Cgd=F1(_p`$ZfzE|nq{$=HrrV=t1#@o5v(}msjM&XvXv(EE;yjv;Ne_lCuCOA8Z z?If6wK6>0bzI}6ZrMbRU1-tco^HrYljLkv(VE3EWYu5vB%v0Xu-o>-*IB}o+)_Prs zTly**5#Dc!YevL8*5-bA=2OwuoA0tiG_uPuh&rbs)euSaHE zKeSG5Uuk;VD^35#_Emr3+@gO5zYi~+#qUzzb%p(Ocx~G3EA@Y6!sakzjAktG1Ha)f z&)=}I)alI_!puq~4S=rGV@m6O$g@NV7VKxn zvamdh1Z&i1f>aa*PbfBSc!bD8XypJmXE=X4%tevU7=eF|ai#PyEOHT9jtUnnK;}Fh zg^{8lLxs#sn1R5tr!*58(H))@GkZ(;B*9`jN_9M%aRdLn->Ai6P`kduI>yBVFAKH4 zREkAf=V(!ke0nLjQ4fA%5pmTu;`35u(U>jOnTQk7H8Qf4M}zg$C=y|=%0y<*_*wFU zCGX7oMsRkbG0i;iA-XVO4n-$NLab+PesO+2xX|z$=y#)W0Xoa`s39s#9|UTn8zjUx zr3>rA?Ug8Q5#H7Cj}L9ics6FLj3i%2LGjGE3zdqQ@==IPj1)y!hzR*T#|aaqJDA`7 zf}zY}JtU^E90h$Q&j#?a2B&Ery7r|yE9mQrIEjT#>C33UpK{};OUr7oSSeB9@arbn zF+1gWvKtG|QnWy%VH2vytrKGlU?GB244mtbJKeex>{Qt z$Z3=uX(BWl4)|0~j2=gkkX&^HHFD5! zMBGXDa*=Um$CW0P2v>!u+Qg+L(o-^(mda9K$cWYna^jLeq$0bLU|>Q_mUfa)%JYFn z8>sWxwaOw|ZFHH%lisA#7;R$Q4lsbuCP4#cBd#c?`!qkypt0z#7_(rBmKs5j^l3#L zMNwDhZ9gwFS@bH3Mo4zM!k|f$sKIhcLLuj6K`@HfVi58uf>}df{3-UH;8p-)NGPcv z?ggOc6iEi0aZG}cGFO_%C=F>TWx1jO1kpkI&O6=#*tA@ZU*U^|Js858kQnzfU?!vY z*|skbl^8yd=-m0rBl^-&I_ghMQIRPgNGmxQKr|7v3lmyqP9XqLJ5M<;iXj?Ng@PN_ z2-{f&Z-lFQC7BSeEfvQNu)K$u&r@K82bHU3SE;HD@bAzT3Ii=8fw`kXyW$KH>HZ>; d9mk#J9I%0nW($A5&TgTcmrIU-f!Th8{R6k>zw7`2 diff --git a/gameq/tests/Protocols/Providers/Cs16/2_result.json b/gameq/tests/Protocols/Providers/Cs16/2_result.json deleted file mode 100644 index 86d413b..0000000 --- a/gameq/tests/Protocols/Providers/Cs16/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.74.97.97:27015":{"WalkGuard":"1.3.2","_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","address":"127.0.0.1:27015","admanager_version":"0.5","aesp_version":"1.3","allow_spectators":"1.0","amx_client_languages":"1","amx_language":"en","amxbans_version":"6.0.3","amxmodx_version":"1.8.2-dev-RA","brr_ver":"1.4-kill","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"www.ragaming.org","game_dir":"cstrike","game_id":10,"gq_address":"64.74.97.97","gq_joinlink":"steam:\/\/connect\/64.74.97.97:27015\/","gq_name":"Counter-Strike 1.6","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cs16","hlxce_plugin_version":"1.6.16 (HL1)","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/192.210.229.197\/stats","hostage_debug":"0","hostage_stop":"0","hostname":"Renegade Army `NoN-SteaM` [ragaming.org] [1000FPS]","humans_join_team":"any","ismod":1,"luciaHallucination":"1.0","map":"de_dust2","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21.1-am","mod_cldll":0,"mod_size":0,"mod_type":1,"mod_urldl":"","mod_urlinfo":"","mod_version":1,"mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":"0.40","mp_c4timer":"40","mp_chattime":"10","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"2","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"0","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"2","mp_startmoney":"16000","mp_timeleft":"0","mp_timelimit":"0","mp_tkpunish":"0","mp_windifference":"1","mp_winlimit":"0","num_bots":0,"num_players":23,"num_rules":95,"os":"w","password":0,"pausable":"0","players":[{"id":1,"name":"Rewel","score":30,"time":4328.375},{"id":2,"name":"Bartol","score":0,"time":83.1484375},{"id":3,"name":"LH@3","score":0,"time":49.8984375},{"id":4,"name":"piterskij","score":2,"time":1099.0625},{"id":5,"name":"ECD","score":5,"time":570.26171875},{"id":6,"name":"Player","score":1,"time":247.6328125},{"id":7,"name":"DeCa.","score":0,"time":38.71875},{"id":8,"name":"dAfuck '","score":4,"time":1457.84375},{"id":9,"name":"grEEn","score":0,"time":504.6015625},{"id":10,"name":"supersoldier25","score":7,"time":429.5234375},{"id":11,"name":"bagabontu$","score":0,"time":22.54296875},{"id":12,"name":"Cleider [Ghost] x_O [Happy]","score":0,"time":22.3984375},{"id":13,"name":"(1)Player","score":22,"time":1657.9921875},{"id":14,"name":"TUMACHO","score":1,"time":378.6171875},{"id":15,"name":"anan","score":10,"time":1266.921875},{"id":16,"name":"R1 yamaha :)","score":14,"time":1503.953125},{"id":17,"name":"o_OoKing_|DePredador|_(VeNoM#","score":3,"time":194.37109375},{"id":18,"name":"Lisanna","score":0,"time":160.1640625},{"id":19,"name":"-prodigy.","score":1,"time":351.27734375},{"id":20,"name":"YUNGWUN","score":2,"time":141.5},{"id":21,"name":"iCoke","score":2,"time":703.234375},{"id":22,"name":"Na vi ' N2HuX - New Member","score":32,"time":1394.125},{"id":23,"name":"TIC TAC.STK.435.((((<>))))>k","score":5,"time":2123.0625}],"port":27015,"protocol":48,"secure":1,"steam_id":10,"steamappid":10,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"100","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1.0","sv_contact":"","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"80000","sv_maxspeed":"900","sv_minrate":"12000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.1.2.7\/Stdio","vtc_version":"80"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cs16/3_response.txt b/gameq/tests/Protocols/Providers/Cs16/3_response.txt deleted file mode 100644 index aefb125dd9c1bf31a1d255576f36aa16847f07b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3208 zcmeHJ&2Jk;6n~{ELIDm`2qBPQ5tRy|alCe$q@0@Ariz-TRUAr1Da&|wygT*m&N4IW z#8o8_7o^^(gb;!QH~s=RqSAi>4oF;j=fDjiArXEvYddYPa3oP;zmIwE_daJ14h|0T zu(jG~;x~M=wb~5N(0Uwm$u+Y)>GXqJLANrt6|_z-uY$N-4e)xQ8?nmi#b7y+bcD$N;RByXXyMka1vo$GzCitqC2H@oWD~BhIyup) zuQur7=I&0fCW9mEbZvLz%Js$dc*J$iij&tiuCu`;SX^3K40cb(wch@h8)U4AM}bwr zL{&OStHRKWPWsy?U1EtAtf+OreW^=3OcV((Jg{%>{MDne81q0F3G`Ew*%KYQz_eyM zc$LM5p2z7wZ|84OQfbvuQso1|=qYFO*hgL3J%1%wUJkl9gAJ`}N0+|nP;WTov4!zl z{Zg|@5CpGn3Bz8eW6-(#-sfFPD`-TYd%e54zD>_M zgwH(LrFSxMb3_Y{r9qa1f9op<~_AhL1ZS{6M@9v#x}#mb!P3e+5C^YbpicKu3y7O*l0CYpI+|UL@4^~ zQ{gcK=KS;j7XH75|6L3JjScwSJ)+0lD(t;ak*%!K(EwW|8VkP129if{#^X^WFg<$A zBsCjnW_k%9RB0snn1elI@_n~^d1OV-A5_j@VQ!_ChFJTvV^XP6#EMjM3Lj=B!dOV;ZVea7Zwn(ou+}!jsc*^tNfuu6h5k@dC8eI zG>_M%#GR?(giYXK32p-*(b1S|BUIr-X55r>M%ZW*lTz(Prov`F9r}D3;jOAh5az)bE_&# zOR!ffIn40t`_MB7)x>u=rU5GPX-8;k*A&9?!j_l8BYMWC(jOhNgj+R`Z02_;naQL` zGwT8fibXa50o7Sx41(SAC>$&Wd9RB<$t*p4SQslzAj7$Mal_DZ0+!kOkr&F|Uw9yku?ZE5$;KGKlELu-nRF+RD zTybLw6i$Aa5KlSS6t-&dsH_TMvf83+AAv`bMwO<(!SZoJp=6bDs}Nt!IAZhnDK>+n zg{y)8f?YIwyG~_p?yFKNmLMHYM@qbG-1A|!dyl*3gJggNc;EPrmFpId=hr*J!n6bC zgsQOEd1O?Eluy_Y1}En-g%u&BfAT_UKAET8kyNv>Kt-L|Vwm&}+wl&97&wc5w5*3dNfm8d0C!WXON_?{Lw5yzS{?N&qW zYt<*R&JzIm9SVi95-~?Jy43s7_W<+39OI^dn&-{~4rv#i8TC2d&{7=ktu`K1O?q3R S6JX`CtWr@>*f`S&2lNm1m-2xC diff --git a/gameq/tests/Protocols/Providers/Cs16/3_result.json b/gameq/tests/Protocols/Providers/Cs16/3_result.json deleted file mode 100644 index 024be1e..0000000 --- a/gameq/tests/Protocols/Providers/Cs16/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.94.101.205:27015":{"Team_Semiclip_version":"3.1.0","UltimatePlugin":"1.5.1b","_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","address":"127.0.0.1:27015","admanager_version":"0.5","aesp_version":"1.3","allow_spectators":"1","amx_client_languages":"1","amx_language":"en","amx_nextmap":"de_dust2","amx_timeleft":"98:28","amxbans_version":"6.0.3","amxmodx_version":"1.8.3-dev+19c8b00","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","dp_version":"0.9.391","edgefriction":"2","game_descr":"Acs-Gaming.com","game_dir":"cstrike","game_id":10,"gq_address":"64.94.101.205","gq_joinlink":"steam:\/\/connect\/64.94.101.205:27015\/","gq_name":"Counter-Strike 1.6","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cs16","hostage_debug":"0","hostage_stop":"0","hostname":"AcceleratedCS | Dust2 24\/7 | Pub | Los Angeles","humans_join_team":"any","ichat_version":"2.3.3","ismod":1,"map":"de_dust2","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21p37","mod_cldll":0,"mod_size":0,"mod_type":1,"mod_urldl":"","mod_urlinfo":"","mod_version":1,"mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":".5","mp_c4timer":"35","mp_chattime":"2","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"0","mp_friendlyfire":"0","mp_ghostfrequency":"0","mp_hostagepenalty":"0","mp_kickpercent":"0.66","mp_limitteams":"1","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.6","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"1.7","mp_startmoney":"16000","mp_timeleft":"0","mp_timelimit":"120","mp_tkpunish":"0","mp_windifference":"1","mp_winlimit":"0","num_bots":0,"num_players":26,"num_rules":94,"os":"l","password":0,"pausable":"0","players":[{"id":0,"name":"ShadowPlayerX","score":0,"time":77.5859375},{"id":0,"name":"MITRE","score":0,"time":8.0703125},{"id":0,"name":"[TBV]*Ackerman'[B]aby *--* T'c","score":0,"time":76.734375},{"id":0,"name":"stick to your guns","score":27,"time":1047.34375},{"id":0,"name":"adrian","score":0,"time":634.609375},{"id":0,"name":"Rainden","score":1,"time":8050.328125},{"id":0,"name":"vive islamic","score":0,"time":136.40625},{"id":0,"name":"Karrar #acs","score":24,"time":15202.7421875},{"id":0,"name":"duroColombia","score":12,"time":1020.078125},{"id":0,"name":"TGV \/\/ Dz Bro","score":0,"time":302.6171875},{"id":0,"name":"Effective|Spray (Lisa)","score":5,"time":1194.8984375},{"id":0,"name":"guilhermehamada [BR]","score":1,"time":159.7578125},{"id":0,"name":"$Sammy$","score":2,"time":1702.8671875},{"id":0,"name":"jamesBondddddd007","score":5,"time":2349.234375},{"id":0,"name":"Ricardo","score":2,"time":2872.6796875},{"id":0,"name":"XENEIZE","score":0,"time":386.171875},{"id":0,"name":"CANADIAN","score":20,"time":556.265625},{"id":0,"name":"Whizk","score":10,"time":525.578125},{"id":0,"name":"digital*!","score":6,"time":508.6875},{"id":0,"name":"ISISKILLER","score":6,"time":3449.171875},{"id":0,"name":"@EMANOEL@[BR]","score":3,"time":493.6875},{"id":0,"name":"`NoobStar -ph-","score":0,"time":882.4453125},{"id":0,"name":"Enteng #acs","score":10,"time":659.84375},{"id":0,"name":"oussama","score":3,"time":2763.4296875},{"id":0,"name":"SteeL.l papa","score":3,"time":478.5390625},{"id":0,"name":"*chiva*","score":1,"time":223.7421875}],"port":27015,"protocol":48,"secure":1,"steam_id":10,"steamappid":10,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"5","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_contact":"sohailyaftaly@hotmail.com","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"0","sv_maxspeed":"320","sv_minrate":"100000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.1.2.7\r\/Stdio"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cscz/1_response.txt b/gameq/tests/Protocols/Providers/Cscz/1_response.txt deleted file mode 100644 index 5538ee6d321ba11e4a976c7c9cdc5c9d9d8bdf6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3043 zcmZuz%ZnVx8ULij#5RdVf{j5YNee@e2-D2$tfbu~2Ww}>D`QDnw41fDF-=W(b$5BX zyINJ%^H^(r)h)&Z3_0eMLkI*Ca`7<`2!z}MIVAsp$t{B(r6m#Dp5}9DtM2{UAlgq zk_BBEgnj%C>Cq5WJIKMf!1YDV7xZ|Ae$Pw3-4xm@kbrLfylG;Z}Vy#Ue8;8zoRpt9Vh zT06P|*6;rCY(npw@!{W7@wz3HBdP-q{Nt;fJn)|L)cw$MmL=GSOv%Frm(_Ul+d_ zQ>kW>o(FYw@XIm1EoLHkD2!8;rRTs+e!d#hZXs6EfFk%$tw?7-vSjkL#cz$v8>4^44k+cW?Wp_tpSE)``!g~F`|LNL@!mWpLx#x5x zx5AsHT;B3|Kihn1M2{7+MqH(|!TvjAFL>oIzuoRSTeQ!M{O#Zktm%H>x@~7I7drIJhRB~ zOi(N9ba9bqR9aj*Z*Z|BD;{j6Y5;%1t8J#y*M-zL9nD27ob1%& zTsVgz&}r)ZBy!qhozFz3(nL6sH>Idfm?}+G+!SurS@=+^DiSG-M0Gn*ZN#4MBsPku zR^E0c<`IwvqNn6xV#I>hJzX1_swH*rI#q>?k|}L#w`)8Vf?{BwG-y~W=CU*Nq|r`L zZ?MrxK_Ph;=bap=EusY7ggjfHUWj7Wy&mdvs@P|&y?P>r z%UeGKtmjx1sgX|_S;Z^5(`=itzhK;fxiSK(kN*oD`S-95+}+EJr$Ul3xb8J61`w1<`m<2 zZa4;;^>B^Kx^4JUR~FT^h>}@op&9T$qqxQ}FDi_XSD7{|9v<5CRJ_iFq4nE*-1i#` zhn|9I%!h{zfz(lo!E$<9h!Y2CA#7go)zaGL3kC;jZgH%Ms5aRl&_1 zyN2WF^!&z)3OScN1RWEfkbp`?zB|t;;}UhJR$A!*9}_3X3aw`mHaVwtk(pqR_!YDU z+&d@Tbn((b?uaac7LSNGjJA+`m+{92;_ctPd<+4qvMDbd0-BeM8(I5CJk6IO;WKSG He$xIAmZJN0 diff --git a/gameq/tests/Protocols/Providers/Cscz/1_result.json b/gameq/tests/Protocols/Providers/Cscz/1_result.json deleted file mode 100644 index a1a3e86..0000000 --- a/gameq/tests/Protocols/Providers/Cscz/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.91.123.5:27015":{"_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","afkslay_version":"3.0.0 Beta 1","allow_spectators":"1","amx_client_languages":"1","amx_czbotcontrol":"1.3.4","amx_language":"en","amx_nextmap":"cf_13street","amx_ptb_version":"1.8b3","amx_rollthedice":"v2.5 RC 4","amx_timeleft":"05:09","amxmodx_version":"1.8.1.3746","bot_allow_grenades":"1","bot_allow_machine_guns":"1","bot_allow_pistols":"1","bot_allow_rifles":"1","bot_allow_rogues":"1","bot_allow_shield":"0","bot_allow_shotguns":"1","bot_allow_snipers":"1","bot_allow_sub_machine_guns":"1","bot_auto_vacate":"1","bot_chatter":"off","bot_debug":"0","bot_defer_to_human":"0","bot_difficulty":"1","bot_join_after_player":"0","bot_join_team":"any","bot_nav_edit":"0","bot_nav_zdraw":"4","bot_prefix":"","bot_profile_db":"BotProfile.db","bot_quicksave":"0","bot_quota":"-18","bot_quota_match":"0","bot_show_danger":"0","bot_show_nav":"0","bot_stop":"0","bot_traceview":"0","bot_walk":"0","bot_zombie":"0","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"Condition Zero","game_dir":"czero","game_id":80,"gq_address":"74.91.123.5","gq_joinlink":"steam:\/\/connect\/74.91.123.5:27015\/","gq_name":"Counter-Strike: Condition Zero","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cscz","hostage_debug":"0","hostage_stop":"0","hostname":" Smokinguns Hideout","humans_join_team":"any","jtp10181":"gore","map":"de_prodigy_cz","map_spawns":"T(20) CT(20)","max_players":26,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.19p32","mp_allowmonsters":"0","mp_autokick":"0","mp_autoteambalance":"0","mp_buytime":"90","mp_c4timer":"45","mp_chattime":"3","mp_consistency":"1","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"3","mp_friendlyfire":"1","mp_ghostfrequency":"0","mp_hostagepenalty":"4","mp_kickpercent":"0.66","mp_limitteams":"0","mp_logdetail":"0","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.6","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"3","mp_startmoney":"1000","mp_timeleft":"0","mp_timelimit":"20","mp_tkpunish":"1","mp_windifference":"1","mp_winlimit":"0","num_bots":0,"num_players":26,"num_rules":125,"os":"w","password":0,"pausable":"0","players":[{"id":0,"name":"{S.G.H.}-{gT}-]V[rClam","score":4,"time":5997.1860351562},{"id":0,"name":"ThelO.Monk","score":3,"time":5746.7846679688},{"id":0,"name":"~SexyTexasBeauty~","score":9,"time":5156.01953125},{"id":0,"name":"Lightfoot","score":1,"time":4342.5859375},{"id":0,"name":"[rDz] MiAuUu-ChAn","score":3,"time":2064.5146484375},{"id":0,"name":"rines| Sergeant Polaris","score":13,"time":2059.7468261719},{"id":0,"name":"Goosey","score":2,"time":1591.9549560547},{"id":0,"name":"THE TREWS NEWS","score":15,"time":1457.8232421875},{"id":0,"name":"Freedomdonkey","score":1,"time":1371.0355224609},{"id":0,"name":"mike","score":8,"time":1226.7027587891},{"id":0,"name":"Kaka Martins","score":5,"time":998.22485351562},{"id":0,"name":"Player","score":0,"time":856.43701171875},{"id":0,"name":"Adr0ck - Voice Disabled","score":9,"time":816.47064208984},{"id":0,"name":"-Guido-(EVIL!!!)","score":4,"time":629.38745117188},{"id":0,"name":"Vermin","score":3,"time":607.37835693359},{"id":0,"name":"Ares{S.g.H}","score":1,"time":500.92126464844},{"id":0,"name":"Nity Grity - Canada","score":7,"time":468.04083251953},{"id":0,"name":"Z -","score":1,"time":412.90676879883},{"id":0,"name":"ChiKoo","score":3,"time":334.7424621582},{"id":0,"name":"Pinga BRA","score":1,"time":300.09506225586},{"id":0,"name":"Diego","score":2,"time":290.98104858398},{"id":0,"name":"Taldo","score":3,"time":208.45259094238},{"id":0,"name":"syfodyas","score":1,"time":143.76496887207},{"id":0,"name":".:MexStone:.(mex)","score":0,"time":142.22471618652},{"id":0,"name":"Rick Grimes TWD","score":0,"time":86.892738342285},{"id":0,"name":"{S.G.H}Nutt","score":0,"time":48.537117004395}],"port":27015,"protocol":48,"secure":1,"steam_id":90094472659721216,"steamappid":80,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"5","sv_airmove":"1","sv_allowupload":"1","sv_alltalk":"1","sv_bounce":"1","sv_cheats":"1","sv_clienttrace":"1","sv_clipmode":"0","sv_contact":"your@email.address","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"19999","sv_maxspeed":"320","sv_minrate":"30000","sv_password":"0","sv_proxies":"1","sv_region":"0","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.0.0.3","version_no_headshot_with_helmet":"1.2.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Cscz/2_response.txt b/gameq/tests/Protocols/Providers/Cscz/2_response.txt deleted file mode 100644 index 0df26e9a79a89c6c1d36988649e6d7094dc30bf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3026 zcmZuz&2Jn@6@N)~1se&pi}*Sa(Ge@*1l*nv+cA-%-SMCbO4BhV??wvdgkMNN04V9k%eVOTYewy86k>-%P*$ z{*_~@|E@oOejTBlM>pu{_Rmj4^>`fi@^2v=u5!9w*%}0Wn?Z2dIP{& z?+ zfB$AgKiCWobTP6sZBp;#=YM_&DH-*+dY8ToJCo>IL_f8{Sh@o7TW|fRPY<*UZXfGp zBAunL0R8RlfA{I2N+ye--SuXE_1QoBbRyh17yjOhw_o-t)x|_EY$@=c@i|=k^iO?q zG8q>t5t(ue7$Z9V{F6S7^*|3rBE8=B+P`)wyc?hBR)-K)a z*$4XGgA)DPY3&5P503oV>B%p9bZ%q>&R} zCoiI}g*No&@_1Kena|}Vl$l8X1(80-=~ZUb-WdsL%XkXPDqT<;1Qc1OXR$41;)K(v zV4FlfABe)P)V4iSf#y1$uh4e56LwfPPBJA67iXdvRbnI?6Dyg(1y(EM+~uOYFei-L zs+1Ux%4H^pj&`>0ZnbEjU0g>x0<}O@ORs~uNH8ff9#sWvVPz zGisRmAYZ8&J*qB2cC2KUUhrba+I_);Efm7P7>=z5@&5~{ayp)hL^#<5nT&;VpqU;H zebA{KRHMdcDu*ZwZj39Q?mFF64TmbJGLW!N^JiKWu^7TgTxMbcTeYIcofJ8VV&QEU zVj9a-xkiD-v($(gZTjQV$f253^R0&}!#W$#u6D=9OCcn#*t1F{6Dy{&G4!m`PBcdR zH&S=WxH(15W^oE;tRnLWye}1;E}KthFiKM;XN^1)*`)bA)A>NL$3%PeRQj=HKWz{S zb2&8fStW~PLE9~o=|~O@79O*_L%gJOi2_w4RBOrpPS_3B9vrl9Ezf6iP=dcScCNg; zu`!#?!un>I=p3_d9ZutAkCrkB#tHZ?+4y4Jb1_G~q*2nwRwjt`5)zLxJrLQYgPAH) zJ!4QhfuUQ4+zvbKb@VhZ>uJb!VbOYKA4A~R1kJf9#XL&7a z{K$0KKbHt2n_y>AE8N~@EK|9{B#PXEE-dR2k`gK-e+42BL>)hbTw2>~Iw)hQO*Pse zK)0pE*LUyNpfNZ65HyX-l`(kBM9ysU3D&c#c;CRF*R8V+cNhTkj6<{Kg1Q~7LqL4| zsz6@i9MGitcv4n{vOI=RWC<)={7g+<-d9M({nV5zlRP272tUCte7(t2@3x=pded>hm*AH=*R`94=KnZ&AqfhqO~dua6ho{BR$m4KI^oQs?v zN>8rWl<|7Hm6iImjUTAXYnj%Q7)zW3z6hpR1%8ioQ0B&SGaZOcAS*-`LyH;i4abR= p{D|>y2E^OCbNLzqRC$$OxP&@gGHzt)d9%uwOTu^Ra4-ff`X9K$?#}=K diff --git a/gameq/tests/Protocols/Providers/Cscz/2_result.json b/gameq/tests/Protocols/Providers/Cscz/2_result.json deleted file mode 100644 index e54d0e4..0000000 --- a/gameq/tests/Protocols/Providers/Cscz/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"70.42.74.140:27015":{"_tutor_bomb_viewable_check_interval":"0.5","_tutor_debug_level":"0","_tutor_examine_time":"0.5","_tutor_hint_interval_time":"10.0","_tutor_look_angle":"10","_tutor_look_distance":"200","_tutor_message_character_display_time_coefficient":"0.07","_tutor_message_minimum_display_time":"1","_tutor_message_repeats":"5","_tutor_view_distance":"1000","aesp_version":"1.3","allow_spectators":"1","amx_client_languages":"1","amx_language":"en","amx_nextmap":"de_dust2_cz","amx_super_menu":"5.0.2","amx_timeleft":"85:50","amxbans_version":"6.0.3","amxmodx_version":"1.8.2","bot_allow_grenades":"0","bot_allow_machine_guns":"1","bot_allow_pistols":"1","bot_allow_rifles":"1","bot_allow_rogues":"1","bot_allow_shield":"0","bot_allow_shotguns":"1","bot_allow_snipers":"0","bot_allow_sub_machine_guns":"1","bot_auto_vacate":"1","bot_chatter":"off","bot_debug":"0","bot_defer_to_human":"0","bot_difficulty":"1","bot_join_after_player":"0","bot_join_team":"any","bot_nav_edit":"0","bot_nav_zdraw":"4","bot_prefix":"","bot_profile_db":"BotProfile.db","bot_quicksave":"0","bot_quota":"4","bot_quota_match":"0","bot_show_danger":"0","bot_show_nav":"0","bot_stop":"0","bot_traceview":"0","bot_walk":"0","bot_zombie":"0","coop":"0","deathmatch":"1","decalfrequency":"60","dedicated":"d","edgefriction":"2","game_descr":"WWW.XXLGAMERS.NET","game_dir":"czero","game_id":80,"gameme_plugin_version":"2.3 (HL1)","gameme_webpage":"http:\/\/www.gameme.com","gq_address":"70.42.74.140","gq_joinlink":"steam:\/\/connect\/70.42.74.140:27015\/","gq_name":"Counter-Strike: Condition Zero","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"cscz","hostage_debug":"0","hostage_stop":"0","hostname":"24\/7 [*XXL BabyGirl's -Dust2-* UPGRADED] \/\/ xxlgamers.net","humans_join_team":"any","map":"de_dust2_cz","max_players":32,"max_queries_sec":"1","max_queries_sec_global":"1","max_queries_window":"1","metamod_version":"1.21-am","mp_allowmonsters":"0","mp_autokick":"0","mp_autokick_timeout":"-1","mp_autoteambalance":"1","mp_buytime":".45","mp_c4timer":"30","mp_chattime":"10","mp_consistency":"0","mp_fadetoblack":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcecamera":"0","mp_forcechasecam":"0","mp_fragsleft":"0","mp_freezetime":"1","mp_friendlyfire":"0","mp_ghostfrequency":"0.1","mp_hostagepenalty":"13","mp_kickpercent":"0.66","mp_limitteams":"2","mp_logdetail":"3","mp_logfile":"1","mp_logmessages":"1","mp_mapvoteratio":"0.66","mp_maxrounds":"0","mp_mirrordamage":"0","mp_playerid":"0","mp_roundtime":"1.8","mp_startmoney":"3250","mp_timeleft":"0","mp_timelimit":"100","mp_tkpunish":"0","mp_windifference":"1","mp_winlimit":"0","num_bots":4,"num_players":29,"num_rules":122,"os":"w","password":0,"pausable":"0","players":[{"id":0,"name":"Shinobi","score":28,"time":851.17907714844},{"id":0,"name":"Simply tAE","score":7,"time":848.87713623047},{"id":0,"name":"Fireman","score":4,"time":841.02307128906},{"id":0,"name":"InVisibLE","score":0,"time":840.46612548828},{"id":0,"name":"ConVict | I.TeD","score":14,"time":839.37811279297},{"id":0,"name":"BaitWithaNade","score":10,"time":835.39117431641},{"id":0,"name":"Fork","score":2,"time":825.21905517578},{"id":0,"name":"RANDYBEAR-(o.0)-","score":16,"time":767.03509521484},{"id":0,"name":"Matador_1269","score":4,"time":688.52069091797},{"id":0,"name":"s1ren","score":2,"time":672.27117919922},{"id":0,"name":"[MOCM]ABCD1234[MOCM]","score":3,"time":638.78369140625},{"id":0,"name":"Di$n3Yki!!@","score":3,"time":608.74005126953},{"id":0,"name":"Biu","score":7,"time":603.31378173828},{"id":0,"name":"+4 Longsword","score":4,"time":582.91400146484},{"id":0,"name":"CriXu$","score":8,"time":525.06903076172},{"id":0,"name":"`sars","score":1,"time":504.0710144043},{"id":0,"name":"Hot *Pockets","score":13,"time":482.33294677734},{"id":0,"name":"Lucky 13","score":4,"time":477.69186401367},{"id":0,"name":"Rathma","score":1,"time":396.13092041016},{"id":0,"name":"donkeyspanker","score":2,"time":367.66415405273},{"id":0,"name":"technicality","score":0,"time":337.97900390625},{"id":0,"name":"hoboface","score":2,"time":119.5785369873},{"id":0,"name":".: Matrix :. No sound","score":0,"time":42.440063476562},{"id":0,"name":"=AsHo=Hpman808 AFN","score":0,"time":17.540205001831},{"id":0,"name":"=IcB= Mongoose","score":0,"time":13.103922843933},{"id":0,"name":"Ian","score":0,"time":855.12139892578},{"id":0,"name":"Derek","score":3,"time":855.12139892578},{"id":0,"name":"Connor","score":5,"time":855.12139892578},{"id":0,"name":"Bill","score":1,"time":855.12145996094}],"port":27015,"protocol":48,"reconnect_features":"0.3.1","secure":1,"steam_id":90094492233148418,"steamappid":80,"sv_accelerate":"5","sv_aim":"0","sv_airaccelerate":"10","sv_allowupload":"1","sv_alltalk":"0","sv_bounce":"1","sv_cheats":"0","sv_clienttrace":"1","sv_contact":"","sv_friction":"4","sv_gravity":"800","sv_logblocks":"0","sv_maxrate":"100000","sv_maxspeed":"320","sv_minrate":"60000","sv_password":"0","sv_proxies":"1","sv_restart":"0","sv_restartround":"0","sv_stepsize":"18","sv_stopspeed":"75","sv_uploadmax":"0.5","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","version":"1.0.0.3"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Csgo/1_response.txt b/gameq/tests/Protocols/Providers/Csgo/1_response.txt deleted file mode 100644 index 583c4ace7cf583146c76ee8658ae6dfa154a2c86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 zcmX|9O=uHA82xHb_9B8mcxV}@C`b&6MumE?+1;eEP1Dj1wpdG-{bpvGp$yub$0h; zjthE;Gn0rq5i-t*H>HsZWsC@9`l5^`i!=bBarSzLtUXY>6@j?``*IzzDlg1s4bQXP`0R<%ogD9AnmH zg^7mB_@{SeAcw`^}%j-HAB8~=$a7eJR zu&lJ#H`jE~Z7f_$h!)xw88v6F>QLZ(1`YE%`6rgck95$u9eSei$Q5?rjt*H;!JaBt zheaJs!aiPp{S@_%)AkOi*TjrksJFn)|CVi8^E#YJptfs7hMxyzq$JFWo^ordsH=ML zvh$1%dCE!>2Pn^N9L@LRWTy^kk5{Rc<)Z4lSjiie3mV7(*CV)nzgvSWcHNP3(I#o- b`VeK660a)xx5u~BQJa0OD}SSNt%K=5v8($b diff --git a/gameq/tests/Protocols/Providers/Csgo/1_result.json b/gameq/tests/Protocols/Providers/Csgo/1_result.json deleted file mode 100644 index 03b0246..0000000 --- a/gameq/tests/Protocols/Providers/Csgo/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.91.120.159:27015":{"dedicated":"d","game_descr":"Counter-Strike: Global Offensive","game_dir":"csgo","game_id":730,"gq_address":"74.91.120.159","gq_joinlink":"steam:\/\/connect\/74.91.120.159:27015\/","gq_name":"Counter-Strike: Global Offensive","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"csgo","hostname":"[HorizonServers.net]Beginner Surf [Tier 1]|HSTimer|Drops|FastDL","keywords":"100,102.4,1024,autohop,bhop,bunnyhop,horizon,surf,tick,secure","map":"surf_lux","max_players":38,"num_bots":0,"num_players":30,"os":"l","password":0,"players":[{"id":0,"name":"kyle","score":0,"time":8814.724609375},{"id":0,"name":"FKGSparrow","score":0,"time":4443.150390625},{"id":0,"name":"Ajdin","score":0,"time":3087.6025390625},{"id":0,"name":"Dunni","score":0,"time":2420.4699707031},{"id":0,"name":"xXtHeDaRkDjlnNXx","score":0,"time":2291.7160644531},{"id":0,"name":"Har\u014dkiti","score":0,"time":2071.0874023438},{"id":0,"name":"Luckstaaa nosound","score":0,"time":1918.3195800781},{"id":0,"name":"Shadow \u30c4","score":0,"time":1891.8033447266},{"id":0,"name":"AL CAPWN \u2660","score":0,"time":1598.9741210938},{"id":0,"name":"minimalis","score":0,"time":1353.3310546875},{"id":0,"name":"edisk\u00e6w","score":0,"time":1328.6643066406},{"id":0,"name":"Peggle_","score":0,"time":1212.4361572266},{"id":0,"name":"niekS","score":0,"time":875.42858886719},{"id":0,"name":"Royal_","score":0,"time":630.86981201172},{"id":0,"name":"Refrac","score":0,"time":483.95172119141},{"id":0,"name":"Papa John's","score":0,"time":439.27172851562},{"id":0,"name":"Dr. Jerkey\u2122","score":0,"time":437.80139160156},{"id":0,"name":"CharlieeBrown","score":0,"time":424.6520690918},{"id":0,"name":"Noob Move\u2122","score":0,"time":346.60507202148},{"id":0,"name":"BohkitBoi","score":0,"time":312.19866943359},{"id":0,"name":"Fegat","score":0,"time":266.00360107422},{"id":0,"name":"Sen\u03c0\u00b3 #Wiggle #Sanic #NoSound","score":0,"time":262.78100585938},{"id":0,"name":"50 Shades Of Essence","score":0,"time":212.36706542969},{"id":0,"name":"","score":0,"time":191.01463317871},{"id":0,"name":"Lindsay Lohan","score":0,"time":131.2145690918},{"id":0,"name":"AtomicFormula","score":0,"time":55.101043701172},{"id":0,"name":"syava","score":0,"time":39.412082672119},{"id":0,"name":"FallOfTheAnimalKingdom","score":0,"time":19.46138381958},{"id":0,"name":"","score":0,"time":16.87455368042},{"id":0,"name":"","score":0,"time":10.312337875366}],"port":27015,"protocol":17,"secure":1,"steam_id":90094336077840387,"steamappid":730,"version":"1.34.7.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Csgo/2_response.txt b/gameq/tests/Protocols/Providers/Csgo/2_response.txt deleted file mode 100644 index 3ca2603ba685376f64a40ae6a3bc9e8ca1986724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 zcmZ9JPiPZC6vkgFLM?g_TGZ0RKnp5PmZlY~MXJec8fx3Lnn0m#sFU5<&A7WWVRq9{ zC}P2XH$6!TQqY5V5%D6uDPBE_7Y`oVf_hf)AQGpO;=#Ghe!utTeeb<(x7+Qhw^Hxdj?A6Pzg=IB`QPeXOVmuwsr>uD;?rZ3-L* zJPh&v065`#ARIHNq4rw?b9&a-d-O)y_5kFY+%aq~Rm?+)hpT!a>5M`B*RmQ(DMRY7 z8M3)`IS+Bj_D|iAQyNpc)<@ oHu7w1h`@|woh6oU|IBqB&$d40AZ}(7r)I#{x0?r%VW{T*0`TDJ9RL6T diff --git a/gameq/tests/Protocols/Providers/Csgo/2_result.json b/gameq/tests/Protocols/Providers/Csgo/2_result.json deleted file mode 100644 index e83e303..0000000 --- a/gameq/tests/Protocols/Providers/Csgo/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.91.117.68:27015":{"dedicated":"d","game_descr":"Counter-Strike: Global Offensive","game_dir":"csgo","game_id":730,"gq_address":"74.91.117.68","gq_joinlink":"steam:\/\/connect\/74.91.117.68:27015\/","gq_name":"Counter-Strike: Global Offensive","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"csgo","hostname":"AG:\\\\ NewbSurf #2 [Tier 1-3] AlliedGamers.net","keywords":"AG,AlliedGamers.net,OpiumGaming.com,ag,allied,alliedgamers,bhop,chicago,fastdl,og,rank,record,respawn,skill,surf,timer,secure","map":"surf_halloween_tf","max_players":32,"num_bots":0,"num_players":28,"os":"l","password":0,"players":[{"id":0,"name":"Ewic","score":0,"time":3296.1181640625},{"id":0,"name":"Silver -1","score":0,"time":3093.0688476562},{"id":0,"name":"Sooolagy","score":0,"time":3065.9123535156},{"id":0,"name":"sleeeeep","score":0,"time":2700.6936035156},{"id":0,"name":"CRoShost","score":0,"time":2008.3811035156},{"id":0,"name":"PC.","score":0,"time":1557.7088623047},{"id":0,"name":"bama","score":0,"time":1089.2349853516},{"id":0,"name":"Moki #CoCo #BakingSoda","score":0,"time":1088.8127441406},{"id":0,"name":"\u261c\u2606\u261e Zooopey \u261c\u2606\u261e","score":0,"time":897.54736328125},{"id":0,"name":"_Dak-","score":0,"time":863.79699707031},{"id":0,"name":"money trees","score":0,"time":685.68731689453},{"id":0,"name":"Mark","score":0,"time":659.29766845703},{"id":0,"name":"Zorgan89 ","score":0,"time":549.10949707031},{"id":0,"name":"[Nji] LaFF","score":0,"time":467.3591003418},{"id":0,"name":"JimmmaBoiii","score":0,"time":465.73498535156},{"id":0,"name":"\u4e38\u3066\u3044","score":0,"time":465.50039672852},{"id":0,"name":"skorpaN","score":0,"time":456.98510742188},{"id":0,"name":"WISEic","score":0,"time":324.48452758789},{"id":0,"name":"Edywang","score":0,"time":322.92251586914},{"id":0,"name":"Kein Smurf","score":0,"time":300.43759155273},{"id":0,"name":"JPG","score":0,"time":287.12509155273},{"id":0,"name":"","score":0,"time":232.17199707031},{"id":0,"name":"[udKc]connor","score":0,"time":174.10972595215},{"id":0,"name":"rufi0","score":0,"time":164.59437561035},{"id":0,"name":"Loea","score":0,"time":122.25064086914},{"id":0,"name":"","score":0,"time":106.79746246338},{"id":0,"name":"sw1tch","score":0,"time":76.874809265137},{"id":0,"name":"","score":0,"time":56.500183105469}],"port":27015,"protocol":17,"secure":1,"steam_id":90094343915677697,"steamappid":730,"version":"1.34.7.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Css/1_response.txt b/gameq/tests/Protocols/Providers/Css/1_response.txt deleted file mode 100644 index 4f84a2e79533943f4058a8e13e30a3a87cf49b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3316 zcmcguOKc=Z8Loxh1SJv*uLB~HI){*57|+i5v1`l)uX~(**%*7{eT1l~ss5+CG}TqT zRn^m;QIH%U0U;#BfskAxkwX*^QWOD)4TwE)OO^-_lPCriwm?XicTj(o*!e6ujUT(rCFTl;dm&npLn0#cN=(?AWRNkMl?LC2s?iwa?>7`6r&E)^|f($>VM+A0+OEE+0ul(E#BR=<*R zoU5|rGHc~xhXMZgqMiL8t&A2>xNO4bzNenL538^jpCBWU8F=pfpL*jl^2DVaq7}`{ zQh<3fx^!-BZTTws2rB&hqy1H~%;-iXm{KY_ODDnZ(KkN6O1662RDkBnyP6ko_sB$z zxKzZ&*?I71J#uk5e7(klM}N{IC9T92PyVR?N{>9Q*Q+ypm2c6j)v^xGpFY;_5tq|C zXV|T=w9)a(6zqgIJNXydBVt^1Bu#_t+zxB)CzZxygdCAQ?Z^q;T?E__bWjyPVuiT7DLD?`$X_}5bZ+G_h~rS3 zArGFv`ZRLD=2Un(dBDbGg=*T0Huw&QM@@8@4}g3arN8~tW=!HrR5ou#YwO3$FLWYv zomOdR@rm!9#w1_-dCVsh+*fP`l)kUGzV%Q{cCJykeC~69hV&MrhO$t(PdxX@m}DA2 z7J&N-6W@;8o5;PKtB1YOkH7Zk6%uQj;c2)K6VLqPA6{G`DU!HQ%@Mzz?yitcp5+#> zjnO*od(HTKYlUo8C1_{e=>F=Rznvi?(~iR4hGh0`zI4WI-G6Z#-hB5M`4G8%)NMu& zNMG6HdZjES9m159z-%%?DBwzxZhN-vxT-{93e@HWwJaxHBp4L~4c9A>Y)rZx5_UW( zMU`=R;9m9LY=)64oFTu2Xv8Vy@jK1z3uZbHMAi zyWMtYCWX;9Dar&1(=g-LCE@$TL8kFlA<{d3bZYh1f085osQ4P1s2>` zl4lxk!Y>+z)v}I({+-ZWaKUfLv69UwB;oLWaNL0cIqQ#Q@fMYMcS##eYoMi)7{76a zXW1{EgdHnj1c*2~S?0R0sNLpJ#~2!<`;Xhy`5@UUZV@^CUfH#?;K#|;TPNoM$`AB* zw_wWEzF^;vZ=6oHA?HlMp)c%{=}+y|JZ=^-i1-J*PJ6MvfIDc41o2@+wW-Py=fWYx zfs#8LD!3{Xv~d<=W_>~JC)G8@b1X%qbXi7CPem+qr36sRDhGu&(EEnBW9FP#&GI1 z4kcOeG}lus#56UC9r*g zw3Jzbg~8|Fpn3i|ldu_mh3g$u8^+Y@EAXeG2kj6xn5!&;2vV7*BaX1Jh+BgsE<47? zm&3vVT^Y@awA6}Whb?DAESWcziV0p$)xeh}a2qGirF8hSf6kH`Q!AZ@%<#SC5jId- z354RzZ#&vKGPs!yxwxXdH=5&xh@rlY4o1Fbh`6-K5SmKjQt<%H@tN3N3?$BsKkaFs zI>MwO|NloYCN@&|nrxuX4^53@_Wtqm+=Kpgi5(;qQIop1;oG5`Po diff --git a/gameq/tests/Protocols/Providers/Css/1_result.json b/gameq/tests/Protocols/Providers/Css/1_result.json deleted file mode 100644 index 6ef4f5c..0000000 --- a/gameq/tests/Protocols/Providers/Css/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"167.114.54.252:27015":{"protocol":17,"hostname":"Zombie Mod :: Unlimited Ammo :: PlagueFest.com - FastDL","map":"zm_unpanicv2_pF","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":41,"max_players":64,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":85568392920039656, "keywords":"increased_maxplayers,alltalk,fastdl,ssd,zombie,mod,zm,zombie mod,stats,bunnyhopping,hlxce,hlstatsx,hlstats,gameme","game_id":240,"players":[{"id":0,"name":"venge","score":0,"time":104490.0859375},{"id":0,"name":"[The Cripples] TIMMAY","score":8,"time":14467.744140625},{"id":0,"name":"AcaPulcooo Haze","score":0,"time":9395.0380859375},{"id":0,"name":"SEValerio","score":0,"time":6925.525390625},{"id":0,"name":"zovino","score":-1,"time":5507.55859375},{"id":0,"name":"LALALALA","score":0,"time":5408.513671875},{"id":0,"name":"paulX","score":0,"time":5388.3237304688},{"id":0,"name":"UrNuBiFiSaYuAre","score":0,"time":3616.3439941406},{"id":0,"name":"The Nice Mynt (usmc)","score":0,"time":3613.8239746094},{"id":0,"name":"lym0nade","score":0,"time":3496.9741210938},{"id":0,"name":"aNIKETOS","score":-1,"time":3473.8588867188},{"id":0,"name":"Mamka","score":0,"time":3465.5639648438},{"id":0,"name":"wowisgood6","score":0,"time":2899.5239257812},{"id":0,"name":"(nF) CooL JeWW D:","score":0,"time":2699.6489257812},{"id":0,"name":"HotRod","score":6,"time":2671.1340332031},{"id":0,"name":"[pF]AgoraphobicNosebleed","score":0,"time":2585.0639648438},{"id":0,"name":"Banana","score":6,"time":2461.8991699219},{"id":0,"name":"-Kazous-","score":0,"time":1729.7508544922},{"id":0,"name":"\u043c\u0e40\u03c2\u043a\u03b5\u04af :3","score":0,"time":1647.0858154297},{"id":0,"name":"Kabeachus","score":0,"time":1530.5357666016},{"id":0,"name":"mack daddy","score":0,"time":1348.015625},{"id":0,"name":"Kittykupkakes","score":5,"time":1226.5008544922},{"id":0,"name":"-MegaPwn-","score":0,"time":1224.8657226562},{"id":0,"name":"VRAG.\u03b9ll\u03b9l\u03b9.\u03b9l.","score":0,"time":1111.4058837891},{"id":0,"name":"\u2606\u10e6Tiaminka*\u2022.\u2605","score":0,"time":1093.3306884766},{"id":0,"name":"chungbung","score":8,"time":1072.5107421875},{"id":0,"name":"[pF] Conker","score":0,"time":1071.6707763672},{"id":0,"name":"Lazewski","score":0,"time":1034.9058837891},{"id":0,"name":"Lethal","score":0,"time":976.25579833984},{"id":0,"name":"Cara, Pixie's Wife","score":3,"time":843.35577392578},{"id":0,"name":"Duluth, MN(p90 sqaud)","score":0,"time":734.19000244141},{"id":0,"name":"\u27b3Dizzie Hotep","score":-1,"time":630.07507324219},{"id":0,"name":"xZaike","score":0,"time":629.61004638672},{"id":0,"name":"Scasacs","score":0,"time":594.34490966797},{"id":0,"name":"greenmeaniez","score":6,"time":593.294921875},{"id":0,"name":"Who!","score":0,"time":430.75491333008},{"id":0,"name":"Dragonkillz","score":0,"time":317.65490722656},{"id":0,"name":"dillinger","score":0,"time":256.78506469727},{"id":0,"name":"Righteous Nab","score":0,"time":172.29010009766},{"id":0,"name":"Superkiller","score":0,"time":114.43502044678},{"id":0,"name":"vs. zombies","score":0,"time":81.374992370605}],"num_rules":101,"bot_quota":"0","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"10","gameme_plugin_version":"4.3","gameme_webpage":"http:\/\/www.gameme.com","gs_zombiereloaded_version":"3.1","metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"0","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"4","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"0","mp_limitteams":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"5","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"16000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"25","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11","smac_version":"0.8.5.1","sm_convarsuppression_version":"1.0","sm_nextmap":"zm_westwood_final","sm_nt_verison":"2.0","sm_playerinformation_version":"1.1","sm_selfmute_version":"1.0","sm_stopsound_version":"1.0.2","sm_xenforo_admins":"2.0","sourcemod_version":"1.6.0-dev+4373","sv_accelerate":"5","sv_airaccelerate":"10","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"plaguefest.com","sv_enableboost":"0","sv_enablebunnyhopping":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"500","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"increased_maxplayers,alltalk,fastdl,ssd,zombie,mod,zm,zombie mod,stats,bunnyhopping,hlxce,hlstatsx,hlstats,gameme","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","unvac_version":"0.0.5","webshortcutsredux_version":"1.1","gq_joinlink":"steam:\/\/connect\/167.114.54.252:27015\/","gq_online":true,"gq_address":"167.114.54.252","gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_transport":"udp","gq_name":"Counter-Strike: Source"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Css/2_response.txt b/gameq/tests/Protocols/Providers/Css/2_response.txt deleted file mode 100644 index 487b09fa63fda5048f620da1a38d8c40e2dc3809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3414 zcmc&%O^h5z6@F_)0xTpzvE+zE&^bgn&UkiycJ18-MUHpIyV$$y;1!$5A+)NyYo?2- zuIjC-p7E^qf)v3a8~`CfBqW3o5*PkCamXb|oN$sG7oy-Zf=IbVh~=y9nQ^c2ogHa3 z^}TwpUcH~M-kzMCoP7B+uWWC<8gy2cuLPTh#iLXgmIpn~T$(W#r@^IQoA2z{EtYX( zo3YM<<6wxzZl7Ws#tWS=9fqs}%o#D_w5bc_xVf}nE;oXGU6`2D2lUhhN+d0HI^7mN z^xJQXr3-KW@bbB6-rH0o##Rg8`d%7GOhTu5ou=|OiIV( zs8M=eeV6_>wznGFJJ{{)%ZncyoBc+zxL0FPsD{5s#v3V@(hlKU^>_C8_$)$m(tC<_ zMVyM@=1m%%A^QD$Ph2Ovh5NrOh2wM&+kf@!Py2Ly;}~Ju*Q(iUmL~pw=SO{d_nYth z!M^*gcYY)3Eugp4@AMHBbs%B~6Z_og)pa_vM6~kEai8A$al}n<|BauQ2EN;PsZYDb zU?3EI&ny4ppigC{cDNpKd%3ehH-O(i`f8tsh7Y@|{+l?kbLPc9HTQk|Zd2ivU+eT~ z2hr711-Gm)!qT6B-+Qy&r>QQOMA(z*Na+b(1y1*$=u?kH;jT8EJ_g|I&(8O0<7*1R zvchgGHyTmYXnd&~>@w44>f-Y9^VG(^e;iVuZaJqj5!2@Yy#479dxU~A3XygxZ(B## zf&cZnfA#3XzA(?C)Q*tRBseG}a!fI#fBgF2dh|kYC)f)v2HU&0_O>q4?&y~ialq+3kbD3BI1Dm#sXx}Q ztiMX10QS+^>zlNnvP4gInQC_lRYK4F^YKmkhPG+JZbbSB6`KMj`tzHg+N3?MRd7?7 zXiCUDJ$?SQYrfq6gL1ovNS~qiAM>TxH-rKY4-4%WwObVB;TYW@w4!#i)ofF&bxtjG zn@zHiD;7zfAO+QWFklO8zGtr9X||h}FC~0T4|)NL36Gf^7=BoA6;J(;Ze?poKolVjpgOZWYVm<%~J@CSiDebH#_*WDPytG ziN0GCtOHa63ORE%*araR#4?@K&~~fY@)tXxEDym9db0Q8rp4X-vTz#KtxcIQ4s$`$!sdc zFm;vXfd*kYp3fW_Xt1I8%DXVr@X+k2nT}yYDKg<^8w}@1+&e*?(g!2BO5}7P(5B^~ zsg?o-9V$H(12=Ou)gZzl&rv1PO=;DumR9}IwlY;xJ!&Qi5omux?O2ep0huQ=b2ASo zY+SkG!|qL%drId}q2-@PEgpyrF)Yt2(@yvyW73u&-dp_0oF-}2GsCH8zW}U12dt2XDaQ=#X`*rqKZ-F?L!f9 zc*{JYfojUDPdLl9f?G37xXC+w4i2cE|}XXvuDBso{CuV2exo;8`YX?rP*Ffhh(#mB{rMd zLs=7|ds{6pi=>W6h9yETq#e*z$ID`-6v`;(r}%E^{l^wt+h}WSOvRXYFRz|9(}kI? zm->KaEPv$e;l=1l_~6~oz)s~1F-DWw+9|7u9i)c^!%JFLc1^hEMb+78`q`CgavylV zgD2>^_%tiEnk!yr*>q+$okn2Jg?1O*TiUm|L6^=cd9?yviYDV`0fQI4H4v#ywQ+Ib z>X+~wh*Llrr&(~d+3_U!Tz4HD=4Y`yKW)=n9fvHA(K`mM1w!y^fkAEomFWcNNi-7* zCvfSB%Wteku4)mL2}Kh?5T}@}JV*H7U~I61LncG$+nmR9fpRQ%#1g<)tGNq}R1KD1 zvwF%R4bG}GWB$dZGE6Qi1S{W_zz6_;jXt?5+ zm6=ZEn~%-Ir+KV8vAU~YS4wDsafoMxWkc|7PP1ih#SvaG)Rvd(yxM%F^c380>Hj@i z!>_RxF|V>&-D-m3J6&|%{SsYdvrR6^T%CwIRPyvh;D3`^t8~c?LWZY<`D`Ny7->gT sLvw?H8x2;zZhpR5?61K!6vHJLf){=;aPzuE4)ME|ZmbLk%haI%0??|F#sB~S diff --git a/gameq/tests/Protocols/Providers/Css/2_result.json b/gameq/tests/Protocols/Providers/Css/2_result.json deleted file mode 100644 index 79f5320..0000000 --- a/gameq/tests/Protocols/Providers/Css/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"67.228.181.66:27015":{"protocol":17,"hostname":"[HG] 24\/7 Crackhouse Deathmatch - HeLLsGamers.com | gameME","map":"cs_crackhouse_hg_a2","game_dir":"cstrike","game_descr":"Counter-Strike: Source","steamappid":240,"num_players":28,"max_players":40,"num_bots":0,"dedicated":"d","os":"l","password":0,"secure":1,"version":"2230303","port":27015,"steam_id":90094217255135233,"keywords":"increased_maxplayers,bunnyhopping,startmoney,bots,alltalk,Crack,Crackhouse,HG,HLstatsX,HLstatsX:CE,deathmatch,fun,gameme,hellsg","game_id":240,"players":[{"id":0,"name":"Michi KK","score":619,"time":9783.6748046875},{"id":0,"name":"sG | Xlite","score":206,"time":5157.2099609375},{"id":0,"name":"|J| - Son...","score":0,"time":4875.3598632812},{"id":0,"name":"\u0441\u0434s\u0446\u0430l","score":195,"time":4493.0400390625},{"id":0,"name":"ConVict | Sero59","score":258,"time":4034.3251953125},{"id":0,"name":"\u00dcber \u2665","score":0,"time":3442.78515625},{"id":0,"name":"Muffin","score":145,"time":3434.5200195312},{"id":0,"name":"[HG] Leokes624","score":74,"time":3415.6801757812},{"id":0,"name":"greg35greg","score":101,"time":3335.1298828125},{"id":0,"name":".SlayeR","score":117,"time":2856.2700195312},{"id":0,"name":"Lincoln Osiris","score":196,"time":2843.9252929688},{"id":0,"name":"youalreadyknow","score":64,"time":2446.125},{"id":0,"name":"Dab_More","score":7,"time":2426.1899414062},{"id":0,"name":":\\nemesis:\/,,bb,,<3 Mar1an*\/\/>","score":49,"time":2055.1201171875},{"id":0,"name":"Ottomic","score":30,"time":1944.5252685547},{"id":0,"name":"usernamethe1st","score":70,"time":1913.3701171875},{"id":0,"name":"(Sir) Dezmond Vulpin","score":99,"time":1770.9602050781},{"id":0,"name":"A Z N * HMONG*","score":19,"time":1643.1151123047},{"id":0,"name":"QuantinumFuse","score":26,"time":1230.9602050781},{"id":0,"name":"Keefy Blunt","score":76,"time":1116.9898681641},{"id":0,"name":"tHe_ChRiStMaS_HoBGoBLiN","score":31,"time":760.62023925781},{"id":0,"name":"saday89","score":27,"time":672.31518554688},{"id":0,"name":"vpr","score":33,"time":562.29028320312},{"id":0,"name":"sLoWdiVe","score":23,"time":547.95007324219},{"id":0,"name":"tar-Evo[9]","score":9,"time":278.44512939453},{"id":0,"name":"ShadowMan13","score":2,"time":147.9302520752},{"id":0,"name":"joshuaJbozarth","score":0,"time":143.74522399902},{"id":0,"name":"Neon Kirby","score":1,"time":66.04517364502}],"num_rules":114,"bot_quota":"10","bp_version":"1.0.1","coop":"0","cssdm_enabled":"1","cssdm_ffa_enabled":"0","cssdm_version":"2.1.6-dev","deathmatch":"1","decalfrequency":"10","gamedesc_override_version":"1.2","gameme_plugin_version":"4.3","gameme_webpage":"http:\/\/www.gameme.com","kac_version":"1.2.2.1","macrodox_version":"1.9","manicompat_version":"1.0.1","metamod_version":"1.10.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_c4timer":"30","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"2","mp_friendlyfire":"0","mp_holiday_nogifts":"0","mp_hostagepenalty":"5","mp_limitteams":"2","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_roundtime":"1.000000","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_startmoney":"1337","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.18hg","sm_adsmysql_version":"1.2.100","sm_blockradio_version":"2.0.2","sm_cannounce_version":"1.1","sm_hive365radio_version":"3.0.3","sm_nextmap":"cs_crackhouse_hg_a2","sm_noblock":"1","sm_playersvotes_version":"1.5.0","sm_quakesounds_version":"1.8","sm_radio_spam_block_version":"1.0.0","sm_redirect_version":"1.0.0.4","sm_saysounds_hybrid_version":"3.1.8","sm_spray_version":"5.8","sm_thunder_version":"1.2","sm_webshortcuts_version":"1.0.1","sourcemod_version":"1.5.2-dev+3930","stripper_version":"1.2.2","sv_accelerate":"5","sv_airaccelerate":"100","sv_allowminmodels":"1","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_competitive_minspec":"0","sv_contact":"admin@hellsgamers.com","sv_enableboost":"0","sv_enablebunnyhopping":"1","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_nostats":"0","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"increased_maxplayers,bunnyhopping,startmoney,bots,alltalk,Crack,Crackhouse,HG,HLstatsX,HLstatsX:CE,deathmatch,fun,gameme,hellsg","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tdmtb_version":"1.2","teamswitch_version":"1.3","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","gq_joinlink":"steam:\/\/connect\/67.228.181.66:27015\/","gq_online":true,"gq_address":"67.228.181.66","gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_type":"css","gq_transport":"udp","gq_name":"Counter-Strike: Source"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Css/3_response.txt b/gameq/tests/Protocols/Providers/Css/3_response.txt deleted file mode 100644 index eec31865512d6c277289dc93689e863598c85421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2608 zcmZuz&2HQ_5FQsn4>`3!AHesb%4&bIPKp2x;wEX~{-7<~A{T;7jaGyyk|8N6Yxv$v zUZHQ$hsqFUsym447B4S;4LtZi;JRfsckO~{-mmAZ(@M4=d~os#VIT8{pU&YQ zfX|>(a5A4SX7mgH{wY6w``6!(zxd|lt<09cT>@7saCH^U)6e~zoBM?C_8j8sKU!U! z0DJ=P?nUXh0eIzKE9TMl=wt z9~5QruqYpmy8U6}cEFA0TZASA`}o0wVHk=S!?bOuW!M$8f|f$=-O8ez6?14Y@YYoC ziKmPp8(-q>j3r0BOeZ!?YiURU>!xh&8DKTUxmO-}YV6lq3N_xIg z$Q*jh2hF0+XTzFWCYX)l;%YBYs^V?DNjkAs+&4;Yn=tN;2|l150oBF{jHn`nF+voL zM~yy?Z>hax7!4faHAWDyjPPnFQCDhLOESW84kOgY_&~5MYOcaAhe}c7 z(W6bOHlt{anj)SsIkx3*oauBmnvMtu-e)LOjg-1%lfb3idEqFx3ezDe|M^ZI%Gn@w zCF`2*9_v7*wTuueBv440VhJ+pqm%$58m-3bkiv!5XxzcsETM_VD(M3>Ti5CEwHK7D z5Cs%HDy`z9b4J+du@P9ldMe^E6V&(7(R5DpmLg?919EFLoj!)5o9q*(@l8LsQ|jFoci zdqn%uXzwc~q4tV>oK$khF0qk9;V~9f*l#A6S{5Zqgq?`WVg1nW;5}v6O*l@sc+1{@`FDZQ&C2xb$q93km&B9>{rEE!sny% zASNk~@j@hn3R~0JIFAl`s#%6WZR&S*I3_b{2sO2&Ah)AOB-=$K!Y`MrM`u8!!`ont zI@0{CI4dZNA!V^bFPNeG(lj~Vn^-oQ^o$EZZ_UwD1gaeEC8g*fDk-ldi)7nMO(;-B zg3Gcr*V1M~{E;Y@6jV+cr1XB`+E7CW86-76`Fo3Euh4;u0MRHjz{U`bW#uU7wB9ww zTIzu;uO}2sengKV#7Ve}QMQivG)@vf(3VJzPQwaT#20zrc_-S+IwR2gAjOr3d2-c8 zC}}6RPKn6UF-Q!dBhT({X1VtRwRc8ld6y5cpBl&X}9yd?^@DP?KU$ZHx!RR5mX)YxpiPS9x__``<>>3bsujzpX4HBh-fEOU|` zvRXo@8K<|#V>0Oshx`f_N2zs~WY&Le%QU>65y*q1%8C)p$oeRuHP zM0DqC#9=Sf7tngKcwDX46HYVBKYdljo;QIE>#)I!N{C<3Ye(!s~ zZ-&F+aQUfo$bHd6O9@ML&{~PZHb-k_#+tKd7A-;(#d-+(dwwGyD**vbE*l5{nK=js zaA-D@voqPbg#|kYH~yKJ=pT9e(vepWHK|e@6FixnKRus=Ya5U06oA89TZeV$A<2N3 zaFm98@X}2e%FLIn$%J8+{dG^_#A2zgrIiAhb@ zlP;RxpWXU_Kt9qr1=cQ8-;j$}?hq)%N)=Ww@!I^AEc>wwrFOXPRAwVrypvDRuapYoc!>Y2Emn{N?V?Dq_4znkdZ zG7i%kl56O6L^p+B>~{#fwrXb=Oz<7{I)N3@NvD4C>vII87)c(#_FsQ`I$J-#5~&Gy z_h$&afh-c?Mw^-%+h0x-ZFwniLormQ~m?Iu4k=C`*WI^e~U_L`Xbs`uL!2TJbJvR7R%rzY6ToOZOA zlQTxt?sqRZU>EI@L7(s4E5L>ITD{(|yxQ7&-LRF?C;5X-b0>guE(RDBV#Wg)uWEpS zp0q+u0E^7tI31KBm2p(%aRi!b$Fz;Gkjv@S?sKYILiS+5LXdbdX7Ya(56H79Bc|P+ Pvtji2C}B%MHV6L#8=FBU diff --git a/gameq/tests/Protocols/Providers/Dayz/1_result.json b/gameq/tests/Protocols/Providers/Dayz/1_result.json deleted file mode 100644 index 4c44c21..0000000 --- a/gameq/tests/Protocols/Providers/Dayz/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"96.8.115.178:2302":{"allowedBuild":"126645","dedicated":"1","game_descr":"DayZ","game_dir":"dayz","game_id":221100,"gq_address":"96.8.115.178","gq_joinlink":"steam:\/\/connect\/96.8.115.178:2302\/","gq_name":"DayZ Standalone","gq_online":true,"gq_port_client":2302,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"dayz","hostname":"Welcome to the Jungle \/\/ 24\/7 Daytime","island":"ChernarusPlus","keywords":"battleye,13:35","language":"65545","map":"DayZ_Auto","max_players":50,"num_bots":0,"num_players":46,"num_rules":8,"os":"w","password":0,"platform":"win","players":[{"id":0,"name":"Tyler","score":0,"time":5767.1040039062},{"id":0,"name":"Micribio","score":0,"time":5533.2846679688},{"id":0,"name":"Michael","score":0,"time":5178.6811523438},{"id":0,"name":"(ESPT)Leonidas","score":0,"time":4698.4501953125},{"id":0,"name":"|FoNz| Rowland","score":0,"time":4562.1499023438},{"id":0,"name":"Jack","score":0,"time":4088.7685546875},{"id":0,"name":"Craig","score":0,"time":3019.9365234375},{"id":0,"name":"[CM]KoreanBR","score":0,"time":2778.9191894531},{"id":0,"name":"Albert Delinco","score":0,"time":2578.7866210938},{"id":0,"name":"[MTN]Anthony","score":0,"time":2435.4924316406},{"id":0,"name":"Ronan","score":0,"time":2424.6340332031},{"id":0,"name":"Zaycupcakes","score":0,"time":2392.3413085938},{"id":0,"name":"Wellington","score":0,"time":2262.9614257812},{"id":0,"name":"((+N+))Edum4x","score":0,"time":2010.4832763672},{"id":0,"name":"[CTF]DANVIANA","score":0,"time":1792.1412353516},{"id":0,"name":"[CTF]Forasteiro","score":0,"time":1785.3283691406},{"id":0,"name":"Mr Dinkens","score":0,"time":1655.0341796875},{"id":0,"name":"(ESPT)Legolas","score":0,"time":1617.5574951172},{"id":0,"name":"Christian","score":0,"time":1613.541015625},{"id":0,"name":"[KGB] weasels","score":0,"time":1609.2819824219},{"id":0,"name":"Syke","score":0,"time":1565.7698974609},{"id":0,"name":"AsianBigMac","score":0,"time":1548.1004638672},{"id":0,"name":"ButtFucker9000","score":0,"time":1516.6192626953},{"id":0,"name":"Neto","score":0,"time":1513.8000488281},{"id":0,"name":"LeMaO","score":0,"time":1414.1920166016},{"id":0,"name":"MataTuto","score":0,"time":1398.6380615234},{"id":0,"name":"Lucas","score":0,"time":1110.2631835938},{"id":0,"name":"[SM]OfficalREKT","score":0,"time":1029.6437988281},{"id":0,"name":"7pm","score":0,"time":998.10003662109},{"id":0,"name":"Bruno","score":0,"time":997.69445800781},{"id":0,"name":"Choko","score":0,"time":931.94805908203},{"id":0,"name":"HK416","score":0,"time":889.65240478516},{"id":0,"name":"John","score":0,"time":862.78814697266},{"id":0,"name":"rockerBR","score":0,"time":851.68664550781},{"id":0,"name":"Creator","score":0,"time":703.94976806641},{"id":0,"name":"jeison_ga","score":0,"time":686.74279785156},{"id":0,"name":"darre_000","score":0,"time":591.30004882812},{"id":0,"name":"Mike","score":0,"time":585.87652587891},{"id":0,"name":"xinandes","score":0,"time":546.88122558594},{"id":0,"name":"QuackerPlays","score":0,"time":496.46221923828},{"id":0,"name":"wTD * pic4black","score":0,"time":449.4821472168},{"id":0,"name":"Turambey","score":0,"time":263.72207641602},{"id":0,"name":"LEGITPUMA","score":0,"time":186.18351745605},{"id":0,"name":"JayQ","score":0,"time":164.7335357666},{"id":0,"name":"4F4L","score":0,"time":103.49153900146},{"id":0,"name":"[URSS] TROUS","score":0,"time":20.037258148193}],"port":2302,"protocol":17,"requiredBuild":"126645","requiredVersion":"54","secure":1,"steam_id":90094491751706632,"steamappid":0,"timeLeft":"15","version":"0.54.126645"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dayz/2_response.txt b/gameq/tests/Protocols/Providers/Dayz/2_response.txt deleted file mode 100644 index 2ee7a7654c9a4ca20fdac52af2a781bd24009a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmYL^u};G<5QeW}sk$NY0A7(ol(ca`Oi+ph5<@2>SgLD%O;2_0;5dm=^>x@-c)H~qf&P;!|r`?UwaD* zyZzq_At|U921zWlI34GCCgJ-yg!$!Xb8$CVqW79Qij18&6_t*gCvGT8liO?zUyHL} z1B?!bQRvgpPS@iQP;1+gn%1lp1oPx314W8g=qUi;N~2NmupwvA)zw_r6$Dh&SPN5>z+xd+d5aGkK_$`jU#MRD_UcY$q0(Of)k|Rn-6BAK38` z?Dzowq|4y+1wyjq)lE9UB zErR`{Dz++7U8%1#0xHhPX>>e8bKAe)a!!FKtx$!QfS6_>9wLZaLtM0G9!hNT&ICmC@g16dMdCWSs_ZU zN-Z-dGpi(XnMvk#C^=?Y2J0oU1r7hGAxVw!)Md70q;xV+L8K1EILowU-U}}aUSP-4 zdl$h6EhHvNV;h{p8P;Y)c516fXZ`f4keY{SALdQ$VmpOt?HwG~P3c?s<~Vl#?Q_q0 z6IZtL@FdP+XPX;1sH=sY-~8Wqw(yPZQlb)D3eD78x8dkRx(_$;ft&n1i`f`62ZwRx x&A~-iJ7b}14LkEZee*l|B?Zp?8H~}OA2vt<=1+DFMvLb$H?Svws{+}Kz z^%wOQ^we9Mt_208mFAn7Z)U!k-E20S$!l1sb^()+MVO66!pSJaBRrV|Lm{V}4Y?qk zQ5H%@!-zmx=ZCI9w|jV(Ld+#61gC@rl;gs^6f1&-)I`XPQ7TfF@gk7%XgEb{9}yq3 z_-r=5$21m!bPq>Gssa`X?b>h>raTLxOo}iUp^5~{!#Gz=DyB8pA`McUGs^iBHN>e& z3tdPqFo`5qMIPZ0%ed#9sPbO$(3T3(_|EL1(?(m>nYuzlYwPQUR{2A2WKCz?S-n$a;XLfwq7;uU}oCZE!+;yPLBo`deOpop>3t?ss-h)Lsfr?CWC%n zFBxEK2l8tG;tS>zMhKPg{qL*iJ15_M5B8s>oo9()UUir9+R!u9D+_N~cUXmJ6F7f0BQ$!`$ou diff --git a/gameq/tests/Protocols/Providers/Dayzmod/2_result.json b/gameq/tests/Protocols/Providers/Dayzmod/2_result.json deleted file mode 100644 index 6a65479..0000000 --- a/gameq/tests/Protocols/Providers/Dayzmod/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"192.223.24.141:2302":{"dedicated":"d","game_descr":"DayZMod","game_dir":"arma2arrowpc","game_id":224580,"gq_address":"192.223.24.141","gq_joinlink":"steam:\/\/connect\/192.223.24.141:2302\/","gq_name":"DayZ Mod","gq_online":true,"gq_port_client":2302,"gq_port_query":2303,"gq_protocol":"source","gq_transport":"udp","gq_type":"dayzmod","hash":"E73803C6D51B70B0EE4A69F53A56153237932781","hostname":"The Dead Return 1.9.0|Vanilla+Groups+Missions+POI+Vehs","keywords":"bt,r163,n131129,s7,i2,mf,lf,vt,dt,tcoop,g65545,c2147483647-2147483647,pw,","map":"Chernarus","max_players":40,"modHashes:0-2":";595110b134250f50fb0a1069e169c3226b3c5f49;BAF v. 1.03;PMC v. 1.02;64964908fba4386e250517b5c48c967d67a863d7;da39a3ee5e6b4b0d3255","modHashes:1-2":"bfef95601890afd80709;","modNames:0-2":"Arma 2;Arma 2: Operation Arrowhead;Arma 2: British Armed Forces (Lite);Arma 2: Private Military Company (Lite);ArmA 2: DayZ Mod","modNames:1-2":";@Hive;","num_bots":0,"num_players":5,"num_rules":9,"os":"w","param1":"0","param2":"0","password":0,"players":[{"id":0,"name":"Ignak","score":4,"time":11871.586914062},{"id":0,"name":"Crowen","score":101,"time":11531.525390625},{"id":0,"name":"Galax","score":0,"time":7691.9174804688},{"id":0,"name":"Link","score":30,"time":3574.1176757812},{"id":0,"name":"RogerMcDodger","score":5,"time":2029.6378173828}],"port":2302,"protocol":17,"secure":0,"sigNames:0-1":"bi;bi2;DayZ_1.9.0;","steam_id":90120330949830658,"steamappid":0,"timeLeft":"15","version":"1.63.131129"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dod/1_response.txt b/gameq/tests/Protocols/Providers/Dod/1_response.txt deleted file mode 100644 index f61ca8de9631bfe837f2ea598db1b954bbcf31d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2811 zcmai0OK%)S5H6#H0}v6RaE(St z5tbV$LY(*mAZ|JHIHCL!gt+kw;EJj4nO(1UBeAFLud2R!cJ-W|o}L~CJ*pHditF0z z5k;z$D(y|ZT|$M|>fGMM|D(~!?`+;NeMLl$Vn2}_Qkg~xD%n5KB@<6(UYBN+7`O_T zy$k6G)*-CWaH?ZEkMD8e%X1d~Xjl6^4q0rf>zJcYpt_3)8)m!~4_j(ZT-FQ5P;F zJbwC17fz@U@&UYw=O4fNp$i!?jKW)Z{NqyA1;cpE3|z$XUr%4`f~a^bDuYJ={`K=+ zSf3srKA5g=Gqo>OLXQN!b#QPCUPt-0;C(cpA6MF`|NZSxJJ4g=Q030wUwgR?+sgFu z{5B%jfBokGjtLXSf5dW@!i5>QON{n=RF2@%40=L}RGw+<6H62Auq<=jmdlp!Uo77} ze+^!r)_%uvE{p0V00DvK&-0%z29%M1OEjeMV0R2`d2@#f-T zt!qs^FNGN>I;40NS2&g3H+mzW{+jVbTmzHOUXTe`i$$vFBPb7T~2N)w!> zB_zrV8Ixj3Fk&LbI}$=~@A%=~?!0WaX*-{IJ7|N|yH?jv+xh{g28S@62a5THWqT8N ziK9(s>ESj^;O_DX3=3o?O?vpi;ILsC>&`-V4kzZLG8k|keK zv1uu2)x=V0yYxgdvHdEejHJ}axFE@(&L~4aDdBb=Y6ZMZ{etCv)10L=NKo4CW9{vp zO>oW>Sp@n7M}_bP!r2jNG0B)}NDIc9sS|1k3HGC9xfalvDA-uRo=G_%E4m3$F%xt} zKgZV*JGTXkyZ4>*esUZHP4h}XXUQ9v3J0iZ<3eN_Zy$DlIbhS5ywrAypYdQXvb@t; zq;8<5cr`6zgHC(NaDcwI&QbBa-C1;tX56wbL}H=Uuq|44f+YtCb(Ww~Cw<(HgC$Cw z!;+>ppfgu7t{_~pq$SA>=Jm`|*H`AS3mow2MVl%a5B{pCrmEBGDq~zG{9d~dSls&_6x2#MXS=MA> zZCYoEE+D8w9!i!_DqQJYiX$xAYKa^=Pbq}si8vIvC51V*3)DVILEs)Vl;B5@{g$Y| b4ipAFydFFso0(aE zgaauRH3djCh>{)wP5uJJe?mh+LB;WAcJJa_UlB`|W`6JcW8T}7larJER&*QoDu=Y~FQkubdK~p(4Ahb9nHtdWB^8R6-<(sk-GWE<}TSYC3n#$ zS{F75{IvUFj~qZw9iPFCXva<>EQF*NO`ADq@4T5If{K zw^V9NUP5T^5<)}x^pQ_dVEX>I_j{z>+AF=W%gFNjKkxQ10IKjz$d5m~g8~yUW*P4P zKK<@4c?e4BgK+=(?_citZ2X7W_lK6Jq_Grok2jxXc=W3^P;j1T{zC7oAdcR-kH&X&TP!IyhZvC z`sp4Akqsc@jLh0`a^K561b4G@bkuoxD;UYOfs~cjX<3^{;_X1;=G10_Hc@hC@aR$0 z*Zt@Ss0=J$Xs#Y(v)DODw^M0zZ|4Oa^dU+R03)r+v-rHN7mn``Y(eL$=Zqk;B;IPo z=Tk7`Di_eB*vl7icpn@_BSRfbT8J{|3R@)9Jxb!PSGflzn4v3;#OLV~jbat2jTJZo zSq@{vne)BUCV76=IGBvq-44lR>U55NVDTkgq>oV_2aFjQ*1CbDxzHng1m_8Jt};FM zAUG_1c4h*fd9s1^kOej;RcX~hXlM1F&Z&{5@4Zvl0L_*-Qyev}38$9l{uu_I6^W2+ z$7KkkR$r?yx>VVU9?P`B%&#M9Rc$KpAz8A4@zjcHiBtN5Ur5bB&?VV=9>=NJjEWL7 zTI)^1Z%y|plULqg@nIPpB|%0j%dG>&mOkM{I;I&oJra~ntBA&EC!^B8-HJg_I}tpe zxcaWOLj~A$6CMTyj?h)M+u_5u4tb6?jC= zMc@;yr*xgbs2OpE9yitG6bEK@0geq|Aun+NHbta1*g19mRy?vrDEk_}n`l{BKT20L zEmmjm8{CfbZu>k#g<%#~rMR7TJ8MuQ6 zV~*n|bQ;c^@LX+`2;cc38U9%n_`yL(VNhABrq(}eyE1FG z&vqOIA(cwKRN{a*K_!aB8G$%+>4|@#y|kbriclpETnY1b?Zo}DmaLumX1GjDc# zdwYA~0CP{Vbo>;XJB;&7N9I_0t-M&SSI^a0eTh|;R#)C&TWp@kc(Ded3LCt~B~OAj zIthF}V5-G@Y$3O&*^27w0AXt4AcIiCM6o#I(GPySCa$~&^mr339->uE$%D>Rl+#X4 zI0#_>*4BQ?YTG{uhpI{=TT~r;D1(lDcBcj#TN~_x&??j1|L0Z>tV$bEH-SB*y8p+` z8mw64(zaVdBRo&a2e;R1;EqNoJI_13sXDBpY|w_ogzigL37t<1b#CV}lGh)eslmsn zJH}E1@EjT4eDkduTo6)X*r*H|XEjecneBtW57fYGN~J>6Ru%`i>5)Cal>;|?xQtq{ za;l_?1R8jj^gmC1<->{9WNcWAE zKKR%ZauZ%8`QaA&uv%MQUZ^bA*n+>Xvp(`*2>w738rmjHP^uxvC2A0---F z&-#F2oJ%*ZGUDI^sWe;ZiR;6zv#?yR4=U<|!*lQqVZYq@vq~-K#wsxubw>M2>2?(s7?0V!R?21^Z{PW%3X_wQ ztnAm87t1Rv%n6LGuiyIV)|cz+Lrc7L-Hvlvj^_( zbpum72Z2&4co5PUwqx!ZJWWEtWlQ5HT}*-jOcP84Y-7{lVMr;$j@(0Sgi2t#Fb!@f zV{D|d8;PVbLP~|=22YY?Xm zE~V<%FI5fY=ftj6fmX(}xzM?4?1GFGQieQsAwB2QlH9bVh}w3DQ(39p>5#Ie=n85y zDeu#PG6&5gDPm!V{#sxX%0YHXGDf;Iv817acBH$BJ!1m0uuehY9GFTz$epc-G3T0| z&3yaFQ`hd1L0=@JSP5=ei9M76x=|LoskmJe*!PJL6ZcOA_nwBGrKZ8D$Fa-jFgvxE z0p}6Zr?Nc?j8Tn%5f3%SMPI|V2qf-uQPoV)peA-Dj`h(ixNHg8ZS7DM^IfG^m@Sl? zUF>=-l9t-BFBV)t0^As;R9+>`4oKWIDMbgz7>ZrO9C+6OuAnhbAKSwOXl{2i^=MQ{ zXLt`ACZIJo9wa+Lwxu5((vyXfo6*VANsmHVEz%VASaL;2+H3G2K#4A#yG~9a^piR% zEtee{7&2(8ZbF}g?45Q9w`TaR5?U&jwo-)d`e^fB6muc7OGJLHv8i^V7J+qFbk>nZ zn)ieqz^s??#(cx1h#|}rM{?KbAP!Tl0yMM@gN}h>$+;#fkRlz+`NXa^C&?5kH>R(2 zm?xX^uHj8u$r-&?l0JdaxR`qu^K?iE9uMGjd1yCXy@r!>r0^^#px*#ASPMzS>QhP?#Y&A+MOCtgG}-;ovoJgLy?Wn! z_5P}Mc6N5oA8ds=*UmYbfK*OfBuSn!T{uS_Z{1tkbk5~zgfbF}&{rCOYcT}r_gG4~ z0f|QoNAw&IdO-D(vng^J0GXXRe3*noGSg_x)$oseb(8J)I$sW+IXy!;*Od2XyCUhT z*&auF9ZN&2W~0*F>}#Mi8uZm{0wD`#Gb(8i=Nc3;6Z<)EasA9692&FSahP zueKcg`Jxpc=C?cK)av({Sa;JM3Z zJ7ifD+S!nz!*4w=K4G?R$@`-TK$(60;&Q)iPGOp~t z&wu>7O+2OomT|Di!MmTe$z}%n`eI{IN{g*sx!EQKMUNq2eQ4C`b&Icj_g0%+U}_7b zvnAJyPP%FFcOSfo9Ga#aFor{bup&SI&c|m+#`>j`_YPe;LoT&0ZnU?^xCkikNw}6n8WiL> za${rKCYe}3(-xJ$1q~x?ozyy7`Bf(|9|hoNmVQd>xO?0k3wMu!*kYwIgl>jCLt?G7 zrDMmanH**~NDN3dH{7lm)m>{K7D}6A9V30VYrp0$66|-Hpxe7f>NU5yO_I#V*&v2% z8*PPWHOpL!KnkT|$}rFd>d_Fi=yHq_M%DtHhtxE4wSiL=a~8$AS_`3Za%B}|PvCr# zpfWndELj3cBhC`+oRUv6NJC!qn5-Bz&;$p7CUJxfqfcU;LaGgb=8Z7pv?!G|OQ7VM zvt&b{nMjo$%ZDr-n@VA%ISc@+Q2H$&px9Uy-O}E}4DxtvytGNr< z6-@+v8e;M>gpgn))zpr8cizf-{bYj9xlMP@q8N2aHN=?wiL{PIi;SiZ%#AXI8}k+) zaS=`7)`L(CQ_~-N4q+uQU_4<`ioM6H*DRlrW(?;sr`Z%|%^k}}85bc;L?|$B*lTVA zVq(YpBP{qSyxujtt7~wASLbJ@l2Tn&uOEV`yLuV1hh&gaoav!SR^mS-ODOtC3+!7g z+ETn{-p$TbUMmly0|;ZTPCIyQHobKK4M>aHu~9$BH;9%QKjkNN8rK zm%yql0gz?_(lSyG(JBRX","score":0,"time":5069.513671875},{"id":0,"name":"=LI= Mrs.Ax(NoMic)","score":0,"time":5062.912109375},{"id":0,"name":"Armageddon","score":0,"time":5062.7021484375},{"id":0,"name":"칫풉","score":0,"time":5058.3520507812},{"id":0,"name":"rockandrolliswar","score":1,"time":4016.388671875},{"id":0,"name":"xx_lvl4rk0s_xx","score":0,"time":3778.1809082031},{"id":0,"name":"The Ozz","score":0,"time":3173.5705566406},{"id":0,"name":"Hoyt ProElite","score":2,"time":2016.6986083984},{"id":0,"name":"Bloody L.","score":0,"time":1977.623046875},{"id":0,"name":"MargaL_NYC","score":0,"time":1547.5383300781},{"id":0,"name":"Nucky Thompson","score":0,"time":1273.6320800781},{"id":0,"name":"syk0","score":1,"time":1262.1418457031},{"id":0,"name":"BigChickenChit","score":0,"time":1132.4390869141},{"id":0,"name":"Dghad","score":0,"time":993.50842285156},{"id":0,"name":"boscoe82","score":0,"time":751.24237060547},{"id":0,"name":"drunken nublet","score":0,"time":578.90948486328},{"id":0,"name":"-=?=-VT Jerry 4 2 o","score":0,"time":545.37072753906},{"id":0,"name":"[UCHS] The Hitmann","score":0,"time":531.19519042969},{"id":0,"name":"Modal_Soul","score":0,"time":491.47546386719},{"id":0,"name":"Jimmeh242","score":1,"time":464.25030517578},{"id":0,"name":"[THE] Nails","score":0,"time":367.57540893555},{"id":0,"name":"Disciple","score":0,"time":323.62551879883},{"id":0,"name":"Spetz929rr","score":0,"time":270.71331787109},{"id":0,"name":"yankeemike2011","score":0,"time":259.47882080078},{"id":0,"name":"MisTer TrOyEnS","score":0,"time":257.93374633789},{"id":0,"name":"Stanley Tweedle","score":0,"time":77.258369445801},{"id":0,"name":"pikl","score":0,"time":53.768375396729},{"id":0,"name":"WARPATH","score":2,"time":27.068267822266}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.12","sbchecker_version":"1.0.0","secure":1,"sm_advertisements_version":"0.5.5","sm_afkm_version":"3.4.3","sm_antiratehack_version":"1.1","sm_dod_bomb_version":"1.2","sm_dod_xlog_version":"1.4","sm_downloader_version":"1.4","sm_evilmirror_version":"1.0.102","sm_evilpimpslap_version":"1.0.102","sm_explode_version":"0.1","sm_flame_version":"1.0.102","sm_glow_version":"1.1b","sm_gungame_version":"4.3","sm_instantrespawn_delay":"1.5","sm_instantrespawn_enabled":"1","sm_instantrespawn_maxplayers":"0","sm_instantrespawn_selectclass":"1","sm_instantrespawn_version":"1.4","sm_jetpack":"0","sm_jetpack_onspawn":"1","sm_jetpack_version":"2.0.5","sm_nextmap":"dod_orange_fighting_place","sm_parachute_version":"2.0","sm_saysounds_hybrid_version":"4.0.3","sm_speedup_version":"1.0","sm_spray_version":"5.8a","sm_stkp_version":"1.0.3","sm_webshortcuts_version":"1.0.1","smac_version":"0.8.2.4","sourcemod_version":"1.7.0","steam_id":90094492493104136,"steamappid":300,"superlogs_dods_version":"1.1.3","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"webmaster@adultgamerscommunity.com","sv_footsteps":"1","sv_friction":"8","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"50","sv_tags":"alltalk,bombs,flamethrowers,gungame,jetpacks,medic,parachutes","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2230303"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dow/1_response.txt b/gameq/tests/Protocols/Providers/Dow/1_response.txt deleted file mode 100644 index cd4d502ceae78c2b29cf923bcca152a22e3627e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 zcmZvZ&q~8U5XPq$k%9-W9yH!d**}fioJ>g@0?lS=8a;-k%^{#0NLG94Q}`y{`V>A& zUm?y)6ruU{@-g2qGe5R%+cvtK5=!pql)4i}`2z~zP1l8bF-2n_`?1a%{Vkvz*zRCJ z$HYGPRM+Q+x)E+ithopt$MXveQj<76rP0>TMk7g@lbumkK*EFf4wkhqyMNatx9 VC1SDk!xUUb;0Z6WAHc^Pz5&`QdNBY1 diff --git a/gameq/tests/Protocols/Providers/Dow/1_result.json b/gameq/tests/Protocols/Providers/Dow/1_result.json deleted file mode 100644 index 498700a..0000000 --- a/gameq/tests/Protocols/Providers/Dow/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"199.60.101.90:27015":{"BeaconPort_i":"15000","F_i":"0","G_s":"Domination","MPN_s":"dow_carentan","N_i":"5","ONM_s":"Driven Arts US","OWNINGID":"90106191542138888","OWNINGNAME":"90106191542138888","P2PADDR":"90106191542138888","P2PPORT":"7777","P_i":"32","SESSIONFLAGS":"520","V_s":"1.0.3.3","dedicated":"d","game_descr":"Unreal Test!","game_dir":"unrealtest","game_id":454350,"gq_address":"199.60.101.90","gq_joinlink":"steam:\/\/connect\/199.60.101.90:27015\/","gq_name":"Days of War","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"dow","hostname":"90106191542138888","keywords":"BUILDID:211023433,OWNINGID:90106191542138888,OWNINGNAME:90106191542138888,P2PADDR:90106191542138888,P2PPORT:7777,G_s:Domination","map":"","max_players":32,"num_bots":0,"num_players":0,"num_rules":13,"os":"w","password":0,"port":7777,"protocol":17,"secure":1,"steam_id":90106191542138888,"steamappid":0,"version":"1.0.0.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Dow/2_response.txt b/gameq/tests/Protocols/Providers/Dow/2_response.txt deleted file mode 100644 index 7ad9c37f2a3e4992664236ac045e2e4dbb46aba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 469 zcmZvZ!AiqG5Qe7+9*Q2kdeC^4Qg*XxB|VvvGz6N>(lmMu(XJBI4Q#e8g+7Dt;*0nw zzCzrUC_*!P`I(=ce?F#ZnkG7P5k_O|VrOh)2e||TtcB#otKzkS>_=Klt*=0r1*hy;)i!@Ab~Tsv1DDTvx)x&RJt;0lrIVLet's Kautsch OECONOMICA", - "DetailedDescription": "www.letskautsch.de\\nts.letskautsch.de\\nWipeDate:06.09.18", - "Category": "beginner", - "OnlinePlayers": 4, - "TotalPlayers": 77, - "AdminOnline": false, - "TimeSinceStart": 373544.89116467279, - "TimeLeft": 3514455.1542289914, - "Animals": 3833, - "Plants": 332976, - "Laws": 2, - "WorldSize": "1,96km²", - "Version": "0.7.7.1 beta", - "EconomyDesc": "71 trades, 0 contracts", - "SkillSpecialization": "VeryHigh", - "SkillSpecializationSetting": "veryHigh", - "Language": "German", - "Ha -|| -sPassword": false, - "HasMeteor": true, - "DistributionStationItems": "None." - }, - "Graphs": [ - { - "Category": "Humans", - "Name": "Learn Specialty", - "Graph": { - "Keys": [ - [ - "Humans", - "All", - "Learn Specialty" - ] - ], - "TimeMin": 0.0, - "TimeMax": 4.323436238734824 - } - }, - { - "Category": "Ecosystem", - "Name": "Populations", - "Graph": { - "Keys": [ - [ - "World", - "Population", - "Camas Population" - ], - [ - "World", - "Population", - "Wheat Population" - ], - [ - "World", - "Population", - "Birch Population" - ], - [ - "World", - "Population", - "Cedar Population" - ], - [ - "World", - "Population", - "Bunchgrass Population" - ], - [ - "World", - "Population", - "Fern Population" - ], - [ - "World", - "Population", - "Huckleberry Population" - ], - [ - "World", - "Population", - "Hare Population" - ], - [ - "World", - "Population", - "Elk Population" - ], - [ - "World", - "Population", - "Wolf Population" - ], - [ - "World", - "Population", - "Beets Population" - ], - [ - "World", - "Population", - "Corn Population" - ], - [ - "World", - "Population", - "Waterweed Population" - ], - [ - "World", - "Population", - "Fireweed Population" - ], - [ - "World", - "Population", - "Creosote Bush Population" - ], - [ - "World", - "Population", - "Sagebrush Population" - ], - [ - "World", - "Population", - "Prickly Pear Population" - ], - [ - "World", - "Population", - "Beans Population" - ], - [ - "World", - "Population", - "Bullrush Population" - ], - [ - "World", - "Population", - "Bison Population" - ], - [ - "World", - "Population", - "Turkey Population" - ], - [ - "World", - "Population", - "Fox Population" - ], - [ - "World", - "Population", - "Tuna Population" - ], - [ - "World", - "Population", - "Salmon Population" - ], - [ - "World", - "Population", - "Trout Population" - ], - [ - "World", - "Population", - "Otter Population" - ], - [ - "World", - "Population", - "Clam Population" - ], - [ - "World", - "Population", - "Urchin Population" - ], - [ - "World", - "Population", - "Kelp Population" - ], - [ - "World", - "Population", - "Pitcher Plant Population" - ], - [ - "World", - "Population", - "Buttonbush Population" - ], - [ - "World", - "Population", - "Salal Population" - ], - [ - "World", - "Population", - "Tomatoes Population" - ], - [ - "World", - "Population", - "Amanita Mushroom Population" - ], - [ - "World", - "Population", - "Crimini Mushroom Population -|| -" - ], - [ - "World", - "Population", - "Oak Population" - ], - [ - "World", - "Population", - "Fir Population" - ], - [ - "World", - "Population", - "Saguaro Cactus Population" - ], - [ - "World", - "Population", - "Rice Population" - ], - [ - "World", - "Population", - "Tortoise Population" - ] - ], - "TimeMin": 0.0, - "TimeMax": 4.3234362387970462 - } - } - ] -} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Eco/1_result.json b/gameq/tests/Protocols/Providers/Eco/1_result.json deleted file mode 100644 index f2a5b86..0000000 --- a/gameq/tests/Protocols/Providers/Eco/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"89.163.140.137:3000":{"adminonline":false,"animals":3833,"category":"beginner","dedicated":1,"description":"L<\/color>e<\/color>t<\/color>'<\/color>s<\/color> K<\/color>a<\/color>u<\/color>t<\/color>s<\/color>c<\/color>h<\/color> O<\/color>E<\/color>C<\/color>O<\/color>N<\/color>O<\/color>M<\/color>I<\/color>C<\/color>A<\/color><\/b>","detaileddescription":"www.letskautsch.de\\nts.letskautsch.de\\nWipeDate:06.09.18","distributionstationitems":"None.","economydesc":"71 trades, 0 contracts","gameport":3000,"gq_address":"89.163.140.137","gq_joinlink":"","gq_name":"ECO Global Survival","gq_online":true,"gq_port_client":3000,"gq_port_query":3001,"gq_protocol":"eco","gq_transport":"tcp","gq_type":"eco","hasmeteor":true,"haspassword":false,"islan":false,"language":"German","laws":2,"onlineplayers":4,"plants":332976,"skillspecialization":"VeryHigh","skillspecializationsetting":"veryHigh","timeleft":3514455.154229,"timesincestart":373544.89116467,"totalplayers":77,"uniqueidentifier":3499416734684207289,"version":"0.7.7.1 beta","webport":3001,"worldsize":"1,96km²"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Eco/2_response.txt b/gameq/tests/Protocols/Providers/Eco/2_response.txt deleted file mode 100644 index 13fc9fd..0000000 --- a/gameq/tests/Protocols/Providers/Eco/2_response.txt +++ /dev/null @@ -1,266 +0,0 @@ -HTTP/1.1 200 OK -Keep-Alive: true -Content-Length: 5812 -Content-Type: application/json; charset=utf-8 -Server: Microsoft-HTTPAPI/2.0 -Date: Mon, 10 Sep 2018 16:34:02 GMT -Connection: close - -{ - "Info": { - "UniqueIdentifier": -4819071135178542589, - "GamePort": 3000, - "WebPort": 3001, - "IsLAN": false, - "Description": "<#0000FE>[FR<#FF0000>] <#0000FE>Serveur Next <#FF0000>Multigaming [EXP 1.5][v7.6.3][~2km]", - "OnlinePlayers": 4, - "TotalPlayers": 61, - "TimeSinceStart": 560946.44009479822, - "TimeLeft": 2031053.6661686017, - "Animals": 3608, - "Plants": 316929, - "Laws": 7, - "Leader": "Ripley", - "WorldSize": "1,96km²", - "Version": "0.7.6.3 beta", - "EconomyDesc": "225 trades, 0 contracts", - "SkillSpecialization": "Medium", - "SkillSpecializationSetting": "medium", - "WorldObjective": "Mettez à jour vos Objectifs (touche \"O\") svp!", - "Language": "French", - "HasPassword": false, - "HasMeteor": true, - "DistributionStationItems": "None." - }, - "Graphs": [ - { - "Category": "Humans", - "Name": "Learn Specialty", - "Graph": { - "Keys": [ - [ - "Humans", - "All", - "Learn Specialty" - ] - ], - "TimeMin": 0.0, - "TimeMax": 6.4924354962661823 - } - }, - { - "Category": "Ecosystem", - -|| - "Name": "Populations", - "Graph": { - "Keys": [ - [ - "World", - "Population", - "Camas Population" - ], - [ - "World", - "Population", - "Wheat Population" - ], - [ - "World", - "Population", - "Birch Population" - ], - [ - "World", - "Population", - "Cedar Population" - ], - [ - "World", - "Population", - "Bunchgrass Population" - ], - [ - "World", - "Population", - "Fern Population" - ], - [ - "World", - "Population", - "Huckleberry Population" - ], - [ - "World", - "Population", - "Hare Population" - ], - [ - "World", - "Population", - "Elk Population" - ], - [ - "World", - "Population", - "Wolf Population" - ], - [ - "World", - "Population", - "Beets Population" - ], - [ - "World", - "Population", - "Corn Population" - ], - [ - "World", - "Population", - "Waterweed Population" - ], - [ - "World", - "Population", - "Fireweed Population" - ], - [ - "World", - "Population", - "Creosote Bush Population" - ], - [ - "World", - "Population", - "Sagebrush Population" - ], - [ - "World", - "Population", - "Prickly Pear Population" - ], - [ - "World", - "Population", - "Beans Population" - ], - [ - "World", - "Population", - "Bullrush Population" - ], - [ - "World", - "Population", - "Bison Population" - ], - [ - "World", - "Population", - "Turkey Population" - ], - [ - "World", - "Population", - "Fox Population" - ], - [ - "World", - "Population", - "Tuna Population" - ], - [ - "World", - "Population", - "Salmon Population" - ], - [ - "World", - "Population", - "Trout Population" - ], - [ - "World", - "Population", - "Otter Population" - ], - [ - "World", - "Population", - "Clam Population" - ], - [ - "World", - "Population", - "Urchin Population" - ], - [ - "World", - "Population", - "Kelp Population" - ], - [ - "World", - "Population", - "Pitcher Plant Population" - ], - [ - "World", - "Population", - "Buttonbush Population" - ], - [ - "World", - "Population", - "Salal Population" - ], - [ - "World", - "Population", - "Tomatoes Population" - ], - [ - "World", - "Population", - "Amanita Mushroom Population" - ], - [ - "World", - "Population", - "Crimini Mushroom Population" - ], - [ - "World", - "Population", - "Oak Population" - ], - [ - "World", - "Population", - "Fir Population" - ], - [ - "World", - "Population", - "Saguaro Cactus Population" - ], - [ - "World", - "Population", - "Rice Population" - -|| - ], - [ - "World", - "Population", - "Tortoise Population" - ] - ], - "TimeMin": 0.0, - "TimeMax": 6.4924355150833124 - } - } - ] -} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Eco/2_result.json b/gameq/tests/Protocols/Providers/Eco/2_result.json deleted file mode 100644 index 7ba3db2..0000000 --- a/gameq/tests/Protocols/Providers/Eco/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"51.15.15.138:3000":{"animals":3608,"dedicated":1,"description":"<#0000FE>[<\/color>FR<#FF0000>]<\/color> <#0000FE>Serveur <\/color>Next <#FF0000>Multigaming<\/color> [EXP 1.5][v7.6.3][~2km]<\/color><\/b>","distributionstationitems":"None.","economydesc":"225 trades, 0 contracts","gameport":3000,"gq_address":"51.15.15.138","gq_joinlink":"","gq_name":"ECO Global Survival","gq_online":true,"gq_port_client":3000,"gq_port_query":3001,"gq_protocol":"eco","gq_transport":"tcp","gq_type":"eco","hasmeteor":true,"haspassword":false,"islan":false,"language":"French","laws":7,"leader":"Ripley","onlineplayers":4,"plants":316929,"skillspecialization":"Medium","skillspecializationsetting":"medium","timeleft":2031053.6661686,"timesincestart":560946.4400948,"totalplayers":61,"uniqueidentifier":-4819071135178542589,"version":"0.7.6.3 beta","webport":3001,"worldobjective":"Mettez à jour vos Objectifs (touche \"O\") svp!","worldsize":"1,96km²"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Egs/1_response.txt b/gameq/tests/Protocols/Providers/Egs/1_response.txt deleted file mode 100644 index ce1936435629b12093b92ebaa3a8af21c011dc79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmaJ;L2lDP6n!j^P<9*u$qQK4nz7TyRX0Sn2^MOw&48zfe$p_@)quAjh~3E+Ll(*M~)UO-+(VHCw-l!TH^=6x~TT2uYjxl!K=s}AIP zBw$c_H&lLb)FWcU>!BgXHtlDg;636@PTX{*He_{=crg*BSI#rrlJ7Cc$GWzK>wHQ) zcuam`j^XDC3f1@f&gnIg<`ukCwkH%*R8}}S5-2)1ZI%oCo@Q&uZ!O8~$mMO_0i`F^ tl7x5zDlWtqE{Z2#R6kut$cPdzf7oorxv!$aUfnQ^Qxm5rF diff --git a/gameq/tests/Protocols/Providers/Egs/1_result.json b/gameq/tests/Protocols/Providers/Egs/1_result.json deleted file mode 100644 index d009c60..0000000 --- a/gameq/tests/Protocols/Providers/Egs/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"192.223.28.130:30000":{"AntiGriefDist":"30","AntiGriefPvE":"30","AntiGriefPvP":"300","DecayTime":"2","Dedicated":"True","EACActive":"True","EnabledTrading":"1","GameModeId":"1","GameName":"","Host":"The Killing Crew - US East","IP":"192.223.28.130","IsPublic":"True","MaxPlayers":"8","MaxStructures":"200","NumPlayfields":"37","NumStartPlanets":"4","NumericalVersion":"-1","OfflProtDelay":"300","OfflProtTime":"48","PasswordNeeded":"False","Ping":"-1","Players":"0","Port":"30000","Product":"EGS","ServerInfo":"","SteamID":"90113336513850378","StopPeriod":"0","Version":"Alpha 7.6.0","WipeTime":"0","dedicated":"d","game_descr":"Empyrion - Galactic Survival","game_dir":"EGS","game_id":383120,"gq_address":"192.223.28.130","gq_joinlink":"steam:\/\/connect\/192.223.28.130:30000\/","gq_name":"Empyrion - Galactic Survival","gq_online":true,"gq_port_client":30000,"gq_port_query":30001,"gq_protocol":"source","gq_transport":"udp","gq_type":"egs","hostname":"The Killing Crew - US East","keywords":"1;1;0","map":"","max_players":8,"num_bots":0,"num_players":0,"num_rules":29,"os":"w","password":0,"port":30000,"protocol":17,"secure":0,"steam_id":90113336513850378,"steamappid":0,"version":"34014720"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Egs/2_response.txt b/gameq/tests/Protocols/Providers/Egs/2_response.txt deleted file mode 100644 index a4110a9d5293ddbfbdcf2334f7613af0eb143ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmbtTOKTHR6h2i%D7ug?T!=Ctx@$U*Jo-Rz=!{9KiDM_)LdfEF?n!#-Ji?usw1KW% zhzl3~648wd7X`(w`{G6r!BxROP~%B*2XXCUX1?>?bM8I&JKszulS%VhGwz2X$dH#3 zIna)^%{(7}L>J0e0@CCo*@XgJW3If83%+9d7>RT#6q5P3&3F5&?gP-hXg5{^x-f;JHV zjfBqq&p9_esOcqRwOTUD^jH=&Q!n2m>&$y;u_G^JV{!@@x(*cjnaqPMmzaV{OgoQI z(q+PDltW&DWn;=si~0gXPIaa=Wo9lTI>wARc--%Yo=h?aDHDteZByf#)MX;}J zW18eLz?s`wI-dUmv^pPyX7fnI(?uF>Kpm`W-MrV$Wq6OziPB)OvLkJ?^`zF@B(V;( z21@L%P)d*9y%P8tvZ(36nr;|YMW>IxYOYyEg;tWGN17#^Tv4cIhr@lQ)k-u2*bzgV JX<%7Z_ybBQACv$9 diff --git a/gameq/tests/Protocols/Providers/Egs/2_result.json b/gameq/tests/Protocols/Providers/Egs/2_result.json deleted file mode 100644 index 7573e1c..0000000 --- a/gameq/tests/Protocols/Providers/Egs/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"70.186.146.133:25567":{"AntiGriefDist":"30","AntiGriefPvE":"0","AntiGriefPvP":"0","DecayTime":"8","Dedicated":"True","EACActive":"True","EnabledTrading":"1","GameModeId":"1","GameName":"","Host":"Inflicted.org | Custom Gigantic Universe | Starter Packs | EAH","IP":"70.186.146.133","IsPublic":"True","MaxPlayers":"100","MaxStructures":"200","NumPlayfields":"123","NumStartPlanets":"1","NumericalVersion":"-1","OfflProtDelay":"1500","OfflProtTime":"72","PasswordNeeded":"False","Ping":"-1","Players":"20","Port":"25567","Product":"EGS","ServerInfo":"Fast EXP | Rich Resources | Easy Start | Active Admins | Discord: [u][url=discord.gg\/WrA2MQ7]Click Here[\/url][\/u].","SteamID":"90113509010829315","StopPeriod":"0","Version":"Alpha 7.6.1","WipeTime":"336","dedicated":"d","game_descr":"Empyrion - Galactic Survival","game_dir":"EGS","game_id":383120,"gq_address":"70.186.146.133","gq_joinlink":"steam:\/\/connect\/70.186.146.133:25567\/","gq_name":"Empyrion - Galactic Survival","gq_online":true,"gq_port_client":25567,"gq_port_query":25568,"gq_protocol":"source","gq_transport":"udp","gq_type":"egs","hostname":"Inflicted.org | Custom Gigantic Universe | Starter Packs | EAH","keywords":"1;1;XxN4","map":"","max_players":100,"num_bots":0,"num_players":19,"num_rules":29,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":3726.2668457031},{"id":0,"name":"","score":0,"time":3685.2426757812},{"id":0,"name":"","score":0,"time":3677.6577148438},{"id":0,"name":"","score":0,"time":3676.8588867188},{"id":0,"name":"","score":0,"time":3672.7680664062},{"id":0,"name":"","score":0,"time":3669.8703613281},{"id":0,"name":"","score":0,"time":3508.6279296875},{"id":0,"name":"","score":0,"time":3388.2592773438},{"id":0,"name":"","score":0,"time":3382.5698242188},{"id":0,"name":"","score":0,"time":3259.0002441406},{"id":0,"name":"","score":0,"time":2918.9799804688},{"id":0,"name":"","score":0,"time":2886.9367675781},{"id":0,"name":"","score":0,"time":2494.865234375},{"id":0,"name":"","score":0,"time":2174.4692382812},{"id":0,"name":"","score":0,"time":2085.283203125},{"id":0,"name":"","score":0,"time":2034.6342773438},{"id":0,"name":"","score":0,"time":2030.0445556641},{"id":0,"name":"","score":0,"time":1525.6903076172},{"id":0,"name":"","score":0,"time":1489.1007080078}],"port":25567,"protocol":17,"secure":0,"steam_id":90113509010829315,"steamappid":0,"version":"34014721"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Etqw/1_response.txt b/gameq/tests/Protocols/Providers/Etqw/1_response.txt deleted file mode 100644 index d73b0e85f4ef4f1fa3023b47cefa13357e0f7379..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1736 zcmZux&2Jk;6rZH|Xuevh0;$JAv=S;f* z&T1l!wMqqn@4E~5UL~{St0_X1FwImXJ&{zq>eTC|MkHH`d!g`&^@4X(__D?i+LtPKR$QT_IH7rqI+j(Wc45sft}R;_9q>rh zL{Ex-O>qCb!KHy@;P7RNsVkxOcv$Z6p;_r_qT8}1g=(D-kUR`^e-8xhYN-aABB`n& zKL=&RL9zt7t0HL$Wyo?Sd&qyRja0!Piu({(H#`~UinQ^Y1;X-3OdqB+$MOw9_xY)y z6%N>dZg`4Z2|GBJsWg8t&OQ`%x5+iuDt)Yf454mcILD7tiL?|O@ zo0Ih|>4qXDsSgDbHJq1u6muCUOqIr>Ww_DMm#hhKHyP3>A^a*R9<&rwZSsf*LvNhO z9yGWdLfg#{6Y;al9v6^2+uuudqAdTqO__6`DV%x%eQ_RDX}xs3Rl@+TjD(8Ao&wp! zQ;=<7XgyTn=zI-epxD!AF!NBP^Ndr_#9yKe_%an{U>tj}Q zndP!#3FnaM`sa{+SE@63dszMv#?AZ#>P$zlf)_%QSbp%g5^)7-i;uUDc0a<+U@yz5#W&>oQHxL8XSm|F48MBa(=q8-mL^EV~q==rrzc;@%_~Cu8Kn zw?AyBCecAaZi0CZ#@H8ec{A|a@IVuC3&!~OU*6e9!wpy<>e`d>rX-^ufQ6k=Ki>SGO|q$ar3j!pN(vo4W%tieRijU>?6aC&hxKFAn-#?K<=%( Lw=)nL@T30%5(fE( diff --git a/gameq/tests/Protocols/Providers/Etqw/1_result.json b/gameq/tests/Protocols/Providers/Etqw/1_result.json deleted file mode 100644 index f707876..0000000 --- a/gameq/tests/Protocols/Providers/Etqw/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"45.79.200.113:27733":{"adminStart":"0","adminname":"-^3Bloodbane^7-","allowLateJoin":"1","antiLag":"1","antiLagForgiving":"0","antiLagOnly":"0","bba_modver":"bbamod alpha1.5 0.5.4 build Sep 8 2008 at 05:05:11","bot_enable":"1","campaign":"campaign_africa","campaignInfo":"1 2","dedicated":1,"disableGlobalChat":"0","disableVoting":"1","email":"bloodbane@buffalobadass.com","gameReviewReadyWait":"0","gamename":"bbamod","gamestate":2,"gq_address":"45.79.200.113","gq_joinlink":"","gq_name":"Enemy Territory Quake Wars","gq_online":true,"gq_port_client":27733,"gq_port_query":27733,"gq_protocol":"etqw","gq_transport":"udp","gq_type":"etqw","interested_clients":1,"map":"maps\/island","maxPlayers":"24","minPlayers":"2","motd_1":"^1Owner ^7: ^4<{^1BBA^4}>^7-Zeus-","motd_2":"^1All Frag - Skip The Lag","motd_3":"^NVisit ^1www.BuffaloBadAss.com","motd_4":"^3Join Us -^3We Make Gaming Fun!","name":"^4<{^1BBA^4}> ^3#1 ^2No Reset ^2XP SAVER","needPass":"0","net_serverDedicated":"1","net_serverPunkbusterEnabled":"0","noProficiency":"0","numplayers":16,"osmask":7,"players":[{"id":0,"ping":76,"name":"^2HillBilly","clantag_pos":0,"clantag":"","bot":0,"total_xp":24795.140625,"teamname":"strogg","total_kills":15,"total_deaths":11},{"id":1,"ping":74,"name":"^1f^2mio^7f","clantag_pos":0,"clantag":"","bot":0,"total_xp":781.75885009766,"teamname":"gdf","total_kills":10,"total_deaths":18},{"id":2,"ping":120,"name":"Riddick^9_1","clantag_pos":0,"clantag":"","bot":0,"total_xp":10534.435546875,"teamname":"gdf","total_kills":14,"total_deaths":15},{"id":3,"ping":213,"name":"^2HIM-AGAIN","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":17537.240234375,"teamname":"gdf","total_kills":13,"total_deaths":15},{"id":4,"ping":131,"name":"^;GIT","clantag_pos":0,"clantag":"","bot":0,"total_xp":2943.0563964844,"teamname":"strogg","total_kills":6,"total_deaths":14},{"id":5,"ping":48,"name":"^9_^3e^Dc^1h^?o^9_","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":25880.642578125,"teamname":"gdf","total_kills":11,"total_deaths":15},{"id":6,"ping":118,"name":"^7Ram^coth","clantag_pos":0,"clantag":"","bot":0,"total_xp":97.350006103516,"teamname":"strogg","total_kills":7,"total_deaths":4},{"id":7,"ping":43,"name":"William_Gates","clantag_pos":1,"clantag":"^0|^8B^0B^8A^0|^0","bot":0,"total_xp":10808.482421875,"teamname":"strogg","total_kills":37,"total_deaths":12},{"id":8,"ping":140,"name":"^4Jinxter^3X","clantag_pos":0,"clantag":"","bot":0,"total_xp":68.787467956543,"teamname":"gdf","total_kills":10,"total_deaths":14},{"id":9,"ping":247,"name":"^2the^4bling^3bling^6man","clantag_pos":0,"clantag":"^8[FTJ]^0","bot":0,"total_xp":13972.721679688,"teamname":"gdf","total_kills":9,"total_deaths":11},{"id":10,"ping":74,"name":"^[SLUG^0a^vMNKY","clantag_pos":0,"clantag":"^;=s^1W^;s=^0","bot":0,"total_xp":13821.709960938,"teamname":"strogg","total_kills":20,"total_deaths":12},{"id":11,"ping":44,"name":"^>Ward^>46","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":13958.2265625,"teamname":"strogg","total_kills":5,"total_deaths":11},{"id":12,"ping":45,"name":"^1S^8watt","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":18927.51953125,"teamname":"strogg","total_kills":4,"total_deaths":6},{"id":13,"ping":78,"name":"^;alpha-1","clantag_pos":0,"clantag":"^;OC^;B*^0","bot":0,"total_xp":42119.0234375,"teamname":"gdf","total_kills":4,"total_deaths":6},{"id":14,"ping":76,"name":"^1Sissy^4boy","clantag_pos":0,"clantag":"^4<{^1BBA^4}>^0","bot":0,"total_xp":21743.703125,"teamname":"strogg","total_kills":0,"total_deaths":1},{"id":15,"ping":109,"name":"regul","clantag_pos":0,"clantag":"^0OCB ^0","bot":0,"total_xp":38949.0703125,"teamname":"gdf","total_kills":0,"total_deaths":0}],"privateClients":"0","pure":"1","ranked":0,"readyPercent":"51","rules":"sdGameRulesCampaign","servertype":0,"spectators":"1","teamDamage":"1","teamForceBalance":"1","timeleft":338436,"timelimit":"20","version":"ETQW 1.5.12642.33243 win-x86 Apr 30 2008 14:18:50","website":"http:\/\/www.buffalobadass.com"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Etqw/2_response.txt b/gameq/tests/Protocols/Providers/Etqw/2_response.txt deleted file mode 100644 index 58bf245061816c233f858e8582d396213db71737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2063 zcmZ8hONbm*6s?*3|Np;`8eA9`(@B3al?qYQGu`t^rl#AT&Wt4F4zIi3bU&x+y|Svh zdnRNR(S-|9K@ddThzM?CKoB>I7z9_ro#-YJK@lXI7gejZG2LQox^C*ZGiT1}+5Gu}aXxQol7~wH_fezTkt>Z(5OTjP zS;OHrsy{_b+!jq1Mplg3VlJ=ouHd~IXZG466QOp7lCecV&Qp$RFlVC8`ev!BzFHPd z!DVwTW-`Z7y;+pJq=bwsafPfpYz^zt#z@R3?JCEDWm0}Yg+jJsCuXDDe8~JhrNIcr0(**zqWc7MJtkU`$brY3 zAqy4e6m{F{`2D_1&h07-g18)-O^Laz#pB4f6Aa zxsp{WWhN??4%u3zUaZel=D^SzDqP~xG%z^zJaTBTfYY!?qlB0Y#Vl*#UbIA)x)RmY zw^pRH-tL$d7tvfVaQ(6*l^?cw$5$Sw#9ZcS_z6xke}#Up^JZ{IwOq8D8ki+8Zh|?l z&$q!~V7dVULqi%OQ&zPC#?|8FbGoj>bkQmiG>lMo#sb4qe!Vygh3j+0+T=BYHW0MP z!0<2oIG#ahBSJab&maal4n{XRCFGEeXGrdwDCh(jqoo>{GhkfCK8}EiJ*?w}7@Lt% z5Oa_p1!KPBy7^hM;{OV=vuh~SY!AlVN_x{XQ`6&>IvCSeEGy=3BYRw2t!Q1H87OW$ zNsWS8@6wl1T9ay?b!rr42SWeH_Bit){}S1El3LLfP!3?Bt=FK;!L%E&fT{a7F?JDy zL;e*yvDx`WFvX2R4DKfI8WfB>H{?vg4@A@D1TISsZNA0R;WX3r{1YvC*XgzH%GneGmyI zS`_3wFg$%4a@cCyub`FiL!@59F)mFF>K-Pu1%_}$hWHaP+1kv1OF%1RW zh`{ZHH$*G0`Y46#Z(iB5$^*kWHt00T>-B!4j+2X$9JRrCwIlHbMKMmG*$TQI_hD|u z7omza`xzoX9oH0;1(+@6D9A@$Jc)QV0P`l+$~;CwIxZN##(&YYVQom0@BLm3LSMC7 zWR0Gow{KO)Q?}s;KYTsjvX|F6+J@nKi)qrv$B#ZukT!k){^tq9=2O28rM zwDtCpFVm!L-;Vs8AZ>r~$KTS4?|69X#Kd5dJ72i;Y+7m8U$1?VP})6mcW0Wk=hDh& z3DVwo?!2BR?fdtBGV%QnZahxsbl|%;-c2YSynppdTItX?ckU)ghadg%VVZPg=;E!k s?Wp|fqlDwJw?6(LVL1Ngj+1Gx6F=SlGeN>FdRQE6+{u617t>z)f8oI*3jhEB diff --git a/gameq/tests/Protocols/Providers/Etqw/2_result.json b/gameq/tests/Protocols/Providers/Etqw/2_result.json deleted file mode 100644 index cdce7ec..0000000 --- a/gameq/tests/Protocols/Providers/Etqw/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"198.144.177.2:27733":{"adminStart":"0","allowLateJoin":"1","antiLag":"1","antiLagForgiving":"0","antiLagOnly":"0","bot_enable":"1","campaign":"campaign_northeurope","campaignInfo":"2","dedicated":1,"disableGlobalChat":"0","disableVoting":"1","gameReviewReadyWait":"0","gamename":"baseETQW-1","gamestate":2,"gq_address":"198.144.177.2","gq_joinlink":"","gq_name":"Enemy Territory Quake Wars","gq_online":true,"gq_port_client":27733,"gq_port_query":27733,"gq_protocol":"etqw","gq_transport":"udp","gq_type":"etqw","interested_clients":1,"map":"maps\/ark","maxPlayers":"32","minPlayers":"6","name":"^3S4NDMOD.COM ^1ROTATION^7","needPass":"0","net_serverDedicated":"1","net_serverPunkbusterEnabled":"1","noProficiency":"0","numplayers":30,"osmask":7,"players":[{"id":0,"ping":0,"name":"^9D^7|^9S Sh^7a^9ms","clantag_pos":0,"clantag":"","bot":1,"total_xp":28.69649887085,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":1,"ping":0,"name":"^9GMPO^7ZAF' ^HAMD","clantag_pos":0,"clantag":"","bot":1,"total_xp":52.127494812012,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":2,"ping":0,"name":"^1IM^7MorTAL^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":93.390396118164,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":3,"ping":0,"name":"^1Wa^7rKrime^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":53.953132629395,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":4,"ping":0,"name":"^2dr.^7r^2e^7v^2e^7n^2a^7n^2t","clantag_pos":0,"clantag":"","bot":1,"total_xp":83.480400085449,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":5,"ping":0,"name":"^9C^7-DR^9I^7K ^1!^9N^7T^1!","clantag_pos":0,"clantag":"","bot":1,"total_xp":85.792510986328,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":6,"ping":0,"name":"^4iN^3-^7Summ3L","clantag_pos":0,"clantag":"","bot":1,"total_xp":32.464996337891,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":7,"ping":0,"name":"^1Ly^7nch^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":88.513305664062,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":8,"ping":0,"name":"^9HIGHBOT^7HUMM3L","clantag_pos":0,"clantag":"","bot":1,"total_xp":90.546264648438,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":9,"ping":0,"name":"^9GMPO^7RAMZI ^HAMD","clantag_pos":0,"clantag":"","bot":1,"total_xp":108.56591796875,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":10,"ping":0,"name":"^1-^9Tv^1-^7DynoSauR","clantag_pos":0,"clantag":"","bot":1,"total_xp":28.473751068115,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":11,"ping":0,"name":"^4iN^3-^7Spear^3?","clantag_pos":0,"clantag":"","bot":1,"total_xp":155.15991210938,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":12,"ping":0,"name":"^9Ami^Es^Vh R^Ee^9db^V!^9rd","clantag_pos":0,"clantag":"","bot":1,"total_xp":40.822498321533,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":13,"ping":0,"name":"^9e^3X^9e^7|^3W^9iz4rd","clantag_pos":0,"clantag":"","bot":1,"total_xp":82.222496032715,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":14,"ping":0,"name":"^9[^7<<^9] Darkie^7","clantag_pos":0,"clantag":"","bot":1,"total_xp":35.19250869751,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":15,"ping":0,"name":"^f-^9a^f-^7decka^f)","clantag_pos":0,"clantag":"","bot":1,"total_xp":84.209548950195,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":16,"ping":0,"name":"^2dr.^7w^2om^7!","clantag_pos":0,"clantag":"","bot":1,"total_xp":65.848754882812,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":17,"ping":0,"name":"^5-^9a^5-^7bri^5an","clantag_pos":0,"clantag":"","bot":1,"total_xp":88.941345214844,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":18,"ping":0,"name":"^1Be^7avermanA^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":30.935001373291,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":19,"ping":0,"name":"^r-^9a^r-^7time^r-^7b^romb","clantag_pos":0,"clantag":"","bot":1,"total_xp":72.761245727539,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":20,"ping":0,"name":"^9-^7o^2p^7p H^2y^7drO^9-","clantag_pos":0,"clantag":"","bot":1,"total_xp":53.338748931885,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":21,"ping":0,"name":"^1Da^7_G^4]NARF[","clantag_pos":0,"clantag":"","bot":1,"total_xp":98.849113464355,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":22,"ping":0,"name":"^1M^7ilitant^1^^9Inc^1.","clantag_pos":0,"clantag":"","bot":1,"total_xp":77.95499420166,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":23,"ping":0,"name":"^2KiH^4.^7smutzig^7","clantag_pos":0,"clantag":"","bot":1,"total_xp":65.125007629395,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":24,"ping":0,"name":"^9GMPO^7ZEMME ^HAMD","clantag_pos":0,"clantag":"","bot":1,"total_xp":78.860214233398,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":25,"ping":0,"name":"^2KiH^4.^7FeTTe^7","clantag_pos":0,"clantag":"","bot":1,"total_xp":76.311599731445,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":26,"ping":0,"name":"^9one^1.^7juncie","clantag_pos":0,"clantag":"","bot":1,"total_xp":39.761253356934,"teamname":"strogg","total_kills":0,"total_deaths":0},{"id":27,"ping":0,"name":"^Msvper^Nkritos","clantag_pos":0,"clantag":"","bot":1,"total_xp":116.84535217285,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":28,"ping":0,"name":"^9Ami^Es^Vh G^Ei^9golo^3!","clantag_pos":0,"clantag":"","bot":1,"total_xp":30,"teamname":"gdf","total_kills":0,"total_deaths":0},{"id":31,"ping":0,"name":"^1s^9|^7papa","clantag_pos":0,"clantag":"","bot":1,"total_xp":48.102500915527,"teamname":"strogg","total_kills":0,"total_deaths":0}],"privateClients":"0","pure":"1","ranked":0,"readyPercent":"0","rules":"sdGameRulesCampaign","servertype":0,"spectators":"1","teamDamage":"0","teamForceBalance":"1","timeleft":56319,"timelimit":"20","version":"ETQW 1.5.12663.12663 linux-x86 May 9 2008 13:47:37","website":"http:\/\/www.s4ndmod.com"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Etqw/3_response.txt b/gameq/tests/Protocols/Providers/Etqw/3_response.txt deleted file mode 100644 index 19fd0d2ccd8f40c829574f9d9cc6482f5ce249e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 918 zcmY*Y-*3|}5H=uz#5?asJTEk9H+6j)>qez%K-X35E!8EtrpIDCvYn>+>&H3iM6ndf zz8~M+efQ<%h4j|k9#-gTqa6x9Z(sO)5+6nLP6$UEMS595ht`QCytP?cv!$F+=beay z$s?%m#^!hp73dt$Y^o9et42` zbRNaY#UzQw<76_HvL$_Xm|n`$CjT~`bUENb!K^%buty+ee6g8` z)T|e4na1lK$_4lx+L`P_H5M}KZ?G3IKZ4M7 zD42o6pw+W}jQn-j*UJXBmgOBrR8R~4+*gZR(rCMghapc)mk{zp`18VfBi_ruMZY*g diff --git a/gameq/tests/Protocols/Providers/Etqw/3_result.json b/gameq/tests/Protocols/Providers/Etqw/3_result.json deleted file mode 100644 index 54a9061..0000000 --- a/gameq/tests/Protocols/Providers/Etqw/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"83.170.66.44:27733":{"adminStart":"0","adminname":"Rawa","allowLateJoin":"1","antiLag":"1","antiLagForgiving":"0","antiLagOnly":"0","bot_enable":"1","campaign":"campaign_africa","dedicated":1,"disableGlobalChat":"0","disableVoting":"0","email":"rawalein@gmx.net","gameReviewReadyWait":"0","gamename":"baseETQW-1","gamestate":1,"gq_address":"83.170.66.44","gq_joinlink":"","gq_name":"Enemy Territory Quake Wars","gq_online":true,"gq_port_client":27733,"gq_port_query":27733,"gq_protocol":"etqw","gq_transport":"udp","gq_type":"etqw","interested_clients":6,"irc":"#thegroupthing @ QuakeNet","map":"maps\/refinery.entities","maxPlayers":"32","minPlayers":"2","motd_2":"^1Sponsored By^o: ^gTsujigiri^0","motd_3":"^1Community Gaming For The Masses!^0","motd_4":"^oTGT ^1The Gather: adminned by Rawa!^0","name":"^oT^9he ^oG^9roup ^oT^9hing ^1Gather^0","needPass":"0","net_serverDedicated":"1","net_serverPunkbusterEnabled":"0","noProficiency":"1","numplayers":0,"osmask":7,"privateClients":"0","pure":"1","ranked":0,"readyPercent":"40","rules":"sdGameRulesCampaign","servertype":0,"spectators":"1","teamDamage":"1","teamForceBalance":"1","timeleft":0,"timelimit":"20","version":"ETQW 1.5.12642.33243 win-x86 Apr 30 2008 14:18:50","website":"www.thegroupthing.org"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffe/1_response.txt b/gameq/tests/Protocols/Providers/Ffe/1_response.txt deleted file mode 100644 index cc7f9da54a29745b7be49d2fab8f8817acacb59a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1211 zcmV;s1VsD)|Ns9<5lwG&ZzppgMs;pzZ*_BJAbcQ1VQg$+b1WcKSO8{bUvg!0Z)|pD zUt%%@rlTV*+2EdT-l z008)Mc0~Y3Z*OySWpXV>YfUWx0{{R3A^2oP09s*WWjQf1FaQ7m000T%=tKZWWnpA` zc>n+a002*_s6+r$ZDDh0LUM0(Xk~ISGXMYp003?EPecGxd2av!0000hHULBbMsi_k zY(#Ho00000014L3LjV8(0002`siQ*xYjSS@00000MI1;%0B&$?AZc!MbYX04AY^4_ zdM$2sbaMaz0002Pw6;MCe0&Q2|NsA&C;)%~0J{bN04L9ml0sT&IWa+5CR15tTiL4s z16|*MzyJUX|M+iFK@h+1|L_0+&;y#Dr*;Jd*@i_nfdCPbXaE2YPo*6WZQ$Pbi z0001Lc#}{lGzN#L4FDda)E=N?Lqk9YLqGrk00fCOG}AmsUDmO&bd`{mdDyR(B; z_+hZ^Ay5Vm5||`ukqdi=BZp27vPutDAge<-H3VICnZ$zBv>FsZ_Ns8PaA*@u1&yK2 zuT0mEQ_3v|)WJ`;*X2Jv^liLPqE+}ZUU<>d?s7BbgfYLPhBEW>wXjF}G+lt^*Oe_F zVvsp5(a@oUjZ_ePuo1>$h>4Xki%CvtFu(*r{~aw7RZi5EGcvjpE)9E{!wk#?q(DZL zNJ*9QWH&!;jg<_&xfoD|2zC7v;ENfp(R}Nw&%uK4Gr82=lAyJRr7W955!Esg4p@!FXpi=KQudyX#gg4tPoVo{t> zM}}^tNVfEq(&^V$h1g5IG0=op2;ZD7GAbRBm|?V&_MDfd982vCYP-2liYn6w9l~Zg z7ugr=mhBdy#jQWcAi&Q}NMBd=N1smpfCf>W0xqt46~P~8eV zR=3J|V5s^f5mt`0T`Y{KZ@)}elKk@^y##3#%sV(#ga@Ie7d_M3(T@EQrH#8;UCi0x z8bKAqc?+VnKy~>l_Bhu`ur~|C&5f;O6Gm5?qrxdtE~nJ-6I9;Ghna&2^{7lq%3y80 z3?@lvB^yX^M1m`U8f&>hUpz5dJ98#0u*Snip|r*WP}@S|ZG?4rwT39WDA!Q`n{ ZalW*`Yt`1AHaLHaxgwk>NHQ(#)qp?C0kQx9 diff --git a/gameq/tests/Protocols/Providers/Ffe/1_result.json b/gameq/tests/Protocols/Providers/Ffe/1_result.json deleted file mode 100644 index db4a2fd..0000000 --- a/gameq/tests/Protocols/Providers/Ffe/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.91.114.247:27015":{"coop":"0","deathmatch":"1","decalfrequency":"120","dedicated":"d","ffdev_airshot_height_threshold":"72","ffdev_gibdamage":"50","ffdev_mancannon_conc_speed_horiz":"1024","ffdev_mancannon_conc_speed_vert":"768","ffdev_mancannon_push_forward":"768","ffdev_naildamage":"10","ffdev_nailgren_angleoffset":"360.0","ffdev_nailgren_spittime":"0.2","ffdev_nailgren_streams":"10","ffdev_nailspeed":"600","ffdev_ng_nail_bounds":"5.0","ffdev_ng_nail_length":"5.0","ffdev_ng_visualizenails":"0","game_descr":"FF Capture the Flag","game_dir":"FortressForever","game_id":253530,"gq_address":"74.91.114.247","gq_joinlink":"steam:\/\/connect\/74.91.114.247:27015\/","gq_name":"Fortress Forever","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"ffe","hlxce_plugin_version":"1.6.19","hlxce_version":"1.6.19","hlxce_webpage":"http:\/\/suzysworld.hlstatsx.nfoservers.com\/","hostname":"Moto's Funhouse | Dallas, TX","map":"ff_resolve_b2","max_players":20,"metamod_version":"1.10.6-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"1","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"0","mp_fraglimit":"0","mp_friendlyfire":"0","mp_friendlyfire_armorstrip":"0","mp_prematch":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"20","mp_weaponstay":"0","num_bots":0,"num_players":10,"num_rules":80,"os":"w","password":0,"players":[{"id":0,"name":"Divinity-[e9]-","score":2,"time":3943.185546875},{"id":0,"name":"Gooster-FkM-","score":3,"time":3663.5080566406},{"id":0,"name":"Zade9110","score":0,"time":1863.0635986328},{"id":0,"name":"Headzy","score":0,"time":1349.3221435547},{"id":0,"name":"SmashBrother13","score":0,"time":831.83477783203},{"id":0,"name":"Ryo","score":0,"time":512.84637451172},{"id":0,"name":"FrailDog","score":0,"time":411.6721496582},{"id":0,"name":"","score":0,"time":327.32794189453},{"id":0,"name":"kro","score":0,"time":50.027606964111},{"id":0,"name":"npm install deez-nuts","score":0,"time":22.838262557983}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","secure":1,"sm_advertisements_version":"0.5.5","sm_nextmap":"ff_voltage_b3","sm_playersvotes_version":"1.5.0","sm_saysounds_hybrid_version":"4.0.5","smac_version":"0.8.0.4","sourcemod_version":"1.7.3-dev+5225","steam_id":90101380046455813,"steamappid":0,"sv_accelerate":"14","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"fpsmoto@gmail.com","sv_ffskillutilityver":"2.7","sv_footsteps":"1","sv_friction":"5","sv_gravity":"800","sv_maxspeed":"600","sv_motd_enable":"1","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_shadows":"-1","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_spectatorchat":"1","sv_stepsize":"18","sv_stopspeed":"100","sv_voice_inputfromfile":"1","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","teamswitch_version":"1.3","tv_delaymapchange":"0","tv_password":"0","tv_relaypassword":"0","version":"1.2.5.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffe/2_response.txt b/gameq/tests/Protocols/Providers/Ffe/2_response.txt deleted file mode 100644 index 5c04b9f3210d7d8d9b3484b419676a8337d6c4bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 995 zcmV<9104MS|Ns9<5mZ4;Pg5W*AVon_R3Jl7K~q#9Q$hc000005&&d(00A*BGA=bP zFaVKOIWa+5CR15HE0a9{12kWNzyJUX|M+iHK@h+1|L_0+&;xq!RR9A`cxs=iq9)R5 z>S=)nfB*mwP{05*00vC}00w}HZ%TTmOae3vA%YDLP+e*ENr8S4MImokI#F4Kwh=YX_a6NM)EXMv5eF>6(x!fe^Aa zHDk~*6n@(1rY9vun8Jb(7;*`0;Mf>Mxop`HMZcbKtwpKL6KSN`%v?wWYvit(u}``k z-xwNXR&$0;@$JWbJ$x~~clB(Xm<%X#27xyf7)>-BGN!5-8441hf(3~0zLxf_2};o@ zhJ?MOpPLvALo1J1W8uf9OZWCWqRxLL*PVUz&RA>!T(xBpXp;+4n#n>sCMb9eLeDv7 z%`|(Ak5&R!#uS+zwrd^jbt0Ul zJymx|gk>)*Pvz`w)9ag@;1`X=Oy85%x0Q+0nrWZOy4HY#U=fokoP z6)5sK;A8ln2v2h+GTQ^UHgwvrs}4md5+A3R57HT5l2vE|-PiHl#|zOKyV(x6$8SES z?9y7QuR-LDUI6VevdtwJCCjFqIui+Yx0x`rRkVj$;V|+Gg!hpsvga+#HcqLpDSTm4 zCePRR0R!x|g(9`)3nXHPwtep|}O+H1m6 zqSl4jX4?2OVEMY-sj+36!;I}Ko;W#TpH5YgQ6@{ymI08&GnQh4W`aw!lO3nol+@_! zoQf+>&0dOYZxUP--(w-J1_~F8bZ!e|?a4lOhl28o8XXU{_@1RsdGb&tEP0$ZR$x>^ zG(%NkXz-GTI;8KrBgz+BBM3CdrBlObk)WWMh}I-%U2$C^2uy`l($~08Rfcy^_e(S| z_3+;5XLE*?LR<59`AKJr(4Utwi#f;FFiTaeyr|b_+YPK`Ri&d#R;5a^G$kbl{5uiRB8*A`Qwg<{QH`zbr3t9b RYIjY3F64@Ep&)!$CVGcpuyg1BCql|Ns9<5hFo!b7*gDWkPvQVRUtJWguHYLQY)(W@cY+aAj_0X>w%%MsIR- za%FRKMsIRuc4cw^Mn)h*VQ_SHa%CWNXk{QqY++{r0000A0c3Xp0WmHzE;TMN0MUnO z0Q45;x*9+MjA>SHbY&oBZ*m}Qc_3n8VtF7`RsdSw0{{R3000VndISFj5QzgpriPgS z14e^DNRv||Q%qA6Q`E@N007DAHf;Ah<5@dY)TfH8^q-P2ZrENGVQXs{xUGNKf)lhs zT#gsgEMZ^n-abwDn9rd#0$Ycb(?EkXzJipTy*Vc0&uhYM4udosq<~Rvv|2>*hTf=x z5mKg-T9lBf4MGr`qgtE;#LE>*q*VulMH)k4i^`E!TEqmk;l2s6dKGCymjIc1A3g%a zT%*HK^LDju^5sNCcw57yy~%57;!@M!XA@oO8v9wb2MT`@RF2>Gz6 zy3TgUvw$Muw0fwiy8M#?Lp@K4Q7qP0FQIXA9AQLx$_+L_r|DwjF))QlNeZH-CF33y z-mfdADY@Wo#ZXzs>R57h$iKkkg>wYmvLSMt7Mb@zu5vxWX{BnYa{wR$7CP8M5qdO; z#SpmPUhain@%2%435pF$kzqJW~*A4 zV|T^3%+gln+0TA+k=wcqOgL7BM4DarSQ;8(fSZC>Nlsy^C~ImR742tkD+Q+ld7A33 z7FnIF=3zV;HW_ic_Gk%;R<6W6Q!=2Iolr&S0l0`Nv!HH+X5!T)7Zf8#I&l#eG?id% zB}>AA2}&W_UjX!y>9$sw&beA^jdI6%l|wuRofUtabBWqFP+W3cfF`FcYLiG=*kZE!d RmsP+1F64@Ep&&`hklJ3>gjE0l diff --git a/gameq/tests/Protocols/Providers/Ffe/3_result.json b/gameq/tests/Protocols/Providers/Ffe/3_result.json deleted file mode 100644 index f259052..0000000 --- a/gameq/tests/Protocols/Providers/Ffe/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.91.122.164:27015":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","ffdev_airshot_height_threshold":"72","ffdev_gibdamage":"50","ffdev_mancannon_conc_speed_horiz":"1024","ffdev_mancannon_conc_speed_vert":"768","ffdev_mancannon_push_forward":"768","ffdev_naildamage":"10","ffdev_nailgren_angleoffset":"360.0","ffdev_nailgren_spittime":"0.2","ffdev_nailgren_streams":"10","ffdev_nailspeed":"600","ffdev_ng_nail_bounds":"5.0","ffdev_ng_nail_length":"5.0","ffdev_ng_visualizenails":"0","game_descr":"FF Capture the Flag","game_dir":"FortressForever","game_id":253530,"gq_address":"74.91.122.164","gq_joinlink":"steam:\/\/connect\/74.91.122.164:27015\/","gq_name":"Fortress Forever","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"ffe","hostname":"#AssholeByNature [ABN]","map":"ff_openfire","max_players":10,"metamod_version":"1.10.5-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"0","mp_fraglimit":"0","mp_friendlyfire":"1","mp_friendlyfire_armorstrip":"0","mp_prematch":"999.000000","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"15","mp_weaponstay":"0","num_bots":1,"num_players":0,"num_rules":71,"os":"w","password":1,"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","secure":1,"sm_nextmap":"ff_openfire","sourcemod_version":"1.7.1-dev+5167","sourcetv_name":"Vote for my baby TV","sourcetv_port":27020,"steam_id":90101382590690304,"steamappid":0,"sv_accelerate":"14","sv_airaccelerate":"10","sv_alltalk":"1.000000","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"5","sv_gravity":"800","sv_maxspeed":"600","sv_motd_enable":"1","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"1","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_shadows":"-1","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_spectatorchat":"1","sv_stepsize":"18","sv_stopspeed":"100","sv_voice_inputfromfile":"1","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_delaymapchange":"0","tv_password":"0","tv_relaypassword":"0","version":"1.2.5.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ffow/1_response.txt b/gameq/tests/Protocols/Providers/Ffow/1_response.txt deleted file mode 100644 index c1089a410efe33b599e1d7193210e68750cede16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 570 zcmaKpPgC145XF~X=x{D~eE~vT{x-Le;x72Q<%$W$Fm1iPK#iuNlCW`*!K`H_aQ}gQ0t9P=qRGOsg?GOURjgq@jzeD{U;}pENyE%D&y@o z*-j(8QMy*7hxg7RxeYdnPqrPNIFGEb8o5SpQt($oo{0uamYNqKMw|>;Dt@oD#x)Hj zm0u}I(+-~r3gQ>y6+JoS2{ztuCx?e!*Nyy!o?07dn^n+|vo${ag4{&pEootEu|kGybTk^nz62pVfF0P` G{r&+U2)CNy^Q zfB!$l*S2jtg{~6AuC$-Z2*Uuzb@X>+$!RW_s*up67GW3Xw9ie5GgtBl3?ao)>Ygta z-jZxcsv{bnq6N!4%aUJ%i440K_oIHlX__qV_{~^r+*S)Wnf4X@Z08&TZTUCh#!FoV zBw?h8|9<9PQ#9VeltRRp#TdqAW!xiG46EW{vMxv$Mi-u;cR2KtetZ9S&Cb#SFR%MI zcob4e2v;g!V;vZ^cfngebyH7EP&p{^E+!EUBUCk8^c!4~z%aYY25?@&ZP@^Hpws>O E2AzR{rvLx| diff --git a/gameq/tests/Protocols/Providers/Ffow/2_result.json b/gameq/tests/Protocols/Providers/Ffow/2_result.json deleted file mode 100644 index b4d8ec6..0000000 --- a/gameq/tests/Protocols/Providers/Ffow/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"104.153.104.205:5476":{"AdminName":"[TKC]TacTicToe","AutoBalanceTeams":"0","CurrentMapListIndex":"1","FriendlyFire":"0","ServerLocation":"East USA","ServerMessage":"Server forums are at www.thekillingcrew.com","ServerWebsite":"http:\/\/www.thekillingcrew.com","anticheat":0,"average_fps":1,"dedicated":100,"description":"Frontlines: Fuel of War","gamemode":"FL","gq_address":"104.153.104.205","gq_joinlink":"","gq_name":"Frontlines Fuel of War","gq_online":true,"gq_port_client":5476,"gq_port_query":5478,"gq_protocol":"ffow","gq_transport":"udp","gq_type":"ffow","maplist":[{"name":"CQ-Solarfarm"},{"name":"CQ-Solarfarm"}],"mapname":"CQ-Solarfarm","max_players":64,"max_rounds":1,"modname":"FOW","num_players":0,"os":119,"password":0,"port":25621,"round":0,"servername":"TKC 24\/7 SolarFarm [FL] use console","time_left":48393,"version":"1.3.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Gmod/1_response.txt b/gameq/tests/Protocols/Providers/Gmod/1_response.txt deleted file mode 100644 index a911fc3e79b6d7766605167675d0f5fdd8557b9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4194 zcmZ`+VQd^n6`nMy2$fKU1nN&#iV#HtXYb;~2~;AsH#x_NV`E#fD4=C-ckXs_vpd_F z**kAB1%zlKK!_iuR1jzjsVFTpLHs}hA(ci+(}EO0RQ%`im7 zyRNL$&iCHDdGp@)-dk^OZf>4<_r}sQje&Z^K(*s>_sD!|M{0IZ=7o;Y>s<%w;?5PS%Sl(xyt4I+Zc09hs~zFOjG2ec(Y7 z_sFi=hTR3|!D1PVA8&J;v=3ja1*?=tZtm7RQvWy*eBt;e5!>GB8h+F-_;j(sm6Cp;~^2J6Kh{A;t+Nq+tD?}8Klk;3EGo+!p1CLo zine8@QR_@OgD*e*HMo0nA)3ypI3>INTDbP}^Kj^)f-A*D09sY?eldJBAh#|&=dE_k; zMu~*UTTlGN?LPk}sLgO8ywfFfD)X$zb>cOODk@+3r3pw16HSGz`TmsK_V4{NAZHlb zkPaIOMP*g>xB1x&iI*ug(%TBlTR%7(kdr+1PEr+9op73YYfKww=>==$7UGVubj1iHul<-v((eMl;~Y3 z05a6?cHP`#HUII(UuTJ}e8p&7c5tM9_WtY7wkhJ-{M+lZWDOMrmpRTpg+?t`rk(6R zjmKw+;8Egrpx~g_!{u3m@JGpk`oXF^-~8BjW=KPx<%&+$s-SsCzcI7rOn`m6`_1>* zBZTrW=9)GIi-~Vnyq!tqrUX+OP$V%9d=fKi5=1vjNDYgKik4yz6)cNNa>yrX9#SD> z@AT5FhJsxdMxsw?olveSs6}JcUQ?hHVG%kl?1^cLp4nFr$dW)UoBmo#15W3ClP#%0 zdZu&Q%lZnSx!@@{TG>;aWw9t*T(JrVl@iX|9@*nlqgB0+?i({Ux;tpNx?mN8HHNPT7NV z%-!2}f_coJvDStK1E#hFTXt%dp))Mum^9nAa97=w>tR!73>@Wom~tJBqFEjx#5+`N zut4~}iMEXKF<=Aj)Ka?Mv>ZUt1|c-kVI(dyii{2JW33kIYj7Kb1{&}nlt@&KJz)?O z2=vg}22qoPcU;0f2IXk>(64XHL7-R;+tgqP7`J^bgY4@_F@~GR{_B=rpNno8A`14)4fHyA0CwP%RAJ1T zMZ13&8~qB^Mln?E0NxF06fwaRrn9>u05pn047&l^Vve*ZsI}(S20gM`G-ZM5Q@uwC z8iTuUH;iOvXkPFmmX^rwwTBPO!A?hF!@c(A9Yhj&#Ew@;#j9JLsK6)QFK%*pjZ& zAJTPh3BLpF7x{RBwx5Nzd+*%j+Q29t(G-4-!KDC+#^4y6_PcK6fVjvp8Q(^>)p164 zu^1e~JOJ}XWf(^IZXYA4dea!ex}7I>mhHGbD?t{G&N(7!(dcbO;M2G*clzL{wWN#{ zEf9xM5yrahxg!qntR==r&9>H2eZgp}iQX{Iv#rU!QYAlswbD0(zGiy{G z<$+4#7&#-?$SKdp(9RBP+w#Y3D1=~RvaVQa=gjB^SQ&FJzHZP6+)x?uNn2OPSlS*Z zqo-^Ql`#^9embTcdrY9Q5i`{9?z*{WxRl)#8a0alhujC9>4yDo;S;uK~Mz8>DirZ)*o}-d=EZ}G7jGeg;z5v{f{5#@>Ymx2-OOQk-uJ$GRrTKY zUd`U#-rnj-x7Nn|MeS^A%p+$tqC%@(XX{+Y*|@a2vbw&!=6K6*Uv(Nacfnr_oZWTd ztl=0%JARlD$+658im{Xo*}ccE5athsgc)g5~D-ao&n zQ*X^Uar#<>M?1hm_H$x)_XM10&znP?l*pKH-KD(0;4WJC+}wv9w7#*jvEi*RcRQQt zD8NUKeb7Ns8Z9j?^)N>>0A1O+-9Z;Hi-@eBZp@?OfStPYP6us-i3lkVg{9r?o$a9W zL6#6mB9`n87?PIHN=a|4&Fe*NuT4|TB| zIW3|SOZ?fp<)IW4793sWMVHbb$(T0Z} zes)i!LQ?o|!4ua{d8oZfYmP^-P8?6-SQNLspZwKE7cswy`$fd$@88?#JRHwy;hYpX zdSUy=HrmRAU}VF6`NcPF)RncC0L573{Vr)28+3)>jK+z6_}*RXI{CQMMnT#aa32eN zcl)Wf{er%I^HHn#Mw>TVMhE|a4$Lu*pa-)?6P+6fQ$L~#2aH6hZY&yeAxXyYh)4xc zC`1PTB6G78>o7qs7$IgoNp9wZha>Rzuxj{NYafRquG-<^(v&IEEM2G~L}&srDXvNxqXPG`sz?P zzz*|R9!rt)$fRs?Y?Wu3BuWWcMYW`w=BYAeoTBGDbSOkbxY7djTL#Lc=*1Yire3SN zb@&wV$FQ#wq2ruGq_IEEe9V{_u3u~`sFpEvh$w|p38u1udN?9l1k7|w-EexaCW1bV zNog~z605axfsvyoSs4<_6cV^xhKIZ)fb1DfsV>(`N_fOZJt|2-&;+N9Dvgp@=3Kw7 zLSSeE!1l&zR97t4G$oZ-LxM8_X|Zlj^ibj~BhpXtwr^#qAd|1SsNyPNKO!b*6I|Oc zPX>e`lqDkt8T0K1R`=3hrZNy%U#4W}!9fT&f00|OqbK;zLU6Qr(0BD5F(oy1fJNsC z$(|T(+EEELc8ue=MWD+hp&=vtu^>Y#5ZitrIDx@LGe4y&JdE-zguEZ17L7e7$0CBa z#gxa=Af16x4x}1^)b_z#YlAiSp=iW0lp2=qW2Dz3ArzufSxSJU%_M2;^Aa(D7Xmh# zipU`03e8V8wbBE|1c3XPV@+)609a7n3nq(Ux31dh*%A*n#-Tp&bAtbtH-^`n@H*@p(eE#^x^9fh2NBXWdtzNs+a@9g&p z9#BeMXU=fu(QE4g#cO;RA?sJb2cnv6Q{6Em|WBB<(ON+UFJBWau+OFDRqwWf}<9y&~-4HEJsCO z^JZE(;XIwr45+TjhFW{VhQZXMV6rXzPC1W#2(s-?v9jnHpy{Nbp6$u({%;4Bz zPNWXFk&tpRNd$2YH_4DOF1bb8Y(hLT1l==1JwZ8~Zia{3jK;PvF)~CIQW90z%i&=` zV6ZX!xLwcT%~%c<^atEy+1 z4JO8m#>9Ys@rE~v7ZYyAqsFr*PhLno=*h%r!o|3LRXwxJDmO1I^}W~cef566n(giF z?X!<|ITa?_5K8eRTGgx3vSBe?7HM>W&4>;4bw5swEK9|SVIF#bf>Q)9B03aNs%THU zxkNYLmC<8>sJTZL@D`TSI2V^oB_?d_(U){Gd^zI{?f7V+W06|_rw{{sw00T6V(I$+ z1s{a=UAeLkB)5Bq=nav};tgiY^e8N!oZY`l&sQ#EBMOjw7}(Vh&acoqnBT1n~RY2UaMXC@G4@pn)Ko?ghMl18~pqcv)+fxwyDzxHSam7KUt z7K7+jT}3?|owbob0hQ9apo56{_}8EI=v-wcJt=Zsq{}Y_POEG0_o&mm@Pcr3Kipn< z_q`sysB@7%hiJ6lLqELJqbeFVU6h{;Ilovs-=o#4IPFmFi)(A4KA-*he2;RZOB5TK z(0%ySy$=CO{Cc>n;)$Rl?YkL>qnQ?R> zljYcOGUPN`54{e>+qyLN}}xK7Rv@zNMWZ6(IH z)o3*vi^ozPZBSmueyGPUu6IEr94n_2qb;aOa|d!P@=c*ck>D!cFO^noD&AEAi{io5 z7b!cvsYEiI0ZOGJ7udbpK?$2FImmFu@PXD2)9WiyA5FpnJbcob2cT)Or%px;ltgK# z4n|_*)ub=YG)V>-NyQ{C^g#CAlv?O&49{4&(6qS_P(FjQr&HHywy_v-=q`#D$lAo9 z6pB4L8+)2Hq5tCXSQe@5_d(p3t?ln-olwv=#~|VBSF^u^=B$`?q0nUS?vp4i9c2T9 ziFn#3xTf>K)aZq{&hJUqw`m;@Rt;Sh(7|bi>Y+fUX=sp}UB2MUPC+~rk>LSf?n~v^ z%ow)F#HXd%)WU6G+Ik|#9QuF5+}_2uify4KRBM;*;^vgspc-d+jDEd`(xaL zs8FXJzQ?(;Cdt#%=!C6xG8tNGhg5}5lq~1&6RudJb&vp*!rHMmX?>AWR6!!@li^Yu z7b6ZPGPdj-G;4ZgqZO285Vir#{IQOT2gFmwA^CT5kJSX~a{6=qQ73%jH)nu-E<+)M zy2vePSLhd}psbx+bq0qYHS~Xe1cBv9L-eOx9XdS5Jp6YE0=m=57P)>bAP~Yg1oGg2 v&r#q9kV6h01n+th1uyX+;@8FCO~hNSAs5AeLCE^6>Y1M2M4W-$dGFQx{?&W6zrVkK z{+TmsvlpCEXJFzmMRrEhME$3K4b^YZA)6(*%+a`KwUV$GT1NtCi{ z&MnslisV0s_x27W#Qok8I$h}Nj2!Xj)u+!=JAW~_@Pd>lgWI3{@$)aYf-AjqAJ9k8 zx^wfXv$Vdkz8bdMtH--*?O>B2l)HmxX2Q&cg9LvL-!%Sa^brkot7+%$2{1& z{nbcw`T~}pef8U(H$bod@Z2d^hx%_1vOZjc^K3|Ydh8b}sT77Qt?v@6}AWM(YIXl&=SQr1|W&qEk09dj3l zb2_)+SaVl%9nD5kq{7Y*Xu-2Y&V~ZL@`;R<6bYL}nHq^98tX&z^^I^cV%CS;FafA* z*OmFvxwk1Rxyy}EFmJ-d8l{lj1!sJ@Dt{02qp8ReF&rXrSGLgA#^8Q&M8Oe+t6vq? zlAChLxyt0M5;!LkSDnTqU1atR6C+LQ7_jAp?s8WCt9XiR-leF@%$LH&-$>M|LT4<6 zp~}gWvs`6}VeS-RFHUFtnw7ldk|>u;0B&zy40bDM2c4EfFTn2SQ{+(QhK|uWg{W99 zSX>3qL?Ik%a*ZCxwuWlkSwdn;NnpWg=e5jXTt}yb9w=sa1)uhiJgdC=v$#NX z+?i?0-hYdG=(&FC=xxsP|Fm{c&@irTR57)z-3pg7KTDP})NP@OngcA{wR$OUx7IO@U^!6* z5cpvMC=HYXrowd}OM_p5G;yh<2j<<%-9t@%+#P=gylEyC2EY<5oz|N3#!DdwKy00Z zkF)JP4vQ?ts$;l(*J^o)hC>hIvu0IT1JmI$WjSHuDI_`dW7F}A32%A`TgRP^s|A}> zBiEGO+FG}@R+SN>BvDc>OXU3cpfv`$RBn!;QQnj(a<1bvSsq3`Q6Ai>m>(Rm4tdpZ zTwvcp8iS6d9^rK$4hP89MkCzHgqzqWrA4v?!@Q|w#NrquLSuqpB9Q?@=!bdL9(OG% z(OXp44I2D*dx^ysOR|iHjj8KM_ndIM3W=A|NV5{}4m#!S>gY~-do3}GB$iH-c=os*SSJWQM%MEsz0$EyOU3hL-e2~C5F zYv>581CNY~%#FB?_H0z7n#bL#JXnTU{`a8;Bc&2CpKl1?L?9eZf3WwSTQ{ylb{H`% z8|I#EhzoDH33Zp;TywwS{N{7;sn0jq4Q_##Bwiqe+o-l&ZY=z6)E|`QSVIj~DVlS; GP5%O!Z^)_u diff --git a/gameq/tests/Protocols/Providers/Hl2dm/2_result.json b/gameq/tests/Protocols/Providers/Hl2dm/2_result.json deleted file mode 100644 index cec4a1e..0000000 --- a/gameq/tests/Protocols/Providers/Hl2dm/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"208.94.245.130:27016":{"cheatcontrol_version":"1.5","coop":"0","damagesound_version":"2.1","deathmatch":"1","decalfrequency":"5","dedicated":"d","door_version":"2.0","game_descr":"Syle22's Roleplay","game_dir":"hl2mp","game_id":320,"goto_version":"1.3","gq_address":"208.94.245.130","gq_joinlink":"steam:\/\/connect\/208.94.245.130:27016\/","gq_name":"Half Life 2: Deathmatch","gq_online":true,"gq_port_client":27016,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"hl2dm","hl2dm_trail_ball_version":"1.1","hostname":"CoLD Community Roleplay |Purge District| New Map |","keywords":"alltalk,increased_maxplayers","map":"rp_Linesse_r3","max_players":32,"metamod_version":"1.10.4V","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_holiday_nogifts":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"1","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","num_bots":0,"num_players":11,"num_rules":110,"os":"w","password":0,"players":[{"id":0,"name":"Burza","score":-1,"time":9244.4755859375},{"id":0,"name":"0p$ K!ll@ Ãн° [DG]","score":128,"time":9186.2099609375},{"id":0,"name":"585-200-7340 SEND NUDES","score":56,"time":8766.9306640625},{"id":0,"name":"0atmeal - Op4℧","score":1694,"time":6038.1142578125},{"id":0,"name":"(λ)KuroShukun","score":1171,"time":3188.6105957031},{"id":0,"name":"DoleBananas-Op4","score":488,"time":3008.7155761719},{"id":0,"name":"LaWlRuS WaLrUs","score":112,"time":2540.8051757812},{"id":0,"name":"","score":0,"time":2205.4792480469},{"id":0,"name":":: AP :: ThunderShorts","score":254,"time":1466.3548583984},{"id":0,"name":"Blanche Nègre","score":421,"time":1449.3155517578},{"id":0,"name":"","score":0,"time":9.795464515686}],"plr_version":"PLR Version 1.2.1","port":27016,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","roleplay_mod_Sylesrp":"2.0","roleplay_version":"2.0","rp_spawnprotect_version":"0.1","rp_tools":"1.0","rp_version":"1.3","sb_version":"1.4.10","secure":1,"sm_admin_cheats_version":"0.2","sm_admin_sounds_version":"1.0.1","sm_adminsmite_version":"2.1","sm_advertisements_version":"0.5.5","sm_doublejump_boost":"250","sm_doublejump_enabled":"1","sm_doublejump_max":"1","sm_downloader_version":"1.4","sm_evilbeam_version":"1.0.100","sm_funcommandsx_version":"2.3","sm_ion_version":"1.2.1","sm_nextmap":"dm_overwatch","sm_nukem_version":"1.2.7","sm_quakesoundsv3_version":"3.4.2","sm_ragdolls_version":"1.2.4","sm_rconlock":"0.6.7","sm_supercmds_version":"0.51","smac_version":"0.8.6.0","sourcemod_version":"1.7.0","spawn_version":"1.0","st_gamedesc_override_version":"1.0.1","steam_id":90094492254047239,"steamappid":320,"steamtools_version":"0.8.3","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"600","sv_hl2mp_item_respawn_time":"30","sv_hl2mp_weapon_respawn_time":"20","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_report_client_settings":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"100","sv_tags":"alltalk,increased_maxplayers","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tf_arena_max_streak":"3","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2230303","vip_version":"1.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Insurgency/1_response.txt b/gameq/tests/Protocols/Providers/Insurgency/1_response.txt deleted file mode 100644 index 89f2367c5e8a3db6a64f050dfe43409282aaf46d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 536 zcmYL_&u-H|5XL8ze<}fi3WwfS;sTN}Nh(z+DyXjQB&Jb}>Z%n)k+qH2?ofMet=CQr z;mi|o=M^|}=ga{(!3}Xm;swkm0(DOF{pOp|=&S3xc5dm&b1IRZ#7rlBnjnwJ*rFA2 zL*np|CKb8cnT$P2Wj+~?o|_X0QuKo~@&yY(Z5JY9d|H8X-U2iU1T$!K^tQgOx8TED zyt1>2?&fYI>LM>`jw#o&t~&KFD>FYYa!HZ1K$A=qu&njP zVqLvmTTQTD`U57!aT5Ihu(oP+9!@jhVGF~&Xv=%SEh}{ zQ6GkdI3wO!HKVa)0-9>F)wyWH>wUL3d_z2r*{k*=xUM+;{n3KMf>UCpJW}S%3VwZD zS?~fQxT?gLPq_u7RFVP8SQ#!U_UGMq6Q0sJhN$wopvdjdu?fcmV`zKOQ2NHtn*2FAcq2JtQG(^c7N=F5wkgwr;Hd0=BLDt*;ERgBIPU3 j9f","score":0,"time":60886.8984375},{"id":0,"name":"FRANK IS LOVE FRANK IS LIFE","score":0,"time":54908.07421875},{"id":0,"name":"Lurk Skywalter","score":12,"time":2115.1374511719},{"id":0,"name":"{KOFL} Snipz18","score":13,"time":1503.4805908203},{"id":0,"name":"Tuna Donger","score":6,"time":996.96612548828},{"id":0,"name":"Zig","score":8,"time":975.10668945312},{"id":0,"name":"Not Hitler","score":5,"time":441.17144775391},{"id":0,"name":"Jaxified","score":2,"time":236.81280517578},{"id":0,"name":"WHALES","score":1,"time":144.89083862305},{"id":0,"name":"DStainn","score":1,"time":144.43766784668},{"id":0,"name":"[CryO] busdriver | Trial","score":0,"time":110.6251449585},{"id":0,"name":"Alex the Amish Electrician","score":0,"time":59.000080108643}],"port":27015,"protocol":17,"secure":1,"steam_id":90099821403782151,"steamappid":0,"version":"2.1.6.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Insurgency/2_response.txt b/gameq/tests/Protocols/Providers/Insurgency/2_response.txt deleted file mode 100644 index 3270204e0ffc82ccbba311bd5d0a7b9d748d55e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmYL@u};G<6h&Xuts7g}@&Q&ziqydq11)4gq7_m{Wa8)a3EPQmC!wO9`3-)cLl=I} z1PQ@*&T`LG(O`{?T#*W*j7gnhXWF&VPI$`>SB_Eokgf G1AGG#dsLtR diff --git a/gameq/tests/Protocols/Providers/Insurgency/2_result.json b/gameq/tests/Protocols/Providers/Insurgency/2_result.json deleted file mode 100644 index 7d5a71e..0000000 --- a/gameq/tests/Protocols/Providers/Insurgency/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.91.115.228:27015":{"dedicated":"d","game_descr":"Insurgency","game_dir":"insurgency","game_id":222880,"gq_address":"74.91.115.228","gq_joinlink":"steam:\/\/connect\/74.91.115.228:27015\/","gq_name":"Insurgency","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"insurgency","hostname":"Weekend Warriors {FIREFIGHT Mode}","keywords":"g:firefight,p:nwi\/pvp_tactical,t:default,v:2160,pure:1,deathmsgs,noff,","map":"embassy","max_players":24,"mp_timelimit":"30","mp_winlimit":"3","nextlevel":"","num_bots":0,"num_players":0,"num_rules":3,"os":"w","password":0,"port":27015,"protocol":17,"secure":1,"steam_id":90099831295266817,"steamappid":0,"version":"2.1.6.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jediacademy/1_response.txt b/gameq/tests/Protocols/Providers/Jediacademy/1_response.txt deleted file mode 100644 index c07c496..0000000 --- a/gameq/tests/Protocols/Providers/Jediacademy/1_response.txt +++ /dev/null @@ -1,32 +0,0 @@ -ÿÿÿÿstatusResponse -\version\JAmp: v1.0.1.0 linux-i386 Jul 30 2017\timelimit\25\sv_privateClients\0\sv_minRate\0\sv_minPing\0\sv_maxrate\50000\sv_maxclients\32\sv_maxPing\999\sv_hostname\^5{^2JoF^5}^2Public Server\sv_fps\30\sv_floodProtect\1\sv_autoDemo\0\sv_allowdownload\0\server_host\www.jka.io\protocol\26\mapname\T1_Danger\jp_highlander\0\jp_cinfo\102355\jp_DuelAlpha\100\gamename\JA+ Mod v2.4 B7\g_weaponDisable\524286\g_stepSlideFix\1\g_siegeTeamSwitch\1\g_siegeTeam2\none\g_siegeTeam1\none\g_siegeRespawn\20\g_showDuelHealths\0\g_saberWallDamageScale\0.4\g_saberLocking\0\g_privateDuel\1\g_needpass\0\g_maxHolocronCarry\3\g_maxGameClients\0\g_maxForceRank\7\g_jediVmerc\0\g_gametype\0\g_forceRegenTime\0\g_forcePowerDisable\163837\g_forceBasedTeams\0\g_duelWeaponDisable\1\g_debugMelee\1\fraglimit\00\duel_fraglimit\10\dmflags\640\capturelimit\5\bot_minplayers\0\V\2.4B7 -18 64 "^3$^0JoF^3$^7Lun^4atic^3|^0J^3|" -2 61 "^0{^7JoF^0}^7General Phantom" -8 63 "^8{JoF^8}^9Kess^3^5{I}" -5 47 "^1{JoF}^5Warump^1{I}" -6 58 "^5{^0JoF^5}^0Shadow^5{^0P^5}" -0 0 "^5{^2We Are Recruiting!^5} " -0 0 "^5WWW.JoFACADEMY.EU " -0 0 "^3/AMMOTD for Rules! " -0 33 "^6{^3JoFA^6}^3Mara^6{^3A^6}" -2 31 "^5{^0JoFA^5}^0ßl^5ack^0fire^5{^" -0 0 "^5{^2MAIN Forums At:^5} " -0 0 "^5WWW.JediofFreedom.EU" -1 31 "^3{JoF} ^2Jedi ^3Top^2BuZz" -0 16 "^7Walid^5." -19 136 "^2(JoF)^4Snake^2[J]" -7 33 "^0{{^6S^0}}^6S^0enek^6_^0{^6SM^" -0 64 "^1^^8inVision^1][^^8Myst" -16 66 "h0ppe" -15 66 "^1{JoFA}^5PsY©h0^1{A}" -12 28 "^3{^0JoFA^3}^0ß^3!^0lly^3{^0A^3" -1 64 "^7a^0L^7do" -5 33 "^2{^8JoFA^2}^8Chilleh^2{^8A^2}" -97 19 "^7DarK^1'^7St^10^7nE" -4 53 "^7JoF ^5| ^7Jedi Grubby" -13 130 "^1{{^0S^1}}^0Instructor Bilbo" -4 36 "Kelevra" -5 25 "^2{JoF} ^6Elestial ^2^2{I}" -4 33 "^1jof^0.^5mark^0.^1vm" -4 43 "{JoFA}Hiimconor{A}" -10 48 "^5{^2JoFA^5}^5Waas{^2A^5}" diff --git a/gameq/tests/Protocols/Providers/Jediacademy/1_result.json b/gameq/tests/Protocols/Providers/Jediacademy/1_result.json deleted file mode 100644 index 98e3a1f..0000000 --- a/gameq/tests/Protocols/Providers/Jediacademy/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"94.23.165.161:29070":{"V":"2.4B7","bot_minplayers":"0","capturelimit":"5","clients":30,"dmflags":"640","duel_fraglimit":"10","fraglimit":"00","g_debugMelee":"1","g_duelWeaponDisable":"1","g_forceBasedTeams":"0","g_forcePowerDisable":"163837","g_forceRegenTime":"0","g_gametype":"0","g_jediVmerc":"0","g_maxForceRank":"7","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"1","g_saberLocking":"0","g_saberWallDamageScale":"0.4","g_showDuelHealths":"0","g_siegeRespawn":"20","g_siegeTeam1":"none","g_siegeTeam2":"none","g_siegeTeamSwitch":"1","g_stepSlideFix":"1","g_weaponDisable":"524286","gamename":"JA+ Mod v2.4 B7","gq_address":"94.23.165.161","gq_joinlink":"","gq_name":"Star Wars Jedi Knight: Jedi Academy","gq_online":true,"gq_port_client":29070,"gq_port_query":29070,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jediacademy","jp_DuelAlpha":"100","jp_cinfo":"102355","jp_highlander":"0","mapname":"T1_Danger","players":[{"frags":"18","ping":"64","name":"^3$^0JoF^3$^7Lun^4atic^3|^0J^3|"},{"frags":"2","ping":"61","name":"^0{^7JoF^0}^7General Phantom"},{"frags":"8","ping":"63","name":"^8{JoF^8}^9Kess^3^5{I}"},{"frags":"5","ping":"47","name":"^1{JoF}^5Warump^1{I}"},{"frags":"6","ping":"58","name":"^5{^0JoF^5}^0Shadow^5{^0P^5}"},{"frags":"0","ping":"0","name":"^5{^2We Are Recruiting!^5}"},{"frags":"0","ping":"0","name":"^5WWW.JoFACADEMY.EU"},{"frags":"0","ping":"0","name":"^3\/AMMOTD for Rules!"},{"frags":"0","ping":"33","name":"^6{^3JoFA^6}^3Mara^6{^3A^6}"},{"frags":"2","ping":"31","name":"^5{^0JoFA^5}^0ßl^5ack^0fire^5{^"},{"frags":"0","ping":"0","name":"^5{^2MAIN Forums At:^5}"},{"frags":"0","ping":"0","name":"^5WWW.JediofFreedom.EU"},{"frags":"1","ping":"31","name":"^3{JoF} ^2Jedi ^3Top^2BuZz"},{"frags":"0","ping":"16","name":"^7Walid^5."},{"frags":"19","ping":"136","name":"^2(JoF)^4Snake^2[J]"},{"frags":"7","ping":"33","name":"^0{{^6S^0}}^6S^0enek^6_^0{^6SM^"},{"frags":"0","ping":"64","name":"^1^^8inVision^1][^^8Myst"},{"frags":"16","ping":"66","name":"h0ppe"},{"frags":"15","ping":"66","name":"^1{JoFA}^5PsY©h0^1{A}"},{"frags":"12","ping":"28","name":"^3{^0JoFA^3}^0ß^3!^0lly^3{^0A^3"},{"frags":"1","ping":"64","name":"^7a^0L^7do"},{"frags":"5","ping":"33","name":"^2{^8JoFA^2}^8Chilleh^2{^8A^2}"},{"frags":"97","ping":"19","name":"^7DarK^1'^7St^10^7nE"},{"frags":"4","ping":"53","name":"^7JoF ^5| ^7Jedi Grubby"},{"frags":"13","ping":"130","name":"^1{{^0S^1}}^0Instructor Bilbo"},{"frags":"4","ping":"36","name":"Kelevra"},{"frags":"5","ping":"25","name":"^2{JoF} ^6Elestial ^2^2{I}"},{"frags":"4","ping":"33","name":"^1jof^0.^5mark^0.^1vm"},{"frags":"4","ping":"43","name":"{JoFA}Hiimconor{A}"},{"frags":"10","ping":"48","name":"^5{^2JoFA^5}^5Waas{^2A^5}"}],"protocol":"26","server_host":"www.jka.io","sv_allowdownload":"0","sv_autoDemo":"0","sv_floodProtect":"1","sv_fps":"30","sv_hostname":"^5{^2JoF^5}^2Public Server","sv_maxPing":"999","sv_maxclients":"32","sv_maxrate":"50000","sv_minPing":"0","sv_minRate":"0","sv_privateClients":"0","timelimit":"25","version":"JAmp: v1.0.1.0 linux-i386 Jul 30 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jediacademy/2_response.txt b/gameq/tests/Protocols/Providers/Jediacademy/2_response.txt deleted file mode 100644 index 95da36c..0000000 --- a/gameq/tests/Protocols/Providers/Jediacademy/2_response.txt +++ /dev/null @@ -1,7 +0,0 @@ -ÿÿÿÿstatusResponse -\g_gravity\800\g_jediVmerc\1\g_maxGameClients\0\g_HideHUDFromSpecs\1\g_noSpecMove\0\g_TKPointsKickCount\600\g_TKPointsSpecCount\400\g_EUAllowed\1\g_TimePeriod\0\g_allowedVillainClasses\0\g_allowedHeroClasses\0\g_Authenticity\2\sv_maxConnections\3\g_AntiCheat\1\g_allowunbalance\1\g_autoteambalance\0\g_ShuffleTimer\300\sv_floodProtect\1\sv_maxPing\0\sv_minPing\0\sv_maxRate\25000\sv_maxclients\32\sv_hostname\^4{B^2G} ^4S^2erver ^4[^2FA^4][^2RTV^4]\sv_privateClients\0\g_gametype\7\timelimit\0\fraglimit\0\version\JAmp: v1.0.1.1 linux-i386 Nov 10 2003\dmflags\0\capturelimit\0\g_maxHolocronCarry\3\g_privateDuel\1\g_saberLocking\1\g_maxForceRank\6\duel_fraglimit\10\g_forceBasedTeams\0\g_duelWeaponDisable\1\g_needpass\0\protocol\26\mapname\mb2_yavinassault_veh\sv_allowDownload\0\bot_minplayers\0\gamename\Movie Battles II V1.4.5\g_SiegeClassQueue\`cb`caba`cc`ccba\bg_fighterAltControl\0\RTVRTM\3807/3.6b -0 79 "Srs^1Clone" -0 46 "^6mylittlexenomorph" -0 148 "^2Gamer^1Red^3Neck" -0 33 "^4Zarabon" -0 45 "hunGarry" diff --git a/gameq/tests/Protocols/Providers/Jediacademy/2_result.json b/gameq/tests/Protocols/Providers/Jediacademy/2_result.json deleted file mode 100644 index 43b9d04..0000000 --- a/gameq/tests/Protocols/Providers/Jediacademy/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"91.134.183.153:29073":{"RTVRTM":"3807\/3.6b","bg_fighterAltControl":"0","bot_minplayers":"0","capturelimit":"0","clients":5,"dmflags":"0","duel_fraglimit":"10","fraglimit":"0","g_AntiCheat":"1","g_Authenticity":"2","g_EUAllowed":"1","g_HideHUDFromSpecs":"1","g_ShuffleTimer":"300","g_SiegeClassQueue":"`cb`caba`cc`ccba","g_TKPointsKickCount":"600","g_TKPointsSpecCount":"400","g_TimePeriod":"0","g_allowedHeroClasses":"0","g_allowedVillainClasses":"0","g_allowunbalance":"1","g_autoteambalance":"0","g_duelWeaponDisable":"1","g_forceBasedTeams":"0","g_gametype":"7","g_gravity":"800","g_jediVmerc":"1","g_maxForceRank":"6","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_needpass":"0","g_noSpecMove":"0","g_privateDuel":"1","g_saberLocking":"1","gamename":"Movie Battles II V1.4.5","gq_address":"91.134.183.153","gq_joinlink":"","gq_name":"Star Wars Jedi Knight: Jedi Academy","gq_online":true,"gq_port_client":29073,"gq_port_query":29073,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jediacademy","mapname":"mb2_yavinassault_veh","players":[{"frags":"0","ping":"79","name":"Srs^1Clone"},{"frags":"0","ping":"46","name":"^6mylittlexenomorph"},{"frags":"0","ping":"148","name":"^2Gamer^1Red^3Neck"},{"frags":"0","ping":"33","name":"^4Zarabon"},{"frags":"0","ping":"45","name":"hunGarry"}],"protocol":"26","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"^4{B^2G} ^4S^2erver ^4[^2FA^4][^2RTV^4]","sv_maxConnections":"3","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"32","sv_minPing":"0","sv_privateClients":"0","timelimit":"0","version":"JAmp: v1.0.1.1 linux-i386 Nov 10 2003"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jediacademy/3_response.txt b/gameq/tests/Protocols/Providers/Jediacademy/3_response.txt deleted file mode 100644 index 6d5300c..0000000 --- a/gameq/tests/Protocols/Providers/Jediacademy/3_response.txt +++ /dev/null @@ -1,2 +0,0 @@ -ÿÿÿÿstatusResponse -\sv_maxclients\10\version\SzlakiemJedi-engine\ojp_allowBodyDodge\1\ojp_skipcutscenes\0\g_allowBotLimit\0\g_maxBots\1\g_minHumans\2\g_siegeTeam2\none\g_siegeTeam1\none\g_siegeTeamSwitch\1\g_siegeRespawn\20\g_forcePowerDisable\0\g_dodgeRegenTime\1000\g_saberanimspeed\1\g_saberDamageScale\1\g_jediVmerc\0\g_maxGameClients\0\g_weapondisable\0\g_forceRegenTime\400\sv_fps\50\sv_floodProtect\1\sv_maxPing\0\sv_minPing\0\sv_maxRate\0\sv_hostname\Szlakiem Jedi [szlakiem-jedi.pl]\g_duelWeaponDisable\1\g_forceBasedTeams\0\duel_fraglimit\0\g_saberLocking\1\g_privateDuel\1\capturelimit\0\timelimit\0\fraglimit\0\dmflags\0\g_maxHolocronCarry\3\g_maxForceRank\6\g_gametype\0\g_needpass\1\protocol\26\mapname\prakith\sv_privateClients\0\sv_allowDownload\1\gamename\Szlakiem Jedi RP v 1.1\g_debugMelee\0\g_stepSlideFix\1\g_noSpecMove\0\g_allowNPC\1\g_saberWallDamageScale\0.4\bg_fighterAltControl\0\g_showDuelHealths\0 diff --git a/gameq/tests/Protocols/Providers/Jediacademy/3_result.json b/gameq/tests/Protocols/Providers/Jediacademy/3_result.json deleted file mode 100644 index 5ffa0fa..0000000 --- a/gameq/tests/Protocols/Providers/Jediacademy/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"193.33.177.18:26005":{"bg_fighterAltControl":"0","capturelimit":"0","clients":0,"dmflags":"0","duel_fraglimit":"0","fraglimit":"0","g_allowBotLimit":"0","g_allowNPC":"1","g_debugMelee":"0","g_dodgeRegenTime":"1000","g_duelWeaponDisable":"1","g_forceBasedTeams":"0","g_forcePowerDisable":"0","g_forceRegenTime":"400","g_gametype":"0","g_jediVmerc":"0","g_maxBots":"1","g_maxForceRank":"6","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_minHumans":"2","g_needpass":"1","g_noSpecMove":"0","g_privateDuel":"1","g_saberDamageScale":"1","g_saberLocking":"1","g_saberWallDamageScale":"0.4","g_saberanimspeed":"1","g_showDuelHealths":"0","g_siegeRespawn":"20","g_siegeTeam1":"none","g_siegeTeam2":"none","g_siegeTeamSwitch":"1","g_stepSlideFix":"1","g_weapondisable":"0","gamename":"Szlakiem Jedi RP v 1.1","gq_address":"193.33.177.18","gq_joinlink":"","gq_name":"Star Wars Jedi Knight: Jedi Academy","gq_online":true,"gq_port_client":26005,"gq_port_query":26005,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jediacademy","mapname":"prakith","ojp_allowBodyDodge":"1","ojp_skipcutscenes":"0","protocol":"26","sv_allowDownload":"1","sv_floodProtect":"1","sv_fps":"50","sv_hostname":"Szlakiem Jedi [szlakiem-jedi.pl]","sv_maxPing":"0","sv_maxRate":"0","sv_maxclients":"10","sv_minPing":"0","sv_privateClients":"0","timelimit":"0","version":"SzlakiemJedi-engine"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/1_response.txt b/gameq/tests/Protocols/Providers/Jedioutcast/1_response.txt deleted file mode 100644 index 21b259e..0000000 --- a/gameq/tests/Protocols/Providers/Jedioutcast/1_response.txt +++ /dev/null @@ -1,6 +0,0 @@ -ÿÿÿÿstatusResponse -\version\JK2MP: v1.04mv linux-amd64 Mar 27 2017\sv_maxclients\32\bot_minplayers\2\capturelimit\20\dmflags\0\duel_fraglimit\1\fraglimit\0\g_blueteam\Rebellion\g_duelWeaponDisable\0\g_forceBasedTeams\0\g_forcePowerDisable\0\g_forceRegenTime\200\g_gametype\7\g_jediVmerc\0\g_maxForceRank\7\g_maxGameClients\0\g_privateDuel\1\g_redteam\Empire\g_saberLocking\1\g_weapondisable\0\mv_httpdownloads\0\sv_allowDownload\0\sv_floodProtect\1\sv_hostname\[united] Coruscant\sv_maxPing\0\sv_maxRate\40000\sv_minPing\0\timelimit\20\protocol\16\JK2MV\1.3.1\g_maxHolocronCarry\3\g_needpass\0\mapname\ctf_yavin\sv_privateClients\0\sv_allowAnonymous\0\gamename\basejk -0 0 "Reelo" -10 0 "Luke" -11 0 "Krussk" -10 0 "Lieutenant_Cabbel" diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/1_result.json b/gameq/tests/Protocols/Providers/Jedioutcast/1_result.json deleted file mode 100644 index efdb323..0000000 --- a/gameq/tests/Protocols/Providers/Jedioutcast/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"88.99.15.239:28070":{"JK2MV":"1.3.1","bot_minplayers":"2","capturelimit":"20","clients":4,"dmflags":"0","duel_fraglimit":"1","fraglimit":"0","g_blueteam":"Rebellion","g_duelWeaponDisable":"0","g_forceBasedTeams":"0","g_forcePowerDisable":"0","g_forceRegenTime":"200","g_gametype":"7","g_jediVmerc":"0","g_maxForceRank":"7","g_maxGameClients":"0","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"1","g_redteam":"Empire","g_saberLocking":"1","g_weapondisable":"0","gamename":"basejk","gq_address":"88.99.15.239","gq_joinlink":"","gq_name":"Star Wars Jedi Knight II: Jedi Outcast","gq_online":true,"gq_port_client":28070,"gq_port_query":28070,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jedioutcast","mapname":"ctf_yavin","mv_httpdownloads":"0","players":[{"frags":"0","ping":"0","name":"Reelo"},{"frags":"10","ping":"0","name":"Luke"},{"frags":"11","ping":"0","name":"Krussk"},{"frags":"10","ping":"0","name":"Lieutenant_Cabbel"}],"protocol":"16","sv_allowAnonymous":"0","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"[united] Coruscant","sv_maxPing":"0","sv_maxRate":"40000","sv_maxclients":"32","sv_minPing":"0","sv_privateClients":"0","timelimit":"20","version":"JK2MP: v1.04mv linux-amd64 Mar 27 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/2_response.txt b/gameq/tests/Protocols/Providers/Jedioutcast/2_response.txt deleted file mode 100644 index c243b4f..0000000 --- a/gameq/tests/Protocols/Providers/Jedioutcast/2_response.txt +++ /dev/null @@ -1,17 +0,0 @@ -ÿÿÿÿstatusResponse -\version\JK2MP: v1.02mv linux-amd64 Mar 27 2017\sv_maxclients\20\capturelimit\7\dmflags\0\duel_fraglimit\10\fraglimit\0\g_duelWeaponDisable\65531\g_forceBasedTeams\0\g_forcepowerdisable\262143\g_gametype\7\g_maxForceRank\7\g_privateDuel\1\g_saberLocking\0\g_weapondisable\12284\mv_httpdownloads\1\sv_allowDownload\0\sv_floodProtect\1\sv_hostname\< ^3CTF ^7>\sv_maxPing\0\sv_maxRate\50000\sv_minPing\0\timelimit\0\protocol\15\JK2MV\1.3.1\g_maxHolocronCarry\3\g_needpass\0\mapname\ctf_yavin\sv_privateClients\0\sv_allowAnonymous\0\gamename\basejk -239 97 "^1Manufactura" -188 87 "^4^4sonic" -75 37 "Padawan" -103 56 "^1i | ^6In Flam^3e" -10 65 "^&^*i'm baby Gr^_oo^*T" -150 57 "Padawan" -112 42 "Padawan" -243 53 "^d^1^d<(^wCjS^d)>^w v^1O^wlaTil" -30 45 "^7b0b" --2 54 "^3^3^7_ph^1e^4^4^7Zor" -204 50 "Padawan" -79 62 "^1Padawan" -113 60 "^1shax" -344 64 "n0vaLyfe" -195 67 "^4^4sonic^7" diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/2_result.json b/gameq/tests/Protocols/Providers/Jedioutcast/2_result.json deleted file mode 100644 index 446f776..0000000 --- a/gameq/tests/Protocols/Providers/Jedioutcast/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"31.214.209.81:28070":{"JK2MV":"1.3.1","capturelimit":"7","clients":15,"dmflags":"0","duel_fraglimit":"10","fraglimit":"0","g_duelWeaponDisable":"65531","g_forceBasedTeams":"0","g_forcepowerdisable":"262143","g_gametype":"7","g_maxForceRank":"7","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"1","g_saberLocking":"0","g_weapondisable":"12284","gamename":"basejk","gq_address":"31.214.209.81","gq_joinlink":"","gq_name":"Star Wars Jedi Knight II: Jedi Outcast","gq_online":true,"gq_port_client":28070,"gq_port_query":28070,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jedioutcast","mapname":"ctf_yavin","mv_httpdownloads":"1","players":[{"frags":"239","ping":"97","name":"^1Manufactura"},{"frags":"188","ping":"87","name":"^4^4sonic"},{"frags":"75","ping":"37","name":"Padawan"},{"frags":"103","ping":"56","name":"^1i | ^6In Flam^3e"},{"frags":"10","ping":"65","name":"^&^*i'm baby Gr^_oo^*T"},{"frags":"150","ping":"57","name":"Padawan"},{"frags":"112","ping":"42","name":"Padawan"},{"frags":"243","ping":"53","name":"^d^1^d<(^wCjS^d)>^w v^1O^wlaTil"},{"frags":"30","ping":"45","name":"^7b0b"},{"frags":"-2","ping":"54","name":"^3^3^7_ph^1e^4^4^7Zor"},{"frags":"204","ping":"50","name":"Padawan"},{"frags":"79","ping":"62","name":"^1Padawan"},{"frags":"113","ping":"60","name":"^1shax"},{"frags":"344","ping":"64","name":"n0vaLyfe"},{"frags":"195","ping":"67","name":"^4^4sonic^7"}],"protocol":"15","sv_allowAnonymous":"0","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001< ^3CTF ^7>","sv_maxPing":"0","sv_maxRate":"50000","sv_maxclients":"20","sv_minPing":"0","sv_privateClients":"0","timelimit":"0","version":"JK2MP: v1.02mv linux-amd64 Mar 27 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/3_response.txt b/gameq/tests/Protocols/Providers/Jedioutcast/3_response.txt deleted file mode 100644 index ed6d9e8..0000000 --- a/gameq/tests/Protocols/Providers/Jedioutcast/3_response.txt +++ /dev/null @@ -1,4 +0,0 @@ -ÿÿÿÿstatusResponse -\version\JK2MP: v1.02mv linux-amd64 Aug 6 2017\capturelimit\0\dmflags\0\duel_fraglimit\10\fraglimit\0\g_blueteam\Rebellion\g_duelWeaponDisable\65531\g_forceBasedTeams\0\g_forcePowerDisable\0\g_forceRegenTime\0\g_maxForceRank\200\g_maxGameClients\3\g_privateDuel\0\g_redteam\Empire\g_saberLocking\0\g_weaponDisable\65531\mv_httpdownloads\0\sv_allowDownload\0\sv_floodProtect\1\sv_hostname\^8Deutsches ^7Imperium ^1+BT3+\sv_maxPing\0\sv_maxRate\90000\sv_maxclients\12\sv_minPing\0\sv_privateClients\2\timelimit\0\protocol\15\JK2MV\1.3-78-g87e1d5e\g_maxHolocronCarry\3\g_gametype\0\g_needpass\0\mapname\ffa_bespin\sv_allowAnonymous\0\bot_minplayers\0\g_bt3\1\gamename\basejk -0 0 "https://discord.gg/MN5p78a" -0 0 "^3New ^2updated ^3handicap mech" diff --git a/gameq/tests/Protocols/Providers/Jedioutcast/3_result.json b/gameq/tests/Protocols/Providers/Jedioutcast/3_result.json deleted file mode 100644 index 31030cb..0000000 --- a/gameq/tests/Protocols/Providers/Jedioutcast/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"46.38.237.114:28073":{"JK2MV":"1.3-78-g87e1d5e","bot_minplayers":"0","capturelimit":"0","clients":2,"dmflags":"0","duel_fraglimit":"10","fraglimit":"0","g_blueteam":"Rebellion","g_bt3":"1","g_duelWeaponDisable":"65531","g_forceBasedTeams":"0","g_forcePowerDisable":"0","g_forceRegenTime":"0","g_gametype":"0","g_maxForceRank":"200","g_maxGameClients":"3","g_maxHolocronCarry":"3","g_needpass":"0","g_privateDuel":"0","g_redteam":"Empire","g_saberLocking":"0","g_weaponDisable":"65531","gamename":"basejk","gq_address":"46.38.237.114","gq_joinlink":"","gq_name":"Star Wars Jedi Knight II: Jedi Outcast","gq_online":true,"gq_port_client":28073,"gq_port_query":28073,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"jedioutcast","mapname":"ffa_bespin","mv_httpdownloads":"0","players":[{"frags":"0","ping":"0","name":"https:\/\/discord.gg\/MN5p78a"},{"frags":"0","ping":"0","name":"^3New ^2updated ^3handicap mech"}],"protocol":"15","sv_allowAnonymous":"0","sv_allowDownload":"0","sv_floodProtect":"1","sv_hostname":"^8Deutsches ^7Imperium ^1+BT3+","sv_maxPing":"0","sv_maxRate":"90000","sv_maxclients":"12","sv_minPing":"0","sv_privateClients":"2","timelimit":"0","version":"JK2MP: v1.02mv linux-amd64 Aug 6 2017"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause2/1_response.txt b/gameq/tests/Protocols/Providers/Justcause2/1_response.txt deleted file mode 100644 index 583485961602cb27cab77d166455ef2abdcbb857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmYk0%T9wp6o${vt&cD}6E`y43SEf`sV2RoK#VcQOv@-(U?vQ0C1GP+`WC)}M!W4& zgRkVY@xtm{{{Q^vgI%N?3Z5oqKF-4XcF78^2i4E200PLS9X_}C%C2E>x>!vLOp6(>`Oh)}*>IzoXj--J4gya=LUdpm$ z_UBN#x{a}AViVxgk13C75g~SiyriHlmth;GWvSBj*sRvCUk}a8w0UnreddFy`37`)R&V8JF?zu#dF!?cVTAN(AMhMj=R>5wP^$yJ%8!`Me zZtSvYw^-M=+Eu2;i(pLfdX1wAwdWD!UYkv; zw=YoRV{-6?M(w822N6$ooA5Ej`LHb?{`3jQ|8+rY{h?1ZA) zcQJ?*R5DHriqID^>2_uIAT22;iitc|2sQ6r)tc)|?Y4T5&N4!B!g7R8PW551akJf_ zv=linBvXLqN1(nrbD(j`1QEL+Qqqi)j4L4!`uiudjYCK%Ml-^I-P5rSw*!cC!3FDi zKbiYwtzB!p)1d}M_A=01QO-CA0zdpbd3B868eN<43%=?n4TDIP!<0;coWGCteCvFo z15_xgima#c%|yGypce_xF7d~YcxKmwILR|9goH_&lc#5OOv{@cO3N(I6zoKBguYwY z)^2>4qFwp@#Gtr@#W9s-2wh%)d)$={!TL|AGQ~66Z~n_^V}e~Q@L>bWWp;lMbP47z=NXg0z%*1~Gl__9a}AkIkThBBUTPhrN6|>(&kqYSsn!$wrDS1Ml=g6l


xOxk#i+UfsmM1J|!C)JeqfKBL5EwL<9wM3FvijX5H%EF9)YWOGXuV zNkE^_=ww=dJ4_Y=yvce49lzDFG4)HhcANHU0EtX;D!2qW=A#gkzh7y00=wHUtq;oc z0-OO%?=QfpZH-@b&Y3&w>H$|SGL;cZ5PCcgFQ(87?)rN2W)}iWRf0hn1sDBuZsuL9 z@vj3|5=!Bmq0eXY2dZ#he1KC%1+2Bd$={}}pU=1Ta9&=310{p>XNQg5;OT1H>af}s zpe0<2R3ZoaeO39&yDsfOQUZB6Bo6$o-^}%352VbYY(aB4j%O1;@Dr5GK%K0Bre~*J zOk=$_F(}8m6u=1xA6@+QXB@sh6eLvzWgz|H6bz#GlEWJ)rBp<~+x2K{nzh;UgrWtP rG?xTKREK(#v~_p_=CDI8`gAZLO!{P6g>Jr^6CO5r*C;Pw&d>h^5X8Pw diff --git a/gameq/tests/Protocols/Providers/Justcause2/2_result.json b/gameq/tests/Protocols/Providers/Justcause2/2_result.json deleted file mode 100644 index ea27991..0000000 --- a/gameq/tests/Protocols/Providers/Justcause2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"136.243.148.103:7777":{"dedicated":"true","description":"This is a highly advanced freeroam server with a focus on fair PvP and faction gameplay.","gq_address":"136.243.148.103","gq_joinlink":"steam:\/\/connect\/136.243.148.103:7777\/","gq_name":"Just Cause 2 Multiplayer","gq_online":true,"gq_port_client":7777,"gq_port_query":7777,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"justcause2","hostname":"Alpha's Salt Factory: Faction Freeroam","mapname":"Panau","maxplayers":"400","numplayers":"43","password":"False","players":[{"name":"+Moonman","steamid":"STEAM_0:0:55435815","ping":39},{"name":"THE UNKNOWN ANIMATOR","steamid":"STEAM_0:0:71856141","ping":29},{"name":"stalkeR","steamid":"STEAM_0:1:160957339","ping":104},{"name":"Uncle_Vanya","steamid":"STEAM_0:0:52003053","ping":71},{"name":"JaCrispy","steamid":"STEAM_0:1:73648593","ping":51},{"name":"EliteKnight2707","steamid":"STEAM_0:0:121026977","ping":232},{"name":"Zeys","steamid":"STEAM_0:0:179512051","ping":38},{"name":"Marv","steamid":"STEAM_0:0:66767541","ping":36},{"name":"bogdanleonard48","steamid":"STEAM_0:0:139165663","ping":59},{"name":"[PDF Leader] Walker","steamid":"STEAM_0:0:93339598","ping":149},{"name":"Mabynot1","steamid":"STEAM_0:0:79194251","ping":34},{"name":"PanCraft TV || Tim","steamid":"STEAM_0:0:86287787","ping":104},{"name":"G&Kdstgj","steamid":"STEAM_0:1:232981576","ping":37},{"name":"filipoutsikos","steamid":"STEAM_0:1:184355922","ping":86},{"name":"RamenWarrior","steamid":"STEAM_0:0:95962148","ping":30},{"name":"Sheriff Chris Mannix","steamid":"STEAM_0:0:121457571","ping":97},{"name":"atraokca98","steamid":"STEAM_0:0:168622852","ping":33},{"name":"Ventru","steamid":"STEAM_0:0:61875432","ping":165},{"name":"Jajo","steamid":"STEAM_0:0:43767495","ping":41},{"name":"Von Hoofenstein","steamid":"STEAM_0:1:83274971","ping":108},{"name":"Boamosh","steamid":"STEAM_0:0:90040833","ping":35},{"name":"Tumnus Turner","steamid":"STEAM_0:0:42248522","ping":52},{"name":"mitchelljack82","steamid":"STEAM_0:1:174369804","ping":55},{"name":"Scottish Abuse","steamid":"STEAM_0:1:87197773","ping":39},{"name":"Kinkzogan","steamid":"STEAM_0:1:51966772","ping":114},{"name":"hatelove","steamid":"STEAM_0:1:77026563","ping":70},{"name":"LashedBandito","steamid":"STEAM_0:1:128617685","ping":98},{"name":"ArstozkanGamer","steamid":"STEAM_0:1:123347874","ping":122},{"name":"Ronald Dunnewind","steamid":"STEAM_0:1:67292010","ping":20},{"name":"Mr.Sandman_PI","steamid":"STEAM_0:0:197567216","ping":234},{"name":"Nebula ~","steamid":"STEAM_0:0:80111414","ping":17},{"name":"bandit1216","steamid":"STEAM_0:0:151775493","ping":140},{"name":"Slobbyde","steamid":"STEAM_0:1:64184854","ping":42},{"name":"Chip Skylark","steamid":"STEAM_0:1:93389738","ping":31},{"name":"coconut","steamid":"STEAM_0:0:92033360","ping":105},{"name":"opbase","steamid":"STEAM_0:0:38544137","ping":42},{"name":"Pojo","steamid":"STEAM_0:1:92233244","ping":75},{"name":"JustMax","steamid":"STEAM_0:1:166878483","ping":69},{"name":"Rösa","steamid":"STEAM_0:0:147894155","ping":102},{"name":"Jellar","steamid":"STEAM_0:0:58889079","ping":16},{"name":"Mehmet","steamid":"STEAM_0:1:146813806","ping":57},{"name":"Captain Pinkie","steamid":"STEAM_0:1:88905228","ping":36},{"name":"Scrub","steamid":"STEAM_0:1:76481640","ping":23}],"version":"948"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause2/3_response.txt b/gameq/tests/Protocols/Providers/Justcause2/3_response.txt deleted file mode 100644 index 5524cfe47c2300ec22147d8760cb41e8ddec5941..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435 zcmYk0%T9wp6o${vt&cD}moi*SSE53yNiQi7V~jD=G71)$2}4^+*mU8-*YF)Qu}d45 z;ww3Ays$c#|3ClvU>_+*f~QHD&ocmssF)TBFB6u-sGvfi1u7X@l7eq5Pf0}!f%s0E zY*&oa9F;LelX-DR8Uw*lr5-@HHp3##H7S-bXT3TI0rv) zo&Jr|#odl#Vna170QVwE(}ZL#QPVVAH*Fd4bT64_GV1?QSFoyDk^)wzB(DhaQkEsN zKZnxQZHzl6HUU2UnDUqw5n{KT{i$ez5!~whI#-1 diff --git a/gameq/tests/Protocols/Providers/Justcause2/3_result.json b/gameq/tests/Protocols/Providers/Justcause2/3_result.json deleted file mode 100644 index a651ada..0000000 --- a/gameq/tests/Protocols/Providers/Justcause2/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"204.44.116.72:7777":{"dedicated":"true","description":"Press v to warp to players press b to open the buy shop","gq_address":"204.44.116.72","gq_joinlink":"steam:\/\/connect\/204.44.116.72:7777\/","gq_name":"Just Cause 2 Multiplayer","gq_online":true,"gq_port_client":7777,"gq_port_query":7777,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"justcause2","hostname":"[USA\/EU] Hasbo's |FREEROAM|FREE BUYMENU|FACTIONS|TP|","mapname":"Panau","maxplayers":"500","numplayers":"7","password":"False","players":[{"name":"\u0007That1EdgyJohn","steamid":"STEAM_0:1:80615257","ping":69},{"name":"William","steamid":"STEAM_0:1:33394693","ping":137},{"name":"jamek13","steamid":"STEAM_0:1:40122700","ping":129},{"name":"Danya Flomik","steamid":"STEAM_0:0:49118616","ping":205},{"name":"Shepherd of Fire","steamid":"STEAM_0:0:59568826","ping":133},{"name":"κöÏεcικ","steamid":"STEAM_0:0:149463014","ping":194},{"name":"Heistâ","steamid":"STEAM_0:0:151713445","ping":197}],"version":"913"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Justcause3/1_response.txt b/gameq/tests/Protocols/Providers/Justcause3/1_response.txt deleted file mode 100644 index f05a64b12e787308d4efceb89df53cadd260e277..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmZ{gO-{ow5QW_(UBL~eVu^?fjbPh0DNzbeprs3hSU8E*xcPB3whKsM%L%v$3vR$E zxJ)oeAhBRp-{`#=>AkM&x^VAywmQCpxi_MhFoyXe;`&}<;nZA13unkVN>*7Er*Hr# zZZL(#gp#>Y8a!qchtZz}s42B*O7_U{UjeAhh@B^rm4qBQL&tT7I_%L4}@Qa(<|Pri-#ma7SoM?7@yx@jFY8Hp3TnJFVb(@zKzuRzclNSjH?ty zqlK(VBw@*M%MmWvdH__^qGF9rl`@1xR*4#bm-Dm$X%M8&ty6s;DA=Ga(@9JF61I}rhrtyyNr>nsO_|7o6gc1151?ophxmBWu8fJt@l5bjgi?W1MIJf5$ zSdIhc8>PYFMj;IUJP?>di>lyHNdFQL$b_}`!jgiqfz`KctIs~Oql1s<_qUT#$Mr%! zzuD@9R>qwRx9}!cSf%+cS`ZI|wR;v`+)+s5Yn#2A!|yECt?O=Es&V&d+F=Q*m_((8 zEZIVWLfRrh!P6cDq7)lmwXI@K5XnuXdf;Rj=O7J%)LE-A diff --git a/gameq/tests/Protocols/Providers/Justcause3/2_result.json b/gameq/tests/Protocols/Providers/Justcause3/2_result.json deleted file mode 100644 index 25f707c..0000000 --- a/gameq/tests/Protocols/Providers/Justcause3/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"46.105.165.166:4200":{"dedicated":"d","description":"No server lag! Minimap + car bombs! Check our other servers jrnetwork.net Fixed server crash bug.","game_descr":"Just Cause 3 Multiplayer Mod","game_dir":"Just Cause 3 Multiplayer","game_id":619910,"gq_address":"46.105.165.166","gq_joinlink":"steam:\/\/connect\/46.105.165.166:4200\/","gq_name":"Just Cause 3","gq_online":true,"gq_port_client":4200,"gq_port_query":4201,"gq_protocol":"source","gq_transport":"udp","gq_type":"justcause3","hostname":"[EU1] JC3MP @ JRNetwork.net | Freeroam | Xeon + 64GB RAM","keywords":"DIOaGTvtdrUuDGiDlIBQepgkxbNraOMjD-OKYrOrAS4","map":"Just Cause 3","max_players":125,"num_bots":0,"num_players":0,"num_rules":1,"os":"l","password":0,"port":4200,"protocol":17,"secure":0,"steam_id":90111118046569480,"steamappid":0,"version":"1.0.4.0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor/1_response.txt b/gameq/tests/Protocols/Providers/Killingfloor/1_response.txt deleted file mode 100644 index d14781d31f75005404b1faaf035e4c162746944d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1898 zcmZuy&2Af26h3vDCb8p`q!m<(ghoh62;tzQp@j<2IJL*AoM}w#Bti&9H#4{PRqxCl z%}-iaUE~p1B9?uEJ_H-YrfgVs#Z!36cP8U{D%Fy&&-u=|=bnFG((JSO=@r#lur{Z* z-S~dfo=(4H^2g2BucyaM=~M+GmCSdU7eP)Bn3nN{jFYWSR=U`*URs-PF717(wRIR; z9TBHv#_ZSj!G*SVn>jO`_GSDuVfvMApGpy#Fz4RbZyt_CEW8w^b5;A*Ad;R6WXSCF z^3oMiE}2ekM#@`(&R+3>ch)^ob>bU2A5ts%%e_*U?(UIm;pl_mo( zUsf;id#yIeqj8Ndsp?B#d5GGlYReB)_!zcm*`1{0SZS)|SSJvm?>Of9&#w1So6P@i z*B&vr<(YuiuI!y43S~lC+-~06rTU}fM0f+~Wif0orf~-MT=AR(Ohszqgep5!MSv$J zRpF>msr8ii^gU$R&2oMEsHe1srlXCC0m92dvI^ovC2TsGqn{jiuaez|$t-eZl8BKk zDb#Qc1xS(p`K`6%?m(N=72a5daG4pa;BXf~T070=T>oR}=jqIg42vz_M-nzpB+QD? zn^^lI^ff=hckkow`dpTX3yyuc6N+<}7JTF5FyUlqiZ#~We zD~*K@)6cFti>`08#=AG@)*y=_6Q@?*TSBWOEsLvrs2g5{hows^4^0rjaZ?6Y9VNAI zx!f{keA!X4JkLgDtUf?%N6FY2PH)NbYFh?Is}!x0l<~D;tVScmu`i-%QkEbCc`>YR z7KZN|Tj_)&l!>!DYlbBdN5l3U*f^3&B%Xyx^i1cSavextr2G8?`J~iPH`}p^T3U1e zKx1yJ+H+b*U2d8Zc8a95;=q)gSjR1>hN;@q#^c<+_hdd*eVrizv!Q$^#}j)dP59Xw zx}mSd1O=kXJ*sy?e~9JKmcVFncMH8#?HZv6o{1$b+yl$<0~M&0F!S{xIxv9)Ja2Tv z5jv4nyBdl?$~J~PmUYL(o-DF7!}f$m_sXFZK~iA13tv7U+Hhhe(dHBGgn=hC+-ZJJ ztB*nyTIf@8A=#m-qr!q)*lyBoZtXZjmI7(LFu}Q!2`${+!PKSLr6`!?iDXQRJKu1q zMXD-iSZ}}mM{g?+ESHXGi+-YGYEh3m;20Ozh?cSG{#?O9WIX`C0{8PNii+PE68M@*N(0>&;JG*kA^x0_^2lN%VJB5T}S?tLm zBDOP&Y6^XB>8m@JT=6`r#X>pc--C!7s=aLz%~KF}X-\u001b°°øU\u001bø@@ltimate\u001b°°øG\u001bø@@ame\u001b°°øS\u001bø@@ervers.Eu<\u001b@øø*\u001bø@@>- | \u001bÀ@Hell On Earth | \u001b@°@Lvl 40 | \u001b@øøPerks | \u001b¢@@Weapons | \u001bÃ@ÃCharacters | \u001b@@¢Specimen | \u001bø€€Maps | \u001bøø@Fast D\/L","serverversion":"1064","slot machines":"Ver 200","starting cash":"2500","timelimit":"0","translocator":"False","veterancy":"Engineer","veterancy handler":"Ver 700","veterancy saving":"Enabled","weaponstay":"True"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor/2_response.txt b/gameq/tests/Protocols/Providers/Killingfloor/2_response.txt deleted file mode 100644 index 64ad2078b07415a692e066b4530dc5351002121f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2196 zcmZuxL2MgE6#Y$`G_jpDX_JD8L>E;EI3%^3Hf<3H$9C z9gg{zquI{LeD+bc#$8|ajrr^#TMv}tzBfM@46bM@C$V_)%D0dc#{Q=Z$#WTgKTBbF_ssW(jfpin=R{&U7stL`9iwPF-oi}+?G+}YL9CR zWz0W&mfg9W*`=Aa;=(FZ4H>AdrG=(ApyXN+_PpNjae4(OxQzeV_#YlnNi z!~pM8$#7#;l{Tk@&23>ZpWBpJvGLh;>_wCe=eN5|ICQD3gNtIy%WgMth2PJ%G`DEU zE=@(-ZE@uxd>YN9m#@)e+1p}Pjaz}j)}y`(I89aAftJQ+zEmEKT&F~p^|qvs!^S4b zHDPs5Amh~_w5RDc;W)4?I#Mctbi^d`QdMN@1U6plv3-}TW2>p6P@bQIw|&AAiWc;a z-1AtAds|D#E~#=U9}028;VjTQ^}?~)IDmYc4Mn6KBULi*(fKV7{g`X@jaBB_4uTqk zSjIBV95Wu<(<+SLc3H!LV&|&DHF{ii42SP=hennGv4dgg^iujbrx(_PuHh?YW8?j( zBQzb{eSm%qgOeUWz;lU=r)EFTR0a&Z8dC8?n<*Gek3aj&PfT+Z(FIT-3%>u>Z_P z&Yg2ashkohroiTzo1y#nXCkr*a+*~ZoqGjn)Mcvk;XQf??yKp@;4cI{m3M^I=DI~? zmTpi1Oa|Qz!}tz#vWY%sZZh9$lLIi8fSxB1wbd4mFm2hQYoPvkL3@#L5!6Igy1ehO zeewbQ5C=2|W@<(GZG{wC=0+hG(!08~!f{qR7Sy8oP9Qq831}vcWt+cz`Htz-= zZ<;ybnk&vimD;d6Ov}HcMCW!g*ZuaciGIGvgi8nDzlFjW#!;4kf#LW@!$TvL^dl&N zHY_cHV}*h&(XW_4 zMZsYhdd~?*vSygvO{_i}*90`gV*d d3QO_fbYyUpR{gD1mASRBzoC=s+Itk&-hW2nGvxpP diff --git a/gameq/tests/Protocols/Providers/Killingfloor/2_result.json b/gameq/tests/Protocols/Providers/Killingfloor/2_result.json deleted file mode 100644 index 07dc2a6..0000000 --- a/gameq/tests/Protocols/Providers/Killingfloor/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.94.101.48:7707":{"adminemail":"InterGamingCommunity@gmail.com","adminname":"","balanceteams":"True","currentwave":7,"endtimedelay":"4.00","finalwave":"7","forcerespawn":"True","friendlyfirescale":"0%","gameport":7707,"gametype":"KFGameType","goalscore":"60","gq_address":"64.94.101.48","gq_joinlink":"steam:\/\/connect\/64.94.101.48:7707\/","gq_name":"Killing Floor","gq_online":true,"gq_port_client":7707,"gq_port_query":7708,"gq_protocol":"unreal2","gq_transport":"udp","gq_type":"killing floor","initialwave":"0","isvacsecured":"true","kickvoting":"true","mapname":"KF-HarbourV3-fix","mapvoting":"true","max perk level":"30","max runtime zombies":"60","maxplayers":35,"maxspectators":"5","min perk level":"6","minplayers":"0","mutator0":"KillingFloorMut","mutator1":"CorLogMut","mutator2":"Spawner","mutator3":"FirstBloodMut","mutator4":"KFDoorMessagesV3","mutator5":"IGCAdminMut","mutator6":"IGCRTD","mutator7":"IGCChat","mutator8":"IGCServer1X","mutator9":"MutLoader","num trader weapons":"122","numplayers":33,"players":[{"id":5763,"name":"Zangetsu_Grim_Hitsug","ping":1020,"score":3000},{"id":5591,"name":"Dat_scoot","ping":60,"score":3474},{"id":4993,"name":"KIKOFU","ping":196,"score":47},{"id":4792,"name":"NextGear","ping":260,"score":6779},{"id":4676,"name":"N(.)(.)Bs","ping":112,"score":55},{"id":4547,"name":"CertifiedOrganic","ping":228,"score":5366},{"id":3947,"name":"Briandude18","ping":112,"score":1203},{"id":3942,"name":"aL.l^Dinamark`^","ping":132,"score":4249},{"id":3560,"name":"ClicheName137","ping":68,"score":561},{"id":3506,"name":"fate_Patch","ping":108,"score":3000},{"id":2812,"name":"chili_dog","ping":52,"score":6108},{"id":2582,"name":"Moneylaw","ping":116,"score":1206},{"id":2581,"name":"Arthritic_ODB","ping":116,"score":1885},{"id":2580,"name":"Dr._Quik","ping":80,"score":529},{"id":1948,"name":"Ahmed_Yusef_Bin_Al-M","ping":104,"score":3000},{"id":1531,"name":"[15th]_Harvain","ping":120,"score":4781},{"id":1481,"name":"Obscuro","ping":188,"score":873},{"id":1398,"name":"fresh_feeesh","ping":84,"score":7938},{"id":276,"name":"blaat","ping":184,"score":91},{"id":178,"name":"Grubby1991","ping":236,"score":262},{"id":23,"name":"Swordfish","ping":92,"score":3000},{"id":21,"name":"RIP.Tiger","ping":216,"score":8000},{"id":20,"name":"Sir_Whiskey","ping":76,"score":2905},{"id":19,"name":"Crasz","ping":116,"score":2958},{"id":18,"name":"Frank","ping":56,"score":112},{"id":16,"name":"Smug_Janitor","ping":48,"score":890},{"id":13,"name":"BaDDoG","ping":208,"score":4580},{"id":11,"name":"loaf_dog","ping":80,"score":2186},{"id":10,"name":"Loaf_Cat","ping":76,"score":221},{"id":9,"name":"Cha_Siu_Bao","ping":76,"score":551},{"id":6,"name":"kastidal","ping":64,"score":3198},{"id":5,"name":"Cafe-BerryMocha","ping":144,"score":6156},{"id":3,"name":"[PHAC]_CLOWNBIG","ping":108,"score":4228},{"id":2,"name":"ManSlayer30","ping":116,"score":1200}],"playersbalanceteams":"True","queryport":0,"serverid":0,"serverip":false,"servermode":"dedicated","servername":"\u0002\u001b@°@Sentry \u001b@€@Turrets\u001b€€€\/\u001b@°@Bots\u001bÀÀÀ|\u001b@°°Weapons\u001b€€€\u001bÀÀÀ|\u001b@€€Specimens: Default \u001bÀÀÀ|\u001b¢€@Lvl 6-30\u001bÀÀÀ| \u001bÀ@@I\u001b€€€nternational Gaming Serve\u001bÀ@@r \u001bøø@[#1]","serverversion":"1064","starting cash":"3000","timelimit":"0","translocator":"False","veterancy":"Demolitions","veterancy handler":"Ver 6","veterancy saving":"Enabled","weaponstay":"True"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/1_response.txt b/gameq/tests/Protocols/Providers/Killingfloor2/1_response.txt deleted file mode 100644 index 8b7ed88f5b4c816f9ac4f9243f786eb69e8cff41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 zcmbVMO=x3P6#m9vT3k4SGK!8@>Mt}Q{j;5@V49bUrs8$V_!(!g=YZDU`t#(wqcYPmYrPS&S!$vQ)q2xI!4Jz zIM2N_`n21YJ5!{d#1gl0nAk3WV+^W?BNMsY96sj9(fs-odB>AS;{5Em$j^-P{KUA* z=f>M4&ylo9WPWPANxxep5y>_Q-g*6c$_9+??Tr%T{ooktith?Ldm@K>Zw6leVy=XB zvm+z6DjGt^Y!e^d2i)^1=^qZWwd{O$?GYAA)fIM`M=fM-0scCBwYAxnG4eM8zomv1 z<7Jcywd@Fskx}5n2UodQrNV7D01p;sN~p+2)9>OUxn2A}Z2AF0ZH=J{RkJj`gVF1NXV=C`cp=QLXA9Z2Z1^H8=$P9S^Q$)j z=ik4xgas~jEYF-#0*@0j-z^^{1VRg815qIQd8Z>3zNKV8e?Bryz@jbdDsI0OcNee)?Mj|#&w&B%c^A~by?S~X;|S7SvDlE zlV0dZTpKiGTCkFq$JMmjC6bj(b89b)G)hmIy@{huZ!lLFtQ%UI6GS&^wYvTDtQVVtNT+i4mkzvy$DlWuS z-b+G!K*`fi#Qy?})UIH+q__Roc91(&Uqer-3JJlWelf9DX#WiF3d|so+uJfq6z%*J z7HRaUt3YirJU!HHg?FlC!^%QtKCxQrMx9&f(#43HPbFMQiqB|L`O?XYqS2a$K{t;>?usqhqAO|G^k{1OuaNp7_o>O$KkQKE z1M2&!)0Q1(QS0?P=wCeLn92?-`hEVNo3u`>lyxO-BlLo|OS&Po*bvrHbHu~kiCGNM Gf`0(?G}fU2 diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/1_result.json b/gameq/tests/Protocols/Providers/Killingfloor2/1_result.json deleted file mode 100644 index 83fd1fa..0000000 --- a/gameq/tests/Protocols/Providers/Killingfloor2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"173.66.77.112:7777":{"CurrentWave":"5","Difficulty":"3","GameState":"OGS_InProgress","MapName":"KF-BurningParis","MatchQuality":"0.000000","MaxZedCount":"100","Mode":"Survival","NumOpenPrivateConnections":"0","NumOpenPublicConnections":"6","NumPrivateConnections":"0","NumPublicConnections":"32","NumSpectators":"0","NumWaves":"7","OwningPlayerId":"0","OwningPlayerName":"SheepKF.com - RPG [1-250 ] #1 Hans Volter [Fast-DL]","PingInMs":"0","SteamEngineVersion":"10897","ZedCount":"10","bAllowInvites":"True","bAllowJoinInProgress":"True","bAllowJoinViaPresence":"True","bAllowJoinViaPresenceFriendsOnly":"False","bAntiCheatProtected":"True","bAvailableForTakeover":"False","bCustom":"False","bInProgress":"True","bIsDedicated":"False","bIsLanMatch":"False","bMutators":"False","bRequiresPassword":"False","bShouldAdvertise":"True","bUsedForTakeover":"False","bUsesArbitration":"False","bUsesPresence":"True","bUsesStats":"False","dedicated":"l","game_descr":"HardSurv","game_dir":"kf2","game_id":232090,"gq_address":"173.66.77.112","gq_joinlink":"steam:\/\/connect\/173.66.77.112:7777\/","gq_name":"Killing Floor 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"killing floor 2","hostname":"SheepKF.com - RPG [1-250 ] #1 Hans Volter [Fast-DL]","keywords":"d:7,e:5,a:1,l:0,m:0,j:0,k:0,i:3,h:0,b:0,c:0,f:0,","map":"kf-policestation_sfix3","max_players":32,"num_bots":0,"num_players":24,"num_rules":35,"os":"w","password":0,"players":[{"id":0,"name":"Player790","score":1823,"time":2955.9064941406},{"id":0,"name":"Toxic Legend Z","score":8623,"time":2955.5695800781},{"id":0,"name":"(S.O.B.R) SilverJack","score":3117,"time":2954.8723144531},{"id":0,"name":"(S.O.B.R) Shmid","score":1338,"time":2954.869140625},{"id":0,"name":"Kotic-Sniper","score":2569,"time":2954.7387695312},{"id":0,"name":"(S.O.B.R) Nil","score":1042,"time":2900.0717773438},{"id":0,"name":"Mighty","score":2779,"time":2830.4284667969},{"id":0,"name":"old head","score":8251,"time":2678.9208984375},{"id":0,"name":"I Like turtles","score":3233,"time":2643.2585449219},{"id":0,"name":"TrooperNoH4x","score":522,"time":2613.1474609375},{"id":0,"name":"{S.T.A.R.S} Andarack","score":1672,"time":2458.6723632812},{"id":0,"name":"Faindizzle","score":828,"time":2324.6760253906},{"id":0,"name":"MeneerDeAardappel","score":716,"time":2203.8676757812},{"id":0,"name":"(S.O.B.R) GrInN","score":4117,"time":1936.8309326172},{"id":0,"name":"iN","score":21698,"time":1933.4650878906},{"id":0,"name":"Banana","score":2431,"time":1743.1625976562},{"id":0,"name":"Zirons","score":2423,"time":1390.6865234375},{"id":0,"name":"I know that girl","score":7366,"time":1009.2462768555},{"id":0,"name":"Super kame guru","score":1681,"time":830.33184814453},{"id":0,"name":"Matts Mom Is Hot","score":722,"time":658.10302734375},{"id":0,"name":"","score":0,"time":632.15380859375},{"id":0,"name":"Derp Herp","score":629,"time":431.85089111328},{"id":0,"name":"","score":0,"time":92.149681091309},{"id":0,"name":"","score":0,"time":68.89826965332}],"port":7777,"protocol":17,"secure":1,"steam_id":90096635858216960,"steamappid":0,"version":"1008"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/2_response.txt b/gameq/tests/Protocols/Providers/Killingfloor2/2_response.txt deleted file mode 100644 index e57c68e5eda2260f279f9d444e97be574db69521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmZ`&y>1gh5T1ZUq%;U5C{aWxO>|Ba5?o>Y7l$~$_<|9ki1zNr_Qva7vp+VD@&q*W zNOZgaMMOivBOvhxbUXkB4QB4*i>we%8r|;q?R-1m+}w0Joz`!)cPgdrN^9@sa!_ft zE3K70JgYu@%9Z7j*<~U0J8Oj0*Z}LYqmBZnM|{Kt04&}BF@}Y_=WW3!c5mU^qQ8Il z$wFMndpRuRbFARy1jT^jn4(X?3+uTay+h(7dUq(`{oCs#2e5Q{xE+^y6TnHp zO+VLQHCX=f;bVH}!Jo5Qx`5-~+3MBLvszX`Wd*{b5NcePBW}^afp$29b`+O&>1);1 zX#Qc^ocV;KjPP>O997jEWo(*KOrXkyNwlTqr5+g~Ws8x;ILjX~E?6kAs`LTtqZ*;k zl1k24HOO{zRn0`}ri?LG&hji+;>cH%J){i^da=kA;u-;qy-vYXs8%z zx@L2|=LXFo()Xn)w^&kA(#IeN20X|(7YZKDQ;!nre<}Xe$AcjWpEo{LP8=I52%6*6 tfnXEV^_Z@m2U4F`{IouquFFPJWnhsFDzeKZwo#j;`+0Bc@g~f7jf-Xoj6zD`mgPiD`A_=ZAzStazKgcCP&_sK8V|(#=*X)N)q!bY) z4J8tPfC5p_1w=TpV9NZwH6K@ta{6@`bl(&N&xJ#as#<2&x#h#IB&n3>@k0XuX%mA$1{ON%l@GQan z@n;XlhhLrFA5XrI-@hBb`Q(fbzd6rk$8xwvZ;t-l_VP083lNr*M2>thPwzo&RT?{i11?2l&h*ZidZ*AvJX|35aF;a46k&N8Om%hG8pIaL&g&p zCRmkfoApqV$ULZGwUPb&c8Qg*J&bw8(qw04e43o7GZS@lq;3tP=IQ*tg|93p2`#4e zNUHP5pet<>mt!h#I59qL$&SYO3StE7vI@CT%y234+$nsaJt-6rgR@RntWqe$<01OU%$Y( zBCRk$3kr1^Bb@JU!}gm4r18=w8>~nnXcnYEgA2LOh6#_RT`Q^UUm>llp9cd=1qs_n<;PTZ8pw41=g-=rM);zhG7k*0{<`RJfxD=5I+3Eg_FxsJIstzH DY_4D2 diff --git a/gameq/tests/Protocols/Providers/Killingfloor2/3_result.json b/gameq/tests/Protocols/Providers/Killingfloor2/3_result.json deleted file mode 100644 index 98f99f7..0000000 --- a/gameq/tests/Protocols/Providers/Killingfloor2/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"213.141.146.68:7778":{"CurrentWave":"7","Difficulty":"1","GameState":"OGS_InProgress","MapName":"KF-BurningParis","MatchQuality":"0.000000","MaxZedCount":"100","Mode":"Survival","NumOpenPrivateConnections":"0","NumOpenPublicConnections":"6","NumPrivateConnections":"0","NumPublicConnections":"6","NumSpectators":"0","NumWaves":"10","OwningPlayerId":"0","OwningPlayerName":"aptemka.net KF2 Server #2 - HARD, LONG","PingInMs":"0","SteamEngineVersion":"10897","ZedCount":"10","bAllowInvites":"True","bAllowJoinInProgress":"True","bAllowJoinViaPresence":"True","bAllowJoinViaPresenceFriendsOnly":"False","bAntiCheatProtected":"True","bAvailableForTakeover":"False","bCustom":"False","bInProgress":"True","bIsDedicated":"False","bIsLanMatch":"False","bMutators":"False","bRequiresPassword":"False","bShouldAdvertise":"True","bUsedForTakeover":"False","bUsesArbitration":"False","bUsesPresence":"True","bUsesStats":"True","dedicated":"l","game_descr":"KFGameInfo_Survival","game_dir":"kf2","game_id":232090,"gq_address":"213.141.146.68","gq_joinlink":"steam:\/\/connect\/213.141.146.68:7778\/","gq_name":"Killing Floor 2","gq_online":true,"gq_port_client":7778,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"killing floor 2","hostname":"aptemka.net KF2 Server #2 - HARD, LONG","keywords":"d:10,e:7,a:1,l:0,m:0,j:0,k:0,i:1,h:0,b:1,c:0,f:0,","map":"KF-BioticsLab","max_players":6,"num_bots":0,"num_players":4,"num_rules":35,"os":"w","password":0,"players":[{"id":0,"name":"KING NATSU","score":34,"time":1602.4636230469},{"id":0,"name":"V1ktor_0verDøse","score":288,"time":1592.5690917969},{"id":0,"name":"opi","score":0,"time":1390.2520751953},{"id":0,"name":"‹ קּâ—â‚« › Yogui","score":2,"time":619.74560546875}],"port":7778,"protocol":17,"secure":1,"steam_id":90095989236771846,"steamappid":0,"version":"1008"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d/1_response.txt b/gameq/tests/Protocols/Providers/L4d/1_response.txt deleted file mode 100644 index 9b54033d707951ff7fc99413176e38a7918fb578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4666 zcmZ`-Yitx%6h5WpRT2F`w2?@Lr~#U`*_qv$-H9wN-Q9LUD6v$~kV+SJ3ZvWIW_OEV zFc|_w6Cy!T6A0o;8U>@lC?WnpnKnM)2hT)8Ow`6eQe&b-F_NIvbLZZvb2gWgCT-5W z_uTXN&Ufx~Vq#)q*>t_KSxMOgR-tSc3(C4RR;fHx?uC3Lw|+}`{pMnM(5__jA$@(R zSnRJ92O)3uS0Xtpn}ZdRl+vp36L7O`MkC~2ggUh?)TXt?pt{#a+btW1%9Y|kOaD-z zWuTbLSvhFjzP<4d-kqEc&;Y{?_~%6GLs*)xWbG161(d#NX;?ipXqA-JS$kWypscXA zSb0ScvqhBZQb?f(O1E9M3!9X16s9n>J2gf0MvQ4ut}caz>LQ6n!?!r6U3Q@s<>yD5 zI%Uf-lP^2FQ?liV4)ttYu#9M_z?0CB! zTH|;KTe^~sw+ijnBx<{`#U@qGBHAty-Y!o2RS#V&v!!htZ7W~oD27|K>C_Of=gpTp zNFfY?66bPFfx_I8FAJSyzn{FsEL!K7$inC6(quoD%7d^wGX>>hznxX`S!J+PI zKOEs`Y(5}ONZ5dX8SgQWNyb1d#*Hsoh*b~pFp`odQ!JYPs6SZxD0=+;a8Q~)L(um( zO9;3WWMxlwPta>{fN*hX>j{iKey(P_V9c)!)CZzaHI9ZVjwu2zpOXGufIH!r7h^SSfi~1Q6$-H(i^+y%{?89sY zi^3b&J-?Vy9 zza$~yQ^SL^^98+37eMO1OnuhG{-0Q)15|_s_9Xv8hwPe|X!`kQ=`n+k;lv{jtq%?v zCW%WJjF^-0$wyP%pPb$vI7HK@hk$+5fIE-!f)7ntMz2!EYx(RT)$2T>zNSNyE=+ph zJHS4665qZ<590fpN#fFzs1IUS)O&v&&4C#PW~c9sBh(I}%9Eeh(*5|n_vHR$2h>zq zDZEE*sG^T5?5!6lmw2_@caf@14I0sQ-ya_k&Z-}7pk||jV>8?7c^u!KSkKhx`F+l* zOH^<2P^y0(p!V^Vz-64)*7W#LxwE@wyXlp@didQMy>Ro*YaOH#_#NPV4?`?-P0PQS>!{4)GuzJF}na{ghTeK{yBY z3sOm>ahz?~rr^H`UMd!>w$hMyH~g?q>U)^?oBP+-(q+H9`|wjwLKcWrCSw;)Nl(XA zJ}jK?q-l)^(oM{f8b`)qOf)tZu^|5+0Zwo}JFiIXW8-_Dy@@GO`^fFA=+0*srOt~< zr{vB^mywj2R8Jqwz}=qP)wf0{{tOO#WyS@n$4qcBrGel-9Xw7>%$5eC@t$_)^=AG9 DXInTK diff --git a/gameq/tests/Protocols/Providers/L4d/1_result.json b/gameq/tests/Protocols/Providers/L4d/1_result.json deleted file mode 100644 index 289bd62..0000000 --- a/gameq/tests/Protocols/Providers/L4d/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"67.80.161.254:27022":{"dedicated":"d","game_descr":"L4D - Versus","game_dir":"left4dead","gq_address":"67.80.161.254","gq_joinlink":"steam:\/\/connect\/67.80.161.254:27022\/","gq_name":"Left 4 Dead","gq_online":true,"gq_port_client":27022,"gq_port_query":27022,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d","hostname":"5th Dimension [Versus]","keywords":"5th,custom,fun,modded","map":"l4d_vs_hospital05_rooftop","max_players":10,"num_bots":0,"num_players":170,"os":"w","password":0,"players":[{"id":0,"name":"Altair","score":5,"time":2150},{"id":0,"name":"Super Saiyan Level 53","score":0,"time":20},{"id":0,"name":"Dead Rising 37","score":2,"time":535},{"id":0,"name":"Dead Rising 68","score":0,"time":27},{"id":0,"name":"(1)Super Saiyan Level 63","score":0,"time":37},{"id":0,"name":"Super Saiyan Level 27","score":0,"time":39105},{"id":0,"name":"Super Saiyan Level 89","score":0,"time":1068},{"id":0,"name":"Super Saiyan Level 45","score":3,"time":2908},{"id":0,"name":"(1)Super Saiyan Level 74","score":0,"time":694},{"id":0,"name":"Dino Crisis 39","score":0,"time":-7},{"id":0,"name":"Dead Rising 76","score":0,"time":72819},{"id":0,"name":"(1)Super Saiyan Level 69","score":0,"time":471},{"id":0,"name":"Super Saiyan Level 59","score":-1,"time":258},{"id":0,"name":"Super Saiyan Level 65","score":3,"time":811},{"id":0,"name":"Super Saiyan Level 1","score":0,"time":46089},{"id":0,"name":"Super Saiyan Level 67","score":1,"time":783},{"id":0,"name":"Super Saiyan Level 98","score":2,"time":640},{"id":0,"name":"Super Saiyan Level 79","score":7,"time":66513},{"id":0,"name":"CYBER 4","score":0,"time":1166},{"id":0,"name":"Dino Crisis 7","score":0,"time":262},{"id":0,"name":"Dino Crisis 22","score":0,"time":66},{"id":0,"name":"Super Saiyan Level 90","score":5,"time":488},{"id":0,"name":"Super Saiyan Level 24","score":1,"time":758},{"id":0,"name":"Super Saiyan Level 31","score":-1,"time":264},{"id":0,"name":"Super Saiyan Level 11","score":-1,"time":838},{"id":0,"name":"Super Saiyan Level 80","score":0,"time":32},{"id":0,"name":"Super Saiyan Level 85","score":5,"time":33680},{"id":0,"name":"CYBER 2","score":0,"time":437},{"id":0,"name":"CTM leo CTM","score":1,"time":-29},{"id":0,"name":"[10000]-=CTMCTM=-[10000]","score":1,"time":75},{"id":0,"name":"-=leonsita=-","score":1,"time":248},{"id":0,"name":"-=Naira=-","score":1,"time":678},{"id":0,"name":"Dead Rising 48","score":0,"time":110725},{"id":0,"name":"(1)Marycielo","score":3,"time":31},{"id":0,"name":"Dead Rising 10","score":2,"time":16253},{"id":0,"name":"Dino Crisis 61","score":0,"time":421},{"id":0,"name":"Dino Crisis 23","score":1,"time":61118},{"id":0,"name":"Dino Crisis 11","score":-1,"time":561},{"id":0,"name":"Dino Crisis 82","score":0,"time":6583},{"id":0,"name":"Dino Crisis 24","score":-1,"time":551},{"id":0,"name":"sofia la pro","score":0,"time":1269},{"id":0,"name":"Dead Rising 87","score":-1,"time":134570},{"id":0,"name":"Dead Rising 85","score":0,"time":37},{"id":0,"name":"Dead Rising 27","score":0,"time":141534},{"id":0,"name":"Dead Rising 63","score":0,"time":-40},{"id":0,"name":"Dead Rising 83","score":0,"time":-15},{"id":0,"name":"Super Saiyan Level 14","score":-1,"time":361},{"id":0,"name":"Dead Rising 29","score":0,"time":51269},{"id":0,"name":"Dead Rising 86","score":6,"time":86716},{"id":0,"name":"Dead Rising 52","score":0,"time":45854},{"id":0,"name":"Super Saiyan Level 23","score":-1,"time":345},{"id":0,"name":"[10000]-0Naira=-[10000]","score":1,"time":-21},{"id":0,"name":"Dead Rising 18","score":1,"time":90},{"id":0,"name":"Super Saiyan Level 5","score":5,"time":110065},{"id":0,"name":"(1)Cambiame en rev.ini","score":0,"time":169739},{"id":0,"name":"Super Saiyan Level 55","score":2,"time":196958},{"id":0,"name":"Super Saiyan Level 9","score":0,"time":285},{"id":0,"name":"Super Saiyan Level 60","score":3,"time":159639},{"id":0,"name":"Super Saiyan Level 94","score":2,"time":78420},{"id":0,"name":"Super Saiyan Level 36","score":-3,"time":561},{"id":0,"name":"Super Saiyan Level 88","score":3,"time":172283},{"id":0,"name":"Dino Crisis 79","score":0,"time":58626},{"id":0,"name":"Dead Rising 78","score":0,"time":56},{"id":0,"name":"Dead Rising 79","score":0,"time":77},{"id":0,"name":"Super Saiyan Level 66","score":0,"time":195354},{"id":0,"name":"Dead Rising 59","score":0,"time":130826},{"id":0,"name":"Dead Rising 45","score":0,"time":24},{"id":0,"name":"Dead Rising 3","score":0,"time":105078},{"id":0,"name":"Dead Rising 44","score":0,"time":46788},{"id":0,"name":"Dino Crisis 12","score":-1,"time":1069},{"id":0,"name":"Dead Rising 80","score":0,"time":-57},{"id":0,"name":"[10000]-=Naira=-[1000]","score":4,"time":5853},{"id":0,"name":"Dead Rising 5","score":0,"time":165158},{"id":0,"name":"Super Saiyan Level 63","score":1,"time":243365},{"id":0,"name":"Super Saiyan Level 37","score":1,"time":160862},{"id":0,"name":"Dino Crisis 76","score":-1,"time":725},{"id":0,"name":"Dead Rising 66","score":0,"time":88933},{"id":0,"name":"Dino Crisis 69","score":0,"time":47582},{"id":0,"name":"Dead Rising 46","score":0,"time":197167},{"id":0,"name":"Dead Rising 14","score":0,"time":156298},{"id":0,"name":"Dead Rising 99","score":0,"time":269975},{"id":0,"name":"Dead Rising 31","score":0,"time":-1},{"id":0,"name":"Dead Rising 49","score":0,"time":825},{"id":0,"name":"Dead Rising 40","score":0,"time":36324},{"id":0,"name":"Dead Rising 16","score":0,"time":165443},{"id":0,"name":"Dino Crisis 2","score":0,"time":193339},{"id":0,"name":"Dead Rising 94","score":2,"time":202199},{"id":0,"name":"Dead Rising 69","score":-1,"time":61},{"id":0,"name":"Dead Rising 35","score":4,"time":277885},{"id":0,"name":"Dead Rising 11","score":0,"time":249860},{"id":0,"name":"-=Nairia=-","score":0,"time":237},{"id":0,"name":"Dead Rising 23","score":6,"time":122935},{"id":0,"name":"**]=-Niaria=-[**","score":-1,"time":152},{"id":0,"name":"Dead Rising 38","score":0,"time":280384},{"id":0,"name":"?¿'¿'¿?¿?¿?¿?¿?","score":0,"time":-1},{"id":0,"name":"Dead Rising 73","score":0,"time":176218},{"id":0,"name":"Dino Crisis 32","score":1,"time":119432},{"id":0,"name":"Dead Rising 53","score":0,"time":128660},{"id":0,"name":"Dino Crisis 20","score":0,"time":217331},{"id":0,"name":"Dino Crisis 47","score":-1,"time":143291},{"id":0,"name":"Dead Rising 96","score":0,"time":30},{"id":0,"name":"Dead Rising 95","score":0,"time":-14},{"id":0,"name":"Dino Crisis 21","score":0,"time":144364},{"id":0,"name":"Dead Rising 90","score":8,"time":126797},{"id":0,"name":"Dino Crisis 43","score":0,"time":171731},{"id":0,"name":"Dead Rising 1","score":-1,"time":42},{"id":0,"name":"Dead Rising 72","score":-1,"time":269117},{"id":0,"name":"Super Saiyan Level 68","score":3,"time":254945},{"id":0,"name":"Dino Crisis 71","score":-4,"time":365},{"id":0,"name":"Super Saiyan Level 77","score":0,"time":117507},{"id":0,"name":"Dead Rising 6","score":0,"time":41},{"id":0,"name":"Dead Rising 26","score":-1,"time":365},{"id":0,"name":"Dead Rising 77","score":3,"time":286589},{"id":0,"name":"Super Saiyan Level 13","score":0,"time":179000},{"id":0,"name":"(1)REVOLUTiON","score":0,"time":0},{"id":0,"name":"Super Saiyan Level 48","score":-1,"time":379},{"id":0,"name":"Dead Rising 58","score":0,"time":107684},{"id":0,"name":"Dead Rising 28","score":-1,"time":126910},{"id":0,"name":"Dead Rising 47","score":0,"time":15067},{"id":0,"name":"Super Saiyan Level 84","score":0,"time":102979},{"id":0,"name":"Dead Rising 64","score":-1,"time":262426},{"id":0,"name":"Dead Rising 60","score":0,"time":179013},{"id":0,"name":"[10000]=-=Naira=-=[10000]","score":0,"time":78},{"id":0,"name":"Dead Rising 50","score":-2,"time":635},{"id":0,"name":"Dead Rising 20","score":0,"time":205827},{"id":0,"name":"Dead Rising 17","score":1,"time":246564},{"id":0,"name":"Dead Rising 57","score":0,"time":319683},{"id":0,"name":"[10000]-=Naira=-[10000]","score":2,"time":323130},{"id":0,"name":"Dead Rising 98","score":0,"time":208709},{"id":0,"name":"Dino Crisis 26","score":0,"time":33171},{"id":0,"name":"Dead Rising 93","score":2,"time":332947},{"id":0,"name":"Dead Rising 71","score":0,"time":55266},{"id":0,"name":"Dead Rising 67","score":0,"time":12484},{"id":0,"name":"REVOLUTiON","score":0,"time":330609},{"id":0,"name":"Dead Rising 15","score":0,"time":61044},{"id":0,"name":"Dead Rising 2","score":0,"time":106526},{"id":0,"name":"Dead Rising 92","score":10,"time":343955},{"id":0,"name":"Dead Rising 70","score":0,"time":64584},{"id":0,"name":"Dead Rising 88","score":0,"time":55397},{"id":0,"name":"Dead Rising 82","score":0,"time":107385},{"id":0,"name":"Dead Rising 97","score":0,"time":315293},{"id":0,"name":"Dead Rising 36","score":0,"time":116},{"id":0,"name":"Dead Rising 9","score":6,"time":274417},{"id":0,"name":"Dead Rising 39","score":-2,"time":326901},{"id":0,"name":"Dead Rising 30","score":0,"time":29258},{"id":0,"name":"Dino Crisis 80","score":3,"time":189},{"id":0,"name":"Super Saiyan Level 52","score":2,"time":290173},{"id":0,"name":"Super Saiyan Level 86","score":4,"time":270151},{"id":0,"name":"Super Saiyan Level 83","score":8,"time":616},{"id":0,"name":"Super Saiyan Level 76","score":2,"time":344544},{"id":0,"name":"Dino Crisis 14","score":-1,"time":302663},{"id":0,"name":"Dino Crisis 88","score":0,"time":1413},{"id":0,"name":"Dino Crisis 77","score":0,"time":165141},{"id":0,"name":"by l4dzone.ru","score":0,"time":296680},{"id":0,"name":"Super Saiyan Level 34","score":-1,"time":405422},{"id":0,"name":"Super Saiyan Level 28","score":-1,"time":1163},{"id":0,"name":"Super Saiyan Level 93","score":0,"time":386687},{"id":0,"name":"Super Saiyan Level 81","score":1,"time":427},{"id":0,"name":"Super Saiyan Level 41","score":-1,"time":593},{"id":0,"name":"Super Saiyan Level 58","score":-1,"time":313567},{"id":0,"name":"(1)Super Saiyan Level 16","score":4,"time":428},{"id":0,"name":"Super Saiyan Level 50","score":1,"time":521},{"id":0,"name":"Super Saiyan Level 72","score":3,"time":427420},{"id":0,"name":"Super Saiyan Level 32","score":1,"time":410401},{"id":0,"name":"Super Saiyan Level 26","score":0,"time":316925},{"id":0,"name":"Cambiame en rev.ini","score":0,"time":396461},{"id":0,"name":"Dead Rising 62","score":0,"time":424001},{"id":0,"name":"Dead Rising 41","score":0,"time":185},{"id":0,"name":"Super Saiyan Level 39","score":-1,"time":569},{"id":0,"name":"Super Saiyan Level 25","score":0,"time":226427}],"port":27022,"protocol":7,"secure":1,"steamappid":500,"version":"1.0.2.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d/2_response.txt b/gameq/tests/Protocols/Providers/L4d/2_response.txt deleted file mode 100644 index 610fd60ed5f9fab05d2390afb8ba207230268a7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 717 zcmZXRO>0v@6oyazswoJ9f8Z7h)SQ{>l()B|-Ivc^Jp!|*;zWmO;~=iLz|b)4DY*$R_PS9u>Ts2FS&vnLHX#LnH!Al* zm9WvM)oab#WB7Qkx6aPCj%W(^gn!!+ z-pMA_HYN$eZ9x~mf3A*pFn?&HHx7LU6%jst{<3c9csAo9TDT=N{qePPnda#ONLfK0 zv>j@z1I3O!xq{+?oY!nYMz9>;0G%TfqcL1U<2o9%A`jPzL#ucU%@uQuDnTFOMC{gP zS8O=EG`m8X4*wk+X=B!Y(kUf@)Ife+EIE(;#1*u&%6 diff --git a/gameq/tests/Protocols/Providers/L4d/2_result.json b/gameq/tests/Protocols/Providers/L4d/2_result.json deleted file mode 100644 index f9b8de0..0000000 --- a/gameq/tests/Protocols/Providers/L4d/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.74.97.37:27015":{"dedicated":"d","game_descr":"L4D - Co-op - Advanced","game_dir":"left4dead","god":"0","gq_address":"64.74.97.37","gq_joinlink":"steam:\/\/connect\/64.74.97.37:27015\/","gq_name":"Left 4 Dead","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d","hostname":"=HS= Headshots live here in Chicago!! (NFO)","infinite_reserve_version":"1.0","l4d_barrel_allow":"1","l4d_barrel_modes":"","l4d_barrel_random":"2","l4d_broadcast_con":"0","l4d_broadcast_ff":"1","l4d_broadcast_hit":"0","l4d_broadcast_kill":"2","l4d_infectedbots_coop_survival_tank_playable":"0","l4d_votemanager2":"1.5.5","map":"l4d_city17_03","max_players":16,"nextlevel":"","num_bots":0,"num_players":9,"num_rules":19,"os":"w","password":0,"players":[{"id":0,"name":"Mojo","score":2,"time":1593.2625732422},{"id":0,"name":"X-Ray","score":8,"time":1593.2614746094},{"id":0,"name":"=HS= Bad Bob Molly","score":7,"time":1593.1385498047},{"id":0,"name":"Mike Wazowski","score":6,"time":1570.9587402344},{"id":0,"name":"=HS=SideShowBawb","score":3,"time":1556.2498779297},{"id":0,"name":"=HS=MaddMonkey","score":13,"time":1553.1448974609},{"id":0,"name":"Chu-Bacca","score":5,"time":1542.1799316406},{"id":0,"name":"=HS=Cap'n Trash","score":9,"time":1124.1408691406},{"id":0,"name":"=HS= Azzofan","score":4,"time":309.47970581055}],"points_gift_on":"1.278","port":27015,"protocol":7,"secure":1,"steamappid":500,"sv_alltalk":"1","sv_cheats":"0","sv_contact":"contact@azzofan.com","sv_password":"0","sv_steamgroup":"1831321","sv_voiceenable":"1","version":"1.0.2.9"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d2/1_response.txt b/gameq/tests/Protocols/Providers/L4d2/1_response.txt deleted file mode 100644 index cf2a3dd68b94c41137125703a0852eb14e0fed3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4744 zcmb7I!HyhB5zX-$v04rb5&{Wvs1*{}+S#V7r+da05@Ke0);4Ry$TnUJu`05wvbs~9 zRau*vRXy#s#DN16Cphhi6T=z#7dXKua0DcN0g1z!7n#-5)zi&NJCZ$>5s?v*kr6K< z=k@E?uOEDE$_rzAsg7Po?@a1t6!)9BAAKig>D?kuxKd(inG(4hW`bt}_7I=ZFdAbK z4cK>Yy!{Q9DYiH0#l3^xUH0lX^2Yu*h5P!C_8MVqZTG#x{XxI6`_R8XO>?){mt|@M zw<1dleo-mDgzSF1!HTpt0;-w+dF$oNx8UjP@!RYPm!*py%XH4Z0^YCw`|mUMSnIhI zaX)6?0_l&#-<`1sk&<%}xtWL-d>Jiu9Zigm3gPwr?H}ZiBH>=Cz4nCL^kECt&G^|$|dbIgvFxZq_bOmbf+1uA3j{{D?IyLJ4*@$G1Q_UysK z@lWruFM;0s*I!TBS@}XoCqGQN$!ruyHZ{ERmOuIP$EWO}zPRu@{=QVFuqdoE`utvR zntJLl|B|0Fx-Yeq*2SK7`?Fu4uyeS;tzUoor%z5Owx1!kkH5{>O?G*c;(YdsP3kP0 zan@(4))jt1lbaRXr85>|k#dzA@o_E6bjf0{r4gyqCgJ%!ak3D)c5FCe*|Ow?ObhL@ zgzi@Ak_~!;-jGdo2DNIK4HBMZy0nQ%m8`5_@5O<9vN%r84X!&mopF~uveT!_O0dD2 z`$Q;MeJXg7yl-@o;Ald@Kd+UxKbh%8a;l^#-GgzLL3_M(a;%hIoYxb(n|)UDi4y0$ zhGVVb)OL=tqSe;Hfm9a-!n+oTdwo=d_a~PnS7JKT)+L6QQ&H$F5ng?^QoU2g3nR#F zw06p@VoUZ`az=<3;>y*y*Seb5N+m{E;SyaYqNv<*brI9LOm&GgQdISNF*WcH`6?nO;Gb4bZ&sawofzsqtpf4O@)T&x5o~I4+d{qZ^H3h7Til_5UzuK#8 zWY@1&&4+?ly8KzGGq)D-QT&gVAVB15#wV2&V|U+)SDlX9HoaeHfCWB}=hr_sKE`sG=<^Sx86V zPCm@hah2wob#*!ikSE#d#zVDk3#=_67_APa2zU%`oN~pZNun?V7{{l8oC+PM#kn7b_a;NiD;Cltq{gNkA(O*&2ca09EyNIlR6-8e zQEB6@D*nn~xBm`rePEv7_8wap-(a1@@loK^z+A^mSZUX$kqyR~jT#_1 zY7DF#Xz27r0T5RNrO+J#r|lXEJoD%l%;g&O=|t5!lxve>jPQC}0mG*uxWRxQR(u~i z^ac%PHjJ)0=E|_a3)2ZKS{+=%qrm`G(UiOb{~h`madFiO!FM9Ttu?Q$W3PZz zqr@DWO$`QwAJ~+pMj}8RF)3w(E$>BAmu)OpN#X@JO*xHD%>msm>|FRB0S8)53t6rl zE5(IFFU0)HOmZyEM058Hs62*cQPTgupmy-y#~{v*P;48#pWheMY=At(_^}YxPHmfv zj;a-7rH9H7ik^v?OqE#c!tK~eCohM+7?c7-eId)lQVcPacLeZEL>+qxWHTZxC_d}D zq=X-Nem-A!^8-)^p1PK#dWW8rmu2X$>*^SKhAwkCrD8~^b%oCFpCG6m67Y|j3GTMz zo_C%uqrhW}gbYUFwx=JWWI>@024%=+$FIQ;aVx`@R|-eyeMBUHA@}O8`y(`XVj?XJ z4bU7j!nHFrlM1uyCKXAQ`q#r+7MchQ-W~QwcNrdn5>uWZbo_B+j6yhYeI3+nlkhYJ zjAD4h0LWh6a$kY!9h)k1U3~MCbCwC}g8mf8p5Sp6$ed-4EL-bP9)3M`=KT4o(Dh#xs z#0yp2+69Kc;22&$fXAt74@k=(I|zoTgIza6w4jzsq48ZVY&!5uLP7ZgD27A;*Xb&7 zF^FJ|!3P*ge{lH%e;=WZjg~2f7DDV`cY!Xu8qZ^-=KlZ>hGVV( diff --git a/gameq/tests/Protocols/Providers/L4d2/1_result.json b/gameq/tests/Protocols/Providers/L4d2/1_result.json deleted file mode 100644 index 896c3e9..0000000 --- a/gameq/tests/Protocols/Providers/L4d2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"216.52.148.77:27015":{"buddha":"0","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","director_afk_timeout":"45","dynamicmotd_version":"2.2.4","game_descr":"Left 4 Dead 2","game_dir":"left4dead2","game_id":550,"god":"0","gq_address":"216.52.148.77","gq_joinlink":"steam:\/\/connect\/216.52.148.77:27015\/","gq_name":"Left 4 Dead 2","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d2","hostname":"gamrs.co | !buy 10v10 #1","keywords":"versus,10v10,20vs,buy,gcftw,increased_maxplayers,versus,secure","l4d2_BwA_Print_Chat_MsgType":"2","l4d2_BwA_SelectTeam_From_Panel":"1","l4d2_BwA_Show_ClientID":"1","l4d2_BwA_TeamPanel_AllowPubs":"1","l4d2_BwA_TeamPanel_EnablePause":"1","l4d2_WeaponUnlock":"0.8.1","l4d2_addons_eclipse":"-1","l4d2_cs_version":"2.1","l4d2_custom_commands_version":"1.0.9","l4d2_finaleghost_rangemod_enabled":"1","l4d2_finaleghost_rangemod_range":"100","l4d2_finaleghost_rangemod_version":"1.0.0","l4d2_freeze_version":"1.1","l4d2_full_reset_on_empty":"0","l4d2_guncontrol_allowgrenadereplenish":"1","l4d2_guncontrol_allowm60replenish":"1","l4d2_guncontrol_assaultammo":"360","l4d2_guncontrol_autoshotgunammo":"90","l4d2_guncontrol_explosiveammomulti":"1","l4d2_guncontrol_grenadelauncherammo":"30","l4d2_guncontrol_huntingrifleammo":"150","l4d2_guncontrol_incendammomulti":"1","l4d2_guncontrol_m60ammo":"150","l4d2_guncontrol_shotgunammo":"56","l4d2_guncontrol_smgammo":"650","l4d2_guncontrol_sniperrifleammo":"180","l4d2_guncontrol_turnGLintoM60chance":"2","l4d2_guncontrol_version":"1.1.3","l4d2_incappedmedsmunch_delaytime":"5.0","l4d2_incappedmedsmunch_dropmeds":"1","l4d2_incappedmedsmunch_duration":"3.0","l4d2_incappedmedsmunch_version":"1.1.9","l4d2_nmelevatorfix_version":"1.0","l4d2_plp_version":"1.2.2","l4d2_points_system_version":"2.2.5gc","l4d2_team_manager_ver":"1.3.0","l4d2_team_order":"0","l4d2_upgradepackfix_version":"1.6","l4d2_vip_version":"1.0","l4d_XtraHP":"0","l4d_ghostpounce_flightspawnallowed":"1","l4d_ghostpounce_version":"1.0.4","l4d_hats_menu":"a","l4d_hats_opaque":"255","l4d_hats_random":"0","l4d_hats_third":"0","l4d_hats_version":"1.4.3","l4d_hats_view":"0","l4d_infected_limit":"10","l4d_kickloadstuckers_duration":"90","l4d_kickloadstuckers_version":"1.0.8","l4d_killreservation":"1","l4d_lasertag_alpha":"100","l4d_lasertag_blue":"255","l4d_lasertag_bots":"0","l4d_lasertag_bots_alpha":"70","l4d_lasertag_bots_blue":"75","l4d_lasertag_bots_green":"255","l4d_lasertag_bots_red":"0","l4d_lasertag_enable":"1","l4d_lasertag_green":"125","l4d_lasertag_life":"0.30","l4d_lasertag_offset":"36","l4d_lasertag_pistols":"1","l4d_lasertag_realism":"1","l4d_lasertag_red":"0","l4d_lasertag_rifles":"1","l4d_lasertag_shotguns":"1","l4d_lasertag_smgs":"1","l4d_lasertag_snipers":"1","l4d_lasertag_version":"1.0","l4d_lasertag_vs":"1","l4d_lasertag_width":"1.0","l4d_reserved_spectators_playersb4kick":"8","l4d_reserved_spectators_timetokick":"10.00","l4d_respawnteleport_version":"1.0","l4d_rs_version":"1.4(KrX)","l4d_stats_version":"1.4B117","l4d_supertank":"1","l4d_survivor_limit":"10","l4d_tank_hpmulti":"0.25","l4d_votekick_version":"1.0","l4d_votemanager2":"1.5.7","left4downtown_version":"0.5.7","map":"c9m1_alleys","max_players":22,"metamod_version":"1.10.2-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"6","mp_friendlyfire":"1","mp_limitteams":"2","mp_maxrounds":"0","mp_roundtime":"5","mp_stalemate_at_timelimit":"0","mp_stalemate_enable":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","num_bots":0,"num_players":15,"num_rules":177,"os":"l","password":0,"players":[{"id":0,"name":"Saint Rick","score":11,"time":7391.3120117188},{"id":0,"name":"Rookie101","score":26,"time":4614.5795898438},{"id":0,"name":"I like the way you bro me","score":0,"time":2846.1115722656},{"id":0,"name":"â¤DiXie v7.1â¤","score":8,"time":2567.3557128906},{"id":0,"name":"kenny11ckl","score":2,"time":884.51568603516},{"id":0,"name":"CaP'M \/AcediA\\","score":2,"time":849.88037109375},{"id":0,"name":"Brad ArmPitt","score":7,"time":674.3603515625},{"id":0,"name":"Master Wayne","score":1,"time":547.86779785156},{"id":0,"name":"Alexander_Hell","score":0,"time":526.26824951172},{"id":0,"name":"(AKA) DEVILDOG","score":5,"time":401.77484130859},{"id":0,"name":"Enzo B>cards 1 scrap","score":2,"time":241.68547058105},{"id":0,"name":"Loxx","score":0,"time":236.47596740723},{"id":0,"name":"MaestroPG.gc","score":0,"time":230.75927734375},{"id":0,"name":"deadlyist1","score":0,"time":65.996406555176},{"id":0,"name":"Pandas","score":0,"time":62.911708831787}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.11","secure":1,"sm_admin_sentinel_version":"1.2.100","sm_advertisements_version":"0.5.5","sm_afkm_version":"3.5.2","sm_as_version":"1.0","sm_cannounce_version":"1.4","sm_configauto_loader_version":"0.2","sm_deathbeam_version":"1.1","sm_nextmap":"","sm_rconlock":"0.6.7","sm_server_restart_version":"1.0","sm_spray_version":"5.8","sm_superversus_version":"1.5.4","sm_swearreplace_version":"1.4","sm_vbping_version":"1.4","sourcemod_version":"1.5.4-dev+4059","steam_id":90094482692189186,"steamappid":550,"stripper_version":"1.2.2","survivor_limit":"10","sv_accelerate":"5","sv_admin_sentinel_warmode":"0","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"1000.000000","sv_noclipaccelerate":"5","sv_noclipfriction":"4","sv_noclipspeed":"5","sv_password":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"10v10,20vs,buy,gcftw,increased_maxplayers,versus","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tauntfrequency":"1","tf_arena_max_streak":"5","tf_arena_preround_time":"10","tf_arena_round_time":"0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2.1.3.9","zcs_version":"0.9.2"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/L4d2/2_response.txt b/gameq/tests/Protocols/Providers/L4d2/2_response.txt deleted file mode 100644 index 4c4eac06893dbf075421726976f10e1dd86fb78d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 zcmai0&2Ah;5N;<1B;O)&;etj&0s;1TXTA2?;zD3SAvnPzmZcCyqu!pH+1B<<58XYx zS<83CfdjWZK;VWDcZ85~jZpFm+;{^{F;(5Oe^w+c*`BVduKMb~FE1}IzqnC1rdHq# zK+c8JX7-+qESL$H=pq{2JdPfm9&{c?yU~f!(H)&dy|^29ndp{DI+Dd`%4bYL?s^&U ztjmt^GwMYHJVagg?zOGASfekVsb(8^ z{QGS@UR<2<>T4Lo#f2xnAmYv)K>uWw>0|n{!!}X;8F6lD>!RIVb{z>%iSXdT;IAK_ zKQ3PU@ch@Oj~n~&VRY~5FLqXsv}LcO)So2vW#hOBR?lDFAFvZW#o(PZdCmy$KRhf0faIzsIhU@WU56(ep6%tlI?Bcut|f!7e~C9QY~X2I>o z`+?hFl=D30Ri&Fs0Alu+TC%ru4n}8X!TM{g42Df{MI0(VRB%PG225gt$^Sy>Ay?>w3mVf}TBlW-0oGWWHC#!stP}g7tTVABd0j(>+&u!g&b1gDMAQkv zNU?acSvu5il#aNXkWPOm&_!POFtPP+BBiZ>E^Bb164oy2szO)N;D4LD_D&`(1tqmL zpH}PkUL{`2N|sHTw#~&3SMb%mv5<15u!b`hybZttCueCQ zCe%@juq_buo~;<0*AWK2A7iaj6s&8+_*|Dm2_+~TO7hX7qA;~_&r3O8jWb^I0mTj7v?+he%xmzI9}>(K}C7QwUfc* zjFoi=-QAN7n9cJSQj>LeZWTwIbrKG+f1Gov!u>wnA2jMKC z%G4~!K@u)_Ve-JTE=k~=HrUx2B3zqU8&5Wg?Rj3G_su%40Ou7}ne&dV*k1D5Hus3g zl)`3Zqrx8gKi&TLa<`W>Bi8!s#>?Fz-yd>Zmwx6 ztGRRqkDP)DD8?#1mTox!v2d|kOnOtAq2}&P!gPReprXHi61{@=IgV%6$L?9JA$L`E^e0@geAAT;WSy`+x`C9(d#*N3f#8xALR(&=Er{SWD=G%fQLEFNB#~g@=dzHa`a0ZpZU!zg{&%w4j!XZGvkFM7Xr)kJO|EPKBE7b@!6) zUVpon9QAvhe#@<`JjYRU7>>FQcl#clGDKN0qrF5NTyULD{y^=)@IhV zC!494T0|*fe%WYk)>lyv={Sv69$U=eBgddUnuxf_a5IjvE*8|<;425`q@Q~9Hd}C3 W$Vi>EI}I~{-z)jRlcCqj3h6)iB@*%g diff --git a/gameq/tests/Protocols/Providers/L4d2/2_result.json b/gameq/tests/Protocols/Providers/L4d2/2_result.json deleted file mode 100644 index e0507bd..0000000 --- a/gameq/tests/Protocols/Providers/L4d2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.151.244.151:27015":{"buddha":"0","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","director_afk_timeout":"45","game_descr":"Left 4 Dead 2","game_dir":"left4dead2","game_id":550,"god":"1","gq_address":"66.151.244.151","gq_joinlink":"steam:\/\/connect\/66.151.244.151:27015\/","gq_name":"Left 4 Dead 2","gq_online":true,"gq_port_client":27015,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"l4d2","hostname":"purpletreefactory's server | DAL [T60] \/ Pro Mod 4.2.2","keywords":"versus,confogl,gravity,increased_maxplayers,secure","l4d2_addons_eclipse":"1","l4d2_block_heatseeking_chargers_version":"1.2","l4d2_server_namer_version":"2.5","l4d2_undoff_announce":"0","l4d2_undoff_blockzerodmg":"7","l4d2_undoff_debug":"0","l4d2_undoff_enable":"7","l4d2_undoff_permdmgfrac":"1.0","l4d_block_spectator_globalchat":"0","l4d_pistol_delay_dualies":"0.1","l4d_pistol_delay_incapped":"0.3","l4d_pistol_delay_single":"0.2","l4d_ready_both_halves":"0","l4d_ready_cfg_name":"Pro Mod 4.2.2","l4d_ready_competition":"0","l4d_ready_connect_enabled":"1","l4d_ready_disable_spawns":"0","l4d_ready_enabled":"1","l4d_ready_minimum_players":"8","l4d_ready_pause_allowed":"3","l4d_ready_pause_duration":"90.0","l4d_ready_search_key_disable":"1","l4d_ready_server_cfg":"","l4d_ready_version":"0.17.10","l4d_stuckzombiemeleefix_version":"1.0.4","l4d_tankdamage_enabled":"1","l4d_tpsblock_version":"1.4","l4d_unreserve_full":"1","l4d_unreserve_version":"1.1.1","left4downtown_version":"0.5.7","map":"c2m1_highway","max_players":25,"metamod_version":"1.11.0-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_c4timer":"45","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"1","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_freezetime":"6","mp_friendlyfire":"1","mp_limitteams":"2","mp_maxrounds":"0","mp_roundtime":"5","mp_stalemate_at_timelimit":"0","mp_stalemate_enable":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_teams_unbalance_limit":"1","mp_timelimit":"0","mp_tournament":"0","mp_weaponstay":"0","mp_winlimit":"0","nextlevel":"","nokits_version":"0.1.1","num_bots":0,"num_players":10,"num_rules":119,"os":"l","password":0,"players":[{"id":0,"name":"Taco","score":7,"time":1097.2863769531},{"id":0,"name":"LiTTo","score":1,"time":1096.9650878906},{"id":0,"name":"||VanReke||","score":1,"time":1096.9630126953},{"id":0,"name":"-MeserindoLindo-","score":4,"time":1096.9624023438},{"id":0,"name":"Host \/\/","score":3,"time":1096.9613037109},{"id":0,"name":"[[DΑИgÑЯØus]] Sísyphos","score":6,"time":1096.9609375},{"id":0,"name":"Kutaro","score":1,"time":871.97619628906},{"id":0,"name":"Power Puff","score":2,"time":830.59234619141},{"id":0,"name":"Ty","score":0,"time":581.15911865234},{"id":0,"name":"Neko - Yudo #Sweet Disposition","score":0,"time":95.367820739746}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.10","scp_version":"1.1.5A","secure":1,"sm_advertisements_version":"0.6","sm_allinfo_version":"2.1.1","sm_cannounce_version":"1.6","sm_l4d2sgag_version":"0.4","sm_nextmap":"","sm_skill_detect_version":"0.9.15","sm_updater_version":"1.2.1","smac_version":"0.8.5.1","sourcemod_version":"1.6.0-dev+4171","steam_id":90094493009049603,"steamappid":550,"stop_trolls_version":"1.0","stripper_version":"1.2.2","survivor_limit":"4","sv_accelerate":"5","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"750","sv_maxspeed":"1000.000000","sv_noclipaccelerate":"5","sv_noclipfriction":"4","sv_noclipspeed":"5","sv_password":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"3231237,4197407","sv_stepsize":"18","sv_stopspeed":"75","sv_tags":"confogl,gravity,increased_maxplayers","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tankdoorfix_version":"1.4","tauntfrequency":"1","tf_arena_max_streak":"5","tf_arena_preround_time":"10","tf_arena_round_time":"0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2.1.3.9"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Lhmp/1_response.txt b/gameq/tests/Protocols/Providers/Lhmp/1_response.txt deleted file mode 100644 index dca61f957c3f67b2de5675fcd2e2c10776a397b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmebA@C_(nVBo5$;qn18^BI63g+V#mHB{F$R>31PIlm|~Q7<_^S3y?+qyR{TW#;50 prsQ(Dq$ZYR_$HPlX9#7KloVL$>t`U8bNhM*yBZqmhI#rp0sw419WVd@ diff --git a/gameq/tests/Protocols/Providers/Lhmp/1_result.json b/gameq/tests/Protocols/Providers/Lhmp/1_result.json deleted file mode 100644 index 5767549..0000000 --- a/gameq/tests/Protocols/Providers/Lhmp/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"185.91.119.30:27315":{"gamemode":"DeathMatch","gq_address":"185.91.119.30","gq_joinlink":"","gq_name":"Lost Heaven","gq_online":true,"gq_port_client":27315,"gq_port_query":27316,"gq_protocol":"lhmp","gq_transport":"udp","gq_type":"lhmp","mapname":"MISE11-VILA","maxplayers":100,"numplayers":0,"password":"","protocol":"","servername":"[EU-5] Hicoria.com - LHMP - Villadm","website":"http:\/\/hicoria.com"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Lhmp/2_response.txt b/gameq/tests/Protocols/Providers/Lhmp/2_response.txt deleted file mode 100644 index f94073dfa27d33c3fcd4a627cad1d4e0945a13b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmebA@D0dk0D=?-m1x&cUE^2yw$5DwI)DQedU8pMg-$omP~ZnhjQ&$W>Fr1=3r$3tSM3;so4JOZF0@hN*kD8 z+}&Bu%r4<8@qd_Ja4Uxn{y?jYm8?T}kFKw;-^0!NX_lAo(ap^b>|EZSdW5oAjlnB# zpmW-VUbdw()Fm(A(ri>J-;oH;Utj`sL z^xX2IEZ_1`s$&?nKMYJaXMQKMLd!fqra?SSy^K8EF1WEMN4#^Ak=z)RmNQ|<23a@f z_H>yndv=f)m6=levPH3VbGW($&Rb?LaJl@=Wx*xZ=druNxgCry1Fsr)kdb><+p|+= zWlB>Tdq3SCoX`uy&z0c~XYvk>)#~I_PiRCF=vWWq7{Gm%UNBcN5KLVD_&-YG@dNcr zTL|NL`VsOTf+V70>>","hostport":"25565","map":"world","maxplayers":"75","numplayers":"14","players":[{"player":"SlappMeDo"},{"player":"specnardo"},{"player":"hackhunter_115"},{"player":"OGthirteen"},{"player":"Roxxerx"},{"player":"weaselstomper04"},{"player":"wiliammmm"},{"player":"pyrocheerios"},{"player":"bulldog0011"},{"player":"TheRacc00n"},{"player":"BigHenry"},{"player":"Maximus1299"},{"player":"Shok252"},{"player":"LunarisNukes"}],"plugins":"CraftBukkit on Bukkit 1.8-R0.1-SNAPSHOT: WorldBorder 1.8.0; NoCheatPlus 3.12.0-SNAPSHOT-sMD5NET-b777; WorldEdit 6.0,3342-78f975b9; Vault 1.5.2-b33; ClearLag 2.7.7; PermissionsEx 1.22.7-SNAPSHOT; Modifyworld 1.19.7; Votifier 1.9; WorldGuard 6.0.0-beta-05.1569-; GAListener 1.3.1; Essentials TeamCity; EssentialsSpawn TeamCity; BookShelf 3.8; EssentialsChat TeamCity; EnjinMinecraftPlugin 2.7.1-bukkit; Factions 1.6.9.5-U0.1.15-SNAPSHOT; ObsidianDestroyer 4.3.7","version":"1.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraft/2_response.txt b/gameq/tests/Protocols/Providers/Minecraft/2_response.txt deleted file mode 100644 index d8eb1d0d85d462fc5a21a9b5362d09fd972e6087..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1594 zcmYjR+mfR;5LNylpFm#nv{1$vU*g)T*dEX9)(##DJeRjA0Wzozh?2y_Y${dx8-6oK zn%#`wkVJQ%bNY0XU!BRHs;jwf`-c2WDxq{s8%D;(=fB6*ShKr_QI3m$K06~zd-=xS zXgw}JIb)HYhpZO)d0aZbJ7X5tLMvxnj=zx-3G~o0l18yTyz+uXUl03TvbjByHzpMq zE%Ci2>FU1Zts*-~PkP&*&s;mAb$)!|4>y^3zMCF4ar))q_=l77rmI=}6dy%d*39ue zf9>o<)6lkfRIG3&9s<@*jKmRbohgn}93@k#mn`m8g=(@J!=ye*i-^~(JEBs4#9 zoPBS#cJ^htm5ddx^nmEln@rp+2xkiuQ{Hez zvzqOi!pOFE?r9k@ZR;Qo7wPt04*dQsWL@kFvu$*^B zPe^P*(SgadrJbsT#`VH9=Kgu-%nXqKdu(;t6w07AMQx?Kp31_M!jBo#)SU#LANn&F zz@dg{Q%&=;g=$LeUs9$M+MYoYAwbT{)}jr(z;+)UOGIBYtr^G$2Fj5)EUp34n8=pi z_Cvx-(-7Fq1M962=LAv8w9`7TW>i8aoGqPQ)wk!gqklp2d){!PUH}O20pJv(ImR{@ zAVtG7mBtsLDZW>VwVKmfIY&mD9oNGT>RTaA?@{0MK0-senIPuwgf!SgH=7$b#geNA zXXx$vFi(#G-I@W#-PHYZyUJiFJ7ypOP%HQ6R9zVj_e;a;1J16Z`U=v=gJpU3a)s<` z`vx*Xaw`-720>^huH~vah}d*Wqmpk+UBz9`n2{KfkB4uEhvx(44@)Is8actv`NS^N4oibf!*CwjBk#xp zmWRiD-*@;WGT96pI!9z20;AN%r9!{03C5c2{(LCp^2nguOgnk#2 zKm|N!VhAS_az9WhDS1t}{yvZ`t!ivXvSmj8Z?tBaPd2h1u(Bw28o9j0qU&qBc@{4h f67iPh#wZWH&Z*MmEQAz-+=|N(nN7P`%nA7qyioJb diff --git a/gameq/tests/Protocols/Providers/Minecraft/2_result.json b/gameq/tests/Protocols/Providers/Minecraft/2_result.json deleted file mode 100644 index 368a383..0000000 --- a/gameq/tests/Protocols/Providers/Minecraft/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.50.111.251:25565":{"game_id":"MINECRAFT","gametype":"SMP","gq_address":"74.50.111.251","gq_joinlink":"minecraft:\/\/74.50.111.251:25565\/","gq_name":"Minecraft","gq_online":true,"gq_port_client":25565,"gq_port_query":25565,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraft","hostip":"74.50.111.251","hostname":"§7={§9§leGO§r§7}= §eSurvival§8, §dSkyblock§8 & §bPlots §8§!","hostport":"25565","map":"spawnisland","maxplayers":"60","numplayers":"15","players":[{"player":"Acefire97"},{"player":"Pslacorte"},{"player":"Nightcutter98"},{"player":"Mochaccino3"},{"player":"StarRazor"},{"player":"misterboy500"},{"player":"Lyarra"},{"player":"_Ritzy"},{"player":"Bahlman"},{"player":"BenishKaleb1"},{"player":"ArlyeToathe"},{"player":"xXPopulation7Xx"},{"player":"MinecraftOutcast"},{"player":"kooroo"},{"player":"FoxyMomma776"}],"plugins":"CraftBukkit on Bukkit 1.8-R0.1-SNAPSHOT: SimplePVPToggle 1.1; CommandUsed 0.0.1; PlugMan 2.0.2; PressurePush 0.8; Vault 1.4.1-b436; PlotMe 0.16.3; MAUL_MC 0.0.4; NetherPortalRescue 1.1.0; RemoteToolkitPlugin R10_A15.3; dynmap 2.1-SNAPSHOT-1091; eGODS 0.8.4; Decapitation 0.2.8; ChestShopFinder 0.9.4; Votifier 1.9; EggBreeding 0.2.0; PlotMe-DefaultGenerator 0.16.1; mcMMO 1.5.00-b3547; PlgDisableCmd 2.0; LagMeter 1.16.0; SBC 0.0.7; WorldEdit 6.0,3342-78f975b9; RepairRecipe 0.4.10; PlayerSnapshot 0.7.2; LWC 4.5.0-SNAPSHOT; eGOAds 0.1.0; WorldGuard 6.0.0-beta-03.1514-; PotionStacker 1.0; PEXSetRank 1.0.0; SignEdit 3.3.8; VoteRoulette 2.3.2; TimePlayed 0.1.0; BuyRegion 1.1.7; BookRules 2.1.1; ClearLag 2.7.2; ChunkSpawnerLimiter 3.0.3; RandomTP 1.1.0; MyWarp 2.5.2; Essentials TeamCity; WorldBorder 1.7.4; Multiverse-Core 2.5-b691; Prism 2.0.4-18; uSkyBlock 2.2-HF9b; CraftBook 3.9-SNAPSHOT; ChestShop 3.8.1; EssentialsChat TeamCity; EssentialsSpawn TeamCity; Multiverse-Inventories 2.5-b335; VanishNoPacket 3.18.1; Multiverse-NetherPortals 2.5-bUNKNOWN; NameRetriever 1.0.3; PermissionsEx 1.19.5; ScoreboardStats 0.7.5; AdminChat 0.0.9; BottledExp 1.7.1; GriefPrevention 10.8; AdminTime 1.5.1","version":"1.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraft/3_response.txt b/gameq/tests/Protocols/Providers/Minecraft/3_response.txt deleted file mode 100644 index e769408198445542da271b9ede9326d6d5673917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 842 zcmZ8g-IAIx6i(lukB|o_nSg*=ZYr$Zby{6UnCYbxBx*)Tm?XI6u8-am>{i-4^5x`w zKj(lxV*15&jj*zB(JypS#!A+5w84$Ia$Jcsu6kKVW+YSXEtwo zgJ-TW_0n~@3OutaUcGAJ&!&oUtt>yo(NN}l{kcW(E zYeo~J+*GKRk2&}R(wnkn7dEAO1hayC(q4eUM?wyJ?zyqf1|>AX+}<<8E|f<^ie^wgDS2Ev7u7uaM^@3XH#uQ`2FIsdbLSqG1w)9yxaYO8O7iR?I)f=$ z!WdF!#4!{4*b9i@jul)QrD3j`=>f1A1YTw@OrG~lG=B#R3ZBMo^8TlzWI++E8SEtt y5~hq`>AQvvFmB{-e!d?9I{pbASVut=#nE^a9g0J;3?Vg2f*?ld!~MYlA@myyCktNy diff --git a/gameq/tests/Protocols/Providers/Minecraft/3_result.json b/gameq/tests/Protocols/Providers/Minecraft/3_result.json deleted file mode 100644 index d84c8a9..0000000 --- a/gameq/tests/Protocols/Providers/Minecraft/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.94.100.226:25565":{"game_id":"MINECRAFT","gametype":"SMP","gq_address":"64.94.100.226","gq_joinlink":"minecraft:\/\/64.94.100.226:25565\/","gq_name":"Minecraft","gq_online":true,"gq_port_client":25565,"gq_port_query":25565,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraft","hostip":"64.94.100.226","hostname":"I like big butts","hostport":"25565","map":"Creative","maxplayers":"20","numplayers":"0","plugins":"CraftBukkit on Bukkit 1.12-R0.1-SNAPSHOT: dynmap 2.5-Dev201706100405; WorldEdit 6.1.7,dd00bb1; Essentials TeamCity; BKCommonLib 1.12.1-v1; SignLink 1.11.2-v2; Modifyworld 1.19.7; Multiverse-Core 2.5-b641; NoCheatPlus 3.12.0-BETA2-sASO-b813; EssentialsProtect TeamCity; Multiverse-Inventories 2.5.0-SNAPSHOT-b418; Train_Carts 1.12-v2; BiomeEdit 1.0.1; EssentialsChat TeamCity; EssentialsAntiBuild TeamCity; AntiGuest 3.10.0; etCommon 2; Multiverse-NetherPortals 2.4-b530; Multiverse-Portals 2.5.0-b751; EssentialsSpawn TeamCity; GriefPrevention 12.2; RedstoneChips 0.97; BasicCircuits 0.97; SensorLibrary 0.33; TCHangRail 1.11.2-v1; Dynmap-GriefPrevention 0.80","version":"1.12"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraft/4_response.txt b/gameq/tests/Protocols/Providers/Minecraft/4_response.txt deleted file mode 100644 index 8c60f94489e1dcdf3d397de655ff74f5824e8000..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmZ8g!EW0)5S{&leu95s4NHz=`?6TeZW7mZBSh}j*b6bX1~Ma(Ly(d!1wHiBJ4&#Z z1p$Hs4&Th1_XwXxlfR=kx^b`;S2B6876~pVu#|hXY(GL_z&uwPZXW zcYh}1Bpr9)Og1k=g>epo88ae zL+v5Cn~l@ya-62=I9VS&~3i9OHoTFV!ebVA=mO6tn}y$3Rtu$sCH-Qz*#p zv@sM?iLIre*4RMzfFm;F&Eas3?tzm1o z#WA&zt93iY*sVvPJFCkah~xF*7Zxcif|by*^)%%$MSVp@vQC zg`VjJLxzR409-nRCI@J;GlEN;4b>!CaD zslwGQiaE#(K0P!5 diff --git a/gameq/tests/Protocols/Providers/Minecraft/4_result.json b/gameq/tests/Protocols/Providers/Minecraft/4_result.json deleted file mode 100644 index 5bf6df8..0000000 --- a/gameq/tests/Protocols/Providers/Minecraft/4_result.json +++ /dev/null @@ -1 +0,0 @@ -{"145.239.222.199:25565":{"game_id":"MINECRAFT","gametype":"SMP","gq_address":"145.239.222.199","gq_joinlink":"minecraft:\/\/145.239.222.199:25565\/","gq_name":"Minecraft","gq_online":true,"gq_port_client":25565,"gq_port_query":25565,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraft","hostip":"145.239.222.199","hostname":"ArcherNetwork > Factions | ArenaPvP | SkyBlock | UHC | Prison | SkyPvP","hostport":"25565","map":"BungeeCord_Proxy","maxplayers":"500","numplayers":"64","players":[{"player":"vigHD1"},{"player":"Talisman_7"},{"player":"pametnjakovic"},{"player":"koontra"},{"player":"LUKAPO1"},{"player":"_lakipro123_"},{"player":"DasGoldeneToast"},{"player":"herobrineHD"},{"player":"BlackyFTW"},{"player":"MorskoPrase23"},{"player":"Cukiome"},{"player":"x_Beraa_x"},{"player":"Martinstelma"},{"player":"Phorceus"},{"player":"JocoDaBossFTW"},{"player":"Zekaa"},{"player":"LadyVoldemort"},{"player":"Gregga17"},{"player":"SuperSemKiller2"},{"player":"Summer_Cat"},{"player":"xFadeaway_"},{"player":"Avo"},{"player":"grigoris007"},{"player":"MCGamer"},{"player":"Biljana"},{"player":"ki11er187"},{"player":"Peki"},{"player":"ImIllusions"},{"player":"Kuddeen"},{"player":"Pompeyo"},{"player":"DODOkill98"},{"player":"domainalein_"},{"player":"_XBlue_GamerX_"},{"player":"MichaelJShark"},{"player":"Dupstep"},{"player":"Konradon"},{"player":"looper"},{"player":"Makle_steren00"},{"player":"Abotonix"},{"player":"Sodie"},{"player":"Sparky04"},{"player":"michael456"},{"player":"Syki"},{"player":"MrKolumbo"},{"player":"Dino3152004"},{"player":"TryHardPvP"},{"player":"CounterT"},{"player":"darkbulbasaur"},{"player":"Wiwiwi"},{"player":"CuzImReaz"},{"player":"MamaSwigzy"},{"player":"xXMegaAwsomeXx"},{"player":"proba"},{"player":"18andOlderPlease"},{"player":"KimE"},{"player":"pupaivan2008"},{"player":"_nebojsa5_"},{"player":"ognjen123456789"},{"player":"Danio_"},{"player":"AdoX_FTW"},{"player":"ImBackBitches3"},{"player":"Maki_Kaki"},{"player":"DakiSRB"},{"player":"miniplexprogamer"}],"plugins":"","version":"ArcherNetwork 1.7.x-1.12.x"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/1_response.txt b/gameq/tests/Protocols/Providers/Minecraftpe/1_response.txt deleted file mode 100644 index a1e493dd5343c6d201b95e758df5a52c280f8c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmZusK~BRk5FCEM6Z`?9xII+Bg*FrkiJ%B_;S^cPHnDJQ%XSU9@pP6TaYB39+1Z)d z#ic0kqBlC(^NcS{E+(sH!akE7sil4rPfiU7Wt8nHU}Q2ap72^XE9mrq`tkW#z3d;_ z=7>xoYG;vUu_<dH)Y2~0pE-WVk!Ut diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/1_result.json b/gameq/tests/Protocols/Providers/Minecraftpe/1_result.json deleted file mode 100644 index a8ae294..0000000 --- a/gameq/tests/Protocols/Providers/Minecraftpe/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"149.56.28.157:19132":{"game_id":"MINECRAFTPE","gametype":"SMP","gq_address":"149.56.28.157","gq_joinlink":"minecraft:\/\/149.56.28.157:19132\/","gq_name":"MinecraftPE","gq_online":true,"gq_port_client":19132,"gq_port_query":19132,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraftpe","hostip":"0.0.0.0","hostname":"AvengeTech LoadBalancer","hostport":"19132","map":"Commission","maxplayers":"33","numplayers":"32","players":[{"player":"ToothlessYangya"}],"plugins":"PocketMine-MP 1.7dev: DevTools 1.12.7; Core 1.7.0","server_engine":"PocketMine-MP 1.7dev","version":"v1.2.7","whitelist":"off"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/2_response.txt b/gameq/tests/Protocols/Providers/Minecraftpe/2_response.txt deleted file mode 100644 index a5bff8f69e1ba1cf01cd08b9b5e69cf7c0cbccb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1186 zcmZux!EW0y4AuT%pP+rfjM!P$b-Ao@(kAHK33k>3yA-U=I6`H~kd<_~?bAomO?Mf5 zu|)Fmy+_*Oy_|d-dZU9qbmEWLyCGQUP&}ZiU57F_sdQU{ZltAyCFv!V>xPswS{MasI2bfFJ zq;JTZvE$?oox;=PVlLMRP08w+5+&f7>#&Vh5X@XE?}DqHSwsDN&MTnR^%e~(=K~l9 z%qX?YJp_!@bS%R;to8*w~y#@&w_#Yg-;c z#(K*K=S{P4o*NNE@IlummXn1Hcy$PSYH`6M+ zNDCEA$Chyyn2?V{kN&LUS}2mkYc`3U?%eudN2a5Ccd+$oVQ7TRO&vTc^j$QJ42fp? zE45)-RKBX6b=@i6kkGgQaj|NT-1*L3o6|36-&Ew#ziv+S3~9@v$+K~9bF>4EmIw3C zk~JDyUPh-;7S6VA+|RQyj+HYZn&>N`YVUfkA?#aiOc_@wG9=D79-bD^(vgi?KnMnJ zHIw0wsM4){0N)elEJ;NNz1Sa~GC}{2-oS}Id~q4Cf1gjYY$jgzI-t=*5N@~QAB^rr d{D$b^V^3=>(#v$33Gr^Md=z2`n5C%@e*s7WXp;Z{ diff --git a/gameq/tests/Protocols/Providers/Minecraftpe/2_result.json b/gameq/tests/Protocols/Providers/Minecraftpe/2_result.json deleted file mode 100644 index 0b18e95..0000000 --- a/gameq/tests/Protocols/Providers/Minecraftpe/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"104.238.128.20:19132":{"game_id":"MINECRAFTPE","gametype":"SMP","gq_address":"104.238.128.20","gq_joinlink":"minecraft:\/\/104.238.128.20:19132\/","gq_name":"MinecraftPE","gq_online":true,"gq_port_client":19132,"gq_port_query":19132,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"minecraftpe","hostip":"0.0.0.0","hostname":"Welcome to PigRaid PVP !","hostport":"19132","map":"hub2","maxplayers":"525","numplayers":"91","players":[{"player":"ste211"}],"plugins":"PocketMine-MP 1.7dev: DevTools 1.12.6; VoteReward 3; Transfer 1.1; EssentialCommands 1.0.3; ChatDefender 1.1.1; SlapperRotation 1.1; PRServer 1; RankBoard 1; VIPSlots 0.0.3; EasyMOTD 1.0a; MiniGames 1.0.0; Slapper 1.3.7; HeadRocket 1.0.0; essentialsTP 1.1.0; ProtocolHack 1.0.0; MagicTelePortal 1.3.2; PRCrate 1; iProtector 3.1a; TimerBan 2.1; PRUtil 1; PigRaid 1.0.0; BanItem 2.1; MSpawns 1.4; DataProvider 1.0.0; BuyCraft 1.2.1; ClearLagg 1.1.0; SimpleMessages 1.2; PRSpawn 1; CombatLogger 1.2.0; PRWorldBorder 1; Particles 1; SimpleAuth 1.7.1; ServerCore 1.0.0; PRCore 1; SlapperCache 1.0.1; FactionsPro 1.3.0; PRChat 1; Cron 1; PREnderPearls 1.0.1; NoHunger 1.0.0; BouncyBlocks 1; PurePerms 1.1.2; BarAPI 1.0.1; EconomyAPI 2.0.7; PRSecret 1; NoFlyZone 1.0.0; Capes 1.0.2; Pets 1.2.5; ChatCensor 1.4; SimpleAuthHelper 2.0.0; MongoSlots 1.0.0; Potions 1.0.4; EconomyShop 2.0.5; KillRate 2.0.1; GrabBag 2.3.0; BattleKits 1.0.3; SignWarp 1.5.1","server_engine":"PocketMine-MP 1.7dev","version":"v1.2.8","whitelist":"off"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/1_response.txt b/gameq/tests/Protocols/Providers/Mohaa/1_response.txt deleted file mode 100644 index e250ca1..0000000 --- a/gameq/tests/Protocols/Providers/Mohaa/1_response.txt +++ /dev/null @@ -1,3 +0,0 @@ -\location\1\gamever\1.11\gamename\mohaa\gamemode\openplaying\maxplayers\45\numplayers\20\gametype\Team-Match\mapname\m5l1b\hostport\12203\hostname\ STONER SERVER\rankedserver\0\fraglimit\0\timelimit\15\player_5\** JO **\frags_5\27\deaths_5\22\ping_5\200\player_6\KhoKh@@@\frags_6\21\deaths_6\28\ping_6\189\player_7\Thorn\frags_7\27\deaths_7\22\ping_7\193\player_8\boogerhook johnson\frags_8\21\deaths_8\28\ping_8\133\player_9\ARGENTINOs\frags_9\27\deaths_9\22\ping_9\250\player_10\Popeye\frags_10\21\deaths_10\28\ping_10\51\player_11\Bill Hubbard\frags_11\21\deaths_11\28\ping_11\150\player_12\BOB\frags_12\27\deaths_12\22\ping_12\155\player_13\Spc.SCHWARZBACH\frags_13\21\deaths_13\28\ping_13\180\player_14\(kaito_kid)\frags_14\21\deaths_14\28\ping_14\210\player_15\HansensLemonLime\frags_15\21\deaths_15\28\ping_15\50\player_16\TU PAPI PERUANO!!\frags_16\27\deaths_16\22\ping_16\142\player_17\waNdy*\frags_17\27\deaths_17\22\ping_17\98\player_24\Mazuras\frags_24\27\deaths_24\22\ping_24\88\player_25\Spc.Bad Company\frags_25\0\deaths_25\0\ping_25\34\player_28\Garden Mall\frags_28\0\deaths_28\0\ping_28\59\player_30\u.u\frags_30\0\deaths_30\0\ping_30\198\player_33\ozooo13\frags_33\27\deaths_33\22\ping_33\200\player_36\]RoacH[ Just T\frags_36\27\deaths_36\22\ping_36\50\player_39\YOUROLEMAN\frags_39\0\deaths_39\0\ping_39\116\queryid\4396.1 -|| -\final\\queryid\4396.2 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/1_result.json b/gameq/tests/Protocols/Providers/Mohaa/1_result.json deleted file mode 100644 index 86bdf3c..0000000 --- a/gameq/tests/Protocols/Providers/Mohaa/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"162.248.91.229:12203":{"dedicated":1,"final":"","fraglimit":"0","gamemode":"openplaying","gamename":"mohaa","gametype":"Team-Match","gamever":"1.11","gq_address":"162.248.91.229","gq_joinlink":"","gq_name":"Medal of honor: Allied Assault","gq_online":true,"gq_port_client":12203,"gq_port_query":12300,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"mohaa","hostname":" STONER SERVER","hostport":"12203","location":"1","mapname":"m5l1b","maxplayers":"45","num_players":0,"num_teams":0,"numplayers":"20","players":[{"player":"** JO **","frags":"27","deaths":"22","ping":"200"},{"player":"KhoKh@@@","frags":"21","deaths":"28","ping":"189"},{"player":"Thorn","frags":"27","deaths":"22","ping":"193"},{"player":"boogerhook johnson","frags":"21","deaths":"28","ping":"133"},{"player":"ARGENTINOs","frags":"27","deaths":"22","ping":"250"},{"player":"Popeye","frags":"21","deaths":"28","ping":"51"},{"player":"Bill Hubbard","frags":"21","deaths":"28","ping":"150"},{"player":"BOB","frags":"27","deaths":"22","ping":"155"},{"player":"Spc.SCHWARZBACH","frags":"21","deaths":"28","ping":"180"},{"player":"(kaito_kid)","frags":"21","deaths":"28","ping":"210"},{"player":"HansensLemonLime","frags":"21","deaths":"28","ping":"50"},{"player":"TU PAPI PERUANO!!","frags":"27","deaths":"22","ping":"142"},{"player":"waNdy*","frags":"27","deaths":"22","ping":"98"},{"player":"Mazuras","frags":"27","deaths":"22","ping":"88"},{"player":"Spc.Bad Company","frags":"0","deaths":"0","ping":"34"},{"player":"Garden Mall","frags":"0","deaths":"0","ping":"59"},{"player":"u.u","frags":"0","deaths":"0","ping":"198"},{"player":"ozooo13","frags":"27","deaths":"22","ping":"200"},{"player":"]RoacH[ Just T","frags":"27","deaths":"22","ping":"50"},{"player":"YOUROLEMAN","frags":"0","deaths":"0","ping":"116"}],"rankedserver":"0","timelimit":"15"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/2_response.txt b/gameq/tests/Protocols/Providers/Mohaa/2_response.txt deleted file mode 100644 index 137bc47..0000000 --- a/gameq/tests/Protocols/Providers/Mohaa/2_response.txt +++ /dev/null @@ -1 +0,0 @@ -\location\1\gamever\1.11\gamename\mohaa\gamemode\openplaying\maxplayers\32\numplayers\1\gametype\=|LuV|= Freeze-Tag Melt Points\mapname\dm/mohdm7\hostport\12203\hostname\^3=|LuV|= Freeze-Tag Server @ www.luvclan.eu\rankedserver\0\fraglimit\0\timelimit\15\player_0\=|LuV|= AmmaR\frags_0\0\deaths_0\0\ping_0\98\final\\queryid\2663.1 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/2_result.json b/gameq/tests/Protocols/Providers/Mohaa/2_result.json deleted file mode 100644 index c087ae6..0000000 --- a/gameq/tests/Protocols/Providers/Mohaa/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"37.97.240.42:12203":{"dedicated":1,"final":"","fraglimit":"0","gamemode":"openplaying","gamename":"mohaa","gametype":"=|LuV|= Freeze-Tag Melt Points","gamever":"1.11","gq_address":"37.97.240.42","gq_joinlink":"","gq_name":"Medal of honor: Allied Assault","gq_online":true,"gq_port_client":12203,"gq_port_query":12300,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"mohaa","hostname":"^3=|LuV|= Freeze-Tag Server @ www.luvclan.eu","hostport":"12203","location":"1","mapname":"dm\/mohdm7","maxplayers":"32","num_players":0,"num_teams":0,"numplayers":"1","players":[{"player":"=|LuV|= AmmaR","frags":"0","deaths":"0","ping":"98"}],"rankedserver":"0","timelimit":"15"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/3_response.txt b/gameq/tests/Protocols/Providers/Mohaa/3_response.txt deleted file mode 100644 index 6c47d2f..0000000 --- a/gameq/tests/Protocols/Providers/Mohaa/3_response.txt +++ /dev/null @@ -1 +0,0 @@ -\location\1\gamever\1.11\gamename\mohaa\gamemode\openplaying\maxplayers\32\numplayers\2\gametype\Team-Match\mapname\dm/mohdm4\hostport\12206\hostname\^3=|LuV|= Team-Deathmatch Server @ www.luvclan.eu\rankedserver\0\fraglimit\0\timelimit\20\player_0\=|LuV|= Face |SA|\frags_0\0\deaths_0\0\ping_0\64\player_2\=|LUV|=grazy\frags_2\0\deaths_2\0\ping_2\10\final\\queryid\46314.1 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mohaa/3_result.json b/gameq/tests/Protocols/Providers/Mohaa/3_result.json deleted file mode 100644 index 6630350..0000000 --- a/gameq/tests/Protocols/Providers/Mohaa/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"37.97.240.42:12204":{"dedicated":1,"final":"","fraglimit":"0","gamemode":"openplaying","gamename":"mohaa","gametype":"Team-Match","gamever":"1.11","gq_address":"37.97.240.42","gq_joinlink":"","gq_name":"Medal of honor: Allied Assault","gq_online":true,"gq_port_client":12204,"gq_port_query":12301,"gq_protocol":"gamespy","gq_transport":"udp","gq_type":"mohaa","hostname":"^3=|LuV|= Team-Deathmatch Server @ www.luvclan.eu","hostport":"12206","location":"1","mapname":"dm\/mohdm4","maxplayers":"32","num_players":0,"num_teams":0,"numplayers":"2","players":[{"player":"=|LuV|= Face |SA|","frags":"0","deaths":"0","ping":"64"},{"player":"=|LUV|=grazy","frags":"0","deaths":"0","ping":"10"}],"rankedserver":"0","timelimit":"20"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/1_response.txt b/gameq/tests/Protocols/Providers/Mta/1_response.txt deleted file mode 100644 index 208caa8..0000000 --- a/gameq/tests/Protocols/Providers/Mta/1_response.txt +++ /dev/null @@ -1,18 +0,0 @@ -EYE1mta22003^SX - CnR/DM/RP [proyectosx.net] [Español] [Trabajos|Gangs|Turf|Casas|Criminales vs Policias] SX CnR/DM/RPSX1.40203512?Laucha154? -|XS|Skrim231?DeNix273?[E]EdgarMacias13255? -Nesta~LDS113?SoSi188?[E.T.E.R][P]ausa85?goxi66?Dark<<~Bolt~>>181? South-Park147? DarkasPlayer133?[F.A.]WakaMan[UAD]210?|RG|M@tias2112(CARP)183?Hoodie150?Dark~[F]uSion[SB]235? Ch|Mitsu185?Mist-Ps158?|N|[A]zazzin95133?xXXBlackGhostXXx267? OliSykes182? -Dark-Zona102?~[S]aya~[|XV|]188?Camila150?|URU|ENZO..(x_x)..196? [F.A.]Neon140?lVlWiz_Natanael87?|CW|DESCONOCIDO~426?Navaja260?|RG|Mordecay<3521?{R.G}Gabriel_FLOW235?Takadox133?[S.W.A.T.]Murdoc[UAD]251?[GROM]~Felipe~|GSG|101?||~CamiloFG~||172?CH|Leonidaz18175?T30xD390? LO|Demoniak_188?[F.A.]MrTomato168? [Ch]Pipex542132? DarkRadu143? -Pedro_666152?[RG]NagusFlow182?[F.A.]CaLeX9[AE](VeRa)182? |LO|Salvador86? |RG|Hollman80? DreamerBoy258?Darkus98?[GROM]Francoo271?Daniel150?|THC|BaianoBR167?[RF]-Enzo-1998-167?Lushe153?juancarlithos235?[LO]victor.a.136?|G2H|Angeliux43v3er109? -[A.T]Wolf108?|Ch|<<[P]et>>137?[F.A.]xLuisV2[UAD]80?|CQC|stun.fail74?OS|Mr.Smithers~320? |G2H|R3L4X196?[F.B.I]Ricardo_Vera150?ScandalousRam77192? Facebookero180?~//Reconnect\\~144? |G2H|>Tupac<158?[F.A.]MrBlooDyOtaku129?Dark|Punisher[HL]80? .d:Oliver:b.175?[T.E]Wolk>>>XV<<<153? merari94543118? PepeBagoneta181?DarkMuhin[SB]231?[E](CIA)(PU)Vera(Alex)166?[G2H]-[[Wiz.NEGriFA]]1038? [F.A.]Market473?B$Z-Asilo.3.8|D.C|114? [XV]Stormy221? UNDERCOVER42245?[S.W.A.T.]WarDarkGT|A|136?DarkGisometro166?[CW]Peluca64346172?[F.B.I]Hardwell144? [XV]sr.gato154? -DiegoSape183?CQC|Mata-Ratas|76?|N|LifeStealer147?|CQC|TonyRasta112?|XV|NiggaWhat|DLR|48?DarkTrevelyan006172?[F.A.]Sr.Juan220? |Bs|hitman196?lRFlPapiarca-lDLRl78?A.QCQ||El-Comisario||170? BEKOWSKY475?|Royal|Tabasquenio~112?CH|A.Dark|MR.Jeff109?E.T.E.R[~Tempo~]192?Dark|Monobeer~122?[SX][Ch][Juancho][CM]87?Jhonata206? -Sergio_17254? .:RG:.Rukia95?A.CQC|ASESINO|119? -AletsLuro84? []-[N4CH0]166?Derezz164?|VanSs185?|~|K|iriTo|~|126?[Ch][SrMaku][CM]98?[S.W.A.T.]XbaxS160? mortalkendo200?[A.T]MorirConHonor246?[CQC]Street|Schultz<~143?KoMaNdO166?Dark.:Pitufo:.74? -Ulquiorra181?DUZTIK60? benhooodlum167?N|~[V]0D[K]4~|Sk224?Deluxe172?[E.T.E.R.]Cobani174?>XV|~|Castillo|~|<132?Emer203?[S.W.A.T.]Soldier|A|192?BrunooCortees161? -TicciToby224? Nazarena115? YeowlSamsung108?[SX]DarkGuillermo154? elias159568? [CQC]RamTs124?[S.W.A.T.]LockeD|B|358?Strix245?Arkanic94?>>-[XV]-[P][!7@ChU]-<<174?Dejota196?[E.T.E.R]Adan160?[F.B.I]shoxieJESUS180?onerom202?BELA154?Cristina|G2H|314? viscosho116?~Wang~154?[CH]RaggedEel11130?[F.A.]Sr.Viejete88? ~Disconnect~129? [F.A.]MrLuis105? DarkPucho~!157? ChufiBerta224?[GROM]~BlueMoon[GSG]162?FloweryTissue9064? |~Spryte~|136?A.Dark|Mr.PhyscoGL437?Dark~[P]ikachu~|SB|259?Robocop157?Ayudo|D|Olivo1|DLR!119? fabiloso154?SEM|Eazy-E|::XV231?Fray~123?DarkAsh238? -YESENIA13116?alexboy87?[E.T.E.R.]Stealthy190? Tomorrowland150?FidoOo105?Juan220? -SOYELPOPO62? -alan1508498?[F.A.]Moriremoscnhonor85?[CQC]->Cronnos-|327? -Freakshow70? |CQC|~Cris~>220?Dominic119?GuilleFlow|RG|154?Dark~NaNoSnaKe~Pino140?|G2H|Infinity-[HM]140? ~G2H~Atrox:3169?|N|-XxFeDhexX72?DarkPajaroSalvaje230?DemonicChamois3570?[A.T]~Toreto~84?Caquitafresca109?aloud77164?DieGo168? Fernando246? -javiera:3167?CQC||GhostMen||70?[I.L.V]heProx|C|[DK].211?[A.T]Dante-GDE|D|[UAD]164?|CQC|[G]onzalo~>>165?Warlock257? julitolocura238? -Rodryyy!!138?CH~Saelmus~CM188?RIVALDO147? Nazarena>_<3165?Smith158?FTW!Brayan420213?|?!|Lord|Mohinx|166? -Brunspart107?[DC]jeysonpro514?[CQC]Herobrine2002114 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/1_result.json b/gameq/tests/Protocols/Providers/Mta/1_result.json deleted file mode 100644 index 9f83f6b..0000000 --- a/gameq/tests/Protocols/Providers/Mta/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"104.156.48.17:22003":{"dedicated":1,"gamename":"mta","gametype":"SX CnR\/DM\/RP","gq_address":"104.156.48.17","gq_joinlink":"mtasa:\/\/104.156.48.17:22003\/","gq_name":"Multi Theft Auto","gq_online":true,"gq_port_client":22003,"gq_port_query":22126,"gq_protocol":"ase","gq_transport":"udp","gq_type":"mta","map":"SX","max_players":"512","num_players":"203","password":"0","players":[{"name":"Laucha","team":"","skin":"","score":"","ping":"154","time":""},{"name":"|XS|Skrim","team":"","skin":"","score":"","ping":"231","time":""},{"name":"DeNix","team":"","skin":"","score":"","ping":"273","time":""},{"name":"[E]EdgarMacias13","team":"","skin":"","score":"","ping":"255","time":""},{"name":"Nesta~LDS","team":"","skin":"","score":"","ping":"113","time":""},{"name":"SoSi","team":"","skin":"","score":"","ping":"188","time":""},{"name":"[E.T.E.R][P]ausa","team":"","skin":"","score":"","ping":"85","time":""},{"name":"goxi","team":"","skin":"","score":"","ping":"66","time":""},{"name":"Dark<<~Bolt~>>","team":"","skin":"","score":"","ping":"181","time":""},{"name":"South-Park","team":"","skin":"","score":"","ping":"147","time":""},{"name":"DarkasPlayer","team":"","skin":"","score":"","ping":"133","time":""},{"name":"[F.A.]WakaMan[UAD]","team":"","skin":"","score":"","ping":"210","time":""},{"name":"|RG|M@tias2112(CARP)","team":"","skin":"","score":"","ping":"183","time":""},{"name":"Hoodie","team":"","skin":"","score":"","ping":"150","time":""},{"name":"Dark~[F]uSion[SB]","team":"","skin":"","score":"","ping":"235","time":""},{"name":"Ch|Mitsu","team":"","skin":"","score":"","ping":"185","time":""},{"name":"Mist-Ps","team":"","skin":"","score":"","ping":"158","time":""},{"name":"|N|[A]zazzin95","team":"","skin":"","score":"","ping":"133","time":""},{"name":"xXXBlackGhostXXx","team":"","skin":"","score":"","ping":"267","time":""},{"name":"OliSykes","team":"","skin":"","score":"","ping":"182","time":""},{"name":"Dark-Zona","team":"","skin":"","score":"","ping":"102","time":""},{"name":"~[S]aya~[|XV|]","team":"","skin":"","score":"","ping":"188","time":""},{"name":"Camila","team":"","skin":"","score":"","ping":"150","time":""},{"name":"|URU|ENZO..(x_x)..","team":"","skin":"","score":"","ping":"196","time":""},{"name":"[F.A.]Neon","team":"","skin":"","score":"","ping":"140","time":""},{"name":"lVlWiz_Natanael","team":"","skin":"","score":"","ping":"87","time":""},{"name":"|CW|DESCONOCIDO~","team":"","skin":"","score":"","ping":"426","time":""},{"name":"Navaja","team":"","skin":"","score":"","ping":"260","time":""},{"name":"|RG|Mordecay<3","team":"","skin":"","score":"","ping":"521","time":""},{"name":"{R.G}Gabriel_FLOW","team":"","skin":"","score":"","ping":"235","time":""},{"name":"Takadox","team":"","skin":"","score":"","ping":"133","time":""},{"name":"[S.W.A.T.]Murdoc[UAD]","team":"","skin":"","score":"","ping":"251","time":""},{"name":"[GROM]~Felipe~|GSG|","team":"","skin":"","score":"","ping":"101","time":""},{"name":"||~CamiloFG~||","team":"","skin":"","score":"","ping":"172","time":""},{"name":"CH|Leonidaz18","team":"","skin":"","score":"","ping":"175","time":""},{"name":"T30xD","team":"","skin":"","score":"","ping":"390","time":""},{"name":"LO|Demoniak_","team":"","skin":"","score":"","ping":"188","time":""},{"name":"[F.A.]MrTomato","team":"","skin":"","score":"","ping":"168","time":""},{"name":"[Ch]Pipex542","team":"","skin":"","score":"","ping":"132","time":""},{"name":"DarkRadu","team":"","skin":"","score":"","ping":"143","time":""},{"name":"Pedro_666","team":"","skin":"","score":"","ping":"152","time":""},{"name":"[RG]NagusFlow","team":"","skin":"","score":"","ping":"182","time":""},{"name":"[F.A.]CaLeX9[AE](VeRa)","team":"","skin":"","score":"","ping":"182","time":""},{"name":"|LO|Salvador","team":"","skin":"","score":"","ping":"86","time":""},{"name":"|RG|Hollman","team":"","skin":"","score":"","ping":"80","time":""},{"name":"DreamerBoy","team":"","skin":"","score":"","ping":"258","time":""},{"name":"Darkus","team":"","skin":"","score":"","ping":"98","time":""},{"name":"[GROM]Francoo","team":"","skin":"","score":"","ping":"271","time":""},{"name":"Daniel","team":"","skin":"","score":"","ping":"150","time":""},{"name":"|THC|BaianoBR","team":"","skin":"","score":"","ping":"167","time":""},{"name":"[RF]-Enzo-1998-","team":"","skin":"","score":"","ping":"167","time":""},{"name":"Lushe","team":"","skin":"","score":"","ping":"153","time":""},{"name":"juancarlithos","team":"","skin":"","score":"","ping":"235","time":""},{"name":"[LO]victor.a.","team":"","skin":"","score":"","ping":"136","time":""},{"name":"|G2H|Angeliux43v3er","team":"","skin":"","score":"","ping":"109","time":""},{"name":"[A.T]Wolf","team":"","skin":"","score":"","ping":"108","time":""},{"name":"|Ch|<<[P]et>>","team":"","skin":"","score":"","ping":"137","time":""},{"name":"[F.A.]xLuisV2[UAD]","team":"","skin":"","score":"","ping":"80","time":""},{"name":"|CQC|stun.fail","team":"","skin":"","score":"","ping":"74","time":""},{"name":"OS|Mr.Smithers~","team":"","skin":"","score":"","ping":"320","time":""},{"name":"|G2H|R3L4X","team":"","skin":"","score":"","ping":"196","time":""},{"name":"[F.B.I]Ricardo_Vera","team":"","skin":"","score":"","ping":"150","time":""},{"name":"ScandalousRam77","team":"","skin":"","score":"","ping":"192","time":""},{"name":"Facebookero","team":"","skin":"","score":"","ping":"180","time":""},{"name":"~\/\/Reconnect\\\\~","team":"","skin":"","score":"","ping":"144","time":""},{"name":"|G2H|>Tupac<","team":"","skin":"","score":"","ping":"158","time":""},{"name":"[F.A.]MrBlooDyOtaku","team":"","skin":"","score":"","ping":"129","time":""},{"name":"Dark|Punisher[HL]","team":"","skin":"","score":"","ping":"80","time":""},{"name":".d:Oliver:b.","team":"","skin":"","score":"","ping":"175","time":""},{"name":"[T.E]Wolk>>>XV<<<","team":"","skin":"","score":"","ping":"153","time":""},{"name":"merari94543","team":"","skin":"","score":"","ping":"118","time":""},{"name":"PepeBagoneta","team":"","skin":"","score":"","ping":"181","time":""},{"name":"DarkMuhin[SB]","team":"","skin":"","score":"","ping":"231","time":""},{"name":"[E](CIA)(PU)Vera(Alex)","team":"","skin":"","score":"","ping":"166","time":""},{"name":"[G2H]-[[Wiz.NEGriFA]]","team":"","skin":"","score":"","ping":"1038","time":""},{"name":"[F.A.]Market","team":"","skin":"","score":"","ping":"473","time":""},{"name":"B$Z-Asilo.3.8|D.C|","team":"","skin":"","score":"","ping":"114","time":""},{"name":"[XV]Stormy","team":"","skin":"","score":"","ping":"221","time":""},{"name":"UNDERCOVER42","team":"","skin":"","score":"","ping":"245","time":""},{"name":"[S.W.A.T.]WarDarkGT|A|","team":"","skin":"","score":"","ping":"136","time":""},{"name":"DarkGisometro","team":"","skin":"","score":"","ping":"166","time":""},{"name":"[CW]Peluca64346","team":"","skin":"","score":"","ping":"172","time":""},{"name":"[F.B.I]Hardwell","team":"","skin":"","score":"","ping":"144","time":""},{"name":"[XV]sr.gato","team":"","skin":"","score":"","ping":"154","time":""},{"name":"DiegoSape","team":"","skin":"","score":"","ping":"183","time":""},{"name":"CQC|Mata-Ratas|","team":"","skin":"","score":"","ping":"76","time":""},{"name":"|N|LifeStealer","team":"","skin":"","score":"","ping":"147","time":""},{"name":"|CQC|TonyRasta","team":"","skin":"","score":"","ping":"112","time":""},{"name":"|XV|NiggaWhat|DLR|","team":"","skin":"","score":"","ping":"48","time":""},{"name":"DarkTrevelyan006","team":"","skin":"","score":"","ping":"172","time":""},{"name":"[F.A.]Sr.Juan","team":"","skin":"","score":"","ping":"220","time":""},{"name":"|Bs|hitman","team":"","skin":"","score":"","ping":"196","time":""},{"name":"lRFlPapiarca-lDLRl","team":"","skin":"","score":"","ping":"78","time":""},{"name":"A.QCQ||El-Comisario||","team":"","skin":"","score":"","ping":"170","time":""},{"name":"BEKOWSKY","team":"","skin":"","score":"","ping":"475","time":""},{"name":"|Royal|Tabasquenio~","team":"","skin":"","score":"","ping":"112","time":""},{"name":"CH|A.Dark|MR.Jeff","team":"","skin":"","score":"","ping":"109","time":""},{"name":"E.T.E.R[~Tempo~]","team":"","skin":"","score":"","ping":"192","time":""},{"name":"Dark|Monobeer~","team":"","skin":"","score":"","ping":"122","time":""},{"name":"[SX][Ch][Juancho][CM]","team":"","skin":"","score":"","ping":"87","time":""},{"name":"Jhonata","team":"","skin":"","score":"","ping":"206","time":""},{"name":"Sergio_17","team":"","skin":"","score":"","ping":"254","time":""},{"name":".:RG:.Rukia","team":"","skin":"","score":"","ping":"95","time":""},{"name":"A.CQC|ASESINO|","team":"","skin":"","score":"","ping":"119","time":""},{"name":"AletsLuro","team":"","skin":"","score":"","ping":"84","time":""},{"name":"[]-[N4CH0]","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Derezz","team":"","skin":"","score":"","ping":"164","time":""},{"name":"|VanSs","team":"","skin":"","score":"","ping":"185","time":""},{"name":"|~|K|iriTo|~|","team":"","skin":"","score":"","ping":"126","time":""},{"name":"[Ch][SrMaku][CM]","team":"","skin":"","score":"","ping":"98","time":""},{"name":"[S.W.A.T.]XbaxS","team":"","skin":"","score":"","ping":"160","time":""},{"name":"mortalkendo","team":"","skin":"","score":"","ping":"200","time":""},{"name":"[A.T]MorirConHonor","team":"","skin":"","score":"","ping":"246","time":""},{"name":"[CQC]Street|Schultz<~","team":"","skin":"","score":"","ping":"143","time":""},{"name":"KoMaNdO","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Dark.:Pitufo:.","team":"","skin":"","score":"","ping":"74","time":""},{"name":"Ulquiorra","team":"","skin":"","score":"","ping":"181","time":""},{"name":"DUZTIK","team":"","skin":"","score":"","ping":"60","time":""},{"name":"benhooodlum","team":"","skin":"","score":"","ping":"167","time":""},{"name":"N|~[V]0D[K]4~|Sk","team":"","skin":"","score":"","ping":"224","time":""},{"name":"Deluxe","team":"","skin":"","score":"","ping":"172","time":""},{"name":"[E.T.E.R.]Cobani","team":"","skin":"","score":"","ping":"174","time":""},{"name":">XV|~|Castillo|~|<","team":"","skin":"","score":"","ping":"132","time":""},{"name":"Emer","team":"","skin":"","score":"","ping":"203","time":""},{"name":"[S.W.A.T.]Soldier|A|","team":"","skin":"","score":"","ping":"192","time":""},{"name":"BrunooCortees","team":"","skin":"","score":"","ping":"161","time":""},{"name":"TicciToby","team":"","skin":"","score":"","ping":"224","time":""},{"name":"Nazarena","team":"","skin":"","score":"","ping":"115","time":""},{"name":"YeowlSamsung","team":"","skin":"","score":"","ping":"108","time":""},{"name":"[SX]DarkGuillermo","team":"","skin":"","score":"","ping":"154","time":""},{"name":"elias159","team":"","skin":"","score":"","ping":"568","time":""},{"name":"[CQC]RamTs","team":"","skin":"","score":"","ping":"124","time":""},{"name":"[S.W.A.T.]LockeD|B|","team":"","skin":"","score":"","ping":"358","time":""},{"name":"Strix","team":"","skin":"","score":"","ping":"245","time":""},{"name":"Arkanic","team":"","skin":"","score":"","ping":"94","time":""},{"name":">>-[XV]-[P][!7@ChU]-<<","team":"","skin":"","score":"","ping":"174","time":""},{"name":"Dejota","team":"","skin":"","score":"","ping":"196","time":""},{"name":"[E.T.E.R]Adan","team":"","skin":"","score":"","ping":"160","time":""},{"name":"[F.B.I]shoxieJESUS","team":"","skin":"","score":"","ping":"180","time":""},{"name":"onerom","team":"","skin":"","score":"","ping":"202","time":""},{"name":"BELA","team":"","skin":"","score":"","ping":"154","time":""},{"name":"Cristina|G2H|","team":"","skin":"","score":"","ping":"314","time":""},{"name":"viscosho","team":"","skin":"","score":"","ping":"116","time":""},{"name":"~Wang~","team":"","skin":"","score":"","ping":"154","time":""},{"name":"[CH]RaggedEel11","team":"","skin":"","score":"","ping":"130","time":""},{"name":"[F.A.]Sr.Viejete","team":"","skin":"","score":"","ping":"88","time":""},{"name":"~Disconnect~","team":"","skin":"","score":"","ping":"129","time":""},{"name":"[F.A.]MrLuis","team":"","skin":"","score":"","ping":"105","time":""},{"name":"DarkPucho~!","team":"","skin":"","score":"","ping":"157","time":""},{"name":"ChufiBerta","team":"","skin":"","score":"","ping":"224","time":""},{"name":"[GROM]~BlueMoon[GSG]","team":"","skin":"","score":"","ping":"162","time":""},{"name":"FloweryTissue90","team":"","skin":"","score":"","ping":"64","time":""},{"name":"|~Spryte~|","team":"","skin":"","score":"","ping":"136","time":""},{"name":"A.Dark|Mr.PhyscoGL","team":"","skin":"","score":"","ping":"437","time":""},{"name":"Dark~[P]ikachu~|SB|","team":"","skin":"","score":"","ping":"259","time":""},{"name":"Robocop","team":"","skin":"","score":"","ping":"157","time":""},{"name":"Ayudo|D|Olivo1|DLR!","team":"","skin":"","score":"","ping":"119","time":""},{"name":"fabiloso","team":"","skin":"","score":"","ping":"154","time":""},{"name":"SEM|Eazy-E|::XV","team":"","skin":"","score":"","ping":"231","time":""},{"name":"Fray~","team":"","skin":"","score":"","ping":"123","time":""},{"name":"DarkAsh","team":"","skin":"","score":"","ping":"238","time":""},{"name":"YESENIA13","team":"","skin":"","score":"","ping":"116","time":""},{"name":"alexboy","team":"","skin":"","score":"","ping":"87","time":""},{"name":"[E.T.E.R.]Stealthy","team":"","skin":"","score":"","ping":"190","time":""},{"name":"Tomorrowland","team":"","skin":"","score":"","ping":"150","time":""},{"name":"FidoOo","team":"","skin":"","score":"","ping":"105","time":""},{"name":"Juan","team":"","skin":"","score":"","ping":"220","time":""},{"name":"SOYELPOPO","team":"","skin":"","score":"","ping":"62","time":""},{"name":"alan15084","team":"","skin":"","score":"","ping":"98","time":""},{"name":"[F.A.]Moriremoscnhonor","team":"","skin":"","score":"","ping":"85","time":""},{"name":"[CQC]->Cronnos-|","team":"","skin":"","score":"","ping":"327","time":""},{"name":"Freakshow","team":"","skin":"","score":"","ping":"70","time":""},{"name":"|CQC|~Cris~>","team":"","skin":"","score":"","ping":"220","time":""},{"name":"Dominic","team":"","skin":"","score":"","ping":"119","time":""},{"name":"GuilleFlow|RG|","team":"","skin":"","score":"","ping":"154","time":""},{"name":"Dark~NaNoSnaKe~Pino","team":"","skin":"","score":"","ping":"140","time":""},{"name":"|G2H|Infinity-[HM]","team":"","skin":"","score":"","ping":"140","time":""},{"name":"~G2H~Atrox:3","team":"","skin":"","score":"","ping":"169","time":""},{"name":"|N|-XxFeDhexX","team":"","skin":"","score":"","ping":"72","time":""},{"name":"DarkPajaroSalvaje","team":"","skin":"","score":"","ping":"230","time":""},{"name":"DemonicChamois35","team":"","skin":"","score":"","ping":"70","time":""},{"name":"[A.T]~Toreto~","team":"","skin":"","score":"","ping":"84","time":""},{"name":"Caquitafresca","team":"","skin":"","score":"","ping":"109","time":""},{"name":"aloud77","team":"","skin":"","score":"","ping":"164","time":""},{"name":"DieGo","team":"","skin":"","score":"","ping":"168","time":""},{"name":"Fernando","team":"","skin":"","score":"","ping":"246","time":""},{"name":"javiera:3","team":"","skin":"","score":"","ping":"167","time":""},{"name":"CQC||GhostMen||","team":"","skin":"","score":"","ping":"70","time":""},{"name":"[I.L.V]heProx|C|[DK].","team":"","skin":"","score":"","ping":"211","time":""},{"name":"[A.T]Dante-GDE|D|[UAD]","team":"","skin":"","score":"","ping":"164","time":""},{"name":"|CQC|[G]onzalo~>>","team":"","skin":"","score":"","ping":"165","time":""},{"name":"Warlock","team":"","skin":"","score":"","ping":"257","time":""},{"name":"julitolocura","team":"","skin":"","score":"","ping":"238","time":""},{"name":"Rodryyy!!","team":"","skin":"","score":"","ping":"138","time":""},{"name":"CH~Saelmus~CM","team":"","skin":"","score":"","ping":"188","time":""},{"name":"RIVALDO","team":"","skin":"","score":"","ping":"147","time":""},{"name":"Nazarena>_<3","team":"","skin":"","score":"","ping":"165","time":""},{"name":"Smith","team":"","skin":"","score":"","ping":"158","time":""},{"name":"FTW!Brayan420","team":"","skin":"","score":"","ping":"213","time":""},{"name":"|?!|Lord|Mohinx|","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Brunspart","team":"","skin":"","score":"","ping":"107","time":""},{"name":"[DC]jeysonpro","team":"","skin":"","score":"","ping":"514","time":""},{"name":"[CQC]Herobrine2002","team":"","skin":"","score":"","ping":"114","time":false}],"port":"22003","servername":"SX - CnR\/DM\/RP [proyectosx.net] [Español] [Trabajos|Gangs|Turf|Casas|Criminales vs Policias]","version":"1.4"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/2_response.txt b/gameq/tests/Protocols/Providers/Mta/2_response.txt deleted file mode 100644 index e51e663..0000000 --- a/gameq/tests/Protocols/Providers/Mta/2_response.txt +++ /dev/null @@ -1,5 +0,0 @@ -EYE1mta22003.|| OwlGaming Roleplay || www.owlgaming.net || Roleplay Los Santos1.401221000Script Version4.3.6.5Author(OwlGaming - MTA Server Development TeamWebsitewww.owlgaming.net?Douglas_Schrader44260?Elroy_Robinson206128? Jonah_Russo252147?Emily_O'Leary10920?Michelle_Giotto157138? Dwayne_Smith286142?Edward_Carter393102?Christian_Garrett2098?Elizabeth_Starks981129?Chanelle_Baker433105?Stephan_Ocean89104?Nicholas_Krajewski9178? -Angel_Mae5494? Philip_Gomez367112?Daevon_Montell203108?Michael_Hopkins135166?Edward_Dabson726216?Derrick_James76102?Steven_Fletcher1784?Owl.Player.3758210? Brad_Collins198167? Norman_Yung272122?James_Douglas239123?Albert_Barney153138?Joel_Williams184158?Mona_McLaughlin2115138?Justin_Almeida1298130? Jason_Gomez137112? Pete_Molina97108?Joshua_Martinez10550?Fabrizio_Gallardo146122?Jane_Matthews541108? Tim_Harrison356198?Dimitri_Kristoff849132? Edward_Savko66154?Tyler_Barnwood2990? -Emma_Crow27110?Klaus_Reinbacher127104?Elizabeth_Stewart0188?Borja_Vinagre24146?Desmond_Bryce14184?Marko_Vidovic1133150?Albert_Fincher7670?Kenzie_McLaughlin852158? Frank_Milano245126?Phil_Anderson68938?Owl.Player.6347109127?Samuel_Johnson94471?Keron_Reynolds14128? John_Payne51124?Sebastian_Bryant1698? Nina_Ashmore16138? Taylor_King105174?Maxwell_Zobert276288? Paul_Karter167148?Sebastian_Kobayashi632?Heather_Russel107140? Angus_Moore30126?Tyrel_Williams798163? Paul_Clifton103112?Clara_Wayland6384?Kenneth_Akiyama105126?Thomas_Murdock114248?Jackson_Pearce1142? -Nina_Grey23333?Nicholas_Krauss9422?Yamato_Oshiro45106?Michael_Navarro118140?Borat_Sanjeev2694?Owl.Player.84098136?Antonio_Johnson249137?Lance_MacTavish23150?Yakamura_Nagashaki258112? James_Davies181143?James_Vandross20792?Theodore_Caballero238124? Jamal_Clay14142?Javier_de_la_Serna1119?Davide_Nardovino15138?Shawn_Henderson36124?Carl_Sheffman039?Santiago_Mendoza451101? -Ray_Flynn189124?Francisco_Carbajal73144? Sarah_Hill3134? Martin_Leon713134?Liliana_Medina64111?Alfred_Garrett7136?Mark_Valentino1542332?Owl.Player.961010366? Zack_Quint82126?Owl.Player.0919166? Hank_Clint9202?Alexander_Winston426122?William_Martinez6167? Rob_Bradley533100?Clement_Knight49298? Manjot_Singh67594?Michael_Coleman393138?Owl.Player.3857127? Edison_Best461102?Owl.Player.724628?Owl.Player.05491695?Owl.Player.4619112?Owl.Player.281472?Owl.Player.9095126?Owl.Player.7020128?Owl.Player.3355152?Owl.Player.6659142?Owl.Player.4375108?Owl.Player.7774112?Owl.Player.6188133?Owl.Player.0667104?Owl.Player.2837108?Owl.Player.5376108?Owl.Player.7312112?Owl.Player.2398114?Owl.Player.5726140?Owl.Player.5658197?Owl.Player.993262?Owl.Player.1679167?Owl.Player.7526117 \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mta/2_result.json b/gameq/tests/Protocols/Providers/Mta/2_result.json deleted file mode 100644 index ab5518b..0000000 --- a/gameq/tests/Protocols/Providers/Mta/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"167.114.119.145:22003":{"Author":"OwlGaming - MTA Server Development Team","Script Version":"4.3.6.5","Website":"www.owlgaming.net","dedicated":1,"gamename":"mta","gametype":"Roleplay","gq_address":"167.114.119.145","gq_joinlink":"mtasa:\/\/167.114.119.145:22003\/","gq_name":"Multi Theft Auto","gq_online":true,"gq_port_client":22003,"gq_port_query":22126,"gq_protocol":"ase","gq_transport":"udp","gq_type":"mta","map":"Los Santos","max_players":"1000","num_players":"122","password":"0","players":[{"name":"Douglas_Schrader","team":"","skin":"","score":"442","ping":"60","time":""},{"name":"Elroy_Robinson","team":"","skin":"","score":"206","ping":"128","time":""},{"name":"Jonah_Russo","team":"","skin":"","score":"252","ping":"147","time":""},{"name":"Emily_O'Leary","team":"","skin":"","score":"109","ping":"20","time":""},{"name":"Michelle_Giotto","team":"","skin":"","score":"157","ping":"138","time":""},{"name":"Dwayne_Smith","team":"","skin":"","score":"286","ping":"142","time":""},{"name":"Edward_Carter","team":"","skin":"","score":"393","ping":"102","time":""},{"name":"Christian_Garrett","team":"","skin":"","score":"20","ping":"98","time":""},{"name":"Elizabeth_Starks","team":"","skin":"","score":"981","ping":"129","time":""},{"name":"Chanelle_Baker","team":"","skin":"","score":"433","ping":"105","time":""},{"name":"Stephan_Ocean","team":"","skin":"","score":"89","ping":"104","time":""},{"name":"Nicholas_Krajewski","team":"","skin":"","score":"9","ping":"178","time":""},{"name":"Angel_Mae","team":"","skin":"","score":"54","ping":"94","time":""},{"name":"Philip_Gomez","team":"","skin":"","score":"367","ping":"112","time":""},{"name":"Daevon_Montell","team":"","skin":"","score":"203","ping":"108","time":""},{"name":"Michael_Hopkins","team":"","skin":"","score":"135","ping":"166","time":""},{"name":"Edward_Dabson","team":"","skin":"","score":"726","ping":"216","time":""},{"name":"Derrick_James","team":"","skin":"","score":"76","ping":"102","time":""},{"name":"Steven_Fletcher","team":"","skin":"","score":"17","ping":"84","time":""},{"name":"Owl.Player.3758","team":"","skin":"","score":"","ping":"210","time":""},{"name":"Brad_Collins","team":"","skin":"","score":"198","ping":"167","time":""},{"name":"Norman_Yung","team":"","skin":"","score":"272","ping":"122","time":""},{"name":"James_Douglas","team":"","skin":"","score":"239","ping":"123","time":""},{"name":"Albert_Barney","team":"","skin":"","score":"153","ping":"138","time":""},{"name":"Joel_Williams","team":"","skin":"","score":"184","ping":"158","time":""},{"name":"Mona_McLaughlin","team":"","skin":"","score":"2115","ping":"138","time":""},{"name":"Justin_Almeida","team":"","skin":"","score":"1298","ping":"130","time":""},{"name":"Jason_Gomez","team":"","skin":"","score":"137","ping":"112","time":""},{"name":"Pete_Molina","team":"","skin":"","score":"97","ping":"108","time":""},{"name":"Joshua_Martinez","team":"","skin":"","score":"105","ping":"50","time":""},{"name":"Fabrizio_Gallardo","team":"","skin":"","score":"146","ping":"122","time":""},{"name":"Jane_Matthews","team":"","skin":"","score":"541","ping":"108","time":""},{"name":"Tim_Harrison","team":"","skin":"","score":"356","ping":"198","time":""},{"name":"Dimitri_Kristoff","team":"","skin":"","score":"849","ping":"132","time":""},{"name":"Edward_Savko","team":"","skin":"","score":"66","ping":"154","time":""},{"name":"Tyler_Barnwood","team":"","skin":"","score":"29","ping":"90","time":""},{"name":"Emma_Crow","team":"","skin":"","score":"27","ping":"110","time":""},{"name":"Klaus_Reinbacher","team":"","skin":"","score":"127","ping":"104","time":""},{"name":"Elizabeth_Stewart","team":"","skin":"","score":"0","ping":"188","time":""},{"name":"Borja_Vinagre","team":"","skin":"","score":"24","ping":"146","time":""},{"name":"Desmond_Bryce","team":"","skin":"","score":"141","ping":"84","time":""},{"name":"Marko_Vidovic","team":"","skin":"","score":"1133","ping":"150","time":""},{"name":"Albert_Fincher","team":"","skin":"","score":"76","ping":"70","time":""},{"name":"Kenzie_McLaughlin","team":"","skin":"","score":"852","ping":"158","time":""},{"name":"Frank_Milano","team":"","skin":"","score":"245","ping":"126","time":""},{"name":"Phil_Anderson","team":"","skin":"","score":"689","ping":"38","time":""},{"name":"Owl.Player.6347","team":"","skin":"","score":"109","ping":"127","time":""},{"name":"Samuel_Johnson","team":"","skin":"","score":"944","ping":"71","time":""},{"name":"Keron_Reynolds","team":"","skin":"","score":"14","ping":"128","time":""},{"name":"John_Payne","team":"","skin":"","score":"51","ping":"124","time":""},{"name":"Sebastian_Bryant","team":"","skin":"","score":"16","ping":"98","time":""},{"name":"Nina_Ashmore","team":"","skin":"","score":"16","ping":"138","time":""},{"name":"Taylor_King","team":"","skin":"","score":"105","ping":"174","time":""},{"name":"Maxwell_Zobert","team":"","skin":"","score":"276","ping":"288","time":""},{"name":"Paul_Karter","team":"","skin":"","score":"167","ping":"148","time":""},{"name":"Sebastian_Kobayashi","team":"","skin":"","score":"6","ping":"32","time":""},{"name":"Heather_Russel","team":"","skin":"","score":"107","ping":"140","time":""},{"name":"Angus_Moore","team":"","skin":"","score":"30","ping":"126","time":""},{"name":"Tyrel_Williams","team":"","skin":"","score":"798","ping":"163","time":""},{"name":"Paul_Clifton","team":"","skin":"","score":"103","ping":"112","time":""},{"name":"Clara_Wayland","team":"","skin":"","score":"63","ping":"84","time":""},{"name":"Kenneth_Akiyama","team":"","skin":"","score":"105","ping":"126","time":""},{"name":"Thomas_Murdock","team":"","skin":"","score":"114","ping":"248","time":""},{"name":"Jackson_Pearce","team":"","skin":"","score":"1","ping":"142","time":""},{"name":"Nina_Grey","team":"","skin":"","score":"23","ping":"333","time":""},{"name":"Nicholas_Krauss","team":"","skin":"","score":"94","ping":"22","time":""},{"name":"Yamato_Oshiro","team":"","skin":"","score":"45","ping":"106","time":""},{"name":"Michael_Navarro","team":"","skin":"","score":"118","ping":"140","time":""},{"name":"Borat_Sanjeev","team":"","skin":"","score":"26","ping":"94","time":""},{"name":"Owl.Player.8409","team":"","skin":"","score":"8","ping":"136","time":""},{"name":"Antonio_Johnson","team":"","skin":"","score":"249","ping":"137","time":""},{"name":"Lance_MacTavish","team":"","skin":"","score":"23","ping":"150","time":""},{"name":"Yakamura_Nagashaki","team":"","skin":"","score":"258","ping":"112","time":""},{"name":"James_Davies","team":"","skin":"","score":"181","ping":"143","time":""},{"name":"James_Vandross","team":"","skin":"","score":"207","ping":"92","time":""},{"name":"Theodore_Caballero","team":"","skin":"","score":"238","ping":"124","time":""},{"name":"Jamal_Clay","team":"","skin":"","score":"14","ping":"142","time":""},{"name":"Javier_de_la_Serna","team":"","skin":"","score":"1","ping":"119","time":""},{"name":"Davide_Nardovino","team":"","skin":"","score":"15","ping":"138","time":""},{"name":"Shawn_Henderson","team":"","skin":"","score":"36","ping":"124","time":""},{"name":"Carl_Sheffman","team":"","skin":"","score":"0","ping":"39","time":""},{"name":"Santiago_Mendoza","team":"","skin":"","score":"451","ping":"101","time":""},{"name":"Ray_Flynn","team":"","skin":"","score":"189","ping":"124","time":""},{"name":"Francisco_Carbajal","team":"","skin":"","score":"73","ping":"144","time":""},{"name":"Sarah_Hill","team":"","skin":"","score":"3","ping":"134","time":""},{"name":"Martin_Leon","team":"","skin":"","score":"713","ping":"134","time":""},{"name":"Liliana_Medina","team":"","skin":"","score":"64","ping":"111","time":""},{"name":"Alfred_Garrett","team":"","skin":"","score":"7","ping":"136","time":""},{"name":"Mark_Valentino","team":"","skin":"","score":"154","ping":"2332","time":""},{"name":"Owl.Player.9610","team":"","skin":"","score":"103","ping":"66","time":""},{"name":"Zack_Quint","team":"","skin":"","score":"82","ping":"126","time":""},{"name":"Owl.Player.0919","team":"","skin":"","score":"","ping":"166","time":""},{"name":"Hank_Clint","team":"","skin":"","score":"9","ping":"202","time":""},{"name":"Alexander_Winston","team":"","skin":"","score":"426","ping":"122","time":""},{"name":"William_Martinez","team":"","skin":"","score":"6","ping":"167","time":""},{"name":"Rob_Bradley","team":"","skin":"","score":"533","ping":"100","time":""},{"name":"Clement_Knight","team":"","skin":"","score":"492","ping":"98","time":""},{"name":"Manjot_Singh","team":"","skin":"","score":"675","ping":"94","time":""},{"name":"Michael_Coleman","team":"","skin":"","score":"393","ping":"138","time":""},{"name":"Owl.Player.3857","team":"","skin":"","score":"","ping":"127","time":""},{"name":"Edison_Best","team":"","skin":"","score":"461","ping":"102","time":""},{"name":"Owl.Player.7246","team":"","skin":"","score":"","ping":"28","time":""},{"name":"Owl.Player.0549","team":"","skin":"","score":"","ping":"1695","time":""},{"name":"Owl.Player.4619","team":"","skin":"","score":"","ping":"112","time":""},{"name":"Owl.Player.2814","team":"","skin":"","score":"","ping":"72","time":""},{"name":"Owl.Player.9095","team":"","skin":"","score":"","ping":"126","time":""},{"name":"Owl.Player.7020","team":"","skin":"","score":"","ping":"128","time":""},{"name":"Owl.Player.3355","team":"","skin":"","score":"","ping":"152","time":""},{"name":"Owl.Player.6659","team":"","skin":"","score":"","ping":"142","time":""},{"name":"Owl.Player.4375","team":"","skin":"","score":"","ping":"108","time":""},{"name":"Owl.Player.7774","team":"","skin":"","score":"","ping":"112","time":""},{"name":"Owl.Player.6188","team":"","skin":"","score":"","ping":"133","time":""},{"name":"Owl.Player.0667","team":"","skin":"","score":"","ping":"104","time":""},{"name":"Owl.Player.2837","team":"","skin":"","score":"","ping":"108","time":""},{"name":"Owl.Player.5376","team":"","skin":"","score":"","ping":"108","time":""},{"name":"Owl.Player.7312","team":"","skin":"","score":"","ping":"112","time":""},{"name":"Owl.Player.2398","team":"","skin":"","score":"","ping":"114","time":""},{"name":"Owl.Player.5726","team":"","skin":"","score":"","ping":"140","time":""},{"name":"Owl.Player.5658","team":"","skin":"","score":"","ping":"197","time":""},{"name":"Owl.Player.9932","team":"","skin":"","score":"","ping":"62","time":""},{"name":"Owl.Player.1679","team":"","skin":"","score":"","ping":"167","time":""},{"name":"Owl.Player.7526","team":"","skin":"","score":"","ping":"117","time":false}],"port":"22003","servername":"|| OwlGaming Roleplay || www.owlgaming.net ||","version":"1.4"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/1_response.txt b/gameq/tests/Protocols/Providers/Mumble/1_response.txt deleted file mode 100644 index 5ed0bc2..0000000 --- a/gameq/tests/Protocols/Providers/Mumble/1_response.txt +++ /dev/null @@ -1,3371 +0,0 @@ -{ - "id": 1, - "name": "Skyttegrav & SweClockers Mumble", - "x_connecturl": "mumble://mumble.skyttegrav.se/?version=1.2.0", - "x_gtmurmur_connectport": "64738", - "x_gtmurmur_max_users": "250", - "x_gtmurmur_server_version": "1.2.8", - "x_gtmurmur_doclen": 224063, - "root": { - "channels": [ - { - "channels": [], - "description": "", - "id": 1, - "name": "AFK", - "parent": 0, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 1, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 23441, - "mute": false, - "name": "pyootr", - "onlinesecs": 23441, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.5", - "selfDeaf": true, - "selfMute": true, - "session": 96, - "suppress": true, - "tcponly": false, - "userid": 66, - "version": 66053, - "udpPing": 51.19, - "tcpPing": 62.56 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "Serveransvarig & Admin f\u00f6r Skyttegrav.se/Sweclockers.com spelservrar. \n", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 28260, - "mute": false, - "name": "[SG-SUP]Gix", - "onlinesecs": 28289, - "os": "X11", - "osversion": "Linux Mint 17 Qiana", - "release": "1.2.8-1~ppa1~trusty1", - "selfDeaf": false, - "selfMute": false, - "session": 124, - "suppress": true, - "tcponly": false, - "userid": 47, - "version": 66056, - "udpPing": 29.20, - "tcpPing": 28.94 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "JAG TROR DIG URKEL!\n


", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 21756, - "mute": false, - "name": "Eyem-_-", - "onlinesecs": 23981, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.4", - "selfDeaf": false, - "selfMute": false, - "session": 176, - "suppress": true, - "tcponly": false, - "userid": 1001, - "version": 66052, - "udpPing": 17.31, - "tcpPing": 20.12 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 855, - "mute": false, - "name": "[SG-HA]Relemy", - "onlinesecs": 28262, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": true, - "selfMute": true, - "session": 232, - "suppress": true, - "tcponly": false, - "userid": 1926, - "version": 66056, - "udpPing": 37.94, - "tcpPing": 42.07 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 27997, - "mute": false, - "name": "TheLikus", - "onlinesecs": 28143, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 269, - "suppress": true, - "tcponly": false, - "userid": 4120, - "version": 66056, - "udpPing": 11.01, - "tcpPing": 13.62 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "EX VERITAS ET VIGILANTIA VICTORIA", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 857, - "mute": false, - "name": "[SG-SUP]Azlan1", - "onlinesecs": 24386, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 316, - "suppress": true, - "tcponly": true, - "userid": 2296, - "version": 66056, - "udpPing": 53.51, - "tcpPing": 65.31 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment" -|| -: "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 28272, - "mute": false, - "name": "Legoo", - "onlinesecs": 28274, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.5", - "selfDeaf": false, - "selfMute": false, - "session": 473, - "suppress": true, - "tcponly": false, - "userid": 1657, - "version": 66053, - "udpPing": 8.45, - "tcpPing": 23.05 - } - ] - }, - { - "channels": [], - "description": "", - "id": 8, - "name": "Utl\u00e5nade Kanaler", - "parent": 0, - "position": 100, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 38, - "name": "Admins", - "parent": 9, - "position": 11, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 43, - "name": "Headadmins Corner", - "parent": 9, - "position": 60, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 44, - "name": "Supervisors Corner - Polska Riksdagen", - "parent": 9, - "position": 70, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - -|| -"id": 151, - "name": "M\u00f6te", - "parent": 150, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 152, - "name": "Styrelsem\u00f6te", - "parent": 150, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "Spelf\u00f6reningen bakom Skyttegrav.se", - "id": 150, - "name": "United Gaming", - "parent": 9, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 188, - "name": "Allm\u00e4n Admin", - "parent": 187, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 189, - "name": "Privat Admin (Endast inbjudan)", - "parent": 187, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "Endast F\u00f6r SweClockers.com admins!", - "id": 187, - "name": "Sweclockers", - "parent": 9, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 214, - "name": "Allm\u00e4n Admin (Delad)", - "parent": 9, - "position": 10, - "temporary": false, - "users": [] - } - ], - "description": "Endast F\u00f6r Skyttegrav admins!", - "id": 9, - "name": "Admins Corner (private)", - "parent": 0, - "position": 200, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "H\u00e4r kommer v\u00e5ra stream och webtv att s\u00e4ndas! \n

\n

Bes\u00f6k www.swec.tv och avnjut s\u00e4ndningen, vill du deltaga s\u00e5 skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig l\u00f6senordet. Vi kommer att b\u00e5de casta och spela olika spel l\u00f6pande.

\n

\n

I kanalen g\u00e4ller strikt ljud och informationskontroll, akta er allts\u00e5 f\u00f6r att inte s\u00e4ga f\u00f6r mycket.

", - "id": 358, - "name": "SweC TV Studio (private)", - "parent": 183, - "position": 100, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "Vill ni deltaga i SweC TV? \n

\n

S\u00e4tt er i detta rummet s\u00e5 kommer vi att dra in er i cast rummet vid tillf\u00e4lle, ni \u00e4r varmt v\u00e4lkomna att titta p\u00e5 www.swec.tv medan ni v\u00e4ntar!

\n

\n

N\u00e4r ni kommer in i cast kanalen \u00e4r ni automatiskt satta till "mute", vi kommer att \u00e4ndra det n\u00e4r ni kommer in.

\n

\n

\n

", - "id": 402, - "name": "SweC TV lobby (wait for invite to cast room)", - "parent": 183, - "position": 200, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "H\u00e4r har ni nyttig information om spelkv\u00e4llarna! \n

SpelClockers Spelkv\u00e4llar

\n

Sweclockers Steam chat grupp

\n

", - "id": 426, - "name": "Allm\u00e4n samlingskanal - Kom hit f\u00f6r r\u00e5d och v\u00e4gledning", - "parent": 421, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 429, - "name": "Grupp 1", - "parent": 427, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 430, - "name": "Grupp 2", - "parent": 427, - "position": 20, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 449, - "name": "Grupp 3", - "parent": 427, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 450, - "name": "Grupp 4", - "parent": 427, - "position": 40, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 453, - "name": "Rematch och rekryt Lobby", - "parent": 427, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 455, - "name": "Grupp 5", - "parent": 427, - "position": 50, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 456, - "name": "Grupp 6", - "parent": 427, - "position": 60, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 427, - "name": "Reserv #2", - "parent": 421, - "position": 20, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 432, - "name": "MechWarrior Online", - "parent": 428, - "position": 10, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 432, - "comment": "http://www.twitch.tv/tobbbe__", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 114, - "mute": false, - "name": "[SweC]Tobbbe__", - "onlinesecs": 28273, - "os": "Win", - "osversion": "6.2.9200.1" -|| -, - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 5, - "suppress": false, - "tcponly": false, - "userid": 3769, - "version": 66056, - "udpPing": 21.70, - "tcpPing": 23.08 - } -, - { - "bytespersec": 0, - "channel": 432, - "comment": "


", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 16, - "mute": false, - "name": "Vilse(SWE)", - "onlinesecs": 15534, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 110, - "suppress": false, - "tcponly": false, - "userid": 4124, - "version": 66056, - "udpPing": 13.77, - "tcpPing": 16.06 - } -, - { - "bytespersec": 0, - "channel": 432, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 54, - "mute": false, - "name": "Th3MadPanda", - "onlinesecs": 28272, - "os": -|| -"Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 236, - "suppress": false, - "tcponly": false, - "userid": 2099, - "version": 66056, - "udpPing": 8.86, - "tcpPing": 11.80 - } -, - { - "bytespersec": 0, - "channel": 432, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 63, - "mute": false, - "name": "Mumin", - "onlinesecs": 8481, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 306, - "suppress": false, - "tcponly": false, - "userid": 4125, - "version": 66056, - "udpPing": 19.08, - "tcpPing": 22.64 - } -, - { - "bytespersec": 0, - "channel": 432, - "comment": "Greetinx Programs! \n

\n

V\u00e4lkommen till SweClockers och Skyttegravs gemensamma Mumble!

\n

\n

Ni kan fr\u00e5ga mig om administrativa saker p\u00e5 servers eller mumble, jag \u00e4r huvudadmin f\u00f6r SweC g\u00e4nget och dessutom forumledare f\u00f6r SweClockers.com. H\u00e4r \u00e4r reglerna f\u00f6r mumble och SweC forum.

\n

\n

Vi satsar p\u00e5 en trevlig st\u00e4mning online! :)

\n

", - "context": "", - "deaf": false, - "identi -|| -ty": "", - "idlesecs": 1720, - "mute": false, - "name": "[SweC-H]Lan", - "onlinesecs": 28266, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.5", - "selfDeaf": true, - "selfMute": true, - "session": 353, - "suppress": false, - "tcponly": false, - "userid": 56, - "version": 66053, - "udpPing": 15.76, - "tcpPing": 35.14 - } - ] - }, - { - "channels": [], - "description": "", - "id": 433, - "name": "Grupp 2", - "parent": 428, - "position": 20, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 433, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 110, - "mute": false, - "name": "Gson", - "onlinesecs": 3157, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 146, - "suppress": false, - "tcponly": false, - "userid": 4123, - "version": 66056, - "udpPing": 52.64, - "tcpP -|| -ing": 58.41 - } -, - { - "bytespersec": 0, - "channel": 433, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 113, - "mute": false, - "name": "lampan", - "onlinesecs": 18331, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.5", - "selfDeaf": false, - "selfMute": false, - "session": 463, - "suppress": false, - "tcponly": false, - "userid": 3404, - "version": 66053, - "udpPing": 13.61, - "tcpPing": 16.75 - } - ] - }, - { - "channels": [], - "description": "", - "id": 434, - "name": "Grupp 3", - "parent": 428, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 443, - "name": "Grupp 4", - "parent": 428, - "position": 40, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 444, - "name": "Grupp 5", - "parent": 428, - "position": 50, - "temporary": false, - -|| - "users": [] - }, - { - "channels": [], - "description": "", - "id": 451, - "name": "Samlingsal", - "parent": 428, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 451, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 146, - "mute": false, - "name": "[SweC-T]Grabbengr\u00e5", - "onlinesecs": 27438, - "os": "Win", - "osversion": "6.2. -|| -9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 53, - "suppress": false, - "tcponly": false, - "userid": 1952, - "version": 66056, - "udpPing": 20.40, - "tcpPing": 22.75 - } -, - { - "bytespersec": 0, - "channel": 451, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 433, - "mute": false, - "name": "[SweC-H]Kinekin", - "onlinesecs": 28269, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": true, - "selfMute": true, - "session": 180, - "suppress": false, - "tcponly": false, - "userid": 2426, - "version": 66056, - "udpPing": 49.77, - "tcpPing": 52.25 - } -, - { - "bytespersec": 7488, - "channel": 451, - "comment": "Det h\u00e4nder att jag spelar spel ibland.\n


\n


\n


\n

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "[SweC-T]DavidtheDoom", - "onlinesecs": 28221, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 203, - "suppress": false, - "tcponly": false, - "userid": 3030, - "version": 66056, - "udpPing": 3.95, - "tcpPing": 5.59 - } -, - { - "bytespersec": 0, - -|| - "channel": 451, - "comment": "SweC spelservrar finns ocks\u00e5 p\u00e5 Facebook", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 26, - "mute": false, - "name": "[SweC-H]Raven_cc", - "onlinesecs": 21049, - "os": "Win", - "osversion": "6.1.7600.1", - "release": "1.2.7", - "selfDeaf": false, - "selfMute": false, - "session": 264, - "suppress": false, - "tcponly": true, - "userid": 78, - "version": 66055, - "udpPing": 19.72, - "tcpPing": 25.83 - } -, - { - "bytespersec": 0, - "channel": 451, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 763, - "mute": false, - "name": "OskarWallin", - "onlinesecs": 11404, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 272, - "suppress": false, - "tcponly": false, - "userid": 3783, - "version": 66056, - "udpPing": 11.9 -|| -6, - "tcpPing": 31.07 - } -, - { - "bytespersec": 3996, - "channel": 451, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "[SweC-A]Hitman", - "onlinesecs": 28265, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 485, - "suppress": false, - "tcponly": true, - "userid": 76, - "version": 66056, - "udpPing": 21.36, - "tcpPing": 28.02 - } -, - { - "bytespersec": 0, - "channel": 451, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 6, - "mute": false, - "name": "[SG-A]bl0m1", - "onlinesecs": 28242, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 488, - "suppress": false, - "tcponly": false, - "userid": 3447, - "version": 66056, - "udpPing": 40.23, - "tcpPing": 43.40 - -|| - } - ] - }, - { - "channels": [], - "description": "", - "id": 459, - "name": "Grupp 6", - "parent": 428, - "position": 60, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 428, - "name": "12h stream med SpelClockers - L\u00f6rdag 28 feb", - "parent": 421, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 437, - "name": "Grupp 1", - "parent": 436, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 438, - "name": "Grupp 2", - "parent": 436, - "position": 20, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 439, - "name": "Grupp 3", - "parent": 436, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 440, - "name": "Grupp 4", - "parent": 436, - "position": 40, - -|| - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 441, - "name": "Grupp 5", - "parent": 436, - "position": 50, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 442, - "name": "Grupp 6", - "parent": 436, - "position": 60, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 452, - "name": "Rematch och rekryt Lobby", - "parent": 436, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 436, - "name": "Reserv #3", - "parent": 421, - "position": 30, - "temporary": false, - "users": [] - } - ], - "description": "Hj\u00e4lp med Mumble? L\u00e4s h\u00e4r -> Mumble tr\u00e5d p\u00e5 SweClockers", - "id": 421, - "name": "Spelkv\u00e4llar", - "parent": 183, - "position": 300, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 183, - "name": "SweClockers", - "parent": 0, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 10, - "name": "Allm\u00e4nt Snack - Rum #1", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 11, - "name": "Allm\u00e4nt Snack - Rum #2", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 12, - "name": "Allm\u00e4nt Snack - Rum #3", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 13, - "name": "Allm\u00e4nt Snack - Rum #4", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 14, - "name": "Utvisningsb\u00e5set", - "parent": 2, - "position": 1000, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 84, - "name": "Allm\u00e4nt Sna -|| -ck - Rum #5", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 85, - "name": "Allm\u00e4nt Snack - Rum #6", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 86, - "name": "Allm\u00e4nt Snack - Vuxenkanal #1", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 87, - "name": "Allm\u00e4nt Snack - Vuxenkanal #2", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 88, - "name": "Allm\u00e4nt Snack - Vuxenkanal #3 30 Plus", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 2, - "name": "Allm\u00e4nt Snack", - "parent": 190, - "position": 100, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 205, - "name": "V\u00e4lkommen in - Allm\u00e4n samlingskanal", - "parent": 190, - -|| - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 190, - "name": "Snack-kanaler", - "parent": 0, - "position": 20, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 193, - "name": "Startbanan (registrera er sj\u00e4lva)", - "parent": 0, - "position": 999, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 479, - "name": "Grupp 1", - "parent": 119, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 480, - "name": "Grupp 2", - "parent": 119, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 119, - "name": "Battlefield 3", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 47, - "name": "Team #1", - "parent": 16, - -|| - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 54, - "name": "Team #2", - "parent": 16, - "position": 20, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 16, - "name": "Skyttegrav #2 Project Reality Coop", - "parent": 122, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 17, - "name": "Skyttegrav #1 BF2 Ranked", - "parent": 122, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 385, - "name": "Team #1", - "parent": 384, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 386, - "name": "Team #2", - "parent": 384, - "position": 0, - "temporary": false, - "users": [] - } - ], - "descriptio -|| -n": "", - "id": 384, - "name": "Skyttegrav #3 Project Reality", - "parent": 122, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 122, - "name": "Battlefield 2", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 198, - "name": "Squad #1", - "parent": 149, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 199, - "name": "Squad #2", - "parent": 149, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 202, - "name": "Squad #3", - "parent": 149, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 149, - "name": " -|| -Team #1", - "parent": 148, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 200, - "name": "Squad #1", - "parent": 194, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 201, - "name": "Squad #2", - "parent": 194, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 203, - "name": "Squad #3", - "parent": 194, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 194, - "name": "Team #2", - "parent": 148, - "position": 10, - "temporary": false, - "users": [] - } - ], - "description": "http://www.sweclockers.com/forum/149-spelcloc -|| -kers/1247307-bf4-sweclockers-battlefield-servrar/", - "id": 148, - "name": "SweClockers 64 HC Conquest", - "parent": 389, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 390, - "name": "Grupp 1", - "parent": 389, - "position": 110, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 391, - "name": "Grupp 2", - "parent": 389, - "position": 120, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 391, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 9336, - "mute": false, - "name": "Tennethe", - "onlinesecs": 18772, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 152, - "suppress": false, - "tcponly": false, - "userid": 4081, - "version": 66056, - "udpPing": 28.61, - "tcpPing": 32.88 - } - ] - }, - -|| - { - "channels": [], - "description": "", - "id": 392, - "name": "Grupp 3", - "parent": 389, - "position": 130, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 393, - "name": "S\u00f6ker spelare", - "parent": 389, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 475, - "name": "Squad #1", - "parent": 473, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 476, - "name": "Squad #2", - "parent": 473, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 473, - "name": "Team #1", - "parent": 472, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ -|| -], - "description": "", - "id": 477, - "name": "Squad #1", - "parent": 474, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 478, - "name": "Squad #2", - "parent": 474, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 474, - "name": "Team #2", - "parent": 472, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "http://www.sweclockers.com/forum/149-spelclockers/1247307-bf4-sweclockers-battlefield-servrar/", - "id": 472, - "name": "SweClockers 32 Vanilla maps", - "parent": 389, - "position": 20, - "temporary": false, - "users": [] - } - ], - "description": "SweClockers.com 64 HC Conquest: \n

http://battlelog.battlefield.com/bf4/servers/show/pc/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5/SweClockers-com-64-HC-Conquest/

SweClockers.com 32 Custom Rush/Obliteration:

\n

http://battlelog.battlefield.com/bf4/servers/show/pc/b7c21efd-25ab-4306-a2ff-4342f41850bc/SweClockers-com-32-Custom-Rush-Obliteration/

", - "id": 389, - "name": "Battlefield 4", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 561, - "name": "Grupp 1", - "parent": 560, - "position": 1, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 562, - "name": "Grupp 2", - "parent": 560, - "position": 2, - "temporary": false, - "users": [] - }, - { - "channels": [], - -|| -"description": "", - "id": 563, - "name": "Grupp 3", - "parent": 560, - "position": 3, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 564, - "name": "S\u00f6ker spelare", - "parent": 560, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 560, - "name": "Battlefield Hardline Beta", - "parent": 3, - "position": 4, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 570, - "name": "Grupp 1", - "parent": 569, - "position": 1, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 571, - "name": "Grupp 2", - "parent": 569, - "position": 2, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 569, - "name": "Bad Company 2", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "H\u00e4r spelar vi B -|| -attlefield och Project Reality.\n


Foruml\u00e4nk: http://www.skyttegrav.se/viewforum.php?f=8

", - "id": 3, - "name": "Battlefield", - "parent": 542, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 23, - "name": "Call of Duty 4", - "parent": 4, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 95, - "name": "Party 1", - "parent": 25, - "position": 100, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 95, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 131, - "mute": false, - "name": "Figge86", - "onlinesecs": 3454, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 259, - "suppress": false, - "tcponly": false, - "userid": 3459, - "version": -|| -66056, - "udpPing": 15.41, - "tcpPing": 17.77 - } -, - { - "bytespersec": 0, - "channel": 95, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 5, - "mute": false, - "name": "sterner007", - "onlinesecs": 8801, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 312, - "suppress": false, - "tcponly": false, - "userid": 3836, - "version": 66056, - "udpPing": 33.28, - "tcpPing": 36.30 - } - ] - }, - { - "channels": [], - "description": "", - "id": 96, - "name": "Party 2", - "parent": 25, - "position": 200, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 25, - "name": "Call of Duty - Modern Warfare 2", - "parent": 4, - "position": 50, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 140, - "name": "Party 1", - "parent": 139, - -|| - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 212, - "name": "Party 2", - "parent": 139, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 139, - "name": "Call of Duty - Modern Warfare 3", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 254, - "name": "Party 1", - "parent": 246, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 255, - "name": "Party 2", - "parent": 246, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 246, - "name": "Call of Duty - Black Ops 2", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 398, - "name": "Party 1", - "parent": 396, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 399, - "name": "Party 2", - "parent": 396, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 396, - "name": "Hardcore", - "parent": 395, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 397, - "name": "Softcore", - "parent": 395, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 395, - "name": "Call of Duty - Ghosts", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 555, - "name": "Party 1", - "parent": 554, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 555, - "comment": "", - -|| - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 9, - "mute": false, - "name": "[SG]K\u00e5Be", - "onlinesecs": 28263, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 12, - "suppress": false, - "tcponly": false, - "userid": 27, - "version": 66056, - "udpPing": 20.78, - "tcpPing": 23.90 - } -, - { - "bytespersec": 0, - "channel": 555, - "comment": "beh\u00f6ver ni mig kalla\n

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 8, - "mute": false, - "name": "[SG-SUP]strike", - "onlinesecs": 4771, - "os": "Win", - "osversion": "5.1.2600.1", - "release": "1.2.3", - "selfDeaf": false, - "selfMute": false, - "session": 314, - "suppress": false, - "tcponly": false, - "userid": 19, - "version": 66051, - "udpPing": 21.30, - "tcpPing": 25.92 - } - ] - }, - { - "channels": [], - "description": "", - "id": 556, - "name": "Party 2", - "parent": 554, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 554, - "name": "Call of Duty - Advance Warfare", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 4, - "name": "Call of Duty", - "parent": 542, - "position": 20, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 28, - "name": "Skyttegrav #1 - D2 INF Nuke", - "parent": 5, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 30, - "name": "Skyttegrav #3 - WC3FT ", - "parent": 5, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 483, - "name": "Rum #1", - "parent": 179, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channe -|| -ls": [], - "description": "", - "id": 484, - "name": "Rum #2", - "parent": 179, - "position": 20, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 179, - "name": "Competitive", - "parent": 178, - "position": 20, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 180, - "name": "Rum #2", - "parent": 178, - "position": 200, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 181, - "name": "Skyttegrav #3 Classic Competitive", - "parent": 178, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 527, - "name": "Rum #1", - "parent": 178, - "position": 100, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 178, - "name": "Global Offensive", - "parent": 5, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 5, - -|| - "name": "Counter-Strike", - "parent": 542, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 537, - "name": "Euro Truck Sim", - "parent": 345, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 345, - "name": "Bilspel och racingsims (F1 Dirt ETS mm)", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 486, - "name": "7 days to die ", - "parent": 485, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 487, - "name": "Space Engineers", - "parent": 485, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 536, - "name": "Everquest landmark", - "parent": 485, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 485, - "name": "Voxel Spel", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 418, - "name": "Rum #1", - "parent": 394, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 419, - "name": "Rum #2", - "parent": 394, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 394, - "name": "Final Fantasy XIV - A Realm Reborn", - "parent": 488, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 489, - "name": "Mortal Online", - "parent": 488, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 491, - "name": "Party 1", - -|| - "parent": 490, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 492, - "name": "Party 2", - "parent": 490, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 6876, - "channel": 492, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "Widoxz", - "onlinesecs": 27468, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 24, - "suppress": false, - "tcponly": false, - "userid": 4058, - "version": 66056, - "udpPing": 35.82, - "tcpPing": 56.07 - } -, - { - "bytespersec": 6918, - "channel": 492, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "FourO", - "onlinesecs": 2556, - -|| - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 131, - "suppress": false, - "tcponly": false, - "userid": 4111, - "version": 66056, - "udpPing": 9.74, - "tcpPing": 17.55 - } -, - { - "bytespersec": 0, - "channel": 492, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 2578, - "mute": false, - "name": "lemurtacos", - "onlinesecs": 2579, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": true, - "session": 185, - "suppress": false, - "tcponly": false, - "userid": 3827, - "version": 66056, - "udpPing": 9.87, - "tcpPing": 13.88 - } -, - { - "bytespersec": 8868, - "channel": 492, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "nam -|| -e": "kaviar", - "onlinesecs": 22276, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 349, - "suppress": false, - "tcponly": false, - "userid": 3759, - "version": 66056, - "udpPing": 11.72, - "tcpPing": 14.77 - } -, - { - "bytespersec": 9032, - "channel": 492, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "LillaEmma", - "onlinesecs": 3092, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 419, - "suppress": false, - "tcponly": false, - "userid": 3758, - "version": 66056, - "udpPing": 10.32, - "tcpPing": 14.23 - } - ] - } - ], - "description": "", - "id": 490, - "name": "World of Warcraft", - "parent": 488, - "position": 0, - "temporary": false, - -|| -"users": [] - }, - { - "channels": [], - "description": "", - "id": 495, - "name": "Guild Wars 2", - "parent": 488, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 513, - "name": "Planetside 2", - "parent": 488, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 529, - "name": "Aion", - "parent": 488, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 488, - "name": "MMO", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 207, - "name": "Borderlands 2", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 218, - "name": "Portal 2", - "parent": 498, - "position": 0, - "temporary": false, - "users": [ - -|| - { - "bytespersec": 0, - "channel": 218, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 833, - "mute": false, - "name": "Maichopalami", - "onlinesecs": 4034, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 157, - "suppress": false, - "tcponly": false, - "userid": 1563, - "version": 66056, - "udpPing": 12.87, - "tcpPing": 14.56 - } - ] - }, - { - "channels": [ - { - "channels": [], - "description": "Clanen vi har till Wipe heter \n

SKYTTEGRAV

\n

\n

Joina denna f\u00f6r att teama up.

", - "id": 240, - "name": "Grupp 1", - "parent": 232, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 241, - "name": "Grupp 2", - "parent": 232, - "position": 1, - "temporary": false, - "users": [] - }, - { - -|| -"channels": [], - "description": "", - "id": 376, - "name": "Skyttegrav KLAN SPEL", - "parent": 232, - "position": 1, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 232, - "name": "Infestation Survivor Stories", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 499, - "name": "ArmA", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 500, - "name": "Natural Selection 2", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 502, - "name": "Left 4 Dead", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 515, - "name": "Allies", - "parent": 514, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 516, - "name": "Axis", - "parent": 514, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 514, - "name": "Red Orchestra 2", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 519, - "name": "Persistent World", - "parent": 518, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 520, - "name": "Mount and blade Vanilla", - "parent": 518, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 518, - "name": "Mount and Blade - Warband", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 541, - -|| - "name": "Insurgency", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 567, - "name": "Evolve", - "parent": 498, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "First-person shooter & Third-person shooter", - "id": 498, - "name": "FPS och TPS", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 356, - "name": "Starcraft", - "parent": 504, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 505, - "name": "Company of Heroes", - "parent": 504, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 534, - "name": "Rum #1", - "parent": 506, - "position": 0, - "temporary": false, - "users": [] - -|| - }, - { - "channels": [], - "description": "", - "id": 535, - "name": "Rum #2", - "parent": 506, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 506, - "name": "Europa Universalis ", - "parent": 504, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 523, - "name": "Age of Empires", - "parent": 504, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "h\u00e4r spelar man Civilization V", - "id": 533, - "name": "Civilization V", - "parent": 504, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 504, - "name": "RTS och grand strategy", - "parent": 7, - "position": 0, - "temporary": false, - " -|| -users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 375, - "name": "Mechwarrior Online", - "parent": 510, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 526, - "name": "Tank", - "parent": 511, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 538, - "name": "Flyg", - "parent": 511, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 511, - "name": "War Thunder", - "parent": 510, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 512, - "name": "World of Tanks", - "parent": 510, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 512, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 1774, - "mute": false, - "name": "[SG]Binge", - "onlinesecs": 10721, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 333, - "suppress": false, - "tcponly": false, - "userid": 1837, - "version": 66056, - "udpPing": 22.63, - "tcpPing": 25.85 - } - ] - }, - { - "channels": [], - "description": "", - "id": 530, - "name": "Town of salem", - "parent": 510, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "Spel som \u00e4r gratis att k\u00f6ra.", - "id": 510, - "name": "Free to play", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 167, - "name": "Diablo 3", - "parent": 521, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 8843, - "channel": 167, - "comment": "", - -|| - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "shimmerghost", - "onlinesecs": 16295, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.4", - "selfDeaf": false, - "selfMute": false, - "session": 144, - "suppress": false, - "tcponly": false, - "userid": 2347, - "version": 66052, - "udpPing": 30.98, - "tcpPing": 33.08 - } -, - { - "bytespersec": 8982, - "channel": 167, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "Lankfisher", - "onlinesecs": 16298, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 186, - "suppress": false, - "tcponly": false, - "userid": 4106, - "version": 66056, - "udpPing": 21.28, - "tcpPing": 23.40 - } -, - { - "bytespersec": 8564, - "channel": 167, - "comment": "", - "context": "", - " -|| -deaf": false, - "identity": "", - "idlesecs": 0, - "mute": false, - "name": "AndreasLindgren", - "onlinesecs": 4401, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 235, - "suppress": false, - "tcponly": false, - "userid": 2439, - "version": 66056, - "udpPing": 31.60, - "tcpPing": 17.20 - } -, - { - "bytespersec": 0, - "channel": 167, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 4345, - "mute": false, - "name": "Emmag", - "onlinesecs": 4364, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.4", - "selfDeaf": false, - "selfMute": true, - "session": 300, - "suppress": false, - "tcponly": false, - "userid": 2438, - "version": 66052, - "udpPing": 24.04, - "tcpPing": 24.97 - } - ] - }, - { - "channels": [], - "description": "", - "id": 336, - "name": "Path of Exile", - "parent": 521, - -|| - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 383, - "name": "Torchlight II", - "parent": 521, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 383, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 3095, - "mute": false, - "name": "Tobias", - "onlinesecs": 7952, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 325, - "suppress": false, - "tcponly": false, - "userid": 3788, - "version": 66056, - "udpPing": 15.76, - "tcpPing": 22.77 - } - ] - } - ], - "description": "", - "id": 521, - "name": "Hack and slash", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 565, - "name": "Grupp 1", - "parent": 6, - "position": 5, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 566, - "name": "Grupp 2", - "parent": 6, - "position": 10, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 6, - "name": "League of Legends", - "parent": 522, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 236, - "name": "Grupp 1", - "parent": 153, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 237, - "name": "Grupp 2", - "parent": 153, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 153, - "name": "Dota 2", - "parent": 522, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 532, - "name": "Smite", - "parent": 522, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 522, - "name": "MOBA", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 528, - "name": "Tabletop Simulator", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 559, - "name": "Kerbal Space Program", - "parent": 7, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 7, - "name": "\u00d6vriga spel", - "parent": 542, - "position": 60, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "L\u00e5st till admins f\u00f6r Hemligastugan.", - "id": 388, - "name": "Admin", - "parent": 157, - "position": 2, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 416, - -|| - "name": "Grupp 1", - "parent": 157, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 417, - "name": "Grupp 2", - "parent": 157, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "Serverip:
mc.hemligastugan.com

Dynmap / Regler:

http://www.hemligastugan.com/minecraft/#
", - "id": 157, - "name": "Hemligastugan", - "parent": 156, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 539, - "name": "Rum 1", - "parent": 158, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 540, - "name": "Rum 2", - "parent": 158, - "position": 0, - "temporary": false, - -|| - "users": [] - } - ], - "description": "Inte bara en samling moddar.. \u00c4ven med egenutvecklade MODS! \n

MC Version 1.7.10 / Skyttegrav Modpack 2.0

\n

Hemsida: http://mc.skyttegrav.se

\n

Info & registrering: http://www.skyttegrav.se/index.php?/topic/5-skyttegravse-custom-modpack

\n

Server IP: mc.skyttegrav.se

\n

Dynmap: http://mc.skyttegrav.se/dynmap

", - "id": 158, - "name": "Skyttegrav Modpack", - "parent": 156, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 156, - "name": "Minecraft", - "parent": 542, - "position": 50, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 176, - "name": "Grupp 1", - "parent": 170, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channe -|| -ls": [], - "description": "", - "id": 177, - "name": "Grupp 2", - "parent": 170, - "position": 20, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 196, - "name": "Grupp 3", - "parent": 170, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 197, - "name": "Grupp 4", - "parent": 170, - "position": 40, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 170, - "name": "Day Z", - "parent": 542, - "position": 40, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "H\u00e4r s\u00f6ker ni spelare f\u00f6r ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.

", - "id": 192, - "name": "S\u00f6ker spelare", - "parent": 542, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 542, - "name": "Spelkanaler", - "parent": 0, - "position": 30, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - -|| - "id": 546, - "name": "Titta och diskutera", - "parent": 544, - "position": 5, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 547, - "name": "Tysta rummet", - "parent": 544, - "position": 10, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 544, - "name": "MS Presskonferens", - "parent": 543, - "position": 10, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 549, - "name": "Rum #1", - "parent": 553, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 550, - "name": "Rum #2", - "parent": 553, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 553, - "name": "Trackmania 29 Okt", - "parent": 548, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 548, - "name": "Skyttegrav Free-2-Play Spelkv\u00e4llar", - "p -|| -arent": 543, - "position": 50, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 558, - "name": "DreamHack", - "parent": 543, - "position": 100, - "temporary": false, - "users": [] - } - ], - "description": "H\u00e4r kan man sitta och titta p\u00e5 streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du f\u00e5r g\u00e4rna tipsa om ett evenemang.", - "id": 543, - "name": "Event-kanaler", - "parent": 0, - "position": 11, - "temporary": false, - "users": [] - } - ], - "description": "Welcome! \n

This server requires registration in order to move from Root.
Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.

", - "id": 0, - "name": "Root", - "parent": -1, - "position": 0, - "temporary": false, - "users": [] - } -} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/1_result.json b/gameq/tests/Protocols/Providers/Mumble/1_result.json deleted file mode 100644 index fa2ba61..0000000 --- a/gameq/tests/Protocols/Providers/Mumble/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"95.130.64.232:64738":{"dedicated":1,"gq_address":"95.130.64.232","gq_joinlink":"mumble:\/\/95.130.64.232:64738\/","gq_name":"Mumble Server","gq_online":true,"gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_transport":"tcp","gq_type":"mumble","id":1,"name":"Skyttegrav & SweClockers Mumble","numplayers":38,"players":[{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":23441,"mute":false,"name":"pyootr","onlinesecs":23441,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":96,"suppress":true,"tcponly":false,"userid":66,"version":66053,"udpPing":51.19,"tcpPing":62.56},{"bytespersec":0,"channel":1,"comment":"Serveransvarig & Admin<\/b> för Skyttegrav.se\/Sweclockers.com spelservrar. \n

Supervisor<\/b> hos Skyttegrav.se<\/a>.<\/p>","context":"","deaf":false,"identity":"","idlesecs":28260,"mute":false,"name":"[SG-SUP]Gix","onlinesecs":28289,"os":"X11","osversion":"Linux Mint 17 Qiana","release":"1.2.8-1~ppa1~trusty1","selfDeaf":false,"selfMute":false,"session":124,"suppress":true,"tcponly":false,"userid":47,"version":66056,"udpPing":29.2,"tcpPing":28.94},{"bytespersec":0,"channel":1,"comment":"JAG TROR DIG URKEL!\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":21756,"mute":false,"name":"Eyem-_-","onlinesecs":23981,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":176,"suppress":true,"tcponly":false,"userid":1001,"version":66052,"udpPing":17.31,"tcpPing":20.12},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":855,"mute":false,"name":"[SG-HA]Relemy","onlinesecs":28262,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":232,"suppress":true,"tcponly":false,"userid":1926,"version":66056,"udpPing":37.94,"tcpPing":42.07},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":27997,"mute":false,"name":"TheLikus","onlinesecs":28143,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":269,"suppress":true,"tcponly":false,"userid":4120,"version":66056,"udpPing":11.01,"tcpPing":13.62},{"bytespersec":0,"channel":1,"comment":"EX VERITAS ET VIGILANTIA VICTORIA<\/span>","context":"","deaf":false,"identity":"","idlesecs":857,"mute":false,"name":"[SG-SUP]Azlan1","onlinesecs":24386,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":316,"suppress":true,"tcponly":true,"userid":2296,"version":66056,"udpPing":53.51,"tcpPing":65.31},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28272,"mute":false,"name":"Legoo","onlinesecs":28274,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":473,"suppress":true,"tcponly":false,"userid":1657,"version":66053,"udpPing":8.45,"tcpPing":23.05},{"bytespersec":0,"channel":432,"comment":"http:\/\/www.twitch.tv\/tobbbe__<\/a>","context":"","deaf":false,"identity":"","idlesecs":114,"mute":false,"name":"[SweC]Tobbbe__","onlinesecs":28273,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":5,"suppress":false,"tcponly":false,"userid":3769,"version":66056,"udpPing":21.7,"tcpPing":23.08},{"bytespersec":0,"channel":432,"comment":"

<\/p>","context":"","deaf":false,"identity":"","idlesecs":16,"mute":false,"name":"Vilse(SWE)","onlinesecs":15534,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":110,"suppress":false,"tcponly":false,"userid":4124,"version":66056,"udpPing":13.77,"tcpPing":16.06},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":54,"mute":false,"name":"Th3MadPanda","onlinesecs":28272,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":236,"suppress":false,"tcponly":false,"userid":2099,"version":66056,"udpPing":8.86,"tcpPing":11.8},{"bytespersec":0,"channel":432,"comment":"","context":"","deaf":false,"identity":"","idlesecs":63,"mute":false,"name":"Mumin","onlinesecs":8481,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":306,"suppress":false,"tcponly":false,"userid":4125,"version":66056,"udpPing":19.08,"tcpPing":22.64},{"bytespersec":0,"channel":432,"comment":"Greetinx Programs!<\/a> \n

\n

Välkommen till SweClockers och Skyttegravs gemensamma Mumble!<\/p>\n

\n

Ni kan fråga mig om administrativa saker på servers eller mumble, jag är huvudadmin för SweC gänget och dessutom forumledare för SweClockers.com. Här är reglerna för mumble och SweC forum.<\/a><\/p>\n

<\/p>\n

Vi satsar på en trevlig stämning online! :)<\/p>\n

","context":"","deaf":false,"identity":"","idlesecs":1720,"mute":false,"name":"[SweC-H]Lan","onlinesecs":28266,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":353,"suppress":false,"tcponly":false,"userid":56,"version":66053,"udpPing":15.76,"tcpPing":35.14},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":110,"mute":false,"name":"Gson","onlinesecs":3157,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":146,"suppress":false,"tcponly":false,"userid":4123,"version":66056,"udpPing":52.64,"tcpPing":58.41},{"bytespersec":0,"channel":433,"comment":"","context":"","deaf":false,"identity":"","idlesecs":113,"mute":false,"name":"lampan","onlinesecs":18331,"os":"Win","osversion":"6.2.9200.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":463,"suppress":false,"tcponly":false,"userid":3404,"version":66053,"udpPing":13.61,"tcpPing":16.75},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":146,"mute":false,"name":"[SweC-T]Grabbengrå","onlinesecs":27438,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":53,"suppress":false,"tcponly":false,"userid":1952,"version":66056,"udpPing":20.4,"tcpPing":22.75},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":433,"mute":false,"name":"[SweC-H]Kinekin","onlinesecs":28269,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":180,"suppress":false,"tcponly":false,"userid":2426,"version":66056,"udpPing":49.77,"tcpPing":52.25},{"bytespersec":7488,"channel":451,"comment":"Det händer att jag spelar spel ibland.\n

<\/p>\n

<\/p>\n

<\/p>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-T]DavidtheDoom","onlinesecs":28221,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":203,"suppress":false,"tcponly":false,"userid":3030,"version":66056,"udpPing":3.95,"tcpPing":5.59},{"bytespersec":0,"channel":451,"comment":"SweC spelservrar finns också på Facebook<\/a>","context":"","deaf":false,"identity":"","idlesecs":26,"mute":false,"name":"[SweC-H]Raven_cc","onlinesecs":21049,"os":"Win","osversion":"6.1.7600.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":264,"suppress":false,"tcponly":true,"userid":78,"version":66055,"udpPing":19.72,"tcpPing":25.83},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":763,"mute":false,"name":"OskarWallin","onlinesecs":11404,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":272,"suppress":false,"tcponly":false,"userid":3783,"version":66056,"udpPing":11.96,"tcpPing":31.07},{"bytespersec":3996,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"[SweC-A]Hitman","onlinesecs":28265,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":485,"suppress":false,"tcponly":true,"userid":76,"version":66056,"udpPing":21.36,"tcpPing":28.02},{"bytespersec":0,"channel":451,"comment":"","context":"","deaf":false,"identity":"","idlesecs":6,"mute":false,"name":"[SG-A]bl0m1","onlinesecs":28242,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":488,"suppress":false,"tcponly":false,"userid":3447,"version":66056,"udpPing":40.23,"tcpPing":43.4},{"bytespersec":0,"channel":391,"comment":"","context":"","deaf":false,"identity":"","idlesecs":9336,"mute":false,"name":"Tennethe","onlinesecs":18772,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":152,"suppress":false,"tcponly":false,"userid":4081,"version":66056,"udpPing":28.61,"tcpPing":32.88},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":131,"mute":false,"name":"Figge86","onlinesecs":3454,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":259,"suppress":false,"tcponly":false,"userid":3459,"version":66056,"udpPing":15.41,"tcpPing":17.77},{"bytespersec":0,"channel":95,"comment":"","context":"","deaf":false,"identity":"","idlesecs":5,"mute":false,"name":"sterner007","onlinesecs":8801,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":312,"suppress":false,"tcponly":false,"userid":3836,"version":66056,"udpPing":33.28,"tcpPing":36.3},{"bytespersec":0,"channel":555,"comment":"","context":"","deaf":false,"identity":"","idlesecs":9,"mute":false,"name":"[SG]KåBe","onlinesecs":28263,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":12,"suppress":false,"tcponly":false,"userid":27,"version":66056,"udpPing":20.78,"tcpPing":23.9},{"bytespersec":0,"channel":555,"comment":"behöver ni mig kalla\n

","context":"","deaf":false,"identity":"","idlesecs":8,"mute":false,"name":"[SG-SUP]strike","onlinesecs":4771,"os":"Win","osversion":"5.1.2600.1","release":"1.2.3","selfDeaf":false,"selfMute":false,"session":314,"suppress":false,"tcponly":false,"userid":19,"version":66051,"udpPing":21.3,"tcpPing":25.92},{"bytespersec":6876,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Widoxz","onlinesecs":27468,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":24,"suppress":false,"tcponly":false,"userid":4058,"version":66056,"udpPing":35.82,"tcpPing":56.07},{"bytespersec":6918,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"FourO","onlinesecs":2556,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":131,"suppress":false,"tcponly":false,"userid":4111,"version":66056,"udpPing":9.74,"tcpPing":17.55},{"bytespersec":0,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":2578,"mute":false,"name":"lemurtacos","onlinesecs":2579,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":185,"suppress":false,"tcponly":false,"userid":3827,"version":66056,"udpPing":9.87,"tcpPing":13.88},{"bytespersec":8868,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"kaviar","onlinesecs":22276,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":349,"suppress":false,"tcponly":false,"userid":3759,"version":66056,"udpPing":11.72,"tcpPing":14.77},{"bytespersec":9032,"channel":492,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"LillaEmma","onlinesecs":3092,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":419,"suppress":false,"tcponly":false,"userid":3758,"version":66056,"udpPing":10.32,"tcpPing":14.23},{"bytespersec":0,"channel":218,"comment":"","context":"","deaf":false,"identity":"","idlesecs":833,"mute":false,"name":"Maichopalami","onlinesecs":4034,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":157,"suppress":false,"tcponly":false,"userid":1563,"version":66056,"udpPing":12.87,"tcpPing":14.56},{"bytespersec":0,"channel":512,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1774,"mute":false,"name":"[SG]Binge","onlinesecs":10721,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":333,"suppress":false,"tcponly":false,"userid":1837,"version":66056,"udpPing":22.63,"tcpPing":25.85},{"bytespersec":8843,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"shimmerghost","onlinesecs":16295,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":2347,"version":66052,"udpPing":30.98,"tcpPing":33.08},{"bytespersec":8982,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"Lankfisher","onlinesecs":16298,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":186,"suppress":false,"tcponly":false,"userid":4106,"version":66056,"udpPing":21.28,"tcpPing":23.4},{"bytespersec":8564,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":0,"mute":false,"name":"AndreasLindgren","onlinesecs":4401,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":235,"suppress":false,"tcponly":false,"userid":2439,"version":66056,"udpPing":31.6,"tcpPing":17.2},{"bytespersec":0,"channel":167,"comment":"","context":"","deaf":false,"identity":"","idlesecs":4345,"mute":false,"name":"Emmag","onlinesecs":4364,"os":"Win","osversion":"6.1.7601.1","release":"1.2.4","selfDeaf":false,"selfMute":true,"session":300,"suppress":false,"tcponly":false,"userid":2438,"version":66052,"udpPing":24.04,"tcpPing":24.97},{"bytespersec":0,"channel":383,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3095,"mute":false,"name":"Tobias","onlinesecs":7952,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":325,"suppress":false,"tcponly":false,"userid":3788,"version":66056,"udpPing":15.76,"tcpPing":22.77}],"teams":[{"description":"Welcome! <\/b>\n

This server requires registration<\/span> in order to move from Root.Please register yourself by selecting Self --> Register in the menu bar, or right-clicking on your nick and choose Register.<\/b><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false},{"description":"","id":1,"name":"AFK","parent":0,"position":0,"temporary":false},{"description":"","id":8,"name":"Utlånade Kanaler","parent":0,"position":100,"temporary":false},{"description":"Endast För Skyttegrav admins!<\/b>","id":9,"name":"Admins Corner (private)","parent":0,"position":200,"temporary":false},{"description":"","id":38,"name":"Admins","parent":9,"position":11,"temporary":false},{"description":"","id":43,"name":"Headadmins Corner","parent":9,"position":60,"temporary":false},{"description":"","id":44,"name":"Supervisors Corner - Polska Riksdagen","parent":9,"position":70,"temporary":false},{"description":"Spelföreningen bakom Skyttegrav.se","id":150,"name":"United Gaming","parent":9,"position":0,"temporary":false},{"description":"","id":151,"name":"Möte","parent":150,"position":0,"temporary":false},{"description":"","id":152,"name":"Styrelsemöte","parent":150,"position":0,"temporary":false},{"description":"Endast För SweClockers.com admins!<\/b>","id":187,"name":"Sweclockers","parent":9,"position":0,"temporary":false},{"description":"","id":188,"name":"Allmän Admin","parent":187,"position":0,"temporary":false},{"description":"","id":189,"name":"Privat Admin (Endast inbjudan)","parent":187,"position":0,"temporary":false},{"description":"","id":214,"name":"Allmän Admin (Delad)","parent":9,"position":10,"temporary":false},{"description":"","id":183,"name":"SweClockers","parent":0,"position":10,"temporary":false},{"description":"Här kommer våra stream och webtv att sändas! \n

\n

Besök www.swec.tv och avnjut sändningen, vill du deltaga så skicka ett meddelande i mumble till en admin som antingen kan flytta dig eller ge dig lösenordet. Vi kommer att både casta och spela olika spel löpande.<\/p>\n

\n

I kanalen gäller strikt ljud och informationskontroll, akta er alltså för att inte säga för mycket.<\/p>","id":358,"name":"SweC TV Studio (private)","parent":183,"position":100,"temporary":false},{"description":"Vill ni deltaga i SweC TV? \n

\n

Sätt er i detta rummet så kommer vi att dra in er i cast rummet vid tillfälle, ni är varmt välkomna att titta på www.swec.tv<\/a> medan ni väntar! <\/p>\n

\n

När ni kommer in i cast kanalen är ni automatiskt satta till "mute", vi kommer att ändra det när ni kommer in.<\/p>\n

\n

\n

","id":402,"name":"SweC TV lobby (wait for invite to cast room)","parent":183,"position":200,"temporary":false},{"description":"Hjälp med Mumble? Läs här -> Mumble tråd på SweClockers<\/a>","id":421,"name":"Spelkvällar","parent":183,"position":300,"temporary":false},{"description":"Här har ni nyttig information om spelkvällarna! \n

SpelClockers<\/a> Spelkvällar<\/p>\n

Sweclockers Steam chat grupp<\/a><\/p>\n

<\/p>","id":426,"name":"Allmän samlingskanal - Kom hit för råd och vägledning","parent":421,"position":0,"temporary":false},{"description":"","id":427,"name":"Reserv #2","parent":421,"position":20,"temporary":false},{"description":"","id":429,"name":"Grupp 1","parent":427,"position":10,"temporary":false},{"description":"","id":430,"name":"Grupp 2","parent":427,"position":20,"temporary":false},{"description":"","id":449,"name":"Grupp 3","parent":427,"position":30,"temporary":false},{"description":"","id":450,"name":"Grupp 4","parent":427,"position":40,"temporary":false},{"description":"","id":453,"name":"Rematch och rekryt Lobby","parent":427,"position":0,"temporary":false},{"description":"","id":455,"name":"Grupp 5","parent":427,"position":50,"temporary":false},{"description":"","id":456,"name":"Grupp 6","parent":427,"position":60,"temporary":false},{"description":"","id":428,"name":"12h stream med SpelClockers - Lördag 28 feb","parent":421,"position":10,"temporary":false},{"description":"","id":432,"name":"MechWarrior Online","parent":428,"position":10,"temporary":false},{"description":"","id":433,"name":"Grupp 2","parent":428,"position":20,"temporary":false},{"description":"","id":434,"name":"Grupp 3","parent":428,"position":30,"temporary":false},{"description":"","id":443,"name":"Grupp 4","parent":428,"position":40,"temporary":false},{"description":"","id":444,"name":"Grupp 5","parent":428,"position":50,"temporary":false},{"description":"","id":451,"name":"Samlingsal","parent":428,"position":0,"temporary":false},{"description":"","id":459,"name":"Grupp 6","parent":428,"position":60,"temporary":false},{"description":"","id":436,"name":"Reserv #3","parent":421,"position":30,"temporary":false},{"description":"","id":437,"name":"Grupp 1","parent":436,"position":10,"temporary":false},{"description":"","id":438,"name":"Grupp 2","parent":436,"position":20,"temporary":false},{"description":"","id":439,"name":"Grupp 3","parent":436,"position":30,"temporary":false},{"description":"","id":440,"name":"Grupp 4","parent":436,"position":40,"temporary":false},{"description":"","id":441,"name":"Grupp 5","parent":436,"position":50,"temporary":false},{"description":"","id":442,"name":"Grupp 6","parent":436,"position":60,"temporary":false},{"description":"","id":452,"name":"Rematch och rekryt Lobby","parent":436,"position":0,"temporary":false},{"description":"","id":190,"name":"Snack-kanaler","parent":0,"position":20,"temporary":false},{"description":"","id":2,"name":"Allmänt Snack","parent":190,"position":100,"temporary":false},{"description":"","id":10,"name":"Allmänt Snack - Rum #1","parent":2,"position":0,"temporary":false},{"description":"","id":11,"name":"Allmänt Snack - Rum #2","parent":2,"position":0,"temporary":false},{"description":"","id":12,"name":"Allmänt Snack - Rum #3","parent":2,"position":0,"temporary":false},{"description":"","id":13,"name":"Allmänt Snack - Rum #4","parent":2,"position":0,"temporary":false},{"description":"","id":14,"name":"Utvisningsbåset","parent":2,"position":1000,"temporary":false},{"description":"","id":84,"name":"Allmänt Snack - Rum #5","parent":2,"position":0,"temporary":false},{"description":"","id":85,"name":"Allmänt Snack - Rum #6","parent":2,"position":0,"temporary":false},{"description":"","id":86,"name":"Allmänt Snack - Vuxenkanal #1","parent":2,"position":0,"temporary":false},{"description":"","id":87,"name":"Allmänt Snack - Vuxenkanal #2","parent":2,"position":0,"temporary":false},{"description":"","id":88,"name":"Allmänt Snack - Vuxenkanal #3 30 Plus","parent":2,"position":0,"temporary":false},{"description":"","id":205,"name":"Välkommen in - Allmän samlingskanal","parent":190,"position":0,"temporary":false},{"description":"","id":193,"name":"Startbanan (registrera er själva)","parent":0,"position":999,"temporary":false},{"description":"","id":542,"name":"Spelkanaler","parent":0,"position":30,"temporary":false},{"description":"Här spelar vi Battlefield och Project Reality.<\/span>\n

Forumlänk: http:\/\/www.skyttegrav.se\/viewforum.php?f=8<\/a><\/p>","id":3,"name":"Battlefield","parent":542,"position":10,"temporary":false},{"description":"","id":119,"name":"Battlefield 3","parent":3,"position":0,"temporary":false},{"description":"","id":479,"name":"Grupp 1","parent":119,"position":0,"temporary":false},{"description":"","id":480,"name":"Grupp 2","parent":119,"position":0,"temporary":false},{"description":"","id":122,"name":"Battlefield 2","parent":3,"position":0,"temporary":false},{"description":"","id":16,"name":"Skyttegrav #2 Project Reality Coop","parent":122,"position":0,"temporary":false},{"description":"","id":47,"name":"Team #1","parent":16,"position":10,"temporary":false},{"description":"","id":54,"name":"Team #2","parent":16,"position":20,"temporary":false},{"description":"","id":17,"name":"Skyttegrav #1 BF2 Ranked","parent":122,"position":0,"temporary":false},{"description":"","id":384,"name":"Skyttegrav #3 Project Reality","parent":122,"position":0,"temporary":false},{"description":"","id":385,"name":"Team #1","parent":384,"position":0,"temporary":false},{"description":"","id":386,"name":"Team #2","parent":384,"position":0,"temporary":false},{"description":"SweClockers.com 64 HC Conquest:<\/b> \n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/dc5cdf97-7b5b-4b4f-962f-e6b74b7a9ad5\/SweClockers-com-64-HC-Conquest\/<\/a><\/a>SweClockers.com 32 Custom Rush\/Obliteration:<\/span><\/b> <\/p>\n

http:\/\/battlelog.battlefield.com\/bf4\/servers\/show\/pc\/b7c21efd-25ab-4306-a2ff-4342f41850bc\/SweClockers-com-32-Custom-Rush-Obliteration\/<\/a><\/p>","id":389,"name":"Battlefield 4","parent":3,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":148,"name":"SweClockers 64 HC Conquest","parent":389,"position":10,"temporary":false},{"description":"","id":149,"name":"Team #1","parent":148,"position":0,"temporary":false},{"description":"","id":198,"name":"Squad #1","parent":149,"position":0,"temporary":false},{"description":"","id":199,"name":"Squad #2","parent":149,"position":0,"temporary":false},{"description":"","id":202,"name":"Squad #3","parent":149,"position":0,"temporary":false},{"description":"","id":194,"name":"Team #2","parent":148,"position":10,"temporary":false},{"description":"","id":200,"name":"Squad #1","parent":194,"position":0,"temporary":false},{"description":"","id":201,"name":"Squad #2","parent":194,"position":0,"temporary":false},{"description":"","id":203,"name":"Squad #3","parent":194,"position":0,"temporary":false},{"description":"","id":390,"name":"Grupp 1","parent":389,"position":110,"temporary":false},{"description":"","id":391,"name":"Grupp 2","parent":389,"position":120,"temporary":false},{"description":"","id":392,"name":"Grupp 3","parent":389,"position":130,"temporary":false},{"description":"","id":393,"name":"Söker spelare","parent":389,"position":0,"temporary":false},{"description":"http:\/\/www.sweclockers.com\/forum\/149-spelclockers\/1247307-bf4-sweclockers-battlefield-servrar\/<\/a>","id":472,"name":"SweClockers 32 Vanilla maps","parent":389,"position":20,"temporary":false},{"description":"","id":473,"name":"Team #1","parent":472,"position":0,"temporary":false},{"description":"","id":475,"name":"Squad #1","parent":473,"position":0,"temporary":false},{"description":"","id":476,"name":"Squad #2","parent":473,"position":0,"temporary":false},{"description":"","id":474,"name":"Team #2","parent":472,"position":0,"temporary":false},{"description":"","id":477,"name":"Squad #1","parent":474,"position":0,"temporary":false},{"description":"","id":478,"name":"Squad #2","parent":474,"position":0,"temporary":false},{"description":"","id":560,"name":"Battlefield Hardline Beta","parent":3,"position":4,"temporary":false},{"description":"","id":561,"name":"Grupp 1","parent":560,"position":1,"temporary":false},{"description":"","id":562,"name":"Grupp 2","parent":560,"position":2,"temporary":false},{"description":"","id":563,"name":"Grupp 3","parent":560,"position":3,"temporary":false},{"description":"","id":564,"name":"Söker spelare","parent":560,"position":0,"temporary":false},{"description":"","id":569,"name":"Bad Company 2","parent":3,"position":0,"temporary":false},{"description":"","id":570,"name":"Grupp 1","parent":569,"position":1,"temporary":false},{"description":"","id":571,"name":"Grupp 2","parent":569,"position":2,"temporary":false},{"description":"","id":4,"name":"Call of Duty","parent":542,"position":20,"temporary":false},{"description":"","id":23,"name":"Call of Duty 4","parent":4,"position":30,"temporary":false},{"description":"","id":25,"name":"Call of Duty - Modern Warfare 2","parent":4,"position":50,"temporary":false},{"description":"","id":95,"name":"Party 1","parent":25,"position":100,"temporary":false},{"description":"","id":96,"name":"Party 2","parent":25,"position":200,"temporary":false},{"description":"","id":139,"name":"Call of Duty - Modern Warfare 3","parent":4,"position":0,"temporary":false},{"description":"","id":140,"name":"Party 1","parent":139,"position":0,"temporary":false},{"description":"","id":212,"name":"Party 2","parent":139,"position":0,"temporary":false},{"description":"","id":246,"name":"Call of Duty - Black Ops 2","parent":4,"position":0,"temporary":false},{"description":"","id":254,"name":"Party 1","parent":246,"position":0,"temporary":false},{"description":"","id":255,"name":"Party 2","parent":246,"position":0,"temporary":false},{"description":"","id":395,"name":"Call of Duty - Ghosts","parent":4,"position":0,"temporary":false},{"description":"","id":396,"name":"Hardcore","parent":395,"position":0,"temporary":false},{"description":"","id":398,"name":"Party 1","parent":396,"position":0,"temporary":false},{"description":"","id":399,"name":"Party 2","parent":396,"position":0,"temporary":false},{"description":"","id":397,"name":"Softcore","parent":395,"position":0,"temporary":false},{"description":"","id":554,"name":"Call of Duty - Advance Warfare","parent":4,"position":0,"temporary":false},{"description":"","id":555,"name":"Party 1","parent":554,"position":0,"temporary":false},{"description":"","id":556,"name":"Party 2","parent":554,"position":0,"temporary":false},{"description":"","id":5,"name":"Counter-Strike","parent":542,"position":30,"temporary":false},{"description":"","id":28,"name":"Skyttegrav #1 - D2 INF Nuke","parent":5,"position":10,"temporary":false},{"description":"","id":30,"name":"Skyttegrav #3 - WC3FT ","parent":5,"position":30,"temporary":false},{"description":"","id":178,"name":"Global Offensive","parent":5,"position":0,"temporary":false},{"description":"","id":179,"name":"Competitive","parent":178,"position":20,"temporary":false},{"description":"","id":483,"name":"Rum #1","parent":179,"position":10,"temporary":false},{"description":"","id":484,"name":"Rum #2","parent":179,"position":20,"temporary":false},{"description":"","id":180,"name":"Rum #2","parent":178,"position":200,"temporary":false},{"description":"","id":181,"name":"Skyttegrav #3 Classic Competitive","parent":178,"position":0,"temporary":false},{"description":"","id":527,"name":"Rum #1","parent":178,"position":100,"temporary":false},{"description":"","id":7,"name":"Övriga spel","parent":542,"position":60,"temporary":false},{"description":"","id":345,"name":"Bilspel och racingsims (F1 Dirt ETS mm)","parent":7,"position":0,"temporary":false},{"description":"","id":537,"name":"Euro Truck Sim","parent":345,"position":0,"temporary":false},{"description":"","id":485,"name":"Voxel Spel","parent":7,"position":0,"temporary":false},{"description":"","id":486,"name":"7 days to die ","parent":485,"position":0,"temporary":false},{"description":"","id":487,"name":"Space Engineers","parent":485,"position":0,"temporary":false},{"description":"","id":536,"name":"Everquest landmark","parent":485,"position":0,"temporary":false},{"description":"","id":488,"name":"MMO","parent":7,"position":0,"temporary":false},{"description":"","id":394,"name":"Final Fantasy XIV - A Realm Reborn","parent":488,"position":0,"temporary":false},{"description":"","id":418,"name":"Rum #1","parent":394,"position":0,"temporary":false},{"description":"","id":419,"name":"Rum #2","parent":394,"position":0,"temporary":false},{"description":"","id":489,"name":"Mortal Online","parent":488,"position":0,"temporary":false},{"description":"","id":490,"name":"World of Warcraft","parent":488,"position":0,"temporary":false},{"description":"","id":491,"name":"Party 1","parent":490,"position":0,"temporary":false},{"description":"","id":492,"name":"Party 2","parent":490,"position":0,"temporary":false},{"description":"","id":495,"name":"Guild Wars 2","parent":488,"position":0,"temporary":false},{"description":"","id":513,"name":"Planetside 2","parent":488,"position":0,"temporary":false},{"description":"","id":529,"name":"Aion","parent":488,"position":0,"temporary":false},{"description":"First-person shooter & Third-person shooter","id":498,"name":"FPS och TPS","parent":7,"position":0,"temporary":false},{"description":"","id":207,"name":"Borderlands 2","parent":498,"position":0,"temporary":false},{"description":"","id":218,"name":"Portal 2","parent":498,"position":0,"temporary":false},{"description":"","id":232,"name":"Infestation Survivor Stories","parent":498,"position":0,"temporary":false},{"description":"Clanen vi har till Wipe heter \n

SKYTTEGRAV<\/p>\n

\n

Joina denna för att teama up.<\/p>","id":240,"name":"Grupp 1","parent":232,"position":0,"temporary":false},{"description":"","id":241,"name":"Grupp 2","parent":232,"position":1,"temporary":false},{"description":"","id":376,"name":"Skyttegrav KLAN SPEL","parent":232,"position":1,"temporary":false},{"description":"","id":499,"name":"ArmA","parent":498,"position":0,"temporary":false},{"description":"","id":500,"name":"Natural Selection 2","parent":498,"position":0,"temporary":false},{"description":"","id":502,"name":"Left 4 Dead","parent":498,"position":0,"temporary":false},{"description":"","id":514,"name":"Red Orchestra 2","parent":498,"position":0,"temporary":false},{"description":"","id":515,"name":"Allies","parent":514,"position":0,"temporary":false},{"description":"","id":516,"name":"Axis","parent":514,"position":0,"temporary":false},{"description":"","id":518,"name":"Mount and Blade - Warband","parent":498,"position":0,"temporary":false},{"description":"","id":519,"name":"Persistent World","parent":518,"position":0,"temporary":false},{"description":"","id":520,"name":"Mount and blade Vanilla","parent":518,"position":0,"temporary":false},{"description":"","id":541,"name":"Insurgency","parent":498,"position":0,"temporary":false},{"description":"","id":567,"name":"Evolve","parent":498,"position":0,"temporary":false},{"description":"","id":504,"name":"RTS och grand strategy","parent":7,"position":0,"temporary":false},{"description":"","id":356,"name":"Starcraft","parent":504,"position":0,"temporary":false},{"description":"","id":505,"name":"Company of Heroes","parent":504,"position":0,"temporary":false},{"description":"","id":506,"name":"Europa Universalis ","parent":504,"position":0,"temporary":false},{"description":"","id":534,"name":"Rum #1","parent":506,"position":0,"temporary":false},{"description":"","id":535,"name":"Rum #2","parent":506,"position":0,"temporary":false},{"description":"","id":523,"name":"Age of Empires","parent":504,"position":0,"temporary":false},{"description":"här spelar man Civilization<\/span><\/b> V<\/span><\/a>","id":533,"name":"Civilization V","parent":504,"position":0,"temporary":false},{"description":"Spel som är gratis att köra.","id":510,"name":"Free to play","parent":7,"position":0,"temporary":false},{"description":"","id":375,"name":"Mechwarrior Online","parent":510,"position":0,"temporary":false},{"description":"","id":511,"name":"War Thunder","parent":510,"position":0,"temporary":false},{"description":"","id":526,"name":"Tank","parent":511,"position":0,"temporary":false},{"description":"","id":538,"name":"Flyg","parent":511,"position":0,"temporary":false},{"description":"","id":512,"name":"World of Tanks","parent":510,"position":0,"temporary":false},{"description":"","id":530,"name":"Town of salem","parent":510,"position":0,"temporary":false},{"description":"","id":521,"name":"Hack and slash","parent":7,"position":0,"temporary":false},{"description":"","id":167,"name":"Diablo 3","parent":521,"position":0,"temporary":false},{"description":"","id":336,"name":"Path of Exile","parent":521,"position":0,"temporary":false},{"description":"","id":383,"name":"Torchlight II","parent":521,"position":0,"temporary":false},{"description":"","id":522,"name":"MOBA","parent":7,"position":0,"temporary":false},{"description":"","id":6,"name":"League of Legends","parent":522,"position":0,"temporary":false},{"description":"","id":565,"name":"Grupp 1","parent":6,"position":5,"temporary":false},{"description":"","id":566,"name":"Grupp 2","parent":6,"position":10,"temporary":false},{"description":"","id":153,"name":"Dota 2","parent":522,"position":0,"temporary":false},{"description":"","id":236,"name":"Grupp 1","parent":153,"position":0,"temporary":false},{"description":"","id":237,"name":"Grupp 2","parent":153,"position":0,"temporary":false},{"description":"","id":532,"name":"Smite","parent":522,"position":0,"temporary":false},{"description":"","id":528,"name":"Tabletop Simulator","parent":7,"position":0,"temporary":false},{"description":"","id":559,"name":"Kerbal Space Program","parent":7,"position":0,"temporary":false},{"description":"","id":156,"name":"Minecraft","parent":542,"position":50,"temporary":false},{"description":"Serverip: mc.hemligastugan.com Dynmap \/ Regler: http:\/\/www.hemligastugan.com\/minecraft\/# <\/a>","id":157,"name":"Hemligastugan","parent":156,"position":0,"temporary":false},{"description":"Låst till admins för Hemligastugan.","id":388,"name":"Admin","parent":157,"position":2,"temporary":false},{"description":"","id":416,"name":"Grupp 1","parent":157,"position":0,"temporary":false},{"description":"","id":417,"name":"Grupp 2","parent":157,"position":0,"temporary":false},{"description":"Inte bara en samling moddar.. Även med egenutvecklade MODS!<\/b> \n

MC Version 1.7.10 \/ Skyttegrav Modpack 2.0<\/p>\n

Hemsida: http:\/\/mc.skyttegrav.se<\/a><\/p>\n

Info & registrering: http:\/\/www.skyttegrav.se\/index.php?\/topic\/5-skyttegravse-custom-modpack<\/a><\/p>\n

Server IP: mc.skyttegrav.se<\/p>\n

Dynmap: http:\/\/mc.skyttegrav.se\/dynmap<\/a><\/p>","id":158,"name":"Skyttegrav Modpack","parent":156,"position":0,"temporary":false},{"description":"","id":539,"name":"Rum 1","parent":158,"position":0,"temporary":false},{"description":"","id":540,"name":"Rum 2","parent":158,"position":0,"temporary":false},{"description":"","id":170,"name":"Day Z","parent":542,"position":40,"temporary":false},{"description":"","id":176,"name":"Grupp 1","parent":170,"position":10,"temporary":false},{"description":"","id":177,"name":"Grupp 2","parent":170,"position":20,"temporary":false},{"description":"","id":196,"name":"Grupp 3","parent":170,"position":30,"temporary":false},{"description":"","id":197,"name":"Grupp 4","parent":170,"position":40,"temporary":false},{"description":"Här söker ni spelare för ert spel.\n

\n

Skapa en egen kanal i denna med speltitel.<\/p>","id":192,"name":"Söker spelare","parent":542,"position":0,"temporary":false},{"description":"Här kan man sitta och titta på streams, E-evenemang eller liknande. Subkanaler kommer att skapas av admins men du får gärna tipsa om ett evenemang.","id":543,"name":"Event-kanaler","parent":0,"position":11,"temporary":false},{"description":"","id":544,"name":"MS Presskonferens","parent":543,"position":10,"temporary":false},{"description":"","id":546,"name":"Titta och diskutera","parent":544,"position":5,"temporary":false},{"description":"","id":547,"name":"Tysta rummet","parent":544,"position":10,"temporary":false},{"description":"","id":548,"name":"Skyttegrav Free-2-Play Spelkvällar","parent":543,"position":50,"temporary":false},{"description":"","id":553,"name":"Trackmania 29 Okt","parent":548,"position":0,"temporary":false},{"description":"","id":549,"name":"Rum #1","parent":553,"position":0,"temporary":false},{"description":"","id":550,"name":"Rum #2","parent":553,"position":0,"temporary":false},{"description":"","id":558,"name":"DreamHack","parent":543,"position":100,"temporary":false}],"x_connecturl":"mumble:\/\/mumble.skyttegrav.se\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_doclen":224063,"x_gtmurmur_max_users":"250","x_gtmurmur_server_version":"1.2.8"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/2_response.txt b/gameq/tests/Protocols/Providers/Mumble/2_response.txt deleted file mode 100644 index f7629fa..0000000 --- a/gameq/tests/Protocols/Providers/Mumble/2_response.txt +++ /dev/null @@ -1,1718 +0,0 @@ -{ - "id": 1, - "name": "KBMOD.com", - "x_connecturl": "mumble://voice.kbmod.com:64738/?version=1.2.0", - "x_gtmurmur_connectport": "64738", - "x_gtmurmur_max_users": "100", - "x_gtmurmur_server_version": "1.2.4", - "x_gtmurmur_doclen": 246824, - "root": { - "channels": [ - { - "channels": [], - "description": "", - "id": 1, - "name": "AFK", - "parent": 0, - "position": -1, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 1, - "comment": "https://www.youtube.com/watch?v=NC7VO7XgpJk\n


\n

http://members.iracing.com/jforum/posts/list/3210432.page

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 281990, - "mute": false, - "name": "Peeble", - "onlinesecs": 281990, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.4", - "selfDeaf": false, - "selfMute": false, - "session": 21, - "suppress": true, - "tcponly": false, - "userid": 55, - "version": 66052, - "udpPing": 51.87, - "tcpPing": 54.78 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "Someone carry me from the depths of Gold 1. Please. Can and will return sexual favors for it. \n

Battlenet ID xFantoM#1761

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 22792, - "mute": false, - "name": "xFantoM", - "onlinesecs": 615992, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.5", - "selfDeaf": true, - "selfMute": true, - "session": 56, - "suppress": true, - "tcponly": false, - "userid": 33, - "version": 66053, - "udpPing": 125.01, - "tcpPing": 147.22 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "twitter.com/hutchison15\n

twitch.tv/hutchison15

\n

bhutchison.us

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 98511, - "mute": false, - "name": "hutchison15", - "onlinesecs": 98511, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 75, - "suppress": true, - "tcponly": false, - "userid": 161, - "version": 66056, - "udpPing": 64.49, - "tcpPing": 63.47 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "Someone do my Technical Drawings", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 780, - -|| - "mute": false, - "name": "Hunter", - "onlinesecs": 2140, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 112, - "suppress": true, - "tcponly": false, - "userid": 221, - "version": 66056, - "udpPing": 55.26, - "tcpPing": 69.54 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "always down to spawn a conducive environment to engage in civil discussion through adequate mediums such as twitter\n


\n

and 10-mans.

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 2237, - "mute": false, - "name": "Aniion", - "onlinesecs": 2260, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": true, - "selfMute": true, - "session": 124, - "suppress": true, - "tcponly": false, - "userid": 28, - "version": 66056, - "udpPing": 55.65, - "tcpPing": 58.20 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 901, - "mute": false, - "name": "SkyShark", - "onlinesecs": 901, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - " -|| -selfDeaf": true, - "selfMute": true, - "session": 125, - "suppress": true, - "tcponly": false, - "userid": 108, - "version": 66056, - "udpPing": 45.76, - "tcpPing": 50.17 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 28863, - "mute": false, - "name": "AverageJoe", - "onlinesecs": 28868, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": true, - "session": 146, - "suppress": true, - "tcponly": false, - "userid": 96, - "version": 66056, - "udpPing": 143.90, - "tcpPing": 142.09 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "twitter \n

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 5215, - "mute": false, - "name": "EtchyaSketch", - "onlinesecs": 5215, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.5", - "selfDeaf": false, - "selfMute": false, - "session": 163, - "suppress": true, - "tcponly": false, - "userid": 78, - "version": 66053, - "udpPing": 49.78, - "tcpPing": 56.60 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 54352, - "mute": false, - "name": "SanguisAngelus", - "onlinesecs": 73788, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": true, - "selfMute": true, - "session": 172, - "suppress": true, - "tcponly": false, - "userid": 224, - "version": 66056, - "udpPing": 49.22, - "tcpPing": 51.04 - } -, - { - "bytespersec": 0, - "channel": 1, - "comment": "Disgusin", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 12135, - "mute": false, - "name": "arbo96", - "onlinesecs": 12136, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.7", - "selfDeaf": false, - "selfMute": false, - "session": 191, - "suppress": true, - "tcponly": false, - "userid": 62, - "version": 66055, - "udpPing": 54.75, - "tcpPing": 56.15 - } - ] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 21, - "name": "1", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 22, - "name": "2", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 23, - "name": "3", - "parent": 2, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 2, - "name": "General Discussion", - "parent": 0, - "position": -1, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 17, - "name": "1", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 18, - "name": "2", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 45, - "name": "3", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 46, - "name": "4", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 47, - -|| - "name": "5", - "parent": 4, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 4, - "name": "Battlefield 4", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 24, - "name": "1", - "parent": 5, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 25, - "name": "2", - "parent": 5, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 100, - "name": "CoD4", - "parent": 5, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 5, - "name": "Call of Duty", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [ - { - "channels": [], - "description": "", - "id": 7, - "name": "1", - "parent": 72, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 9, - "name": "2", - "parent": 72, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 72, - "name": "Casual", - "parent": 6, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 8, - "name": "2", - "parent": 74, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 77, - "name": "1", - "parent": 74, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 77, - "comment": "Got places to go, got people to see.", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 2180, - "mute": false, - "name": "Draggio", - "onlinesecs": 2180, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 3, - "suppress": false, - "tcponly": false, - "userid": 194, - "version": 66056, - "udpPing": 44.72, - "tcpPing": 46.02 - } - ] - }, - { - "channels": [], - "description": "", - "id": 78, - "name": "3", - "parent": 74, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 78, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 16, - "mute": false, - "name": "SWEDEN", - "onlinesecs": 2155, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 13, - "suppress": false, - "tcponly": false, - "userid": -1, - "version": 66056, - "udpPing": 47.59, - "tcpPing": 46.44 - } -, - { - "bytespersec": 0, - "channel": 78, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 12, - "mute": false, - "name": "Trash", - "onlinesecs": 2008, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 91, - "suppress": false, - "tcponly": false, - "userid": 212, - "version": 66056, - "udpPing": 52.54, - "tcpPing": 54.81 - } -, - { - "bytespersec": 0, - "channel": 78, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 3, - "mute": false, - "name": "APL", - "onlinesecs": 2189, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.7", - "selfDeaf": false, - "selfMute": false, - "session": 114, - "suppress": false, - "tcponly": false, - "userid": 157, - "version": 66055, - "udpPing": 47.83, - "tcpPing": 44.76 - } -, - { - "bytespersec": 0, - "channel": 78, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 4, - "mute": false, - "name": "Spoob", - "onlinesecs": 2123, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 144, - "suppress": false, - "tcponly": false, - "userid": -1, - "version": 66056, - "udpPing": 38.05, - "tcpPing": 40.28 - } - ] - }, - { - "channels": [], - "description": "", - "id": 79, - "name": "4", - "parent": 74, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 81, - "name": "Lobby - Waiting Room", - "parent": 74, - "position": -1, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 83, - "name": "5", - "parent": 74, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 84, - "name": "6", - "parent": 74, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 97, - "name": "7", - "parent": 74, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 97, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 512, - "mute": false, - "name": "Haas", - "onlinesecs": 1569, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 184, - "suppress": false, - "tcponly": false, - "userid": -1, - "version": 66056, - "udpPing": 32.07, - "tcpPing": 36.14 - } - ] - }, - { - "channels": [], - "description": "", - "id": 98, - "name": "8", - "parent": 74, - "position": 0, - -|| - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 74, - "name": "Competitive", - "parent": 6, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 6, - "name": "Counter-Strike", - "parent": 3, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 6, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 3065, - "mute": false, - "name": "roma4356", - "onlinesecs": 41987, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 44, - "suppress": false, - "tcponly": false, - "userid": 171, - "version": 66056, - "udpPing": 54.97, - "tcpPing": 52.64 - } - ] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 15, - "name": "1", - "parent": 11, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 16, - "name": "2", - "parent": 11, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 11, - "name": "League of Legends", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 13, - "name": "1", - "parent": 12, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 14, - "name": "2", - "parent": 12, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 12, - "name": "Dota 2", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 19, - "name": "BFBC2", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 26, - "name": "StarCraft", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 27, - "name": "Hearthstone", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 99, - "name": "Raid", - "parent": 28, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 28, - "name": "World of Warcraft", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 29, - "name": "Minecraft", - "parent": 3, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 29, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 63749, - "mute": false, - "name": "Daaz", - "onlinesecs": 69905, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": true, - "selfMute": true, - "session": 27, - "suppress": false, - "tcponly": false, - "userid": 140, - "version": 66056, - "udpPing": 8.07, - "tcpPing": 8.94 - } - ] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 38, - "name": "1", - "parent": 30, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 39, - "name": "2", - "parent": 30, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 30, - "name": "Smite", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 31, - "name": "Tribes Ascend", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 32, - "name": "ARMA", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 33, - "name": "ARMA - DayZ", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 36, - "name": "1", - "parent": 35, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 37, - "name": "2", - "parent": 35, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 35, - "name": "Team Fortress 2", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 63, - "name": "1", - "parent": 48, - "position": -|| - 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 63, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 1809, - "mute": false, - "name": "dutchy", - "onlinesecs": 138776, - "os": "WinX64", - "osversion": "Windows 7 Professional Service Pack 1 x64 - 6.1.7601", - "release": "1.3.0~540~gedd5509~snapshot", - "selfDeaf": false, - "selfMute": false, - "session": 86, - "suppress": false, - "tcponly": false, - "userid": -1, - "version": 66304, - "udpPing": 61.24, - "tcpPing": 63.72 - } - ] - }, - { - "channels": [], - "description": "", - "id": 64, - "name": "2", - "parent": 48, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 65, - "name": "3", - "parent": 48, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 65, - "comment": "http://www.gfycat.com/DecimalSneakyChameleon", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 4, - "mute": false, - "name": "Lavenous_Dakota", - "onlinesecs": 22300, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.7", - "selfDeaf": false, - "selfMute": false, - "session": 95, - "suppress": false, - "tcponly": false, - "userid": 3, - "version": 66055, - "udpPing": 36.46, - "tcpPing": -|| - 41.61 - } -, - { - "bytespersec": 0, - "channel": 65, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 15, - "mute": false, - "name": "RedishBlue", - "onlinesecs": 15669, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.5", - "selfDeaf": false, - "selfMute": false, - "session": 154, - "suppress": false, - "tcponly": false, - "userid": 163, - "version": 66053, - "udpPing": 42.16, - "tcpPing": 51.83 - } - ] - } - ], - "description": "", - "id": 48, - "name": "Diablo III", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 49, - "name": "Miscellaneous", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 55, - "name": "Just Cause 2 MP", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 56, - "name": "Dawngate", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 58, - "name": "Quake Live", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 61, - "name": "Loadout", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 62, - "name": "Titanfall", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 67, - "name": "WildStar", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 68, - "name": "Star Citizen", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 70, - "name": "Supraball", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 86, - "name": "1", - "parent": 85, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 87, - "name": "2", - "parent": 85, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 88, - "name": "3", - "parent": 85, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 89, - "name": "4", - "parent": 85, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 85, - "name": "Project M", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 91, - "name": "Commentators", - "parent": 90, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 90, - "name": "USF4", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 92, - "name": "ArcheAge", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 93, - "name": "Heroes of the Storm", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 94, - "name": "Reflex", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 104, - "name": "1", - "parent": 101, - "position": 0, - "temporary": false, - "users": [ - { - "bytespersec": 0, - "channel": 104, - "comment": "Want free bitcoin?\n

http://btc-flow.com/r/8b06357d87

", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 1261, - "mute": false, - "name": "Mojang", - "onlinesecs": 29344, - "os": "Win", - "osversion": "6.1.7601.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 8, - "suppress": false, - "tcponly": false, - "userid": 178, - "version": 66056, - "udpPing": 62.55, - "tcpPing": 57.80 - } -, - { - "bytespersec": 0, - "channel": 104, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 518, - "mute": false, - "name": "YoStatty", - "onlinesecs": 15876, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 20, - "suppress": false, - "tcponly": false, - "userid": -1, - "version": 66056, - "udpPing": 58.66, - "tcpPing": 65.34 - } -, - { - "bytespersec": 0, - "channel": 104, - "comment": "", - -|| - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 3854, - "mute": false, - "name": "Zomagoras", - "onlinesecs": 13200, - "os": "Win", - "osversion": "6.2.9200.1", - "release": "1.2.8", - "selfDeaf": true, - "selfMute": true, - "session": 36, - "suppress": false, - "tcponly": false, - "userid": 222, - "version": 66056, - "udpPing": 47.30, - "tcpPing": 47.91 - } - ] - }, - { - "channels": [], - "description": "", - "id": 105, - "name": "2", - "parent": 101, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 106, - "name": "3", - "parent": 101, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 101, - "name": "H1Z1", - "parent": 3, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 108, - "name": "DragonballZ", - "parent": 3, - "position": 0, - "temporary": true, - "users": [ - { - "bytespersec": 0, - "channel": 108, - "comment": "", - "context": "", - "deaf": false, - "identity": "", - "idlesecs": 24, - "mute": false, - "name": "Market", - "onlinesecs": 16613, - "os": "Win", - "osversion": "6.1.7600.1", - "release": "1.2.8", - "selfDeaf": false, - "selfMute": false, - "session": 81, - "suppress": false, - "tcponly": false, - "userid": 218, - "version": 66056, - "udpPing": 62.88, - "tcpPing": 67.09 - } - ] - } - ], - "description": "", - "id": 3, - "name": "Games", - "parent": 0, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 20, - "name": "Fleshlight Headquarters", - "parent": 0, - "position": -1, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 41, - "name": "Admins Only", - "parent": 40, - "position": 1, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 42, - "name": "1", - "parent": 40, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 43, - "name": "2", - "parent": 40, - "position": 0, - " -|| -temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 44, - "name": "3", - "parent": 40, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 103, - "name": "Jimmy", - "parent": 57, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 57, - "name": "Livestreaming", - "parent": 40, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 69, - "name": "Dannisters Subs", - "parent": 40, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 107, - "name": "LAN", - "parent": 40, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 40, - "name": "Bropile", - "parent": 0, - "position": 1, - "temporary": false, - "users": [] - }, - { - "channels": [ - { - "channels": [], - "description": "", - "id": 52, - "name": "1", - "parent": 51, - "position": 0, - "temporary": false, - "users": [] - }, - -|| -{ - "channels": [], - "description": "", - "id": 53, - "name": "2", - "parent": 51, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 54, - "name": "3", - "parent": 51, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "", - "id": 51, - "name": "Livestreaming", - "parent": 0, - "position": -1, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 96, - "name": "Waiting Room", - "parent": 0, - "position": 0, - "temporary": false, - "users": [] - }, - { - "channels": [], - "description": "", - "id": 102, - "name": "Community Night", - "parent": 0, - "position": 0, - "temporary": false, - "users": [] - } - ], - "description": "
\n

Welcome to the KBMOD.com Mumble server!

\n


\n

Live server status available @ kbmod.com/servers

\n


\n

Check us out on your social media platforms of choice!

\n


\n

Twitter: @KBMODGaming

\n

Facebook: facebook.com/KBMOD

\n

Twitch: twitch.tv/KBMOD

\n

Steam group: Keyboard + Mouse or Die!

", - "id": 0, - "name": "Root", - "parent": -1, - "position": 0, - "temporary": false, - "users": [] - } -} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Mumble/2_result.json b/gameq/tests/Protocols/Providers/Mumble/2_result.json deleted file mode 100644 index b022f30..0000000 --- a/gameq/tests/Protocols/Providers/Mumble/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"198.58.117.238:64738":{"dedicated":1,"gq_address":"198.58.117.238","gq_joinlink":"mumble:\/\/198.58.117.238:64738\/","gq_name":"Mumble Server","gq_online":true,"gq_port_client":64738,"gq_port_query":27800,"gq_protocol":"mumble","gq_transport":"tcp","gq_type":"mumble","id":1,"name":"KBMOD.com","numplayers":25,"players":[{"bytespersec":0,"channel":1,"comment":"https:\/\/www.youtube.com\/watch?v=NC7VO7XgpJk<\/a>\n

<\/p>\n

http:\/\/members.iracing.com\/jforum\/posts\/list\/3210432.page<\/a><\/p>","context":"","deaf":false,"identity":"","idlesecs":281990,"mute":false,"name":"Peeble","onlinesecs":281990,"os":"Win","osversion":"6.2.9200.1","release":"1.2.4","selfDeaf":false,"selfMute":false,"session":21,"suppress":true,"tcponly":false,"userid":55,"version":66052,"udpPing":51.87,"tcpPing":54.78},{"bytespersec":0,"channel":1,"comment":"Someone carry me from the depths of Gold 1. Please. Can and will return sexual favors for it.<\/b> \n

Battlenet ID xFantoM#1761<\/p>","context":"","deaf":false,"identity":"","idlesecs":22792,"mute":false,"name":"xFantoM","onlinesecs":615992,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":true,"selfMute":true,"session":56,"suppress":true,"tcponly":false,"userid":33,"version":66053,"udpPing":125.01,"tcpPing":147.22},{"bytespersec":0,"channel":1,"comment":"twitter.com\/hutchison15\n

twitch.tv\/hutchison15<\/p>\n

bhutchison.us<\/p>","context":"","deaf":false,"identity":"","idlesecs":98511,"mute":false,"name":"hutchison15","onlinesecs":98511,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":75,"suppress":true,"tcponly":false,"userid":161,"version":66056,"udpPing":64.49,"tcpPing":63.47},{"bytespersec":0,"channel":1,"comment":"Someone do my Technical Drawings","context":"","deaf":false,"identity":"","idlesecs":780,"mute":false,"name":"Hunter","onlinesecs":2140,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":112,"suppress":true,"tcponly":false,"userid":221,"version":66056,"udpPing":55.26,"tcpPing":69.54},{"bytespersec":0,"channel":1,"comment":"always down to spawn a conducive environment to engage in civil discussion through adequate mediums such as twitter\n

<\/p>\n

and 10-mans.<\/p>","context":"","deaf":false,"identity":"","idlesecs":2237,"mute":false,"name":"Aniion","onlinesecs":2260,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":124,"suppress":true,"tcponly":false,"userid":28,"version":66056,"udpPing":55.65,"tcpPing":58.2},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":901,"mute":false,"name":"SkyShark","onlinesecs":901,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":125,"suppress":true,"tcponly":false,"userid":108,"version":66056,"udpPing":45.76,"tcpPing":50.17},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":28863,"mute":false,"name":"AverageJoe","onlinesecs":28868,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":true,"session":146,"suppress":true,"tcponly":false,"userid":96,"version":66056,"udpPing":143.9,"tcpPing":142.09},{"bytespersec":0,"channel":1,"comment":"twitter <\/a>\n

<\/p>","context":"","deaf":false,"identity":"","idlesecs":5215,"mute":false,"name":"EtchyaSketch","onlinesecs":5215,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":163,"suppress":true,"tcponly":false,"userid":78,"version":66053,"udpPing":49.78,"tcpPing":56.6},{"bytespersec":0,"channel":1,"comment":"","context":"","deaf":false,"identity":"","idlesecs":54352,"mute":false,"name":"SanguisAngelus","onlinesecs":73788,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":172,"suppress":true,"tcponly":false,"userid":224,"version":66056,"udpPing":49.22,"tcpPing":51.04},{"bytespersec":0,"channel":1,"comment":"Disgusin","context":"","deaf":false,"identity":"","idlesecs":12135,"mute":false,"name":"arbo96","onlinesecs":12136,"os":"Win","osversion":"6.1.7601.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":191,"suppress":true,"tcponly":false,"userid":62,"version":66055,"udpPing":54.75,"tcpPing":56.15},{"bytespersec":0,"channel":6,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3065,"mute":false,"name":"roma4356","onlinesecs":41987,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":44,"suppress":false,"tcponly":false,"userid":171,"version":66056,"udpPing":54.97,"tcpPing":52.64},{"bytespersec":0,"channel":77,"comment":"Got places to go, got people to see.","context":"","deaf":false,"identity":"","idlesecs":2180,"mute":false,"name":"Draggio","onlinesecs":2180,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":3,"suppress":false,"tcponly":false,"userid":194,"version":66056,"udpPing":44.72,"tcpPing":46.02},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":16,"mute":false,"name":"SWEDEN","onlinesecs":2155,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":13,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":47.59,"tcpPing":46.44},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":12,"mute":false,"name":"Trash","onlinesecs":2008,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":91,"suppress":false,"tcponly":false,"userid":212,"version":66056,"udpPing":52.54,"tcpPing":54.81},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3,"mute":false,"name":"APL","onlinesecs":2189,"os":"Win","osversion":"6.1.7601.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":114,"suppress":false,"tcponly":false,"userid":157,"version":66055,"udpPing":47.83,"tcpPing":44.76},{"bytespersec":0,"channel":78,"comment":"","context":"","deaf":false,"identity":"","idlesecs":4,"mute":false,"name":"Spoob","onlinesecs":2123,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":144,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":38.05,"tcpPing":40.28},{"bytespersec":0,"channel":97,"comment":"","context":"","deaf":false,"identity":"","idlesecs":512,"mute":false,"name":"Haas","onlinesecs":1569,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":184,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":32.07,"tcpPing":36.14},{"bytespersec":0,"channel":29,"comment":"","context":"","deaf":false,"identity":"","idlesecs":63749,"mute":false,"name":"Daaz","onlinesecs":69905,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":27,"suppress":false,"tcponly":false,"userid":140,"version":66056,"udpPing":8.07,"tcpPing":8.94},{"bytespersec":0,"channel":63,"comment":"","context":"","deaf":false,"identity":"","idlesecs":1809,"mute":false,"name":"dutchy","onlinesecs":138776,"os":"WinX64","osversion":"Windows 7 Professional Service Pack 1 x64 - 6.1.7601","release":"1.3.0~540~gedd5509~snapshot","selfDeaf":false,"selfMute":false,"session":86,"suppress":false,"tcponly":false,"userid":-1,"version":66304,"udpPing":61.24,"tcpPing":63.72},{"bytespersec":0,"channel":65,"comment":"http:\/\/www.gfycat.com\/DecimalSneakyChameleon<\/a>","context":"","deaf":false,"identity":"","idlesecs":4,"mute":false,"name":"Lavenous_Dakota","onlinesecs":22300,"os":"Win","osversion":"6.1.7601.1","release":"1.2.7","selfDeaf":false,"selfMute":false,"session":95,"suppress":false,"tcponly":false,"userid":3,"version":66055,"udpPing":36.46,"tcpPing":41.61},{"bytespersec":0,"channel":65,"comment":"","context":"","deaf":false,"identity":"","idlesecs":15,"mute":false,"name":"RedishBlue","onlinesecs":15669,"os":"Win","osversion":"6.1.7601.1","release":"1.2.5","selfDeaf":false,"selfMute":false,"session":154,"suppress":false,"tcponly":false,"userid":163,"version":66053,"udpPing":42.16,"tcpPing":51.83},{"bytespersec":0,"channel":104,"comment":"Want free bitcoin?<\/span><\/a>\n

http:\/\/btc-flow.com\/r\/8b06357d87<\/span><\/a><\/p>","context":"","deaf":false,"identity":"","idlesecs":1261,"mute":false,"name":"Mojang","onlinesecs":29344,"os":"Win","osversion":"6.1.7601.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":8,"suppress":false,"tcponly":false,"userid":178,"version":66056,"udpPing":62.55,"tcpPing":57.8},{"bytespersec":0,"channel":104,"comment":"","context":"","deaf":false,"identity":"","idlesecs":518,"mute":false,"name":"YoStatty","onlinesecs":15876,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":20,"suppress":false,"tcponly":false,"userid":-1,"version":66056,"udpPing":58.66,"tcpPing":65.34},{"bytespersec":0,"channel":104,"comment":"","context":"","deaf":false,"identity":"","idlesecs":3854,"mute":false,"name":"Zomagoras","onlinesecs":13200,"os":"Win","osversion":"6.2.9200.1","release":"1.2.8","selfDeaf":true,"selfMute":true,"session":36,"suppress":false,"tcponly":false,"userid":222,"version":66056,"udpPing":47.3,"tcpPing":47.91},{"bytespersec":0,"channel":108,"comment":"","context":"","deaf":false,"identity":"","idlesecs":24,"mute":false,"name":"Market","onlinesecs":16613,"os":"Win","osversion":"6.1.7600.1","release":"1.2.8","selfDeaf":false,"selfMute":false,"session":81,"suppress":false,"tcponly":false,"userid":218,"version":66056,"udpPing":62.88,"tcpPing":67.09}],"teams":[{"description":" \n

Welcome to the KBMOD.com<\/a> Mumble server!<\/p>\n

<\/p>\n

Live server status available @ kbmod.com\/servers<\/a><\/p>\n

<\/p>\n

Check us out on your social media platforms of choice!<\/p>\n

<\/p>\n

Twitter:<\/span> @KBMODGaming<\/a><\/p>\n

Facebook:<\/span> facebook.com\/KBMOD<\/a><\/p>\n

Twitch:<\/span> twitch.tv\/KBMOD<\/a><\/p>\n

Steam group:<\/span> Keyboard + Mouse or Die!<\/a><\/p>","id":0,"name":"Root","parent":-1,"position":0,"temporary":false},{"description":"","id":1,"name":"AFK","parent":0,"position":-1,"temporary":false},{"description":"","id":2,"name":"General Discussion","parent":0,"position":-1,"temporary":false},{"description":"","id":21,"name":"1","parent":2,"position":0,"temporary":false},{"description":"","id":22,"name":"2","parent":2,"position":0,"temporary":false},{"description":"","id":23,"name":"3","parent":2,"position":0,"temporary":false},{"description":"","id":3,"name":"Games","parent":0,"position":0,"temporary":false},{"description":"","id":4,"name":"Battlefield 4","parent":3,"position":0,"temporary":false},{"description":"","id":17,"name":"1","parent":4,"position":0,"temporary":false},{"description":"","id":18,"name":"2","parent":4,"position":0,"temporary":false},{"description":"","id":45,"name":"3","parent":4,"position":0,"temporary":false},{"description":"","id":46,"name":"4","parent":4,"position":0,"temporary":false},{"description":"","id":47,"name":"5","parent":4,"position":0,"temporary":false},{"description":"","id":5,"name":"Call of Duty","parent":3,"position":0,"temporary":false},{"description":"","id":24,"name":"1","parent":5,"position":0,"temporary":false},{"description":"","id":25,"name":"2","parent":5,"position":0,"temporary":false},{"description":"","id":100,"name":"CoD4","parent":5,"position":0,"temporary":false},{"description":"","id":6,"name":"Counter-Strike","parent":3,"position":0,"temporary":false},{"description":"","id":72,"name":"Casual","parent":6,"position":0,"temporary":false},{"description":"","id":7,"name":"1","parent":72,"position":0,"temporary":false},{"description":"","id":9,"name":"2","parent":72,"position":0,"temporary":false},{"description":"","id":74,"name":"Competitive","parent":6,"position":0,"temporary":false},{"description":"","id":8,"name":"2","parent":74,"position":0,"temporary":false},{"description":"","id":77,"name":"1","parent":74,"position":0,"temporary":false},{"description":"","id":78,"name":"3","parent":74,"position":0,"temporary":false},{"description":"","id":79,"name":"4","parent":74,"position":0,"temporary":false},{"description":"","id":81,"name":"Lobby - Waiting Room","parent":74,"position":-1,"temporary":false},{"description":"","id":83,"name":"5","parent":74,"position":0,"temporary":false},{"description":"","id":84,"name":"6","parent":74,"position":0,"temporary":false},{"description":"","id":97,"name":"7","parent":74,"position":0,"temporary":false},{"description":"","id":98,"name":"8","parent":74,"position":0,"temporary":false},{"description":"","id":11,"name":"League of Legends","parent":3,"position":0,"temporary":false},{"description":"","id":15,"name":"1","parent":11,"position":0,"temporary":false},{"description":"","id":16,"name":"2","parent":11,"position":0,"temporary":false},{"description":"","id":12,"name":"Dota 2","parent":3,"position":0,"temporary":false},{"description":"","id":13,"name":"1","parent":12,"position":0,"temporary":false},{"description":"","id":14,"name":"2","parent":12,"position":0,"temporary":false},{"description":"","id":19,"name":"BFBC2","parent":3,"position":0,"temporary":false},{"description":"","id":26,"name":"StarCraft","parent":3,"position":0,"temporary":false},{"description":"","id":27,"name":"Hearthstone","parent":3,"position":0,"temporary":false},{"description":"","id":28,"name":"World of Warcraft","parent":3,"position":0,"temporary":false},{"description":"","id":99,"name":"Raid","parent":28,"position":0,"temporary":false},{"description":"","id":29,"name":"Minecraft","parent":3,"position":0,"temporary":false},{"description":"","id":30,"name":"Smite","parent":3,"position":0,"temporary":false},{"description":"","id":38,"name":"1","parent":30,"position":0,"temporary":false},{"description":"","id":39,"name":"2","parent":30,"position":0,"temporary":false},{"description":"","id":31,"name":"Tribes Ascend","parent":3,"position":0,"temporary":false},{"description":"","id":32,"name":"ARMA","parent":3,"position":0,"temporary":false},{"description":"","id":33,"name":"ARMA - DayZ","parent":3,"position":0,"temporary":false},{"description":"","id":35,"name":"Team Fortress 2","parent":3,"position":0,"temporary":false},{"description":"","id":36,"name":"1","parent":35,"position":0,"temporary":false},{"description":"","id":37,"name":"2","parent":35,"position":0,"temporary":false},{"description":"","id":48,"name":"Diablo III","parent":3,"position":0,"temporary":false},{"description":"","id":63,"name":"1","parent":48,"position":0,"temporary":false},{"description":"","id":64,"name":"2","parent":48,"position":0,"temporary":false},{"description":"","id":65,"name":"3","parent":48,"position":0,"temporary":false},{"description":"","id":49,"name":"Miscellaneous","parent":3,"position":0,"temporary":false},{"description":"","id":55,"name":"Just Cause 2 MP","parent":3,"position":0,"temporary":false},{"description":"","id":56,"name":"Dawngate","parent":3,"position":0,"temporary":false},{"description":"","id":58,"name":"Quake Live","parent":3,"position":0,"temporary":false},{"description":"","id":61,"name":"Loadout","parent":3,"position":0,"temporary":false},{"description":"","id":62,"name":"Titanfall","parent":3,"position":0,"temporary":false},{"description":"","id":67,"name":"WildStar","parent":3,"position":0,"temporary":false},{"description":"","id":68,"name":"Star Citizen","parent":3,"position":0,"temporary":false},{"description":"","id":70,"name":"Supraball","parent":3,"position":0,"temporary":false},{"description":"","id":85,"name":"Project M","parent":3,"position":0,"temporary":false},{"description":"","id":86,"name":"1","parent":85,"position":0,"temporary":false},{"description":"","id":87,"name":"2","parent":85,"position":0,"temporary":false},{"description":"","id":88,"name":"3","parent":85,"position":0,"temporary":false},{"description":"","id":89,"name":"4","parent":85,"position":0,"temporary":false},{"description":"","id":90,"name":"USF4","parent":3,"position":0,"temporary":false},{"description":"","id":91,"name":"Commentators","parent":90,"position":0,"temporary":false},{"description":"","id":92,"name":"ArcheAge","parent":3,"position":0,"temporary":false},{"description":"","id":93,"name":"Heroes of the Storm","parent":3,"position":0,"temporary":false},{"description":"","id":94,"name":"Reflex","parent":3,"position":0,"temporary":false},{"description":"","id":101,"name":"H1Z1","parent":3,"position":0,"temporary":false},{"description":"","id":104,"name":"1","parent":101,"position":0,"temporary":false},{"description":"","id":105,"name":"2","parent":101,"position":0,"temporary":false},{"description":"","id":106,"name":"3","parent":101,"position":0,"temporary":false},{"description":"","id":108,"name":"DragonballZ","parent":3,"position":0,"temporary":true},{"description":"","id":20,"name":"Fleshlight Headquarters","parent":0,"position":-1,"temporary":false},{"description":"","id":40,"name":"Bropile","parent":0,"position":1,"temporary":false},{"description":"","id":41,"name":"Admins Only","parent":40,"position":1,"temporary":false},{"description":"","id":42,"name":"1","parent":40,"position":0,"temporary":false},{"description":"","id":43,"name":"2","parent":40,"position":0,"temporary":false},{"description":"","id":44,"name":"3","parent":40,"position":0,"temporary":false},{"description":"","id":57,"name":"Livestreaming","parent":40,"position":0,"temporary":false},{"description":"","id":103,"name":"Jimmy","parent":57,"position":0,"temporary":false},{"description":"","id":69,"name":"Dannisters Subs","parent":40,"position":0,"temporary":false},{"description":"","id":107,"name":"LAN","parent":40,"position":0,"temporary":false},{"description":"","id":51,"name":"Livestreaming","parent":0,"position":-1,"temporary":false},{"description":"","id":52,"name":"1","parent":51,"position":0,"temporary":false},{"description":"","id":53,"name":"2","parent":51,"position":0,"temporary":false},{"description":"","id":54,"name":"3","parent":51,"position":0,"temporary":false},{"description":"","id":96,"name":"Waiting Room","parent":0,"position":0,"temporary":false},{"description":"","id":102,"name":"Community Night","parent":0,"position":0,"temporary":false}],"x_connecturl":"mumble:\/\/voice.kbmod.com:64738\/?version=1.2.0","x_gtmurmur_connectport":"64738","x_gtmurmur_doclen":246824,"x_gtmurmur_max_users":"100","x_gtmurmur_server_version":"1.2.4"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ns2/1_response.txt b/gameq/tests/Protocols/Providers/Ns2/1_response.txt deleted file mode 100644 index c806f89a4eebd624012a72ac3d436f4a2974a4ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmZvaO=#3W6vyACcRHQU_%1^Fz0zp^ zK}9BH9M(BW$zdUgM_UTF(^7K?l~oOsHcV0-M^un97u?r@42kt$R_M!SK`cVX95A{s ztXvH;!#7{6-NP9xZ>Lx<^-|L=rq)nuT4}MEMp8Bdo|bvEz@tjwHzTU~pphP}mUFh9 zmd1`bRika@QvEMhwTe*agSDqOO?z>cj+2ElZEHN&xK_kV$Oxm!AqPIA>f-J1E}W%U zm{Y&OBlv(Y`|_&`iwV_wkq1Zxyg<6+&s!G)$%2r>QU+jQ>4pnaoK0bC_|dJk%v>0W znMlgIyTVVykpJR#%cNUSvRxF#oMOb);@)}7y5aRHCg zA`BP!jR{|R9T&=eqa~<@RRod_x{ydlo3bIGj#=r?ZP=XpGOWaH&LnI`*{ug#T@XBK zh9pp=K_do_P0(QfdY7F#o;r%Ykw;7A%2#sM=Kg z=)kCq&<@9`Y6M{&|0+C2WzYUM4xF!4E>w6#fg#y<>b?VGQWHnk6`6{0_NRy+Uc2Og zh(o_olkJ*_xq{P(jnR1r4MlLm1aF~R;Mt1AW^t%_G=QG~6W8yQV8-#BSu!a#cK2ex z0UI##eELcWl;#UOtkHU%Yh5&<2LqpWs?xd*+zr4(UG>q<8uE4?&Pk?b48xd(ypdy; rZ4uKjY0VnSk%DQ>8HP?mQ1Bp?B6=CnLtCNjZqxj@Xxr>2hV&QN_8@JE)6Gk=&16PqXVU~m z5HB9Rh=StPDxRb#k%9+7Fa8OF2M?Zl7DVD}wKv}|FyHshdyjAC4Tr;FOOspjH{>$aZCoX~5gAsSe zIbQJgVSMiKLA!Txe#FaVEETlN*3IUv=h<1CpS87m=vl2)Cq`Smwc*#DzMHjc_0V-Q zS(~(Di8e&tL%kkH9nB4T1#A8t>s|r!<8TsV){c>_p+5m-rCZ2~ER2*faD!z2XsrYy zZX)lYY@vqhM4q=l0$5#%j7caK(?%82M6%xxWRfqfTgrg&ou{SB0g@500v4Z*dg?q?FLY8 ztHhKzC01i0IBXwZJGvRbMw+%LpihMUeJy}0N)~e2K+U9LiArSy&XV|i@k#(9ZSY9P z2}okL8b>}X@yMtI*?JpUMH(eg|F!x4@>d^9JQk_Ogr_=9ph8KnUVieS!L@+{LJRYU zJ}je-Qaxa+5}`xn=fihCEJ(>=jnMsFLPd^-3XBqdI<@aZm8OY>l6MfMiJQFh#0M@J z_F}Hh_zfYQ_>@@K%yInY&&WYck+ZJ29jnr<%7 dc5-f}&@8Z=lWlkzkL6vj={OlU9Sfkb_yaKwM}P?(e8;TvvpIby{5%%E*{*GKk`P-Qq1P} zr{YOmd=Mw1tQxKMpKY}pC3a6+aCZ`G)ik-@7@eoGqdw@0+)*&{+`v1D9XWDnugZ@1 zU8eS?HV2h;oXw%sv@Q3mV zRCNvaQgWy7s#BAwMyI&ubES$M4o-J~ zLng_zYKF6|DK|y?coO>kecRYdCxd9ZGU+2_O;f&k{km7aO7m|B57v}N-H=_YTouW) zxlLtsk>-busn}a~r`dI}POX@=g{iZSSU0L_QjOTjLxjv%m+CW|MU&J#Z=^W|PqJcJK_xq=lPkLROM!)&53_qRR-@Oq{JwoCYQvP&urbVUeQYX!(&4t|v zmFHqe%U=ao2DENqEYec51bo6vG*D4jZtwh!4x)!$R4xf9=xJPXDudPaJ zvDO>FDdZc3@Y4C*ZtbeAo}v7<9ABHg+Uojstt*t@@Yq(W%uI3uY|3ht*c^(}QHfGv zw1C1Ma5jhkt-1Fhf#^_BfVHEcDt5Z5RAX#cqFtuYAGtBh7sW}^hr8~u zwoN^hL)jwdy>@g=ZN8uaWM87&oC~Eba+~aq?3=PireB&tGU~k=R3KN3Mq1}zEhN^K zFxdOpnI9+#I;5eOl+f_bp`;rfTA*jKB)NeWr8+7?JyF4F>v$kn;wKsW^Ng&%4_!U0vf1^MyoGne|#JD4)ImxD>nGlqKRv=Yjv9 zXJ-4;zc77vrl>KA_k*@OqpL5N-K(prT`PoqnzsoLBU*UrDO|j)Y|&tn>*~)}y7~(( zuFsYt(|KN4yGEk*bju;mZZ1IA`PvpQGCDgutq*CT4~W84=+l7@b=8WL^g*D@S@ zo+w6f@pgK-n%yklsp+G!aFYG zW76+0CYK~Ws=NU(lL_hq^R2XWcl{*pr}tBHZw!fC0T;9{ z6pmdAU7v!`qacVV@bUB{1@JvUK?D+au0w$nkso74A^CyCa>@7c^ld@BG4gzmCi>>>GM@WBtT!Gy;VkaXcB z2mv@cJeUZ8fSnrw7lg~V0FO6;M=;Fsx#ThgKD?&Lp$IUHX$&FunVDE2aKaIhM8vp2 z9Yg@a7_sm^a*-gm;W?cY#1SfFyZ>+t9swYDPyA{@JU|0K7$2Vf`AF&M$J^iL{g$WK z^Ocj&Uupg6D8XEm;u9&W;R#a_T*r^R;GH46GXU?X$jR_zE>y}hKQf8EOHoJRTO_EX zF&7Yh=Ing|@*R!&*e1(+oZ*z+;O`&l0(0!VQ2xg3{r9Vm^;OT{#6a0`+{p0*=)=zO zeGk4s+>c@;06QlP<8iMtLg^wtmWc7|_@wXmw{GM|TzQa<0?+UDjmHuhW?J9{sB_+h z(nSSeCtWWHx?5-rqh6mA#wZlr!j*_Ck9TA436}N85vq!5j_0C}nHEY9o!8yE5_QTu zZydOT<{*rE4?-z@bPDWBpZgv=*ONRASR#leK69{h0$28ENH+|7|D=y*?EMR)xYq(; zB)XR+To~+b(WX8MmT8_BU~cd(j05BXJ2&*X_jxDB5}m@geBEn7oamB{2GPzdxH|4* zV_$okhq=?E>%<78)8d5yw~x&Y9G(lT8AI)eP%!Sj55nhLIb_fYodHQF1b)3f-x;G1 zJ5SvZUD)Z9gIzCxFGoxRv~PbKyS)t{fGNnb$X}l=F9KE(M)D3HE~r%WGIt3I41e(B z*5R^`yYh!HcSzqw$Tmjs&=gGM2I0Rf#eV^4x9L@~rnuwA6zcAomv>OqDedhsl}_KD e*#_?L;s5y~`dv5E@HxsK%pdNKFE0=}N9jNQxuewp diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/1_result.json b/gameq/tests/Protocols/Providers/Projectrealitybf2/1_result.json deleted file mode 100644 index 9a0d05f..0000000 --- a/gameq/tests/Protocols/Providers/Projectrealitybf2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"188.40.118.13:16568":{"bf2_anticheat":"0","bf2_autobalanced":"0","bf2_autorec":"1","bf2_bots":"0","bf2_communitylogo_url":"http:\/\/prteamwork.com","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/","bf2_d_idx":"http:\/\/","bf2_dedicated":"1","bf2_fps":"30.000000","bf2_friendlyfire":"1","bf2_globalunlocks":"0","bf2_mapsize":"128","bf2_novehicles":"0","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"0","bf2_ranked":"0","bf2_reservedslots":"0","bf2_scorelimit":"1000","bf2_spawntime":"300.000000","bf2_sponsorlogo_url":"http:\/\/prteamwork.com\/images\/server\/servergraphic-bf2pr_colored.png","bf2_sponsortext":"Welcome to PRTA!|-Website: prteamwork.com|-TS: ts.prta.co|-Be respectful of all players, work together & fight hard.|-Read our rules on our website.|-No squads before 2:00.","bf2_startdelay":"300","bf2_team1":"MEC","bf2_team2":"US","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"0","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_cq","gamevariant":"pr","gamever":"1.5.3153-802.0","gq_address":"188.40.118.13","gq_joinlink":"bf2:\/\/188.40.118.13:16568","gq_name":"Project Reality: Battlefield 2","gq_online":true,"gq_port_client":16568,"gq_port_query":29901,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"projectrealitybf2","hostname":"[PR v1.4.3.0] PRTA | EU - prteamwork.com","hostport":"16568","mapname":"Khamisiyah","maxplayers":"100","numplayers":"100","password":"0","players":[{"player":"[GDW] Menuen","score":"974","ping":"45","team":"2","deaths":"1","pid":"100002122","skill":"32","AIBot":"0"},{"player":"[PR]EMC|KruZar","score":"829","ping":"180","team":"2","deaths":"1","pid":"100362089","skill":"1","AIBot":"0"},{"player":"[SNGE] Thazer","score":"806","ping":"34","team":"2","deaths":"3","pid":"100170450","skill":"0","AIBot":"0"},{"player":"[+H+] mr_macwindsorPR","score":"745","ping":"39","team":"1","deaths":"2","pid":"100104437","skill":"16","AIBot":"0"},{"player":"DuriosDavros","score":"691","ping":"49","team":"1","deaths":"2","pid":"100347816","skill":"0","AIBot":"0"},{"player":"[TZ] AceInvader","score":"614","ping":"156","team":"2","deaths":"1","pid":"100066892","skill":"1","AIBot":"0"},{"player":"Alexian95","score":"563","ping":"36","team":"2","deaths":"3","pid":"100373063","skill":"1","AIBot":"0"},{"player":"[6-1] Captain_Vlad","score":"557","ping":"133","team":"1","deaths":"1","pid":"100178787","skill":"2","AIBot":"0"},{"player":"=HOGp= Neshville","score":"543","ping":"35","team":"2","deaths":"0","pid":"100324492","skill":"2","AIBot":"0"},{"player":"EDM","score":"532","ping":"41","team":"2","deaths":"2","pid":"100174752","skill":"3","AIBot":"0"},{"player":"Nancy","score":"526","ping":"211","team":"2","deaths":"3","pid":"100375340","skill":"2","AIBot":"0"},{"player":"Uscha DietrichKlaus","score":"525","ping":"36","team":"2","deaths":"2","pid":"100199239","skill":"8","AIBot":"0"},{"player":"major98","score":"524","ping":"154","team":"1","deaths":"5","pid":"100353583","skill":"0","AIBot":"0"},{"player":"[PR]EMC|happy_google","score":"510","ping":"332","team":"1","deaths":"1","pid":"100362173","skill":"3","AIBot":"0"},{"player":"[GDW] P4R40N","score":"507","ping":"52","team":"2","deaths":"2","pid":"100213559","skill":"4","AIBot":"0"},{"player":"[6-1] jybbe","score":"487","ping":"41","team":"1","deaths":"2","pid":"100001677","skill":"14","AIBot":"0"},{"player":"Panzershrek","score":"476","ping":"57","team":"1","deaths":"4","pid":"100306843","skill":"1","AIBot":"0"},{"player":"Lt_Morgan","score":"452","ping":"29","team":"2","deaths":"1","pid":"100044729","skill":"0","AIBot":"0"},{"player":"Maxim","score":"451","ping":"175","team":"1","deaths":"2","pid":"100049255","skill":"2","AIBot":"0"},{"player":"HornyOstritch","score":"442","ping":"51","team":"1","deaths":"2","pid":"100349713","skill":"3","AIBot":"0"},{"player":"Brah Potato","score":"436","ping":"46","team":"2","deaths":"4","pid":"100003191","skill":"3","AIBot":"0"},{"player":"[PR]EMC|gwaihir","score":"433","ping":"15","team":"2","deaths":"3","pid":"100362312","skill":"17","AIBot":"0"},{"player":"Rifleman1","score":"431","ping":"61","team":"2","deaths":"2","pid":"100341275","skill":"4","AIBot":"0"},{"player":"[SNGE] SHINYREDBULLETS","score":"428","ping":"46","team":"2","deaths":"3","pid":"100339519","skill":"3","AIBot":"0"},{"player":"A[O] scodriem","score":"415","ping":"53","team":"2","deaths":"4","pid":"100005679","skill":"2","AIBot":"0"},{"player":"[PR]EMC|AlonTavor","score":"413","ping":"78","team":"1","deaths":"1","pid":"100362248","skill":"1","AIBot":"0"},{"player":"TeppoWinnipeg","score":"412","ping":"67","team":"1","deaths":"3","pid":"100224557","skill":"1","AIBot":"0"},{"player":"NL Hazelhoff","score":"404","ping":"31","team":"2","deaths":"2","pid":"100132691","skill":"0","AIBot":"0"},{"player":"Clamchops","score":"393","ping":"115","team":"2","deaths":"2","pid":"100358200","skill":"0","AIBot":"0"},{"player":"ela","score":"380","ping":"44","team":"1","deaths":"5","pid":"100051250","skill":"3","AIBot":"0"},{"player":"F|PFC. Buttermilch25","score":"373","ping":"25","team":"2","deaths":"2","pid":"100216659","skill":"0","AIBot":"0"},{"player":"[GDW] BuffaloRastaman","score":"367","ping":"70","team":"2","deaths":"1","pid":"100242367","skill":"0","AIBot":"0"},{"player":"gameconsole34","score":"363","ping":"72","team":"2","deaths":"1","pid":"100367848","skill":"1","AIBot":"0"},{"player":"Xamber","score":"331","ping":"49","team":"1","deaths":"7","pid":"100006202","skill":"2","AIBot":"0"},{"player":"[6-1] meloonileuka","score":"320","ping":"99","team":"1","deaths":"1","pid":"100010337","skill":"0","AIBot":"0"},{"player":"[DPRC] Re$tGeber","score":"316","ping":"13","team":"2","deaths":"3","pid":"100223458","skill":"1","AIBot":"0"},{"player":"F|Pvt. Azivegu","score":"306","ping":"22","team":"1","deaths":"3","pid":"100033576","skill":"6","AIBot":"0"},{"player":"HornyCorn","score":"305","ping":"78","team":"1","deaths":"2","pid":"100068562","skill":"12","AIBot":"0"},{"player":"SkyFaitH","score":"303","ping":"54","team":"2","deaths":"0","pid":"100164306","skill":"0","AIBot":"0"},{"player":"[GDW] parch","score":"302","ping":"38","team":"2","deaths":"3","pid":"100129270","skill":"12","AIBot":"0"},{"player":"[6-1] MasterHenaz","score":"283","ping":"43","team":"1","deaths":"2","pid":"100006852","skill":"1","AIBot":"0"},{"player":"cribbaaa","score":"266","ping":"28","team":"2","deaths":"1","pid":"100000438","skill":"0","AIBot":"0"},{"player":"[POV] klippiematich","score":"265","ping":"27","team":"2","deaths":"3","pid":"100005761","skill":"2","AIBot":"0"},{"player":"{BigJ} wokinstorm","score":"261","ping":"73","team":"2","deaths":"4","pid":"100022912","skill":"2","AIBot":"0"},{"player":"[GDW] Sierzant_Grubas","score":"255","ping":"35","team":"2","deaths":"4","pid":"100001361","skill":"8","AIBot":"0"},{"player":"Alucard.","score":"251","ping":"55","team":"2","deaths":"2","pid":"100343140","skill":"3","AIBot":"0"},{"player":"[3dAC] Frontliner(Ger)","score":"236","ping":"45","team":"1","deaths":"1","pid":"100082450","skill":"2","AIBot":"0"},{"player":"[HB] hellnoob","score":"233","ping":"39","team":"1","deaths":"3","pid":"100365838","skill":"2","AIBot":"0"},{"player":"LeNger","score":"228","ping":"20","team":"1","deaths":"2","pid":"100215090","skill":"4","AIBot":"0"},{"player":"[PLEB] elbono","score":"223","ping":"55","team":"2","deaths":"2","pid":"100005321","skill":"0","AIBot":"0"},{"player":"[PR]EMC|PBAsydney","score":"222","ping":"71","team":"1","deaths":"2","pid":"100362597","skill":"1","AIBot":"0"},{"player":"Sirze","score":"206","ping":"80","team":"2","deaths":"1","pid":"100356090","skill":"0","AIBot":"0"},{"player":"[PLEB] rosenplat","score":"205","ping":"51","team":"2","deaths":"2","pid":"100002787","skill":"0","AIBot":"0"},{"player":"ur4s26","score":"203","ping":"30","team":"2","deaths":"1","pid":"100060191","skill":"4","AIBot":"0"},{"player":"[POV] Daan","score":"190","ping":"22","team":"2","deaths":"4","pid":"100061270","skill":"0","AIBot":"0"},{"player":"[INF_PL]KaNguR_84_PL","score":"184","ping":"79","team":"1","deaths":"2","pid":"100340930","skill":"3","AIBot":"0"},{"player":"chukonu","score":"178","ping":"16","team":"2","deaths":"1","pid":"100121628","skill":"1","AIBot":"0"},{"player":"[OD-S]Fiordas","score":"155","ping":"28","team":"1","deaths":"2","pid":"100002140","skill":"1","AIBot":"0"},{"player":"INF_PL Jakub_spartakus","score":"155","ping":"58","team":"1","deaths":"0","pid":"100351369","skill":"0","AIBot":"0"},{"player":"[PR]EMC|TEDF","score":"154","ping":"58","team":"1","deaths":"1","pid":"100362520","skill":"1","AIBot":"0"},{"player":"Valta","score":"152","ping":"36","team":"2","deaths":"3","pid":"100002817","skill":"1","AIBot":"0"},{"player":"[DD] slorpo","score":"146","ping":"32","team":"1","deaths":"5","pid":"100345804","skill":"2","AIBot":"0"},{"player":"SH| TNTNiTii","score":"146","ping":"65","team":"2","deaths":"2","pid":"100172913","skill":"0","AIBot":"0"},{"player":"lakinen","score":"145","ping":"34","team":"2","deaths":"3","pid":"100376207","skill":"0","AIBot":"0"}],"roundtime":"1","teams":[{"team":"MEC","score":"0"},{"team":"US","score":"0"}],"timelimit":"14400"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/2_response.txt b/gameq/tests/Protocols/Providers/Projectrealitybf2/2_response.txt deleted file mode 100644 index 7fcca3ad03799d708fcfb72ba169eb6fb28de3ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1214 zcmaJ=O^?$s5FPjh`~-91MAM{Sf}Yrg1y&$bb&K|}T2*d5Nvt}y*LJ!s>VcomI7v&n z&`UFK-h90o!z-44@K(v7n;L#YWqi=QMtE2(*)B^a$v8hwdf8VWXUucXVdZET{=oqsJU&qtDCzOySiO|zPS_a4_6XHA5 zXc0m3#VM_E~o8rLS7h z2kwGEnjOYnqu%mo>NO5IP15$)F|E;_2F87WdsMlpkp;>{Ykhqj+~dZ}fOBSv!D|w5 zn-JwVSl!K8@Cm`3faBmAnL}?e4@IMxDHvCZ^-FonVjN{HF;wW-8&=4&3asKzB*(!L zxnQPo%ry!jO^mz>^TiME7)$lK4%_NIlGE!5aES<66dj<=4oO8?8)b$U-M-fV>|wQd{Dy8@ znMn0fB7%uy=`GUNCx3@2B!7f}jr)Elo$0*^Gj>QmM{&b$e|>_X#iCaB7T% NBf0t-WT&wV`~eGChE)In diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/2_result.json b/gameq/tests/Protocols/Providers/Projectrealitybf2/2_result.json deleted file mode 100644 index 9aa2c5b..0000000 --- a/gameq/tests/Protocols/Providers/Projectrealitybf2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"188.40.118.13:16569":{"bf2_anticheat":"0","bf2_autobalanced":"0","bf2_autorec":"0","bf2_bots":"0","bf2_communitylogo_url":"http:\/\/prteamwork.com","bf2_coopbotcount":"","bf2_coopbotdiff":"","bf2_coopbotratio":"","bf2_d_dl":"http:\/\/","bf2_d_idx":"http:\/\/","bf2_dedicated":"1","bf2_fps":"36.000000","bf2_friendlyfire":"1","bf2_globalunlocks":"0","bf2_mapsize":"64","bf2_novehicles":"0","bf2_os":"linux-64","bf2_plasma":"0","bf2_pure":"0","bf2_ranked":"0","bf2_reservedslots":"0","bf2_scorelimit":"1000","bf2_spawntime":"15.000000","bf2_sponsorlogo_url":"http:\/\/prteamwork.com\/images\/server\/servergraphic-bf2pr_colored.png","bf2_sponsortext":"Welcome to PRTA!|-Website: prteamwork.com|-TS: ts.prta.co|-Be respectful of all players, work together & fight hard.|-Read our rules on our website.|-No squads before 2:00.","bf2_startdelay":"30","bf2_team1":"CH","bf2_team2":"GB","bf2_teamratio":"100.000000","bf2_ticketratio":"100","bf2_tkmode":"No Punish","bf2_voip":"0","gamemode":"openplaying","gamename":"battlefield2","gametype":"gpm_cq","gamevariant":"pr","gamever":"1.5.3153-802.0","gq_address":"188.40.118.13","gq_joinlink":"bf2:\/\/188.40.118.13:16569","gq_name":"Project Reality: Battlefield 2","gq_online":true,"gq_port_client":16569,"gq_port_query":29902,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"projectrealitybf2","hostname":"[PR v1.4.3.0] PRTA | EU - Training","hostport":"16569","mapname":"TEST AIRFIELD","maxplayers":"100","numplayers":"1","password":"1","players":[{"player":"[TP]Kerkhoff","score":"0","ping":"21","team":"2","deaths":"0","pid":"100002466","skill":"0","AIBot":"0"}],"roundtime":"1","teams":[{"team":"CH","score":"0"},{"team":"GB","score":"0"}],"timelimit":"14400"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Projectrealitybf2/3_response.txt b/gameq/tests/Protocols/Providers/Projectrealitybf2/3_response.txt deleted file mode 100644 index 5138e742b3338a2dff9b7c30ed544188f42b7cc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1420 zcmah}&2HN`5T5R_r+oyyKx9g?WZ6J~O}A+h>?SRoE^;UegBEFtH6;=x6~}=uee(_} z#dQ~1tOx_-{LeSv7=Dk)A684@y1oT~Mp@Uo4cg^~Li2 zpC6Z((bdK6&D~XW7TsMyjn=_qO`Vf`Be-N~kUnw)Nu0-7l4oZnNn-*n)xq`ym9qav zo9KaC7mVFrbEtK@5}oZ$&AVzp1ffRI&Ve?76>3TM+*rsl($mW$Atac#ig8eycU~d7 z8Z@NrESe;e9u@j=1^ z%Mn$>sT<$Qf)riO2`S?uiOVvc7Zb)?WhX+TI8E{w~9{Ab{#~0CVw~HHUScSbKClLQwnfmbgK3hc2zM@)` z^Eo*zd&%v8c~2}i$RguyFxMRx65Ue0h_2`}jc$%i!RzLdg^S5sS9&OYTmeK&p*1(t*+`m8 zyA^U}cO0Vo9u*G_mHfGwLv;Rr`PcbpL-j4~;Dgym__M9T)rEjC1}mop>>\anticheat\1\match_info\Runes, Hook, Protection\match_type\RegularDM\time_remaining\17:28\gamedate\Jul 1 1999\gamename\baseq2 \cheats\0\timelimit\20\fraglimit\0\dmflags\17940\version\R1Q2 b7864 i386 Oct 1 2008 Linux\hostname\Clanworld's Lithium-DM #1\deathmatch\1\gamedir\ospl2\port\27910\game\ospl2\maxclients\32 -0 15 "nikon" -0 16 "Ulrik" -0 16 "bubbleuniverse" -0 18 "Centriot" -0 17 "AL1AS" -0 17 "Oilver" -0 17 "snappy" -16 55 "4833" -0 17 "rackor" -0 66 "Player" diff --git a/gameq/tests/Protocols/Providers/Quake2/2_result.json b/gameq/tests/Protocols/Providers/Quake2/2_result.json deleted file mode 100644 index 9db8cff..0000000 --- a/gameq/tests/Protocols/Providers/Quake2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"77.66.46.219:27910":{"anticheat":"1","cheats":"0","clients":10,"deathmatch":"1","dmflags":"17940","fraglimit":"0","game":"ospl2","gamedate":"Jul 1 1999","gamedir":"ospl2","gamename":"baseq2","gq_address":"77.66.46.219","gq_joinlink":"","gq_name":"Quake 2 Server","gq_online":true,"gq_port_client":27910,"gq_port_query":27910,"gq_protocol":"quake2","gq_transport":"udp","gq_type":"quake2","hostname":"Clanworld's Lithium-DM #1","mapname":"q2dm1","match_info":"Runes, Hook, Protection","match_type":"RegularDM","maxclients":"32","mod":0,"ngWorldStats_Status":"<<< Disabled >>>","password":0,"players":[{"frags":"0","ping":"15","name":"nikon","address":""},{"frags":"0","ping":"16","name":"Ulrik","address":""},{"frags":"0","ping":"16","name":"bubbleuniverse","address":""},{"frags":"0","ping":"18","name":"Centriot","address":""},{"frags":"0","ping":"17","name":"AL1AS","address":""},{"frags":"0","ping":"17","name":"Oilver","address":""},{"frags":"0","ping":"17","name":"snappy","address":""},{"frags":"16","ping":"55","name":"4833","address":""},{"frags":"0","ping":"17","name":"rackor","address":""},{"frags":"0","ping":"66","name":"Player","address":""}],"port":"27910","time_remaining":"17:28","timelimit":"20","version":"R1Q2 b7864 i386 Oct 1 2008 Linux"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake2/3_response.txt b/gameq/tests/Protocols/Providers/Quake2/3_response.txt deleted file mode 100644 index 0d3971c..0000000 --- a/gameq/tests/Protocols/Providers/Quake2/3_response.txt +++ /dev/null @@ -1,2 +0,0 @@ -ÿÿÿÿprint -\Score_A\WARMUP\Score_B\WARMUP\anticheat\1\cheats\0\deathmatch\1\dmflags\1040\fraglimit\0\game\opentdm\gamedate\Feb 9 2013\gamedir\opentdm\gamename\OpenTDM\hostname\PlayGround.ru - Teamplay\mapname\q2dm1\match_type\TDM\maxclients\12\port\27911\protocol\34\revision\22\time_remaining\WARMUP\timelimit\0\version\q2proded r1504~924ff39 Dec 3 2014 Linux i386 diff --git a/gameq/tests/Protocols/Providers/Quake2/3_result.json b/gameq/tests/Protocols/Providers/Quake2/3_result.json deleted file mode 100644 index d5134f6..0000000 --- a/gameq/tests/Protocols/Providers/Quake2/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"212.42.38.88:27911":{"Score_A":"WARMUP","Score_B":"WARMUP","anticheat":"1","cheats":"0","clients":0,"deathmatch":"1","dmflags":"1040","fraglimit":"0","game":"opentdm","gamedate":"Feb 9 2013","gamedir":"opentdm","gamename":"OpenTDM","gq_address":"212.42.38.88","gq_joinlink":"","gq_name":"Quake 2 Server","gq_online":true,"gq_port_client":27911,"gq_port_query":27911,"gq_protocol":"quake2","gq_transport":"udp","gq_type":"quake2","hostname":"PlayGround.ru - Teamplay","mapname":"q2dm1","match_type":"TDM","maxclients":"12","mod":0,"password":0,"port":"27911","protocol":"34","revision":"22","time_remaining":"WARMUP","timelimit":"0","version":"q2proded r1504~924ff39 Dec 3 2014 Linux i386"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake3/1_response.txt b/gameq/tests/Protocols/Providers/Quake3/1_response.txt deleted file mode 100644 index 24a3b26..0000000 --- a/gameq/tests/Protocols/Providers/Quake3/1_response.txt +++ /dev/null @@ -1,12 +0,0 @@ -ÿÿÿÿstatusResponse -\sv_maxclients\64\sv_privateClients\0\version\Q3 1.32c linux-i386 May 8 2009\com_protocol\71\protocol\68\dmflags\0\fraglimit\30\timelimit\10\g_gametype\0\mapname\q3tourney4\sv_hostname\XXXADULTS*ONLYXXX\sv_minRate\0\sv_maxRate\25000\sv_dlRate\1000\sv_minPing\0\sv_maxPing\0\sv_floodProtect\1\sv_allowDownload\1\bot_minplayers\2\ Administrator\X\ E-mail\esclan@att.net\ Location\San Jose, CA\ Website\matchlessgaming.com\g_maxGameClients\0\capturelimit\8\gamename\baseq3\g_needpass\0\Score_Time\Starting -0 46 "^w*ES*^3Bro^7chillin" -0 92 "^w*ES*^7a^6m^7and^6a" -0 13 "^w*ES*yursofat" -0 26 "^w*ES*guapo" -0 28 "^w*ES*^7Darth Ni" -0 18 "^w*ES*^3sunflarez" -0 18 "^w*ES*^7^1Lovely^4Lisa" -0 29 "^w*ES*^7tha mane" -0 20 "^w*ES*^7^4NoStatic" -0 68 "^w*ES*^7Hmmmmmm" diff --git a/gameq/tests/Protocols/Providers/Quake3/1_result.json b/gameq/tests/Protocols/Providers/Quake3/1_result.json deleted file mode 100644 index 00c0e1d..0000000 --- a/gameq/tests/Protocols/Providers/Quake3/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.160.179.212:27960":{"Administrator":"X","E-mail":"esclan@att.net","Location":"San Jose, CA","Score_Time":"Starting","Website":"matchlessgaming.com","bot_minplayers":"2","capturelimit":"8","clients":10,"com_protocol":"71","dmflags":"0","fraglimit":"30","g_gametype":"0","g_maxGameClients":"0","g_needpass":"0","gamename":"baseq3","gq_address":"66.160.179.212","gq_joinlink":"","gq_name":"Quake 3 Server","gq_online":true,"gq_port_client":27960,"gq_port_query":27960,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"quake3","mapname":"q3tourney4","players":[{"frags":"0","ping":"46","name":"^w*ES*^3Bro^7chillin"},{"frags":"0","ping":"92","name":"^w*ES*^7a^6m^7and^6a"},{"frags":"0","ping":"13","name":"^w*ES*yursofat"},{"frags":"0","ping":"26","name":"^w*ES*guapo"},{"frags":"0","ping":"28","name":"^w*ES*^7Darth Ni"},{"frags":"0","ping":"18","name":"^w*ES*^3sunflarez"},{"frags":"0","ping":"18","name":"^w*ES*^7^1Lovely^4Lisa"},{"frags":"0","ping":"29","name":"^w*ES*^7tha mane"},{"frags":"0","ping":"20","name":"^w*ES*^7^4NoStatic"},{"frags":"0","ping":"68","name":"^w*ES*^7Hmmmmmm"}],"protocol":"68","sv_allowDownload":"1","sv_dlRate":"1000","sv_floodProtect":"1","sv_hostname":"XXXADULTS*ONLYXXX","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"64","sv_minPing":"0","sv_minRate":"0","sv_privateClients":"0","timelimit":"10","version":"Q3 1.32c linux-i386 May 8 2009"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quake3/2_response.txt b/gameq/tests/Protocols/Providers/Quake3/2_response.txt deleted file mode 100644 index 6edfce3..0000000 --- a/gameq/tests/Protocols/Providers/Quake3/2_response.txt +++ /dev/null @@ -1,2 +0,0 @@ -ÿÿÿÿstatusResponse -\cg_enemyColors\1\Score_Red\0\Score_Blue\0\gamename\NoGhost\Mod_Build\911\Mod_Website\www.NoGhost.net\Mod_Author\Maverick\g_authenticateClient_strict\2\g_authenticateClient\1\g_delag\2\g_gamemod\0\g_antiBot\1\g_needpass\0\sv_privateClients\0\mapname\q3ctf1\protocol\43\g_gametype\4\version\Q3 1.15c win-x86 Jan 13 2000\sv_keywords\demo\capturelimit\4\g_maxGameClients\0\sv_fps\30\sv_floodProtect\0\sv_maxPing\0\sv_minPing\0\sv_maxRate\25000\sv_maxclients\20\sv_hostname\Megas|CTF.\timelimit\20\fraglimit\25\dmflags\2056\fs_game\noghost diff --git a/gameq/tests/Protocols/Providers/Quake3/2_result.json b/gameq/tests/Protocols/Providers/Quake3/2_result.json deleted file mode 100644 index 27c20a0..0000000 --- a/gameq/tests/Protocols/Providers/Quake3/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"50.97.113.104:27960":{"Mod_Author":"Maverick","Mod_Build":"911","Mod_Website":"www.NoGhost.net","Score_Blue":"0","Score_Red":"0","clients":0,"capturelimit":"4","cg_enemyColors":"1","dmflags":"2056","fraglimit":"25","fs_game":"noghost","g_antiBot":"1","g_authenticateClient":"1","g_authenticateClient_strict":"2","g_delag":"2","g_gamemod":"0","g_gametype":"4","g_maxGameClients":"0","g_needpass":"0","gamename":"NoGhost","gq_address":"50.97.113.104","gq_joinlink":"","gq_name":"Quake 3 Server","gq_online":true,"gq_port_client":27960,"gq_port_query":27960,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"quake3","mapname":"q3ctf1","protocol":"43","sv_floodProtect":"0","sv_fps":"30","sv_hostname":"Megas|CTF.","sv_keywords":"demo","sv_maxPing":"0","sv_maxRate":"25000","sv_maxclients":"20","sv_minPing":"0","sv_privateClients":"0","timelimit":"20","version":"Q3 1.15c win-x86 Jan 13 2000"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quakelive/1_response.txt b/gameq/tests/Protocols/Providers/Quakelive/1_response.txt deleted file mode 100644 index 2fdded73598a205f94b296d289a9deddb84f764d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1308 zcmZ8h&ub(_6n=qa4>=h{#Gl(M9%P+B_x#SDOlEo}k&Rhr26j>Gq0;@Pr`YbUPIdJp z6N0)DP(*Ous3>?+){CHcGk6g8;35d_K|O2#1>QW4uWAwvJBMPv?|t>&tFKeTOT=!Mi8mxA$1FN;Z(OT_pK_D^MMR{W%wpoTd73fIBeY6HF1c0TdAc$bW zvFj`FT{AxSTxB76=Ea4P(I^&{VxH_od!;#18mUri%zYM$Qp%$!Gb^lbougC$iw6gb z)Xl8D1gou!ZFruzH!j_D!7E2RQSbucx1KQg8e(AZZ;xqQ`}O8u$3IwJ#q;dqvpbeo zyMK89+n>LJCEDVHmNZ`XoPN6IHD0sQvFA8mBMJnRD4yO^6tCX>l80l3(yOR3$DeM) zMT&iT*LMN0qYU%w@FWqp?zCMfKK`)y*kja_hpf z3uFct2`p3mpBookXyYbJhVCXjM9lBgtPPp)BatCIOhmsHw&`e_T#Z>0aG81a?pS0B z7Ag4W(~q}db;1;r@F?NGUpe1~;`1MiqYsLs_ll!;irdG<(P44;1(EOwDeOOfX#tBk zCIkSw-+!%Ph*Gz7o|rf9iPq^AxR=0ZsmdirJmw0T5X7U1g&Ei|k}RCFH5@Fk&3>*hUPnD7P^sx4;Q^0PYE!~tgcFP?zf_t8r`og~r%_+gUPOWgB3DM2 z(CDTtn{N^ml*-7%1Vf;Nj;h#hlcV-yAOi!#qUoCt*-bJeNZHi!2pM z53`i*CQyTzr3txt=5Zh!{ONouY)GY0!WR*&IA9t+9U=pCy;EhTXJ!r@nxzmFSL5S|D`AVQI#K>`VF7ah8sc5UC`q{`WQ8()sg1+S$@{IbSx$LlA*eQ)pW zTi-cyL_r4?9W4b-I>MhoLqS6WP5uOE=#iPXHqt>sv(kL?&5v*1%&yn#_3<049klZx zkrT2(k{kxBpg)rWa}&Tsp_mJFGs-L~m|#WcZAdIpkQf^rDg^*H1IQFyi^79D@O`(q z{?m_(Pu{(EZ92u>Lh5sMxf^qVCjW;u&S_7WVmF8><06i--5_=7Dj1x-%*g<5tX4O; zuXTJAN^&$q?rUzWZk#(`VFDiykIzP*4(J1wmWLM)8^@o&y_LWKtzC|4o1JJQ=42bs zm(RaBg3nryj2loVgI5{+`uA^R2zxSrAd6ICMj^b!@Y9_yVnFQ*)CcVb+534FL*Jq} zIW>AtOL(1W&yq#tvL$B@>O zkH{MELf`rPmp)94DJmz$9A0DS@%umYAuUNrsv6*r=il{VzR>Urd!N4jtoP4sj@|=- zrK>F|Sx5(6$cm}Lyn+y>7V{0dA3{FHtiNHV!dU7VU02X<@FQkj0b30?GPRgpK_f;d zEUtkd@+47L&J-y*Cv{UXA5T#@W0$~h&V;Qsl1|aTmxX=2J5Ok6YMsTTa0#6-^lj!? zklzD>u%!?XLtqcq*(ZdnowW0J*%bW7+qAyQWk@5@Q!l8%Z2$$aLZz0Xu{k7PmC zk0c)}T9D%W)_D-3PB)CA?m_6~DTA4*UBlBvS&7vq$SlY@Pxl$lYs_LSFsGyu+YHfC zwjE5DDb}lcjJBxDjkbuj`B?6g6X|?FsN4(~X3!B9d_;nJs89=TY73_F37ty4vAI0= z*5}Nd1{cOr(!6xk>iVJ=gr(6#s!F`@F$I>IXZhdLA5x7}{}xYEi6zi@vGhTum~v0CrH pQgk19@Rj6S^8b`TNnKywzC7pz4{99*?VuG#2mHCa-@eNY{S8)-iSPgb diff --git a/gameq/tests/Protocols/Providers/Quakelive/2_result.json b/gameq/tests/Protocols/Providers/Quakelive/2_result.json deleted file mode 100644 index 91df583..0000000 --- a/gameq/tests/Protocols/Providers/Quakelive/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"104.192.227.170:27960":{"capturelimit":"8","dedicated":"d","dmflags":"0","fraglimit":"50","g_adCaptureScoreBonus":"3","g_adElimScoreBonus":"2","g_adTouchScoreBonus":"1","g_blueScore":"12","g_customSettings":"0","g_factory":"ffa","g_factoryTitle":"Free For All","g_freezeRoundDelay":"4000","g_gameState":"IN_PROGRESS","g_gametype":"0","g_gravity":"800","g_instaGib":"0","g_itemHeight":"35","g_itemTimers":"0","g_levelStartTime":"1480118601","g_loadout":"0","g_needpass":"0","g_overtime":"0","g_quadDamageFactor":"3","g_redScore":"18","g_roundWarmupDelay":"10000","g_startingHealth":"100","g_teamForceBalance":"1","g_teamSizeMin":"1","g_timeoutCount":"0","g_voteFlags":"1288","g_weaponRespawn":"1","game_descr":"Free For All","game_dir":"baseq3","game_id":282440,"gq_address":"104.192.227.170","gq_joinlink":"steam:\/\/connect\/104.192.227.170:27960\/","gq_name":"Quake Live","gq_online":true,"gq_port_client":27960,"gq_port_query":27960,"gq_protocol":"source","gq_transport":"udp","gq_type":"quakelive","hostname":"|)ark Fiber FFA | Chicago ","keywords":"ffa,minqlx,DarkFiberQuake.com, Dedicated, Stats","map":"blackcathedral","mapname":"blackcathedral","max_players":32,"mercylimit":"0","num_bots":0,"num_players":14,"num_rules":42,"os":"l","password":0,"players":[{"id":0,"name":"petehaberkorn","score":0,"time":14434.790039062},{"id":0,"name":"[RIOT]HeLlSpAwN","score":0,"time":9717.986328125},{"id":0,"name":"HarryTurdKnocker","score":0,"time":4886.3173828125},{"id":0,"name":"^2PotHe4d","score":8,"time":1295.3927001953},{"id":0,"name":"0BigJimSlade0","score":3,"time":1049.2965087891},{"id":0,"name":"antman63","score":3,"time":1011.1903076172},{"id":0,"name":"CracKMonkey","score":12,"time":905.10412597656},{"id":0,"name":"cedde","score":7,"time":815.43988037109},{"id":0,"name":"Blue.Demon","score":3,"time":736.82592773438},{"id":0,"name":"_McCafe_","score":18,"time":695.35919189453},{"id":0,"name":"SubZero","score":4,"time":418.99301147461},{"id":0,"name":"boomstick","score":9,"time":358.4323425293},{"id":0,"name":"Species","score":9,"time":331.39785766602},{"id":0,"name":"kvn","score":6,"time":85.051734924316}],"port":27960,"protocol":"91","roundlimit":"10","roundtimelimit":"180","scorelimit":"150","secure":1,"steam_id":90105375025776647,"steamappid":0,"sv_hostname":"|)ark Fiber FFA | Chicago ","sv_maxclients":"32","sv_privateClients":"0","teamsize":"32","timelimit":"15","version":"1069 linux-x64 Jun 3 2016 20:53:50"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Quakelive/3_response.txt b/gameq/tests/Protocols/Providers/Quakelive/3_response.txt deleted file mode 100644 index ede5886cd5ee2549f23968cb22e7fdbe8282156e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048 zcmb7D!EVz)5S^+VP%nrJH;~WBmF%R6lAcJLrYRz#B&|3g6ejk>S#`bZ?5@+K>WvRT z;=q4!-E{w-`{?CAI_9@n23qj>vg>IcW*v= z!%J^KQpY5W_C{nDWWZjnuF=FWK}+*G^bC>L)5hya2>`p#AeOKb2F*5nZ>Nv_&p$uC zc(pT~qAxb|ek#;lF8ypS{mH&TN3nn3#UG(iZvUJd89T{M;twyO|Mn461MJ=2?y=l; zcNb_$QG&*hD>F}ig*{kdtY;z>S6G2xo`3Daa4_tbC4Y|ocJ2sHUP6SK%MD4cchG`3 zok~nBG-@z4m{f2hfMksEaaB5sw4o!datrkmKjEq^uvUT>I*(>sXvpY9=2SvZ5JtIm zIvtU7LUG3enquU%S;3t}WA4GdS6RZk18lG%>gkZUwEfzHEIeCQt|#j?zAfWagmW*u)ni<&~5#B`ruY zxp4&u;Xx}1!&bZA=2EG73%M)n6j7X^tsZGU9#@nX>gGAdT}&~dUO9T{sG<15B~wiF z9!;8O)m$OZRXpVzWgeCE38k9>!wfpYl#ei?Bb2Bj*0cdf;)Vu7RWWyGX~)c5>04+= zy>jjKpwVpclWW3Et0CD8uN5>P#Z0l0_eakbM62pJ0?3SZI?@u_A(V2fL>N?2G3*9u z1z?No*@S#ob}^o5>q_$f`S}*(6qmlN5=Bby z_H>=!|8#ZL=~JhAe}8}f^aESf+0Od-A{)q5sxcd8+Qe*zjkuRdk4J1EcqG%92E)Abi#{ULexUa8{+=KXgt}v_l7~vkv|$b$T^?{NCifxwD5(9pKB0 z^V8{aW!l9laK_8dbbzaetB+IR)Ho&B7}s#Q;yBZn(aOq}0nc%6gG9^I2`*Qb)4gdt zmdfMc-rhmXX}{f}9c?0C7`g|-R_k|dY76d1MMvwbldG|$EePjIArA%9+iX+punXFR z^eZSstF%n+$!&yVc)mAi69eyC-sFa>BBaLw)+`u$IyYlMj{$T_kI~=)YqEuEJquW; z!J3=&EVQ=O+H!(OYgMyROi6*aEbodal7f!FZdf~ah4J}B)GPE`u;(mmFqe<*V6{RI zDLnzPc&tw1 zw_c?-$h(%bg>WO`)aWqCJC>sCC^BVV&hjeZG2mKZ(GMP+f0o(A~WGa%hu zdBtk36ncFa@LC

ae~ro=_QUxOyU3125U8;y*X(vW97%@r@%*Or|TuE|w7oGaEINiQglm2thg2-}E>!2E1F+WG9nmGa#kwpz>Z z^4)d4RUv4I$J|^1ZfhsrDlV2u|H?eT?YX4V7xZ&D{jmzx=e}QLB1j6O+1C2ZP?$-X z>DL{oy*!Kf4m||#k50hekYT7}uILoV%d;TsI#8A6L=r%S_UTOtc{64QPIAuMU zwh}7G7%`<2@Lf3y(A=1#r(k^W2#mAC^V}Gz4b_1j``aGEz_Zo7Sl6Y~>whi~2P1cP zBUIBtufooWtjwa{KLBM7Hy5nQJuK(npo3RGPujFKYV|I%;W(RR1MP*ZlbeE?P#?Y# zwJ8)4S2|Dgkf+Enn@{4}lQtFnP^xt5?8b5W8Q`afkKs*4dcp&`5B5jh`>|T2a1qS| zuwVP@S1lSQIx9(teePU(Bp-p;pwZ_x%fF^5jH z_m?m1xN!XG2wE-Vr^zmjq+J*GI5u~+d8cfz9HoYj1=7+g!|sDRXe(mc;&H;|Sd9e2 zh*t5Tlm=OtlwQU;3#)@ z?i+|Jxili}^EAcAa@Xx_D$-%bQO(N!I~ba>n+$vjTNl}Q8I<$|V;4rA2JGn!*Zo6V0Nr_DU>B|`OcH%Du{fHOBoc0mGAA?OBj{o;VAaPK)(hYXcq diff --git a/gameq/tests/Protocols/Providers/Redorchestra2/1_result.json b/gameq/tests/Protocols/Providers/Redorchestra2/1_result.json deleted file mode 100644 index 0e00adc..0000000 --- a/gameq/tests/Protocols/Providers/Redorchestra2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"70.42.74.39:7787":{"AdminContact":"","AlliesCampaignTerritories":"0","AxisCampaignTerritories":"0","FriendlyFire":"100","GameMode":"1","MapGame":"1","MapType":"1","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"(\"SmartLoader.u\")","NumOpenPublicConnections":"1","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":"[2.FJg] Rising Storm - Tactical Realism","PunkBusterLevel":"0","RealismLevel":"0","SpectatorMode":"0","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"False","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"l","game_descr":"Red Orchestra 2","game_dir":"ro2","game_id":35450,"gq_address":"70.42.74.39","gq_joinlink":"steam:\/\/connect\/70.42.74.39:7787\/","gq_name":"Red Orchestra 2","gq_online":true,"gq_port_client":7787,"gq_port_query":27025,"gq_protocol":"source","gq_transport":"udp","gq_type":"redorchestra2","hostname":"[2.FJg] Rising Storm - Tactical Realism","keywords":"a:64,s:1,b:1,e:1,m:0,h:1,c:0,d:0,n:0,o:0,i:1,g:0,k:100,j:0,t:100,r:1,u:1,f:0,l:,p:0,q:s|,","map":"RSTE-MaggotHill","max_players":64,"num_bots":0,"num_players":70,"num_rules":34,"os":"w","p0":"2","p1":"","p2":"RSTE-MaggotHill","p3":"0","p4":"100","p5":"0","p6":"100","p7":"0","p8":"1","p9":"0","password":0,"players":[{"id":0,"name":"worlder","score":5,"time":1013.0524291992},{"id":0,"name":"DeadlyFootFungi","score":91,"time":1013.0521240234},{"id":0,"name":"Duke of New York","score":31,"time":1013.051940918},{"id":0,"name":"CruciformSWORD","score":32,"time":1013.0517578125},{"id":0,"name":"Baranyk","score":30,"time":1013.0512695312},{"id":0,"name":"Scourge","score":28,"time":1013.0511474609},{"id":0,"name":"BTRY B 529th FA BN","score":62,"time":1013.0510253906},{"id":0,"name":"Division7Hills","score":110,"time":1013.0509643555},{"id":0,"name":"Mellie","score":26,"time":1013.0508422852},{"id":0,"name":"uberdave91","score":96,"time":1013.0507202148},{"id":0,"name":"A bag of onions","score":33,"time":1013.0505981445},{"id":0,"name":"Pablo","score":15,"time":1013.0504150391},{"id":0,"name":"Krimzon","score":180,"time":1013.0502929688},{"id":0,"name":"TribalCurve","score":124,"time":1013.0501708984},{"id":0,"name":"toine.113","score":27,"time":1013.0012207031},{"id":0,"name":"(Zach) FragBiter","score":30,"time":1012.9885253906},{"id":0,"name":"monkeymasher","score":98,"time":1012.9738769531},{"id":0,"name":"bobernaught","score":52,"time":1012.9682006836},{"id":0,"name":"FruityBunBuns","score":20,"time":1012.9680786133},{"id":0,"name":"Ace of Hearts","score":50,"time":1012.9678955078},{"id":0,"name":"Z0mbiekiller827","score":55,"time":1012.9672851562},{"id":0,"name":"Sticker and a Wheelc","score":28,"time":1012.9671020508},{"id":0,"name":"KingEvil","score":36,"time":1012.9669189453},{"id":0,"name":"jer_hunsberger","score":27,"time":1012.9666137695},{"id":0,"name":"Roshanak","score":60,"time":1012.9664916992},{"id":0,"name":"Rommel","score":84,"time":1012.9662475586},{"id":0,"name":"mojazz92","score":68,"time":1012.966003418},{"id":0,"name":"Deeble07","score":23,"time":1012.9658813477},{"id":0,"name":"flyinillini88","score":10,"time":1012.9657592773},{"id":0,"name":"DQ Mushroom Swiss","score":65,"time":1012.9656982422},{"id":0,"name":"Jeranger","score":19,"time":1012.9655761719},{"id":0,"name":"Flamingo the Pirate","score":40,"time":1012.9654541016},{"id":0,"name":"Waldo 17","score":29,"time":1012.953125},{"id":0,"name":"rogue163","score":42,"time":1012.9529418945},{"id":0,"name":"MuncyGunner","score":22,"time":1012.9019165039},{"id":0,"name":"20 Percent Above Ave","score":28,"time":1012.9017333984},{"id":0,"name":"Bob Hope","score":82,"time":1012.8996582031},{"id":0,"name":"Fametom900","score":78,"time":1012.8746948242},{"id":0,"name":"Askatasuna","score":78,"time":1012.8745117188},{"id":0,"name":"Lebrun","score":29,"time":1012.8662719727},{"id":0,"name":"Tichy#","score":27,"time":1012.8524169922},{"id":0,"name":"revenge of the wm1","score":55,"time":1012.8451538086},{"id":0,"name":"Cracker McGee","score":83,"time":1012.8430786133},{"id":0,"name":"Do0m[y]","score":110,"time":1012.8228149414},{"id":0,"name":"Gunnerside","score":14,"time":1012.789855957},{"id":0,"name":"Paddytehpyro [J-Serv","score":33,"time":1012.7623291016},{"id":0,"name":"Outlaw","score":21,"time":1012.7478027344},{"id":0,"name":"Kikkoman","score":64,"time":1012.7283325195},{"id":0,"name":"JohnnyMadKunt","score":124,"time":1012.7183227539},{"id":0,"name":"viktor-2008.79","score":4,"time":1012.7182006836},{"id":0,"name":"Hrafnar [YO!]","score":79,"time":1012.7037353516},{"id":0,"name":"MiGu3h","score":7,"time":1012.6434936523},{"id":0,"name":"=AMAN=_Charada250","score":32,"time":1012.6433105469},{"id":0,"name":"Newgame","score":47,"time":1012.5354614258},{"id":0,"name":"BK3","score":39,"time":1012.4039306641},{"id":0,"name":"USWarrior","score":57,"time":1010.7360839844},{"id":0,"name":"DatGuyJo","score":39,"time":998.43341064453},{"id":0,"name":"Grizzled RO1 Vet","score":65,"time":996.27392578125},{"id":0,"name":"Harry Bacon","score":37,"time":963.66705322266},{"id":0,"name":"[TCO] Sgt. Rock Fury","score":66,"time":947.62634277344},{"id":0,"name":"kelanousukaste","score":29,"time":666.89678955078},{"id":0,"name":"Bodkins(UK)","score":9,"time":652.37322998047},{"id":0,"name":"Clovah","score":11,"time":561.21655273438},{"id":0,"name":"Rieban","score":1,"time":487.34140014648},{"id":0,"name":"Spot","score":31,"time":459.11111450195},{"id":0,"name":"fatgleeson","score":8,"time":419.59140014648},{"id":0,"name":"Grosbolos","score":-4,"time":357.95526123047},{"id":0,"name":"Karma","score":0,"time":119.30563354492},{"id":0,"name":"","score":0,"time":119.05187988281},{"id":0,"name":"Covert_Tiger","score":0,"time":71.099876403809}],"port":7787,"protocol":17,"secure":1,"steam_id":90094348721876999,"steamappid":35450,"version":"2.0.0.19"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Redorchestra2/2_response.txt b/gameq/tests/Protocols/Providers/Redorchestra2/2_response.txt deleted file mode 100644 index 30a8fe598682807a46666f8bec5c95f48b6fdc1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2051 zcma)-O^6&t6vtl-ii8-A#Q2dI8&@dS*A9?CcCZlY|)JS~FccU76~t zPIY&7XW8IEj3EdTf@p4{U{DYg14cZ0)suqWB-b2r(u)VzfAyLu1i>DPssHc2s;-as zUTAc&@C&^a}xVSjXjc7rj?gi4)tr)5N^-@%e*h2hkK@pWr-lf-H0 zOa)FFV!1rwos{;%dd6Cr94ebY-x2Uzk<#|pgpbuNUz`IO}HNMnk{iTQ*p_s`h*#8u)ezu$?Q&VFl zdJ6-7e-fx>hMkj42AZls*DYFLNxGP&MlgC1tY(=Tal?9?=j)!aB-EW=#KICCfzM~V zK{)G5zQT+V+LR{fUGPsWcT+6|9fbVm2}rD8NXbH`f@G8`z&9re;CQ-!#+ew;V|&jIuvtWq zrVE(q&Fzq9Gb!|N#JWn*!+>Ah{s@=kyA5ZqUZEWzcRm4`W$6+&T$rNcK)+Nz#5S8O zpvR!LFJ42mdq-->3%6BWSeVa`_=n~P6*`%p!kwP;(Bs z$rMYu$ya^-C}>x#MS7&TZ1UTD@50*^swoVRPDe!k3GLl=<@EK5VSM&p?8V&zDM zj_Mv;%jf~bmr|4Q zr9dM=?ep4qm&c^aHZ}o^)s07xxCe)@t zH^ZFTBz~rpP+g+MEUL#`HL|u89UP9ro`hBj=7s5gj5=Chu|qct>wJKh{TnRW&Hv9Y zXK)%Xuke<46BL9H~SNoPg*dAUL#Yza+V;V7x;NDL41w^mqd4E fGscGOmh;0ZP&4H$s;aI~`~)`%wn`Hv)Z4!R_|Q(w diff --git a/gameq/tests/Protocols/Providers/Redorchestra2/2_result.json b/gameq/tests/Protocols/Providers/Redorchestra2/2_result.json deleted file mode 100644 index e7e008d..0000000 --- a/gameq/tests/Protocols/Providers/Redorchestra2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"72.5.102.247:7777":{"AdminContact":"","AlliesCampaignTerritories":"5","AxisCampaignTerritories":"5","FriendlyFire":"100","GameMode":"1","MapGame":"0","MapType":"0","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"","NumOpenPublicConnections":"1","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":"|RD| PROFESSIONAL TERRITORY-CAMPAIGN.","PunkBusterLevel":"0","RealismLevel":"0","SpectatorMode":"0","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"True","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"l","game_descr":"Red Orchestra 2","game_dir":"ro2","game_id":35450,"gq_address":"72.5.102.247","gq_joinlink":"steam:\/\/connect\/72.5.102.247:7777\/","gq_name":"Red Orchestra 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"redorchestra2","hostname":"|RD| PROFESSIONAL TERRITORY-CAMPAIGN.","keywords":"a:64,s:1,b:1,e:1,m:1,h:1,c:0,d:0,n:5,o:5,i:1,g:0,k:100,j:0,t:100,r:0,u:0,f:0,l:,p:0,q:,","map":"TE-Rakowice_MCP","max_players":64,"num_bots":0,"num_players":65,"num_rules":34,"os":"w","p0":"2","p1":"","p2":"TE-Rakowice_MCP","p3":"0","p4":"100","p5":"1","p6":"100","p7":"0","p8":"1","p9":"0","password":0,"players":[{"id":0,"name":"ColoradoKush","score":38,"time":1304.9552001953},{"id":0,"name":"Gadamlu","score":64,"time":1304.9066162109},{"id":0,"name":"ESBlofeld","score":25,"time":1304.9064941406},{"id":0,"name":"tangosuckaGSC","score":20,"time":1304.90625},{"id":0,"name":"Chupacabra","score":87,"time":1304.9040527344},{"id":0,"name":"Rambo","score":0,"time":1304.9024658203},{"id":0,"name":"vermin","score":112,"time":1304.8575439453},{"id":0,"name":"Reddit","score":36,"time":1304.8572998047},{"id":0,"name":"lankage1","score":79,"time":1304.8571777344},{"id":0,"name":"A Small White Box","score":127,"time":1304.8570556641},{"id":0,"name":"T-KNUCKLES","score":41,"time":1304.8569335938},{"id":0,"name":"Echo Whiskey","score":39,"time":1304.8568115234},{"id":0,"name":"Spiele Dota","score":0,"time":1304.8566894531},{"id":0,"name":"ROPlayer2664","score":180,"time":1304.8564453125},{"id":0,"name":"VaGaBonD","score":153,"time":1304.8564453125},{"id":0,"name":"Prowrestler001","score":76,"time":1304.8562011719},{"id":0,"name":"Dred825","score":0,"time":1304.8560791016},{"id":0,"name":"MpSarge","score":30,"time":1304.8559570312},{"id":0,"name":"demurphy47","score":22,"time":1304.8555908203},{"id":0,"name":"int | Tricycle Fire","score":84,"time":1304.85546875},{"id":0,"name":"Ass Pound the Desect","score":28,"time":1304.8551025391},{"id":0,"name":"alec4558","score":147,"time":1304.8548583984},{"id":0,"name":"BullsEyeBart","score":63,"time":1304.8547363281},{"id":0,"name":"Nervybobcat","score":120,"time":1304.8546142578},{"id":0,"name":"Belphegor","score":40,"time":1304.8526611328},{"id":0,"name":"Twelve","score":86,"time":1304.8510742188},{"id":0,"name":"Legalize_gay_marinar","score":120,"time":1304.7548828125},{"id":0,"name":"Rufus9952","score":133,"time":1304.7486572266},{"id":0,"name":"Mr. Waldo","score":69,"time":1304.7391357422},{"id":0,"name":"LastNutria","score":5,"time":1304.7281494141},{"id":0,"name":"Amerakee","score":147,"time":1304.7265625},{"id":0,"name":"hockmah2","score":72,"time":1304.7082519531},{"id":0,"name":"eaglewarrior27","score":143,"time":1304.7081298828},{"id":0,"name":"Atoli","score":42,"time":1304.6788330078},{"id":0,"name":"gorillahands4","score":68,"time":1304.6787109375},{"id":0,"name":"Man_or_Astroman","score":49,"time":1304.6623535156},{"id":0,"name":"|President Rasputin","score":13,"time":1304.6622314453},{"id":0,"name":"FireFox-Miho","score":136,"time":1304.6535644531},{"id":0,"name":"olehen","score":43,"time":1304.6469726562},{"id":0,"name":"##pp###","score":105,"time":1304.6468505859},{"id":0,"name":"Bendy","score":47,"time":1304.6420898438},{"id":0,"name":"BRADREY","score":86,"time":1304.5491943359},{"id":0,"name":"ROPlayer2639","score":42,"time":1304.4912109375},{"id":0,"name":"[0 Coy] 76","score":79,"time":1304.4407958984},{"id":0,"name":"Fredo","score":125,"time":1304.3909912109},{"id":0,"name":"julio.magni","score":8,"time":1303.333984375},{"id":0,"name":"TRAP GOD","score":14,"time":1301.2165527344},{"id":0,"name":"Fat_Man09","score":85,"time":1282.1513671875},{"id":0,"name":"|Sad","score":16,"time":1226.4389648438},{"id":0,"name":"SCHMUCKATELLI","score":72,"time":1218.6187744141},{"id":0,"name":"Wubsy","score":18,"time":1213.4152832031},{"id":0,"name":"Wizzy","score":27,"time":1167.8348388672},{"id":0,"name":"SSGermanater","score":42,"time":1162.3328857422},{"id":0,"name":"gizmo31fr","score":5,"time":1083.9244384766},{"id":0,"name":"One_Man_Army","score":8,"time":1073.4337158203},{"id":0,"name":"Dauthaz","score":54,"time":801.07067871094},{"id":0,"name":"Jokazu","score":2,"time":678.93121337891},{"id":0,"name":"###","score":0,"time":621.84301757812},{"id":0,"name":"LordCC","score":0,"time":516.69146728516},{"id":0,"name":"Kilroy","score":0,"time":431.74523925781},{"id":0,"name":"gausho182","score":0,"time":423.06420898438},{"id":0,"name":"Communist Cat(Tradin","score":0,"time":154.16453552246},{"id":0,"name":"Sherb3rt","score":3,"time":127.28482055664},{"id":0,"name":"Boon","score":0,"time":102.12944030762},{"id":0,"name":"The_true_doge","score":0,"time":69.381576538086}],"port":7777,"protocol":17,"secure":1,"steam_id":90094486016507910,"steamappid":35450,"version":"2.0.0.19"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/1_response.txt b/gameq/tests/Protocols/Providers/Risingstorm2/1_response.txt deleted file mode 100644 index 00535cf8c884179c1f729522f546b1d5f6e229f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1002 zcmah|v2GJV5S=s#QUoYzqLUCJ5)L{$u@g>;aInvI5J}9PNrR$j?{09G-0g05_hKBS zpaO}8AK(*cXldxFXp#658Z&zl5eN{)YTvwhv!gdRH=E67Ti3mf{iySF!;44J<|yp% zddprEH@rQLRQ9nziBozdZh$8;YBb>FW&CuA$636*s6fMo?2rk&=c zv8X3Zo4W#SO;PeVsKLAB67>g|KRcTzH?!_S6~d)&cLosWc)|sIA?joQO&9toWXdyy zkeK(5=`dv(7v7L1xrCQQFZGBX@5E7?AR^V=^W<=CDNZ+b+eiELB&tu@vA_)nmtLp5yeH)Jo%N z!(VBU7T{IeRikENj2X?q%7R%5_bK(gMX7TDJ)AZ{C&ERY?9^9Au>DE(qd{cgOM%~k}cC=g<^ax`m8|cvD{Q_7c-tRr@Npc zCXO!ZB0Mg+Ml)o_Or*Y$Juzrv%d9znzo$8hET8sB3$zm8x@=4OWOdkPs_N-GG@2>| zhh7Y%kh;=tb8#LJU(%aWo2V3mRuy2UEOr%&VVUGSCHI0%aVZQm>n`^v-&%#;iK`vv zY>Ij-qi(+vJI?<9e;wshovQz9(5ms<&!twJdbM(+nhv+l@tVWyG=vCQ&Q0+MPiT>R dh!y#8POBMFY>^eA7;}NNxrQ9VTBErRKLAgGG(G?T diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/1_result.json b/gameq/tests/Protocols/Providers/Risingstorm2/1_result.json deleted file mode 100644 index b4e1abf..0000000 --- a/gameq/tests/Protocols/Providers/Risingstorm2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"85.195.114.188:7777":{"AdminContact":"admins@clusterwars.net","FriendlyFire":"100","GameMode":"1","MapGame":"0","MapType":"0","MaxHonor":"100","MinHonor":"0","MutatorsRunning":"","NumOpenPublicConnections":"51","NumPublicConnections":"64","OwningPlayerId":"0","OwningPlayerName":" =]RC[= STRATEGO - RS2 Vietnam TE","RealismLevel":"0","SpectatorMode":"0","SteamEngineVersion":"7258","bAntiCheatProtected":"True","bIsCampaignGame":"False","bIsDedicated":"False","bIsRanked":"True","bRequiresPassword":"False","bUsesStats":"True","dedicated":"d","game_descr":"Rising Storm 2","game_dir":"RS2","game_id":418460,"gq_address":"85.195.114.188","gq_joinlink":"steam:\/\/connect\/85.195.114.188:7777\/","gq_name":"Rising Storm 2","gq_online":true,"gq_port_client":7777,"gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"rising storm 2","hostname":" =]RC[= STRATEGO - RS2 Vietnam TE","keywords":"a:64,s:51,b:1,e:1,m:0,h:1,c:0,d:0,i:1,g:0,k:100,j:0,t:100,r:0,u:0,l:admins@clusterwars.net,p:0,q:,","map":"VNTE-SongBe","max_players":64,"num_bots":0,"num_players":14,"num_rules":30,"os":"w","p0":"0","p1":"admins@clusterwars.net","p2":"VNTE-SongBe","p3":"0","p4":"100","p5":"0","p6":"100","p7":"0","p8":"1","password":0,"players":[{"id":0,"name":"","score":0,"time":175984.09375},{"id":0,"name":"Slevin","score":208,"time":1106.2414550781},{"id":0,"name":"Genocide","score":69,"time":1106.2397460938},{"id":0,"name":"Captain Pablo","score":128,"time":1106.1923828125},{"id":0,"name":"Pimpin le Vermintici","score":57,"time":1106.1922607422},{"id":0,"name":"Jimmy","score":93,"time":1106.1920166016},{"id":0,"name":"shiina_mashiro","score":256,"time":1106.16015625},{"id":0,"name":"kilo_200","score":72,"time":1106.1572265625},{"id":0,"name":"daniel","score":40,"time":1106.1424560547},{"id":0,"name":"SoupDragon","score":304,"time":1106.1348876953},{"id":0,"name":"rileyforprez2036","score":0,"time":1106.0163574219},{"id":0,"name":"derangedwartomato","score":63,"time":1105.7180175781},{"id":0,"name":"Howzer","score":0,"time":1104.5264892578},{"id":0,"name":"Roiberto","score":25,"time":1085.9934082031}],"port":7777,"protocol":17,"secure":1,"steam_id":90110703944269833,"steamappid":0,"version":"1026"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Risingstorm2/2_response.txt b/gameq/tests/Protocols/Providers/Risingstorm2/2_response.txt deleted file mode 100644 index df97157811eb6c8aa5d5d195beab63a6b2dfe51d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmbVK&2G~`5T0Ip;{}ifS5q7(O^QzqZbBoG#&Qf7gwVzwk|pci?f#Gk^$B>+&r`Ym~U zdBT$6AhhjgmGnZSsFNt%&|1=3QAi3!!3kR@{cxM~qA2`8i0d*#xToqpg-Ak8{{EEoHCON}n>>PXRdZ4(9V;EcSO|_bWwmB}EekY;J7oxh2*!8(A3LkDbUfW4 zbD2>NONSK{#v`m|#}hADjWA`xcIXvWyksr!2<1#}kLPl{_1vJ%n6*1)j$*JLI3Q{n=70d1GLs;GcD(_PP~&5FG~V0YI_D${Z2TpkKyc)C*=n|mp_Tm#(r zdZAHfekFKG?nn~Fm9#J%w0nQW7rXXsCfFX$tRlmH2X0#V|1(!Qf*5oUK*xX1nC?>> zJ?P}<^EMwI@)7hwUyuv>8KIe%+vlD})4arwCMNqnM;LSVdch3Df z_nh-KHa0dYyS=ec>!2xYr{Ikly~4^X8l$`3iBg(a9eGs|CnvoVczFxjO4U9|3p0)K zpwC_Im4xbPRjE*YE=P5l!0gRgZ6Ys6M8%^NbZJ{QlN+Y@#oq1DtNlm!9o;4h!})=v zkQrzevIC4Kg51Hog?E5QLT=-|Qpjd91Iv(XUowzVJYk_@ZCn@{@@3M}CO8oB(4Aup z4a9I+Eez0W&HJzkq8+DC@4#6%{9<3F+w<4Pskm6h`GjiI1<)6Mc+n@bta~lSUPnQ$ zI5Im~=Rk35h4Mg`9jfan;;`ECwGv^_pK$(r@RAO#Rx}P$bb3{^IsyZC0-XI0pwTfR z=?FHOegZq=Se-3Y0hOIP=FP39!f-G;O80IfYJLki#W{%-gy;2H#0Cd#RaS_V(b!bE* zPOq(5uPVciP7|hwL7#9Gp|^&UgoB#4!fLt+OY#jYMFSH;F$7>7sEa_R5n1S~POllM zTI?N@Mv&ZsWra}0Z0I?V*twNNY=ufDH#5h9hkfZ$T*U8KErgf#uJyVW~t@ zxX>_EbOh)@hl(~7$uzfxq7dwXK2tIhp;y(mgT)fyGhe~AicAoSal#uw%MOjD&1T36 zb+>?$YFRWGqrZfMcDnWIwO`|66yLf zcl-G=>DZ)ht@LW?3Y~-3gd>$GN|m%dIty~?3y@)Mq!8)P@!TavuRquwsLt)DSM0kSj>DtTRka zX>QUI{C@usYX5ih14xb8v7(=!EKg7OueJ9sSfWE2WU|9XEC~*&1n-g8!RJ-LA}EPK ztQn>{@WsK)NHfhHfm$-zY@Xf$ow)ykPqRq>?5t!awKJQbPc?GSdzwJkB z=X_FOqE$0QWLM$SxR~J1WEe^jO;HMR>vqkR&(abbIC{QVlL-yOpr7(lFfF-G`=MQ} z6n#2TpO`u6Rg1nqJJBC}?P4BFq8LRx`XJJ(bzmYy9^oJfxeR#qy#ee=np4QhY3P3(c^Y@m%E;A}y=nJP z+rfXiXV>4eB70mG?go4%w-eP=UZ|9hdt>$DBn<+tKL&_<->ldtU)otxC12KuleCGD$sEsNXixOd8F`tZHd9lr6*n z?cGX^KACZ*f8*gi&34^TR7a0ZC4l2U!Hhfo|M`l>8O#)C?;ig+_g`Pz_@En_@1He3 y}y z_xC*a{GQx#chzdO8eALgj>Ur=!FUhT(!#WR$+@Jm>a)S7k@amW za)YucS(Th9N}^R!DethRRF7aSElu1uzfwPx5KFmi(f3vDJg^kW?L^dHmt}4j^x~eK z(8Qt@sw_SN-JMtqZP~sCx@0kQ+VU`J-`)4UufFm_bKgRD{sqbzi^wHfNKJ`Pn@KMD;c z?>FY{S_w^l`e$eT>>ghC8$?$90QE+%L(jP8q01j!g96U0(9Df1(0J=bXoF`C^5$ot zyVqp>*Y&CS|t1;A4KOcuCEQU7DzJ}WG8()Q*9y4T(9YgKir;kF?iNny< z&F#<&C$~WBnhp6%Hq=hB%@8-b0s6Y@Zb$uGoqh8b;T>`ZisJ&d;2O_@;AE z^rd&82S1;Hrq8?ujikq*OHYg%qfZr~Lw8tc@5i^>>w7u!(M{-+;aO-{J`Vk|IR{;M z{&bsh*ZLUJTa+^*aXDP9o03$nm@Q~Sgosi;rO9eR&SeuENA_j+Wtn9^yCb`qe;Z%+ zz=nawo|H5UGE5-q^Tru(I2>7~SJ=Cwhw0QObuBZ&v|ueZ_T@;PUDZ5SC)0in|%G8v3Qx;6wv_Gov zPs$b&sceA=F6t6UpPDDs;i>&5lBKk6%2GE;rxK|QvD<~3lwLvw&P@(VNm0^dC7G7U z!9qc8vDsu+R?Xqcj3!D_Wz|e_sP=MY<(zFR47@Hi}WVT;1BWV z=hLt3?_YlR!hDb=MYSnQDx95b)KzRA-(@Q3Ky8F-i0bw1aDq)Zh z;$aGf3EJBuKuNB!vhmXBRg%D4QA=H+d@gBh>N;rYkGSY)bp^c@eoGe99QkbUgo2B; zrg8Y2Zr?{0DyiKYyba#m8Dpc)x(`;1f+9S}OyPU-p6t{ZAK}=Fjb{d9!}N?&jC0kA z_d3F#rFRi7Nl|007cFJHT9C)BsR>`9Z!DksCCFm8s7Z0QIn{>6TpDwZ$;w8!*vV!l ztF8alcxKf#XCXh*|Da#t@*pdBM};_EX@g~JypG!L(%bYe$n zHYk0UW-bcJW8_q@?i@1%lp2ez@OY3)p*Fsy;0^04{4?`Qyqj)fcs#p~Y`khg)AQtfoqb@~ zAp6ZA*@41!f1gky}u;SlpUkf>RH`u3k+gli$;V5}-*?nVjeDC?)a O{NF7eWylh~(|-ewYm(Xk diff --git a/gameq/tests/Protocols/Providers/Rust/2_result.json b/gameq/tests/Protocols/Providers/Rust/2_result.json deleted file mode 100644 index 23543e7..0000000 --- a/gameq/tests/Protocols/Providers/Rust/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"45.121.211.113:49505":{"build":"757.81","country":"","dedicated":"l","description_00":"Gaming is Life Community Server 500xGather 15 minute aridrops \\n \\n Plugins: AutoDoor, AutoFurnace, ","description_01":"BetterLoot, CraftingController (Insta), Kits, Teleportation (Set home & tpr), QuickSmelt, RemoverToo","description_02":"l, SkipNightVote, StackSizeController & TwigsDecay(no decay). \\n Server Rules: No Cheating or you WI","description_03":"LL be banned. \\n No greifing. Raid but don't destroy a base just for the sake of it. \\n Racial slurs","description_04":" in chat will not be tolerated. \\n MOST IMPORTANT Have Fun! \\n Click The Website link to see the map","description_05":".","description_06":"","description_07":"","description_08":"","description_09":"","description_10":"","description_11":"","description_12":"","description_13":"","description_14":"","description_15":"","ent_cnt":"78446","fps":"260","fps_avg":"259.78","game_descr":"rust_server","game_dir":"rust","game_id":252490,"gc_cl":"68","gc_mb":"1594","gq_address":"45.121.211.113","gq_joinlink":"steam:\/\/connect\/45.121.211.113:49505\/","gq_name":"Rust","gq_online":true,"gq_port_client":49505,"gq_port_query":49505,"gq_protocol":"source","gq_transport":"udp","gq_type":"rust","headerimage":"http:\/\/i.imgur.com\/1NrlcvA.png","hostname":"AuNz Rust Is Life Wiped every Friday 500x,TP,Insta,Stacks,Rads","io":"sl72,tm17,tr10","keywords":"oxide,modded,mp50,cp0,v1344","map":"Procedural Map","max_players":50,"mem_pv":"2969","mem_ws":"2878","num_bots":0,"num_players":0,"num_rules":32,"os":"w","password":0,"port":-16031,"protocol":17,"pve":"False","secure":1,"steam_id":90098932496747529,"steamappid":0,"uptime":"6964","url":"https:\/\/www.streamline-servers.com","version":"1344","world.seed":"1946125","world.size":"4000"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Samp/1_response.txt b/gameq/tests/Protocols/Providers/Samp/1_response.txt deleted file mode 100644 index e502e056230428c9172f0123e557b77c996df727..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmY+CTT|0O6vqQiwl@?7Q7$7^#M^_R&;gYv8=BUkY3L;23}vdbO}EWrv)jp~u^qmK zkA49CCVnf==`hUr@XP$qb@!aCTWz(w>E>U$&6OSH>%yj@D2;mO%r=ipPP8h+(^!MGByXZVPInodG58eatIx?VwQ?X}?;fP0m;pV2`-u3S9Cy)2u$B4 zoob_Td5O2igqOsSjT#k2(A&VCYH>R$fx^;C!R4VtXA>$UR-o^Y_p$0E8DnDJpNDSI;@pIyaoP$J0VfBBRceCFkU)8I64wF7B5}%6dsST20eb9}Z?xFg=ue0~sbkK9%99AM=1|<-_B0`5!Ee Bp5g!i diff --git a/gameq/tests/Protocols/Providers/Samp/1_result.json b/gameq/tests/Protocols/Providers/Samp/1_result.json deleted file mode 100644 index 5ab7e99..0000000 --- a/gameq/tests/Protocols/Providers/Samp/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"93.119.26.201:7777":{"dedicated":true,"gametype":"GFZONE RPG v6.2.8c","gq_address":"93.119.26.201","gq_joinlink":"","gq_name":"San Andreas Multiplayer","gq_online":true,"gq_port_client":7777,"gq_port_query":7777,"gq_protocol":"samp","gq_transport":"udp","gq_type":"samp","lagcomp":"On","language":"Romanian\/English","mapname":"San Andreas","max_players":350,"num_players":34,"num_rules":6,"password":false,"players":[{"id":0,"name":"Unchiu","score":33,"ping":21},{"id":1,"name":"FighteR","score":86,"ping":19},{"id":2,"name":"AjMERAjMER","score":53,"ping":36},{"id":3,"name":"Host.","score":27,"ping":25},{"id":4,"name":"[ESL]Biceps","score":25,"ping":16},{"id":6,"name":"BuZz","score":17,"ping":21},{"id":7,"name":"Bibanu","score":5,"ping":40},{"id":9,"name":"vibe.","score":27,"ping":25},{"id":12,"name":"R@Ul","score":25,"ping":46},{"id":18,"name":"CaptainBoom","score":24,"ping":46},{"id":21,"name":"PinK","score":13,"ping":24},{"id":22,"name":"PotancaEinocent","score":6,"ping":15},{"id":23,"name":"YaLL","score":5,"ping":19},{"id":24,"name":"DOZE","score":8,"ping":25},{"id":25,"name":"[F3]KiNTA","score":39,"ping":24},{"id":27,"name":"KEN","score":80,"ping":26},{"id":29,"name":"Blindius","score":21,"ping":14},{"id":30,"name":"guabyy","score":16,"ping":20},{"id":31,"name":"KnND_196","score":12,"ping":21},{"id":34,"name":"Meryen","score":40,"ping":26},{"id":35,"name":"Jah","score":54,"ping":20},{"id":36,"name":"ZAGGYY","score":13,"ping":40},{"id":37,"name":"BoGDan","score":11,"ping":30},{"id":47,"name":"LiNu","score":32,"ping":26},{"id":51,"name":"SirRazvano","score":13,"ping":26},{"id":53,"name":"hd.GFZ","score":20,"ping":157},{"id":78,"name":"MaRio","score":38,"ping":26},{"id":99,"name":"sPz.","score":20,"ping":51},{"id":102,"name":"ShifT","score":69,"ping":26},{"id":106,"name":"BeLoDeDiky","score":5,"ping":24},{"id":119,"name":"ReDix","score":49,"ping":20},{"id":149,"name":"RaLuCa","score":3,"ping":71},{"id":169,"name":"FaLc0N","score":6,"ping":26},{"id":170,"name":"jrD","score":32,"ping":41}],"servername":"GFZONE: RPG Server [0.3.7]","version":"0.3.7-R2","weather":"10","weburl":"www.gfzone.ro\/forum","worldtime":"05:00"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Samp/2_response.txt b/gameq/tests/Protocols/Providers/Samp/2_response.txt deleted file mode 100644 index e69de29..0000000 diff --git a/gameq/tests/Protocols/Providers/Samp/2_result.json b/gameq/tests/Protocols/Providers/Samp/2_result.json deleted file mode 100644 index 198891f..0000000 --- a/gameq/tests/Protocols/Providers/Samp/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"91.121.97.26:7791":{"gq_address":"91.121.97.26","gq_joinlink":"","gq_name":"San Andreas Multiplayer","gq_online":false,"gq_port_client":7791,"gq_port_query":7791,"gq_protocol":"samp","gq_transport":"udp","gq_type":"samp"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/1_response.txt b/gameq/tests/Protocols/Providers/Sevendaystodie/1_response.txt deleted file mode 100644 index 993c8f4b630e2d80f7fb90b072095656b0106cf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1328 zcmb7EJ&)T)5S<_{V!JZnG6+~Eg@vW4k2_owo~W}0OFl)^#m2c>k)zYX%Uyc8l#Yi> z;XZYc;$R>^$}~xr)G1S>O48>CCb8YbOv0 z0C(FEZvYr;x!o3H@Z-OWTVEf2|NN8BKX8xghaIt_4%zV2A0JW#z@6*sJ9L_DaJO2* zSHJ%?tgYMZ&&G1T{jITHjec#ckH7n+vBKF8jdlCxqsDse{u9($e*PwFteZ!FAJb}3*cj$pHOki|+V(?{-Dk`Ag-eD7NUZ8;!E;9t*L@Qx2vbn)t2j(V6IF>qk5#)w1 zgcP=z=vXWTMYvS{aV}&$Fvu-783sB@xfQkVm(+5h75Fk;amVe#KGrNz)63>9BUjOz-A3X>ub%cY2NX$x?nLPAs-PB77?fF4DaUSY~NidsPD zf>Kg@QJo5Sq%%wP{!iJJsj94DZq{PW}b772YlvUMxlQ`De`ioq}Tt#$L(p`znFe}L@ z=My{z6MnhV5wTCJiYknKB@)s$^t*fDxlR@WD{v~*1w3$pg6&e91fB}I0ybHltb|FM zkAKS=Z~kokOqZd8~Z^p`{@`5t3@E XhPGOVXf2((f!-O$rU|oL(M-GnLyD+M diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/1_result.json b/gameq/tests/Protocols/Providers/Sevendaystodie/1_result.json deleted file mode 100644 index 6e114af..0000000 --- a/gameq/tests/Protocols/Providers/Sevendaystodie/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"64.94.95.106:25341":{"AirDropFrequency":"72","AirDropMarker":"False","Architecture64":"True","BlockDurabilityModifier":"100","BuildCreate":"False","CompatibilityVersion":"Alpha 15","CountryCode":"XX","CurrentPlayers":"10","CurrentServerTime":"31540904","DayCount":"3","DayLightLength":"18","DayNightLength":"50","DropOnDeath":"0","DropOnQuit":"0","EACEnabled":"True","EnemyDifficulty":"1","EnemySenseMemory":"60","EnemySpawnMode":"3","GameDifficulty":"4","GameHost":"All Night Gamers (A) | Admins | USA | PvE Only |","GameMode":"SurvivalMP","GameName":"ziotlen3","GameType":"7DTD","IP":"64.94.95.106","IsDedicated":"True","IsPasswordProtected":"False","LandClaimDeadZone":"15","LandClaimDecayMode":"2","LandClaimExpiryTime":"7","LandClaimOfflineDurabilityModifier":"0","LandClaimOnlineDurabilityModifier":"0","LandClaimSize":"21","LevelName":"Random Gen","LootAbundance":"100","LootRespawnDays":"30","MaxPlayers":"50","MaxSpawnedAnimals":"75","MaxSpawnedZombies":"75","Ping":"-1","Platform":"WindowsPlayer","PlayerKillingMode":"0","Port":"25341","RequiresMod":"False","ServerDescription":"Friendly PvE players wanted.","ServerWebsiteURL":"","ShowFriendPlayerOnMap":"True","SteamID":"90105371493633028","StockFiles":"True","StockSettings":"True","Version":"Alpha 15","ZombiesRun":"0","dedicated":"d","game_descr":"7 Days To Die","game_dir":"7DTD","game_id":251570,"gq_address":"64.94.95.106","gq_joinlink":"steam:\/\/connect\/64.94.95.106:25341\/","gq_name":"7 Days to Die","gq_online":true,"gq_port_client":25341,"gq_port_query":25342,"gq_protocol":"source","gq_transport":"udp","gq_type":"sevendaystodie","hostname":"All Night Gamers (A) | Admins | USA | PvE Only |","keywords":"1;1;1;1;0;0;4;1;","map":"Random Gen","max_players":50,"num_bots":0,"num_players":11,"num_rules":51,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":6938.0610351562},{"id":0,"name":"","score":0,"time":6886.0043945312},{"id":0,"name":"","score":0,"time":6547.015625},{"id":0,"name":"","score":0,"time":6281.1879882812},{"id":0,"name":"","score":0,"time":5972.138671875},{"id":0,"name":"","score":0,"time":5514.2905273438},{"id":0,"name":"","score":0,"time":2185.7521972656},{"id":0,"name":"","score":0,"time":1913.5505371094},{"id":0,"name":"","score":0,"time":974.35504150391},{"id":0,"name":"","score":0,"time":113.64181518555},{"id":0,"name":"","score":0,"time":9.2815980911255}],"port":25341,"protocol":17,"secure":0,"steam_id":90105371493633028,"steamappid":0,"version":"00.15.00"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/2_response.txt b/gameq/tests/Protocols/Providers/Sevendaystodie/2_response.txt deleted file mode 100644 index e87023e0791f1f2619ed650ffdfbdd73b490d99b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346 zcmb7EO|R2N6ulJ-1QH8Y?2uPgSrFN=gL!={@Qd>xBH@KNe3Y&x_RY(P@r)Ud6O7&h zi50&9QSl=RYa|wIy6C#<0(HS(fG(@_`Xl01MM5Z2bmn;O^}Y9;>&<4f8J-Puy?^avVtV#GAD353g~~b8dwKXl-3bUnM_n_T|)_eI19nILRRM1Oj#jE z065cyWDQ{39jDi^ZFqJ5r;{)LdGqu6tKT`h&ClMocRj-J`i~P70dV^0=rmQc3D49= z`1{l^g9bf2u|>aqe9>}$6;E6A{@tAx^%fUebneC37JdKxUD#xCUjEvm4{x8e==UG5 zwCL0OZi@zge(G;)8MqK|9cq>BYkXLsj7#vlTW-ws1Jtn3M2-;Xc*zaMrqFoFgPAT6 z_JoQbgoS2vF1RVjD&Y%G5e|)Huizr-Yh(u741JYm%<$&!9g=}734zF#%yN3rSA{gX z?5hOf-aY6STB9@*!AiObj=Ndlz zw@lB5s^0?{QfW)ro^BP~&|wht2a?SNCQXL}iD?<~#e&C$FeNxpGZD%h$CxTz!X=8T zZbcbeOBw;y1(nT?MR_%GUFC-Q{YEQRsp_mzp;vsx#CTF?yGcA`G(xw@J}Wb9%sQNa zvdea<9jg7Lri!~O0-=K^9jrIwbIE%t4dRP(5O5j#X@k2UoeM#?2`QYorpiC*Eul46^gp)W6L>G$^`R5CQQau zD%q}LrkGb+R4WUv4P*9bYa_t0HUQ@HxbRN59F9-jZGtiEFFfhV>@=w^_?Ai$F{xh hP7fkOE4t4GwN$TceU8u=D!Qfqw~FlyriG-9_!ovdtd9Ty diff --git a/gameq/tests/Protocols/Providers/Sevendaystodie/2_result.json b/gameq/tests/Protocols/Providers/Sevendaystodie/2_result.json deleted file mode 100644 index 3cb6e24..0000000 --- a/gameq/tests/Protocols/Providers/Sevendaystodie/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"173.234.30.74:22814":{"AirDropFrequency":"72","AirDropMarker":"False","Architecture64":"True","BlockDurabilityModifier":"100","BuildCreate":"False","CompatibilityVersion":"Alpha 15","CountryCode":"XX","CurrentPlayers":"13","CurrentServerTime":"31744145","DayCount":"3","DayLightLength":"18","DayNightLength":"50","DropOnDeath":"0","DropOnQuit":"0","EACEnabled":"True","EnemyDifficulty":"1","EnemySenseMemory":"60","EnemySpawnMode":"3","GameDifficulty":"4","GameHost":"All Night Gamers (B) | Admins | USA | PvE Only |","GameMode":"SurvivalMP","GameName":"pion34","GameType":"7DTD","IP":"173.234.30.74","IsDedicated":"True","IsPasswordProtected":"False","LandClaimDeadZone":"15","LandClaimDecayMode":"2","LandClaimExpiryTime":"7","LandClaimOfflineDurabilityModifier":"0","LandClaimOnlineDurabilityModifier":"0","LandClaimSize":"21","LevelName":"Random Gen","LootAbundance":"100","LootRespawnDays":"30","MaxPlayers":"50","MaxSpawnedAnimals":"50","MaxSpawnedZombies":"75","Ping":"-1","Platform":"WindowsPlayer","PlayerKillingMode":"0","Port":"22814","RequiresMod":"False","ServerDescription":"Friendly PvE players wanted","ServerWebsiteURL":"","ShowFriendPlayerOnMap":"True","SteamID":"90105371909004295","StockFiles":"True","StockSettings":"True","Version":"Alpha 15","ZombiesRun":"0","dedicated":"d","game_descr":"7 Days To Die","game_dir":"7DTD","game_id":251570,"gq_address":"173.234.30.74","gq_joinlink":"steam:\/\/connect\/173.234.30.74:22814\/","gq_name":"7 Days to Die","gq_online":true,"gq_port_client":22814,"gq_port_query":22815,"gq_protocol":"source","gq_transport":"udp","gq_type":"sevendaystodie","hostname":"All Night Gamers (B) | Admins | USA | PvE Only |","keywords":"1;1;1;1;0;0;4;1;","map":"Random Gen","max_players":50,"num_bots":0,"num_players":13,"num_rules":51,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":4929.2446289062},{"id":0,"name":"","score":0,"time":4928.4418945312},{"id":0,"name":"","score":0,"time":4926.47265625},{"id":0,"name":"","score":0,"time":4206.7333984375},{"id":0,"name":"","score":0,"time":3436.2412109375},{"id":0,"name":"","score":0,"time":2710.3879394531},{"id":0,"name":"","score":0,"time":2329.5681152344},{"id":0,"name":"","score":0,"time":1564.7233886719},{"id":0,"name":"","score":0,"time":1412.8809814453},{"id":0,"name":"","score":0,"time":1029.9963378906},{"id":0,"name":"","score":0,"time":752.91870117188},{"id":0,"name":"","score":0,"time":715.45239257812},{"id":0,"name":"","score":0,"time":489.68960571289}],"port":22814,"protocol":17,"secure":0,"steam_id":90105371909004295,"steamappid":0,"version":"00.15.00"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ship/1_response.txt b/gameq/tests/Protocols/Providers/Ship/1_response.txt deleted file mode 100644 index c34eff3e9b9a8f510fe3cfb9c076ed3e4241a7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1054 zcmZuwO>fgc5Z!V?^cQf6*O|qtUrKQ&Frqjvt_U?Z2eR-V;0#&xM z%?(g1e65`LR^wzDA3tA-*P`genRs!QB`N>1D{;QtopYZ3&C~1Ch43bCT>$|p-ynHq z8<8cmB#VXyAAE3JRq3Z zn_#8OOM*%(qrw4#)&&@-aKIgcvyBf=a?801y@QTR>;qUEd_d<9P=l|vs_H{PXoHnx zy{|zLOA3^rOTu3*HgYSnzKB?oRz8TjqP7Viyj0kPNN|N*k?p?Te>^52wiS9?DngFu zH+e;{QDG|luz66YWr2Gq_`%8W11&Q}bdSZwke41m!k6Y~5%|{mL zYej1d;n`Rxwo$l|?HDlzj0dX>9#51z<9i68ABLtkR!PJL);xv&7#y^|NBvA>jSxIb irL~U#3Wl|TAZu0!o+k(Cb8XK6 diff --git a/gameq/tests/Protocols/Providers/Ship/1_result.json b/gameq/tests/Protocols/Providers/Ship/1_result.json deleted file mode 100644 index 0d4cfe4..0000000 --- a/gameq/tests/Protocols/Providers/Ship/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"198.100.156.163:27017":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","game_descr":"The Ship","game_dir":"ship","game_mode":0,"gq_address":"198.100.156.163","gq_joinlink":"steam:\/\/connect\/198.100.156.163:27017\/","gq_name":"The Ship","gq_online":true,"gq_port_client":"27017","gq_port_query":27017,"gq_protocol":"source","gq_transport":"udp","gq_type":"ship","hostname":"**|multiplayerbrasil.com.br\/forum|** SHIP USA1","map":"raifucu_maru","max_players":24,"metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"0","mp_weaponstay":"0","num_bots":0,"num_players":0,"num_rules":51,"os":"w","password":0,"protocol":7,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","secure":1,"sm_nextmap":"krassin","sm_updater_version":"1.2.1","sourcemod_version":"1.6.3-dev+4580","steamappid":2400,"sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_stepsize":"18","sv_stopspeed":"100","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_password":"0","tv_relaypassword":"0","version":"1.0.0.16","witness_count":2,"witness_time":1}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ship/2_response.txt b/gameq/tests/Protocols/Providers/Ship/2_response.txt deleted file mode 100644 index 7f1697be52458730acb621f0360c4798d6bb5cd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1322 zcmZux&2G~`5Z<=56&2#Z69j~~AX%}S(n3!qg#rgu3Dg4@Gg(jKrTb%c*GYpa)F1ZDvBcho@bdZYc5kzou{E~7ktTimrO(*T<>d~EFOIiaASv*evgWzE zUTdL@g2Hokz1~8*Y-0&+w9sJ1y3;~?D`@jXoQT2-woYL$A6^c(j)a|mtr5qO^Yro2 zFev`qV$rT1M0xgu&Vc{E&tmAWdky~mQFA^ay|#!~`^>4lt_rHc=2Nsz7|qfoOH$@W z9bk~8{XpdNjmnKMAfPx7&_6(si z+W8gTP&SLMf*F+`1!z&6N7{+Tl;BD!CgoBPYHzqT&Xpi6Q3~WB#};Wkn$Hu()`$7pfzYii~zmz|49LBD7#Ub%qFhMtl(nl&0?lbc-VqzPBq`aW?_YH zN5@uh9~UbGk2{?u(;6w8Y*|xR06tW!_n!E4_eKW%ty(vH9l4ILRSbe* zJA}e^MX55{2M_YRDSB!IN7OK)F2rT1pmx!UJ&Cu_5tSQL(NWN)Ea{(!m&EqeQ>2Sf Rfpars3-S}xu_#%``UA^Fujc>& diff --git a/gameq/tests/Protocols/Providers/Ship/2_result.json b/gameq/tests/Protocols/Providers/Ship/2_result.json deleted file mode 100644 index a5b7beb..0000000 --- a/gameq/tests/Protocols/Providers/Ship/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"95.211.30.23:27017":{"coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","extended_advertisements_version":"1.2.8","game_descr":"The Ship","game_dir":"ship","game_mode":0,"gq_address":"95.211.30.23","gq_joinlink":"steam:\/\/connect\/95.211.30.23:27017\/","gq_name":"The Ship","gq_online":true,"gq_port_client":"27017","gq_port_query":27017,"gq_protocol":"source","gq_transport":"udp","gq_type":"ship","hostname":"mucosmos.nl Pakjesboot 12 : Cruise ships","map":"cyclops","max_players":32,"metamod_version":"1.9.2V","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"1","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"0","mp_weaponstay":"0","num_bots":5,"num_players":7,"num_rules":55,"os":"w","password":0,"players":[{"id":0,"name":"Shipmate1","score":0,"time":-1,"deaths":3,"money":1750},{"id":1,"name":"Shipmate2","score":1,"time":-1,"deaths":1,"money":4720},{"id":2,"name":"Shipmate3","score":3,"time":-1,"deaths":0,"money":4750},{"id":3,"name":"Shipmate4","score":1,"time":-1,"deaths":3,"money":3830},{"id":4,"name":"Shipmate5","score":1,"time":-1,"deaths":2,"money":3300},{"id":5,"name":"GiGidri","score":2,"time":252.12991333008,"deaths":0,"money":8830},{"id":6,"name":"Airyqueef","score":1,"time":193.14128112793,"deaths":0,"money":550}],"protocol":7,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","sb_version":"1.4.10","secure":1,"sm_cheat_version":"1.2","sm_funcommandsx_version":"2.3","sm_nextmap":"huronian","sm_updater_version":"1.2.1","sourcemod_version":"1.4.7","steamappid":2400,"sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"0","sv_bounce":"0","sv_cheats":"0","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_stepsize":"18","sv_stopspeed":"100","sv_voiceenable":"1","sv_wateraccelerate":"10","sv_waterfriction":"1","tv_password":"0","tv_relaypassword":"0","version":"1.0.0.16","witness_count":2,"witness_time":3}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ship/3_response.txt b/gameq/tests/Protocols/Providers/Ship/3_response.txt deleted file mode 100644 index 5b3afd47f083f2e40b1a9d651ead8e275896c1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1882 zcmcJQOOG2x5XXB1OR@`O!%MuE;kLXikJtNvaEUyI1vYHRI17r9OuMJ-X>HH+(A{Il z(IUYC356?s0VKqgZ-5Y7;J|@1`3#5)5+_sL;~5Xx1Wt@4&(!ZSz-Mz8-+&)dC{d_P0MV3%VzTXX&OV6#!^PUoI zSLk$!b}DqHM7tGQDbdRnS}l>^tk}I3TabW& z;IV^L4!JYee)uYQycdIakw#vaX9^O^rcQePqZ`2!8-Be9mVf&Gjo`_5_YS=MZqMuO zb-m!=_0T)G(tFlLz4zCb-KRoOoC@!V3xS=pm%jN$_vs6%p^EEbS1-OZ4%Ry=*JkR4 z35;BWmwr7TJhRcdb;o^UfasSpuO z=m-jX0yLAUHkG@?wH4@$PH>Yhfs{rY$n@M4RL6pk;(0=v8_AT^I;LEqO9YIHp@I){ zNO8dN?VfK*aBWCDQh0plHRF&P3sA%z$;sQ7I^_ZiwMa~dTmk0O z8=2`0Aj0Ghq>>4qQN{q@0{l%RTh^_hg`)%b$ZmDAtZ>2ZU}`jrxMJmmUYn~ew^A(} z3&Q}c`2?Hb7VbcYiZkQdZ-a-mlSNZWA&S*nMO_xqbR=x6ta};Uw$?!ADVr;g z6Iv}@O)E3ngmyZ30_BKeWjGIpild_FvE&ROr2{+#Hw+ogwX@uruo$S(=*pzb@D`yN do+mIBfwBauN{k}GXy0+KnuMG~q)Dnw)d z^#Fry5KC|v^L)x&czu?eUt4ea=+r5UUd&@bNz+|Qt$tUC;59F~Eidl;gXUPHnoe)j z{pI8_zs~ZsK0gxi38}QOloY(euEK=Tu{ZWeBXP-GN-3E44OnZqS`E7-Z7_hKu@zb? zdD&0=?=XTy8WdXf;A4L;ge4laVD4d0UOsn2nCP0E@kT}Zp@;Z13jV%^4y=s;g&&1O BU=aWS diff --git a/gameq/tests/Protocols/Providers/Spaceengineers/1_result.json b/gameq/tests/Protocols/Providers/Spaceengineers/1_result.json deleted file mode 100644 index 99dca11..0000000 --- a/gameq/tests/Protocols/Providers/Spaceengineers/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.85.14.202:27016":{"dedicated":"d","game_descr":"Space Engineers","game_dir":"Space Engineers","game_id":244850,"gq_address":"66.85.14.202","gq_joinlink":"steam:\/\/connect\/66.85.14.202:27016\/","gq_name":"Space Engineers","gq_online":true,"gq_port_client":27016,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"spaceengineers","hostname":"The Silent Void","keywords":"groupId0 version1157012 datahashJf7\/v9oenRRbnjLNyYXVYTtG4dI= mods0 gamemodeS10-5-5 view12000","map":"TSV Fresh World","max_players":15,"mods":"0","num_bots":0,"num_players":4,"num_rules":1,"os":"w","password":0,"players":[{"id":0,"name":"Dvsmessiah","score":0,"time":12671.053710938},{"id":0,"name":"Siredon","score":0,"time":2498.3591308594},{"id":0,"name":"wernu123","score":0,"time":2380.4106445312},{"id":0,"name":"Not CavnFox","score":0,"time":633.91241455078}],"port":27016,"protocol":17,"secure":1,"steam_id":90105363286642693,"steamappid":0,"version":"1157012"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Spaceengineers/2_response.txt b/gameq/tests/Protocols/Providers/Spaceengineers/2_response.txt deleted file mode 100644 index 247eab7dcecd617bde76cd370e2622a67a90015e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1004 zcmZWoO>Y!O5G{ffA)gY(*PwzNSV!32u~}?Kij?(E`wMKXyh|KFKD4Ksoyp8}Z@Oo_ ztiXT}2gnIU1R=;FAaMsGBntuu5^fyEhg_maxkdR22nj7Uy(X8m=FnC3s-|AotA4-V zU;KDEQt~i14Hpu*5;zyN!t5~4%M5$EWAI>)8#)J3s{>g7x<1ZESL?9c$+Dz($YMP* zJd^eSmQEZ)wlY5gjW!P?GS#BO(%Apm0K>x|y0FLdDpO@|0v=wCK0I=2`}F>=_Oy)d zv=>DgHz_mHY8QfnXFTLK96!nH)p#*csR*aPomf>%d~Ru~aeQSw{t{Cy>rDqWoWyVp+`*no=-E}Y}#-;Wv0CRz{7tqZ>} z$ZzM@^Plsd@*nd%`K|n3e%(QT=-y&5Pfc_NO?||^r=~iIiGtVx9)5PsB|py}gkZL{Oxtu@9pXS^7GY9+NkIM{7&9TL?l@Zy}W-Qi9D;q~W7p~nn!Jt{Vw6oWa z9%As@%_MFQ;&VhM;3Jof>J|ysHYA2aUM5q0i!q+~_16=VvFqX{;5Y379ilWsx+< z0wSLFuv8Vol5UjjIqkbG7%9M$u;n+;Vb!GCNP#sHmElF;2o%J07wbHTaTJ@8$_P+w zPA!pKAl68iY=yt5D#M!g3^tK_F?Lsv;$wg)(VV vpTQu*Rh!zac3fr|Ee9@>nkac1PWxv)Z{3$%G-VJL|KVAeC-HyvEzH0>oY_aE diff --git a/gameq/tests/Protocols/Providers/Spaceengineers/2_result.json b/gameq/tests/Protocols/Providers/Spaceengineers/2_result.json deleted file mode 100644 index d7fceb3..0000000 --- a/gameq/tests/Protocols/Providers/Spaceengineers/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"149.202.89.108:27016":{"dedicated":"d","game_descr":"Space Engineers","game_dir":"Space Engineers","game_id":244850,"gq_address":"149.202.89.108","gq_joinlink":"steam:\/\/connect\/149.202.89.108:27016\/","gq_name":"Space Engineers","gq_online":true,"gq_port_client":27016,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"spaceengineers","hostname":"Mine, Trade and Fight, Get your \"yarrrr\" on! PVP\/E-RP","keywords":"groupId0 version1157012 datahash\/YaPAkIlnmdh8j2RnJaFJ7SLN\/k= mods9 gamemodeS15-10-10 view15000","map":"Muttly's Pirates! (UK ENG)","max_players":20,"mod0":"customrespawn","mod1":"Skybox Nebula GB318 C","mod2":"Frontier Economy (Adds money and Trade)","mod3":"}DT{ Armored Camera","mod4":"Window Pack - Tinted and Clean Blocks","mod5":"(DX11) Kolt - Command Console Pack","mod6":"Midspace's Admin helper commands","mod7":"(DX11)Letters Mod","mod8":"[Dx11]DeadTech - Catwalk Pack","mods":"9","num_bots":0,"num_players":20,"num_rules":10,"os":"w","password":0,"players":[{"id":0,"name":"Zayas","score":0,"time":6295.2783203125},{"id":0,"name":"Harrold Finch","score":0,"time":6288.572265625},{"id":0,"name":"Adolfin Hittlerin","score":0,"time":6236.8291015625},{"id":0,"name":"Dave The Rave","score":0,"time":5983.0551757812},{"id":0,"name":"scadbad","score":0,"time":5819.9711914062},{"id":0,"name":"Blood","score":0,"time":5743.8110351562},{"id":0,"name":"КÐРМЕЛИТÐ","score":0,"time":4878.9462890625},{"id":0,"name":"Garrus","score":0,"time":4424.6328125},{"id":0,"name":"Hulrick","score":0,"time":4388.4614257812},{"id":0,"name":"Коварищ Коталин","score":0,"time":4186.6259765625},{"id":0,"name":"(T.I.N)egor.kononskiy","score":0,"time":3417.2663574219},{"id":0,"name":"Tonono","score":0,"time":2675.3962402344},{"id":0,"name":"Ölkpy","score":0,"time":2191.8518066406},{"id":0,"name":"Sanderman","score":0,"time":1766.822265625},{"id":0,"name":"Retsu","score":0,"time":1021.1619262695},{"id":0,"name":"Escobar Pigeon","score":0,"time":726.12756347656},{"id":0,"name":"FourWindBadger","score":0,"time":673.96295166016},{"id":0,"name":"Charlie","score":0,"time":631.20275878906},{"id":0,"name":"Thomasgk9","score":0,"time":591.62518310547},{"id":0,"name":"Garroshek Hellscream","score":0,"time":176.64654541016}],"port":27016,"protocol":17,"secure":1,"steam_id":90105371831186438,"steamappid":0,"version":"1157012"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Squad/1_response.txt b/gameq/tests/Protocols/Providers/Squad/1_response.txt deleted file mode 100644 index a2d2cf6ee336809061dbd4d604a065d0def7a1c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2780 zcmZuyYm6IL6+S^wN~juw6iN!DLj<6ZAVtJSsV+H-ft zbG`Gh*VeYB&{oibN=qnG)S&XHk|Ll%RHC736(vX%5eiBWsO=A=3JLWOph~EqiY#Yl zy&{6nkMX(RdCYen_jqS#XD5GfbwLx?gd%N|<^T%ZAf6zKn$U}ZyXg}hwD1jJR6y?o zkmJdT)I=;2orp$LGc)iL^TFrP+8Yl8nSs$(eDrUe1@Z2&E#? z$aFFikEEuevG`0hK2nv%l017OgYinNB1%&AT|7`zQLDAtL?W3O*JMr0t7WAqX0_R9 zA`0J!n;>}hZ*T9%ymsV+pjf2st}{qLmUL)|>vY`(%q=`FQpaW7M&y4pDzYZEU7FX? zbt;ieCZ}KoX{;SZhvkAXwV0?3Gg9w$k;EGxNzE_dUN!c1jGSC*qQ`tnlN zPR8b0g>7_m@wgmu#pb~2+`uM=Y+8A)6e?5wx|h=DiaocktQ6RAlBElorf0_a#!OU> zvn{q2*ZX!-6eBUysM4mItxmSb=p&E*|AlECoSX9yHqn$`I#p_GF z+lfVb(<}9Pxw-6aRI{nbd@i>k<@8#!Tf2eH6tbzvhBZAunM}{wDSylylC%=->SJ3y zb(y*ul4;kc{j6g~?UZXpHW$+QGOtIMXl-6I<`aWOb;E4TEY<8-5u)$7MX~I5A2N@{NI?3RKb|RjbjF*F?$z}(U?InW>6un+vkqH z-hdXdTnZJ745*XgzU>8*g%%-Dr7m@PbPtb%CX3Zft{^Yh)vBanVKTn!@ebnuom&Xz zc5hxKBOG6N`pV6@U1|K{p0soIdUh9k!QPX;`1;uqcIKz2N75&)Cq`2KdykByTcckd zNtZwNrIECB?B0>|xwEyA^p$_!Ig&ch>`70(c5H+#zwfq@v?(7NN!HeZku-bss(&WJTQggQQcT?Wm!tU<%^cf0bQxBnr7 z7&PmPO0(Z)E=6Py7P$88N-4Fvko(_}hms<7b?p zS_jb6d-+8f=F~YAWq`*%^nwfpMtgRcc&GUMh+Ol+ISi!m+*)bSq!#l#q5Tt2en$q< z<<0dl?L&Dy&XI1g`_|LU(cRGMFLym9L)NEGP++B^!8=He{p}3agSouHbVh8i#BCF< zqW$mPCuK;pwvZk;yIp$m;nV1klE9rIvq;)E4Qryi6+wgxW7g8iuf zYSELSmXn2ySb-h_4*>!}jqtkJW>EhRBYGiAWvFo8WmMwa#NJ* zc=uhkAP?qRgE`iLTQNZ8=_-;csM?w!rnP(-35S8dg_{yghnmz8m~Hl$%RKIc?LYdG zD#M9HhV)KkD#eMyK-VWqVYgqoR**rgR@HiFctS=H=atwG4VcyDL2l)DTR^Xj^t|+R4K#A8;IOL9UNJYSi>4JYw$rx?qBbJRf4qT zQz3{VXnxnB9STR#<5vgIOF^e}i*~~|d=ydR?6VU7e{A|pZ{U5So*NqPQ-3UhYmmO( zX*PMML8B04luIM5af32=FbH`Rk3~j(kJ^~LkTLwGX;C-q;F;$hK!&7?b+6K`WHQX> zD{Rf76ZBT1@uQk#7pDK zvB~ZYv8L~ppp-A?^J!fAK}|e6X_6U3kA}q@By^yJwA{?p*nX6 z&RNrJ;BwO;j+$={Q6u^uG7Zyt=LfC?tLa!_t;RdtbGVIvd~h>bzSVLhDA=rRc!Jsz zf)$eECLIWs;2mBjMKzHh$5b4mH*jut;Xj>Ym?UqIaQs$JwI!&F)pbeDhU8*bY7%tN z0UHyp%s(HVmp~#t)3-uSl~>9V5{8o6}o)IpUOSu3vbr8$ukU(1 z*O`a+k^BI`N;Cx}X(ie~9}%qtK?G7LkRL4p#E%qFUM+=&Mim8>A0QQ|f?A{|oEeX$ ziXwr3Sl|8bx#ym9=DX+K>({Se&uyKLj%TKq76ko>N18&F7%nr2DQJ|K%;^euMTGfu zT3-O&>k^v@h=qO(9N!v(H2~17Kyw9vj3viY<54j(9*Lylad@h;qu6r$FBTSD~F-`^ObqvDf%@X5i)N^LJ-JYx8cybHM*vmrriZ zfS%NawBr!RVOC%^v#~h?iWZ*~(@HI{yDGsj&pY2yK@&@n65Ni)uN;0`1&LbAY%&!| z1(Cg}{z(PLC05fRCb#HfByb@czeG!u^QP%JZeaP`NdBU@rRYwMm=1She>feeNUQP=mnX@ITM0pwAYCDvDpImrL28 ztoy(HI0j9rLxWAeJCDQptdd<2q6K$ckcizNg66S43EWIP^{5INy2`C;KOm+yom8RP zrZulIo`*}w{k5=xE(T|NSCcsgZ{VND+_5Ze*}?z(`4`!IycVy1!L}d$7XaX8jl9SKQo;TldXJ6^4*xO z&5SmTpqu@V?#J|*(c!HnkNV$pDOfY|yL~F8owkR0TC7LR#ppyZv9RkCSkMkL%@((p z=};C||F~BLC0$P+Di@`k8kioxkiv|$TxFrULOLBr!N47-ZbEj7yAodwtUmLFBqmMU zU1ANg_^E`%3UM)YU*OL?oxo4trlz@$BY?NQHtCN&+h{wnL4sRiA{Lw5_;pQYF`>#W zzeE5Bx9w3OA1M@KnjmI`i9!KxL;8+wqbeLaq#gVi-wrW@{Jxo|f;14cy@9_(cUI?DP_`I)uR%XHB*#?O`eW6a1KXzXCG1 zS|&4G+H6ys2PJ&@PUMTMWAm}GApQ$JA#?vMnL>u!4Lqj)S=s*lQ3Zlb1G68_Eh^A5 zNtY%kB5)KpzUwbl1(tcASr!97{nt+=m0@C%O`1(=5Bk6vf)jOS7^F*90_ROX z37o)%FJFl&P$(DjIcVeX-o3Y@d7C*My0*&^B%8Y!eh|gYXE!V0hS%JfO-+s$*=AgG z>$dkP;Gp^_lFX%vV4I3}O$LqkakZb)x#U$Dat3X3&rKww!QLnCctZxAv}`;V+tJZW zKlpw}IhW?*CUb@|)t&&kllMnii8RoM^!ScdtG$BPRYQxttI z0=!fDo(u{RB({WYbRdw|%cpU>HnH)m`#<-s2V^|^9y)h~DPq!r7+*YhQieR^flaUc zIgFsqXe$`L@b-ob5*{j4LC|V_HkJHzVB?~wg=tO$%TqfKV7|Ivm9%LpWZ?T!VTT_A zvoun%sl%GsA_MdO@}DJ)*LK@uRg8~2{>K1VnfQ%_0wW!&a6fr~o2P#+4R2(1D`ZTv zVGTuq?H8Honz%GB#!?ee2q~Q{MR0*^lz2Q- zG{v>}Dkr_BdSphf_i9s<#gf@@;^lm;o^Yzt=;|zQrL%IiF7Z(|$K+~hS&N(9+PY$T zlZld8%4_vLk+sff#pF(5aw;?0??=}oo)O8qb5$=|?)Ce#X^}|zJgL>nnHhJ*DaYOw zO%$VPup>!hc~qKRTTQObCTgUZA~lhg8cC5mozg^3QyisjQE9S2rOkEQ>!tj3YNEQD z*KI}2^x{%1J6G$i6>3Y%%iWlAurpVZie|l;T%Rk%#kHAHE7fZEv1#WmkM-7^c3Gcw z_EcI%ay6=$<#$CB!)TmzbX9Vvip%*#x*}7zH#1S6%d2VoNTN`gGaX$wBy&$BT21E~ z>z!=N>cm@WQZ!v{IWps{vV$qTBS-W4OuRqaih4$^Vdbnn+RVOvct5&EyUMy0Psw5n zB2jT%41O?t^}%~yec_b<>Koo$|MN{6zWV-)Gn}cEwJIbM$plpJ<*>r-=3)a{#Kb$c zVv;p#%iObEUv#OE(D44X`*g@hKv&b6Je61H>SayQeLdlU#kQ=gx}GbSGKF+jhe#p< F{|2UNkOcq$ diff --git a/gameq/tests/Protocols/Providers/Squad/2_result.json b/gameq/tests/Protocols/Providers/Squad/2_result.json deleted file mode 100644 index 2c52aeb..0000000 --- a/gameq/tests/Protocols/Providers/Squad/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"167.114.220.151:7787":{"Flags_i":"7","GameMode_s":"AAS","GameVersion_s":"a-8.9.201.11966","LicenseId_i":"603942","LicenseSig1_s":"CcNo6FMl0y6xoapdEqQCWpVH5MNlbs6OKVW7sTB+xUofAGCTWBo+iYiCTNjR6lmVzDlu57N0NKRWvaCRk+PlosL5HF+vv2z1uc1GtYTu2OpvvUA0aBKKaVVOFQtwsO3","LicenseSig2_s":"biq8cj+BUyx8yU7VaM9aV0eNb80oskN4IRDsDhneB5vHRYmhzNKJ94TxKSrD0Fp6B3GYVpyLVgjjm3DXkYNBMlWd8zYL60yQ+n9fhvWraKnuipyshOSUs\/Pfc8x2DlO","LicenseSig3_s":"sA2xBtHMjK7APCetpQ4WYKEArq7LPYlsSScBl\/12TAIbzkGfnk6fE80ltRj1QsxiX9SkC2KSQ6vUf2ucVbnIn\/RQ==","MatchTimeout_f":"120.000000","OWNINGID":"90105791577239556","OWNINGNAME":"[2.FJg] Squad Tactical Realism #1 [AAS]","P2PADDR":"90105791577239556","P2PPORT":"7787","Password_b":"false","PlayerCount_i":"79","PlayerReserveCount_i":"1","SEARCHKEYWORDS_s":"Custom","SESSIONFLAGS":"171","dedicated":"d","game_descr":"Squad","game_dir":"squad","game_id":393380,"gq_address":"167.114.220.151","gq_joinlink":"steam:\/\/connect\/167.114.220.151:7787\/","gq_name":"Squad","gq_online":true,"gq_port_client":7787,"gq_port_query":27165,"gq_protocol":"source","gq_transport":"udp","gq_type":"squad","hostname":"[2.FJg] Squad Tactical Realism #1 [AAS]","keywords":"BUILDID:490802986,OWNINGID:90105791577239556,OWNINGNAME:[2.FJg] Squad Tactical Realism #1 [AAS],P2PADDR:90105791577239556","map":"Sumari AAS v3","max_players":80,"num_bots":0,"num_players":112,"num_rules":17,"os":"w","password":0,"players":[{"id":0,"name":"","score":0,"time":154039.0625},{"id":0,"name":"","score":0,"time":153602.5},{"id":0,"name":"","score":0,"time":149301.90625},{"id":0,"name":"","score":0,"time":145118.34375},{"id":0,"name":"","score":0,"time":142885.59375},{"id":0,"name":"","score":0,"time":139116.53125},{"id":0,"name":"","score":0,"time":83586.9609375},{"id":0,"name":"","score":0,"time":80933.984375},{"id":0,"name":"","score":0,"time":78047.5078125},{"id":0,"name":"","score":0,"time":73529.203125},{"id":0,"name":"","score":0,"time":70843.7421875},{"id":0,"name":"","score":0,"time":68399.8671875},{"id":0,"name":"","score":0,"time":60953.25},{"id":0,"name":"","score":0,"time":57988.30078125},{"id":0,"name":"","score":0,"time":52424.0625},{"id":0,"name":"","score":0,"time":49786.5},{"id":0,"name":"","score":0,"time":49016.8515625},{"id":0,"name":"","score":0,"time":47529.11328125},{"id":0,"name":"","score":0,"time":47422.1796875},{"id":0,"name":"","score":0,"time":44765.57421875},{"id":0,"name":"","score":0,"time":37028.6796875},{"id":0,"name":"","score":0,"time":32070.162109375},{"id":0,"name":"","score":0,"time":32018.318359375},{"id":0,"name":"","score":0,"time":27256.669921875},{"id":0,"name":"","score":0,"time":27225.5390625},{"id":0,"name":"","score":0,"time":27211.68359375},{"id":0,"name":"","score":0,"time":27128.201171875},{"id":0,"name":"","score":0,"time":26956.51953125},{"id":0,"name":"","score":0,"time":26136.283203125},{"id":0,"name":"","score":0,"time":20071.873046875},{"id":0,"name":"BlackLabel","score":100,"time":13432.658203125},{"id":0,"name":"Lucid Screaming","score":0,"time":13212.25390625},{"id":0,"name":"dirtion","score":-2,"time":13149.634765625},{"id":0,"name":"aR | MajorMalfunction","score":-2,"time":12011.487304688},{"id":0,"name":"â™  CapriSol","score":0,"time":10860.17578125},{"id":0,"name":"Rhombus","score":-1,"time":9316.212890625},{"id":0,"name":"S8S Assassin","score":0,"time":8737.3291015625},{"id":0,"name":"DR650ADV","score":-1,"time":8208.7392578125},{"id":0,"name":"","score":0,"time":8099.384765625},{"id":0,"name":"R0N1N","score":21,"time":7979.607421875},{"id":0,"name":"Benji5919","score":-2,"time":7304.7436523438},{"id":0,"name":"standsalone_1","score":-1,"time":6668.4077148438},{"id":0,"name":"Bloodlust","score":-2,"time":6427.3481445312},{"id":0,"name":"Centurion","score":-1,"time":5658.8579101562},{"id":0,"name":"Mastec","score":-2,"time":5645.4565429688},{"id":0,"name":"Hook","score":103,"time":5616.6625976562},{"id":0,"name":"itsalphahotel","score":5,"time":5508.2094726562},{"id":0,"name":"","score":0,"time":5438.794921875},{"id":0,"name":"SUM TING WONG","score":100,"time":5110.2807617188},{"id":0,"name":"Reese","score":-1,"time":5099.4633789062},{"id":0,"name":"[GDG] 2Lt. Barba Ruiva","score":0,"time":5046.150390625},{"id":0,"name":"FexonTv","score":0,"time":4608.16015625},{"id":0,"name":"TheVub.K","score":200,"time":4265.615234375},{"id":0,"name":"[2.FJg]'discobiscuit-Gefr","score":100,"time":3965.9912109375},{"id":0,"name":"Waistband Wiener","score":0,"time":3739.8459472656},{"id":0,"name":"GunWrath","score":121,"time":3524.6040039062},{"id":0,"name":"Hertog Jan","score":0,"time":3504.4636230469},{"id":0,"name":"Blitzkrieg262","score":-1,"time":3188.6708984375},{"id":0,"name":"","score":0,"time":3105.64453125},{"id":0,"name":"Gultrich","score":10,"time":3065.8278808594},{"id":0,"name":"Sickofguessing","score":-1,"time":3037.5024414062},{"id":0,"name":"Ashurbanipal_24","score":-1,"time":3010.4602050781},{"id":0,"name":"ikillforjebus","score":-1,"time":2990.2473144531},{"id":0,"name":"DAWAZOMBIE","score":-1,"time":2971.5336914062},{"id":0,"name":"[RIP]Twakkie","score":99,"time":2960.830078125},{"id":0,"name":"HotBox","score":-1,"time":2952.8444824219},{"id":0,"name":"Wehmann","score":0,"time":2948.1743164062},{"id":0,"name":"water","score":100,"time":2939.2958984375},{"id":0,"name":"Chellz","score":0,"time":2906.560546875},{"id":0,"name":"Churchs32","score":-1,"time":2819.1901855469},{"id":0,"name":"Tortellini Tony","score":0,"time":2801.396484375},{"id":0,"name":"K1LL3R 0F 4LL","score":20,"time":2737.3806152344},{"id":0,"name":"ZZEZ","score":-2,"time":2553.7214355469},{"id":0,"name":"terrorist","score":99,"time":2548.7641601562},{"id":0,"name":"Ben","score":0,"time":2219.509765625},{"id":0,"name":"Phantom","score":121,"time":2216.322265625},{"id":0,"name":"PzRSpeRRe","score":-1,"time":2079.1640625},{"id":0,"name":"[NOOT] Walton","score":-1,"time":2075.9592285156},{"id":0,"name":"[TCO] Sgt. Rock Fury (SAC)","score":133,"time":1529.4525146484},{"id":0,"name":"Bad Bankai","score":11,"time":1275.3878173828},{"id":0,"name":"SneakyCreeper","score":-2,"time":1113.5192871094},{"id":0,"name":"Conflictedhero","score":-1,"time":1112.8702392578},{"id":0,"name":"Mikro--","score":99,"time":1112.8662109375},{"id":0,"name":"Colonel Forbin","score":-1,"time":1007.2048950195},{"id":0,"name":"error","score":99,"time":893.40234375},{"id":0,"name":"flame841","score":123,"time":851.67401123047},{"id":0,"name":"jovinni","score":110,"time":738.27966308594},{"id":0,"name":"[NOOT] Bradders","score":-1,"time":737.525390625},{"id":0,"name":"Wiccamaw","score":-1,"time":716.00665283203},{"id":0,"name":"yaxa","score":143,"time":715.46636962891},{"id":0,"name":"LOLKI","score":104,"time":596.91003417969},{"id":0,"name":"Whiskey's Brother","score":99,"time":546.64154052734},{"id":0,"name":"tactical-reload","score":8,"time":520.34484863281},{"id":0,"name":"sniperelite7","score":-1,"time":508.91650390625},{"id":0,"name":"Rover","score":-1,"time":490.44277954102},{"id":0,"name":"Icedout782","score":143,"time":478.18405151367},{"id":0,"name":"Safran","score":29,"time":451.49090576172},{"id":0,"name":"Nossa30","score":-1,"time":419.14953613281},{"id":0,"name":"Copernicus","score":99,"time":403.9987487793},{"id":0,"name":"dustep2","score":-1,"time":389.19097900391},{"id":0,"name":"[FuoM]Fl00d","score":0,"time":364.61709594727},{"id":0,"name":"Da Big Man","score":0,"time":306.62420654297},{"id":0,"name":"Sharon","score":0,"time":293.94104003906},{"id":0,"name":"Thurnis Haley","score":0,"time":289.35803222656},{"id":0,"name":"Kio","score":0,"time":272.62060546875},{"id":0,"name":"Chief","score":0,"time":267.95175170898},{"id":0,"name":"Bill Bambus","score":0,"time":258.43923950195},{"id":0,"name":"Chitlin Joe","score":0,"time":192.14283752441},{"id":0,"name":"ISnipeAllDay","score":0,"time":158.29992675781},{"id":0,"name":"ShinRaPresident","score":0,"time":115.70793151855},{"id":0,"name":"Darth-Tronosh","score":0,"time":106.60247039795},{"id":0,"name":"SnakeDoc","score":0,"time":103.14464569092}],"port":7787,"protocol":17,"secure":0,"steam_id":90105791577239556,"steamappid":0,"version":"a-8.9.201.11966"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Starmade/1_response.txt b/gameq/tests/Protocols/Providers/Starmade/1_response.txt deleted file mode 100644 index ad6ea85bd47d6657e80bf8dc03450c2a6769bed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmZQzV5nzcVD#Rho^wg-|9{4O1_lOpHYR2}M>bU!2F{?=6ouf7%(M~~247`Eh2Yep zveY6)1&x5rqQsKaVjTs?6*D1d=ucT5TF)u~IDKRfQGcR2sxU#q; jHCIQ$IU}(|Avr%c7bsb*$po@=YskJ}MxcdCAR+|-fjTD| diff --git a/gameq/tests/Protocols/Providers/Starmade/1_result.json b/gameq/tests/Protocols/Providers/Starmade/1_result.json deleted file mode 100644 index 84d44d1..0000000 --- a/gameq/tests/Protocols/Providers/Starmade/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"red.shift.network:4242":{"dedicated":1,"game_descr":"#1 Server! (Pirates, Active Admins, Bounty and Banking System, Chat commands)","gq_address":"red.shift.network","gq_joinlink":"","gq_name":"StarMade","gq_online":true,"gq_port_client":4242,"gq_port_query":4242,"gq_protocol":"starmade","gq_transport":"tcp","gq_type":"starmade","hostname":"Red Shift","info_version":2,"max_players":100,"num_players":34,"password":0,"start_time":1424676404819,"version":0.18850000202656}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak2/1_response.txt b/gameq/tests/Protocols/Providers/Teamspeak2/1_response.txt deleted file mode 100644 index 214246c..0000000 --- a/gameq/tests/Protocols/Providers/Teamspeak2/1_response.txt +++ /dev/null @@ -1,77 +0,0 @@ -[TS] - -|| -OK -server_id=1 -server_name=Hamburg-Funk -server_platform=Win32 -server_welcomemessage=Willkommen auf dem Hamburg-Funk Teamspeak Server -server_webpost_linkurl= -server_webpost_posturl=hamburg-funk.all4funradio.eu -server_password=0 -server_clan_server=1 -server_udpport=8767 -server_maxusers=250 -server_allow_codec_celp51=-1 -server_allow_codec_celp63=-1 -server_allow_codec_gsm148=-1 -server_allow_codec_gsm164=-1 -server_allow_codec_windowscelp52=-1 -server_allow_codec_speex2150=-1 -server_allow_codec_speex3950=-1 -server_allow_codec_speex5950=-1 -server_allow_codec_speex8000=-1 -server_allow_codec_speex11000=-1 -server_allow_codec_speex15000=-1 -server_allow_codec_speex18200=-1 -server_allow_codec_speex24600=-1 -server_packetssend=1563401 -server_bytessend=216581381 -server_packetsreceived=1683583 -server_bytesreceived=138154385 -server_uptime=497728 -server_currentusers=3 -server_currentchannels=25 -server_bwinlastsec=3290 -server_bwoutlastsec=157 -server_bwinlastmin=137 -server_bwoutlastmin=3358 -OK - -|| -OK - -|| -id codec parent order maxusers name flags password topic -1 12 -1 1100 200 "Funkraum" 2 0 "Funkverbindungen in die ganze Welt!" -2 12 -1 1000 200 "Plauderraum" 0 0 "Hier kann ungestört geplaudert werden." -3 12 -1 23352 10 "Admins" 4 1 "" -4 12 -1 1 200 "TESTRAUM" 0 0 "" -5 12 -1 1400 200 "Digimodes" 10 0 "" -6 0 -1 1300 200 "Gateway-Test" 0 0 "" -7 0 -1 34463 200 "ZXSTICKY" 0 0 "" -8 0 -1 34463 200 "AFK" 2 0 "" -9 12 -1 1200 50 "DX Funk" 2 0 "Funkraum für Gateway- / HF-DX Verbindungen" -10 12 -1 5000 200 "US-CARS & Treffen" 10 0 "" -11 12 -1 3200 200 "Webradio und Musik" 10 0 "" -12 9 -1 6500 200 "GAMERBEREICH" 10 0 "Bereich für Gamer" -13 9 -1 6000 200 "Funkspiele" 10 0 "" -14 9 -1 1250 200 "Fuchsjagt" 10 0 "" -15 11 -1 1101 200 "Funkraum 2" 2 0 "Funkverbindungen in die ganze Welt!" -16 12 -1 0 250 "***WILLKOMMEN***" 16 0 "Begrüssungsraum" -17 12 -1 7000 200 "Operator" 4 1 "" -18 12 5 3200 200 "RTTY50" 2 0 "" -19 12 5 3200 200 "SSTV Analog" 2 0 "" -20 12 5 3200 200 "PACKET" 2 0 "" -21 12 5 3200 200 "BPSK31" 2 0 "" -22 12 5 3200 200 "HELL FM" 2 0 "" -23 12 5 3200 200 "FAX" 2 0 "" -24 12 5 3200 200 "CW" 2 0 "" -25 12 11 3200 200 "Mainstream" 2 0 "All4Fun Radio Mainstream" -OK -OK -p_id c_id ps bs pr br pl ping logintime idletime cprivs pprivs pflags ip nick loginname -6 16 40450 1924469 60903 1845286 0 2 497623 197 0 5 1 "0.0.0.0" "Flauschis-Freundin 110" "Flauschis-Freundin" -105 1 13823 381753 17873 5784359 2 61 14358 0 20 4 4 "0.0.0.0" "VL CB-FUNK-BERLIN Original" "vlcbfunkberlin" -106 1 3261 535080 65 14864 441 45 1860 984 21 4 4 "0.0.0.0" "CrosslinkCL5 FRN_hamburg-funk" "CL4" -OK diff --git a/gameq/tests/Protocols/Providers/Teamspeak2/1_result.json b/gameq/tests/Protocols/Providers/Teamspeak2/1_result.json deleted file mode 100644 index 2c81357..0000000 --- a/gameq/tests/Protocols/Providers/Teamspeak2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"46.163.65.181:8767":{"dedicated":1,"gq_address":"46.163.65.181","gq_joinlink":"teamspeak:\/\/46.163.65.181:8767\/","gq_name":"Teamspeak 2","gq_online":true,"gq_port_client":8767,"gq_port_query":51234,"gq_protocol":"teamspeak2","gq_transport":"tcp","gq_type":"teamspeak2","players":[{"p_id":"6","c_id":"16","ps":"40450","bs":"1924469","pr":"60903","br":"1845286","pl":"0","ping":"2","logintime":"497623","idletime":"197","cprivs":"0","pprivs":"5","pflags":"1","ip":"\"0.0.0.0\"","nick":"\"Flauschis-Freundin 110\"","loginname":"\"Flauschis-Freundin\""},{"p_id":"105","c_id":"1","ps":"13823","bs":"381753","pr":"17873","br":"5784359","pl":"2","ping":"61","logintime":"14358","idletime":"0","cprivs":"20","pprivs":"4","pflags":"4","ip":"\"0.0.0.0\"","nick":"\"VL CB-FUNK-BERLIN Original\"","loginname":"\"vlcbfunkberlin\""},{"p_id":"106","c_id":"1","ps":"3261","bs":"535080","pr":"65","br":"14864","pl":"441","ping":"45","logintime":"1860","idletime":"984","cprivs":"21","pprivs":"4","pflags":"4","ip":"\"0.0.0.0\"","nick":"\"CrosslinkCL5 FRN_hamburg-funk\"","loginname":"\"CL4\""}],"server_allow_codec_celp51":"-1","server_allow_codec_celp63":"-1","server_allow_codec_gsm148":"-1","server_allow_codec_gsm164":"-1","server_allow_codec_speex11000":"-1","server_allow_codec_speex15000":"-1","server_allow_codec_speex18200":"-1","server_allow_codec_speex2150":"-1","server_allow_codec_speex24600":"-1","server_allow_codec_speex3950":"-1","server_allow_codec_speex5950":"-1","server_allow_codec_speex8000":"-1","server_allow_codec_windowscelp52":"-1","server_bwinlastmin":"137","server_bwinlastsec":"3290","server_bwoutlastmin":"3358","server_bwoutlastsec":"157","server_bytesreceived":"138154385","server_bytessend":"216581381","server_clan_server":"1","server_currentchannels":"25","server_currentusers":"3","server_id":"1","server_maxusers":"250","server_name":"Hamburg-Funk","server_packetsreceived":"1683583","server_packetssend":"1563401","server_password":"0","server_platform":"Win32","server_udpport":"8767","server_uptime":"497728","server_webpost_linkurl":"","server_webpost_posturl":"hamburg-funk.all4funradio.eu","server_welcomemessage":"Willkommen auf dem Hamburg-Funk Teamspeak Server","teams":[{"id":"1","codec":"12","parent":"-1","order":"1100","maxusers":"200","name":"\"Funkraum\"","flags":"2","password":"0","topic":"\"Funkverbindungen in die ganze Welt!\""},{"id":"2","codec":"12","parent":"-1","order":"1000","maxusers":"200","name":"\"Plauderraum\"","flags":"0","password":"0","topic":"\"Hier kann ungestört geplaudert werden.\""},{"id":"3","codec":"12","parent":"-1","order":"23352","maxusers":"10","name":"\"Admins\"","flags":"4","password":"1","topic":"\"\""},{"id":"4","codec":"12","parent":"-1","order":"1","maxusers":"200","name":"\"TESTRAUM\"","flags":"0","password":"0","topic":"\"\""},{"id":"5","codec":"12","parent":"-1","order":"1400","maxusers":"200","name":"\"Digimodes\"","flags":"10","password":"0","topic":"\"\""},{"id":"6","codec":"0","parent":"-1","order":"1300","maxusers":"200","name":"\"Gateway-Test\"","flags":"0","password":"0","topic":"\"\""},{"id":"7","codec":"0","parent":"-1","order":"34463","maxusers":"200","name":"\"ZXSTICKY\"","flags":"0","password":"0","topic":"\"\""},{"id":"8","codec":"0","parent":"-1","order":"34463","maxusers":"200","name":"\"AFK\"","flags":"2","password":"0","topic":"\"\""},{"id":"9","codec":"12","parent":"-1","order":"1200","maxusers":"50","name":"\"DX Funk\"","flags":"2","password":"0","topic":"\"Funkraum für Gateway- \/ HF-DX Verbindungen\""},{"id":"10","codec":"12","parent":"-1","order":"5000","maxusers":"200","name":"\"US-CARS & Treffen\"","flags":"10","password":"0","topic":"\"\""},{"id":"11","codec":"12","parent":"-1","order":"3200","maxusers":"200","name":"\"Webradio und Musik\"","flags":"10","password":"0","topic":"\"\""},{"id":"12","codec":"9","parent":"-1","order":"6500","maxusers":"200","name":"\"GAMERBEREICH\"","flags":"10","password":"0","topic":"\"Bereich für Gamer\""},{"id":"13","codec":"9","parent":"-1","order":"6000","maxusers":"200","name":"\"Funkspiele\"","flags":"10","password":"0","topic":"\"\""},{"id":"14","codec":"9","parent":"-1","order":"1250","maxusers":"200","name":"\"Fuchsjagt\"","flags":"10","password":"0","topic":"\"\""},{"id":"15","codec":"11","parent":"-1","order":"1101","maxusers":"200","name":"\"Funkraum 2\"","flags":"2","password":"0","topic":"\"Funkverbindungen in die ganze Welt!\""},{"id":"16","codec":"12","parent":"-1","order":"0","maxusers":"250","name":"\"***WILLKOMMEN***\"","flags":"16","password":"0","topic":"\"Begrüssungsraum\""},{"id":"17","codec":"12","parent":"-1","order":"7000","maxusers":"200","name":"\"Operator\"","flags":"4","password":"1","topic":"\"\""},{"id":"18","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"RTTY50\"","flags":"2","password":"0","topic":"\"\""},{"id":"19","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"SSTV Analog\"","flags":"2","password":"0","topic":"\"\""},{"id":"20","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"PACKET\"","flags":"2","password":"0","topic":"\"\""},{"id":"21","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"BPSK31\"","flags":"2","password":"0","topic":"\"\""},{"id":"22","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"HELL FM\"","flags":"2","password":"0","topic":"\"\""},{"id":"23","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"FAX\"","flags":"2","password":"0","topic":"\"\""},{"id":"24","codec":"12","parent":"5","order":"3200","maxusers":"200","name":"\"CW\"","flags":"2","password":"0","topic":"\"\""},{"id":"25","codec":"12","parent":"11","order":"3200","maxusers":"200","name":"\"Mainstream\"","flags":"2","password":"0","topic":"\"All4Fun Radio Mainstream\""}]}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/1_response.txt b/gameq/tests/Protocols/Providers/Teamspeak3/1_response.txt deleted file mode 100644 index 318bc6b..0000000 --- a/gameq/tests/Protocols/Providers/Teamspeak3/1_response.txt +++ /dev/null @@ -1,64 +0,0 @@ -TS3 - -|| -Welcome to the TeamSpeak 3 ServerQuery interface, type "help" for a list of commands and "help " for information on a specific command. - error id=0 msg=ok - virtualserver_unique_identifier=CpZsRk9cvQrobpgjwhTtO+gJJVU= virtualserver_name=www.hengeofdenravi.com virtualserver_welcomemessage=Welcome\sto\sthe\sHengeofDenravi.com\sCommunity\sVOIP\sserver. virtualserver_platform=Linux virtualserver_version=3.0.11.2\s[Build:\s1418654632] virtualserver_maxclients=350 virtualserver_password=SRJRjkPqAnT6BXvIkwIumDWMxRE= virtualserver_clientsonline=167 virtualserver_channelsonline=214 virtualserver_created=0 virtualserver_uptime=2238262 virtualserver_codec_encryption_mode=0 virtualserver_hostmessage=Final\sday!\shttp:\/\/www.hengeofdenravi.com\/index.php\/topic,2023.0.html virtualserver_hostmessage_mode=0 virtualserver_filebase=files\/virtualserver_1 virtualserver_default_server_group=7 virtualserver_default_channel_group=7 virtualserver_flag_password=1 virtualserver_default_channel_admin_group=5 virtualserver_max_download_total_bandwidth=18446744073709551615 virtualserver_max_upload_total_bandwidth=18446744073709551615 virtualserver_hostbanner_url=http:\/\/www.hengeofdenravi.com virtualserver_hostbanner_gfx_url virtualserver_hostbanner_gfx_interval=0 virtualserver_complain_autoban_count=5 virtualserver_complain_autoban_time=1200 virtualserver_complain_remove_time=3600 virtualserver_min_clients_in_channel_before_forced_silence=5 -|| -00 virtualserver_priority_speaker_dimm_modificator=-18.0000 virtualserver_id=1 virtualserver_antiflood_points_tick_reduce=5 virtualserver_antiflood_points_needed_command_block=150 virtualserver_antiflood_points_needed_ip_block=250 virtualserver_client_connections=15752 virtualserver_query_client_connections=59579 virtualserver_hostbutton_tooltip virtualserver_hostbutton_url virtualserver_hostbutton_gfx_url virtualserver_queryclientsonline=1 virtualserver_download_quota=18446744073709551615 virtualserver_upload_quota=18446744073709551615 virtualserver_month_bytes_downloaded=4452574 virtualserver_month_bytes_uploaded=745830 virtualserver_total_bytes_downloaded=5022685219 virtualserver_total_bytes_uploaded=176541033 virtualserver_port=9987 virtualserver_autostart=1 virtualserver_machine_id virtualserver_needed_identity_security_level=8 virtualserver_log_client=1 virtualserver_log_query=1 virtualserver_log_channel=1 virtualserver_log_permissions=1 virtualserver_log_server=1 virtualserver_log_filetransfer=1 virtualserver_min_client_version=1373587200 virtualserver_name_phonetic virtualserver_icon_id=0 virtualserver_reserved_slots=0 virtualserver_total_packetloss_speech=0.0018 virtualserver_total_packetloss_keepalive=0.0027 virtualserver_total_packetloss_control=0.0032 virtualserver_total_packetloss_total=0.0025 virtualserver_total_ping=101.7697 virtualserver_ip virtualserver_weblist_enabled=0 virtualserver_ask_for_privilegekey=0 -|| -virtualserver_hostbanner_mode=0 virtualserver_channel_temp_delete_delay_default=0 virtualserver_status=online connection_filetransfer_bandwidth_sent=0 connection_filetransfer_bandwidth_received=0 connection_filetransfer_bytes_sent_total=46999092 connection_filetransfer_bytes_received_total=5387294 connection_packets_sent_speech=2329031766 connection_bytes_sent_speech=256597063724 connection_packets_received_speech=470785932 connection_bytes_received_speech=51724149621 connection_packets_sent_keepalive=289474777 connection_bytes_sent_keepalive=11868465857 connection_packets_received_keepalive=289602472 connection_bytes_received_keepalive=12157558339 connection_packets_sent_control=34443808 connection_bytes_sent_control=6298577714 connection_packets_received_control=33851601 connection_bytes_received_control=2078675352 connection_packets_sent_total=2652950351 connection_bytes_sent_total=274764107295 connection_packets_received_total=794240005 connection_bytes_received_total=65960383312 connection_bandwidth_sent_last_second_total=564034 connection_bandwidth_sent_last_minute_total=552212 connection_bandwidth_received_last_second_total=61004 connection_bandwidth_received_last_minute_total=68035 - error id=0 msg=ok - -|| -error id=0 msg=ok - clid=2 cid=1542 client_database_id=13147 client_nickname=Dhallia client_type=0|clid=4 cid=1708 client_database_id=13989 client_nickname=Waking\sUp client_type=0|clid=5 cid=1542 client_database_id=11878 client_nickname=Lydian client_type=0|clid=6 cid=717 client_database_id=14528 client_nickname=Redga client_type=0|clid=7 cid=1615 client_database_id=14420 client_nickname=sik client_type=0|clid=8 cid=1542 client_database_id=13949 client_nickname=Black\sDynamite client_type=0|clid=9 cid=1542 client_database_id=5235 client_nickname=Primal\sWrath client_type=0|clid=10 cid=1750 client_database_id=14230 client_nickname=Plancton client_type=0|clid=11 cid=1750 client_database_id=14538 client_nickname=Mike client_type=0|clid=12 cid=1445 client_database_id=3394 client_nickname=Dragoncon client_type=0|clid=13 cid=710 client_database_id=2135 client_nickname=Prismaea client_type=0|clid=16 cid=217 client_database_id=12306 client_nickname=DDK client_type=0|clid=19 cid=217 client_database_id=14044 client_nickname=Sylvan client_type=0|clid=20 cid=25 client_database_id=5363 client_nickname=Sir\sNoarg client_type=0|clid=21 cid=1704 client_database_id=2740 client_nickname=Think\sFast client_type=0|clid=22 cid=1542 client_database_id=13162 client_nickname=Grumpy client_type=0|clid=25 cid=1485 client_database_id=12618 client_nickname=Matt client_type=0|clid=27 cid=1485 client_database_id=3071 client_nickname=Eths client_type=0|cl -|| -id=28 cid=1542 client_database_id=14286 client_nickname=[HoD]Chillyboon client_type=0|clid=30 cid=710 client_database_id=12282 client_nickname=Aislynn client_type=0|clid=31 cid=55 client_database_id=13315 client_nickname=Kakida client_type=0|clid=32 cid=1542 client_database_id=13735 client_nickname=Yeagarr client_type=0|clid=33 cid=1542 client_database_id=13914 client_nickname=Hannover\sFist client_type=0|clid=34 cid=710 client_database_id=13986 client_nickname=Kris client_type=0|clid=36 cid=25 client_database_id=2528 client_nickname=Janice\sVyrra client_type=0|clid=37 cid=1467 client_database_id=14511 client_nickname=Ray(touretts) client_type=0|clid=39 cid=25 client_database_id=10877 client_nickname=Fern\sWillow client_type=0|clid=41 cid=1754 client_database_id=13044 client_nickname=HeroPride client_type=0|clid=42 cid=1724 client_database_id=13491 client_nickname=Arkaeous client_type=0|clid=43 cid=25 client_database_id=53 client_nickname=Unknown\sfrom\s71.199.205.69:56260 client_type=1|clid=44 cid=1542 client_database_id=14718 client_nickname=waaah client_type=0|clid=45 cid=25 client_database_id=13899 client_nickname=midgit client_type=0|clid=46 cid=1542 client_database_id=14057 client_nickname=Dark\sRoll\sCaskett client_type=0|clid=47 cid=217 client_database_id=3901 client_nickname=Lu'uke\sSkywalker client_type=0|clid=50 cid=217 client_database_id=12578 client_nickname=Entro client_type=0|clid=52 cid=217 client_database_id -|| -=9212 client_nickname=Irrational client_type=0|clid=53 cid=217 client_database_id=2366 client_nickname=Smash client_type=0|clid=55 cid=217 client_database_id=11458 client_nickname=[orr]\sIkkoroshi\s-\sIkken client_type=0|clid=56 cid=1625 client_database_id=13344 client_nickname=ToBee client_type=0|clid=59 cid=61 client_database_id=14399 client_nickname=Kinrea client_type=0|clid=61 cid=1485 client_database_id=13443 client_nickname=Zone client_type=0|clid=62 cid=1015 client_database_id=7168 client_nickname=Infamous client_type=0|clid=63 cid=1015 client_database_id=12332 client_nickname=Vhira client_type=0|clid=65 cid=1750 client_database_id=13911 client_nickname=Cazy client_type=0|clid=66 cid=217 client_database_id=3975 client_nickname=seksi client_type=0|clid=67 cid=1750 client_database_id=14231 client_nickname=QCOM client_type=0|clid=75 cid=1600 client_database_id=14675 client_nickname=Darkwinter client_type=0|clid=77 cid=1485 client_database_id=13426 client_nickname=Greg\sDouger client_type=0|clid=78 cid=217 client_database_id=14631 client_nickname=Insane\sKillbane client_type=0|clid=79 cid=1718 client_database_id=157 client_nickname=Rollack client_type=0|clid=82 cid=217 client_database_id=63 client_nickname=Edward client_type=0|clid=83 cid=217 client_database_id=1918 client_nickname=Recon\s(Charred\sFurr) client_type=0|clid=88 cid=55 client_database_id=3121 client_nickname=Grayghost client_type=0|clid=90 cid=1615 client_da -|| -tabase_id=13754 client_nickname=www.twitch.tv\/ca8oose client_type=0|clid=92 cid=217 client_database_id=12664 client_nickname=Vitorian client_type=0|clid=93 cid=1542 client_database_id=13311 client_nickname=Domilese client_type=0|clid=94 cid=217 client_database_id=12115 client_nickname=Ozriel client_type=0|clid=95 cid=1542 client_database_id=2705 client_nickname=Will\sDeForest client_type=0|clid=98 cid=145 client_database_id=13675 client_nickname=Grayshark client_type=0|clid=99 cid=1542 client_database_id=13348 client_nickname=smoulderling client_type=0|clid=101 cid=1750 client_database_id=14210 client_nickname=Hiro client_type=0|clid=103 cid=1718 client_database_id=5166 client_nickname=Kalek\sDraaf client_type=0|clid=104 cid=736 client_database_id=95 client_nickname=Sanir\sIronguard client_type=0|clid=106 cid=1724 client_database_id=14414 client_nickname=C\sH\sE\sM\sI\sC\sA\sL client_type=0|clid=107 cid=710 client_database_id=12610 client_nickname=Cerxi client_type=0|clid=111 cid=1718 client_database_id=13624 client_nickname=Maroon\sIllusionist client_type=0|clid=113 cid=1542 client_database_id=9724 client_nickname=Thundar client_type=0|clid=114 cid=1718 client_database_id=13950 client_nickname=Dendrinian client_type=0|clid=115 cid=217 client_database_id=3240 client_nickname=HamUndBacon client_type=0|clid=116 cid=1015 client_database_id=6302 client_nickname=Gale client_type=0|clid=117 cid=659 client_database_id=1084 client_ -|| -nickname=[PHZE]Labadingi client_type=0|clid=119 cid=217 client_database_id=14662 client_nickname=Malibu\sBarbie client_type=0|clid=122 cid=1542 client_database_id=14465 client_nickname=Pop client_type=0|clid=123 cid=217 client_database_id=4414 client_nickname=Aeybon client_type=0|clid=125 cid=717 client_database_id=5659 client_nickname=D\sVid client_type=0|clid=127 cid=1680 client_database_id=13650 client_nickname=Nine\sFingers client_type=0|clid=130 cid=1485 client_database_id=5490 client_nickname=Odin client_type=0|clid=131 cid=217 client_database_id=2014 client_nickname=Orion client_type=0|clid=132 cid=217 client_database_id=12304 client_nickname=Angel client_type=0|clid=133 cid=21 client_database_id=6117 client_nickname=[VS]\sWolfshead client_type=0|clid=134 cid=1542 client_database_id=4840 client_nickname=Zach client_type=0|clid=136 cid=710 client_database_id=11221 client_nickname=Zeth client_type=0|clid=139 cid=55 client_database_id=13510 client_nickname=Kirinkage client_type=0|clid=140 cid=217 client_database_id=14617 client_nickname=Chrono client_type=0|clid=141 cid=1485 client_database_id=3977 client_nickname=afaa client_type=0|clid=142 cid=55 client_database_id=12777 client_nickname=Shelf client_type=0|clid=144 cid=1718 client_database_id=6595 client_nickname=Jyn client_type=0|clid=146 cid=1542 client_database_id=5724 client_nickname=nglass client_type=0|clid=148 cid=1680 client_database_id=12504 client_nickname=Er -|| -is client_type=0|clid=152 cid=1542 client_database_id=14161 client_nickname=Mint client_type=0|clid=153 cid=814 client_database_id=2491 client_nickname=Clatter\sBang client_type=0|clid=154 cid=1718 client_database_id=14174 client_nickname=Rei client_type=0|clid=155 cid=710 client_database_id=10951 client_nickname=Hnah client_type=0|clid=156 cid=1467 client_database_id=14699 client_nickname=Kaly client_type=0|clid=158 cid=1750 client_database_id=11709 client_nickname=anthofire client_type=0|clid=159 cid=1750 client_database_id=12969 client_nickname=Crazy client_type=0|clid=162 cid=217 client_database_id=14523 client_nickname=Talon client_type=0|clid=168 cid=1649 client_database_id=1214 client_nickname=Dany client_type=0|clid=169 cid=1542 client_database_id=12305 client_nickname=Piroloko client_type=0|clid=170 cid=1542 client_database_id=14375 client_nickname=Argon client_type=0|clid=171 cid=1649 client_database_id=13625 client_nickname=Blargo\sThe\sGreat client_type=0|clid=172 cid=1680 client_database_id=4833 client_nickname=Slick client_type=0|clid=175 cid=1542 client_database_id=13910 client_nickname=Massive\sRecoil client_type=0|clid=176 cid=217 client_database_id=13437 client_nickname=Orthiana\sSustrider client_type=0|clid=177 cid=736 client_database_id=9469 client_nickname=Medev client_type=0|clid=179 cid=217 client_database_id=6340 client_nickname=Ashara client_type=0|clid=181 cid=814 client_database_id=2482 client_nick -|| -name=Fumblemuffin client_type=0|clid=182 cid=1759 client_database_id=12373 client_nickname=OPPJimi client_type=0|clid=186 cid=1615 client_database_id=10011 client_nickname=Curtyyy[Alt] client_type=0|clid=187 cid=217 client_database_id=11777 client_nickname=Akral\sSilvermane client_type=0|clid=191 cid=217 client_database_id=10996 client_nickname=Tedohn client_type=0|clid=194 cid=1718 client_database_id=13876 client_nickname=Lord\sSavage client_type=0|clid=195 cid=1680 client_database_id=12114 client_nickname=Elvalas client_type=0|clid=197 cid=1680 client_database_id=12985 client_nickname=Myx client_type=0|clid=198 cid=717 client_database_id=14198 client_nickname=Evil\sStudmuffin client_type=0|clid=201 cid=659 client_database_id=12733 client_nickname=fabbalabba client_type=0|clid=203 cid=710 client_database_id=10440 client_nickname=Spiffers client_type=0|clid=205 cid=33 client_database_id=13732 client_nickname=Ting client_type=0|clid=207 cid=736 client_database_id=4489 client_nickname=Mi\sN\sD\sY client_type=0|clid=213 cid=726 client_database_id=2378 client_nickname=Tandiin client_type=0|clid=214 cid=1467 client_database_id=14427 client_nickname=Jeff client_type=0|clid=216 cid=1542 client_database_id=9570 client_nickname=~Ja~ client_type=0|clid=217 cid=1542 client_database_id=12858 client_nickname=Kins client_type=0|clid=219 cid=1734 client_database_id=7 client_nickname=FrozenHydra client_type=0|clid=220 cid=1542 client_databa -|| -se_id=14294 client_nickname=Loziac client_type=0|clid=221 cid=1542 client_database_id=14203 client_nickname=[HoD]\sCiraxis client_type=0|clid=222 cid=217 client_database_id=14724 client_nickname=Crystal\sCastles client_type=0|clid=224 cid=1542 client_database_id=10939 client_nickname=Lightsoul client_type=0|clid=225 cid=1625 client_database_id=13429 client_nickname=Assembly client_type=0|clid=228 cid=217 client_database_id=13129 client_nickname=Lady\s(Resplendent) client_type=0|clid=229 cid=1542 client_database_id=10115 client_nickname=Rinsam client_type=0|clid=236 cid=217 client_database_id=11650 client_nickname=qwerty.1230 client_type=0|clid=237 cid=1615 client_database_id=10336 client_nickname=Darkside client_type=0|clid=245 cid=822 client_database_id=12 client_nickname=Pentose client_type=0|clid=247 cid=814 client_database_id=12288 client_nickname=Sunny client_type=0|clid=249 cid=814 client_database_id=135 client_nickname=[HC]\sSepar\s\/\sRoth\s\/\sMontoya client_type=0|clid=250 cid=1542 client_database_id=11511 client_nickname=Vampede client_type=0|clid=252 cid=726 client_database_id=3908 client_nickname=Fishstick client_type=0|clid=255 cid=814 client_database_id=14496 client_nickname=Eidocar client_type=0|clid=256 cid=1015 client_database_id=359 client_nickname=Fisty client_type=0|clid=257 cid=217 client_database_id=14725 client_nickname=[Sol]\sDivineMaurader client_type=0|clid=259 cid=217 client_database_id=1530 client_nickname=Raegair client_type=0|clid=263 cid=814 client_database_id=14264 client_nickname=GraySea client_type=0|clid=264 cid=33 client_database_id=76 client_nickname=Winkle\sTinkle client_type=0|clid=266 cid=217 client_database_id=14045 client_nickname=TheBofelsh client_type=0|clid=267 cid=1718 client_database_id=9069 client_nickname=Who\suses\sbows client_type=0|clid=268 cid=1542 client_database_id=11997 client_nickname=Moody client_type=0|clid=270 cid=1542 client_database_id=64 client_nickname=Tifa\sRan client_type=0|clid=274 cid=1542 client_database_id=13706 client_nickname=Dear\sBora client_type=0|clid=280 cid=1542 client_database_id=12094 client_nickname=Spikecell client_type=0|clid=282 cid=1542 client_database_id=14296 client_nickname=Xoris\/Lexiea client_type=0|clid=283 cid=1542 client_database_id=13671 client_nickname=Maximus client_type=0|clid=287 cid=1625 client_database_id=13409 client_nickname=lord\slight client_type=0|clid=294 cid=217 client_database_id=13627 client_nickname=Capt client_type=0|clid=297 cid=1718 client_database_id=13511 client_nickname=Jesse221 client_type=0|clid=298 cid=1542 client_database_id=9911 client_nickname=Sarah\sMay client_type=0|clid=304 cid=1704 client_database_id=14726 client_nickname=YourLastSight666 client_type=0|clid=306 cid=1542 client_database_id=14488 client_nickname=[HoD]\sJoao client_type=0|clid=309 cid=814 client_database_id=14727 client_nickname=AIfef client_type=0|clid=311 cid=1542 client_database_id=13328 client_nickname=Voidloss client_type=0|clid=321 cid=736 client_database_id=5163 client_nickname=Cloud client_type=0|clid=322 cid=217 client_database_id=12324 client_nickname=dodo client_type=0|clid=328 cid=1542 client_database_id=14512 client_nickname=Gendry\sHarlaw client_type=0|clid=332 cid=1542 client_database_id=13912 client_nickname=Prysoner client_type=0|clid=342 cid=1718 client_database_id=3308 client_nickname=Vindictive client_type=0|clid=343 cid=1542 client_database_id=150 client_nickname=Jadis client_type=0 - error id=0 msg=ok - error id=0 msg=ok - cid=25 pid=0 channel_order=0 channel_name=Main\sLobby channel_topic total_clients=5 channel_needed_subscribe_power=0|cid=33 pid=0 channel_order=25 channel_name=Away\sFrom\sKeyboard channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=55 pid=0 channel_order=33 channel_name=PvE channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=1571 pid=55 channel_order=0 channel_name=Community\sEvents channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=225 pid=55 channel_order=1571 channel_name=Server\sEvents channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=659 pid=225 channel_order=0 channel_name=Living\sStory channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=660 pid=225 channel_order=659 channel_name=Wurm channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=57 p -|| -id=55 channel_order=225 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=250 pid=57 channel_order=0 channel_name=Dungeons\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=61 pid=57 channel_order=250 channel_name=Dungeons\s1 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=63 pid=57 channel_order=61 channel_name=Dungeons\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1741 pid=55 channel_order=57 channel_name=Silverwastes channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2 pid=0 channel_order=55 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1659 pid=2 channel_order=0 channel_name=Server\sMeeting channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1446 pid=2 channel_order=1659 channel_name=Float channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=95 pid=2 channel_order=1446 channel_name=Roaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=725 pid=2 channel_order=95 channel_name=EOTM channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=15 pid=2 channel_order=725 channel_name=Blue\sBorderland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=17 pid=15 channel_order=0 channel_name=Blue\sTeam\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=18 pid=15 channel_order=17 channel_name=Blue\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=20 pid=2 channel_order=15 channel_name=Green\sBorderland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=145 pid=20 channel_order=0 channel_name=Green\sTeam\s1 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=252 pid=20 channel_order=145 channel_name=Green\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=9 pid=2 channel_order=20 channel_name=Red\sBorderland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=6 pid=9 channel_order=0 channel_name=Red\sTeam\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=274 pid=9 channel_order=6 channel_name=Red\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=26 pid=2 channel_order=9 channel_name=Eternal\sBattlegrounds channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=21 pid=26 channel_order=0 channel_name=EB\sTeam\s1 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1767 pid=21 channel_order=0 channel_name=Sass\sMouth channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=28 pid=26 channel_order=21 channel_name=EB\sTeam\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1622 pid=26 channel_order=28 channel_name=EB\sgroup\sA channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1623 pid=26 channel_order=16 -|| -22 channel_name=EB\sGroup\sB channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1624 pid=26 channel_order=1623 channel_name=EB\sGroup\sC channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=248 pid=0 channel_order=2 channel_name=WvW\sReset\sMeeting channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=24 pid=0 channel_order=248 channel_name=Guild\sChannels channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1467 pid=24 channel_order=0 channel_name=Asguardian\sLegends\s[AGLS] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=1474 pid=1467 channel_order=0 channel_name=Odin's\sThrone channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1475 pid=1467 channel_order=1474 channel_name=Valhalla\s(PvP) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1485 pid=1467 channel_order=1475 channel_name=Ragnarok\s(WvW) channel_topic total_clients=6 channel_needed_subscribe_power=0|cid=1476 pid=1467 channel_order=1485 channel_name=Yggdrasil\s(PvE) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1498 pid=1467 channel_order=1476 channel_name=Niflheim\s(Other\sGames) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=822 pid=24 channel_order=1467 channel_name=Astalderas\sChosen\s[ASTC] channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1360 pid=822 channel_order=0 channel_name=PVP channel_t -|| -opic total_clients=0 channel_needed_subscribe_power=0|cid=1362 pid=822 channel_order=1360 channel_name=Dungeon\/Fractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1371 pid=822 channel_order=1362 channel_name=Roaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1375 pid=822 channel_order=1371 channel_name=Gala's\sBar channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1642 pid=822 channel_order=1375 channel_name=Sahren's\sGetaway channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1764 pid=822 channel_order=1642 channel_name=STAR channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1765 pid=822 channel_order=1764 channel_name=CITIZEN channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1766 pid=822 channel_order=1765 channel_name=HYPE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1625 pid=24 channel_order=822 channel_name=Bellicose\sBanana\sClub\s[Bana] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=1631 pid=1625 channel_order=0 channel_name=BANA\sBLACK\sOPS\s[\sWvW1\s] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1643 pid=1625 channel_order=1631 channel_name=BANA\sDELTA\steam\s[\sWvW2\s] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1644 pid=1625 channel_order=1643 channel_name=BANA\sALPHA\steam\s[WvW3] channel_topic total_clients=0 channe -|| -l_needed_subscribe_power=0|cid=1653 pid=1625 channel_order=1644 channel_name=bana\sguild\smission\/meetings\s[PVE] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1588 pid=24 channel_order=1625 channel_name=Brethren\s[PAIN] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1590 pid=1588 channel_order=0 channel_name=WvW\s#paintrain\s>:D channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1680 pid=1588 channel_order=1590 channel_name=Guild\sMissions channel_topic total_clients=5 channel_needed_subscribe_power=0|cid=1669 pid=1588 channel_order=1680 channel_name=Music\sRoom:\sEnjoy\sthe\sVibe channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1589 pid=1588 channel_order=1669 channel_name=PVE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1591 pid=1589 channel_order=0 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1684 pid=1589 channel_order=1591 channel_name=Fractals\sof\sthe\sMists channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1689 pid=1588 channel_order=1589 channel_name=Guild\sInformation\sBoard channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1668 pid=1588 channel_order=1689 channel_name=Meeting\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1682 pid=1588 channel_order=1668 channel_name=Brethren\sCouncil\sMeeting\sRoom channel_topic t -|| -otal_clients=0 channel_needed_subscribe_power=0|cid=1592 pid=1588 channel_order=1682 channel_name=Blightwing's\sPerch channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=109 pid=24 channel_order=1588 channel_name=Charter\sVanguard\s[CV] channel_topic=Courage,\sHonesty,\sand\sRespect total_clients=0 channel_needed_subscribe_power=0|cid=114 pid=109 channel_order=0 channel_name=Missions channel_topic=Saturday\sGuild\sMissions! total_clients=0 channel_needed_subscribe_power=0|cid=355 pid=114 channel_order=0 channel_name=Troll\sKiller\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1488 pid=114 channel_order=355 channel_name=18+ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=115 pid=109 channel_order=114 channel_name=WvW channel_topic=For\sHoD! total_clients=0 channel_needed_subscribe_power=0|cid=116 pid=109 channel_order=115 channel_name=PvE channel_topic=Dungeons,\sjump\spuzzles,\shearts\sand\sstories total_clients=0 channel_needed_subscribe_power=0|cid=576 pid=109 channel_order=116 channel_name=sPVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1401 pid=109 channel_order=576 channel_name=Team\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1403 pid=109 channel_order=1401 channel_name=Team\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1439 pid=109 channel_order=1403 channel_name=Team\s3 channel_topic -|| - total_clients=0 channel_needed_subscribe_power=0|cid=383 pid=24 channel_order=109 channel_name=Contemporary\sHeroes\s[CH] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=814 pid=383 channel_order=0 channel_name=CH\sChannel\s1\s(Lobby) channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=385 pid=383 channel_order=814 channel_name=CH\sChannel\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=386 pid=383 channel_order=385 channel_name=CH\sChannel\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=726 pid=383 channel_order=386 channel_name=CH\sChannel\s4 channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=496 pid=383 channel_order=726 channel_name=[CH]Small\sGroup\sChannel\s1\s(Private) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=384 pid=383 channel_order=496 channel_name=[CH]Small\sGroup\sChannel\s2\s(Private) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1236 pid=383 channel_order=384 channel_name=[CH]Small\sGroup\sChannel\s3\s(Private) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=387 pid=383 channel_order=1236 channel_name=[CH]Small\sGroup\sChannel\s4\s(password) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=715 pid=383 channel_order=387 channel_name=Officer\sChannel\s(password) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1725 pid= -|| -24 channel_order=383 channel_name=Daggers\sand\sArrows\s(DaA) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1726 pid=1725 channel_order=0 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1727 pid=1725 channel_order=1726 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1728 pid=1725 channel_order=1727 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1729 pid=1725 channel_order=1728 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1737 pid=1725 channel_order=1729 channel_name=Mike's\sAmerican\sHome channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1582 pid=24 channel_order=1725 channel_name=Digital\sSacrifice\s[DS] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1615 pid=1582 channel_order=0 channel_name=Welcome\sto\sProf\sKaze's\sTeaching\sRoom channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=1750 pid=1582 channel_order=1615 channel_name=Harvey's\sSquad\s[SHYT] channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=1761 pid=1582 channel_order=1750 channel_name=Super\sCharrio\sBros channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=736 pid=24 channel_order=1582 channel_name=Exciting\sRole\sPlay\s[ERP] channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=738 pid=736 channel_o -|| -rder=0 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=741 pid=736 channel_order=738 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1089 pid=736 channel_order=741 channel_name=The\sLove\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1760 pid=736 channel_order=1089 channel_name=Dungeon\sof\sGaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1542 pid=24 channel_order=736 channel_name=Hordes\sof\sDenravi\s[HoD] channel_topic total_clients=40 channel_needed_subscribe_power=0|cid=1543 pid=1542 channel_order=0 channel_name=Roaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1704 pid=1542 channel_order=1543 channel_name=The\sSerious\sRoom channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1580 pid=1542 channel_order=1704 channel_name=PVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1587 pid=1542 channel_order=1580 channel_name=18+\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1746 pid=1542 channel_order=1587 channel_name=The\sMeeting\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1768 pid=1542 channel_order=1746 channel_name=Hyperbolic\sTime\sChamber channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1707 pid=24 channel_order=1542 channel_name=Mist\sRáiders channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1708 pid=1707 channel_order=0 channel_name=WvW channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1711 pid=1707 channel_order=1708 channel_name=GvG channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1712 pid=1711 channel_order=0 channel_name=GvG\sKill\sGroup channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1714 pid=1707 channel_order=1711 channel_name=sPvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1730 pid=1707 channel_order=1714 channel_name=Meeting\s-\soffice\sroom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1710 pid=1707 channel_order=1730 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1715 pid=1707 channel_order=1710 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1584 pid=24 channel_order=1707 channel_name=Nerfed\sAgain\s[NERF] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1690 pid=1584 channel_order=0 channel_name=quiet\stime channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1598 pid=24 channel_order=1584 channel_name=Outlaws,Renegades\sand\sRebels\s[ORR] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1600 pid=1598 channel_order=0 channel_name=PVE channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1759 pid=1600 channel_order=0 channel_ -|| -name=Frigid`s\sice\spalace channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1602 pid=1598 channel_order=1600 channel_name=WVW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1612 pid=1602 channel_order=0 channel_name=EBG channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1613 pid=1612 channel_order=0 channel_name=Borderlands channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1749 pid=1602 channel_order=1612 channel_name=Will`s\scave channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1603 pid=1598 channel_order=1602 channel_name=sPVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1778 pid=1603 channel_order=0 channel_name=Drago`s\sportal channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1604 pid=1598 channel_order=1603 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1605 pid=1598 channel_order=1604 channel_name=Chat channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1414 pid=24 channel_order=1598 channel_name=Partners\sN\sCryme\s[PIC] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1429 pid=1414 channel_order=0 channel_name=sPVP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1430 pid=1414 channel_order=1429 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1597 pid=1414 channel_ -|| -order=1430 channel_name=Central\sAnime\sTemp\sChannel(GW2\sOnly) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1747 pid=1414 channel_order=1597 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=30 pid=24 channel_order=1414 channel_name=Phaze\s[PHZE] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=41 pid=30 channel_order=0 channel_name=Dungeon channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=40 pid=30 channel_order=41 channel_name=WvW\sMain channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=224 pid=40 channel_order=0 channel_name=WvW\sSquad channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=46 pid=30 channel_order=40 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=108 pid=30 channel_order=46 channel_name=Non\sGw2\sStuff channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=179 pid=30 channel_order=108 channel_name=Leaders\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1716 pid=24 channel_order=30 channel_name=Prophecies\sof\sAnnihilation\s(POA) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1718 pid=1716 channel_order=0 channel_name=WvW channel_topic total_clients=10 channel_needed_subscribe_power=0|cid=1743 pid=1716 channel_order=1718 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_p -|| -ower=0|cid=1721 pid=1716 channel_order=1743 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1722 pid=1721 channel_order=0 channel_name=Story\smode channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1723 pid=1721 channel_order=1722 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1720 pid=1716 channel_order=1721 channel_name=Meeting\sHall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1744 pid=1720 channel_order=0 channel_name=Open\sMeeting\sHall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1745 pid=1720 channel_order=1744 channel_name=Closed\sMeeting\sHall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1724 pid=1716 channel_order=1720 channel_name=AFK channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=997 pid=24 channel_order=1716 channel_name=Quaggan\sSlavers\s[WHIP] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1015 pid=997 channel_order=0 channel_name=Choo\sChoo channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=1017 pid=997 channel_order=1015 channel_name=Killing\sFools channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1075 pid=997 channel_order=1017 channel_name=Ermergerd\sDark\sSolz channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1451 pid=997 channel_order=1075 channel_name=Blast\sfrom\sthe\sPast\s(GW1) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1693 pid=24 channel_order=997 channel_name=Rift\sLegion\s[Mist] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1695 pid=1693 channel_order=0 channel_name=Guest\sBathroom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1703 pid=1693 channel_order=1695 channel_name=Charr\sParty channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1009 pid=24 channel_order=1693 channel_name=Serenity\sEdge\s[TRE] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=217 pid=24 channel_order=1009 channel_name=Sovereign\sof\sLords\s[Sol] channel_topic total_clients=32 channel_needed_subscribe_power=0|cid=1445 pid=217 channel_order=0 channel_name=Happy\sFun\sTime channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=222 pid=217 channel_order=1445 channel_name=sPvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=220 pid=217 channel_order=222 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=218 pid=217 channel_order=220 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=219 pid=218 channel_order=0 channel_name=Fractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=221 pid=218 channel_order=219 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0| -|| -cid=501 pid=217 channel_order=218 channel_name=The\sLords\sGathering channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=549 pid=501 channel_order=0 channel_name=Sol's\sOffice channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1347 pid=217 channel_order=501 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=91 pid=24 channel_order=217 channel_name=The\sAssassin\sArmy\s[TAA] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=768 pid=91 channel_order=0 channel_name=Liz's\sChannel.\sPoke\sif\sneeded channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1574 pid=91 channel_order=768 channel_name=Machew's\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1756 pid=24 channel_order=91 channel_name=The\sMinistry\s[TM] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1757 pid=1756 channel_order=0 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1758 pid=1756 channel_order=1757 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1771 pid=1758 channel_order=0 channel_name=Dungeons channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1772 pid=1758 channel_order=1771 channel_name=Fractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1774 pid=1758 channel_order=1772 channel_name=Silverwastes channel_top -|| -ic total_clients=0 channel_needed_subscribe_power=0|cid=1775 pid=1758 channel_order=1774 channel_name=Living\sStory channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1773 pid=1756 channel_order=1758 channel_name=Meeting\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1777 pid=1756 channel_order=1773 channel_name=PvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1611 pid=24 channel_order=1756 channel_name=The\sRaging\sStorm\s[STRM] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1754 pid=1611 channel_order=0 channel_name=WvW channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1755 pid=1611 channel_order=1754 channel_name=The\sBunker channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1617 pid=1611 channel_order=1755 channel_name=AFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=710 pid=24 channel_order=1611 channel_name=The\sSnow\sRose\sResistance\s[Snow] channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=1593 pid=710 channel_order=0 channel_name=Dungeons\s&\sFractals channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1594 pid=1593 channel_order=0 channel_name=Team\sZefferEtc channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1595 pid=1593 channel_order=1594 channel_name=Team\sPrismStormLord channel_topic total_clients=0 channel_needed_subscribe_po -|| -wer=0|cid=1165 pid=710 channel_order=1593 channel_name=The\sGazebo\s(Other\sGames) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=717 pid=24 channel_order=710 channel_name=The\sSons\sof\sTzu\s[WAR] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=719 pid=717 channel_order=0 channel_name=The\s[WAR]\sCouncil\sChamber channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=718 pid=717 channel_order=719 channel_name=WvW channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=720 pid=717 channel_order=718 channel_name=PvE channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=958 pid=717 channel_order=720 channel_name=PvP\sArena channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=959 pid=958 channel_order=0 channel_name=Red\sTeam channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=960 pid=958 channel_order=959 channel_name=Blue\sTeam channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1091 pid=717 channel_order=958 channel_name=The\sAFK\sLounge channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1166 pid=1091 channel_order=0 channel_name=Hellbound's\sSmokehut channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1619 pid=717 channel_order=1091 channel_name=Ed\sand\sBarbie's\sTea\sRoom channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=1632 pid=24 channel_order=717 chann -|| -el_name=The\sThird\sEclipse\s[Howl] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1636 pid=1632 channel_order=0 channel_name=Hunting\sGrounds channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1641 pid=1632 channel_order=1636 channel_name=The\sDen channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1649 pid=1641 channel_order=0 channel_name=Kitten's\sPlay\sPen channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1583 pid=24 channel_order=1632 channel_name=Wankers\sand\sNerdy\sGamers\s[WANG] channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1731 pid=24 channel_order=1583 channel_name=Valkyria\sImmortalis channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1734 pid=1731 channel_order=0 channel_name=Charrbucks channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1739 pid=1731 channel_order=1734 channel_name=Ed's\sPatio channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=56 pid=0 channel_order=24 channel_name=SPvP channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=71 pid=56 channel_order=0 channel_name=Group\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=72 pid=56 channel_order=71 channel_name=Group\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1325 pid=56 channel_order=72 channel_name=Group\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1326 pid=56 channel_order=1325 channel_name=Group\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0 - error id=0 msg=ok - \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/1_result.json b/gameq/tests/Protocols/Providers/Teamspeak3/1_result.json deleted file mode 100644 index 2769390..0000000 --- a/gameq/tests/Protocols/Providers/Teamspeak3/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"107.161.184.3:9987":{"connection_bandwidth_received_last_minute_total":"68035","connection_bandwidth_received_last_second_total":"61004","connection_bandwidth_sent_last_minute_total":"552212","connection_bandwidth_sent_last_second_total":"564034","connection_bytes_received_control":"2078675352","connection_bytes_received_keepalive":"12157558339","connection_bytes_received_speech":"51724149621","connection_bytes_received_total":"65960383312","connection_bytes_sent_control":"6298577714","connection_bytes_sent_keepalive":"11868465857","connection_bytes_sent_speech":"256597063724","connection_bytes_sent_total":"274764107295","connection_filetransfer_bandwidth_received":"0","connection_filetransfer_bandwidth_sent":"0","connection_filetransfer_bytes_received_total":"5387294","connection_filetransfer_bytes_sent_total":"46999092","connection_packets_received_control":"33851601","connection_packets_received_keepalive":"289602472","connection_packets_received_speech":"470785932","connection_packets_received_total":"794240005","connection_packets_sent_control":"34443808","connection_packets_sent_keepalive":"289474777","connection_packets_sent_speech":"2329031766","connection_packets_sent_total":"2652950351","dedicated":1,"gq_address":"107.161.184.3","gq_joinlink":"ts3server:\/\/107.161.184.3?port=9987","gq_name":"Teamspeak 3","gq_online":true,"gq_port_client":9987,"gq_port_query":10011,"gq_protocol":"teamspeak3","gq_transport":"tcp","gq_type":"teamspeak3","numplayers":166,"players":[{"clid":"2","cid":"1542","client_database_id":"13147","client_nickname":"Dhallia","client_type":"0"},{"clid":"4","cid":"1708","client_database_id":"13989","client_nickname":"Waking Up","client_type":"0"},{"clid":"5","cid":"1542","client_database_id":"11878","client_nickname":"Lydian","client_type":"0"},{"clid":"6","cid":"717","client_database_id":"14528","client_nickname":"Redga","client_type":"0"},{"clid":"7","cid":"1615","client_database_id":"14420","client_nickname":"sik","client_type":"0"},{"clid":"8","cid":"1542","client_database_id":"13949","client_nickname":"Black Dynamite","client_type":"0"},{"clid":"9","cid":"1542","client_database_id":"5235","client_nickname":"Primal Wrath","client_type":"0"},{"clid":"10","cid":"1750","client_database_id":"14230","client_nickname":"Plancton","client_type":"0"},{"clid":"11","cid":"1750","client_database_id":"14538","client_nickname":"Mike","client_type":"0"},{"clid":"12","cid":"1445","client_database_id":"3394","client_nickname":"Dragoncon","client_type":"0"},{"clid":"13","cid":"710","client_database_id":"2135","client_nickname":"Prismaea","client_type":"0"},{"clid":"16","cid":"217","client_database_id":"12306","client_nickname":"DDK","client_type":"0"},{"clid":"19","cid":"217","client_database_id":"14044","client_nickname":"Sylvan","client_type":"0"},{"clid":"20","cid":"25","client_database_id":"5363","client_nickname":"Sir Noarg","client_type":"0"},{"clid":"21","cid":"1704","client_database_id":"2740","client_nickname":"Think Fast","client_type":"0"},{"clid":"22","cid":"1542","client_database_id":"13162","client_nickname":"Grumpy","client_type":"0"},{"clid":"25","cid":"1485","client_database_id":"12618","client_nickname":"Matt","client_type":"0"},{"clid":"27","cid":"1485","client_database_id":"3071","client_nickname":"Eths","client_type":"0"},{"clid":"28","cid":"1542","client_database_id":"14286","client_nickname":"[HoD]Chillyboon","client_type":"0"},{"clid":"30","cid":"710","client_database_id":"12282","client_nickname":"Aislynn","client_type":"0"},{"clid":"31","cid":"55","client_database_id":"13315","client_nickname":"Kakida","client_type":"0"},{"clid":"32","cid":"1542","client_database_id":"13735","client_nickname":"Yeagarr","client_type":"0"},{"clid":"33","cid":"1542","client_database_id":"13914","client_nickname":"Hannover Fist","client_type":"0"},{"clid":"34","cid":"710","client_database_id":"13986","client_nickname":"Kris","client_type":"0"},{"clid":"36","cid":"25","client_database_id":"2528","client_nickname":"Janice Vyrra","client_type":"0"},{"clid":"37","cid":"1467","client_database_id":"14511","client_nickname":"Ray(touretts)","client_type":"0"},{"clid":"39","cid":"25","client_database_id":"10877","client_nickname":"Fern Willow","client_type":"0"},{"clid":"41","cid":"1754","client_database_id":"13044","client_nickname":"HeroPride","client_type":"0"},{"clid":"42","cid":"1724","client_database_id":"13491","client_nickname":"Arkaeous","client_type":"0"},{"clid":"43","cid":"25","client_database_id":"53","client_nickname":"Unknown from 71.199.205.69:56260","client_type":"1"},{"clid":"44","cid":"1542","client_database_id":"14718","client_nickname":"waaah","client_type":"0"},{"clid":"45","cid":"25","client_database_id":"13899","client_nickname":"midgit","client_type":"0"},{"clid":"46","cid":"1542","client_database_id":"14057","client_nickname":"Dark Roll Caskett","client_type":"0"},{"clid":"47","cid":"217","client_database_id":"3901","client_nickname":"Lu'uke Skywalker","client_type":"0"},{"clid":"50","cid":"217","client_database_id":"12578","client_nickname":"Entro","client_type":"0"},{"clid":"52","cid":"217","client_database_id":"9212","client_nickname":"Irrational","client_type":"0"},{"clid":"53","cid":"217","client_database_id":"2366","client_nickname":"Smash","client_type":"0"},{"clid":"55","cid":"217","client_database_id":"11458","client_nickname":"[orr] Ikkoroshi - Ikken","client_type":"0"},{"clid":"56","cid":"1625","client_database_id":"13344","client_nickname":"ToBee","client_type":"0"},{"clid":"59","cid":"61","client_database_id":"14399","client_nickname":"Kinrea","client_type":"0"},{"clid":"61","cid":"1485","client_database_id":"13443","client_nickname":"Zone","client_type":"0"},{"clid":"62","cid":"1015","client_database_id":"7168","client_nickname":"Infamous","client_type":"0"},{"clid":"63","cid":"1015","client_database_id":"12332","client_nickname":"Vhira","client_type":"0"},{"clid":"65","cid":"1750","client_database_id":"13911","client_nickname":"Cazy","client_type":"0"},{"clid":"66","cid":"217","client_database_id":"3975","client_nickname":"seksi","client_type":"0"},{"clid":"67","cid":"1750","client_database_id":"14231","client_nickname":"QCOM","client_type":"0"},{"clid":"75","cid":"1600","client_database_id":"14675","client_nickname":"Darkwinter","client_type":"0"},{"clid":"77","cid":"1485","client_database_id":"13426","client_nickname":"Greg Douger","client_type":"0"},{"clid":"78","cid":"217","client_database_id":"14631","client_nickname":"Insane Killbane","client_type":"0"},{"clid":"79","cid":"1718","client_database_id":"157","client_nickname":"Rollack","client_type":"0"},{"clid":"82","cid":"217","client_database_id":"63","client_nickname":"Edward","client_type":"0"},{"clid":"83","cid":"217","client_database_id":"1918","client_nickname":"Recon (Charred Furr)","client_type":"0"},{"clid":"88","cid":"55","client_database_id":"3121","client_nickname":"Grayghost","client_type":"0"},{"clid":"90","cid":"1615","client_database_id":"13754","client_nickname":"www.twitch.tv\/ca8oose","client_type":"0"},{"clid":"92","cid":"217","client_database_id":"12664","client_nickname":"Vitorian","client_type":"0"},{"clid":"93","cid":"1542","client_database_id":"13311","client_nickname":"Domilese","client_type":"0"},{"clid":"94","cid":"217","client_database_id":"12115","client_nickname":"Ozriel","client_type":"0"},{"clid":"95","cid":"1542","client_database_id":"2705","client_nickname":"Will DeForest","client_type":"0"},{"clid":"98","cid":"145","client_database_id":"13675","client_nickname":"Grayshark","client_type":"0"},{"clid":"99","cid":"1542","client_database_id":"13348","client_nickname":"smoulderling","client_type":"0"},{"clid":"101","cid":"1750","client_database_id":"14210","client_nickname":"Hiro","client_type":"0"},{"clid":"103","cid":"1718","client_database_id":"5166","client_nickname":"Kalek Draaf","client_type":"0"},{"clid":"104","cid":"736","client_database_id":"95","client_nickname":"Sanir Ironguard","client_type":"0"},{"clid":"106","cid":"1724","client_database_id":"14414","client_nickname":"C H E M I C A L","client_type":"0"},{"clid":"107","cid":"710","client_database_id":"12610","client_nickname":"Cerxi","client_type":"0"},{"clid":"111","cid":"1718","client_database_id":"13624","client_nickname":"Maroon Illusionist","client_type":"0"},{"clid":"113","cid":"1542","client_database_id":"9724","client_nickname":"Thundar","client_type":"0"},{"clid":"114","cid":"1718","client_database_id":"13950","client_nickname":"Dendrinian","client_type":"0"},{"clid":"115","cid":"217","client_database_id":"3240","client_nickname":"HamUndBacon","client_type":"0"},{"clid":"116","cid":"1015","client_database_id":"6302","client_nickname":"Gale","client_type":"0"},{"clid":"117","cid":"659","client_database_id":"1084","client_nickname":"[PHZE]Labadingi","client_type":"0"},{"clid":"119","cid":"217","client_database_id":"14662","client_nickname":"Malibu Barbie","client_type":"0"},{"clid":"122","cid":"1542","client_database_id":"14465","client_nickname":"Pop","client_type":"0"},{"clid":"123","cid":"217","client_database_id":"4414","client_nickname":"Aeybon","client_type":"0"},{"clid":"125","cid":"717","client_database_id":"5659","client_nickname":"D Vid","client_type":"0"},{"clid":"127","cid":"1680","client_database_id":"13650","client_nickname":"Nine Fingers","client_type":"0"},{"clid":"130","cid":"1485","client_database_id":"5490","client_nickname":"Odin","client_type":"0"},{"clid":"131","cid":"217","client_database_id":"2014","client_nickname":"Orion","client_type":"0"},{"clid":"132","cid":"217","client_database_id":"12304","client_nickname":"Angel","client_type":"0"},{"clid":"133","cid":"21","client_database_id":"6117","client_nickname":"[VS] Wolfshead","client_type":"0"},{"clid":"134","cid":"1542","client_database_id":"4840","client_nickname":"Zach","client_type":"0"},{"clid":"136","cid":"710","client_database_id":"11221","client_nickname":"Zeth","client_type":"0"},{"clid":"139","cid":"55","client_database_id":"13510","client_nickname":"Kirinkage","client_type":"0"},{"clid":"140","cid":"217","client_database_id":"14617","client_nickname":"Chrono","client_type":"0"},{"clid":"141","cid":"1485","client_database_id":"3977","client_nickname":"afaa","client_type":"0"},{"clid":"142","cid":"55","client_database_id":"12777","client_nickname":"Shelf","client_type":"0"},{"clid":"144","cid":"1718","client_database_id":"6595","client_nickname":"Jyn","client_type":"0"},{"clid":"146","cid":"1542","client_database_id":"5724","client_nickname":"nglass","client_type":"0"},{"clid":"148","cid":"1680","client_database_id":"12504","client_nickname":"Eris","client_type":"0"},{"clid":"152","cid":"1542","client_database_id":"14161","client_nickname":"Mint","client_type":"0"},{"clid":"153","cid":"814","client_database_id":"2491","client_nickname":"Clatter Bang","client_type":"0"},{"clid":"154","cid":"1718","client_database_id":"14174","client_nickname":"Rei","client_type":"0"},{"clid":"155","cid":"710","client_database_id":"10951","client_nickname":"Hnah","client_type":"0"},{"clid":"156","cid":"1467","client_database_id":"14699","client_nickname":"Kaly","client_type":"0"},{"clid":"158","cid":"1750","client_database_id":"11709","client_nickname":"anthofire","client_type":"0"},{"clid":"159","cid":"1750","client_database_id":"12969","client_nickname":"Crazy","client_type":"0"},{"clid":"162","cid":"217","client_database_id":"14523","client_nickname":"Talon","client_type":"0"},{"clid":"168","cid":"1649","client_database_id":"1214","client_nickname":"Dany","client_type":"0"},{"clid":"169","cid":"1542","client_database_id":"12305","client_nickname":"Piroloko","client_type":"0"},{"clid":"170","cid":"1542","client_database_id":"14375","client_nickname":"Argon","client_type":"0"},{"clid":"171","cid":"1649","client_database_id":"13625","client_nickname":"Blargo The Great","client_type":"0"},{"clid":"172","cid":"1680","client_database_id":"4833","client_nickname":"Slick","client_type":"0"},{"clid":"175","cid":"1542","client_database_id":"13910","client_nickname":"Massive Recoil","client_type":"0"},{"clid":"176","cid":"217","client_database_id":"13437","client_nickname":"Orthiana Sustrider","client_type":"0"},{"clid":"177","cid":"736","client_database_id":"9469","client_nickname":"Medev","client_type":"0"},{"clid":"179","cid":"217","client_database_id":"6340","client_nickname":"Ashara","client_type":"0"},{"clid":"181","cid":"814","client_database_id":"2482","client_nickname":"Fumblemuffin","client_type":"0"},{"clid":"182","cid":"1759","client_database_id":"12373","client_nickname":"OPPJimi","client_type":"0"},{"clid":"186","cid":"1615","client_database_id":"10011","client_nickname":"Curtyyy[Alt]","client_type":"0"},{"clid":"187","cid":"217","client_database_id":"11777","client_nickname":"Akral Silvermane","client_type":"0"},{"clid":"191","cid":"217","client_database_id":"10996","client_nickname":"Tedohn","client_type":"0"},{"clid":"194","cid":"1718","client_database_id":"13876","client_nickname":"Lord Savage","client_type":"0"},{"clid":"195","cid":"1680","client_database_id":"12114","client_nickname":"Elvalas","client_type":"0"},{"clid":"197","cid":"1680","client_database_id":"12985","client_nickname":"Myx","client_type":"0"},{"clid":"198","cid":"717","client_database_id":"14198","client_nickname":"Evil Studmuffin","client_type":"0"},{"clid":"201","cid":"659","client_database_id":"12733","client_nickname":"fabbalabba","client_type":"0"},{"clid":"203","cid":"710","client_database_id":"10440","client_nickname":"Spiffers","client_type":"0"},{"clid":"205","cid":"33","client_database_id":"13732","client_nickname":"Ting","client_type":"0"},{"clid":"207","cid":"736","client_database_id":"4489","client_nickname":"Mi N D Y","client_type":"0"},{"clid":"213","cid":"726","client_database_id":"2378","client_nickname":"Tandiin","client_type":"0"},{"clid":"214","cid":"1467","client_database_id":"14427","client_nickname":"Jeff","client_type":"0"},{"clid":"216","cid":"1542","client_database_id":"9570","client_nickname":"~Ja~","client_type":"0"},{"clid":"217","cid":"1542","client_database_id":"12858","client_nickname":"Kins","client_type":"0"},{"clid":"219","cid":"1734","client_database_id":"7","client_nickname":"FrozenHydra","client_type":"0"},{"clid":"220","cid":"1542","client_database_id":"14294","client_nickname":"Loziac","client_type":"0"},{"clid":"221","cid":"1542","client_database_id":"14203","client_nickname":"[HoD] Ciraxis","client_type":"0"},{"clid":"222","cid":"217","client_database_id":"14724","client_nickname":"Crystal Castles","client_type":"0"},{"clid":"224","cid":"1542","client_database_id":"10939","client_nickname":"Lightsoul","client_type":"0"},{"clid":"225","cid":"1625","client_database_id":"13429","client_nickname":"Assembly","client_type":"0"},{"clid":"228","cid":"217","client_database_id":"13129","client_nickname":"Lady (Resplendent)","client_type":"0"},{"clid":"229","cid":"1542","client_database_id":"10115","client_nickname":"Rinsam","client_type":"0"},{"clid":"236","cid":"217","client_database_id":"11650","client_nickname":"qwerty.1230","client_type":"0"},{"clid":"237","cid":"1615","client_database_id":"10336","client_nickname":"Darkside","client_type":"0"},{"clid":"245","cid":"822","client_database_id":"12","client_nickname":"Pentose","client_type":"0"},{"clid":"247","cid":"814","client_database_id":"12288","client_nickname":"Sunny","client_type":"0"},{"clid":"249","cid":"814","client_database_id":"135","client_nickname":"[HC] Separ \/ Roth \/ Montoya","client_type":"0"},{"clid":"250","cid":"1542","client_database_id":"11511","client_nickname":"Vampede","client_type":"0"},{"clid":"252","cid":"726","client_database_id":"3908","client_nickname":"Fishstick","client_type":"0"},{"clid":"255","cid":"814","client_database_id":"14496","client_nickname":"Eidocar","client_type":"0"},{"clid":"256","cid":"1015","client_database_id":"359","client_nickname":"Fisty","client_type":"0"},{"clid":"257","cid":"217","client_database_id":"14725","client_nickname":"[Sol] DivineMaurader","client_type":"0"},{"clid":"259","cid":"217","client_database_id":"1530","client_nickname":"Raegair","client_type":"0"},{"clid":"263","cid":"814","client_database_id":"14264","client_nickname":"GraySea","client_type":"0"},{"clid":"264","cid":"33","client_database_id":"76","client_nickname":"Winkle Tinkle","client_type":"0"},{"clid":"266","cid":"217","client_database_id":"14045","client_nickname":"TheBofelsh","client_type":"0"},{"clid":"267","cid":"1718","client_database_id":"9069","client_nickname":"Who uses bows","client_type":"0"},{"clid":"268","cid":"1542","client_database_id":"11997","client_nickname":"Moody","client_type":"0"},{"clid":"270","cid":"1542","client_database_id":"64","client_nickname":"Tifa Ran","client_type":"0"},{"clid":"274","cid":"1542","client_database_id":"13706","client_nickname":"Dear Bora","client_type":"0"},{"clid":"280","cid":"1542","client_database_id":"12094","client_nickname":"Spikecell","client_type":"0"},{"clid":"282","cid":"1542","client_database_id":"14296","client_nickname":"Xoris\/Lexiea","client_type":"0"},{"clid":"283","cid":"1542","client_database_id":"13671","client_nickname":"Maximus","client_type":"0"},{"clid":"287","cid":"1625","client_database_id":"13409","client_nickname":"lord light","client_type":"0"},{"clid":"294","cid":"217","client_database_id":"13627","client_nickname":"Capt","client_type":"0"},{"clid":"297","cid":"1718","client_database_id":"13511","client_nickname":"Jesse221","client_type":"0"},{"clid":"298","cid":"1542","client_database_id":"9911","client_nickname":"Sarah May","client_type":"0"},{"clid":"304","cid":"1704","client_database_id":"14726","client_nickname":"YourLastSight666","client_type":"0"},{"clid":"306","cid":"1542","client_database_id":"14488","client_nickname":"[HoD] Joao","client_type":"0"},{"clid":"309","cid":"814","client_database_id":"14727","client_nickname":"AIfef","client_type":"0"},{"clid":"311","cid":"1542","client_database_id":"13328","client_nickname":"Voidloss","client_type":"0"},{"clid":"321","cid":"736","client_database_id":"5163","client_nickname":"Cloud","client_type":"0"},{"clid":"322","cid":"217","client_database_id":"12324","client_nickname":"dodo","client_type":"0"},{"clid":"328","cid":"1542","client_database_id":"14512","client_nickname":"Gendry Harlaw","client_type":"0"},{"clid":"332","cid":"1542","client_database_id":"13912","client_nickname":"Prysoner","client_type":"0"},{"clid":"342","cid":"1718","client_database_id":"3308","client_nickname":"Vindictive","client_type":"0"},{"clid":"343","cid":"1542","client_database_id":"150","client_nickname":"Jadis","client_type":"0"}],"teams":[{"cid":"25","pid":"0","channel_order":"0","channel_name":"Main Lobby","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"33","pid":"0","channel_order":"25","channel_name":"Away From Keyboard","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"55","pid":"0","channel_order":"33","channel_name":"PvE","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"1571","pid":"55","channel_order":"0","channel_name":"Community Events","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"225","pid":"55","channel_order":"1571","channel_name":"Server Events","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"659","pid":"225","channel_order":"0","channel_name":"Living Story","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"660","pid":"225","channel_order":"659","channel_name":"Wurm","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"57","pid":"55","channel_order":"225","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"250","pid":"57","channel_order":"0","channel_name":"Dungeons 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"61","pid":"57","channel_order":"250","channel_name":"Dungeons 1","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"63","pid":"57","channel_order":"61","channel_name":"Dungeons 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1741","pid":"55","channel_order":"57","channel_name":"Silverwastes","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2","pid":"0","channel_order":"55","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1659","pid":"2","channel_order":"0","channel_name":"Server Meeting","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1446","pid":"2","channel_order":"1659","channel_name":"Float","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"95","pid":"2","channel_order":"1446","channel_name":"Roaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"725","pid":"2","channel_order":"95","channel_name":"EOTM","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"15","pid":"2","channel_order":"725","channel_name":"Blue Borderland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"17","pid":"15","channel_order":"0","channel_name":"Blue Team 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"18","pid":"15","channel_order":"17","channel_name":"Blue Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"20","pid":"2","channel_order":"15","channel_name":"Green Borderland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"145","pid":"20","channel_order":"0","channel_name":"Green Team 1","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"252","pid":"20","channel_order":"145","channel_name":"Green Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"9","pid":"2","channel_order":"20","channel_name":"Red Borderland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"6","pid":"9","channel_order":"0","channel_name":"Red Team 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"274","pid":"9","channel_order":"6","channel_name":"Red Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"26","pid":"2","channel_order":"9","channel_name":"Eternal Battlegrounds","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"21","pid":"26","channel_order":"0","channel_name":"EB Team 1","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1767","pid":"21","channel_order":"0","channel_name":"Sass Mouth","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"28","pid":"26","channel_order":"21","channel_name":"EB Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1622","pid":"26","channel_order":"28","channel_name":"EB group A","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1623","pid":"26","channel_order":"1622","channel_name":"EB Group B","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1624","pid":"26","channel_order":"1623","channel_name":"EB Group C","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"248","pid":"0","channel_order":"2","channel_name":"WvW Reset Meeting","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"24","pid":"0","channel_order":"248","channel_name":"Guild Channels","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1467","pid":"24","channel_order":"0","channel_name":"Asguardian Legends [AGLS]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"1474","pid":"1467","channel_order":"0","channel_name":"Odin's Throne","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1475","pid":"1467","channel_order":"1474","channel_name":"Valhalla (PvP)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1485","pid":"1467","channel_order":"1475","channel_name":"Ragnarok (WvW)","channel_topic":"","total_clients":"6","channel_needed_subscribe_power":"0"},{"cid":"1476","pid":"1467","channel_order":"1485","channel_name":"Yggdrasil (PvE)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1498","pid":"1467","channel_order":"1476","channel_name":"Niflheim (Other Games)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"822","pid":"24","channel_order":"1467","channel_name":"Astalderas Chosen [ASTC]","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1360","pid":"822","channel_order":"0","channel_name":"PVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1362","pid":"822","channel_order":"1360","channel_name":"Dungeon\/Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1371","pid":"822","channel_order":"1362","channel_name":"Roaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1375","pid":"822","channel_order":"1371","channel_name":"Gala's Bar","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1642","pid":"822","channel_order":"1375","channel_name":"Sahren's Getaway","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1764","pid":"822","channel_order":"1642","channel_name":"STAR","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1765","pid":"822","channel_order":"1764","channel_name":"CITIZEN","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1766","pid":"822","channel_order":"1765","channel_name":"HYPE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1625","pid":"24","channel_order":"822","channel_name":"Bellicose Banana Club [Bana]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"1631","pid":"1625","channel_order":"0","channel_name":"BANA BLACK OPS [ WvW1 ]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1643","pid":"1625","channel_order":"1631","channel_name":"BANA DELTA team [ WvW2 ]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1644","pid":"1625","channel_order":"1643","channel_name":"BANA ALPHA team [WvW3]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1653","pid":"1625","channel_order":"1644","channel_name":"bana guild mission\/meetings [PVE]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1588","pid":"24","channel_order":"1625","channel_name":"Brethren [PAIN]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1590","pid":"1588","channel_order":"0","channel_name":"WvW #paintrain >:D","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1680","pid":"1588","channel_order":"1590","channel_name":"Guild Missions","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"1669","pid":"1588","channel_order":"1680","channel_name":"Music Room: Enjoy the Vibe","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1589","pid":"1588","channel_order":"1669","channel_name":"PVE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1591","pid":"1589","channel_order":"0","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1684","pid":"1589","channel_order":"1591","channel_name":"Fractals of the Mists","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1689","pid":"1588","channel_order":"1589","channel_name":"Guild Information Board","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1668","pid":"1588","channel_order":"1689","channel_name":"Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1682","pid":"1588","channel_order":"1668","channel_name":"Brethren Council Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1592","pid":"1588","channel_order":"1682","channel_name":"Blightwing's Perch","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"109","pid":"24","channel_order":"1588","channel_name":"Charter Vanguard [CV]","channel_topic":"Courage, Honesty, and Respect","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"114","pid":"109","channel_order":"0","channel_name":"Missions","channel_topic":"Saturday Guild Missions!","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"355","pid":"114","channel_order":"0","channel_name":"Troll Killer Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1488","pid":"114","channel_order":"355","channel_name":"18+","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"115","pid":"109","channel_order":"114","channel_name":"WvW","channel_topic":"For HoD!","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"116","pid":"109","channel_order":"115","channel_name":"PvE","channel_topic":"Dungeons, jump puzzles, hearts and stories","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"576","pid":"109","channel_order":"116","channel_name":"sPVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1401","pid":"109","channel_order":"576","channel_name":"Team 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1403","pid":"109","channel_order":"1401","channel_name":"Team 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1439","pid":"109","channel_order":"1403","channel_name":"Team 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"383","pid":"24","channel_order":"109","channel_name":"Contemporary Heroes [CH]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"814","pid":"383","channel_order":"0","channel_name":"CH Channel 1 (Lobby)","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"385","pid":"383","channel_order":"814","channel_name":"CH Channel 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"386","pid":"383","channel_order":"385","channel_name":"CH Channel 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"726","pid":"383","channel_order":"386","channel_name":"CH Channel 4","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"496","pid":"383","channel_order":"726","channel_name":"[CH]Small Group Channel 1 (Private)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"384","pid":"383","channel_order":"496","channel_name":"[CH]Small Group Channel 2 (Private)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1236","pid":"383","channel_order":"384","channel_name":"[CH]Small Group Channel 3 (Private)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"387","pid":"383","channel_order":"1236","channel_name":"[CH]Small Group Channel 4 (password)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"715","pid":"383","channel_order":"387","channel_name":"Officer Channel (password)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1725","pid":"24","channel_order":"383","channel_name":"Daggers and Arrows (DaA)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1726","pid":"1725","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1727","pid":"1725","channel_order":"1726","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1728","pid":"1725","channel_order":"1727","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1729","pid":"1725","channel_order":"1728","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1737","pid":"1725","channel_order":"1729","channel_name":"Mike's American Home","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1582","pid":"24","channel_order":"1725","channel_name":"Digital Sacrifice [DS]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1615","pid":"1582","channel_order":"0","channel_name":"Welcome to Prof Kaze's Teaching Room","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"1750","pid":"1582","channel_order":"1615","channel_name":"Harvey's Squad [SHYT]","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"1761","pid":"1582","channel_order":"1750","channel_name":"Super Charrio Bros","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"736","pid":"24","channel_order":"1582","channel_name":"Exciting Role Play [ERP]","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"738","pid":"736","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"741","pid":"736","channel_order":"738","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1089","pid":"736","channel_order":"741","channel_name":"The Love Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1760","pid":"736","channel_order":"1089","channel_name":"Dungeon of Gaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1542","pid":"24","channel_order":"736","channel_name":"Hordes of Denravi [HoD]","channel_topic":"","total_clients":"40","channel_needed_subscribe_power":"0"},{"cid":"1543","pid":"1542","channel_order":"0","channel_name":"Roaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1704","pid":"1542","channel_order":"1543","channel_name":"The Serious Room","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1580","pid":"1542","channel_order":"1704","channel_name":"PVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1587","pid":"1542","channel_order":"1580","channel_name":"18+ Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1746","pid":"1542","channel_order":"1587","channel_name":"The Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1768","pid":"1542","channel_order":"1746","channel_name":"Hyperbolic Time Chamber","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1707","pid":"24","channel_order":"1542","channel_name":"Mist Ráiders","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1708","pid":"1707","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1711","pid":"1707","channel_order":"1708","channel_name":"GvG","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1712","pid":"1711","channel_order":"0","channel_name":"GvG Kill Group","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1714","pid":"1707","channel_order":"1711","channel_name":"sPvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1730","pid":"1707","channel_order":"1714","channel_name":"Meeting - office room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1710","pid":"1707","channel_order":"1730","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1715","pid":"1707","channel_order":"1710","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1584","pid":"24","channel_order":"1707","channel_name":"Nerfed Again [NERF]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1690","pid":"1584","channel_order":"0","channel_name":"quiet time","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1598","pid":"24","channel_order":"1584","channel_name":"Outlaws,Renegades and Rebels [ORR]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1600","pid":"1598","channel_order":"0","channel_name":"PVE","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1759","pid":"1600","channel_order":"0","channel_name":"Frigid`s ice palace","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1602","pid":"1598","channel_order":"1600","channel_name":"WVW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1612","pid":"1602","channel_order":"0","channel_name":"EBG","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1613","pid":"1612","channel_order":"0","channel_name":"Borderlands","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1749","pid":"1602","channel_order":"1612","channel_name":"Will`s cave","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1603","pid":"1598","channel_order":"1602","channel_name":"sPVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1778","pid":"1603","channel_order":"0","channel_name":"Drago`s portal","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1604","pid":"1598","channel_order":"1603","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1605","pid":"1598","channel_order":"1604","channel_name":"Chat","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1414","pid":"24","channel_order":"1598","channel_name":"Partners N Cryme [PIC]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1429","pid":"1414","channel_order":"0","channel_name":"sPVP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1430","pid":"1414","channel_order":"1429","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1597","pid":"1414","channel_order":"1430","channel_name":"Central Anime Temp Channel(GW2 Only)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1747","pid":"1414","channel_order":"1597","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"30","pid":"24","channel_order":"1414","channel_name":"Phaze [PHZE]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"41","pid":"30","channel_order":"0","channel_name":"Dungeon","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"40","pid":"30","channel_order":"41","channel_name":"WvW Main","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"224","pid":"40","channel_order":"0","channel_name":"WvW Squad","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"46","pid":"30","channel_order":"40","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"108","pid":"30","channel_order":"46","channel_name":"Non Gw2 Stuff","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"179","pid":"30","channel_order":"108","channel_name":"Leaders Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1716","pid":"24","channel_order":"30","channel_name":"Prophecies of Annihilation (POA)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1718","pid":"1716","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"10","channel_needed_subscribe_power":"0"},{"cid":"1743","pid":"1716","channel_order":"1718","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1721","pid":"1716","channel_order":"1743","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1722","pid":"1721","channel_order":"0","channel_name":"Story mode","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1723","pid":"1721","channel_order":"1722","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1720","pid":"1716","channel_order":"1721","channel_name":"Meeting Hall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1744","pid":"1720","channel_order":"0","channel_name":"Open Meeting Hall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1745","pid":"1720","channel_order":"1744","channel_name":"Closed Meeting Hall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1724","pid":"1716","channel_order":"1720","channel_name":"AFK","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"997","pid":"24","channel_order":"1716","channel_name":"Quaggan Slavers [WHIP]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1015","pid":"997","channel_order":"0","channel_name":"Choo Choo","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"1017","pid":"997","channel_order":"1015","channel_name":"Killing Fools","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1075","pid":"997","channel_order":"1017","channel_name":"Ermergerd Dark Solz","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1451","pid":"997","channel_order":"1075","channel_name":"Blast from the Past (GW1)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1693","pid":"24","channel_order":"997","channel_name":"Rift Legion [Mist]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1695","pid":"1693","channel_order":"0","channel_name":"Guest Bathroom","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1703","pid":"1693","channel_order":"1695","channel_name":"Charr Party","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1009","pid":"24","channel_order":"1693","channel_name":"Serenity Edge [TRE]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"217","pid":"24","channel_order":"1009","channel_name":"Sovereign of Lords [Sol]","channel_topic":"","total_clients":"32","channel_needed_subscribe_power":"0"},{"cid":"1445","pid":"217","channel_order":"0","channel_name":"Happy Fun Time","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"222","pid":"217","channel_order":"1445","channel_name":"sPvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"220","pid":"217","channel_order":"222","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"218","pid":"217","channel_order":"220","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"219","pid":"218","channel_order":"0","channel_name":"Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"221","pid":"218","channel_order":"219","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"501","pid":"217","channel_order":"218","channel_name":"The Lords Gathering","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"549","pid":"501","channel_order":"0","channel_name":"Sol's Office","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1347","pid":"217","channel_order":"501","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"91","pid":"24","channel_order":"217","channel_name":"The Assassin Army [TAA]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"768","pid":"91","channel_order":"0","channel_name":"Liz's Channel. Poke if needed","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1574","pid":"91","channel_order":"768","channel_name":"Machew's Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1756","pid":"24","channel_order":"91","channel_name":"The Ministry [TM]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1757","pid":"1756","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1758","pid":"1756","channel_order":"1757","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1771","pid":"1758","channel_order":"0","channel_name":"Dungeons","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1772","pid":"1758","channel_order":"1771","channel_name":"Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1774","pid":"1758","channel_order":"1772","channel_name":"Silverwastes","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1775","pid":"1758","channel_order":"1774","channel_name":"Living Story","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1773","pid":"1756","channel_order":"1758","channel_name":"Meeting Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1777","pid":"1756","channel_order":"1773","channel_name":"PvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1611","pid":"24","channel_order":"1756","channel_name":"The Raging Storm [STRM]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1754","pid":"1611","channel_order":"0","channel_name":"WvW","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1755","pid":"1611","channel_order":"1754","channel_name":"The Bunker","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1617","pid":"1611","channel_order":"1755","channel_name":"AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"710","pid":"24","channel_order":"1611","channel_name":"The Snow Rose Resistance [Snow]","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"1593","pid":"710","channel_order":"0","channel_name":"Dungeons & Fractals","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1594","pid":"1593","channel_order":"0","channel_name":"Team ZefferEtc","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1595","pid":"1593","channel_order":"1594","channel_name":"Team PrismStormLord","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1165","pid":"710","channel_order":"1593","channel_name":"The Gazebo (Other Games)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"717","pid":"24","channel_order":"710","channel_name":"The Sons of Tzu [WAR]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"719","pid":"717","channel_order":"0","channel_name":"The [WAR] Council Chamber","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"718","pid":"717","channel_order":"719","channel_name":"WvW","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"720","pid":"717","channel_order":"718","channel_name":"PvE","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"958","pid":"717","channel_order":"720","channel_name":"PvP Arena","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"959","pid":"958","channel_order":"0","channel_name":"Red Team","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"960","pid":"958","channel_order":"959","channel_name":"Blue Team","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1091","pid":"717","channel_order":"958","channel_name":"The AFK Lounge","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1166","pid":"1091","channel_order":"0","channel_name":"Hellbound's Smokehut","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1619","pid":"717","channel_order":"1091","channel_name":"Ed and Barbie's Tea Room","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"1632","pid":"24","channel_order":"717","channel_name":"The Third Eclipse [Howl]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1636","pid":"1632","channel_order":"0","channel_name":"Hunting Grounds","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1641","pid":"1632","channel_order":"1636","channel_name":"The Den","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1649","pid":"1641","channel_order":"0","channel_name":"Kitten's Play Pen","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1583","pid":"24","channel_order":"1632","channel_name":"Wankers and Nerdy Gamers [WANG]","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1731","pid":"24","channel_order":"1583","channel_name":"Valkyria Immortalis","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1734","pid":"1731","channel_order":"0","channel_name":"Charrbucks","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1739","pid":"1731","channel_order":"1734","channel_name":"Ed's Patio","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"56","pid":"0","channel_order":"24","channel_name":"SPvP","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"71","pid":"56","channel_order":"0","channel_name":"Group 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"72","pid":"56","channel_order":"71","channel_name":"Group 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1325","pid":"56","channel_order":"72","channel_name":"Group 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1326","pid":"56","channel_order":"1325","channel_name":"Group 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"}],"virtualserver_antiflood_points_needed_command_block":"150","virtualserver_antiflood_points_needed_ip_block":"250","virtualserver_antiflood_points_tick_reduce":"5","virtualserver_ask_for_privilegekey":"0","virtualserver_autostart":"1","virtualserver_channel_temp_delete_delay_default":"0","virtualserver_channelsonline":"214","virtualserver_client_connections":"15752","virtualserver_clientsonline":"167","virtualserver_codec_encryption_mode":"0","virtualserver_complain_autoban_count":"5","virtualserver_complain_autoban_time":"1200","virtualserver_complain_remove_time":"3600","virtualserver_created":"0","virtualserver_default_channel_admin_group":"5","virtualserver_default_channel_group":"7","virtualserver_default_server_group":"7","virtualserver_download_quota":"18446744073709551615","virtualserver_filebase":"files\/virtualserver_1","virtualserver_flag_password":"1","virtualserver_hostbanner_gfx_interval":"0","virtualserver_hostbanner_gfx_url":"","virtualserver_hostbanner_mode":"0","virtualserver_hostbanner_url":"http:\/\/www.hengeofdenravi.com","virtualserver_hostbutton_gfx_url":"","virtualserver_hostbutton_tooltip":"","virtualserver_hostbutton_url":"","virtualserver_hostmessage":"Final day! http:\/\/www.hengeofdenravi.com\/index.php\/topic,2023.0.html","virtualserver_hostmessage_mode":"0","virtualserver_icon_id":"0","virtualserver_id":"1","virtualserver_ip":"","virtualserver_log_channel":"1","virtualserver_log_client":"1","virtualserver_log_filetransfer":"1","virtualserver_log_permissions":"1","virtualserver_log_query":"1","virtualserver_log_server":"1","virtualserver_machine_id":"","virtualserver_max_download_total_bandwidth":"18446744073709551615","virtualserver_max_upload_total_bandwidth":"18446744073709551615","virtualserver_maxclients":"350","virtualserver_min_client_version":"1373587200","virtualserver_min_clients_in_channel_before_forced_silence":"500","virtualserver_month_bytes_downloaded":"4452574","virtualserver_month_bytes_uploaded":"745830","virtualserver_name":"www.hengeofdenravi.com","virtualserver_name_phonetic":"","virtualserver_needed_identity_security_level":"8","virtualserver_password":"SRJRjkPqAnT6BXvIkwIumDWMxRE=","virtualserver_platform":"Linux","virtualserver_port":"9987","virtualserver_priority_speaker_dimm_modificator":"-18.0000","virtualserver_query_client_connections":"59579","virtualserver_queryclientsonline":"1","virtualserver_reserved_slots":"0","virtualserver_status":"online","virtualserver_total_bytes_downloaded":"5022685219","virtualserver_total_bytes_uploaded":"176541033","virtualserver_total_packetloss_control":"0.0032","virtualserver_total_packetloss_keepalive":"0.0027","virtualserver_total_packetloss_speech":"0.0018","virtualserver_total_packetloss_total":"0.0025","virtualserver_total_ping":"101.7697","virtualserver_unique_identifier":"CpZsRk9cvQrobpgjwhTtO+gJJVU=","virtualserver_upload_quota":"18446744073709551615","virtualserver_uptime":"2238262","virtualserver_version":"3.0.11.2 [Build: 1418654632]","virtualserver_weblist_enabled":"0","virtualserver_welcomemessage":"Welcome to the HengeofDenravi.com Community VOIP server."}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/2_response.txt b/gameq/tests/Protocols/Providers/Teamspeak3/2_response.txt deleted file mode 100644 index fb754d1..0000000 --- a/gameq/tests/Protocols/Providers/Teamspeak3/2_response.txt +++ /dev/null @@ -1,48 +0,0 @@ -TS3 - -|| -Welcome to the TeamSpeak 3 ServerQuery interface, type "help" for a list of commands and "help " for information on a specific command. - error id=0 msg=ok - virtualserver_unique_identifier=fFu6LM7r7NKPJlFheQxo6rSweP4= virtualserver_name=DWM\sGaming virtualserver_welcomemessage=Welcome\sto\sDWM\sGaming,\svisit\sour\ssite\sat\s\s[URL]www.DWMGaming.com[\/URL]. virtualserver_platform=Linux virtualserver_version=3.0.11.2\s[Build:\s1418654632] virtualserver_maxclients=500 virtualserver_password virtualserver_clientsonline=107 virtualserver_channelsonline=231 virtualserver_created=1358228062 virtualserver_uptime=81901 virtualserver_codec_encryption_mode=0 virtualserver_hostmessage=Daylight\sSaving\sTime\sbegins\son\sMarch\s8th\s2015\sat\s2AM.\sThe\sclock\sis\sset\sto\sgo\sforward\s1\shour\sat\sthis\stime. virtualserver_hostmessage_mode=2 virtualserver_filebase=files\/virtualserver_1 virtualserver_default_server_group=8 virtualserver_default_channel_group=8 virtualserver_flag_password=0 virtualserver_default_channel_admin_group=5 virtualserver_max_download_total_bandwidth=18446744073709551615 virtualserver_max_upload_total_bandwidth=18446744073709551615 virtualserver_hostbanner_url=https:\/\/docs.google.com\/forms\/d\/11gB6-VhhQevWJb-LyGfU4AtCNGRFBrdkttOjfsP3fQA\/viewform?usp=send_form virtualserver_hostbanner_gfx_url virtualserver_hostbanner_gfx_interval=0 virtualserver_complain_autoban_count=5 virtualserver_complain_autoban_time=1200 -|| -virtualserver_complain_remove_time=3600 virtualserver_min_clients_in_channel_before_forced_silence=250 virtualserver_priority_speaker_dimm_modificator=-18.0000 virtualserver_id=1 virtualserver_antiflood_points_tick_reduce=15 virtualserver_antiflood_points_needed_command_block=150 virtualserver_antiflood_points_needed_ip_block=250 virtualserver_client_connections=797 virtualserver_query_client_connections=1946 virtualserver_hostbutton_tooltip=DWM\sGaming virtualserver_hostbutton_url virtualserver_hostbutton_gfx_url virtualserver_queryclientsonline=1 virtualserver_download_quota=18446744073709551615 virtualserver_upload_quota=18446744073709551615 virtualserver_month_bytes_downloaded=748237337 virtualserver_month_bytes_uploaded=58748505 virtualserver_total_bytes_downloaded=124757274671 virtualserver_total_bytes_uploaded=19436742837 virtualserver_port=9987 virtualserver_autostart=1 virtualserver_machine_id virtualserver_needed_identity_security_level=8 virtualserver_log_client=1 virtualserver_log_query=1 virtualserver_log_channel=1 virtualserver_log_permissions=1 virtualserver_log_server=1 virtualserver_log_filetransfer=1 virtualserver_min_client_version=1373587200 virtualserver_name_phonetic virtualserver_icon_id=0 virtualserver_reserved_slots=0 virtualserver_total_packetloss_speech=0.0037 virtualserver_total_packetloss_keepalive=0.0045 virtualserver_total_packetloss_control=0.0050 virtualserver_total_packetloss_total=0.0050 virtualserver_ -|| -total_ping=114.1226 virtualserver_ip=67.43.5.200 virtualserver_weblist_enabled=1 virtualserver_ask_for_privilegekey=0 virtualserver_hostbanner_mode=2 virtualserver_channel_temp_delete_delay_default=0 virtualserver_status=online connection_filetransfer_bandwidth_sent=0 connection_filetransfer_bandwidth_received=0 connection_filetransfer_bytes_sent_total=627470236 connection_filetransfer_bytes_received_total=13800215 connection_packets_sent_speech=101299587 connection_bytes_sent_speech=11344589012 connection_packets_received_speech=23764523 connection_bytes_received_speech=2691927682 connection_packets_sent_keepalive=13215158 connection_bytes_sent_keepalive=541821478 connection_packets_received_keepalive=13200222 connection_bytes_received_keepalive=554106917 connection_packets_sent_control=1563103 connection_bytes_sent_control=291637874 connection_packets_received_control=1544876 connection_bytes_received_control=94098377 connection_packets_sent_total=116077848 connection_bytes_sent_total=12178048364 connection_packets_received_total=38509621 connection_bytes_received_total=3340132976 connection_bandwidth_sent_last_second_total=95669 connection_bandwidth_sent_last_minute_total=96860 connection_bandwidth_received_last_second_total=49675 connection_bandwidth_received_last_minute_total=47068 - error id=0 msg=ok - error id=0 msg=ok - clid=4 cid=309 client_database_id=38 client_nickname=Viper client_type=0|clid=6 cid=1098 client_database_id=5546 client_nickname=barrysauce client_type=0|clid=7 cid=4283 client_database_id=7739 client_nickname=Naked\sSnake client_type=0|clid=8 cid=872 client_database_id=4816 client_nickname=KillerP_ssy\s[18,2] client_type=0|clid=10 cid=495 client_database_id=2646 client_nickname=b1ue client_type=0|clid=12 cid=1 client_database_id=4968 client_nickname=Unknown\sfrom\s71.199.205.69:44975 client_type=1|clid=13 cid=705 client_database_id=6818 client_nickname=Pantykill client_type=0|clid=14 cid=705 client_database_id=63 client_nickname=Whitehawk client_type=0|clid=16 cid=1068 client_database_id=2773 client_nickname=Noob.Saibot\s(18)\sGeneral client_type=0|clid=24 cid=716 client_database_id=6653 client_nickname=Maes.Sunsanxian\s[7]11 client_type=0|clid=26 cid=321 client_database_id=2710 client_nickname=Undisonus client_type=0|clid=28 cid=1380 client_database_id=7827 client_nickname=Avantarion client_type=0|clid=31 cid=4738 client_database_id=1772 client_nickname=Pzykotik\s[13] client_type=0|clid=34 cid=4485 client_database_id=7786 client_nickname==242=\sCPT.\sHelios11 client_type=0|clid=35 cid=4789 client_database_id=7152 client_nickname=glacepk\s-\sFrank\s[7] client_type=0|clid=36 cid=581 client_database_id=7338 client_nickname=Tolu2weenies(10) client_type=0|clid=42 cid=1247 client_database_id=7708 client_nickname=RainbowBrite[18] client_type=0|clid=45 cid=4789 client_database_id=6984 client_nickname=Akmon[10] client_type=0|clid=48 cid=707 client_database_id=4505 client_nickname=Elaeus\s[17,85] client_type=0|clid=49 cid=872 client_database_id=7646 client_nickname=TripleRocket\s[4] client_type=0|clid=50 cid=4789 client_database_id=7020 client_nickname=Mashala[12] client_type=0|clid=53 cid=2115 client_database_id=6649 client_nickname=Piokil[9] client_type=0|clid=57 cid=1578 client_database_id=6489 client_nickname=mWik[18]^^[4] client_type=0|clid=60 cid=581 client_database_id=5144 client_nickname=BirdofSong[16][5] client_type=0|clid=63 cid=38 client_database_id=7819 client_nickname=Buder client_type=0|clid=65 cid=2083 client_database_id=7057 client_nickname=Narcotx client_type=0|clid=66 cid=4283 client_database_id=5254 client_nickname=Soarden\s[16]\s[6] client_type=0|clid=67 cid=581 client_database_id=3205 client_nickname=-ExT-Fraank(19) client_type=0|clid=68 cid=3373 client_database_id=7791 client_nickname=Ohai\sIm\sAlex client_type=0|clid=69 cid=4632 client_database_id=7746 client_nickname=xwalle\s(5) client_type=0|clid=70 cid=321 client_database_id=6618 client_nickname=Cutie client_type=0|clid=72 cid=4789 client_database_id=4817 client_nickname=MeiAnne\s[15] client_type=0|clid=73 cid=581 client_database_id=7544 client_nickname=Keikat[9] client_type=0|clid=77 cid=321 client_database_id=6820 client_nickname=Jediyodaone client_type=0|clid=82 cid=716 client_database_id=7380 client_nickname=Burnt[8] client_type=0|clid=83 cid=3373 client_database_id=6480 client_nickname=Savannah client_type=0|clid=84 cid=1956 client_database_id=5460 client_nickname=hellscythe[6] client_type=0|clid=87 cid=4738 client_database_id=2815 client_nickname=Road client_type=0|clid=95 cid=1068 client_database_id=7682 client_nickname=ST4RF0X\s11 client_type=0|clid=100 cid=581 client_database_id=3479 client_nickname=angelfish999999999(13)1111 client_type=0|clid=101 cid=309 client_database_id=6746 client_nickname=brandonlopezypr client_type=0|clid=102 cid=1276 client_database_id=7799 client_nickname=MrRiddlez client_type=0|clid=107 cid=309 client_database_id=2 client_nickname=Tide client_type=0|clid=110 cid=1401 client_database_id=5132 client_nickname=jacketstud\s[9] client_type=0|clid=117 cid=1956 client_database_id=3617 client_nickname=fadedshadows1(10) client_type=0|clid=118 cid=480 client_database_id=7044 client_nickname=XalvioN\s[17] client_type=0|clid=119 cid=1956 client_database_id=3101 client_nickname=Themius(15)\sNukeDynasty(5) client_type=0|clid=123 cid=309 client_database_id=33 client_nickname=HomeStyle\sChillin client_type=0|clid=124 cid=1956 client_database_id=4778 client_nickname=CoronApMor[8] client_type=0|clid=126 cid=309 client_database_id=1534 client_nickname=[PNDA]KillerElite client_type=0|clid=127 cid=1116 client_database_id=4643 client_nickname=The\sGhiest[18] client_type=0|clid=130 cid=581 client_database_id=7713 client_nickname=TimesEdge client_type=0|clid=134 cid=1 client_database_id=4656 client_nickname=MagnusEffect\s(15) clie -|| -nt_type=0|clid=135 cid=716 client_database_id=6583 client_nickname=Maxed_Pain[7] client_type=0|clid=137 cid=1098 client_database_id=3094 client_nickname=HurpMcDurp client_type=0|clid=138 cid=321 client_database_id=7758 client_nickname=xStyk client_type=0|clid=139 cid=416 client_database_id=1519 client_nickname=Epic\sWinning client_type=0|clid=140 cid=1401 client_database_id=6306 client_nickname=Zerginater\p5\p client_type=0|clid=142 cid=16 client_database_id=6710 client_nickname=samou\s[5]11 client_type=0|clid=144 cid=1098 client_database_id=1430 client_nickname=-Q- client_type=0|clid=145 cid=3373 client_database_id=1757 client_nickname=dark-gaunt client_type=0|clid=153 cid=480 client_database_id=7367 client_nickname=MazeElwin\s[̯̪̣̣Ì͖̯12]̿͌͒ÍÍ›Í client_type=0|clid=156 cid=16 client_database_id=35 client_nickname=wambatx client_type=0|clid=157 cid=581 client_database_id=4810 client_nickname=Kleboldx1-Prime\s(18)(14)(1) client_type=0|clid=158 cid=4738 client_database_id=7800 client_nickname=Xpl0jd client_type=0|clid=159 cid=309 client_database_id=4887 client_nickname=dap client_type=0|clid=160 cid=707 client_database_id=4841 client_nickname=Snixy\s[18,15] client_type=0|clid=163 cid=716 client_database_id=4443 client_nickname=-Apolo\s[13] client_type=0|clid=165 cid=587 client_database_id=5281 client_nickname=Ret\s[Regular\sType\sDude] client_type=0|clid=166 cid=1956 client_database_id=3964 client_nickname=Caliburated(18) clien -|| -t_type=0|clid=167 cid=38 client_database_id=7818 client_nickname=Kyahco client_type=0|clid=168 cid=587 client_database_id=2033 client_nickname=Destroierrr9[18] client_type=0|clid=171 cid=1956 client_database_id=2776 client_nickname=Otaku1988(14) client_type=0|clid=178 cid=495 client_database_id=4175 client_nickname=Snowman client_type=0|clid=180 cid=38 client_database_id=7820 client_nickname=TomTomWhon client_type=0|clid=181 cid=4796 client_database_id=4474 client_nickname=buckw\s(18)â–º client_type=0|clid=184 cid=4789 client_database_id=5463 client_nickname=Hitoriac\s[16]\s<--\sLucky\sWabbit client_type=0|clid=185 cid=707 client_database_id=4898 client_nickname=Zienox[12] client_type=0|clid=189 cid=1116 client_database_id=4664 client_nickname=Laucivol\s[18] client_type=0|clid=190 cid=3373 client_database_id=4885 client_nickname=SomeDiabeticKid client_type=0|clid=191 cid=1116 client_database_id=4724 client_nickname=AlphaOC\s[18] client_type=0|clid=192 cid=3373 client_database_id=3536 client_nickname=The\sHazzard client_type=0|clid=194 cid=309 client_database_id=5367 client_nickname=Philifly client_type=0|clid=197 cid=716 client_database_id=7447 client_nickname=_Shinobu_Oshino_\s[8] client_type=0|clid=201 cid=480 client_database_id=7448 client_nickname=casey0827 client_type=0|clid=202 cid=716 client_database_id=3711 client_nickname=Tı̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨ailsx{16} client_type=0|clid=203 cid=587 client_database_id=3215 clien -|| -t_nickname=SapphireSirenz[17] client_type=0|clid=205 cid=2083 client_database_id=7350 client_nickname=Shizzio[6] client_type=0|clid=207 cid=309 client_database_id=6409 client_nickname=Kanaka client_type=0|clid=209 cid=480 client_database_id=4603 client_nickname=CocxyMcChunk\s[9] client_type=0|clid=219 cid=480 client_database_id=6754 client_nickname=DruCova\s[8] client_type=0|clid=225 cid=1276 client_database_id=7247 client_nickname=Mr\sKazz client_type=0|clid=227 cid=581 client_database_id=7710 client_nickname=Uhhninjeesword(10) client_type=0|clid=229 cid=4283 client_database_id=7132 client_nickname=doritofish[16] client_type=0|clid=235 cid=716 client_database_id=3938 client_nickname=Botax\s11 client_type=0|clid=236 cid=38 client_database_id=7817 client_nickname=Aziboo-music client_type=0|clid=241 cid=480 client_database_id=4617 client_nickname=Druul client_type=0|clid=258 cid=480 client_database_id=2765 client_nickname=Junki559[17] client_type=0 - -|| -error id=0 msg=ok - error id=0 msg=ok - cid=1 pid=0 channel_order=0 channel_name=Lobby\s-\sAsk\sto\sbe\spulled\sdown channel_topic=Welcome\sto\sDWM\sGaming total_clients=2 channel_needed_subscribe_power=0|cid=3622 pid=1 channel_order=0 channel_name=Lost?\sJoin\sthis\schannel,\swe'll\shelp\syou. channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3476 pid=0 channel_order=1 channel_name=[*cspacer\s0]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3483 pid=0 channel_order=3476 channel_name=[cspacer]Community\sAdministration channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2 pid=3483 channel_order=0 channel_name=Admin\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=705 pid=3483 channel_order=2 channel_name=Help\sRoom channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=2526 pid=3483 channel_order=705 channel_name=Website\sdevelopment channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4311 pid=3483 channel_order=2526 channel_name=Promotions\/Ads\/Photoshop channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4009 pid=3483 channel_order=4311 channel_name=Conference\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4485 pid=3483 channel_order=4009 channel_name=Convergence\sMeeting\sNotes channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=4795 pid=3483 channel_order=4485 channel_name=w -|| -ww.twitch.tv\/convergencegames\/ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3455 pid=0 channel_order=3483 channel_name=[*cspacer\s9]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=16 pid=0 channel_order=3455 channel_name=[cspacer]AFK channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=3450 pid=0 channel_order=16 channel_name=[*cspacer\s7]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=124 pid=0 channel_order=3450 channel_name=[cspacer]ARMA\sSeries channel_topic=ARMA\sSeries\sGame\sChat\sand\sDiscussion total_clients=0 channel_needed_subscribe_power=0|cid=347 pid=124 channel_order=0 channel_name=Arma3\sWasteland channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=315 pid=124 channel_order=347 channel_name=DayZ\sStandalone channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=402 pid=124 channel_order=315 channel_name=Breaking\sPoint channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=579 pid=0 channel_order=124 channel_name=[*cspacer\s4]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=303 pid=0 channel_order=579 channel_name=[cspacer]Battlefield\sSeries channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3 pid=303 channel_order=0 channel_name=Battlefield\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=300 pid=303 channel_order=3 channel_name=Battlefield\ -|| -s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3481 pid=0 channel_order=303 channel_name=[*cspacer01]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=5 pid=0 channel_order=3481 channel_name=[cspacer]Call\sof\sDuty\sSeries channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=309 pid=5 channel_order=0 channel_name=Advanced\sWarfare channel_topic total_clients=8 channel_needed_subscribe_power=0|cid=1098 pid=5 channel_order=309 channel_name=Advanced\sWarfare\sRoom\s2 channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=2015 pid=5 channel_order=1098 channel_name=Advanced\sWarfare\sAFK channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=6 pid=5 channel_order=2015 channel_name=Black\sOps\sII channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=9 pid=5 channel_order=6 channel_name=COD\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3516 pid=0 channel_order=5 channel_name=[*cspacer\s81]༖ channel_topic total_clients=-1 channel_needed_subscribe_power=99|cid=522 pid=0 channel_order=3516 channel_name=[cspacer]League\sof\sLegends channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=12 pid=522 channel_order=0 channel_name=League\sof\sLegends\s-\sLobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=495 pid=12 channel_order=0 channel_name=Normals channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=503 pid=12 channel_order=495 channel_name=Normal\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1276 pid=12 channel_order=503 channel_name=Normal\s3 channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=2489 pid=12 channel_order=1276 channel_name=Low\sLevels channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1796 pid=12 channel_order=2489 channel_name=Ranked\s5's\s-\sDon't\sdisturb\sduring\sprac. channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=416 pid=12 channel_order=1796 channel_name=Jared's\sChannel channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1250 pid=522 channel_order=12 channel_name=Tournament\splanning channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1252 pid=522 channel_order=1250 channel_name=Admin\son\sstandby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1251 pid=1252 channel_order=0 channel_name=Tournament\sLobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=571 pid=0 channel_order=522 channel_name=[*cspacer\s1]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2645 pid=0 channel_order=571 channel_name=[cspacer]Misc.\sGames channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3676 pid=2645 channel_order=0 channel_name=Elder\sScrolls\s-\sElder\sScrolls\sOnline channel_topic total_clients=0 channel_needed_subscribe_power=0|cid -|| -=3691 pid=3676 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3680 pid=3676 channel_order=3691 channel_name=Aldmeri\sDominion\sZones channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3681 pid=3676 channel_order=3680 channel_name=Ebonhart\sPact\sZones channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3682 pid=3676 channel_order=3681 channel_name=Daggerfall\sZones channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3683 pid=3676 channel_order=3682 channel_name=Craglorn channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3684 pid=3676 channel_order=3683 channel_name=Dungeon\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3685 pid=3676 channel_order=3684 channel_name=Dungeon\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3686 pid=3676 channel_order=3685 channel_name=Dungeon\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3687 pid=3676 channel_order=3686 channel_name=Cyrodiil channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3688 pid=3676 channel_order=3687 channel_name=The\sTraders\/Crafter\sLounge channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3689 pid=3676 channel_order=3688 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s-=Guilds=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3690 pid=3689 channel_order=0 channel_name=The\sVoice\sof\sSithis channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1079 pid=2645 channel_order=3676 channel_name=Evolve channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1080 pid=1079 channel_order=0 channel_name=Hunter\sGroup\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1081 pid=1079 channel_order=1080 channel_name=Hunter\sGroup\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=13 pid=2645 channel_order=1079 channel_name=The\sGaming\sPub channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=662 pid=2645 channel_order=13 channel_name=Counter\sStrike channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=29 pid=2645 channel_order=662 channel_name=Diablo\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4283 pid=29 channel_order=0 channel_name=Harcore channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=4284 pid=29 channel_order=4283 channel_name=Seasonal channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=682 pid=2645 channel_order=29 channel_name=Dofus channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3557 pid=2645 channel_order=682 channel_name=DOTA\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1401 pid=2645 channel_order=3557 channel_name=Heroes\sof\sthe\sStorm channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=38 pid=2645 channel_order=1401 channel_name=Minecraft channel_topic=Builf\syour\sdream\shome total_clients=4 channel_needed_subscribe_power=0|cid=3175 pid=2645 channel_order=38 channel_name=RUST channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2873 pid=2645 channel_order=3175 channel_name=Space\sEngineers channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4697 pid=2645 channel_order=2873 channel_name=Starbound channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4062 pid=2645 channel_order=4697 channel_name=Stronghold\sKingdoms channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=355 pid=2645 channel_order=4062 channel_name=Titanfall channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3058 pid=2645 channel_order=355 channel_name=War\sThunder channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3533 pid=2645 channel_order=3058 channel_name=World\sof\sTanks channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4790 pid=3533 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4791 pid=3533 channel_order=4790 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3989 pid=2645 channel_order=3533 channel_name=Monster\sHunter\s4\s\sUltimate\s-\sDS channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4398 pid=2645 channel_order=3989 channel_ -|| -name=Path\sof\sExile channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4607 pid=2645 channel_order=4398 channel_name=Yet\sAnother\sZombie\sDefense channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4690 pid=2645 channel_order=4607 channel_name=Starcraft channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4691 pid=2645 channel_order=4690 channel_name=Guild\sWars\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4692 pid=2645 channel_order=4691 channel_name=Borderlands\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4738 pid=2645 channel_order=4692 channel_name=APB:Reloaded channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=4792 pid=2645 channel_order=4738 channel_name=Archeage channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4796 pid=2645 channel_order=4792 channel_name=Smite channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=3472 pid=0 channel_order=2645 channel_name=[*cspacer]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1248 pid=0 channel_order=3472 channel_name=[cspacer]Runescape channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1249 pid=1248 channel_order=0 channel_name=XP\sLegacy channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3373 pid=1249 channel_order=0 channel_name=General\sPlayers channel_topic total_clients=5 channel_needed_subs -|| -cribe_power=0|cid=1272 pid=1249 channel_order=3373 channel_name=Pauls\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1273 pid=1249 channel_order=1272 channel_name=Clan\sCitadel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1264 pid=1249 channel_order=1273 channel_name=Dung\sRoom\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1269 pid=1249 channel_order=1264 channel_name=Bossing\sRoom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3464 pid=0 channel_order=1248 channel_name=[*cspacer\s12]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=311 pid=0 channel_order=3464 channel_name=[cspacer]Warcraft\s-\sWorld\sof\sWarcraft channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=687 pid=311 channel_order=0 channel_name=--Horde--\sWorld\sof\sWarcraft\s--Horde-- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=652 pid=687 channel_order=0 channel_name=DWM\sOfficer\sChat channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=326 pid=687 channel_order=652 channel_name=Group1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=327 pid=687 channel_order=326 channel_name=Group2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=321 pid=687 channel_order=327 channel_name=Raiding channel_topic total_clients=4 channel_needed_subscribe_power=0|cid=2914 pid=687 channel_order=321 channel_name=Mythic\sRaid channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=562 pid=687 channel_order=2914 channel_name=PvP\sArena channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=575 pid=687 channel_order=562 channel_name=PVP\sArena\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=561 pid=687 channel_order=575 channel_name=PvP\sBGs channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=563 pid=687 channel_order=561 channel_name=PvP\sRBGs channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=570 pid=0 channel_order=311 channel_name=[*cspacer\s3]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3473 pid=0 channel_order=570 channel_name=[cspacer]Warframe channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=58 pid=3473 channel_order=0 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Administrative=- channel_topic=Get\ssome!\sBadass\sfree\sgame. total_clients=0 channel_needed_subscribe_power=0|cid=847 pid=58 channel_order=0 channel_name=Warframe\sRecruiting\sOffice channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2866 pid=58 channel_order=847 channel_name=Warframe\sAdministrative\sOffice channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=754 pid=2866 channel_order=0 channel_name=æ”»\sæ®»\sæ©Ÿ\så‹•\s隊\sGhost\sin\sthe\sShell channel_topic total_clients=-1 channel_needed_subscribe_p -|| -ower=65|cid=569 pid=58 channel_order=2866 channel_name=Network\sAlliance\smeeting\sroom channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=532 pid=58 channel_order=569 channel_name=Warlord\smeeting\sroom channel_topic total_clients=-1 channel_needed_subscribe_power=60|cid=796 pid=532 channel_order=0 channel_name=Warlord\shideout channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=841 pid=3473 channel_order=58 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Clan\smeetings=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3463 pid=841 channel_order=0 channel_name=Meeting\sroom\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3495 pid=841 channel_order=3463 channel_name=Meeting\sroom\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3496 pid=841 channel_order=3495 channel_name=Meeting\sroom\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3497 pid=841 channel_order=3496 channel_name=Meeting\sroom\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3498 pid=841 channel_order=3497 channel_name=Meeting\sroom\s5 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=479 pid=3473 channel_order=841 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Music=- channel_topic=\p̲̅̅â—̲̅̅\p̲̅̅=̲̅̅\p̲̅̅â—̲̅̅\p\p̲̅̅â—̲̅̅\p̲̅̅=̲̅̅\p̲̅̅â—̲̅̅\p total_clients=0 channel_needed_subscribe_power=0|cid=3466 pid=479 channel_order=0 channel_name=Music\sselection\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3467 pid=479 channel_order=3466 channel_name=Music\sselection\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3549 pid=479 channel_order=3467 channel_name=Music\sselection\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=577 pid=3473 channel_order=479 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=PVP=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1226 pid=577 channel_order=0 channel_name=PVP\sEvent channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=581 pid=577 channel_order=1226 channel_name=Lobby\s-\sDefend\srail\sfor\sOrion\sCholistan channel_topic total_clients=8 channel_needed_subscribe_power=0|cid=3501 pid=577 channel_order=581 channel_name=Squads channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=648 pid=3501 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=651 pid=3501 channel_order=648 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=650 pid=3501 channel_order=651 channel_name=Squad\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=740 pid=3501 channel_order=650 channel_name=Squad\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid -|| -=861 pid=3501 channel_order=740 channel_name=Squad\s5 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=862 pid=3501 channel_order=861 channel_name=Squad\s6 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=863 pid=3501 channel_order=862 channel_name=Squad\s7 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=864 pid=3501 channel_order=863 channel_name=Squad\s8 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1221 pid=3501 channel_order=864 channel_name=Squad\s9 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1222 pid=3501 channel_order=1221 channel_name=Squad\s10 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=865 pid=3501 channel_order=1222 channel_name=Squad\s11 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=866 pid=3501 channel_order=865 channel_name=Squad\s12 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1409 pid=3501 channel_order=866 channel_name=Squad\s13 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1410 pid=3501 channel_order=1409 channel_name=Squad\s14 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1411 pid=3501 channel_order=1410 channel_name=Squad\s15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2471 pid=3501 channel_order=1411 channel_name=Squad\s16 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2 -|| -472 pid=3501 channel_order=2471 channel_name=Squad\s17 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1688 pid=3501 channel_order=2472 channel_name=Squad\s18 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1689 pid=3501 channel_order=1688 channel_name=Squad\s19 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1690 pid=3501 channel_order=1689 channel_name=Squad\s20 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1691 pid=3501 channel_order=1690 channel_name=Squad\s21 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1692 pid=3501 channel_order=1691 channel_name=Squad\s22 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4392 pid=3501 channel_order=1692 channel_name=Squad\s23 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1694 pid=3501 channel_order=4392 channel_name=Squad\s24 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1695 pid=3501 channel_order=1694 channel_name=Squad\s25 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=580 pid=3473 channel_order=577 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=PVE=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4370 pid=580 channel_order=0 channel_name=Lobby\s-\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3306 pid=580 channel_order=4370 channel_name=Lobby\s-\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4036 pid=580 channel_order=3306 channel_name=Lobby\s-\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3503 pid=580 channel_order=4036 channel_name=Ducat\sFarming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=456 pid=3503 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3704 pid=3503 channel_order=456 channel_name=Squad\s1\s(Nova\sPrime\s+\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3705 pid=3503 channel_order=3704 channel_name=Squad\s2\s(Loki\s+\sRhino\s+\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4371 pid=3503 channel_order=3705 channel_name=Squad\s3\s(Misc\s+\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4372 pid=3503 channel_order=4371 channel_name=Squad\s4\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4373 pid=3503 channel_order=4372 channel_name=Squad\s-\s5\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4374 pid=3503 channel_order=4373 channel_name=Squad\s-\s6\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4375 pid=3503 channel_order=4374 channel_name=Squad\s-\s7\s(Misc\sDucats) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3502 pid=580 channel_order=3503 channel_nam -|| -e=Squads channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1112 pid=3502 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1065 pid=3502 channel_order=1112 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1068 pid=3502 channel_order=1065 channel_name=Squad\s3 channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1067 pid=3502 channel_order=1068 channel_name=Squad\s4 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1124 pid=3502 channel_order=1067 channel_name=Squad\s5 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1125 pid=3502 channel_order=1124 channel_name=Squad\s6 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1135 pid=3502 channel_order=1125 channel_name=Squad\s7 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1224 pid=3502 channel_order=1135 channel_name=Squad\s8 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1225 pid=3502 channel_order=1224 channel_name=Squad\s9 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3673 pid=580 channel_order=3502 channel_name=Archwing channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3764 pid=3673 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3674 pid=3673 channel_order=3764 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3675 pid=3673 channel_order=3674 channel_name=Squad\s2 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3692 pid=3673 channel_order=3675 channel_name=Squad\s3 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=668 pid=580 channel_order=3673 channel_name=Syndicate\sFarming channel_topic total_clients=-1 channel_needed_subscribe_power=55|cid=1121 pid=668 channel_order=0 channel_name=Squad\s1 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3994 pid=3473 channel_order=580 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Trade\sFrame=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3645 pid=3473 channel_order=3994 channel_name=>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=Alliances=- channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=520 pid=3645 channel_order=0 channel_name=V\sAlliance channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3648 pid=520 channel_order=0 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3784 pid=3648 channel_order=0 channel_name=DWM\sGaming channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3785 pid=3784 channel_order=0 channel_name=Admin\sChannel channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3786 pid=3784 channel_order=3785 channel_name=Private\sChatroom channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=560 pid=3786 channel_order=0 channel_name=Shards\sof\sDespair\s-\sGhost\s1\/0\/0\/0 channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=459 pid=3648 channel_order=3784 channel_name=Lag\sWave\s50\s-\sStorm\s71 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=475 pid=3648 channel_order=459 channel_name=MTZ\/Microterrorizm channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=480 pid=3648 channel_order=475 channel_name=Original\sGoon\sSquad-\sStorm\s[52] channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=4789 pid=480 channel_order=0 channel_name=[OGS]\sLeveling\sup\sframes channel_topic total_clients=5 channel_needed_subscribe_power=0|cid=587 pid=3648 channel_order=480 channel_name=Xenosha\s-\sStorm\s[53] channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=707 pid=3648 channel_order=587 channel_name=ISRWarframe\s-\sStorm\sClan\s(Hebrew) channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=872 pid=3648 channel_order=707 channel_name=The\sBrothers\sof\sMortem channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=1116 pid=3648 channel_order=872 channel_name=SOR channel_topic total_clients=3 channel_needed_subscribe_power=0|cid=1247 pid=3648 channel_order=1116 channel_name=Without\sStrings\s-\sShadow\s(20) channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1364 pid=3648 -|| -channel_order=1247 channel_name=BiziCazipClan-\sStorm(67) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1578 pid=3648 channel_order=1364 channel_name=SYSTEM\s32\s-\sMoon\sClan\s[793] channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1380 pid=3648 channel_order=1578 channel_name=Cypher\sadvents\sã€FR】ã€Storm】ã€Ps4\/Pc\/Xbox】 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=1956 pid=3648 channel_order=1380 channel_name=Cosmic\sAegis\sGhost(9) channel_topic total_clients=6 channel_needed_subscribe_power=0|cid=2115 pid=3648 channel_order=1956 channel_name=Firestorm\s{FR}-\sStorm\s{57} channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=2083 pid=3648 channel_order=2115 channel_name=Soldiers\s0f\sMisfortune\s-\sGhost\s(10) channel_topic total_clients=2 channel_needed_subscribe_power=0|cid=621 pid=3648 channel_order=2083 channel_name=Shruikan(Fr)\s-\sStorm\sClan channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2882 pid=3648 channel_order=621 channel_name=GOLDenSILVER\s-\s\sMtn-50 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1363 pid=3648 channel_order=2882 channel_name=Probation channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=716 pid=1363 channel_order=0 channel_name=SuperiorSwords\s46\/13\/37\sMtn115\s3\/1\/15 channel_topic total_clients=7 channel_needed_subscribe_power=0|cid=878 pid=1363 channel_order=716 -|| - channel_name=Blood\sBerserk\s-\sGhost(9)\s3\/8\/15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=1302 pid=1363 channel_order=878 channel_name=ViosVigilantes\s3\/18\/15\sShw(14) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2106 pid=1363 channel_order=1302 channel_name=CraK\sza\s-\sShadow10\s1\/1\/15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=2752 pid=1363 channel_order=2106 channel_name=Wooch\s-\s1\/19\/420\sStorm(100) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4248 pid=1363 channel_order=2752 channel_name=Strong\sArmy\s3\/19\/15 channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=4632 pid=1363 channel_order=4248 channel_name=Israel\sTenno\sForces(6)\s03\/24\/15 channel_topic total_clients=1 channel_needed_subscribe_power=0|cid=3649 pid=3645 channel_order=520 channel_name=Ice channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3654 pid=3649 channel_order=0 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=458 pid=3654 channel_order=0 channel_name=-Quantum\sEntanglement\s-\sStorm\s(65) channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3644 pid=3645 channel_order=3649 channel_name=Orion\sAlliance channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3656 pid=3644 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3653 pid=3644 channel_order=3656 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3643 pid=3653 channel_order=0 channel_name=Bloodgod channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3641 pid=3645 channel_order=3644 channel_name=Tenno\sCouncil\sAlliance channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3651 pid=3641 channel_order=0 channel_name=Lobby channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3655 pid=3641 channel_order=3651 channel_name=Clans channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3657 pid=3655 channel_order=0 channel_name=Okami\ssama\sno\sShinobi channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3650 pid=0 channel_order=3473 channel_name=[*cspacer\s18]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0|cid=3458 pid=0 channel_order=3650 channel_name=[lspacer\s19]>\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s-=AFK=- channel_topic total_clients=-1 channel_needed_subscribe_power=75|cid=3652 pid=0 channel_order=3458 channel_name=[*cspacer\s17]༖ channel_topic total_clients=0 channel_needed_subscribe_power=0 - error id=0 msg=ok - \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teamspeak3/2_result.json b/gameq/tests/Protocols/Providers/Teamspeak3/2_result.json deleted file mode 100644 index 71db583..0000000 --- a/gameq/tests/Protocols/Providers/Teamspeak3/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"67.43.5.200:9987":{"connection_bandwidth_received_last_minute_total":"47068","connection_bandwidth_received_last_second_total":"49675","connection_bandwidth_sent_last_minute_total":"96860","connection_bandwidth_sent_last_second_total":"95669","connection_bytes_received_control":"94098377","connection_bytes_received_keepalive":"554106917","connection_bytes_received_speech":"2691927682","connection_bytes_received_total":"3340132976","connection_bytes_sent_control":"291637874","connection_bytes_sent_keepalive":"541821478","connection_bytes_sent_speech":"11344589012","connection_bytes_sent_total":"12178048364","connection_filetransfer_bandwidth_received":"0","connection_filetransfer_bandwidth_sent":"0","connection_filetransfer_bytes_received_total":"13800215","connection_filetransfer_bytes_sent_total":"627470236","connection_packets_received_control":"1544876","connection_packets_received_keepalive":"13200222","connection_packets_received_speech":"23764523","connection_packets_received_total":"38509621","connection_packets_sent_control":"1563103","connection_packets_sent_keepalive":"13215158","connection_packets_sent_speech":"101299587","connection_packets_sent_total":"116077848","dedicated":1,"gq_address":"67.43.5.200","gq_joinlink":"ts3server:\/\/67.43.5.200?port=9987","gq_name":"Teamspeak 3","gq_online":true,"gq_port_client":9987,"gq_port_query":10011,"gq_protocol":"teamspeak3","gq_transport":"tcp","gq_type":"teamspeak3","numplayers":106,"players":[{"clid":"4","cid":"309","client_database_id":"38","client_nickname":"Viper","client_type":"0"},{"clid":"6","cid":"1098","client_database_id":"5546","client_nickname":"barrysauce","client_type":"0"},{"clid":"7","cid":"4283","client_database_id":"7739","client_nickname":"Naked Snake","client_type":"0"},{"clid":"8","cid":"872","client_database_id":"4816","client_nickname":"KillerP_ssy [18,2]","client_type":"0"},{"clid":"10","cid":"495","client_database_id":"2646","client_nickname":"b1ue","client_type":"0"},{"clid":"12","cid":"1","client_database_id":"4968","client_nickname":"Unknown from 71.199.205.69:44975","client_type":"1"},{"clid":"13","cid":"705","client_database_id":"6818","client_nickname":"Pantykill","client_type":"0"},{"clid":"14","cid":"705","client_database_id":"63","client_nickname":"Whitehawk","client_type":"0"},{"clid":"16","cid":"1068","client_database_id":"2773","client_nickname":"Noob.Saibot (18) General","client_type":"0"},{"clid":"24","cid":"716","client_database_id":"6653","client_nickname":"Maes.Sunsanxian [7]11","client_type":"0"},{"clid":"26","cid":"321","client_database_id":"2710","client_nickname":"Undisonus","client_type":"0"},{"clid":"28","cid":"1380","client_database_id":"7827","client_nickname":"Avantarion","client_type":"0"},{"clid":"31","cid":"4738","client_database_id":"1772","client_nickname":"Pzykotik [13]","client_type":"0"},{"clid":"34","cid":"4485","client_database_id":"7786","client_nickname":"=242= CPT. Helios11","client_type":"0"},{"clid":"35","cid":"4789","client_database_id":"7152","client_nickname":"glacepk - Frank [7]","client_type":"0"},{"clid":"36","cid":"581","client_database_id":"7338","client_nickname":"Tolu2weenies(10)","client_type":"0"},{"clid":"42","cid":"1247","client_database_id":"7708","client_nickname":"RainbowBrite[18]","client_type":"0"},{"clid":"45","cid":"4789","client_database_id":"6984","client_nickname":"Akmon[10]","client_type":"0"},{"clid":"48","cid":"707","client_database_id":"4505","client_nickname":"Elaeus [17,85]","client_type":"0"},{"clid":"49","cid":"872","client_database_id":"7646","client_nickname":"TripleRocket [4]","client_type":"0"},{"clid":"50","cid":"4789","client_database_id":"7020","client_nickname":"Mashala[12]","client_type":"0"},{"clid":"53","cid":"2115","client_database_id":"6649","client_nickname":"Piokil[9]","client_type":"0"},{"clid":"57","cid":"1578","client_database_id":"6489","client_nickname":"mWik[18]^^[4]","client_type":"0"},{"clid":"60","cid":"581","client_database_id":"5144","client_nickname":"BirdofSong[16][5]","client_type":"0"},{"clid":"63","cid":"38","client_database_id":"7819","client_nickname":"Buder","client_type":"0"},{"clid":"65","cid":"2083","client_database_id":"7057","client_nickname":"Narcotx","client_type":"0"},{"clid":"66","cid":"4283","client_database_id":"5254","client_nickname":"Soarden [16] [6]","client_type":"0"},{"clid":"67","cid":"581","client_database_id":"3205","client_nickname":"-ExT-Fraank(19)","client_type":"0"},{"clid":"68","cid":"3373","client_database_id":"7791","client_nickname":"Ohai Im Alex","client_type":"0"},{"clid":"69","cid":"4632","client_database_id":"7746","client_nickname":"xwalle (5)","client_type":"0"},{"clid":"70","cid":"321","client_database_id":"6618","client_nickname":"Cutie","client_type":"0"},{"clid":"72","cid":"4789","client_database_id":"4817","client_nickname":"MeiAnne [15]","client_type":"0"},{"clid":"73","cid":"581","client_database_id":"7544","client_nickname":"Keikat[9]","client_type":"0"},{"clid":"77","cid":"321","client_database_id":"6820","client_nickname":"Jediyodaone","client_type":"0"},{"clid":"82","cid":"716","client_database_id":"7380","client_nickname":"Burnt[8]","client_type":"0"},{"clid":"83","cid":"3373","client_database_id":"6480","client_nickname":"Savannah","client_type":"0"},{"clid":"84","cid":"1956","client_database_id":"5460","client_nickname":"hellscythe[6]","client_type":"0"},{"clid":"87","cid":"4738","client_database_id":"2815","client_nickname":"Road","client_type":"0"},{"clid":"95","cid":"1068","client_database_id":"7682","client_nickname":"ST4RF0X 11","client_type":"0"},{"clid":"100","cid":"581","client_database_id":"3479","client_nickname":"angelfish999999999(13)1111","client_type":"0"},{"clid":"101","cid":"309","client_database_id":"6746","client_nickname":"brandonlopezypr","client_type":"0"},{"clid":"102","cid":"1276","client_database_id":"7799","client_nickname":"MrRiddlez","client_type":"0"},{"clid":"107","cid":"309","client_database_id":"2","client_nickname":"Tide","client_type":"0"},{"clid":"110","cid":"1401","client_database_id":"5132","client_nickname":"jacketstud [9]","client_type":"0"},{"clid":"117","cid":"1956","client_database_id":"3617","client_nickname":"fadedshadows1(10)","client_type":"0"},{"clid":"118","cid":"480","client_database_id":"7044","client_nickname":"XalvioN [17]","client_type":"0"},{"clid":"119","cid":"1956","client_database_id":"3101","client_nickname":"Themius(15) NukeDynasty(5)","client_type":"0"},{"clid":"123","cid":"309","client_database_id":"33","client_nickname":"HomeStyle Chillin","client_type":"0"},{"clid":"124","cid":"1956","client_database_id":"4778","client_nickname":"CoronApMor[8]","client_type":"0"},{"clid":"126","cid":"309","client_database_id":"1534","client_nickname":"[PNDA]KillerElite","client_type":"0"},{"clid":"127","cid":"1116","client_database_id":"4643","client_nickname":"The Ghiest[18]","client_type":"0"},{"clid":"130","cid":"581","client_database_id":"7713","client_nickname":"TimesEdge","client_type":"0"},{"clid":"134","cid":"1","client_database_id":"4656","client_nickname":"MagnusEffect (15)","client_type":"0"},{"clid":"135","cid":"716","client_database_id":"6583","client_nickname":"Maxed_Pain[7]","client_type":"0"},{"clid":"137","cid":"1098","client_database_id":"3094","client_nickname":"HurpMcDurp","client_type":"0"},{"clid":"138","cid":"321","client_database_id":"7758","client_nickname":"xStyk","client_type":"0"},{"clid":"139","cid":"416","client_database_id":"1519","client_nickname":"Epic Winning","client_type":"0"},{"clid":"140","cid":"1401","client_database_id":"6306","client_nickname":"Zerginater\\p5\\p","client_type":"0"},{"clid":"142","cid":"16","client_database_id":"6710","client_nickname":"samou [5]11","client_type":"0"},{"clid":"144","cid":"1098","client_database_id":"1430","client_nickname":"-Q-","client_type":"0"},{"clid":"145","cid":"3373","client_database_id":"1757","client_nickname":"dark-gaunt","client_type":"0"},{"clid":"153","cid":"480","client_database_id":"7367","client_nickname":"MazeElwin [̯̪̣̣ÌÂÖ̯12]Ì¿ÃÂŒÃÂ’ÃÂÛÃÂ","client_type":"0"},{"clid":"156","cid":"16","client_database_id":"35","client_nickname":"wambatx","client_type":"0"},{"clid":"157","cid":"581","client_database_id":"4810","client_nickname":"Kleboldx1-Prime (18)(14)(1)","client_type":"0"},{"clid":"158","cid":"4738","client_database_id":"7800","client_nickname":"Xpl0jd","client_type":"0"},{"clid":"159","cid":"309","client_database_id":"4887","client_nickname":"dap","client_type":"0"},{"clid":"160","cid":"707","client_database_id":"4841","client_nickname":"Snixy [18,15]","client_type":"0"},{"clid":"163","cid":"716","client_database_id":"4443","client_nickname":"-Apolo [13]","client_type":"0"},{"clid":"165","cid":"587","client_database_id":"5281","client_nickname":"Ret [Regular Type Dude]","client_type":"0"},{"clid":"166","cid":"1956","client_database_id":"3964","client_nickname":"Caliburated(18)","client_type":"0"},{"clid":"167","cid":"38","client_database_id":"7818","client_nickname":"Kyahco","client_type":"0"},{"clid":"168","cid":"587","client_database_id":"2033","client_nickname":"Destroierrr9[18]","client_type":"0"},{"clid":"171","cid":"1956","client_database_id":"2776","client_nickname":"Otaku1988(14)","client_type":"0"},{"clid":"178","cid":"495","client_database_id":"4175","client_nickname":"Snowman","client_type":"0"},{"clid":"180","cid":"38","client_database_id":"7820","client_nickname":"TomTomWhon","client_type":"0"},{"clid":"181","cid":"4796","client_database_id":"4474","client_nickname":"buckw (18)►","client_type":"0"},{"clid":"184","cid":"4789","client_database_id":"5463","client_nickname":"Hitoriac [16] <-- Lucky Wabbit","client_type":"0"},{"clid":"185","cid":"707","client_database_id":"4898","client_nickname":"Zienox[12]","client_type":"0"},{"clid":"189","cid":"1116","client_database_id":"4664","client_nickname":"Laucivol [18]","client_type":"0"},{"clid":"190","cid":"3373","client_database_id":"4885","client_nickname":"SomeDiabeticKid","client_type":"0"},{"clid":"191","cid":"1116","client_database_id":"4724","client_nickname":"AlphaOC [18]","client_type":"0"},{"clid":"192","cid":"3373","client_database_id":"3536","client_nickname":"The Hazzard","client_type":"0"},{"clid":"194","cid":"309","client_database_id":"5367","client_nickname":"Philifly","client_type":"0"},{"clid":"197","cid":"716","client_database_id":"7447","client_nickname":"_Shinobu_Oshino_ [8]","client_type":"0"},{"clid":"201","cid":"480","client_database_id":"7448","client_nickname":"casey0827","client_type":"0"},{"clid":"202","cid":"716","client_database_id":"3711","client_nickname":"Tı̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨ailsx{16}","client_type":"0"},{"clid":"203","cid":"587","client_database_id":"3215","client_nickname":"SapphireSirenz[17]","client_type":"0"},{"clid":"205","cid":"2083","client_database_id":"7350","client_nickname":"Shizzio[6]","client_type":"0"},{"clid":"207","cid":"309","client_database_id":"6409","client_nickname":"Kanaka","client_type":"0"},{"clid":"209","cid":"480","client_database_id":"4603","client_nickname":"CocxyMcChunk [9]","client_type":"0"},{"clid":"219","cid":"480","client_database_id":"6754","client_nickname":"DruCova [8]","client_type":"0"},{"clid":"225","cid":"1276","client_database_id":"7247","client_nickname":"Mr Kazz","client_type":"0"},{"clid":"227","cid":"581","client_database_id":"7710","client_nickname":"Uhhninjeesword(10)","client_type":"0"},{"clid":"229","cid":"4283","client_database_id":"7132","client_nickname":"doritofish[16]","client_type":"0"},{"clid":"235","cid":"716","client_database_id":"3938","client_nickname":"Botax 11","client_type":"0"},{"clid":"236","cid":"38","client_database_id":"7817","client_nickname":"Aziboo-music","client_type":"0"},{"clid":"241","cid":"480","client_database_id":"4617","client_nickname":"Druul","client_type":"0"},{"clid":"258","cid":"480","client_database_id":"2765","client_nickname":"Junki559[17]","client_type":"0"}],"teams":[{"cid":"1","pid":"0","channel_order":"0","channel_name":"Lobby - Ask to be pulled down","channel_topic":"Welcome to DWM Gaming","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"3622","pid":"1","channel_order":"0","channel_name":"Lost? Join this channel, we'll help you.","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3476","pid":"0","channel_order":"1","channel_name":"[*cspacer 0]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3483","pid":"0","channel_order":"3476","channel_name":"[cspacer]Community Administration","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2","pid":"3483","channel_order":"0","channel_name":"Admin Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"705","pid":"3483","channel_order":"2","channel_name":"Help Room","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"2526","pid":"3483","channel_order":"705","channel_name":"Website development","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4311","pid":"3483","channel_order":"2526","channel_name":"Promotions\/Ads\/Photoshop","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4009","pid":"3483","channel_order":"4311","channel_name":"Conference Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4485","pid":"3483","channel_order":"4009","channel_name":"Convergence Meeting Notes","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"4795","pid":"3483","channel_order":"4485","channel_name":"www.twitch.tv\/convergencegames\/","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3455","pid":"0","channel_order":"3483","channel_name":"[*cspacer 9]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"16","pid":"0","channel_order":"3455","channel_name":"[cspacer]AFK","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"3450","pid":"0","channel_order":"16","channel_name":"[*cspacer 7]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"124","pid":"0","channel_order":"3450","channel_name":"[cspacer]ARMA Series","channel_topic":"ARMA Series Game Chat and Discussion","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"347","pid":"124","channel_order":"0","channel_name":"Arma3 Wasteland","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"315","pid":"124","channel_order":"347","channel_name":"DayZ Standalone","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"402","pid":"124","channel_order":"315","channel_name":"Breaking Point","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"579","pid":"0","channel_order":"124","channel_name":"[*cspacer 4]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"303","pid":"0","channel_order":"579","channel_name":"[cspacer]Battlefield Series","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3","pid":"303","channel_order":"0","channel_name":"Battlefield 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"300","pid":"303","channel_order":"3","channel_name":"Battlefield 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3481","pid":"0","channel_order":"303","channel_name":"[*cspacer01]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"5","pid":"0","channel_order":"3481","channel_name":"[cspacer]Call of Duty Series","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"309","pid":"5","channel_order":"0","channel_name":"Advanced Warfare","channel_topic":"","total_clients":"8","channel_needed_subscribe_power":"0"},{"cid":"1098","pid":"5","channel_order":"309","channel_name":"Advanced Warfare Room 2","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"2015","pid":"5","channel_order":"1098","channel_name":"Advanced Warfare AFK","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"6","pid":"5","channel_order":"2015","channel_name":"Black Ops II","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"9","pid":"5","channel_order":"6","channel_name":"COD 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3516","pid":"0","channel_order":"5","channel_name":"[*cspacer 81]༖","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"99"},{"cid":"522","pid":"0","channel_order":"3516","channel_name":"[cspacer]League of Legends","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"12","pid":"522","channel_order":"0","channel_name":"League of Legends - Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"495","pid":"12","channel_order":"0","channel_name":"Normals","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"503","pid":"12","channel_order":"495","channel_name":"Normal 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1276","pid":"12","channel_order":"503","channel_name":"Normal 3","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"2489","pid":"12","channel_order":"1276","channel_name":"Low Levels","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1796","pid":"12","channel_order":"2489","channel_name":"Ranked 5's - Don't disturb during prac.","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"416","pid":"12","channel_order":"1796","channel_name":"Jared's Channel","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1250","pid":"522","channel_order":"12","channel_name":"Tournament planning","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1252","pid":"522","channel_order":"1250","channel_name":"Admin on standby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1251","pid":"1252","channel_order":"0","channel_name":"Tournament Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"571","pid":"0","channel_order":"522","channel_name":"[*cspacer 1]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2645","pid":"0","channel_order":"571","channel_name":"[cspacer]Misc. Games","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3676","pid":"2645","channel_order":"0","channel_name":"Elder Scrolls - Elder Scrolls Online","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3691","pid":"3676","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3680","pid":"3676","channel_order":"3691","channel_name":"Aldmeri Dominion Zones","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3681","pid":"3676","channel_order":"3680","channel_name":"Ebonhart Pact Zones","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3682","pid":"3676","channel_order":"3681","channel_name":"Daggerfall Zones","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3683","pid":"3676","channel_order":"3682","channel_name":"Craglorn","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3684","pid":"3676","channel_order":"3683","channel_name":"Dungeon 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3685","pid":"3676","channel_order":"3684","channel_name":"Dungeon 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3686","pid":"3676","channel_order":"3685","channel_name":"Dungeon 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3687","pid":"3676","channel_order":"3686","channel_name":"Cyrodiil","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3688","pid":"3676","channel_order":"3687","channel_name":"The Traders\/Crafter Lounge","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3689","pid":"3676","channel_order":"3688","channel_name":"> -=Guilds=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3690","pid":"3689","channel_order":"0","channel_name":"The Voice of Sithis","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1079","pid":"2645","channel_order":"3676","channel_name":"Evolve","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1080","pid":"1079","channel_order":"0","channel_name":"Hunter Group 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1081","pid":"1079","channel_order":"1080","channel_name":"Hunter Group 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"13","pid":"2645","channel_order":"1079","channel_name":"The Gaming Pub","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"662","pid":"2645","channel_order":"13","channel_name":"Counter Strike","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"29","pid":"2645","channel_order":"662","channel_name":"Diablo 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4283","pid":"29","channel_order":"0","channel_name":"Harcore","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"4284","pid":"29","channel_order":"4283","channel_name":"Seasonal","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"682","pid":"2645","channel_order":"29","channel_name":"Dofus","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3557","pid":"2645","channel_order":"682","channel_name":"DOTA 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1401","pid":"2645","channel_order":"3557","channel_name":"Heroes of the Storm","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"38","pid":"2645","channel_order":"1401","channel_name":"Minecraft","channel_topic":"Builf your dream home","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"3175","pid":"2645","channel_order":"38","channel_name":"RUST","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2873","pid":"2645","channel_order":"3175","channel_name":"Space Engineers","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4697","pid":"2645","channel_order":"2873","channel_name":"Starbound","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4062","pid":"2645","channel_order":"4697","channel_name":"Stronghold Kingdoms","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"355","pid":"2645","channel_order":"4062","channel_name":"Titanfall","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3058","pid":"2645","channel_order":"355","channel_name":"War Thunder","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3533","pid":"2645","channel_order":"3058","channel_name":"World of Tanks","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4790","pid":"3533","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4791","pid":"3533","channel_order":"4790","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3989","pid":"2645","channel_order":"3533","channel_name":"Monster Hunter 4 Ultimate - DS","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4398","pid":"2645","channel_order":"3989","channel_name":"Path of Exile","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4607","pid":"2645","channel_order":"4398","channel_name":"Yet Another Zombie Defense","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4690","pid":"2645","channel_order":"4607","channel_name":"Starcraft","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4691","pid":"2645","channel_order":"4690","channel_name":"Guild Wars 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4692","pid":"2645","channel_order":"4691","channel_name":"Borderlands 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4738","pid":"2645","channel_order":"4692","channel_name":"APB:Reloaded","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"4792","pid":"2645","channel_order":"4738","channel_name":"Archeage","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4796","pid":"2645","channel_order":"4792","channel_name":"Smite","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"3472","pid":"0","channel_order":"2645","channel_name":"[*cspacer]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1248","pid":"0","channel_order":"3472","channel_name":"[cspacer]Runescape","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1249","pid":"1248","channel_order":"0","channel_name":"XP Legacy","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3373","pid":"1249","channel_order":"0","channel_name":"General Players","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"1272","pid":"1249","channel_order":"3373","channel_name":"Pauls Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1273","pid":"1249","channel_order":"1272","channel_name":"Clan Citadel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1264","pid":"1249","channel_order":"1273","channel_name":"Dung Room 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1269","pid":"1249","channel_order":"1264","channel_name":"Bossing Room","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3464","pid":"0","channel_order":"1248","channel_name":"[*cspacer 12]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"311","pid":"0","channel_order":"3464","channel_name":"[cspacer]Warcraft - World of Warcraft","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"687","pid":"311","channel_order":"0","channel_name":"--Horde-- World of Warcraft --Horde--","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"652","pid":"687","channel_order":"0","channel_name":"DWM Officer Chat","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"326","pid":"687","channel_order":"652","channel_name":"Group1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"327","pid":"687","channel_order":"326","channel_name":"Group2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"321","pid":"687","channel_order":"327","channel_name":"Raiding","channel_topic":"","total_clients":"4","channel_needed_subscribe_power":"0"},{"cid":"2914","pid":"687","channel_order":"321","channel_name":"Mythic Raid","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"562","pid":"687","channel_order":"2914","channel_name":"PvP Arena","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"575","pid":"687","channel_order":"562","channel_name":"PVP Arena 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"561","pid":"687","channel_order":"575","channel_name":"PvP BGs","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"563","pid":"687","channel_order":"561","channel_name":"PvP RBGs","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"570","pid":"0","channel_order":"311","channel_name":"[*cspacer 3]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3473","pid":"0","channel_order":"570","channel_name":"[cspacer]Warframe","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"58","pid":"3473","channel_order":"0","channel_name":"> -=Administrative=-","channel_topic":"Get some! Badass free game.","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"847","pid":"58","channel_order":"0","channel_name":"Warframe Recruiting Office","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2866","pid":"58","channel_order":"847","channel_name":"Warframe Administrative Office","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"754","pid":"2866","channel_order":"0","channel_name":"攻 æ®» 機 動 隊 Ghost in the Shell","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"65"},{"cid":"569","pid":"58","channel_order":"2866","channel_name":"Network Alliance meeting room","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"532","pid":"58","channel_order":"569","channel_name":"Warlord meeting room","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"60"},{"cid":"796","pid":"532","channel_order":"0","channel_name":"Warlord hideout","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"841","pid":"3473","channel_order":"58","channel_name":"> -=Clan meetings=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3463","pid":"841","channel_order":"0","channel_name":"Meeting room 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3495","pid":"841","channel_order":"3463","channel_name":"Meeting room 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3496","pid":"841","channel_order":"3495","channel_name":"Meeting room 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3497","pid":"841","channel_order":"3496","channel_name":"Meeting room 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3498","pid":"841","channel_order":"3497","channel_name":"Meeting room 5","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"479","pid":"3473","channel_order":"841","channel_name":"> -=Music=-","channel_topic":"\\p̲̅̅â—Â̲̅̅\\p̲̅̅=̲̅̅\\p̲̅̅â—Â̲̅̅\\p\\p̲̅̅â—Â̲̅̅\\p̲̅̅=̲̅̅\\p̲̅̅â—Â̲̅̅\\p","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3466","pid":"479","channel_order":"0","channel_name":"Music selection 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3467","pid":"479","channel_order":"3466","channel_name":"Music selection 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3549","pid":"479","channel_order":"3467","channel_name":"Music selection 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"577","pid":"3473","channel_order":"479","channel_name":"> -=PVP=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1226","pid":"577","channel_order":"0","channel_name":"PVP Event","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"581","pid":"577","channel_order":"1226","channel_name":"Lobby - Defend rail for Orion Cholistan","channel_topic":"","total_clients":"8","channel_needed_subscribe_power":"0"},{"cid":"3501","pid":"577","channel_order":"581","channel_name":"Squads","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"648","pid":"3501","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"651","pid":"3501","channel_order":"648","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"650","pid":"3501","channel_order":"651","channel_name":"Squad 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"740","pid":"3501","channel_order":"650","channel_name":"Squad 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"861","pid":"3501","channel_order":"740","channel_name":"Squad 5","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"862","pid":"3501","channel_order":"861","channel_name":"Squad 6","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"863","pid":"3501","channel_order":"862","channel_name":"Squad 7","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"864","pid":"3501","channel_order":"863","channel_name":"Squad 8","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1221","pid":"3501","channel_order":"864","channel_name":"Squad 9","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1222","pid":"3501","channel_order":"1221","channel_name":"Squad 10","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"865","pid":"3501","channel_order":"1222","channel_name":"Squad 11","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"866","pid":"3501","channel_order":"865","channel_name":"Squad 12","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1409","pid":"3501","channel_order":"866","channel_name":"Squad 13","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1410","pid":"3501","channel_order":"1409","channel_name":"Squad 14","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1411","pid":"3501","channel_order":"1410","channel_name":"Squad 15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2471","pid":"3501","channel_order":"1411","channel_name":"Squad 16","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2472","pid":"3501","channel_order":"2471","channel_name":"Squad 17","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1688","pid":"3501","channel_order":"2472","channel_name":"Squad 18","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1689","pid":"3501","channel_order":"1688","channel_name":"Squad 19","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1690","pid":"3501","channel_order":"1689","channel_name":"Squad 20","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1691","pid":"3501","channel_order":"1690","channel_name":"Squad 21","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1692","pid":"3501","channel_order":"1691","channel_name":"Squad 22","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4392","pid":"3501","channel_order":"1692","channel_name":"Squad 23","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1694","pid":"3501","channel_order":"4392","channel_name":"Squad 24","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1695","pid":"3501","channel_order":"1694","channel_name":"Squad 25","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"580","pid":"3473","channel_order":"577","channel_name":"> -=PVE=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4370","pid":"580","channel_order":"0","channel_name":"Lobby - 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3306","pid":"580","channel_order":"4370","channel_name":"Lobby - 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4036","pid":"580","channel_order":"3306","channel_name":"Lobby - 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3503","pid":"580","channel_order":"4036","channel_name":"Ducat Farming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"456","pid":"3503","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3704","pid":"3503","channel_order":"456","channel_name":"Squad 1 (Nova Prime + Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3705","pid":"3503","channel_order":"3704","channel_name":"Squad 2 (Loki + Rhino + Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4371","pid":"3503","channel_order":"3705","channel_name":"Squad 3 (Misc + Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4372","pid":"3503","channel_order":"4371","channel_name":"Squad 4 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4373","pid":"3503","channel_order":"4372","channel_name":"Squad - 5 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4374","pid":"3503","channel_order":"4373","channel_name":"Squad - 6 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4375","pid":"3503","channel_order":"4374","channel_name":"Squad - 7 (Misc Ducats)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3502","pid":"580","channel_order":"3503","channel_name":"Squads","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1112","pid":"3502","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1065","pid":"3502","channel_order":"1112","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1068","pid":"3502","channel_order":"1065","channel_name":"Squad 3","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1067","pid":"3502","channel_order":"1068","channel_name":"Squad 4","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1124","pid":"3502","channel_order":"1067","channel_name":"Squad 5","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1125","pid":"3502","channel_order":"1124","channel_name":"Squad 6","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1135","pid":"3502","channel_order":"1125","channel_name":"Squad 7","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1224","pid":"3502","channel_order":"1135","channel_name":"Squad 8","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1225","pid":"3502","channel_order":"1224","channel_name":"Squad 9","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3673","pid":"580","channel_order":"3502","channel_name":"Archwing","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3764","pid":"3673","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3674","pid":"3673","channel_order":"3764","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3675","pid":"3673","channel_order":"3674","channel_name":"Squad 2","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3692","pid":"3673","channel_order":"3675","channel_name":"Squad 3","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"668","pid":"580","channel_order":"3673","channel_name":"Syndicate Farming","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"55"},{"cid":"1121","pid":"668","channel_order":"0","channel_name":"Squad 1","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3994","pid":"3473","channel_order":"580","channel_name":"> -=Trade Frame=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3645","pid":"3473","channel_order":"3994","channel_name":"> -=Alliances=-","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"520","pid":"3645","channel_order":"0","channel_name":"V Alliance","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3648","pid":"520","channel_order":"0","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3784","pid":"3648","channel_order":"0","channel_name":"DWM Gaming","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3785","pid":"3784","channel_order":"0","channel_name":"Admin Channel","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3786","pid":"3784","channel_order":"3785","channel_name":"Private Chatroom","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"560","pid":"3786","channel_order":"0","channel_name":"Shards of Despair - Ghost 1\/0\/0\/0","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"459","pid":"3648","channel_order":"3784","channel_name":"Lag Wave 50 - Storm 71","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"475","pid":"3648","channel_order":"459","channel_name":"MTZ\/Microterrorizm","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"480","pid":"3648","channel_order":"475","channel_name":"Original Goon Squad- Storm [52]","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"4789","pid":"480","channel_order":"0","channel_name":"[OGS] Leveling up frames","channel_topic":"","total_clients":"5","channel_needed_subscribe_power":"0"},{"cid":"587","pid":"3648","channel_order":"480","channel_name":"Xenosha - Storm [53]","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"707","pid":"3648","channel_order":"587","channel_name":"ISRWarframe - Storm Clan (Hebrew)","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"872","pid":"3648","channel_order":"707","channel_name":"The Brothers of Mortem","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"1116","pid":"3648","channel_order":"872","channel_name":"SOR","channel_topic":"","total_clients":"3","channel_needed_subscribe_power":"0"},{"cid":"1247","pid":"3648","channel_order":"1116","channel_name":"Without Strings - Shadow (20)","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1364","pid":"3648","channel_order":"1247","channel_name":"BiziCazipClan- Storm(67)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1578","pid":"3648","channel_order":"1364","channel_name":"SYSTEM 32 - Moon Clan [793]","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1380","pid":"3648","channel_order":"1578","channel_name":"Cypher advents ã€ÂFR】ã€ÂStorm】ã€ÂPs4\/Pc\/Xbox】","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"1956","pid":"3648","channel_order":"1380","channel_name":"Cosmic Aegis Ghost(9)","channel_topic":"","total_clients":"6","channel_needed_subscribe_power":"0"},{"cid":"2115","pid":"3648","channel_order":"1956","channel_name":"Firestorm {FR}- Storm {57}","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"2083","pid":"3648","channel_order":"2115","channel_name":"Soldiers 0f Misfortune - Ghost (10)","channel_topic":"","total_clients":"2","channel_needed_subscribe_power":"0"},{"cid":"621","pid":"3648","channel_order":"2083","channel_name":"Shruikan(Fr) - Storm Clan","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2882","pid":"3648","channel_order":"621","channel_name":"GOLDenSILVER - Mtn-50","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1363","pid":"3648","channel_order":"2882","channel_name":"Probation","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"716","pid":"1363","channel_order":"0","channel_name":"SuperiorSwords 46\/13\/37 Mtn115 3\/1\/15","channel_topic":"","total_clients":"7","channel_needed_subscribe_power":"0"},{"cid":"878","pid":"1363","channel_order":"716","channel_name":"Blood Berserk - Ghost(9) 3\/8\/15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"1302","pid":"1363","channel_order":"878","channel_name":"ViosVigilantes 3\/18\/15 Shw(14)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2106","pid":"1363","channel_order":"1302","channel_name":"CraK za - Shadow10 1\/1\/15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"2752","pid":"1363","channel_order":"2106","channel_name":"Wooch - 1\/19\/420 Storm(100)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4248","pid":"1363","channel_order":"2752","channel_name":"Strong Army 3\/19\/15","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"4632","pid":"1363","channel_order":"4248","channel_name":"Israel Tenno Forces(6) 03\/24\/15","channel_topic":"","total_clients":"1","channel_needed_subscribe_power":"0"},{"cid":"3649","pid":"3645","channel_order":"520","channel_name":"Ice","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3654","pid":"3649","channel_order":"0","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"458","pid":"3654","channel_order":"0","channel_name":"-Quantum Entanglement - Storm (65)","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3644","pid":"3645","channel_order":"3649","channel_name":"Orion Alliance","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3656","pid":"3644","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3653","pid":"3644","channel_order":"3656","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3643","pid":"3653","channel_order":"0","channel_name":"Bloodgod","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3641","pid":"3645","channel_order":"3644","channel_name":"Tenno Council Alliance","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3651","pid":"3641","channel_order":"0","channel_name":"Lobby","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3655","pid":"3641","channel_order":"3651","channel_name":"Clans","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3657","pid":"3655","channel_order":"0","channel_name":"Okami sama no Shinobi","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3650","pid":"0","channel_order":"3473","channel_name":"[*cspacer 18]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"},{"cid":"3458","pid":"0","channel_order":"3650","channel_name":"[lspacer 19]> -=AFK=-","channel_topic":"","total_clients":"-1","channel_needed_subscribe_power":"75"},{"cid":"3652","pid":"0","channel_order":"3458","channel_name":"[*cspacer 17]༖","channel_topic":"","total_clients":"0","channel_needed_subscribe_power":"0"}],"virtualserver_antiflood_points_needed_command_block":"150","virtualserver_antiflood_points_needed_ip_block":"250","virtualserver_antiflood_points_tick_reduce":"15","virtualserver_ask_for_privilegekey":"0","virtualserver_autostart":"1","virtualserver_channel_temp_delete_delay_default":"0","virtualserver_channelsonline":"231","virtualserver_client_connections":"797","virtualserver_clientsonline":"107","virtualserver_codec_encryption_mode":"0","virtualserver_complain_autoban_count":"5","virtualserver_complain_autoban_time":"1200","virtualserver_complain_remove_time":"3600","virtualserver_created":"1358228062","virtualserver_default_channel_admin_group":"5","virtualserver_default_channel_group":"8","virtualserver_default_server_group":"8","virtualserver_download_quota":"18446744073709551615","virtualserver_filebase":"files\/virtualserver_1","virtualserver_flag_password":"0","virtualserver_hostbanner_gfx_interval":"0","virtualserver_hostbanner_gfx_url":"","virtualserver_hostbanner_mode":"2","virtualserver_hostbanner_url":"https:\/\/docs.google.com\/forms\/d\/11gB6-VhhQevWJb-LyGfU4AtCNGRFBrdkttOjfsP3fQA\/viewform?usp=send_form","virtualserver_hostbutton_gfx_url":"","virtualserver_hostbutton_tooltip":"DWM Gaming","virtualserver_hostbutton_url":"","virtualserver_hostmessage":"Daylight Saving Time begins on March 8th 2015 at 2AM. The clock is set to go forward 1 hour at this time.","virtualserver_hostmessage_mode":"2","virtualserver_icon_id":"0","virtualserver_id":"1","virtualserver_ip":"67.43.5.200","virtualserver_log_channel":"1","virtualserver_log_client":"1","virtualserver_log_filetransfer":"1","virtualserver_log_permissions":"1","virtualserver_log_query":"1","virtualserver_log_server":"1","virtualserver_machine_id":"","virtualserver_max_download_total_bandwidth":"18446744073709551615","virtualserver_max_upload_total_bandwidth":"18446744073709551615","virtualserver_maxclients":"500","virtualserver_min_client_version":"1373587200","virtualserver_min_clients_in_channel_before_forced_silence":"250","virtualserver_month_bytes_downloaded":"748237337","virtualserver_month_bytes_uploaded":"58748505","virtualserver_name":"DWM Gaming","virtualserver_name_phonetic":"","virtualserver_needed_identity_security_level":"8","virtualserver_password":"","virtualserver_platform":"Linux","virtualserver_port":"9987","virtualserver_priority_speaker_dimm_modificator":"-18.0000","virtualserver_query_client_connections":"1946","virtualserver_queryclientsonline":"1","virtualserver_reserved_slots":"0","virtualserver_status":"online","virtualserver_total_bytes_downloaded":"124757274671","virtualserver_total_bytes_uploaded":"19436742837","virtualserver_total_packetloss_control":"0.0050","virtualserver_total_packetloss_keepalive":"0.0045","virtualserver_total_packetloss_speech":"0.0037","virtualserver_total_packetloss_total":"0.0050","virtualserver_total_ping":"114.1226","virtualserver_unique_identifier":"fFu6LM7r7NKPJlFheQxo6rSweP4=","virtualserver_upload_quota":"18446744073709551615","virtualserver_uptime":"81901","virtualserver_version":"3.0.11.2 [Build: 1418654632]","virtualserver_weblist_enabled":"1","virtualserver_welcomemessage":"Welcome to DWM Gaming, visit our site at [URL]www.DWMGaming.com[\/URL]."}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teeworlds/1_response.txt b/gameq/tests/Protocols/Providers/Teeworlds/1_response.txt deleted file mode 100644 index 1bbaa5bd12882404e5cf8f2fbb490cbc21862d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmezW9|kh>(u_?R4D`$tN{UMJvUL;;^$blD8B$V;5|dL4it_dHQcDzc72NZSQj7IH zTmtmNQj0RvGLsWaGV}BF^Gh;Pixi6UbMh5@6AOwJlnoiuK`I$sT!Mi584Q5X&(u_?R4D`(Oj2ILZfIv%2OToo2T)`!^xFA(8B^4|XlA2ncUzC$ltl;9S U$dHn2&fwz9U;u=MV8Vz209Rre_5c6? diff --git a/gameq/tests/Protocols/Providers/Teeworlds/2_result.json b/gameq/tests/Protocols/Providers/Teeworlds/2_result.json deleted file mode 100644 index 67977c4..0000000 --- a/gameq/tests/Protocols/Providers/Teeworlds/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"144.76.72.214:8303":{"dedicated":true,"flags":"0","game_descr":"DM","gq_address":"144.76.72.214","gq_joinlink":"steam:\/\/connect\/144.76.72.214:8303\/","gq_name":"Teeworlds Server","gq_online":true,"gq_port_client":8303,"gq_port_query":8303,"gq_protocol":"teeworlds","gq_transport":"udp","gq_type":"teeworlds","hostname":"! *** DNW Despe.de *** Teeworlds DM!","map":"dm7","maxplayers":"10","maxplayers_total":"12","num_players":"0","num_players_total":"0","version":"0.6.2"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Teeworlds/3_response.txt b/gameq/tests/Protocols/Providers/Teeworlds/3_response.txt deleted file mode 100644 index d2ec0bb24b3ced054bf65c68598df9bcc00ef0cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529 zcmYk2!EPEc6h+^sIIFf&2FByT49kqDTB#`@h*Cu)3!8Zaml+$`9ta7M@*$D3%9lin zny;d6Nuh7y#r4sB_rC4+-zYt0Er=Vu!H!9%LE(su^U_S_WQ2B!_KL`|5{q*->|dOm zlCQ>jEQnl_p_mFR$(Y4Wo?gNK6m+{*Ot6Q3W$YYcpe>;M{oVXP_41_EjkLyZ03r%e znq+ODkoWsvF20}iU?vuewKEm41fouu@F}bpx8zKJ7y$5;?e$8z6-whE_y?M?G{6H< z6hD<#07;wgQE8P|Zbm!`@H3_7LYmq`=RjOuelwyJ&F0;y$nOE#aS9R7{#d#?+@w%p zPe{y@ph#mi@rFnwQ;WE(@}73|`fT*|ugARq_VD%qo1vI|&aD}3Alt|JNI$J=xigGt zoCV7u8RzC9cPlx7gS9n~*H!~NM4h2>s3qF#(3~IiL2YlbFfbHL)RR)IAWP%@&cF3Y Px2~%7E-&TbY7~A0Yg>|I diff --git a/gameq/tests/Protocols/Providers/Teeworlds/3_result.json b/gameq/tests/Protocols/Providers/Teeworlds/3_result.json deleted file mode 100644 index 8ed9a13..0000000 --- a/gameq/tests/Protocols/Providers/Teeworlds/3_result.json +++ /dev/null @@ -1 +0,0 @@ -{"5.135.83.167:8303":{"dedicated":true,"flags":"0","game_descr":"DDraceNetwork","gq_address":"5.135.83.167","gq_joinlink":"steam:\/\/connect\/5.135.83.167:8303\/","gq_name":"Teeworlds Server","gq_online":true,"gq_port_client":8303,"gq_port_query":8303,"gq_protocol":"teeworlds","gq_transport":"udp","gq_type":"teeworlds","hostname":"! [Block Server] blmapV3ROYAL Hosted by Rafael [30\/64]","map":"blmapV3ROYAL","maxplayers":"16","maxplayers_total":"16","num_players":"15","num_players_total":"15","players":[{"name":"|Weißnixbrot|","clan":"","flag":"-1","score":"-4287","team":"1"},{"name":"BOOGYMAN","clan":"happysom","flag":"32","score":"-9999","team":"1"},{"name":"artaz Tn'P","clan":"","flag":"643","score":"-9999","team":"1"},{"name":"miswebos","clan":"","flag":"152","score":"-334","team":"1"},{"name":"Paddjini","clan":"","flag":"276","score":"-9999","team":"1"},{"name":"british tea","clan":"thinkabout","flag":"96","score":"-9999","team":"1"},{"name":"\\\\Koala\/\/{LaB}","clan":"","flag":"704","score":"-684","team":"1"},{"name":"suck dis","clan":"","flag":"-1","score":"62","team":"1"},{"name":"born to be free","clan":"","flag":"-1","score":"-9999","team":"1"},{"name":"SÆ¥ongÈœBOɀɀ","clan":"|RacEBroS|","flag":"8","score":"-9999","team":"1"},{"name":"(1)wubs","clan":"","flag":"-1","score":"-108","team":"1"},{"name":"(1)osski","clan":"","flag":"528","score":"-9999","team":"1"},{"name":"Pyro","clan":"Burn","flag":"36","score":"-9999","team":"1"},{"name":"heisenberg","clan":"","flag":"166","score":"-9999","team":"1"},{"name":"Purzedo","clan":"Ravenclaw","flag":"840","score":"-9999","team":"1"},{"name":"Koala Dummy","clan":"","flag":"-1","score":"-1652","team":"1"}],"version":"0.6.3, 9.1"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Terraria/1_response.txt b/gameq/tests/Protocols/Providers/Terraria/1_response.txt deleted file mode 100644 index 83879a4..0000000 --- a/gameq/tests/Protocols/Providers/Terraria/1_response.txt +++ /dev/null @@ -1,100 +0,0 @@ -HTTP/1.0 200 Made by Jonas Gauffin -Content-Type: application/json; charset=utf-8 -Content-Length: 1950 -Connection: Close -Server: TShockAPI/4.3.16.0 - - -|| -{ - "status": "200", - "name": "", - "serverversion": "v1.3.2.1", - "tshockversion": { - "Major": 4, - "Minor": 3, - "Build": 16, - "Revision": 0, - "MajorRevision": 0, - "MinorRevision": 0 - }, - "port": 7777, - "playercount": 7, - "maxplayers": 86, - "world": "ShadowRain ~ VII", - "uptime": "8.15:10:51", - "serverpassword": false, - "players": [ - { - "nickname": "Woozer", - "username": "Woozer", - "group": "default", - "active": true, - "state": 10, - "team": 0 - }, - { - "nickname": "G0D", - "username": "G0D", - "group": "default", - "active": true, - "state": 10, - "team": 5 - }, - { - "nickname": "dood123", - "username": "dood123", - "group": "default", - "active": true, - "state": 10, - "team": 0 - }, - { - "nickname": "Shpee", - "username": "Shpee", - "group": "default", - "active": true, - "state": 10, - "team": 0 - }, - { - "nickname": "Ford_j_Ford", - "username": "Ford_j_Ford", - "group": "default", - "active": true, - "state": 10, - "team": 5 - }, - { - "nickname": "Hi-im-jimmy", - "username": "Hi-im-jimmy", - "group": "Member+1", - "active": true, - "state": 10, - "team": 3 - }, - { - "nickname": "Biofighter", - "username": "Biofighter", - "group": "default", - "active": true, - "state": 10, - "team": 0 - } - ], - "rules": { - "AutoSave": false, - "DisableBuild": false, - "DisableClownBombs": false, - "DisableDungeonGuardian": false, - "DisableInvisPvP": true, - "DisableSnowBalls": false, - "DisableTombstones": true, - "EnableWhitelist": false, - "HardcoreOnly": false, - "PvPMode": "normal", - "SpawnProtection": true, - "SpawnProtectionRadius": 325, - "ServerSideInventory": false - } -} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Terraria/1_result.json b/gameq/tests/Protocols/Providers/Terraria/1_result.json deleted file mode 100644 index 7aa3b89..0000000 --- a/gameq/tests/Protocols/Providers/Terraria/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"t.shadowrain.net:7777":{"dedicated":1,"game_port":7777,"gq_address":"t.shadowrain.net","gq_joinlink":"steam:\/\/connect\/t.shadowrain.net:7777\/","gq_name":"Terraria","gq_online":true,"gq_port_client":7777,"gq_port_query":7878,"gq_protocol":"tshock","gq_transport":"tcp","gq_type":"terraria","hostname":"","maxplayers":86,"numplayers":7,"password":0,"players":[{"nickname":"Woozer","username":"Woozer","group":"default","active":1,"state":10,"team":0},{"nickname":"G0D","username":"G0D","group":"default","active":1,"state":10,"team":5},{"nickname":"dood123","username":"dood123","group":"default","active":1,"state":10,"team":0},{"nickname":"Shpee","username":"Shpee","group":"default","active":1,"state":10,"team":0},{"nickname":"Ford_j_Ford","username":"Ford_j_Ford","group":"default","active":1,"state":10,"team":5},{"nickname":"Hi-im-jimmy","username":"Hi-im-jimmy","group":"Member+1","active":1,"state":10,"team":3},{"nickname":"Biofighter","username":"Biofighter","group":"default","active":1,"state":10,"team":0}],"rules":{"AutoSave":0,"DisableBuild":0,"DisableClownBombs":0,"DisableDungeonGuardian":0,"DisableInvisPvP":1,"DisableSnowBalls":0,"DisableTombstones":1,"EnableWhitelist":0,"HardcoreOnly":0,"PvPMode":"normal","SpawnProtection":1,"SpawnProtectionRadius":325,"ServerSideInventory":0},"serverversion":"v1.3.2.1","uptime":"8.15:10:51","world":"ShadowRain ~ VII"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Terraria/2_response.txt b/gameq/tests/Protocols/Providers/Terraria/2_response.txt deleted file mode 100644 index e69de29..0000000 diff --git a/gameq/tests/Protocols/Providers/Terraria/2_result.json b/gameq/tests/Protocols/Providers/Terraria/2_result.json deleted file mode 100644 index 3b2f333..0000000 --- a/gameq/tests/Protocols/Providers/Terraria/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"216.52.143.248:7777":{"gq_address":"216.52.143.248","gq_joinlink":"steam:\/\/connect\/216.52.143.248:7777\/","gq_name":"Terraria","gq_online":false,"gq_port_client":7777,"gq_port_query":7878,"gq_protocol":"tshock","gq_transport":"tcp","gq_type":"terraria"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Tf2/1_response.txt b/gameq/tests/Protocols/Providers/Tf2/1_response.txt deleted file mode 100644 index 20a7879bb53a41bee8ada0c2d2ff8f174ac71813..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5278 zcmc&&ONboD87?`>AtoU)IFJwsO%iY(v#pughc+=7uQWSa*|HJ4k`NZ6sp+nsDQ|aI ztEzftXR{aE0^8US@FDR`9YcSsnDjywJ3OtXPM>Meyh)o?VW3pf~`}^ znAYjaSe3W>yW86>C%V<|cUwC>Zcy6!~xORYY8icd0l=2Vqs!m>xO zaqi`>_t}M!cm`Suy;tyk5gc9I+uJ>IRKI%hc%PY%Z+v{?udg$bb$y5R+1@i3cl%p= zTNigP?zv+JXaBLy_IP3WVS69xd`9HVy%$E&h%i(iXR-UcC(>2>;XCKRhLfPQFC}Np8 zJo)*B9=r1Fg)>(Jn52bAZ+-vq9y`T#VYal`;Kv4u>^*vyy&cYv)}&a7kaEO zq}T4p;pcno{0Nu*^qI=D`u8XQJk54RVyrymPUOyOpPY7ouou2@z5eUbD_`C6*pnYU zTL1Oh)sLT~*!?eJ_cwoM>^Qq~oZ@)p_wOZ<;)+Q2*Q zu)W1%RTLt&bG#FF!!}S=vNlTuw{WqIN34TI%(GOBYZbgSWu0}FC{s2F!4IUOfSECp z8v&V{K^Q zCVUzdYA91%tLpAQ0%gRlGoir}1zfADNa~}t^a)B7*~%!y$XXL?xCZ4D${OcBZ`6Z$ zG?7Ij(-ek~8*wwBMoSRTLO==fr`L6X<{}e971`8pkPy@)%SJ4a-5sXSn2gh?ferH(5UlS1f4(SxaBcZ->v$8+B8a1-bc0Y*GQ z)kLJA;uLn_({{KXZq)k?vW~~nee@ut?V{wOri82Rd^SH$PKE@GN9giupqf=~6_#LY z#2Yd@UZWUQz#yxvmW>+S_Ua(1P$JZ@DVr*slY~*tYBg;rKy@8*5;bgqoo?81x+ZE; zWC~TOX~!B7AV`t?B0)XP=aj3EvpJyc6w}X)xY7?;oK^)9qR5zoId#|jXC$%`uCC^I z+v8F%oKFUAk{lSS<_EjT0boSD=qELGAw-gi=PP9CtO?fMr+mwK>E_v_Dujs!j!mHk zmCTYuMbLdTYG8y0Rw`LEFRhKn;rxl)k%wX=_)_=qzSeb~-p3Pz^ju6kTnksd*#`5( zvJT{BC&a~cTrCC2Y>Qe;iScpHvJ-C93`-G5mg}KtZbEbNohdac{YLj42U#Y_&UES4PKqf}4r) zdO(rhH>~SO3l(P)^VnSH^|0-Jh>_nkOZD!dJI5XG=D8AuVWM>6O(=QgMh(BxVu*GJ zcR*X@h%q!(JgWkTgxNNLrZG*42?<;}Y$|AFOo|!RnW0sN`C#aJE}g~Fo7wed6Q`yj z#E>v=g?BZrJrS-D+jPA{Obw-TvYTm;K&*qCr(IS0!!EtX2;ZS$|L+$g6dNlUi+cWW z5j4i=68uJXvanz^z(M$97>8cy*M>Ckxyb(nR1ohN=SXsjYkelXcIPeclNs%1g} zTOTcoSp+Ww^{6~QILK7IkHn!aL9?Sjoe0c8m|v)NK<^psrb@IyC`A*UKkLB?WpIJb z$_Ax0&f!L%M}2H0Ccw1IEd&oLyHr)t9cjcAI%Xi zrTx-rJ{vA^I3@yBRHiB3KQf~FZGtX<&gIGdMb~ct6R9-yxO-2jM0n@9yNc#mOz%X< zSpfJrw2b6qdZ9GWlzd9FMgv`{cb~g+oW!}})+94E1ziZP7JZG14a(Tbb;qB2lo)fW zT_BsS+fMw--t z2M;T7;oABTq2QnwP=v|QpZ5Velmo9v9k2A*m_@03F>N^JrJ4v`mC-^;uXKbGfTxU| z&aMx^g2qD3ycDrk diff --git a/gameq/tests/Protocols/Providers/Tf2/1_result.json b/gameq/tests/Protocols/Providers/Tf2/1_result.json deleted file mode 100644 index 37872da..0000000 --- a/gameq/tests/Protocols/Providers/Tf2/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"74.91.119.154:27016":{"amplifier_version":"2.4","backpack_tf_version":"2.10.0A","connect_version":"1.2.0","coop":"0","deathmatch":"1","decalfrequency":"15","dedicated":"d","dosp_version":"1.0.0.0","enhanced_items_version":"1.0.0A","ff2_version":"1.07 beta 5","ftauntlimit_version":"1.2","game_descr":"Freak Fortress 2 (1.07 beta 5)","game_dir":"tf","game_id":440,"gameme_plugin_version":"4.2","gameme_webpage":"http:\/\/www.gameme.com","goomba_version":"2.0.2","gq_address":"74.91.119.154","gq_joinlink":"steam:\/\/connect\/74.91.119.154:27016\/","gq_name":"Team Fortress 2","gq_online":true,"gq_port_client":"27016","gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"tf2","hostname":"-[DISC-FF.com]- |24\/7 Freak Fortress #1| [Amp\/Crits\/RTD]","keywords":"increased_maxplayers,arena,alltalk,FastDL,24\/7,Boss,Custom,FREE,Freak,FF2,HHH,Saxton,Freak Fortress,Fun,VSH,Hale,Pony,Furry,XXX","map":"vsh_2fortdesk_v8","max_players":32,"mce_version":"1.10.2","metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"1","mp_flashlight":"1","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"0","mp_fraglimit":"0","mp_friendlyfire":"0","mp_highlander":"0","mp_holiday_nogifts":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"30","mp_tournament":"0","mp_tournament_stopwatch":"1","mp_weaponstay":"0","mp_windifference":"0","mp_windifference_min":"0","mp_winlimit":"0","ne_version":"1.10.0","nextlevel":"","num_bots":0,"num_players":32,"num_rules":188,"os":"w","password":0,"player_analytics_version":"1.1.0A","players":[{"id":0,"name":"\u00a4DLq\u00a4\u2122 Snivy 2","score":0,"time":11011.298828125},{"id":0,"name":"JawlessBullet","score":17,"time":9825.82421875},{"id":0,"name":"TheMasterSnake |USSR|","score":0,"time":8480.6689453125},{"id":0,"name":"s\u01dd\u01dd\u028c","score":1,"time":8210.12890625},{"id":0,"name":"SMURFASAURUS","score":0,"time":7305.18359375},{"id":0,"name":"Santa's Brother","score":0,"time":5812.4462890625},{"id":0,"name":"Danny De Ditto","score":12,"time":5206.177734375},{"id":0,"name":"Beaver","score":0,"time":5038.1723632812},{"id":0,"name":"\u2603Frostbite","score":0,"time":4806.0766601562},{"id":0,"name":"Super Fresh","score":0,"time":4596.3759765625},{"id":0,"name":"Grzegorz Brzeczyszczykiewicz","score":0,"time":4013.5083007812},{"id":0,"name":"-[FF]-LoLoLoLoLoL","score":0,"time":3888.9562988281},{"id":0,"name":"BigZulu","score":24,"time":3050.3459472656},{"id":0,"name":"Fox Alisa","score":16,"time":2214.6291503906},{"id":0,"name":"Darksamus187","score":0,"time":1919.1916503906},{"id":0,"name":"Uh Huh Hunny.pp","score":2,"time":1546.5238037109},{"id":0,"name":"TinnyKitty","score":1,"time":1407.3640136719},{"id":0,"name":"\u2764\u2620\u2764\u0466$\u0126\u2112\u20ac\u00a5\u2764\u2620\u2764","score":1,"time":1364.2371826172},{"id":0,"name":"bohmann","score":0,"time":1100.2387695312},{"id":0,"name":"Gandolf Rodriguez","score":0,"time":1093.7109375},{"id":0,"name":"JDX|>\u0420\u0443\u0441\u0441\u043a\u0438\u0439","score":0,"time":976.82684326172},{"id":0,"name":"I'm not Pencil","score":0,"time":850.47485351562},{"id":0,"name":"[NTG] Darrel","score":0,"time":748.6689453125},{"id":0,"name":"BarnsAreSafe","score":0,"time":731.89916992188},{"id":0,"name":"darkfan137","score":0,"time":548.47863769531},{"id":0,"name":"Fein","score":0,"time":532.72625732422},{"id":0,"name":"PhantKGul","score":0,"time":463.80426025391},{"id":0,"name":"Redstiza","score":0,"time":461.08813476562},{"id":0,"name":"","score":0,"time":264.21487426758},{"id":0,"name":"","score":0,"time":9.3347358703613},{"id":0,"name":"","score":0,"time":9.2979125976562},{"id":0,"name":"","score":0,"time":6.2301688194275}],"playertrails_version":"1.0.8.2","port":27016,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","rtve_version":"1.10.0","sb_version":"1.4.11","scp_version":"1.1.4-fix","secure":1,"short_circuit_nerf_version":"1.0.2A","sm_adv_version":"0.16","sm_advertisements_version":"0.5.6","sm_afkmanager_version":"1.1.3","sm_al_version":"1.0","sm_betherobot_version":"1.31","sm_bhats_version":"1.9","sm_classrestrict_version":"0.6","sm_crashlogger_version":"2.0.0","sm_destroy_version":"1.2.0","sm_dog_version":"1.12.13","sm_downloader_version":"1.4","sm_extendedcomm_version":"3.0.8b","sm_fakedownloadurl_version":"1.0","sm_funcommandsx_version":"2.3","sm_helpmenu_version":"0.3","sm_irs_version":"2.0.8","sm_logo_version":"2.2","sm_menu2_version":"0.3","sm_needlejump_version":"1.0","sm_nextmap":"vsh_dunes_b2","sm_nobuildzones_version":"1.0","sm_observerpoint_version":"1.0.100","sm_resizehead_version":"1.1.0","sm_rplayer_version":"1.0","sm_rtd_version":"0.4.3.3","sm_safezones_version":"3.0.0","sm_shortcuts_version":"1.0.0","sm_spawnprot_version":"1.6.3","sm_spec_target_version":"1.0.1","sm_spray_version":"5.8a","sm_tidychat_version":"0.4","sm_tmedicrubber_version":"0.2.0","sm_updater_version":"1.1.5","sm_warn_version":"1.0.7","smac_version":"0.8.0.9","sourcemod_version":"1.6.4-dev+4608","steam_id":85568392920039968,"steamappid":440,"steamtools_version":"0.8.3","stripper_version":"1.2.2","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5.000000","sv_noclipspeed":"5.000000","sv_password":"0","sv_pausable":"0","sv_registration_message":"No account specified","sv_registration_successful":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"100","sv_tags":"increased_maxplayers,arena,alltalk,FastDL,24\/7,Boss,Custom,FREE,Freak,FF2,HHH,Saxton,Freak Fortress,Fun,VSH,Hale,Pony,Furry,XXX","sv_voiceenable":"1","sv_vote_quorum_ratio":"0.6","sv_wateraccelerate":"10","sv_waterfriction":"1","tails_admin":"0","tails_admin_flags":"s","tails_admin_override":"0","tails_announce":"0","tails_announce_plugin":"0","tails_blocktriggers":"1","tails_delayonspawn":"0.1","tails_force_admins":"0","tails_force_users":"0","tails_version":"1.0.0","teamjoin_version":"1.0","tf2attributes_version":"1.1.1","tf2items_manager":"1","tf2items_manager_version":"1.4.1","tf2items_version":"1.5.3","tf_allow_player_use":"0","tf_arena_change_limit":"1","tf_arena_first_blood":"0","tf_arena_force_class":"0","tf_arena_max_streak":"3","tf_arena_override_cap_enable_time":"-1","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"0","tf_beta_content":"0","tf_birthday":"0","tf_bot_count":"0","tf_classlimit":"0","tf_ctf_bonus_time":"10","tf_damage_disablespread":"0","tf_force_holidays_off":"0","tf_gamemode_arena":"1","tf_gamemode_cp":"0","tf_gamemode_ctf":"0","tf_gamemode_mvm":"0","tf_gamemode_payload":"0","tf_gamemode_rd":"0","tf_gamemode_sd":"0","tf_max_charge_speed":"750","tf_medieval":"0","tf_medieval_autorp":"1","tf_mm_servermode":"0","tf_mm_strict":"0","tf_mm_trusted":"0","tf_mvm_death_penalty":"0","tf_mvm_min_players_to_start":"3","tf_overtime_nag":"0","tf_player_name_change_time":"60","tf_playergib":"1","tf_powerup_mode":"0","tf_server_identity_disable_quickplay":"0","tf_spells_enabled":"0","tf_teamtalk":"1","tf_use_fixed_weaponspreads":"0","tf_weapon_criticals":"1","tf_weapon_criticals_melee":"1","thirdperson_version":"2.1.0","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2621505"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Tf2/2_response.txt b/gameq/tests/Protocols/Providers/Tf2/2_response.txt deleted file mode 100644 index 2f02599a32d34409d562b199c34ee2871f8d0778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5107 zcmc&&O^75(6^>b37FRqh=pqA3ig*xfiu&oE>2VRAp03^=cW0(?dS_9QBq}qqDy+zi zoQTM*u5r8xp2WinvaksLfxF=PyWpWO9y|#P9`xd6SUf5%o`i)NzZa2NKRtT3p}Q-- z7w^S;@qVKoKYsl9#^XTNO*@U<+z%44i67I+=zmA#+|V) zW@EkRBvXA~cd|j*$)HrKI$1UdzmPYJGVP48wv!nlI$2e8rZB1_oyct`Uv#Xuv}2(g z^FPl#c<>Bv;_?1Pb}%@K?p(k9@^N(Q_U%1SeeU0HjMz=n9TgKP3Srn5;Lf9;jM%>E zV%yQE%WKI#0`%421HF@Iy|=hi@awZkXVLL12iIl*F|KZgUD|MOjV!Ic8 zcIesu^|^Z^cFh(d_shTC{PKvsD3ubX&^6!P_2{Qgc7awociM1|Y#n|O21%9b=+2x^ zCbF;|f9VC_$G47muUzSQVEEn#U++h?ag_n+VLYX7C$f`rPJ(}th5B=j~-`i&|@;R5%L40&P715niB#zfuw)Wll(06Fp zSnE^?d#@6n_r|kxsQdbx$1i{B1^kOj?QpA+6-CLV-*N5m)BFAdd!zdN9tGPY1lz@@ z87zCaMS(XuWjsf|Wm1^9Mixli#h|;*#@xyz)dl$}HX_l;GS=(vY!X_I9ykzuCF`+N za5sf}lPT+Ck#L1%fXYR(VErCLzQki~ZS3@9qQvsdez(`{dul7Q-|hFh!)Q-9&aya{ zMG8MTqt!W{iPrg;FTnu>4OpJ6i-sUT5R~h5xzWqtzLbjkF3ZapS+D1}j;>p%P0Pxm z96(X>@CtH*<1odM8UakD<%mRFkuCYWh@H%Z#Wg@g##7<+Sn*`m0!pPk=M&Ma6}MBL zTg_T)XPqb;6*6rSL3+@k?G8ZAQQ`c|@QISSbj=2XN|CBXMj`06m?C$fZ;J8})>_Gw zFXBQ^Wab)Gy}x2`#@u-m)(N05LZhUkWup>X|A?GOCzsEP`#<@2C07G-HsFU8aEOuF%|2u!!Gr1x7l@7 zT5auAqy6S9whds00R|4la2KO{pw>_mgZ$YO(LR#-&C<0}nz$ z-d{z29}(?!ZA$9W9es2wYy~O@2q&H8{;14L~9c&SPO(rt7QG+2K|y-uMjnBFCD~ z=-fPU2$wp}*18-mDLH8BK-kyu#9*Rz3%1+yGSGW$DMZSKgLYk6ljLcMD8+EECK`@LYomZ8xU_`h~S_dXLsSfoA*;!$B4a<_k z2?-RIdZXSw^>C{U%>8hp;}gsN-|rsiU27!9ve|h6-QZrOO@$1ht4HZYg{)(=Vg%p$ zc=PBoX!>~f4Y)%Hk1Houp^f1VNkJJzZ?AYFYZ2P{GRlYD{&s)o>S|BU3%Hxg$C9mq zmOQAi>rxHorCE(r(*=g@(MjgwXt^VGy>l&axnOg0Ya=O1LE-2=Nk2=y3zF zD*)d(Y$E7F=a7;ws7aqgeeqcrWt$!30Jze?l_7Vp?D!LMkxEf>sx4q^SANJg7y><* z$5t4)%J;>v50D={8a8wkQ=tvChrv=bgD~7sGq-H)C9UJF^BWNjsVG974<~Peh|mge z_(rQhLjWc-s4_u*(c^}U2o$Km7Z|eX?c_(U6)AWrOpF`H2SQ~x>fQSuZjtO@c#!QM z2*{>zRl(I%-6(aTrX{n|jN+h+^RspGZQ Lij^VPu0j6+Ys&lD diff --git a/gameq/tests/Protocols/Providers/Tf2/2_result.json b/gameq/tests/Protocols/Providers/Tf2/2_result.json deleted file mode 100644 index dda2c03..0000000 --- a/gameq/tests/Protocols/Providers/Tf2/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.150.155.26:27015":{"amplifier_version":"2.4","basicdonator_recog_v":"0.5","basicdonator_version":"0.4","coop":"0","deathmatch":"1","decalfrequency":"10","dedicated":"d","f_mindcontrol_version":"1.0.1","ff2_boss_toggle_version":"1.0.1","ff2_version":"1.10.3 Beta","game_descr":"TF2x10 v1.3.9","game_dir":"tf","game_id":440,"goomba_version":"2.0.2","gq_address":"66.150.155.26","gq_joinlink":"steam:\/\/connect\/66.150.155.26:27015\/","gq_name":"Team Fortress 2","gq_online":true,"gq_port_client":"27015","gq_port_query":27015,"gq_protocol":"source","gq_transport":"udp","gq_type":"tf2","hostname":"[TFF] Saxton Hale Multiplied By 10! #3 FastDL|TauntCrits|Amp","keywords":"increased_maxplayers,nocrits,alltalk,HHH,arena,b,bonkboy,chozo,f2p,fastdl,ff2,ff2,freak fotress,free,fun,hale,items,my,saxton,s","map":"vsh_oilrig_v18","max_players":30,"mce_version":"1.10.2","metamod_version":"1.10.4-devV","mp_allowNPCs":"1","mp_autocrosshair":"1","mp_autoteambalance":"1","mp_disable_respawn_times":"0","mp_fadetoblack":"0","mp_falldamage":"0","mp_flashlight":"0","mp_footsteps":"1","mp_forceautoteam":"0","mp_forcerespawn":"1","mp_fraglimit":"0","mp_friendlyfire":"0","mp_highlander":"0","mp_holiday_nogifts":"0","mp_match_end_at_timelimit":"0","mp_maxrounds":"0","mp_respawnwavetime":"10.0","mp_scrambleteams_auto":"1","mp_scrambleteams_auto_windifference":"2","mp_stalemate_enable":"0","mp_stalemate_meleeonly":"0","mp_teamlist":"hgrunt;scientist","mp_teamplay":"0","mp_timelimit":"35","mp_tournament":"0","mp_tournament_stopwatch":"1","mp_weaponstay":"0","mp_windifference":"0","mp_windifference_min":"0","mp_winlimit":"0","ne_version":"1.10.0","nextlevel":"","num_bots":0,"num_players":26,"num_rules":188,"os":"l","password":0,"players":[{"id":0,"name":"F2P SCOUT NOOB","score":0,"time":5439.0107421875},{"id":0,"name":"Mr.Engiener","score":4,"time":5279.771484375},{"id":0,"name":"Dr. NOPE.avi","score":21,"time":5272.1967773438},{"id":0,"name":"ScooBySnaCk of TWFAME","score":1,"time":5235.8491210938},{"id":0,"name":"Microsoft Word","score":0,"time":5001.2490234375},{"id":0,"name":"carl.rhodes2","score":0,"time":4921.8540039062},{"id":0,"name":"Princess Twilightlicious","score":22,"time":4728.6782226562},{"id":0,"name":"popdan40 :3","score":0,"time":3859.8715820312},{"id":0,"name":"Asnem","score":0,"time":3476.8681640625},{"id":0,"name":"Killernova88","score":0,"time":2951.5090332031},{"id":0,"name":"Kumatora","score":0,"time":2228.5009765625},{"id":0,"name":"Dildo Swaggins","score":0,"time":2228.4560546875},{"id":0,"name":"TNT8770","score":0,"time":2207.6999511719},{"id":0,"name":"Major_Trouble\u2122","score":0,"time":2164.1550292969},{"id":0,"name":"\uff33\uff2f\uff32\uff34\uff21\uff28\uff35\uff2d\uff21\uff2e","score":22,"time":2119.3647460938},{"id":0,"name":"Murkip","score":0,"time":2090.3549804688},{"id":0,"name":"Bacon","score":0,"time":1758.5524902344},{"id":0,"name":"\u25cfBubby\u25cf","score":4,"time":1651.3779296875},{"id":0,"name":"Ten-thousand angry Ikea chairs","score":0,"time":1455.4056396484},{"id":0,"name":"FrozenFire","score":1,"time":1411.9206542969},{"id":0,"name":"blotz","score":0,"time":1227.060546875},{"id":0,"name":"PhirePhox","score":0,"time":1184.9351806641},{"id":0,"name":"Kawaiitous The Spectavous\u2122","score":0,"time":1128.4151611328},{"id":0,"name":"Kaboodlesque","score":0,"time":988.27008056641},{"id":0,"name":"\u272aTURG\u272a potato senpai","score":0,"time":677.12896728516},{"id":0,"name":"","score":0,"time":47.864902496338}],"port":27015,"protocol":17,"r_AirboatViewDampenDamp":"1.0","r_AirboatViewDampenFreq":"7.0","r_AirboatViewZHeight":"0.0","r_JeepViewDampenDamp":"1.0","r_JeepViewDampenFreq":"7.0","r_JeepViewZHeight":"10.0","r_VehicleViewDampen":"1","regexfilter_enable":"1","rtve_version":"1.10.0","sb_version":"2.0.0-dev","secure":1,"sm_adminsmite_version":"2.1","sm_adv_version":"0.16","sm_afkm_version":"3.5.3","sm_betherobot_version":"1.3","sm_bethesaxton_version":"1.0","sm_bhats_version":"1.7","sm_buildcolor_v":"0.1","sm_calladmin_steam_version":"0.1.4","sm_calladmin_version":"0.1.4","sm_classrestrict_version":"0.6","sm_disguisexpert_version":"1.0.4","sm_donatorsinfo_version":"1.0Beta","sm_downloader_version":"1.4","sm_evilrocket_version":"1.0.110","sm_fakeandforce_version":"2.0","sm_homingrocket":"2409","sm_hr_accuracy":"1","sm_hr_adminflag":"","sm_hr_debug":"0","sm_hr_enable":"1","sm_hr_forcehoming":"1","sm_hr_launchers":"18;513;441","sm_hr_lifetime":"10","sm_hr_lifetimemode":"1","sm_hr_mode":"3","sm_hr_mvm_disabler":"1","sm_hr_saccuracy":"3","sm_hr_sforcehoming":"0","sm_hr_showaim":"1","sm_hr_sshowaim":"1","sm_killstreak_amount":"10","sm_ks_version":"1.7","sm_nextmap":"vsh_crevice_north_pole","sm_resize_version":"1.5.1","sm_respawn_version":"1.2","sm_tf2ii_version":"1.9.1","sm_updater_version":"1.2.1","sourcemod_version":"1.6.3-dev+4588","steam_id":90094324941053957,"steamappid":440,"steamtools_version":"0.8.3","stripper_version":"1.2.2","sv_accelerate":"10","sv_airaccelerate":"10","sv_alltalk":"1","sv_bounce":"0","sv_cheats":"0","sv_contact":"","sv_footsteps":"1","sv_friction":"4","sv_gravity":"800","sv_maxspeed":"320","sv_maxusrcmdprocessticks":"24","sv_noclipaccelerate":"5","sv_noclipspeed":"5","sv_password":"0","sv_pausable":"0","sv_registration_message":"No account specified","sv_registration_successful":"0","sv_rollangle":"0","sv_rollspeed":"200","sv_specaccelerate":"5","sv_specnoclip":"1","sv_specspeed":"3","sv_steamgroup":"","sv_stepsize":"18","sv_stopspeed":"100","sv_tags":"increased_maxplayers,nocrits,alltalk,HHH,arena,b,bonkboy,chozo,f2p,fastdl,ff2,ff2,freak fotress,free,fun,hale,items,my,saxton,s","sv_voiceenable":"1","sv_vote_quorum_ratio":"0.6","sv_wateraccelerate":"10","sv_waterfriction":"1","tf2attributes_version":"1.1.1","tf2items_giveweapon_version":"3.14159","tf2items_manager":"1","tf2items_manager_version":"1.4.1","tf2items_rnd_enabled":"0","tf2items_rnd_normals":"0","tf2items_rnd_version":"1.59","tf2items_version":"1.6.0","tf2x10_version":"1.3.9","tf_allow_player_use":"0","tf_arena_change_limit":"1","tf_arena_first_blood":"0","tf_arena_force_class":"0","tf_arena_max_streak":"3","tf_arena_override_cap_enable_time":"-1","tf_arena_preround_time":"10","tf_arena_round_time":"0","tf_arena_use_queue":"0","tf_beta_content":"0","tf_birthday":"0","tf_bot_count":"0","tf_classlimit":"0","tf_ctf_bonus_time":"10","tf_damage_disablespread":"0","tf_force_holidays_off":"0","tf_gamemode_arena":"1","tf_gamemode_cp":"0","tf_gamemode_ctf":"0","tf_gamemode_mvm":"0","tf_gamemode_payload":"0","tf_gamemode_rd":"0","tf_gamemode_sd":"0","tf_max_charge_speed":"750","tf_medieval":"0","tf_medieval_autorp":"1","tf_mm_servermode":"0","tf_mm_strict":"0","tf_mm_trusted":"0","tf_models_admin_flags":"b","tf_models_admin_override":"0","tf_models_announce":"1","tf_models_announce_plugin":"1","tf_models_blocktriggers":"1","tf_models_delayonspawn":"0.1","tf_models_force_admins":"0","tf_models_force_users":"0","tf_models_list":"tf2_modellist","tf_models_version":"1.0.4","tf_mvm_death_penalty":"0","tf_mvm_min_players_to_start":"3","tf_overtime_nag":"0","tf_player_name_change_time":"60","tf_playergib":"1","tf_powerup_mode":"0","tf_server_identity_disable_quickplay":"0","tf_spells_enabled":"0","tf_teamtalk":"0","tf_use_fixed_weaponspreads":"0","tf_weapon_criticals":"0","tf_weapon_criticals_melee":"1","train_rain_version":"1.0.1","tv_enable":"0","tv_password":"0","tv_relaypassword":"0","version":"2621505"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Theforrest/1_response.txt b/gameq/tests/Protocols/Providers/Theforrest/1_response.txt deleted file mode 100644 index 45c9cd1aa99b4265323273e076fb9b1076abe986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6 NcmezW|Nnm%1^^O#1VI1* diff --git a/gameq/tests/Protocols/Providers/Theforrest/1_result.json b/gameq/tests/Protocols/Providers/Theforrest/1_result.json deleted file mode 100644 index 5708bd3..0000000 --- a/gameq/tests/Protocols/Providers/Theforrest/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"24.144.44.247:27015":{"gq_address":"24.144.44.247","gq_joinlink":"steam:\/\/connect\/24.144.44.247:27015\/","gq_name":"The Forrest","gq_online":true,"gq_port_client":27015,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"theforrest","num_players":0}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Theforrest/2_response.txt b/gameq/tests/Protocols/Providers/Theforrest/2_response.txt deleted file mode 100644 index 5a662dbc08f955959c8cabf73778524796e1e94b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmXAjL2AP=6hvimf^56;1+09@%9lP_$x=kTXk6?t^9MwtcpFXxjY6cHM5mYU&y_>pD6h2SLz4(#Xi^!5ETHITvb7$YWA$b`C3vQ!22N*BF|8jcv#Qt8!x yAB-odBzdqhcuT?=a-=O -Welcome to NoxiousOT! diff --git a/gameq/tests/Protocols/Providers/Tibia/1_result.json b/gameq/tests/Protocols/Providers/Tibia/1_result.json deleted file mode 100644 index 5dce614..0000000 --- a/gameq/tests/Protocols/Providers/Tibia/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"172.93.109.58:7171":{"client":"8.60","dedicated":1,"gq_address":"172.93.109.58","gq_joinlink":"otserv:\/\/172.93.109.58\/7171\/","gq_name":"Tibia","gq_online":true,"gq_port_client":7171,"gq_port_query":7171,"gq_protocol":"tibia","gq_transport":"tcp","gq_type":"tibia","ip":"172.93.109.58","location":"United States","map_author":"Noxious Staff","map_height":"33024","map_name":"World.otbm","map_width":"33536","monsters_total":"52643","motd":"Welcome to NoxiousOT!","npcs_total":"690","owner_email":"support@noxiousot.com","owner_name":"Noxious Staff","players_max":"1000","players_online":"246","players_peak":"779","port":"7171","server":"OTMG","servername":"NoxiousOT 8.60","uptime":"2404686","url":"noxiousot.com","version":"V1 - 8.60 Real Map"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Tibia/2_response.txt b/gameq/tests/Protocols/Providers/Tibia/2_response.txt deleted file mode 100644 index f0220a4..0000000 --- a/gameq/tests/Protocols/Providers/Tibia/2_response.txt +++ /dev/null @@ -1,2 +0,0 @@ - -Welcome to Deathzot II! diff --git a/gameq/tests/Protocols/Providers/Tibia/2_result.json b/gameq/tests/Protocols/Providers/Tibia/2_result.json deleted file mode 100644 index 8836850..0000000 --- a/gameq/tests/Protocols/Providers/Tibia/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"192.99.32.220:7171":{"client":"8.6","dedicated":1,"gq_address":"192.99.32.220","gq_joinlink":"otserv:\/\/192.99.32.220\/7171\/","gq_name":"Tibia","gq_online":true,"gq_port_client":7171,"gq_port_query":7171,"gq_protocol":"tibia","gq_transport":"tcp","gq_type":"tibia","ip":"192.99.32.220","location":"USA","map_author":"Komic","map_height":"5000","map_name":"WORKING.otbm","map_width":"5000","monsters_total":"12898","motd":"Welcome to Deathzot II!","npcs_total":"64","owner_email":"admin@deathzot.net","owner_name":"Xagul Synthetic","players_max":"500","players_online":"14","players_peak":"334","port":"7171","server":"The Forgotten Server","servername":"Deathzot II","uptime":"2866200","url":"http:\/\/deathzot.net\/","version":"0.4_SVN"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Unturned/1_response.txt b/gameq/tests/Protocols/Providers/Unturned/1_response.txt deleted file mode 100644 index 54a1fa36c4a5e3375d44f80dd55f44f8e10b1d57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 630 zcmYLHzi$&U6n>#hm0Ag=jsdpHgr-!24oKYP(xkfPhti~xiU9fU+{DD^7umj)R5yVH zQbFp((7&Jq6R6Bg2nodhz|PD{aNQs*TYleXzfbRd_G~trZC|U^_KO`Bp_0YC+xGHs zyStmOZ``?;xA)q)&svhT4tn|q^r;?lIWQ=pCrzd#Oa2D{%PWQC5DIroWjo8Ib@=d_ zFZ}%V`_;k2TR;S_Z5Wm%}ld#k3!_Bj+a4{D1e9=}i3zoqb^av$`f~CLsKLXHP zFlm|-ju(6JmTpd5&e_T506M56#hGx->G}Hro@Lr_Im|STM~;2_?KA-XoTivMys*>@ zAVoRAh^u66(~;l5b^~ZIH4%8JmA|P35TLBl)HYnqi#u6N6-SHNkxTjbU^9R=)drQr z*WWD#pr(;RJ!11az10^L=+a1B_H(=?DiBW5u#sIZ>*UYv3Oov%;p1w8dO}5lj{kIg z?m?Xj+jGdKj(YiI)%#~u^$IAAN6f%R>3(UgRG!1J$Oc?$@G^tD!^|XjDA!5As2Mhx z)^xx$sR@jz@TnvrH=4|OPfE;W%oOQ3;RYs8?O!0h7$v4tvWJEraC_XRYOG0Lv3O*i i@okA@pJwANX032h9aC1pG^H|ec&<>@+P)vBLc?E^F3gYs diff --git a/gameq/tests/Protocols/Providers/Unturned/1_result.json b/gameq/tests/Protocols/Providers/Unturned/1_result.json deleted file mode 100644 index 10b5871..0000000 --- a/gameq/tests/Protocols/Providers/Unturned/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"66.150.155.127:27015":{"dedicated":"d","game_descr":"Unturned","game_dir":"Unturned","game_id":304930,"gq_address":"66.150.155.127","gq_joinlink":"steam:\/\/connect\/66.150.155.127:27015\/","gq_name":"Unturned","gq_online":true,"gq_port_client":27015,"gq_port_query":27016,"gq_protocol":"source","gq_transport":"udp","gq_type":"unturned","hostname":"GGZ Reborn |TPA|KITS|24\/7|PVP|BeOneOfUs!","keywords":"PVP,NORMAL,BOTH,KROW","map":"Washington","max_players":24,"num_bots":1,"num_players":14,"num_rules":2,"os":"w","password":0,"players":[{"id":0,"name":"Blazone","score":1,"time":1642.0865478516},{"id":0,"name":"silentNviolent #sNv","score":0,"time":1532.4891357422},{"id":0,"name":"Rosbriel","score":0,"time":1373.6436767578},{"id":0,"name":"justinhusack","score":0,"time":1230.3295898438},{"id":0,"name":"ixamom","score":0,"time":852.20330810547},{"id":0,"name":"mongobird09","score":0,"time":851.12176513672},{"id":0,"name":"Mervlol","score":0,"time":782.17944335938},{"id":0,"name":"DonGaming | LucarioGamez","score":0,"time":740.96398925781},{"id":0,"name":"Pastor","score":0,"time":566.32922363281},{"id":0,"name":"rybroskeez","score":0,"time":260.33071899414},{"id":0,"name":"Table","score":1,"time":236.27554321289},{"id":0,"name":"Kyotekote","score":0,"time":173.99436950684},{"id":0,"name":"[KNK]Edosvaldo","score":0,"time":22.567728042603},{"id":0,"name":"HallenKey","score":0,"time":10.648074150085}],"port":27015,"protocol":17,"rocket":"4.8.0.1","rocketplugins":"AutoShutdown2,DeathMessages,GlobalBan,Kits,MessageAnnouncer,RocketMod_TPA,Uconomy,Votifier,Warps,WreckingBall,ZaupFeast,ZaupHomeCommand,ZaupUconomyEssentials","secure":1,"steam_id":90098960477970435,"steamappid":0,"version":"3.13.11.2"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Unturned/2_response.txt b/gameq/tests/Protocols/Providers/Unturned/2_response.txt deleted file mode 100644 index a8ba222cb703f2470332d331379d12466dd089b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 520 zcmYLGF>ljA82uboLai8JqN9sCo(xGUU|_&*uCbLSwwyRtyHtmLNlfiK>+Y;7;DN1D z#f%s_RO$dLGYo9}3kG(60FyDNAU@qEz4yMmr>F0lrfIzU!{MnJcBs#&zlh`>1lWU!sY)=K{s#ctyGD8eM&IhTr)%}#bDG?_*XdmD zzA#z~H1Wf+eT*D`=Au#P$MEpu7W}Q9y54DXG=pvU`S!+XTgxAQU1KOXQyJC#+m|a0 zDHXCZm!!zpQmfw|2n;dL7htqJzTL;*yXGM&N-DHez2C#&3ArYze(>hiT?`I3Py8q} z@f?RIGuN98pZE3j_YVWZguKp7TNG<;@b&23060-+{r(eu=hL$;Aqobh6f=3HfqtR2ThloG{)Cg<%k9FphglvL#rB~oeR@`4`nq982Qe7fSL P1{*6ZC2hA$atVI`sDY~blv1Z9_tsH({98e(;60{D zl`Ox!G;JE=CLt{mJ;J6z9JjhlbyrClSF_MVM(>%ZHjcNyI{c1n8g(2NOYx(#7jpd# zW(E$!6E4+37fN{hkU`3$(7?%hda|BzepB|Cx@XFjAp+>~JuQBf02!)%uI0w2Pqfa2QP<~CRdn9kEw zCs6cNAMZe>JtF^`k%(`^o^;m#0QYBER!<5@kH!zQj9ih2z+xuM52rQom-$@(U z!qWPBZL3aJ$ofXDUMDdf)WFIZkd_DKbHNAI8=Bxf3nmA_Bm^Iwaw|3J_3id1RP4S| zOlV?AK`ARV%$glJqe=20RS1)}G)fqhkMZscskyitL6%EqY}5c5awV%>vgzmf=J25L z|M!$d@4D6TG^3I3c6>!ek{>daI*|_tir(j-$<#VYxut>{bF0|IY>hY2*b`F_>s<8KK4OgvVUN#M%Z_QhJfZ ze}Wavgj~L4v?m2>8*`-6uIx({ur^CfkzjH^mCaNU?DzjtLsO*zbjzf?9j|Gvvni|OFBoY27ho{ ZK{I0tZRY2tzWvpfsDuzcAz&z(@eeM2c_{z@ diff --git a/gameq/tests/Protocols/Providers/Ut2004/1_result.json b/gameq/tests/Protocols/Providers/Ut2004/1_result.json deleted file mode 100644 index 5f3b869..0000000 --- a/gameq/tests/Protocols/Providers/Ut2004/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"199.175.53.150:7777":{"adminemail":"admin@odclan.net","adminname":"Galileo & Humble_Bob","anti tcc version":"2009R6","current game":"Sniper","endtimedelay":"2.00","forcerespawn":"False","game password":"false","gameport":7777,"gamespeed":"1.25","gamestats":"True","gametype":"xDeathMatch","goalscore":"28","gq_address":"199.175.53.150","gq_joinlink":"","gq_name":"Unreal Tournament 2004","gq_online":true,"gq_port_client":7777,"gq_port_query":7778,"gq_protocol":"unreal2","gq_transport":"udp","gq_type":"ut2004","kickvoting":"false","mapname":"\u001bøø@DM-Bathroom-SniperHeaven-2K9[Digital_Demonz_Edit]","mapvoting":"true","maxplayers":30,"maxspectators":"0","minplayers":"7","mutator":"ServerBots","mutator0":"MutAntiTCCFinal","mutator1":"MutZoomMod","mutator10":"Clan Manager 1h 6T","mutator11":"MutClanManager","mutator12":"SZO_Stealth_Trans","mutator13":"MutLowGrav","mutator14":"MutOLGameStats","mutator15":"CFWarningMut","mutator16":"MutUTAN","mutator2":"XCamperMut","mutator3":"ODCChatManager","mutator4":"ODC_SniperMut","mutator5":"DMMutator","mutator6":"ServerColor","mutator7":"MutODCOwnage","mutator8":"MutGameSpeed","mutator9":"MutUSSpawnProtect","numplayers":7,"ping":0,"players":[{"id":20,"name":"Math-Teacher","ping":152,"score":1},{"id":19,"name":"TRIVER","ping":192,"score":1},{"id":18,"name":"TxRufus","ping":68,"score":3},{"id":17,"name":"Spidey","ping":576,"score":1},{"id":10,"name":"CrZyCuBn","ping":52,"score":9},{"id":9,"name":"Jones_Jr.","ping":160,"score":13},{"id":8,"name":"{Wtf}Roland","ping":40,"score":19}],"queryport":0,"server os":"Unix-based","serverid":0,"serverip":false,"servermode":"dedicated","servername":"\u001bø@@Old Dudes\/Dames \u001b@@øSniper - \u001bøø@Campers Only","serverversion":"3369","tick rate":"44.80 \/ 45.00 max.","timelimit":"35","translocator":"True","ut2vote version":"5.9","weaponstay":"True"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut2004/2_response.txt b/gameq/tests/Protocols/Providers/Ut2004/2_response.txt deleted file mode 100644 index 9254d9623f3422e4d3ef71666e1af9b0dde5585e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1287 zcmZ`&-A@`p5FaoI9)j8!+s4%1OOy5i0^M*ni(1P+=z)TS?FdpE@md$(lokdoTO z|J=^G-_aSpaf(+)zxhP|7p#(V^WLaomO z(>GqA!??RM?&%v#JE(3^S<)j*4?XU(2t6>$p3j4p_Fw0{(4A!l=?Px(85aQAsqYo4 zkjnrPrP9%7FmzBSVo?Z*jvCUd6JUV!YND9mKZLBs{x}14$wsOW;s;<@Y;Ywb9`qm) zX`gh1yZt9f${J4W!8o_(;v<$Jr0djcM@QYJ4R8L|8~-LZvuT@O%wJ>EQfG(&<`Yeo zD>Q8?*ZgS7TMGUO5`}zmAKt%Y=0seGxz%HIgQ8zc+v@&+M{I+zi}3(elL!5)(n7J2 zHp!$Sc!U;nZ+L(Ujdt$V8&r{PUpg1Cqw}fQE~r8IRR zmz{EJk<`v|uDYf6P+$mYiwEBY8`BKHO0fW$O5k<4kLO4rBo6Y00!@Hq!f~ZSh!?@o z>L&MjL=K0L=_p3?DrxSdg4HS$A@%KuQwp@<;m&&DlF`!oaTmn`tv z-keFA^GD-#TH>x#>lU@?e8u8hdf)1PxqGe9?ZY`;XJl@YkSHAeRv1dz_pW2+b)rIkR-G)|8YHcqDGmRC@K3of{U&5ID&?6HRNxsk)MZ&jM)B zMdzU@MVzd=sPQhzIulJv;&g3DeWEo%1!cOw)(WBo@v1}3^Wi6nb9ja1HEN&|QhA^Y I$PjD#4{?V|oB#j- diff --git a/gameq/tests/Protocols/Providers/Ut2004/2_result.json b/gameq/tests/Protocols/Providers/Ut2004/2_result.json deleted file mode 100644 index 567a748..0000000 --- a/gameq/tests/Protocols/Providers/Ut2004/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"68.232.163.193:7777":{"adminemail":"","adminname":"igsclan.com","balanceteams":"True","endtimedelay":"4.00","forcerespawn":"False","friendlyfirescale":"0%","gameport":7777,"gamespeed":"1.25","gamestats":"True","gametype":"ONSOnslaughtGame","goalscore":"1","gq_address":"68.232.163.193","gq_joinlink":"","gq_name":"Unreal Tournament 2004","gq_online":true,"gq_port_client":7777,"gq_port_query":7778,"gq_protocol":"unreal2","gq_transport":"udp","gq_type":"ut2004","kickvoting":"true","linksetup":"Default","mapname":"ONS-AggressiveAlleys2k7-","mapvoting":"true","maxplayers":12,"maxspectators":"4","minplayers":"10","mutator":"IGS_SG_1Mut","mutator0":"DMMutator","mutator1":"Mut_SIG66_LR","mutator2":"MutWoRM_X","mutator3":"MutHyperLinkV3","mutator4":"","mutator5":"MutEliteMachine","mutator6":"Mut_IK_SIRRUSH","mutator7":"MutUTAN","mutator8":"EliteMachineGameRules","numplayers":10,"ping":0,"players":[{"id":17,"name":"ImA_Wreck","ping":68,"score":0},{"id":16,"name":"356c","ping":68,"score":0},{"id":15,"name":"TOOSWEET","ping":68,"score":70},{"id":12,"name":"Player","ping":76,"score":0},{"id":14,"name":"Groot","ping":100,"score":20},{"id":10,"name":"Thanos","ping":105,"score":17},{"id":9,"name":"Ironman","ping":75,"score":16},{"id":8,"name":"Iceman","ping":95,"score":15},{"id":7,"name":"Gunslinger","ping":65,"score":23},{"id":5,"name":"Storm","ping":90,"score":23},{"id":3,"name":"Starlord","ping":70,"score":13}],"playersbalanceteams":"True","queryport":0,"serverid":0,"serverip":false,"servermode":"dedicated","servername":"\u001bÿÿ\u0001\u0001\u0001www.IGSClan.com \u0001\u001b\u0001ÿ\u0001>>\u001bÿ\u0001\u0001 New-Skool-ONS \u001b\u0001ÿ\u0001<<","serverversion":"3369","timelimit":"15","translocator":"False","weaponstay":"True","{ik}eragon : by mrbee":"","{ik}eragon fire rate (moving)":"0.13","{ik}eragon fire rate (still)":"0.13","{ik}sig66 lr : by mrbee":"","{ik}sig66 lr fire rate (moving)":"0.12","{ik}sig66 lr fire rate (still)":"0.12"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ut3/1_response.txt b/gameq/tests/Protocols/Providers/Ut3/1_response.txt deleted file mode 100644 index abf933a1f9b78987691710c9cf2fb35d3bd43b08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410 zcmbVM&2HN;4CZ$1X%CQt9>57C+wo5U0o#&w%OPpeCcP9zp~Qk?)RsL`QHwC?rfyPbXictjWC2)V-`V5h@`+WS)~t zk!dv82r?$KeYO*6N#@HoxhiV|AuhlTt6coTNMKNiryjVFVuhkiB$Sm@)}E;pL#np& z`J+O3(WWjE9(mMRHN{1<&9mLCR7&nlRw~Vz>ufh#>MJ9R=IgqV&UT^aGQoa~OghVO zvlUk5@0iQ^rqWEwYn%iNb1!1lS!QY_O>gpp(9xb7hB2p(W>y58IXbjjXKRhjZT(&= zeT=9W4ZYB3kvrw{<#;BFDy_>#C3?K^#%I~nAR^$K^>>_MvRTiiF#AH7-QKC(Ao9Iw zNImWjfARwY@BRFh?c=T+9^_GYwM&&r}&EEeR!CtGQRJ36bSJUhQ0 zB*%QTDsARVA`FjokpS`o-r@%^7Y_UY%MTdxqq7V*v;24$@BjU2F!*V3L?5v9fg}2W zhxCDtK0rZJa6vPx1$c9GXtl_S*b2$bJ-vLM$Hz=!Thx&ye%WL*n#E%eVu{>FC@^scNWdN2&f!+U^w99UqaC=l3{*lVZ} fFpH`zLDh|73*hAW`2>z$*FPWIRD;fLcdNl)9v_mv diff --git a/gameq/tests/Protocols/Providers/Ut3/1_result.json b/gameq/tests/Protocols/Providers/Ut3/1_result.json deleted file mode 100644 index 183d1ea..0000000 --- a/gameq/tests/Protocols/Providers/Ut3/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"216.52.148.178:7777":{"AverageSkillRating":"1000.000000","EngineVersion":"3810","MinNetVersion":"3467","NumPublicConnections":"12","OwningPlayerId":"830","bIsDedicated":"True","bUsesStats":"True","bot_skill":"2","custom_mutators":["][ No Tags Mutator ][","UTCompIII v4 beta2","FreeFOV"],"force_respawn":"0","frag_limit":"50","gamemode":"0","gametype":"UTGame.UTDeathmatch","gq_address":"216.52.148.178","gq_joinlink":"","gq_name":"Unreal Tournament 3","gq_online":true,"gq_port_client":7777,"gq_port_query":6500,"gq_protocol":"gamespy3","gq_transport":"udp","gq_type":"ut3","hostname":".::.Beer Drinkers and Hell Raisers.::. - Chicago DM","hostport":"7777","mapname":"DM-Campgrounds-U3-Fix","maxplayers":"12","numbots":"2","numplayers":"1","open":"openplaying","p1073741829":"\u001cNoTagsMutator\u001cUTMutator_utcomp3v4b2\u001cUTMutator_FreeFOV\u001c","p268435706":"6","p268435968":"0","p268435969":"0","password":"0","players":[{"player":"Sierra Vasquez","score":"0","ping":"96","deaths":"1","pid":"289"}],"pure_server":"1","servername":"","stock_mutators":"0","time_limit":"17","vs_bots":"0"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ventrilo/1_response.txt b/gameq/tests/Protocols/Providers/Ventrilo/1_response.txt deleted file mode 100644 index 85f6a8e63246014c3948a949e4f9b5f475811d65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4687 zcmZ|NWm^*rpfF(RmQuQ;k&+Mu9t%OFL0S-Sbcuk(7{aL0lTN8olY!Le8s&hIqejD! z8X{d%=kk5Op7Rgx54XQ3l?~6v;K?^~9=HpC)I;hGZy~+`y6OKOZ%z_L`5AIPG+WvG zMV7+xw_DREwizR`)5Vfj;u9N9IrWV9S6>&~e2+S*bn}@_ae=S#Upqj6A3$`XtA|Y% zw#>tSSWdl|WB08`koQ_{;0d|Znu@$hS&G?IUx{-sN0>LJUbWa`5Zop`3=CQJF>meE zTP23cEvF33-T!%-p9AsjO0f3jS{zjgi9F*Wp8{_ez+}n6I=nc;GOqw0RB1IWchY#E z`3ug|pr-BBRizAX_9rSEvU~9fvwt@ycur0=g91Z^=I&Wp5n&RWk&388o2oKEJvubs z{&J%u3nX>u*#Q&B52&ptEF2K`HBz4V7wS5GWq5Tgv}5Om-XZM^cuM`!ZuM&AZy4a9 zyCOOc&*3gkWo;S#^5N_0RP7C$5Xj{156-o#&qMOi+%FO>oLWwS`clc&xuhI^t=V6<7+pb9D@QwOZ0<6pn%yP#*l5fsLUU+bS~=gZ-<0Xu2#+A&tbsVotSEY z>C6c4@l$emZ=#8h{3-9t`U)NAB7R*f_BNrR6?yT>o3>U~KaKi8B&gE&B8JnR%cK1>?231G>z_MYsfLr(=V}ZT zb%L!QG&A|^BDQFRcE1VIK!}Ol;kNA&r#YNo6xL3^Dz{#Yd%{O2LL$3FrK1K}ClHCs zc$wkkpZQ~PkBSvWYgCThiio_+U*{bfRnt>@qA89BV%tC6QUv9V_aFYguAKyTS{&ru zKo=5UC`^}T>y%+9z=|F^53Cn6p%Q@vi0e#$yQ)5(G*p0oN9Ipol&yqS1#gF*r0<9(Zky`l z94hb;nvNZZ$(<9rq6#phAyqH^DM(^|`?Wn}E>xD+oO)u{VKYlUEPvQ@|yc76c# zPNlw5juB~npelWKFN=@meUdg>^)QPS?LstVbsak~rRCQNd+kzkPT^n5FjJl+)7wIai~nnu}r!Ix0=yL)bZJ*)q9m!%YB(XrLz zmIV>|fyb^eCy`cF^HyOwJ63ibRhR3dxuFupHpOh|B|4;`f>M1Q(ra~)LF+-)WPWjz zV?OckfG6<}%2kl{TJkZSaZ=g?00;JAM`)m*ep4Iw&h=Mj>_;n5VPh}%%5%B>gf*HS zvEYNEy`sd)PA9O}+BW|i>`;otl)SWEdH5dHYXg1t%Ez=784Eo{Oae~IPr;K-8CUAR z1WHVox8>~H!li=aZ_ClR7?SA>-@bP5CGlqybtPpUh@=pQ0U#9rN(QYnu3^E9n{S^k zq~%P%6gzd~uP^Dj?U>`sm~eNvJDMp%D2POWrPOe)=~k)g}6r zfWEJe;SVYrjzpVdjdqi1x86nAjU7r!iLxiquLXG^vMeu7wMZxvC6+qP18FsP;)DgA z5uC*Fy?AW`FMp99bx-N;QKg`$AfhNC=jGRrj|5<*-enA@$$Xh(_pupyvB@@l)#m5a zy%HPIpQnXJatunvI^Uo0(_|i*94y6W7k) zS`D5=D`Dt!squI&QurFHW5ZVo;`~`s$H8KG>arz@_;Z9tk7f4u)4C7)t7Tj44l4A#8COvvQH#xuAz3>ncA_RfKX*7zJrS6c; z9b2J36^s}XMZUi?;YpzM8#TCDkHT!}HiK!8!{^S;^P)L^26b=iG`o^5g=2=DrX$5j z^9f`+vuPriX)_eIe{!WsvggF1C)JM{P1_bU5f&n+8F(gteELJOvhqKcJ-|E5k#kqB zozV;gS3LE9O+G|Rk-aCzoxt@A*fM+Id?xo&$sViMcqHFp%NZ|lI{Fn3*o~7+c0Hc= zue

ixN1iSf0`E12W8q4^X_H^yS@w{-Ad&^&njc8#plS@MS>dZqNq)N|HVg+vWpcXapN!uBwvp0X7<2_-rax>at5y#@cn@v-}`r9dc7u% zD3LEbK6(mi8I!;Oc461b>Zv%)&Ch4rD1R?QJrJ7^Mu&QX%;WJb7GceVYGBEhDwjSN z5W{!sUyL|Y1>kbI_DbH`4C-eQkTedK>GyL`~R5Ew0q078vG|LI7khRnXe`2f0pOG}d(uw);Fn2Y| z?j1{#YQ-D~UGXnX%7hAs_S=JO?ECk`RU2rj8k1%1`EufUkhEH)nA2h2vXZ>7_P4+G zc^R7+&g=VY-*28N&w;xXTQd6a209ke)r)OzZXl0C`7ry#`*4Q<&(2;Xu!metgK<(8 zx#QR_p&=g*eY3^exR96$yDPS)qbs@Ib5WtRsyaUStYG=sL-;@>olM_H#D6J7rQ4-< zqBW+ShoLuna$0FuHWw4kwz((!Q=0EkN$7|8GWTx6(5Y|H196El<&?Jr@=_`ub)OJBbd-`ygg zq2bih7{$od5rX+{eA}blqVdK2y4+x3pijnd~`D zx}@Y*eryqJanb5)L`%9_WgBWB$|QKI{Xd|!;t`u+nUInKlI*ndofkPx^72CTP{_Uu zyC6x$P^u2se(&w$_7(ve1T%_6;>)-f&9X=gs5{y=xI3glpy7Zrb-e5Z#;1ur{_UUE zU(Cxw+C@ct15;L?&zpl0!M`5I>dI2|%%5acw%C4;RA_~bIAXz5@18h+z!!Y1tuY9* zWbhd2`(?GBja!)n*ESZI8a;brxFP+vj1?K}XX4fXSbwX6rrUj~@xW1FP~d3Aap>~M z8BQAN;J`81T>PIqZ7)+C5$g*<%|dC(ihz50MIS@42vL-zSXGgI%$OoUMGRumZuaVT z!`R9I)d^(8y)ECkt0jRL11h;$^cm-5n*YP+`uAk+{ZndSA63YG^xDyAa(%+ahVHx>=eE4N9N_w2p zJ|EZ~er;=(>kH}t{h0|UHC`|(?@dnBkW@wtiPRTbzRA@n*-T2sRwPcP^@@nx% z*;cx3SeXrCEJwA3%cGyk70=<&Dtw&K89$;EZV5Ri>TQ2)qNh<^K1~=#B4_v>Rm$P*i(dZD;(UFkHmc7GgVLWznJysWHuV)VQnfM5t=Vz8#LAEZ?X&v$04hsK3Y}#`=#w9o2}b06@a@4eAQjX&QkZ z74K^&YNvLZGJaK0nJQ)C4|u=K^pH=%f-s?;Hh8qKVdv$?M{3f6_O_}C-jpWqT-7nJ zUVg8HP5_N&Tbu#2OE-tsHU=$=2yUT&2Oi-VW11FEP9a<*+P4XMLUnA6$R3|1XJgN| z06pNLxBQK@B;&oY)N&jL-?#mQi_+T9&*0j3-vbu5>}HZT)4uib@|;u&@E@BjRo#@M z~+0K7LA;#J$+H`adr$)sCtlXA;z z29Tp-;xVwosPOfzoA6KZ^ANrtvS*#+=aw=PkB^1jHCy5Ph5~)MF%vJK=yY&gsAjzp z#y|}KP}nxa83aB^jQo(P8ueJZz$w%9b2%+rI9bcx;BcuM#&pe?$EQW{)N zk)oH%dS~#NQy)eDq~=9)v!Cs;H)GURqv77ibmecDk*RZ&e=aB4QZ2H%&`YfvlQw?b z(k~JH>rbLZGKD^&7K!9LaOZ5 z%#E>=_WBeWn*D5CwSHx|*Y)p!2HyhWf%rKZA-|H%`=}&t+pn0%o%;*S2-tF$B3qOO z^vkFBqI=5ZR}vi{VawbJ^p@#K^E=u@lin6LS7a&SQolUetur6}xDiFPi2k@xZSiDN zo&7J(K8iHD2f}fh@;cun@cWtov^b$XIAD^$IY3f8W{x`U7p}x*XG{_+vWI}bnPlOV zjA^(VVaR%)PG9IYB}YEEQaFr&VV~aLa&0(r{E7#+ri7(7(1Ao+6|?!A30l^s z`HWuL)DpKxn(ruw59FfztY1pzzP%A=|yjxQRan(Bu0{zMIql!+IJ&HbCS< z9+V;`)&%Fn=K>3Z*}wb!2I(-~tfwqd^E?JMs}P($qjykZ@C}umy(G)rVJcTd13h}M zb(}7SRE+q}8WxjZChh=~-^Lkg)CZ9H#)eIGVzb@=m&4au?v-c%V>WIUC=^ke9X zr3;qJ7_4s8RR4DXg;AqAZLcu7!M7~umO*1#TSM)c>AvK2rS7L=stZuf(Bm|sYRU|m Hs_Xv&VDg$2 diff --git a/gameq/tests/Protocols/Providers/Ventrilo/1_result.json b/gameq/tests/Protocols/Providers/Ventrilo/1_result.json deleted file mode 100644 index 6384211..0000000 --- a/gameq/tests/Protocols/Providers/Ventrilo/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"78.129.193.68:3808":{"auth":"0","channelcount":"54","clientcount":"14","comment":"","dedicated":1,"gq_address":"78.129.193.68","gq_joinlink":"ventrilo:\/\/78.129.193.68:3808\/","gq_name":"Ventrilo","gq_online":true,"gq_port_client":3808,"gq_port_query":3808,"gq_protocol":"ventrilo","gq_transport":"udp","gq_type":"ventrilo","maxclients":"40","name":"tan.cleanvoice.ru","phonetic":"Clean Voice","platform":"Linux-i386","players":[{"admin":"0","cid":"305","phan":"0","ping":"63","sec":"2181","name":"Tuzik","comm":""},{"admin":"0","cid":"311","phan":"0","ping":"57","sec":"2180","name":"Ecelerok","comm":""},{"admin":"0","cid":"304","phan":"0","ping":"61","sec":"2180","name":"XXXXXXXX","comm":""},{"admin":"0","cid":"295","phan":"0","ping":"111","sec":"2180","name":"NyK FuRy","comm":""},{"admin":"0","cid":"0","phan":"0","ping":"149","sec":"2180","name":"Wrath","comm":""},{"admin":"0","cid":"0","phan":"0","ping":"139","sec":"2180","name":"Facerolladin","comm":""},{"admin":"0","cid":"296","phan":"0","ping":"257","sec":"2180","name":"jdisco","comm":""},{"admin":"0","cid":"295","phan":"0","ping":"107","sec":"2180","name":"kman","comm":""},{"admin":"0","cid":"294","phan":"0","ping":"129","sec":"2180","name":"Elekor","comm":""},{"admin":"0","cid":"327","phan":"0","ping":"71","sec":"2180","name":"Punk","comm":""},{"admin":"0","cid":"296","phan":"0","ping":"1932","sec":"2178","name":"ATC","comm":""},{"admin":"0","cid":"294","phan":"0","ping":"143","sec":"2176","name":"SPRTN II 117","comm":""},{"admin":"0","cid":"305","phan":"0","ping":"108","sec":"2174","name":"bead","comm":""},{"admin":"0","cid":"295","phan":"0","ping":"91","sec":"2127","name":"Austism"}],"teams":[{"cid":"294","pid":"0","prot":"0","name":"!Public #1","comm":""},{"cid":"295","pid":"0","prot":"0","name":"!Public #2","comm":""},{"cid":"296","pid":"0","prot":"0","name":"!Public #3","comm":""},{"cid":"297","pid":"0","prot":"1","name":"#EnclaveTeam#","comm":"ACTIVATED TO 13.03.2015"},{"cid":"298","pid":"0","prot":"1","name":"AAge","comm":"ACTIVATED TO 14.03.2015"},{"cid":"299","pid":"0","prot":"1","name":"AionStorm","comm":"TO BE DELETE 07.03.2015"},{"cid":"300","pid":"0","prot":"1","name":"anaprilin","comm":"ACTIVATED TO 24.03.2015"},{"cid":"301","pid":"0","prot":"1","name":"AOH","comm":"ACTIVATED TO 31.03.2015"},{"cid":"302","pid":"0","prot":"1","name":"Belki_na_tarelke","comm":"TO BE DELETE 03.03.2015"},{"cid":"303","pid":"0","prot":"1","name":"GoldenTime","comm":"ACTIVATED TO 26.03.2015"},{"cid":"304","pid":"0","prot":"1","name":"LeagueOfLegendsRoom","comm":"ACTIVATED TO 25.03.2015"},{"cid":"305","pid":"0","prot":"1","name":"NA","comm":"ACTIVATED TO 01.04.2015"},{"cid":"306","pid":"0","prot":"1","name":"Nagibkainaka","comm":"ACTIVATED TO 27.03.2015"},{"cid":"307","pid":"0","prot":"1","name":"oO1ne","comm":"ACTIVATED TO 21.03.2015"},{"cid":"308","pid":"0","prot":"1","name":"Panika","comm":"ACTIVATED TO 21.03.2015"},{"cid":"309","pid":"0","prot":"1","name":"Playforfun","comm":"ACTIVATED TO 26.03.2015"},{"cid":"310","pid":"0","prot":"0","name":"Prime_Guild","comm":"ACTIVATED TO 12.03.2015"},{"cid":"311","pid":"0","prot":"1","name":"RaidGlobalwarL2","comm":"ACTIVATED TO 11.03.2015"},{"cid":"312","pid":"0","prot":"1","name":"Survarium","comm":"ACTIVATED TO 17.03.2015"},{"cid":"313","pid":"0","prot":"1","name":"tera","comm":"ACTIVATED TO 24.03.2015"},{"cid":"314","pid":"0","prot":"1","name":"thelostroom","comm":"ACTIVATED TO 27.03.2015"},{"cid":"315","pid":"0","prot":"1","name":"Volchara","comm":"ACTIVATED TO 11.03.2015"},{"cid":"316","pid":"0","prot":"1","name":"x3clan","comm":"ACTIVATED TO 20.03.2015"},{"cid":"317","pid":"304","prot":"0","name":"party1","comm":""},{"cid":"318","pid":"304","prot":"0","name":"party2","comm":""},{"cid":"319","pid":"316","prot":"0","name":"afk","comm":""},{"cid":"320","pid":"316","prot":"0","name":"Dota 2","comm":""},{"cid":"321","pid":"316","prot":"0","name":"KypuJIka","comm":""},{"cid":"322","pid":"316","prot":"0","name":"Party 1","comm":""},{"cid":"323","pid":"316","prot":"0","name":"Party 2","comm":""},{"cid":"324","pid":"316","prot":"0","name":"Party 3","comm":""},{"cid":"325","pid":"297","prot":"0","name":"AFK","comm":""},{"cid":"326","pid":"297","prot":"0","name":"DOTA","comm":""},{"cid":"327","pid":"297","prot":"0","name":"DOTA2","comm":""},{"cid":"328","pid":"297","prot":"0","name":"LineAge2","comm":""},{"cid":"329","pid":"297","prot":"0","name":"PartyDimona","comm":""},{"cid":"330","pid":"301","prot":"0","name":"AFK","comm":""},{"cid":"331","pid":"301","prot":"0","name":"lineage2","comm":""},{"cid":"332","pid":"301","prot":"0","name":"WOT","comm":""},{"cid":"333","pid":"315","prot":"0","name":"admin","comm":""},{"cid":"334","pid":"312","prot":"0","name":"Cheesy house","comm":""},{"cid":"335","pid":"312","prot":"0","name":"room-1","comm":""},{"cid":"336","pid":"303","prot":"0","name":"GT","comm":""},{"cid":"337","pid":"303","prot":"0","name":"Mox","comm":""},{"cid":"338","pid":"303","prot":"0","name":"private","comm":""},{"cid":"339","pid":"306","prot":"0","name":"logovoartejki","comm":""},{"cid":"340","pid":"302","prot":"0","name":"Belki_na_farme","comm":""},{"cid":"341","pid":"302","prot":"0","name":"Belki_spyat","comm":""},{"cid":"342","pid":"302","prot":"0","name":"Belki_v_dotke","comm":""},{"cid":"343","pid":"302","prot":"0","name":"Dyplo","comm":""},{"cid":"344","pid":"302","prot":"0","name":"Zaiki_na_lyzhaike","comm":""},{"cid":"345","pid":"299","prot":"0","name":"1","comm":""},{"cid":"346","pid":"299","prot":"0","name":"2","comm":""},{"cid":"347","pid":"299","prot":"0","name":"3","comm":""}],"uptime":"2186","version":"3.0.6","voicecodec":"3,Speex","voiceformat":"31,32 KHz, 16 bit, 9 Qlty"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Ventrilo/2_response.txt b/gameq/tests/Protocols/Providers/Ventrilo/2_response.txt deleted file mode 100644 index 5e399474b52801a31db221f9a05ae8125d8a08b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3906 zcmV-I554eo@)FEnt8Dxxc)lxiUwq5B7*%1rKn)s)0%IN3^ph*zvWZdD6iSopv~|;t zVB0RFn0xUk^qY!LAN=pa3XG&xWkO81Ik@DO--z^_T3E5pZKG_eDf8JcL8vy$ zX*(^wI+juxLU5Q9*_dFY%ur{{h)A$oIFdBLb5Onn(YRqQLO|5|4Noak*D6f6s=V)4 zA_5BKJdQ$~8yAPQ`sc9h&-R;a2(d|gcs{PA;soiRpPOheDj>6}k$6-Ie`?TX&t;2s%?us;iYAEEI z&hWc!nvr30T0GO;Bl%L%E6n$wwvd);Dzo{+xO?}ORaJ}BN5hO~N*1GDHjTpffJ<1D z1ZWP$_mpVwpHDW>{*{pJvupO7bL~9Hs&?-&$rN ze0&PNxX8-4WV$<&zEGsuw<| z0CtaRZ9`qP$&WFR=9Zkl2j?R1vW^1;_;7`*_J}f&Yf=Q<*C{i#3+7!=h9Ir>2*DX>vQG4!vH{9cO700_&Mc~RtoU-P!gHA|3Kwwe8Kc3P zv3XU_>!(?}6{D}}GZr}Epq(1dx@|~OzcuzpA!g}qjs;V`yvtu=f)ML;-8p^0oo2h@ zv!g|OZ=M|9qr9i9^rbWVYwV~L+%i^~snJ#FeZ>l>P7&d6YVOrHnTW!Av5FHjXAG95 z6H1itKHm)Xivv7e2d5tX<3ela8)dbWqCTe71;+J>z9mVz9Y;Y;?^7=<*NgE@nd6H484_H{q8u49n-o8-h!vMLXD1_|ebc z=9YC}ju?aQ?N4K>TcYOVi5KRTm#)+Rx=ENI8N&E=5~i%fYQ5ni^1o{i(T1Vzlq1vjoTQI7!=6L@iy2mBbZ z+fk!B(LsVD!qxLKw-dVr0h+nbhmPgXlgXgwrl-`#AP1=OddKIRC;4H0Yt&YTrR6Vda|y(KN+|65RA}qvv|<35%!Tm3gh<{o*u}` zPkMJ{6T2=fT6v&pUURqH$k6A~7EUtfOA0UGHl&$V4cDgaRk2Q?5;)|P`zQJA-*R+f zg$cm<-863Rgt+$ctR(4TpqL+M46moyE_;Tmfbe3MBspC+g`YacTFPXZ!z^gR(UDwh4QF8V9D1;9E=N?yu^!OTvz9(iV z$Srf{grBP=unUUV#%_qON=v18K459ww&?cda8R>2<05MECp4qHZUeare0&P{j~gIQ z*UyK{G`;;`8?W{W27emCHfD9iG2oVQKF8WiZr183^hJci1cgtGc{xr#Ihy z+l*5|GsM2mZ^e0qX`XSfE2}15Lr&7C?4D*)Yoe?JbYR5- zH-nt)b&;ZTma>zRib--I)G%S zE1TzBBQC_CXFV~>f!DE_u_F9fUhcFQwS zzPG19-d*&K`6yMzRYQGXNsgJc`*Gb)b*^{woQt!pcZr_;7gQ}PFb@qV@e0&NVx$E3w;?=cJ z_rvk@hh1x#nz+as@ouz$PZpb$Af_81-W-LoZHB;BI_hVW9UX+y`0%>(uE(N)Klets z`rhPWc5&&IeD99<ywUN>*k*f zb$C^q+X0P~n_`UCq)9Sx65^8#AN>~an>vaOS)HXm0e0&Pi)5g1=<3F@Q8zfGO z$PoX08biWMn$^^DnsvJRmx9=q-fjbhc9U@wB&-qbR?06Jfz^i6pv@c26ImYR_5=Cg zbBSAe8Hz_lc9fHdaolLRS)}DLjv2bXGX9X+m+$g07e&#Bld~U)*XrBir{U?oPOpl| ze=2pqtj)fvX6vLL-&a>1t)Hr>h^yypfd@*e+z=%7uiGxI@$MmCwnuYwc z?m^}vVGv5T^p$A)=Xr>!!$;A!-TkXSG%5toR%kBMtgKJ?k<8FG!`3aHZ9_8w{tHqY zW5J0`)9Trvx}y~ltdZ}h-l|NwpR2i1bP9Gvnk9*M-Sow=g}Lf_23hyP*6`M;Ux77V z1ZpK1V1#~oIIS{(Oofm7J;hgo@3Tn~vHkg8N2c?Ysm(5r@jwF;$Ndl(xElV{YNXd{B;X5eLhlZw^ew?H;Ve>nXxL%VZvlHWCXvkKJMZjnWU^P?v&A+$^-Vw{& zSC;UYP%sC6LgiSv@ocx#+Oywon*i|fn2k<-mHy%*q<1i|WLpt+xa5~@cx}Xf(Im>} z8@up*t6mtXlqG24;brO4GZwg4LsA(Eql|eV@b6{{e0&N#VHX0^S(*O(Opw7$vt1qj zvFMMhY$17r_M#x}Wx=scNY-a+o=3}_so@-*H7dd}ZBLfq+nT>3srRScF(>M@&n775 zwg@eirAG(aRh+d?|MiG`oAEr8FWDDwtCy-J`%`pA8w1`Bye`9Tedp#&`7pnp*q&pW zYubObs1vJujT;zK2UgC1PfxL# z$Hn1ZR!yv2V$^NV$wxkNcuAZq{L2c&++oB6o7 zmcxTla|aSX<2IgSFfWyX5sfxwL?<`4T0l zm1O6qlmL#z|A+$5&il3U$gcsCcgE4N)Gu)AyXC8D?`w9TZ&vGwIAeD^zhgWJs-tqZ zhQ64=FU}~)9C{fIkKKfs5{~>6wI#D5w5gv8e0&NOH>%!~P3mG|h;7jDNn^m@?v*E% zCkj|UyTn;ZPIjT`%_K74j#<1eq-ACP!nZ!wsHbfs{u4GwqcZ;$ksF&i2NvLz4TX^|y~ zblBO@5)bL1A&Tz9qM;W7Du&8aO30D{Ju#)E|MgCLgu3oS7EMOejbp$-fjvOuzPmrG zy_B6Ioz$U0lfNKV#;CC>RskkMjuIWt%2eOV!oY5C+uZf%|g={r~^~ diff --git a/gameq/tests/Protocols/Providers/Ventrilo/2_result.json b/gameq/tests/Protocols/Providers/Ventrilo/2_result.json deleted file mode 100644 index 81decfd..0000000 --- a/gameq/tests/Protocols/Providers/Ventrilo/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"63.209.37.15:4517":{"auth":"1","channelcount":"32","clientcount":"22","comment":"","dedicated":1,"gq_address":"63.209.37.15","gq_joinlink":"ventrilo:\/\/63.209.37.15:4517\/","gq_name":"Ventrilo","gq_online":true,"gq_port_client":4517,"gq_port_query":4517,"gq_protocol":"ventrilo","gq_transport":"udp","gq_type":"ventrilo","maxclients":"150","name":"Voice Server","phonetic":"Voice Server","platform":"Linux-i386","players":[{"admin":"1","cid":"525","phan":"0","ping":"149","sec":"52152","name":"DeathProof","comm":""},{"admin":"0","cid":"552","phan":"1","ping":"0","sec":"52151","name":"DeathProof","comm":""},{"admin":"1","cid":"525","phan":"0","ping":"46","sec":"50184","name":"The__Sun","comm":""},{"admin":"0","cid":"552","phan":"1","ping":"0","sec":"50184","name":"The__Sun","comm":""},{"admin":"0","cid":"525","phan":"0","ping":"75","sec":"38999","name":"Gwendollyn","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"188","sec":"37913","name":"MrJohnDoe","comm":""},{"admin":"1","cid":"525","phan":"0","ping":"58","sec":"29047","name":"icefirewolf","comm":""},{"admin":"0","cid":"552","phan":"1","ping":"0","sec":"29047","name":"icefirewolf","comm":""},{"admin":"1","cid":"527","phan":"0","ping":"55","sec":"27753","name":"Morrier","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"44","sec":"23032","name":"WolvenMacry","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"92","sec":"18419","name":"grei","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"188","sec":"18379","name":"Ignacia","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"414","sec":"16345","name":"Robinson","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"172","sec":"11938","name":"Maradise","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"85","sec":"11612","name":"Tianalie","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"68","sec":"11242","name":"Vortex_Dan","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"43","sec":"10480","name":"Kiike","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"143","sec":"10063","name":"skater","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"47","sec":"10007","name":"pokkits","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"54","sec":"9966","name":"ZippysMommy","comm":""},{"admin":"0","cid":"535","phan":"0","ping":"90","sec":"1296","name":"Ameyuri","comm":""},{"admin":"0","cid":"546","phan":"0","ping":"70","sec":"18","name":"BloodSaphire","comm":""}],"teams":[{"cid":"523","pid":"0","prot":"0","name":"Instance Rooms","comm":"Friend Safe Zone"},{"cid":"525","pid":"0","prot":"0","name":"Hangout Room","comm":"Enter at own risk."},{"cid":"526","pid":"0","prot":"0","name":"Public-Private Room 1","comm":""},{"cid":"527","pid":"0","prot":"0","name":"AFK","comm":""},{"cid":"528","pid":"0","prot":"0","name":"Foreign Language","comm":""},{"cid":"529","pid":"0","prot":"2","name":"Officer Meeting Room","comm":"Sunday 3pm server time"},{"cid":"531","pid":"0","prot":"2","name":"DP's Basement","comm":""},{"cid":"530","pid":"0","prot":"2","name":"Interrogation Room","comm":"RECRUITING ROOM"},{"cid":"532","pid":"0","prot":"0","name":"TW Talks","comm":"TW team"},{"cid":"533","pid":"0","prot":"0","name":"TW Fill Room","comm":"Pls post comment of class & weapon"},{"cid":"534","pid":"523","prot":"0","name":"EVENTS ROOM","comm":""},{"cid":"535","pid":"523","prot":"0","name":"Hot Tub","comm":""},{"cid":"537","pid":"523","prot":"0","name":"Friend's Chillout Room","comm":"Guests Allowed"},{"cid":"541","pid":"526","prot":"0","name":"Music Room","comm":""},{"cid":"742","pid":"528","prot":"0","name":"Portuguese","comm":"7-1"},{"cid":"545","pid":"528","prot":"0","name":"German","comm":""},{"cid":"546","pid":"528","prot":"0","name":"Babosos Room","comm":""},{"cid":"547","pid":"528","prot":"0","name":"Russian","comm":""},{"cid":"548","pid":"529","prot":"2","name":"Event Team","comm":""},{"cid":"549","pid":"529","prot":"2","name":"Fun Under The Sun","comm":"Get your dosage of vitamin D"},{"cid":"550","pid":"530","prot":"0","name":"Waiting Room","comm":""},{"cid":"551","pid":"533","prot":"0","name":"Scout Room","comm":""},{"cid":"552","pid":"533","prot":"0","name":"Leaders Room 1","comm":""},{"cid":"553","pid":"533","prot":"0","name":"CAT2","comm":""},{"cid":"554","pid":"533","prot":"0","name":"CAT1","comm":""},{"cid":"555","pid":"533","prot":"0","name":"ATK1","comm":""},{"cid":"556","pid":"533","prot":"0","name":"ATK2","comm":""},{"cid":"557","pid":"533","prot":"0","name":"Left Flank","comm":""},{"cid":"558","pid":"533","prot":"0","name":"Right Flank","comm":""},{"cid":"559","pid":"533","prot":"0","name":"DEF1","comm":""},{"cid":"560","pid":"533","prot":"0","name":"DEF2","comm":""},{"cid":"561","pid":"533","prot":"0","name":"Nuke","comm":""}],"uptime":"4931211","version":"3.0.6","voicecodec":"3,Speex","voiceformat":"30,32 KHz, 16 bit, 8 Qlty"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Warsow/1_response.txt b/gameq/tests/Protocols/Providers/Warsow/1_response.txt deleted file mode 100644 index e7e2254..0000000 --- a/gameq/tests/Protocols/Providers/Warsow/1_response.txt +++ /dev/null @@ -1,19 +0,0 @@ -ÿÿÿÿstatusResponse -\challenge\\version\2.01 x86_64 Dec 19 2015 Linux\fs_game\basewsw\g_antilag\1\g_gametypes_available\\g_instagib\1\g_match_score\ ALPHA: 3 BETA: 14\g_match_time\17:13\g_needpass\0\g_race_gametype\0\gamedate\Dec 19 2015\gamename\Warsow\mapname\bipbeta2\protocol\21\sv_cheats\0\sv_hostname\^0_^9_^7_ ^3gibcity^2-|-^3insta ^7_^9_^0_ ^3#1 ^2/// ^9bb2\sv_http\0\sv_maxclients\17\sv_maxmvclients\4\sv_mm_enable\0\sv_mm_loginonly\0\sv_pps\20\sv_pure\1\sv_skilllevel\1\sv_skillRating\0\gametype\ca\clients\17 -1 34 "^7Stylo^1." 2 -14 88 "PunkiZi" 3 -5 72 "MegaZerg" 2 -1 43 "^2Ki^3Wi" 3 -0 11 "^5Crystal^7Clear" 2 -1 59 "^0pelo^1killer" 3 --9999 0 "H I P P" 0 -11 56 "^0Sch^5w^0amm" 3 --9999 26 "wcDUCK" 3 -14 41 "^0Ai^9o" 3 -22 20 "^7o_O^1//^7HERO" 3 -3 48 "m0e" 2 -17 53 "Monia" 2 -10 50 "^8LUCK^7SKILL" 3 -4 6 "Muthafunkbli" 2 -3 186 "o_O^1//^7LEGACY" 2 -0 95 "^4A^0l^4e^0s^4s^0i^4o" 2 diff --git a/gameq/tests/Protocols/Providers/Warsow/1_result.json b/gameq/tests/Protocols/Providers/Warsow/1_result.json deleted file mode 100644 index aba211e..0000000 --- a/gameq/tests/Protocols/Providers/Warsow/1_result.json +++ /dev/null @@ -1 +0,0 @@ -{"81.4.126.182:44400":{"challenge":"","clients":"17","fs_game":"basewsw","g_antilag":"1","g_gametypes_available":"","g_instagib":"1","g_match_score":"ALPHA: 3 BETA: 14","g_match_time":"17:13","g_needpass":"0","g_race_gametype":"0","gamedate":"Dec 19 2015","gamename":"Warsow","gametype":"ca","gq_address":"81.4.126.182","gq_joinlink":"warsow:\/\/81.4.126.182:44400\/","gq_name":"Warsow","gq_online":true,"gq_port_client":44400,"gq_port_query":44400,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"warsow","mapname":"bipbeta2","players":[{"frags":"1","ping":"34","name":"^7Stylo^1.","team":"2"},{"frags":"14","ping":"88","name":"PunkiZi","team":"3"},{"frags":"5","ping":"72","name":"MegaZerg","team":"2"},{"frags":"1","ping":"43","name":"^2Ki^3Wi","team":"3"},{"frags":"0","ping":"11","name":"^5Crystal^7Clear","team":"2"},{"frags":"1","ping":"59","name":"^0pelo^1killer","team":"3"},{"frags":"-9999","ping":"0","name":"H I P P","team":"0"},{"frags":"11","ping":"56","name":"^0Sch^5w^0amm","team":"3"},{"frags":"-9999","ping":"26","name":"wcDUCK","team":"3"},{"frags":"14","ping":"41","name":"^0Ai^9o","team":"3"},{"frags":"22","ping":"20","name":"^7o_O^1\/\/^7HERO","team":"3"},{"frags":"3","ping":"48","name":"m0e","team":"2"},{"frags":"17","ping":"53","name":"Monia","team":"2"},{"frags":"10","ping":"50","name":"^8LUCK^7SKILL","team":"3"},{"frags":"4","ping":"6","name":"Muthafunkbli","team":"2"},{"frags":"3","ping":"186","name":"o_O^1\/\/^7LEGACY","team":"2"},{"frags":"0","ping":"95","name":"^4A^0l^4e^0s^4s^0i^4o","team":"2"}],"protocol":"21","sv_cheats":"0","sv_hostname":"^0_^9_^7_ ^3gibcity^2-|-^3insta ^7_^9_^0_ ^3#1 ^2\/\/\/ ^9bb2","sv_http":"0","sv_maxclients":"17","sv_maxmvclients":"4","sv_mm_enable":"0","sv_mm_loginonly":"0","sv_pps":"20","sv_pure":"1","sv_skillRating":"0","sv_skilllevel":"1","version":"2.01 x86_64 Dec 19 2015 Linux"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Warsow/2_response.txt b/gameq/tests/Protocols/Providers/Warsow/2_response.txt deleted file mode 100644 index 20c1974..0000000 --- a/gameq/tests/Protocols/Providers/Warsow/2_response.txt +++ /dev/null @@ -1,14 +0,0 @@ -ÿÿÿÿstatusResponse -\challenge\\version\2.01 x86_64 Dec 19 2015 Linux\fs_game\basewsw\g_antilag\1\g_gametypes_available\\g_instagib\0\g_match_score\\g_match_time\Countdown\g_needpass\1\g_race_gametype\0\gamedate\Dec 19 2015\gamename\Warsow\mapname\wbomb1\protocol\21\sv_cheats\0\sv_hostname\null.one pickup #1\sv_http\1\sv_maxclients\32\sv_maxmvclients\4\sv_mm_enable\1\sv_mm_loginonly\0\sv_pps\20\sv_pure\1\sv_skilllevel\1\sv_skillRating\22\gametype\bomb\clients\12 --9999 8 "^1Crust^0Y" 0 -2 11 "^04Z^11^0E" 3 --9999 12 "^1C^2C^3C^4C^5C^6C^8C^9C^0C" 0 -6 14 "^00D^11^0N" 2 -73 41 "jAck" 3 -40 91 "^0FANG" 2 -10 47 "brianlag" 3 -24 20 "plX" 2 -4 39 "MadRat" 2 -10 12 "prim" 3 -18 48 "^9P^7uffdar" 2 -3 15 "timma^7(1)" 3 diff --git a/gameq/tests/Protocols/Providers/Warsow/2_result.json b/gameq/tests/Protocols/Providers/Warsow/2_result.json deleted file mode 100644 index 0b02681..0000000 --- a/gameq/tests/Protocols/Providers/Warsow/2_result.json +++ /dev/null @@ -1 +0,0 @@ -{"84.200.8.69:9500":{"challenge":"","clients":"12","fs_game":"basewsw","g_antilag":"1","g_gametypes_available":"","g_instagib":"0","g_match_score":"","g_match_time":"Countdown","g_needpass":"1","g_race_gametype":"0","gamedate":"Dec 19 2015","gamename":"Warsow","gametype":"bomb","gq_address":"84.200.8.69","gq_joinlink":"warsow:\/\/84.200.8.69:9500\/","gq_name":"Warsow","gq_online":true,"gq_port_client":9500,"gq_port_query":9500,"gq_protocol":"quake3","gq_transport":"udp","gq_type":"warsow","mapname":"wbomb1","players":[{"frags":"-9999","ping":"8","name":"^1Crust^0Y","team":"0"},{"frags":"2","ping":"11","name":"^04Z^11^0E","team":"3"},{"frags":"-9999","ping":"12","name":"^1C^2C^3C^4C^5C^6C^8C^9C^0C","team":"0"},{"frags":"6","ping":"14","name":"^00D^11^0N","team":"2"},{"frags":"73","ping":"41","name":"jAck","team":"3"},{"frags":"40","ping":"91","name":"^0FANG","team":"2"},{"frags":"10","ping":"47","name":"brianlag","team":"3"},{"frags":"24","ping":"20","name":"plX","team":"2"},{"frags":"4","ping":"39","name":"MadRat","team":"2"},{"frags":"10","ping":"12","name":"prim","team":"3"},{"frags":"18","ping":"48","name":"^9P^7uffdar","team":"2"},{"frags":"3","ping":"15","name":"timma^7(1)","team":"3"}],"protocol":"21","sv_cheats":"0","sv_hostname":"null.one pickup #1","sv_http":"1","sv_maxclients":"32","sv_maxmvclients":"4","sv_mm_enable":"1","sv_mm_loginonly":"0","sv_pps":"20","sv_pure":"1","sv_skillRating":"22","sv_skilllevel":"1","version":"2.01 x86_64 Dec 19 2015 Linux"}} \ No newline at end of file diff --git a/gameq/tests/Protocols/Providers/Wurm/1_response.txt b/gameq/tests/Protocols/Providers/Wurm/1_response.txt deleted file mode 100644 index b217e1992bdae2f4f2b3a9945c0c2c4ecf5c44f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmezW|NnnaL6^kzw9LG`^3tMQz2yAdnt(7@1;YphBNKgd1;@M;g@CXCI6pYGs4TUp z#xFlVNx`isGc_+IhrvI&C^eA*q`fpRCo?y*BsHZNtc)QXD5ek!6I6g`W?*38J;9Jt z&cJA>X8?i>6I+v*1tJbCk#Jz_nZ^o~XJFu}so?@T?!OB!n9K0JX|5ZD<$SUW%6h)B z3Ch}bLIKLUn0Ct*qK@*=fb^Suh*L&u5RJ$ z3?`GAE;6$QhTf@Sv}~=0XSAtwmNe5!H`cQpr`NE?R9bGOHMKlzGNw>R84G1;G8>wV z9BW|Lb~iHSX2wjFuQj@iM7qRRDa!VT(po4#nKXUdA3<$x zL2EDMRoVVeDP{Xeo=;2|(bi8_(B^eSl35p8dmNGV&JbF`B$4R!AX;Y*kwq9lb1pie zm>qr4g|J>IU(y3LFLy(u?;X&i86vGkK(l+!Kp#6#L0e8XLGkZ+vO3ZL8Ok_l$yEzY zF_n?WdLJ&WY5 z<0W)&WdRCIdI%-0+=n*T--Hr*4cF)P-LM+ zMQ1{PWf@TEYbiu2(jfL(BJ^di80vZw1I6Wqkak%F$zOd{`TnM38$Uxs>Zj0w+`Ew6 z&jl@v4?+pg_0ayvQYfk>4brwmK)h1~iO==q_-=df#s>X-VJ1oyvVE%>*S. - */ - -namespace GameQ\Tests\Protocols; - -class Quake2 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Quake2 - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\xFF\xFF\xFF\xFFstatus\x00", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Quake2') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a quake 2 source file - $source = file_get_contents(sprintf('%s/Providers/Quake2/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFprint", "\xFF\xFF\xFF\xFFprints", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:27910', 'quake2', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Quake2::processResponse response type - * 'ffffffff7072696e7473' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a quake 2 source file - $source = file_get_contents(sprintf('%s/Providers/Quake2/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFprint", "\xFF\xFF\xFF\xFFprints", $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:27910', 'quake2', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Quake3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'quake2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Quake3.php b/gameq/tests/Protocols/Quake3.php deleted file mode 100644 index 77f82f5..0000000 --- a/gameq/tests/Protocols/Quake3.php +++ /dev/null @@ -1,122 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Quake3 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Quake3 - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\xFF\xFF\xFF\xFF\x67\x65\x74\x73\x74\x61\x74\x75\x73\x0A", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Quake3') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a Quake 3 source file - $source = file_get_contents(sprintf('%s/Providers/Quake3/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFstatusResponse", "\xFF\xFF\xFF\xFFstatusResponses", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:27960', 'quake3', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Quake3::processResponse response type - * 'ffffffff737461747573526573706f6e736573' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a Quake 3 source file - $source = file_get_contents(sprintf('%s/Providers/Quake3/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFstatusResponse", "\xFF\xFF\xFF\xFFstatusResponses", $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:27960', 'quake3', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Quake3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'quake3', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Quakelive.php b/gameq/tests/Protocols/Quakelive.php deleted file mode 100644 index 4fa5ec6..0000000 --- a/gameq/tests/Protocols/Quakelive.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Quake Live - * - * @package GameQ\Tests\Protocols - */ -class Quakelive extends Base -{ - /** - * Test responses for Quakelive - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'quakelive', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.000000001); - } -} diff --git a/gameq/tests/Protocols/Redorchestra2.php b/gameq/tests/Protocols/Redorchestra2.php deleted file mode 100644 index 5189079..0000000 --- a/gameq/tests/Protocols/Redorchestra2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Redorchestra2 - * - * @package GameQ\Tests\Protocols - */ -class Redorchestra2 extends Base -{ - /** - * Test responses for Redorchestra2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'redorchestra2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Risingstorm2.php b/gameq/tests/Protocols/Risingstorm2.php deleted file mode 100644 index 6770fe0..0000000 --- a/gameq/tests/Protocols/Risingstorm2.php +++ /dev/null @@ -1,78 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Rising Storm 2 - * - * @package GameQ\Tests\Protocols - */ -class Risingstorm2 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Risingstorm2 - */ - protected $stub; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Risingstorm2') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test to make sure the query port has not changed. Appears to be fixed at 27015 but unsure. - */ - public function testQueryPort() - { - $this->assertEquals($this->stub->findQueryPort(7777), 27015); - } - - /** - * Test responses for Medal of honor: Allied Assault - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'risingstorm2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Rust.php b/gameq/tests/Protocols/Rust.php deleted file mode 100644 index f557364..0000000 --- a/gameq/tests/Protocols/Rust.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Rust - * - * @package GameQ\Tests\Protocols - */ -class Rust extends Base -{ - /** - * Test responses for Rust - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'rust', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Samp.php b/gameq/tests/Protocols/Samp.php deleted file mode 100644 index f646b83..0000000 --- a/gameq/tests/Protocols/Samp.php +++ /dev/null @@ -1,160 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Samp extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Samp - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "SAMP%si", - \GameQ\Protocol::PACKET_PLAYERS => "SAMP%sd", - \GameQ\Protocol::PACKET_RULES => "SAMP%sr", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Samp') - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test the packer header check application - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Samp::processResponse header response 'SAMu' is not valid - */ - public function testPacketHeader() - { - - // Read in a samp source file - $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("SAMP", "SAMu", $source); - - // Should fail out - $this->queryTest('127.0.0.1:27015', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test for mis matched server code in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Samp::processResponse code check failed. - */ - public function testServerCode() - { - - // Read in a samp source file - $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("SAMP\x5d\x77\x1a\xc9\x61\x1ei", "SAMP\x5d\x77\x1a\xc9\x61\x1fi", $source); - - // Should fail out - $this->queryTest('93.119.26.201:7777', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a samp source file - $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("SAMP\x5d\x77\x1a\xc9\x61\x1ei", "SAMP\x5d\x77\x1a\xc9\x61\x1eX", $source); - - // Should fail out - $testResult = $this->queryTest('93.119.26.201:7777', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Samp::processResponse response type 'X' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a samp source file - $source = file_get_contents(sprintf('%s/Providers/Samp/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("SAMP\x5d\x77\x1a\xc9\x61\x1ei", "SAMP\x5d\x77\x1a\xc9\x61\x1eX", $source); - - // Should fail out - $this->queryTest('93.119.26.201:7777', 'samp', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for San Andreas Multiplayer - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'samp', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Sevendaystodie.php b/gameq/tests/Protocols/Sevendaystodie.php deleted file mode 100644 index 2650ce9..0000000 --- a/gameq/tests/Protocols/Sevendaystodie.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for 7 Days to die - * - * @package GameQ\Tests\Protocols - */ -class Sevendaystodie extends Base -{ - /** - * Test responses for 7 Days to die - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'sevendaystodie', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Ship.php b/gameq/tests/Protocols/Ship.php deleted file mode 100644 index 49ea86d..0000000 --- a/gameq/tests/Protocols/Ship.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for The Ship - * - * @package GameQ\Tests\Protocols - */ -class Ship extends Base -{ - /** - * Test responses for Ship - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ship', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Source.php b/gameq/tests/Protocols/Source.php deleted file mode 100644 index 6e68e4e..0000000 --- a/gameq/tests/Protocols/Source.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Source extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Source - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_CHALLENGE => "\xFF\xFF\xFF\xFF\x56\x00\x00\x00\x00", - \GameQ\Protocol::PACKET_DETAILS => "\xFF\xFF\xFF\xFFTSource Engine Query\x00", - \GameQ\Protocol::PACKET_PLAYERS => "\xFF\xFF\xFF\xFF\x55%s", - \GameQ\Protocol::PACKET_RULES => "\xFF\xFF\xFF\xFF\x56%s", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Source') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test the challenge application - */ - public function testChallengeapply() - { - - $packets = $this->packets; - - // Set what the packets should look like - $packets[\GameQ\Protocol::PACKET_PLAYERS] = "\xFF\xFF\xFF\xFF\x55test"; - $packets[\GameQ\Protocol::PACKET_RULES] = "\xFF\xFF\xFF\xFF\x56test"; - - // Create a fake buffer - $challenge_buffer = new \GameQ\Buffer("\xFF\xFF\xFF\xFF\xFFtest"); - - // Apply the challenge - $this->stub->challengeParseAndApply($challenge_buffer); - - // Build reflection to access changed data - $reflectionClass = new \ReflectionClass($this->stub); - $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); - $reflectionProperty->setAccessible(true); - - $this->assertEquals($packets, \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($this->stub), 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Css/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFI", "\xFF\xFF\xFF\xFFX", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:27015', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Source::processResponse response type 'X' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Css/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\xFF\xFF\xFF\xFFI", "\xFF\xFF\xFF\xFFX", $source); - - // Should fail out - $this->queryTest('127.0.0.1:27015', 'css', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } -} diff --git a/gameq/tests/Protocols/Spaceengineers.php b/gameq/tests/Protocols/Spaceengineers.php deleted file mode 100644 index 0435306..0000000 --- a/gameq/tests/Protocols/Spaceengineers.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Space Engineers - * - * @package GameQ\Tests\Protocols - */ -class Spaceengineers extends Base -{ - /** - * Test responses for Space engineers - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'spaceengineers', - $responses - ); - - $this->assertEquals($result[ $server ], $testResult, '', 0.000000001); - } -} diff --git a/gameq/tests/Protocols/Squad.php b/gameq/tests/Protocols/Squad.php deleted file mode 100644 index b7f869d..0000000 --- a/gameq/tests/Protocols/Squad.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Squad - * - * @package GameQ\Tests\Protocols - */ -class Squad extends Base -{ - /** - * Test responses for Squad - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'squad', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.000000001); - } -} diff --git a/gameq/tests/Protocols/Starmade.php b/gameq/tests/Protocols/Starmade.php deleted file mode 100644 index 9856cd9..0000000 --- a/gameq/tests/Protocols/Starmade.php +++ /dev/null @@ -1,88 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for StarMade - * - * @package GameQ\Tests\Protocols - */ -class Starmade extends Base -{ - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Starmade - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\x00\x00\x00\x09\x2a\xff\xff\x01\x6f\x00\x00\x00\x00", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Starmade') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test responses for Starmade - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'starmade', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Teamspeak2.php b/gameq/tests/Protocols/Teamspeak2.php deleted file mode 100644 index 003d862..0000000 --- a/gameq/tests/Protocols/Teamspeak2.php +++ /dev/null @@ -1,210 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Teamspeak2 - * - * @package GameQ\Tests\Protocols - */ -class Teamspeak2 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Teamspeak2 - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_DETAILS => "sel %d\x0asi\x0a", - \GameQ\Protocol::PACKET_CHANNELS => "sel %d\x0acl\x0a", - \GameQ\Protocol::PACKET_PLAYERS => "sel %d\x0apl\x0a", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak2') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test for exception being thrown if missing query_port - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Teamspeak2::beforeSend Missing required setting 'query_port'. - */ - public function testMissingQueryPort() - { - - $client_port = 8767; - $query_port = 51234; - - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", - \GameQ\Server::SERVER_TYPE => 'teamspeak2', - \GameQ\Server::SERVER_OPTIONS => [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ], - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Apply the before send, should throw exception - $this->stub->beforeSend($server); - } - - /** - * Test the packets to see if they set - * - * @depends testMissingQueryPort - */ - public function testBeforeSend() - { - - $client_port = 8767; - $query_port = 51234; - - // Set what the packets should look like - $packets = [ - \GameQ\Protocol::PACKET_DETAILS => "sel {$client_port}\x0asi\x0a", - \GameQ\Protocol::PACKET_CHANNELS => "sel {$client_port}\x0acl\x0a", - \GameQ\Protocol::PACKET_PLAYERS => "sel {$client_port}\x0apl\x0a", - ]; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", - \GameQ\Server::SERVER_TYPE => 'teamspeak2', - \GameQ\Server::SERVER_OPTIONS => [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ], - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak2') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Apply the before send - $stub->beforeSend($server); - - // Build reflection to access changed data - $reflectionClass = new \ReflectionClass($stub); - $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); - $reflectionProperty->setAccessible(true); - - $this->assertEquals( - $packets, - \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($stub), 'packets') - ); - } - - /** - * Test for invalid header - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Teamspeak2::processResponse Expected header 'BadH' does not match - * expected '[TS]'. - */ - public function testInvalidHeader() - { - - $client_port = 8767; - $query_port = 51234; - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Teamspeak2/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("[TS]", "BadH", $source); - - // Should throw an exception - $this->queryTest( - '127.0.0.1:' . $client_port, - 'teamspeak2', - explode(PHP_EOL . '||' . PHP_EOL, $source, true), - true, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ] - ); - } - - /** - * Test responses for Teamspeak2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'teamspeak2', - $responses, - false, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], - ] - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Teamspeak3.php b/gameq/tests/Protocols/Teamspeak3.php deleted file mode 100644 index b6ad0f2..0000000 --- a/gameq/tests/Protocols/Teamspeak3.php +++ /dev/null @@ -1,211 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Teamspeak3 - * - * @package GameQ\Tests\Protocols - */ -class Teamspeak3 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Teamspeak3 - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_DETAILS => "use port=%d\x0Aserverinfo\x0A", - \GameQ\Protocol::PACKET_PLAYERS => "use port=%d\x0Aclientlist\x0A", - \GameQ\Protocol::PACKET_CHANNELS => "use port=%d\x0Achannellist -topic\x0A", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak3') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test for exception being thrown if missing query_port - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Teamspeak3::beforeSend Missing required setting 'query_port'. - */ - public function testMissingQueryPort() - { - - $client_port = 9987; - $query_port = 10011; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", - \GameQ\Server::SERVER_TYPE => 'teamspeak3', - \GameQ\Server::SERVER_OPTIONS => [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ], - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Apply the before send, should throw exception - $this->stub->beforeSend($server); - } - - /** - * Test the packets to see if they set - * - * @depends testMissingQueryPort - */ - public function testBeforeSend() - { - - $client_port = 9987; - $query_port = 10011; - - // Set what the packets should look like - $packets = [ - \GameQ\Protocol::PACKET_DETAILS => "use port={$client_port}\x0Aserverinfo\x0A", - \GameQ\Protocol::PACKET_PLAYERS => "use port={$client_port}\x0Aclientlist\x0A", - \GameQ\Protocol::PACKET_CHANNELS => "use port={$client_port}\x0Achannellist -topic\x0A", - ]; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => "127.0.0.1:{$client_port}", - \GameQ\Server::SERVER_TYPE => 'teamspeak3', - \GameQ\Server::SERVER_OPTIONS => [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ], - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $stub = $this->getMockBuilder('\GameQ\Protocols\Teamspeak3') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - // Apply the before send - $stub->beforeSend($server); - - // Build reflection to access changed data - $reflectionClass = new \ReflectionClass($stub); - $reflectionProperty = $reflectionClass->getProperty('__phpunit_originalObject'); - $reflectionProperty->setAccessible(true); - - $this->assertEquals( - $packets, - \PHPUnit\Framework\Assert::readAttribute($reflectionProperty->getValue($stub), 'packets') - ); - } - - /** - * Test for invalid header - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Teamspeak3::processResponse Expected header 'So2' does not match - * expected 'TS3'. - */ - public function testInvalidHeader() - { - - $client_port = 9987; - $query_port = 10011; - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Teamspeak3/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("TS3", "So2", $source); - - // Should throw an exception - $this->queryTest( - '127.0.0.1:' . $client_port, - 'teamspeak3', - explode(PHP_EOL . '||' . PHP_EOL, $source, true), - true, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ] - ); - } - - /** - * Test responses for Teamspeak3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'teamspeak3', - $responses, - false, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], - ] - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Teeworlds.php b/gameq/tests/Protocols/Teeworlds.php deleted file mode 100644 index 08b3bf5..0000000 --- a/gameq/tests/Protocols/Teeworlds.php +++ /dev/null @@ -1,142 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Teeworlds - * - * @package GameQ\Tests\Protocols - */ -class Teeworlds extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Teeworlds - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_ALL => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x67\x69\x65\x33\x05", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Teeworlds') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Teeworlds/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace( - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35", - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf36", - $source - ); - - // Should show up as offline - $testResult = $this->queryTest( - '127.0.0.1:8303', - 'teeworlds', - explode(PHP_EOL . '||' . PHP_EOL, $source), - false - ); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Teeworlds::processResponse response type - * 'ffffffffffffffffffff696e663336' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a css source file - $source = file_get_contents(sprintf('%s/Providers/Teeworlds/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace( - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf35", - "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffinf36", - $source - ); - - // Should show up as offline - $this->queryTest('127.0.0.1:8303', 'teeworlds', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Teeworlds - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'teeworlds', - $responses, - false, - [] - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Terraria.php b/gameq/tests/Protocols/Terraria.php deleted file mode 100644 index 673bd21..0000000 --- a/gameq/tests/Protocols/Terraria.php +++ /dev/null @@ -1,46 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Terraria extends Base -{ - - /** - * Test responses for Terraria - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'terraria', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Tf2.php b/gameq/tests/Protocols/Tf2.php deleted file mode 100644 index 190186f..0000000 --- a/gameq/tests/Protocols/Tf2.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for TF2 - * - * @package GameQ\Tests\Protocols - */ -class Tf2 extends Base -{ - /** - * Test responses for Tf2 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'tf2', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Theforrest.php b/gameq/tests/Protocols/Theforrest.php deleted file mode 100644 index b3f5ef4..0000000 --- a/gameq/tests/Protocols/Theforrest.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for The Forrest - * - * @package GameQ\Tests\Protocols - */ -class Theforrest extends Base -{ - /** - * Test responses for The Forrest - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'theforrest', - $responses - ); - - $this->assertEquals($result[$server], $testResult, '', 0.000000001); - } -} diff --git a/gameq/tests/Protocols/Tibia.php b/gameq/tests/Protocols/Tibia.php deleted file mode 100644 index 8bc797f..0000000 --- a/gameq/tests/Protocols/Tibia.php +++ /dev/null @@ -1,120 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Tibia extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Tibia - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_STATUS => "\x06\x00\xFF\xFF\x69\x6E\x66\x6F", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Tibia') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid xml response without debug - */ - public function testInvalidPacketType() - { - - // Read in a Tibia source file - $source = file_get_contents(sprintf('%s/Providers/Tibia/1_response.txt', __DIR__)); - - // Add bogus characters to the response - $source = 'data' . $source . 'data'; - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:7171', 'tibia', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid response in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Tibia::processResponse Unable to load XML string. - */ - public function testInvalidPacketTypeDebug() - { - // Read in a Tibia source file - $source = file_get_contents(sprintf('%s/Providers/Tibia/1_response.txt', __DIR__)); - - // Add bogus characters to the response - $source = 'data' . $source . 'data'; - - // Should show up as offline - $this->queryTest('127.0.0.1:7171', 'tibia', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } - - /** - * Test responses for Tibia - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'tibia', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Unreal2.php b/gameq/tests/Protocols/Unreal2.php deleted file mode 100644 index 402e757..0000000 --- a/gameq/tests/Protocols/Unreal2.php +++ /dev/null @@ -1,100 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -class Unreal2 extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Unreal2 - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_DETAILS => "\x79\x00\x00\x00\x00", - \GameQ\Protocol::PACKET_RULES => "\x79\x00\x00\x00\x01", - \GameQ\Protocol::PACKET_PLAYERS => "\x79\x00\x00\x00\x02", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Unreal2') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test invalid packet type without debug - */ - public function testInvalidPacketType() - { - - // Read in a ut2004 source file - $source = file_get_contents(sprintf('%s/Providers/Ut2004/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\x80\x00\x00\x00\x00", "\x80\x00\x00\x00\x07", $source); - - // Should show up as offline - $testResult = $this->queryTest('127.0.0.1:7777', 'unreal2', explode(PHP_EOL . '||' . PHP_EOL, $source), false); - - $this->assertFalse($testResult['gq_online']); - } - - /** - * Test for invalid packet type in response - * - * @expectedException \Exception - * @expectedExceptionMessage GameQ\Protocols\Unreal2::processResponse response type '8000000007' is not valid - */ - public function testInvalidPacketTypeDebug() - { - - // Read in a ut2004 source file - $source = file_get_contents(sprintf('%s/Providers/Ut2004/1_response.txt', __DIR__)); - - // Change the first packet to some unknown header - $source = str_replace("\x80\x00\x00\x00\x00", "\x80\x00\x00\x00\x07", $source); - - // Should show up as offline - $this->queryTest('127.0.0.1:7777', 'unreal2', explode(PHP_EOL . '||' . PHP_EOL, $source), true); - } -} diff --git a/gameq/tests/Protocols/Unturned.php b/gameq/tests/Protocols/Unturned.php deleted file mode 100644 index 0bb3b56..0000000 --- a/gameq/tests/Protocols/Unturned.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Unturned - * - * @package GameQ\Tests\Protocols - */ -class Unturned extends Base -{ - /** - * Test responses for Unturned - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'unturned', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Ut.php b/gameq/tests/Protocols/Ut.php deleted file mode 100644 index 578cafd..0000000 --- a/gameq/tests/Protocols/Ut.php +++ /dev/null @@ -1,52 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Unreal Tournament - * - * @package GameQ\Tests\Protocols - */ -class Ut extends Base -{ - /** - * Test responses for Unreal Tournament - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ut', - $responses, - false, - [] - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Ut2004.php b/gameq/tests/Protocols/Ut2004.php deleted file mode 100644 index d4ea10e..0000000 --- a/gameq/tests/Protocols/Ut2004.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Unreal Tournament 2004 - * - * @package GameQ\Tests\Protocols - */ -class Ut2004 extends Base -{ - /** - * Test responses for Unreal Tournament 2004 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ut2004', - $responses, - false, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], - ] - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Ut3.php b/gameq/tests/Protocols/Ut3.php deleted file mode 100644 index 1f049e6..0000000 --- a/gameq/tests/Protocols/Ut3.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Unreal Tournament 3 - * - * @package GameQ\Tests\Protocols - */ -class Ut3 extends Base -{ - /** - * Test responses for Unreal Tournament 3 - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ut3', - $responses, - false, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[$server]['gq_port_query'], - ] - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Ventrilo.php b/gameq/tests/Protocols/Ventrilo.php deleted file mode 100644 index f6b88bd..0000000 --- a/gameq/tests/Protocols/Ventrilo.php +++ /dev/null @@ -1,90 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Ventrilo - * - * @package GameQ\Tests\Protocols - */ -class Ventrilo extends Base -{ - - /** - * Holds stub on setup - * - * @type \GameQ\Protocols\Ventrilo - */ - protected $stub; - - /** - * Holds the expected packets for this protocol class - * - * @type array - */ - protected $packets = [ - \GameQ\Protocol::PACKET_ALL => - "V\xc8\xf4\xf9`\xa2\x1e\xa5M\xfb\x03\xccQN\xa1\x10\x95\xaf\xb2g\x17g\x812\xfbW\xfd\x8e\xd2\x22r\x034z\xbb\x98", - ]; - - /** - * Setup - */ - public function setUp() - { - - // Create the stub class - $this->stub = $this->getMockBuilder('\GameQ\Protocols\Ventrilo') - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test the packets to make sure they are correct for source - */ - public function testPackets() - { - - // Test to make sure packets are defined properly - $this->assertEquals($this->packets, \PHPUnit\Framework\Assert::readAttribute($this->stub, 'packets')); - } - - /** - * Test responses for Ventrilo - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'ventrilo', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Warsow.php b/gameq/tests/Protocols/Warsow.php deleted file mode 100644 index f87e814..0000000 --- a/gameq/tests/Protocols/Warsow.php +++ /dev/null @@ -1,50 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Warsow - * - * @package GameQ\Tests\Protocols - */ -class Warsow extends Base -{ - /** - * Test responses for Warsow - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'warsow', - $responses - ); - - $this->assertEquals($result[$server], $testResult); - } -} diff --git a/gameq/tests/Protocols/Wurm.php b/gameq/tests/Protocols/Wurm.php deleted file mode 100644 index f57d7d8..0000000 --- a/gameq/tests/Protocols/Wurm.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -namespace GameQ\Tests\Protocols; - -/** - * Test Class for Wurm Unlimited - * - * @package GameQ\Tests\Protocols - */ -class Wurm extends Base -{ - /** - * Test responses for Wurm - * - * @dataProvider loadData - * - * @param $responses - * @param $result - */ - public function testResponses($responses, $result) - { - - // Pull the first key off the array this is the server ip:port - $server = key($result); - - $testResult = $this->queryTest( - $server, - 'wurm', - $responses, - false, - [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $result[ $server ]['gq_port_query'], - ] - ); - - $this->assertEquals($result[ $server ], $testResult, '', 0.0001); - } -} diff --git a/gameq/tests/Protocols/generate_provider b/gameq/tests/Protocols/generate_provider deleted file mode 100644 index 23ef2d5..0000000 --- a/gameq/tests/Protocols/generate_provider +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env php -. - */ - -/* - * This file will query a single server and save the contents of the raw packet responses as well as the parsed - * packets into their own indexed files underneath tests/Protocols/Providers/. These are used for unit testing of - * the protocol classes to make sure changes do not break existing functionality. Something v2 had a few problems with. - * - * Requires composer install in dev mode - * - * Usage examples: - * $ php tests/Protocols/generate_provider -s 127.0.0.1:27015 -p css - * $ php tests/Protocols/generate_provider -s 127.0.0.1:27015 -p css -o '{"query_port":27018}' - */ - -require __DIR__ . '/../../vendor/autoload.php'; - -use GetOptionKit\OptionCollection; -use GetOptionKit\OptionParser; - -$specs = new OptionCollection; -$specs->add('s|server:', 'Server to contact ip|hostname:port') - ->isa('String'); - -$specs->add('p|protocol:', 'Protocol of the server') - ->isa('String'); - -$specs->add('o|options:', 'Optional: Server options such as query port') - ->isa('String'); - -$parser = new OptionParser($specs); - -try { - // Parse the argv - $result = $parser->parse($argv); - - // Get the options - $options = $result->toArray(); - - // Make sure options exist - if (!array_key_exists('server', $options) || !array_key_exists('protocol', $options)) { - throw new Exception('Missing arguments'); - } - - // Check the options - if (array_key_exists('options', $options)) { - if (($server_options = json_decode($options['options'], true)) === null) { - throw new Exception('The options setting must be a JSON string'); - } - } else { - $server_options = [ ]; - } - - // Build the directory where we want to store this data - $provider_dir = sprintf('%s/Providers/%s', __DIR__, ucfirst(strtolower($options['protocol']))); - - // Make the directory if it does not already exist - if (!is_dir($provider_dir)) { - mkdir($provider_dir, null, true); - } - - // Figure out the number of files in the provider directory - $pd = new FilesystemIterator($provider_dir, FilesystemIterator::SKIP_DOTS); - - // Figure out the index by taking the count and divide by 2 since there are 2 files for each server test - $index = (iterator_count($pd) / 2) + 1; - - unset($pd); - - // Let's do GameQ - $gq = new \GameQ\GameQ(); - $gq->removeFilter('normalize_d751713988987e9331980363e24189ce'); // We dont care about normalize for testing the core - $gq->setOption('debug', true); - $gq->setOption('timeout', 10); - $gq->setOption('stream_timeout', 900000); - $gq->setOption('capture_packets_file', sprintf('%s/%d_response.txt', $provider_dir, $index)); - - // Add our test server - $gq->addServer([ - \GameQ\Server::SERVER_ID => $options['server'], - \GameQ\Server::SERVER_TYPE => $options['protocol'], - \GameQ\Server::SERVER_HOST => $options['server'], - \GameQ\Server::SERVER_OPTIONS => $server_options, - ]); - - // Process - $results = $gq->process(); - - // Save the result into a file - $result = file_put_contents(sprintf('%s/%d_result.json', $provider_dir, $index), json_encode( - $results, - JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR - )); - - exit(0); -} catch (Exception $e) { - echo $e->getMessage() . PHP_EOL; - - $printer = new GetOptionKit\OptionPrinter\ConsoleOptionPrinter; - echo $printer->render($specs) . PHP_EOL; - - exit(1); -} diff --git a/gameq/tests/Providers/Buffer/16bitsigned_1.txt b/gameq/tests/Providers/Buffer/16bitsigned_1.txt deleted file mode 100644 index d60f854..0000000 --- a/gameq/tests/Providers/Buffer/16bitsigned_1.txt +++ /dev/null @@ -1 +0,0 @@ -þ_ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitsigned_2.txt b/gameq/tests/Providers/Buffer/16bitsigned_2.txt deleted file mode 100644 index b398f13..0000000 --- a/gameq/tests/Providers/Buffer/16bitsigned_2.txt +++ /dev/null @@ -1 +0,0 @@ -šê \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitsigned_be_1.txt b/gameq/tests/Providers/Buffer/16bitsigned_be_1.txt deleted file mode 100644 index 340caa6..0000000 --- a/gameq/tests/Providers/Buffer/16bitsigned_be_1.txt +++ /dev/null @@ -1 +0,0 @@ -_þ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitsigned_be_2.txt b/gameq/tests/Providers/Buffer/16bitsigned_be_2.txt deleted file mode 100644 index bb386b9..0000000 --- a/gameq/tests/Providers/Buffer/16bitsigned_be_2.txt +++ /dev/null @@ -1 +0,0 @@ -êš \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_1.txt b/gameq/tests/Providers/Buffer/16bitunsigned_1.txt deleted file mode 100644 index 460c9de..0000000 --- a/gameq/tests/Providers/Buffer/16bitunsigned_1.txt +++ /dev/null @@ -1 +0,0 @@ -<Ö \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_2.txt b/gameq/tests/Providers/Buffer/16bitunsigned_2.txt deleted file mode 100644 index 0aa2925..0000000 --- a/gameq/tests/Providers/Buffer/16bitunsigned_2.txt +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_be_1.txt b/gameq/tests/Providers/Buffer/16bitunsigned_be_1.txt deleted file mode 100644 index 653cfde..0000000 --- a/gameq/tests/Providers/Buffer/16bitunsigned_be_1.txt +++ /dev/null @@ -1 +0,0 @@ -Ö< \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/16bitunsigned_be_2.txt b/gameq/tests/Providers/Buffer/16bitunsigned_be_2.txt deleted file mode 100644 index 4345424..0000000 --- a/gameq/tests/Providers/Buffer/16bitunsigned_be_2.txt +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_1.txt b/gameq/tests/Providers/Buffer/32bitsigned_1.txt deleted file mode 100644 index 81eefd6..0000000 --- a/gameq/tests/Providers/Buffer/32bitsigned_1.txt +++ /dev/null @@ -1 +0,0 @@ -xrbJ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_2.txt b/gameq/tests/Providers/Buffer/32bitsigned_2.txt deleted file mode 100644 index 56f624f..0000000 --- a/gameq/tests/Providers/Buffer/32bitsigned_2.txt +++ /dev/null @@ -1 +0,0 @@ -mX½£ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_be_1.txt b/gameq/tests/Providers/Buffer/32bitsigned_be_1.txt deleted file mode 100644 index 04bbf16..0000000 --- a/gameq/tests/Providers/Buffer/32bitsigned_be_1.txt +++ /dev/null @@ -1 +0,0 @@ -Jbrx \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitsigned_be_2.txt b/gameq/tests/Providers/Buffer/32bitsigned_be_2.txt deleted file mode 100644 index 09ff8fd..0000000 --- a/gameq/tests/Providers/Buffer/32bitsigned_be_2.txt +++ /dev/null @@ -1 +0,0 @@ -£½Xm \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_1.txt b/gameq/tests/Providers/Buffer/32bitunsigned_1.txt deleted file mode 100644 index a86aec1..0000000 --- a/gameq/tests/Providers/Buffer/32bitunsigned_1.txt +++ /dev/null @@ -1 +0,0 @@ -Kå Á \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_2.txt b/gameq/tests/Providers/Buffer/32bitunsigned_2.txt deleted file mode 100644 index 623860e..0000000 --- a/gameq/tests/Providers/Buffer/32bitunsigned_2.txt +++ /dev/null @@ -1 +0,0 @@ -:]J \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_be_1.txt b/gameq/tests/Providers/Buffer/32bitunsigned_be_1.txt deleted file mode 100644 index 58c615f..0000000 --- a/gameq/tests/Providers/Buffer/32bitunsigned_be_1.txt +++ /dev/null @@ -1 +0,0 @@ -Á åK \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32bitunsigned_be_2.txt b/gameq/tests/Providers/Buffer/32bitunsigned_be_2.txt deleted file mode 100644 index 774866f..0000000 --- a/gameq/tests/Providers/Buffer/32bitunsigned_be_2.txt +++ /dev/null @@ -1 +0,0 @@ -J]: \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_1.txt b/gameq/tests/Providers/Buffer/32float_1.txt deleted file mode 100644 index 314a348..0000000 --- a/gameq/tests/Providers/Buffer/32float_1.txt +++ /dev/null @@ -1 +0,0 @@ -*t> \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_2.txt b/gameq/tests/Providers/Buffer/32float_2.txt deleted file mode 100644 index d212f81..0000000 --- a/gameq/tests/Providers/Buffer/32float_2.txt +++ /dev/null @@ -1 +0,0 @@ -œ~à \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_be_1.txt b/gameq/tests/Providers/Buffer/32float_be_1.txt deleted file mode 100644 index 25f5a83..0000000 --- a/gameq/tests/Providers/Buffer/32float_be_1.txt +++ /dev/null @@ -1 +0,0 @@ ->t* \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/32float_be_2.txt b/gameq/tests/Providers/Buffer/32float_be_2.txt deleted file mode 100644 index 7fec986..0000000 --- a/gameq/tests/Providers/Buffer/32float_be_2.txt +++ /dev/null @@ -1 +0,0 @@ -Ã~œ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_1.txt b/gameq/tests/Providers/Buffer/64bitunsigned_1.txt deleted file mode 100644 index 18ed3fe..0000000 --- a/gameq/tests/Providers/Buffer/64bitunsigned_1.txt +++ /dev/null @@ -1 +0,0 @@ -017U@ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_2.txt b/gameq/tests/Providers/Buffer/64bitunsigned_2.txt deleted file mode 100644 index 53ac1b0be765a830eaa734fdcaff0f863d5d1386..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 Kcmeys00968hyd{b diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_be_1.txt b/gameq/tests/Providers/Buffer/64bitunsigned_be_1.txt deleted file mode 100644 index b103c8f..0000000 --- a/gameq/tests/Providers/Buffer/64bitunsigned_be_1.txt +++ /dev/null @@ -1 +0,0 @@ -@U710 \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/64bitunsigned_be_2.txt b/gameq/tests/Providers/Buffer/64bitunsigned_be_2.txt deleted file mode 100644 index 003bc0ebfc327ee4e08df4a177e7f368d2dea681..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8 LcmZQz0D}(z0Qdm$ diff --git a/gameq/tests/Providers/Buffer/8bitsigned_1.txt b/gameq/tests/Providers/Buffer/8bitsigned_1.txt deleted file mode 100644 index 301160a..0000000 --- a/gameq/tests/Providers/Buffer/8bitsigned_1.txt +++ /dev/null @@ -1 +0,0 @@ -8 \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/8bitsigned_2.txt b/gameq/tests/Providers/Buffer/8bitsigned_2.txt deleted file mode 100644 index 2b8e128..0000000 --- a/gameq/tests/Providers/Buffer/8bitsigned_2.txt +++ /dev/null @@ -1 +0,0 @@ -Ñ \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/8bitunsigned_1.txt b/gameq/tests/Providers/Buffer/8bitunsigned_1.txt deleted file mode 100644 index afb09b4..0000000 --- a/gameq/tests/Providers/Buffer/8bitunsigned_1.txt +++ /dev/null @@ -1 +0,0 @@ -Ö \ No newline at end of file diff --git a/gameq/tests/Providers/Buffer/8bitunsigned_2.txt b/gameq/tests/Providers/Buffer/8bitunsigned_2.txt deleted file mode 100644 index 9280c0d..0000000 --- a/gameq/tests/Providers/Buffer/8bitunsigned_2.txt +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/gameq/tests/Query/Core.php b/gameq/tests/Query/Core.php deleted file mode 100644 index 301a606..0000000 --- a/gameq/tests/Query/Core.php +++ /dev/null @@ -1,66 +0,0 @@ -. - */ - -namespace GameQ\Tests\Query; - -use GameQ\Tests\TestBase; - -/** - * Class Core testing - * - * @package GameQ\Tests\Query - */ -class Core extends TestBase -{ - /** - * Test setting the properties for the query core - */ - public function testSet() - { - - $stub = $this->getMockForAbstractClass('\GameQ\Query\Core', [ ]); - - // Set the properties - $stub->set('tcp', '127.0.0.1', 27015, 5, true); - - // Verify the properties - $this->assertEquals('tcp', \PHPUnit\Framework\Assert::readAttribute($stub, 'transport')); - - $this->assertEquals('127.0.0.1', \PHPUnit\Framework\Assert::readAttribute($stub, 'ip')); - - $this->assertEquals(27015, \PHPUnit\Framework\Assert::readAttribute($stub, 'port')); - - $this->assertEquals(5, \PHPUnit\Framework\Assert::readAttribute($stub, 'timeout')); - - $this->assertEquals(true, \PHPUnit\Framework\Assert::readAttribute($stub, 'blocking')); - - // Testing the clone - $stub_clone = clone $stub; - - // All of these should tbe the defaults now - $this->assertNull(\PHPUnit\Framework\Assert::readAttribute($stub_clone, 'transport')); - - $this->assertNull(\PHPUnit\Framework\Assert::readAttribute($stub_clone, 'ip')); - - $this->assertNull(\PHPUnit\Framework\Assert::readAttribute($stub_clone, 'port')); - - $this->assertEquals(3, \PHPUnit\Framework\Assert::readAttribute($stub_clone, 'timeout')); - - $this->assertEquals(false, \PHPUnit\Framework\Assert::readAttribute($stub_clone, 'blocking')); - } -} diff --git a/gameq/tests/Server.php b/gameq/tests/Server.php deleted file mode 100644 index d25bb50..0000000 --- a/gameq/tests/Server.php +++ /dev/null @@ -1,284 +0,0 @@ -. - */ - -namespace GameQ\Tests; - -/** - * Server testing class - * - * @package GameQ\Tests - */ -class Server extends TestBase -{ - /** - * Test for missing server type - * - * @expectedException \GameQ\Exception\Server - * @expectedExceptionMessage Missing server info key 'type'! - */ - public function testMissingServerType() - { - - // Create a mock server should throw exception - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([]) - ->getMock(); - } - - /** - * Test for missing host information - * - * @expectedException \GameQ\Exception\Server - * @expectedExceptionMessage Missing server info key 'host'! - */ - public function testMissingHost() - { - - // Create a mock server Create a mock server should throw exception - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_TYPE => 'source', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test setting server options - */ - public function testSetServerOptions() - { - - $options = [ - 'option1' => 'val1', - 'option2' => 'val2', - ]; - - // Create a server with some options - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'source', - \GameQ\Server::SERVER_OPTIONS => $options, - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($options, \PHPUnit\Framework\Assert::readAttribute($server, 'options')); - - // Check the getOption - $this->assertEquals($options['option1'], $server->getOption('option1')); - - // Check the get null for missing option - $this->assertNull($server->getOption('doesnotexist')); - - // Check the setOption - $server->setOption('option3', 'valnew'); - - $this->assertEquals('valnew', $server->getOption('option3')); - } - - /** - * Test that the server id is behaving properly - */ - public function testServerId() - { - - $id = '127.0.0.1:27015'; - - // Create a server with id - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => $id, - \GameQ\Server::SERVER_TYPE => 'source', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($id, \PHPUnit\Framework\Assert::readAttribute($server, 'id')); - - $id = 'my_server_#1'; - - // Create a server with id - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'source', - \GameQ\Server::SERVER_ID => $id, - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($id, \PHPUnit\Framework\Assert::readAttribute($server, 'id')); - - $this->assertEquals($id, $server->id()); - } - - /** - * Test ipv4 missing port - * - * @expectedException \GameQ\Exception\Server - * @expectedExceptionMessage The host address '127.0.0.1' is missing the port. All servers must have a port - * defined! - */ - public function testIpv4NoPort() - { - - // Create a mock server - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1', - \GameQ\Server::SERVER_TYPE => 'source', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test IPv4 unresolvable hostname - * - * @expectedException \GameQ\Exception\Server - * @expectedExceptionMessage Unable to resolve the host 'some.unresolable.domain' to an IP address. - */ - public function testIpv4UnresovlableHostname() - { - // Create a mock server - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => 'some.unresolable.domain:27015', - \GameQ\Server::SERVER_TYPE => 'source', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test IPv6 host - */ - public function testIpv6() - { - // Create a mock server - $stub = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '[::1]:27015', - \GameQ\Server::SERVER_TYPE => 'source', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals('[::1]:27015', \PHPUnit\Framework\Assert::readAttribute($stub, 'id')); - } - - /** - * Test ipv6 missing port - * - * @expectedException \GameQ\Exception\Server - * @expectedExceptionMessage The host address '[::1]' is missing the port. All servers must have a port defined! - */ - public function testIpv6NoPort() - { - // Create a mock server - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '[::1]', - \GameQ\Server::SERVER_TYPE => 'source', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test invalid ipv6 - * - * @expectedException \GameQ\Exception\Server - * @expectedExceptionMessage The IPv6 address '[:0:1]' is invalid. - */ - public function testIpv6Invalid() - { - // Create a mock server - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '[:0:1]:27015', - \GameQ\Server::SERVER_TYPE => 'source', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test invalid protocol - * - * @expectedException \GameQ\Exception\Server - * @expectedExceptionMessage Unable to locate Protocols class for 'doesnotexist'! - */ - public function testInvalidProtocol() - { - // Create a mock server - $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'doesnotexist', - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - } - - /** - * Test for specific query port defined in server creation - */ - public function testSpecifiedQueryPort() - { - $query_port = 27016; - - // Create a mock server - $server = $this->getMockBuilder('\GameQ\Server') - ->setConstructorArgs([ - [ - \GameQ\Server::SERVER_HOST => '127.0.0.1:27015', - \GameQ\Server::SERVER_TYPE => 'source', - \GameQ\Server::SERVER_OPTIONS => [ - \GameQ\Server::SERVER_OPTIONS_QUERY_PORT => $query_port, - ], - ], - ]) - ->enableProxyingToOriginalMethods() - ->getMock(); - - $this->assertEquals($query_port, \PHPUnit\Framework\Assert::readAttribute($server, 'port_query')); - } -} diff --git a/gameq/tests/TestBase.php b/gameq/tests/TestBase.php deleted file mode 100644 index ae150cc..0000000 --- a/gameq/tests/TestBase.php +++ /dev/null @@ -1,48 +0,0 @@ -. - */ - -namespace GameQ\Tests; - -class TestBase extends \PHPUnit\Framework\TestCase -{ - - /** - * TestBase constructor overload. - * - * @param null $name - * @param array $data - * @param string $dataName - */ - public function __construct($name = null, array $data = [], $dataName = '') - { - // PHPUnit 5 & 6+ hack for name spaces - if (!class_exists('\PHPUnit\Framework\Assert', true)) { - class_alias('\PHPUnit_Framework_Assert', '\PHPUnit\Framework\Assert'); - } - - parent::__construct($name, $data, $dataName); - } - - /** - * Fake test so PHPUnit won't complain about no tests in class. - */ - public function testWarning() - { - $this->assertTrue(true); - } -} diff --git a/gameq/vbox.md b/gameq/vbox.md deleted file mode 100644 index 98fba23..0000000 --- a/gameq/vbox.md +++ /dev/null @@ -1,13 +0,0 @@ -# Ubuntu 7 - -## Mount Directories for shares -`mount -t vboxsf -o rw,uid=33,gid=33 GameQv3 /home/gameqv3` - -`mount -t vboxsf -o rw,uid=33,gid=33 GameQPages /home/gameqpages` - -# Local PHP Unit testing -## PHP 7.1.x -## PHP 7.0.x -## PHP 5.6.30 -## PHP 5.5.38 -## PHP 5.4.45 \ No newline at end of file

Supervisor hos Skyttegrav.se.