@@ -14,30 +14,33 @@ class MinecraftQuery
14
14
const STATISTIC = 0x00 ;
15
15
const HANDSHAKE = 0x09 ;
16
16
17
+ /** @var ?resource $Socket */
17
18
private $ Socket ;
18
- private $ Players ;
19
- private $ Info ;
19
+ private ? array $ Players = null ;
20
+ private ? array $ Info = null ;
20
21
21
- public function Connect ( $ Ip , $ Port = 25565 , $ Timeout = 3 , $ ResolveSRV = true )
22
+ public function Connect ( string $ Ip , int $ Port = 25565 , float $ Timeout = 3 , bool $ ResolveSRV = true ) : void
22
23
{
23
- if ( ! is_int ( $ Timeout ) || $ Timeout < 0 )
24
+ if ( $ Timeout < 0 )
24
25
{
25
- throw new \InvalidArgumentException ( 'Timeout must be an integer. ' );
26
+ throw new \InvalidArgumentException ( 'Timeout must be a positive integer. ' );
26
27
}
27
28
28
29
if ( $ ResolveSRV )
29
30
{
30
31
$ this ->ResolveSRV ( $ Ip , $ Port );
31
32
}
32
33
33
- $ this -> Socket = @\fsockopen ( 'udp:// ' . $ Ip , ( int ) $ Port , $ ErrNo , $ ErrStr , ( float ) $ Timeout );
34
+ $ Socket = @\fsockopen ( 'udp:// ' . $ Ip , $ Port , $ ErrNo , $ ErrStr , $ Timeout );
34
35
35
- if ( $ ErrNo || $ this -> Socket === false )
36
+ if ( $ ErrNo || $ Socket === false )
36
37
{
37
38
throw new MinecraftQueryException ( 'Could not create socket: ' . $ ErrStr );
38
39
}
39
40
40
- \stream_set_timeout ( $ this ->Socket , $ Timeout );
41
+ $ this ->Socket = $ Socket ;
42
+
43
+ \stream_set_timeout ( $ this ->Socket , (int )$ Timeout );
41
44
\stream_set_blocking ( $ this ->Socket , true );
42
45
43
46
try
@@ -48,13 +51,13 @@ public function Connect( $Ip, $Port = 25565, $Timeout = 3, $ResolveSRV = true )
48
51
}
49
52
finally
50
53
{
51
- \fclose ( $ this -> Socket );
54
+ \fclose ( $ Socket );
52
55
}
53
56
}
54
57
55
- public function ConnectBedrock ( $ Ip , $ Port = 19132 , $ Timeout = 3 , $ ResolveSRV = true )
58
+ public function ConnectBedrock ( string $ Ip , int $ Port = 19132 , float $ Timeout = 3 , bool $ ResolveSRV = true ) : void
56
59
{
57
- if ( ! is_int ( $ Timeout ) || $ Timeout < 0 )
60
+ if ( $ Timeout < 0 )
58
61
{
59
62
throw new \InvalidArgumentException ( 'Timeout must be an integer. ' );
60
63
}
@@ -64,14 +67,16 @@ public function ConnectBedrock( $Ip, $Port = 19132, $Timeout = 3, $ResolveSRV =
64
67
$ this ->ResolveSRV ( $ Ip , $ Port );
65
68
}
66
69
67
- $ this -> Socket = @\fsockopen ( 'udp:// ' . $ Ip , ( int ) $ Port , $ ErrNo , $ ErrStr , ( float ) $ Timeout );
70
+ $ Socket = @\fsockopen ( 'udp:// ' . $ Ip , $ Port , $ ErrNo , $ ErrStr , $ Timeout );
68
71
69
- if ( $ ErrNo || $ this -> Socket === false )
72
+ if ( $ ErrNo || $ Socket === false )
70
73
{
71
74
throw new MinecraftQueryException ( 'Could not create socket: ' . $ ErrStr );
72
75
}
73
76
74
- \stream_set_timeout ( $ this ->Socket , $ Timeout );
77
+ $ this ->Socket = $ Socket ;
78
+
79
+ \stream_set_timeout ( $ this ->Socket , (int )$ Timeout );
75
80
\stream_set_blocking ( $ this ->Socket , true );
76
81
77
82
try
@@ -80,23 +85,25 @@ public function ConnectBedrock( $Ip, $Port = 19132, $Timeout = 3, $ResolveSRV =
80
85
}
81
86
finally
82
87
{
83
- \fclose ( $ this -> Socket );
88
+ \fclose ( $ Socket );
84
89
}
85
90
}
86
91
87
- public function GetInfo ( )
92
+ /** @return array|false */
93
+ public function GetInfo ( ) : array |bool
88
94
{
89
95
return isset ( $ this ->Info ) ? $ this ->Info : false ;
90
96
}
91
97
92
- public function GetPlayers ( )
98
+ /** @return array|false */
99
+ public function GetPlayers ( ) : array |bool
93
100
{
94
101
return isset ( $ this ->Players ) ? $ this ->Players : false ;
95
102
}
96
103
97
- private function GetChallenge ( )
104
+ private function GetChallenge ( ) : string
98
105
{
99
- $ Data = $ this ->WriteData ( self :: HANDSHAKE );
106
+ $ Data = $ this ->WriteData ( self :: HANDSHAKE );
100
107
101
108
if ( $ Data === false )
102
109
{
@@ -106,9 +113,9 @@ private function GetChallenge( )
106
113
return \pack ( 'N ' , $ Data );
107
114
}
108
115
109
- private function GetStatus ( $ Challenge )
116
+ private function GetStatus ( string $ Challenge ) : void
110
117
{
111
- $ Data = $ this ->WriteData ( self :: STATISTIC , $ Challenge . \pack ( 'c* ' , 0x00 , 0x00 , 0x00 , 0x00 ) );
118
+ $ Data = $ this ->WriteData ( self :: STATISTIC , $ Challenge . \pack ( 'c* ' , 0x00 , 0x00 , 0x00 , 0x00 ) );
112
119
113
120
if ( !$ Data )
114
121
{
@@ -198,8 +205,13 @@ private function GetStatus( $Challenge )
198
205
}
199
206
}
200
207
201
- private function GetBedrockStatus ( )
208
+ private function GetBedrockStatus ( ) : void
202
209
{
210
+ if ( $ this ->Socket === null )
211
+ {
212
+ throw new MinecraftQueryException ( 'Socket is not open. ' );
213
+ }
214
+
203
215
// hardcoded magic https://github.com/facebookarchive/RakNet/blob/1a169895a900c9fc4841c556e16514182b75faf8/Source/RakPeer.cpp#L135
204
216
$ OFFLINE_MESSAGE_DATA_ID = \pack ( 'c* ' , 0x00 , 0xFF , 0xFF , 0x00 , 0xFE , 0xFE , 0xFE , 0xFE , 0xFD , 0xFD , 0xFD , 0xFD , 0x12 , 0x34 , 0x56 , 0x78 );
205
217
@@ -255,8 +267,14 @@ private function GetBedrockStatus( )
255
267
$ this ->Players = null ;
256
268
}
257
269
258
- private function WriteData ( $ Command , $ Append = "" )
270
+ /** @return string|false */
271
+ private function WriteData ( int $ Command , string $ Append = "" ) : string |bool
259
272
{
273
+ if ( $ this ->Socket === null )
274
+ {
275
+ throw new MinecraftQueryException ( 'Socket is not open. ' );
276
+ }
277
+
260
278
$ Command = \pack ( 'c* ' , 0xFE , 0xFD , $ Command , 0x01 , 0x02 , 0x03 , 0x04 ) . $ Append ;
261
279
$ Length = \strlen ( $ Command );
262
280
@@ -280,7 +298,7 @@ private function WriteData( $Command, $Append = "" )
280
298
return \substr ( $ Data , 5 );
281
299
}
282
300
283
- private function ResolveSRV ( &$ Address , &$ Port )
301
+ private function ResolveSRV ( string &$ Address , int &$ Port ) : void
284
302
{
285
303
if ( \ip2long ( $ Address ) !== false )
286
304
{
@@ -301,7 +319,7 @@ private function ResolveSRV( &$Address, &$Port )
301
319
302
320
if ( isset ( $ Record [ 0 ][ 'port ' ] ) )
303
321
{
304
- $ Port = $ Record [ 0 ][ 'port ' ];
322
+ $ Port = ( int ) $ Record [ 0 ][ 'port ' ];
305
323
}
306
324
}
307
325
}
0 commit comments